Jak ctu kapitolu 15. tak jsem si uvedomil, ze jsem udelal chybu ve vypoctu prechodu adresy znaku mezi tretinama.
Nemohu komentovat ani opravit komentar co nebyl (jeste) schvalen takze pisi novy prispevek. Opravena verze je o bajt delsi a takt rychlejsi (zmena je jen pod djnz loop).
loop:
ld A,(HL) ; 1:7 načtení jednoho bajtu z masky
ld (DE),A ; 1:7 zápis hodnoty na adresu (DE)
inc L ; 1:4 posun na další bajt masky
inc D ; 1:4 posun na definici dalšího obrazového řádku
djnz loop ; 2:8/13 vnitřní smyčka: blok s osmi zápisy
inc E ; 1:4
ret z ; 1:5/11 D+=8,E=E+1=0
ld D, C ; 1:4
ret ; 1:10 D=D,E=E+1
V 15. kapitole rutina calc_block_address se ta taky vylepsit, kdyz misto rra se pouzije rrca.
Puvodni:
calc_block_address:
; parametry:
; B - x-ová souřadnice (ve znacích, ne pixelech)
; C - y-ová souřadnice (ve znacích, ne pixelech)
;
; návratové hodnoty:
; HL - adresa pro zápis bloku
;
; vzor adresy:
; 0 1 0 Y4 Y3 0 0 0 | Y2 Y1 Y0 X4 X3 X2 X1 X0
ld A, C ; 1:4
and %00000111 ; 2:7 pouze spodní tři bity y-ové souřadnice (řádky 0..7)
rra ; 1:4
rra ; 1:4
rra ; 1:4
rra ; 1:4 nyní jsou čísla řádků v horních třech bitech
or B ; 1:4 připočítat x-ovou souřadnici
ld L, A ; 1:4 máme spodní bajt adresy
; Y2 Y1 Y0 X4 X3 X2 X1 X0
ld A, C ; 1:4 y-ová souřadnice
and %00011000 ; 2:7 dva bity s indexem "bloku" 0..3 (dolní tři bity už máme zpracovány)
or %01000000 ; 2:7 "posun" do obrazové paměti (na 0x4000)
ld H, A ; 1:4 máme horní bajt adresy
; 00 01 00 Y4 Y3 00 00 00
ret ; 1:10 návrat z podprogramu
Nove:
calc_block_address:
; parametry:
; B - x-ová souřadnice (ve znacích, ne pixelech)
; C - y-ová souřadnice (ve znacích, ne pixelech)
;
; návratové hodnoty:
; HL - adresa pro zápis bloku
;
; vzor adresy:
; 0 1 0 Y4 Y3 0 0 0 | Y2 Y1 Y0 X4 X3 X2 X1 X0
ld A, C ; 1:4
rrca ; 1:4
rrca ; 1:4
rrca ; 1:4
and %11100000 ; 2:7 nyní jsou čísla řádků v horních třech bitech
or B ; 1:4 připočítat x-ovou souřadnici
ld L, A ; 1:4 máme spodní bajt adresy
; Y2 Y1 Y0 X4 X3 X2 X1 X0
ld A, C ; 1:4 y-ová souřadnice
and %00011000 ; 2:7 dva bity s indexem "bloku" 0..3 (dolní tři bity už máme zpracovány)
or %01000000 ; 2:7 "posun" do obrazové paměti (na 0x4000)
ld H, A ; 1:4 máme horní bajt adresy
; 00 01 00 Y4 Y3 00 00 00
ret ; 1:10 návrat z podprogramu