Hej, czy Ktoś może mi wytłumaczyć ten fragment kodu?
Zadaniem jest szybkie wyczyszczenie 3-bitplanowej bitmapy
Bitmap 0,320,256,3
Wiem, że:
- jedna linia w rozdzielczości LOWRES zajmuje 40 bajty: 320 / 8
- a więc jeden bitplan 320x256 to bedzie: 320 / 8 * 256 = 10 240 bajtów = 10 kb
- a cała bitmapa to: 320 / 8 * 256 * 3 = 30 720 bajtów = 30 kb
- o ile dobrze sie orientuje to w pamięci jest to ułożone w taki sposób że najpierw 1 cały bitplane, potem 2 i 3.
i teraz nie rozumiem dlaczego do asemblerowej funkcji czyszczącej jako parametr jest podawana zawartość pamięci pod adresem bitmapy + 8 aby wyczyścić 1 bitplane a następnie kolejne przesunięte o 4, czyli +12 i +16.
mycls{Peek.l (Addr BitMap(db)+8)}
mycls{Peek.l (Addr BitMap(db)+12)}
mycls{Peek.l (Addr BitMap(db)+16)}
Po pierwsze dlaczego nie podajemy tam samego adresu początku bitmapy tylko "to co jest pod adresem + 8" (o ile dobrze to zrozumiełem).. co oznacza to 8, adres przesunięty o 8 bajów, ale po co? czemu nie zaczynamy od początku i skąd te kolejne ofsety o 4 bajty, skoro jeden bitplan zajmuje 10kb?
funkcja asemblerowa wygląda tak, nie chodzi mi o optymalizację tej funkcji tylko wytłumaczenie tej zagwozdki z bitplanami..
Watek z optymalizajcą tej funkcji jest tutaj:
link
Statement mycls{ a.l }
MOVE.l d0, a0
ADD.l #40*256, a0
MOVEQ #0, d0
MOVEQ#0,d1
MOVEQ#0,d2
MOVEQ#0,d3
MOVEQ#0,d4
MOVEQ#0,d5
MOVEQ#0,d6
MOVE.l d0, a1
MOVE.l d0, a2
MOVE.l d0, a3
MOVE #255, d7
loop1:
MOVEM.l d0-d6/a1-a3, -(a0)
DBRA d7, loop1
AsmExit
End Statement