Napiszę jeszcze o dwóch fajnych technikach w Amidze, które mogą pomóc w obróbce grafiki Chunky - z Akiko lub bez:
1. Od procesora MC68020 wzwyż wprowadzono
pola bitowe. Można wyciągnąć (extract) lub włożyć (insert) dowolne przedziały bitowe. Może to być wręcz zbawienne dla danych chunky, które są upakowane w rejestry 32-bitowe.
Przykład: jak mamy w 32-bitowym rejestrze 8 pikseli 4-bitowych, to możemy wyjąć dowolny piksel (lub piksele) jedną operacją CPU:
BFEXTU <ea>{offset:width},Dn
Gdzie offset to początek pola bitowego, a width to jego szerokość (tutaj 4). Przykładowo, jak chcemy wyciągnąć piksel 4-bitowy na offsecie 8-11 to piszemy:
BFEXTU D0{8:4},D1
Oczywiście możemy wyciągać paczki wielu pikseli. Np. dla offsetu 4-27:
BFEXTU D0{4:24},D1
Pola bitowe są dość kosztowne, ale na dłuższą metę mogą skrócić znakomicie dostęp do wybranych pikseli, bo nie trzeba robić kilku instrukcji: przesuw bitowy, skopiowanie i maska.
Można też umieszczać dowolne wartości w polach bitowych instrukcją BFINS. Przykładowo poniższa instrukcja na powrót umieści wartość w polu bitowym:
BFINS D1,{4:24}D0
2. Można traktować bitplany jako bity w liczbie i dokonywać dowolnych operacji logicznych lub arytmetycznych na tych bitach, co skutkuje szybkimi operacjami na obszarach bitmap.
Przykładowo jeżeli chcemy dodać wartość 1 do wybranych 32 pikseli można to zrobić za pomocą krótkiej pętli iterowanej po bitplanach. Dla każdego bitplanu mamy jeden odczyt i zapis.
Liczymy po prostu sumę (operacja EOR) i przeniesienie (operacja AND).
To tylko poglądowy przykład i można go rozwijać.
; Dodanie 1 do wartości 32 pikseli:
; D6: Szerokość linii w bajtach
MOVEQ #-1,D0 ; Wejściowe przeniesienie (Carry)
CLR.W D3 ; Przesunięcie do bitplanu
CLR.B D4 ; Numer bitplanu
MOVEQ #8,D5 ; Liczba bitplanów
.nastBitplan:
MOVE.L (A0,D3.W),D1 ; Odczyt pikseli z bitplanu
MOVE.L D1,D2
EOR.L D0,D1 ; Zastosowanie przeniesienia
MOVE.L D1,(A0,D3.W) ; Zapis
AND.L D2,D0 ; Nowe przeniesienie
ADDI.W D6,D3 ; Przejście do nast. bitplanu
ADDQ.B #1,D4
CMP.B D5,D4
BLT.S .nastBitplan
RTS
;Tabelka:
; A Carry A+C Nowe Carry
; 0 0 0 0
; 0 1 1 0
; 1 0 1 0
; 1 1 0 1
;