Odpovídáte na názor k článku Vývoj pro ZX Spectrum: vlastní vykreslovací subrutiny potřetí. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
A nejtezsi cast nakonec. Prevod YX na adresu v HL. Najit efektivni cestu je tak slozity, ze jsem se rovnou podival jak jsem to resil nekdy predtim... .) Taky jsou v mem pasmu 4 rano... .)
https://github.com/DW0RKiN/M4_FORTH/blob/master/M4/graphic_runtime.m4
Po "drobne" uprave se da usetrit rovnych 6 bajtu!
calc_pixel_address:
; parametry:
; B - x-ová souřadnice (v pixelech)
; C - y-ová souřadnice (v pixelech)
;
; návratové hodnoty:
; HL - adresa pro zápis pixelu
;
; pozměněné registry:
; A
;
; vzor adresy:
; 0 1 0 Y7 Y6 Y2 Y1 Y0 | Y5 Y4 Y3 X4 X3 X2 X1 X0
if 1
ld A, C ; 1:4 bbrrrsss = Y
or 0x01 ; 2:7 bbrrrss1 carry = 0
rra ; 1:4 0bbrrrss carry = 1
rra ; 1:4 10bbrrrs carry = s?
and A ; 1:4 10bbrrrs carry = 0
rra ; 1:4 010bbrrr
ld L, A ; 1:4 .....rrr
xor C ; 1:4 ????????
and 0xF8 ; 2:7 ?????000
xor C ; 1:4 010bbsss
ld H, A ; 1:4 H = 64+8*INT (b/64)+(b mod 8)
ld A, L ; 1:4 .....rrr
xor B ; 1:4 ???????? provede se 2x takze zadna zmena, mezitim ale vynulujeme hornich 5 bitu
and 0x07 ; 2:7 00000???
xor B ; 1:4 cccccrrr
rrca ; 1:4 rcccccrr
rrca ; 1:4 rrcccccr
rrca ; 1:4 rrrccccc
ld L, A ; 1:4 L = 32*INT (b/(b mod 64)/8)+INT (x/8).
ret ; 1:10 návrat z podprogramu
else
ld a, c ; všech osm bitů Y-ové souřadnice
and %00000111 ; pouze spodní tři bity y-ové souřadnice (Y2 Y1 Y0)
; A: 0 0 0 0 0 Y2 Y1 Y0
or %01000000 ; "posun" do obrazové paměti (na 0x4000)
ld h, a ; část horního bajtu adresy je vypočtena
; H: 0 1 0 0 0 Y2 Y1 Y0
ld a, c ; všech osm bitů Y-ové souřadnice
rra
rra
rra ; rotace doprava -> Y1 Y0 xx Y7 Y6 Y5 Y4 Y3
and %00011000 ; zamaskovat
; A: 0 0 0 Y7 Y6 0 0 0
or h ; a přidat k vypočtenému mezivýsledku
ld h, a ; H: 0 1 0 Y7 Y6 Y2 Y1 Y0
ld a, c ; všech osm bitů Y-ové souřadnice
rla
rla ; A: Y5 Y4 Y3 Y2 Y1 Y0 xx xx
and %11100000 ; A: Y5 Y4 Y3 0 0 0 0 0
ld l, a ; část spodního bajtu adresy je vypočtena
ld a, b ; všech osm bitů X-ové souřadnice
rra
rra
rra ; rotace doprava -> 0 0 0 X7 X6 X5 X4
and %00011111 ; A: 0 0 0 X7 X6 X5 X4 X3
or l ; A: Y5 Y3 Y3 X7 X6 X5 X4 X3
ld l, a ; spodní bajt adresy je vypočten
ret ; návrat z podprogramu
endif