kategoria: Blitz
[#1] Blitz - dziwny problem z podwójym Cooperem dla trybu interelaced
Testuje dwa rozwiązania które znalazłem w sieci, tak żeby Blitz mi wyswietlił grafikę na pełnym ekranie 640x512 256 kol. w trybie interlace. Jedno jest Earoka, z którym miałem problem bo nie można było blitowac żadnego obiektu, bo się rozciągał i był przepleciony, a drugie znalazłem tutaj: http://eab.abime.net/showthread.php?t=65184

To drugie jest lepsze, moim zdaniem prostsze i bardziej czytelne i można bez problemu blitować obiekty..

tylko mam teraz dwa małe problemy, które wystepują w obydwu przypadkach:

1. w rozwiazaniu Earoka obraz jest przesunięty i uciety w prawo, a w tym drugin w lewo.. nie wiem moze tu wystarczy ta funkcja DisplayAdjust

2. a druga sprawa jest własnie dziwna, bo wyswietlony obrazek nie jest ostry - dla porownania otworzylem ta sama grafikę np. w filemasterze czy picview i był bardzo ostry, co prawda testuje to na razie na WinUAE, no ale dlaczego w takim razie sa takie różnice..

porównanie: https://i.imgur.com/aDXGQDU.jpg



na wszelki wypadek wklejam obydwa kody:

1. Earok: https://github.com/earok/BlitzBasicDemos
WBStartup
DEFTYPE .w

;The interlaced bitmap
BitMap 0,640,512,8

;The original bitmap
BitMap 1,640,512,8
LoadBitMap 1,"image.iff",0

;Convert the original bitmap to interlaced
Use BitMap 0
for i = 0 to 255
	BlockScroll 0,i*2,640,1,0,i,1 
	BlockScroll 0,1+i*2,640,1,0,i+256,1 
next

;Configure two copper lists
for i = 0 to 1

	InitCopList i,44,DispHeight,$10000 + $1000 + $100 + $8,8,256,0
	DisplayBitMap i,0,0,i*256
	DisplayPalette i,0
		
next
	
BLITZ

;Repeatedly recreate the display and toggle the LOF bit
SetInt 5

	VP = Peek.w($DFF004)

	X=1-X
	if X=0
		CreateDisplay 0
		VP = VP BITSET 15				
	else
		CreateDisplay 1
		VP = VP BITCLR 15						
	endif
	
	Poke.w $DFF02A,VP

	
End SetInt

While Joyb(0)+Joyb(1) = 0
Wend

End


2. drugi kod: http://eab.abime.net/showthread.php?t=65184

; Setup the screen for a hires laced display. This is used for the credits screens

#BPLCON0=$100                     ; Bitplane control register
#BPLMOD1=$108                     ; Bitplane modulo
#BPLMOD2=$10A                     ; Bitplane modulo

#bitmapsize=768
#Modulo=(((#bitmapsize-320)/8)-2)*2

BitMap 0,320,256,5                ; Game screen. Lowres 32 colour
BitMap 1,320,256,5                ; Intro screens
BitMap 2,640,256,4                ; Title Screen
BitMap 3,#bitmapsize,512,3        ; Custom copper controlled hires-laced display for credits

; Lets build our own copperlist

cop$=Mki$(#BPLMOD1)+Mki$(#Modulo)
cop$+Mki$(#BPLMOD2)+Mki$(#Modulo)
cop$+Mki$(#BPLCON0)+Mki$($b004)   ; BPLCON0 : Bit number:
                                  ;           15 - Hires
                                  ;           14, $13, $12 bitplanes set (011 here for 3 bitplanes)
                                  ;           11 - Ham mode Off
                                  ;           10 - Dual playfield Off
                                  ;           09 - Composite colour mode off
                                  ;           08 - Genlock Audio Enable off
                                  ;           07 to bit 4 - Unused, set to 0
                                  ;           03 - Lightpen off
                                  ;           02 - Interlace ON
                                  ;           01 - External Synchronization Enable off
                                  ;           00 - Unused

                                  ; Buffer for animation

InitCopList 3,41,256,$513,8,8,-3  ; $11903 ; 8 colour hires laced display
DisplayUser 3,0,cop$              ; Set our copperlist
DisplayAdjust 3,768,-8,-8,-32,32  ; and adjust the display accordingly

CreateDisplay 3
Use BitMap 3
DisplayPalette 3,1

SetInt 5
  If Peek($df004) <0
    DisplayBitMap 3,3,3,0
  Else
    DisplayBitMap 3,3,3,1
  EndIf
End SetInt


Blit 1,0,20
DisplayBitMap 3,3

End


Ostatnia aktualizacja: 06.02.2020 19:26:17 przez mailman
[#2] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #1

Jesteś pewien że te procedury wykorzystują AGA? Bo jak dla mnie albo ten obrazek nie jest w 256 kolorach, albo procedury są dla OCS/ECS i pierwsza używa trybu HAM6 a druga ditchering (roztrząsanie) kolorów.

Edit: albo po prostu algorytmy zmniejszania palety kolorów są różne...

Ostatnia aktualizacja: 04.02.2020 07:31:02 przez Solo Kazuki
[#3] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@Solo Kazuki, post #2

może źle się wyraziłem, nie chodzi mi o to, że jeden obrazek ma pełne 256 kolorów a w drugim jest widocznie mniej, tylko że obrazek z blitza ten po lewej ma widoczne schodki tak jakby było wyświetlane tylko co drugie pole czy jakiś deinterlace zrobiony, natomiast obrazek po prawej jest bardzo gładki i ostry nie ma schodków, tez został otworzony w trybie interlace..
[#4] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #3

Nie znam się na programowaniu Amigi, ale czy nie wygląda to jakby pola ODD i EVEN były tą samą klatką? Jest jakiś parametr ustawiający offset danych dla tych dwóch pól, bo wygląda jakby klatka A i klatka B była wyświetlana od tego samego adresu, po czym następuje skok o dwie linie (a może trzeba zmieniać wskaźnik co wygaszanie pionowe)?


Ostatnia aktualizacja: 04.02.2020 16:15:55 przez sanjyuubi
[#5] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@sanjyuubi, post #4

trafna uwaga
[wyróżniony] [#6] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #3

Sprawdziłem u siebie ten pierwszy przykład i nie zauważyłem różnicy, żeby działał źle. Trzeba jednak dodać displayadjust. Może udostępnij gdzieś kompletne źródła to zobaczę.
[#7] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #6

Hej, dzięki!
Udało mi się rozwiązać ten problem, tak jak przeczuwałem Blitz2 coś od siebie chyba dodawał i dopiero po zrobieniu executabla i uruchomieniu go z systemu obrazek jest ostry i ładny w 16 tys. kolorach.

W każdym razie przesyłam Ci te dwa przykłady gotowe do uruchomienia. Czy jesteś w stanie poprawić przykład drugi tak żeby ładował obrazek 8 bitowy, na razie tylko w 8 kolorach ładuje, zmieniałem wartosci ale jakieś śmieci się pojawiały.. a ten drugi własnie mi pasuje bo można na nim blitować obiekty bez problemu, a w tym pierwszy nie bardzo do tego w tym pierwszym po zakonczenu pojawia się jakiś overflow..
link

nie rozumiem też do końca tych parametrów ustawianych w user cooper list, czytałem instrukcje ale ni w ząb tego nie jarze..

poniżej porównanie: https://i.imgur.com/xBnc0eb.jpg



Ostatnia aktualizacja: 04.02.2020 21:00:45 przez mateusz_s
[wyróżniony] [#8] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #7

link nie działa
[#9] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #8

o sory.. tu działajacy link: link

Mam zagwozdkę z tym drugim przykladem, zmieniłem wartości bitmapy i coppera zeby obslugiwał 256 kolorów ale pojawiały się śmieci.. może trzeba coś dodać w tym stringu tworzącym custom coppera, ale jak wspomniałem nie jestem w stanie go rozgryźć jeszcze

Ostatnia aktualizacja: 04.02.2020 22:36:15 przez mateusz_s
[#10] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #7

Ten drugi przykład jest kompletnie zepsuty. Żeby ustawić 8 bitplanów trzeba zmienić bplcon0, usunąć lub zmienić displayadjust, modulo też jest dziwne i poprawić adres z df004 na dff004. Tak czy siak nie działa interlace, bo wyświetla tylko jedną ramkę.
[#11] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #10

Udało mi się rozwiązać wszystko.
W dodatku z wykorzystaniem tylko jednej bitmapy przez co nie ma problemów z blitowaniem obiektu.

No prawie wszystko, jeszcze nie zrobiłęm tego adjust zeby bylo wycentrowane, a slabo jest ta opcja opisana..

W skrócie: stworzyłem dwie listy coppera, które wyświetlają ten sam obrazek, i zadałem każdej żeby wyświetlała tylko co drugą linię. W drugiej liście bitmapa jest przesunięta jeden pixel w dół. Natomiast W programie Earoka jest to zrobione "ręcznie" za pomocą BlockScroll i używa on dwóch bitmap.

I tu bardzo ciekawa rzecz!
Jeśli w przerwaniu dam tylko naprzemienne wyświetlanie tych copperów obrazek miga mi na WinUAE tak jak bez flicker fixera.
A jesli dodam to co dopisał Earok czyli Peek($DFF004) i operacje bitowe to obraz jest statyczny. Problem jest taki że kod Earoka w pętli interupt wywala Overflow, nie wiem czemu.

Ciekawe jak to na prawdziwej Amidze by wyglądało, nie mogę na razie sprawdzić jeszcze..

Podsyłam swój działający kod:

WBStartup

#BPLCON0        = $100
#BPLMOD1        = $108
#BPLMOD2        = $10A

#BPLCON0_MASK   = %1000000000010100 ; binary
#MODULO         = 80                ; line modulo for hires laced 256

; init bitmap space
BitMap 0,640,512,8

; loading 640x512 x 256 colors image
LoadBitMap 0,"dh1:test-hires-256.iff",0

BLITZ

; configure two copper lists
; custom set to -3, because 3 instructions $100+$108+$10A

cop$ = Mki$(#BPLCON0) + Mki$(#BPLCON0_MASK)
cop$ + Mki$(#BPLMOD1) + Mki$(#MODULO)
cop$ + Mki$(#BPLMOD2) + Mki$(#MODULO)

; copper nr 0 for displaying only odd lines

InitCopList 0, 44, DispHeight, $10000 + $1000 + $100 + $8, 8, 256, -3
DisplayUser 0, 0, cop$
DisplayBitMap 0,0,0,0
DisplayPalette 0,0

; copper nr 1 for displaying only even lines

InitCopList 1, 44, DispHeight, $10000 + $1000 + $100 + $8, 8, 256, -3
DisplayUser 1, 0, cop$
DisplayBitMap 1,0,0,1
DisplayPalette 1,0

; using interupt 5 to display and toggle two copper lists

counter.w = 0

SetInt 5

  counter = 1 - counter

  If counter = 0
    CreateDisplay 0
  Else
    CreateDisplay 1
  EndIf

End SetInt

MouseWait

End


ps.
czy Ktoś jest w stanie zobaczyć co jest nie tak w tym kodzie Earoka że wywala Overflow? poniżej:
SetInt 5
  counter = 1 - counter
  VP = Peek.w($DFF004)

  If counter = 0
    CreateDisplay 0
    VP BitSet 15
  Else
    CreateDisplay 1
    VP BitClr 15
  EndIf

  Poke.w $DFF02A, VP

End SetInt


Ostatnia aktualizacja: 06.02.2020 00:58:44 przez mateusz_s

Ostatnia aktualizacja: 06.02.2020 01:11:36 przez mateusz_s
[wyróżniony] [#12] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #11

Odnośnie overflow. Pewnie jest to związane z tym, że Blitz traktuje liczby jako signed integer, a czasem trzeba traktować zmienne jako unsigned. Wyłącz w kompilatorze sprawdzanie overflow.

Sprawa powyższego przykładu to spekulacja, aczkolwiek dość prawdopodobna. Pytanie: jak określasz, która ramka jest wyświetlana jako długa czy krótka? Może się okazać, że będziesz miał przestawione linie. Winuae nie potrafi pokazać czystego interlejsu.
[#13] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #12

Udało mi się właśnie zrobić przykład okienka hires+laced za pomocą Screen, 4 linijki kodu bez dodatkowych komplikacji.. na poczatku myslalem ze sie nie da bo źle przeczytalem w instrukcji ze tylko max 4 bitpaly w tym trybie, ale jednak sie da.. zakladam ze w tym trybie wydajność spadnie, ale np. do menu by się nadało..

ogólnie jeśli chodzi o poprzedni przykład to mam straszny problem z DisplayAdjust, bez tego zawsze jest kilkadziesiąt pixeli przerwy z lewej i obrazek nie jest wycentrowany, tak jak dla lowres udalo mi sei znalesc dobre ustawienia tak, dla hires nie daje rady, az załaczyłem brute force w 4 petlach zeby sprawdzac kombinacje.. hehe.. ale na razie na niewiel sie to zdalo, nie wiem w jakis sposob to dziala a instrukcja jest bardzo skąpa.. w dodatku z tego co widzę to parametry fech z initcoper sa z tym polaczone, masakra.. z tego co zauwzyalem to 90% przykladów z blitza nie jest wycentrowana tylko ma tą przerwę z boku.. nie ma tez przykladu w hires

ps. nie do konca wiem jeszcze jaki jest sens tej długiej ramki i ustawienia bita 15

Wklejam kod do 640x512x8 w hires laced:
Screen 0,0,0,640,512,8,-28668,"TEST",0,1
BitMap 0,640,512,8
LoadBitMap 0,"dh1:test-hires-256-info.iff",0
Use Palette 0
ShowBitMap 0
MouseWait


Ostatnia aktualizacja: 06.02.2020 20:48:00 przez mateusz_s
[#14] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #13

znalazłem coś takiego odnosnie DisplayAdjust, ale nie dziala mi, przynajmniej nie w hires
chyba jest jakis błąd z tym ogólnie..

http://eab.abime.net/showthread.php?t=83707

Statement ResizeWidth{index.l,amount.l,xadjust.l}
	
	diwstrt.l = xadjust*8
	diwstop.l = diwstrt + amount*8
	
	dUfstrt.l = Int(diwstrt/2)
	dUfstop.l = Int(diwstop/2)
	
	DisplayAdjust index,amount,dUfstrt,dUfstop,diwstrt,diwstop
	
End Statement

Where:
- Index is the copper list
- Amount is the amount of pixels to increase or decrease the width by (multiples of 8)
- XAdjust is the amount to move it left or right by (multiples of 8)
[wyróżniony] [#15] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@mateusz_s, post #14

ddf i diw to oddzielne i niezależne od siebie rejestry. Poza tym trzeba uwzględnić fetch mode. Na eab są podane formuły, poszukaj wpisów odnośnie aga modulo.
[#16] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #15

udało mi się coś takiego znaleźć, lepiej opisane, zaczynam powoli rozumieć, nawet cos mi sie udalo z sensem przesunac wg obliczen: http://eab.abime.net/showthread.php?p=933197&styleid=4 i tak z tym modulo to dla lowres bedzie 40 bajtow jak porzednio i 80 dla hires, jeszcze nie wiem do konca jak to uwzglednic w tych obliczeniach, na razie próbuje sie loweresem zajac
[#17] Re: dziwny problem z podwójym Cooperem dla trybu interelaced

@cholok, post #15

znalazłem niby jakąs rutynę, strasznie ogromna.. nie chce mi sie wierzyć ze trzeba az takiego zachodu żeby wyswietlić bitmpakę :)

http://eab.abime.net/showthread.php?t=79840
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem