Co myslite, aka je najrychlejsia mozna rutinka na vykreslenie jedneho bodu na obrazovke ? Kolko hodinovych taktov procesora trva ? 200 ? 100 ? 83 ? Este menej ? No, nebudem vas uz dlhsie trapit, najrychlejsia rutinka na vykreslenie bodu trva presne 7 taktov (na Didaktikoch M a Kompakt 8 taktov) a vyzera takto:
Na vstupe ocakava v registri HL adresu bajtu vo videoram v ktorom
sa nachadza dany bod a v registri A ocakava masku pre dany bod.
Ale ruku na srdce - pracovalo by sa vam s takouto rutinou dobre ?
Museli by ste mysliet na prekladanie videoramky, na to ktory bod sa
nachadza v ktorom bite bajtu, na to aby ste si zadanim nevhodnej
adresy neznicili program... (a nocna mora z Elm street by zas bola tu)
Prenechajme my radsej tuto rutinku absolutnym fanatikom a podme
trosku pouvazovat. Ake vstupy do rutinky by sa nam najviac hodili ?
Najlepsie by bolo, keby sme na vstup mohli zadat priamo suradnice
bodu X a Y. A z nich by si potom rutinka vsetko ostatne sama
vypocitala. Minule sme si ukazali, ako mozno velmi rychlo z Y
suradnice vypocitat adresu bodoveho riadku vo videoramke. Skusme
tento princip vyuzit aj pri nasej rutinke na vykreslenie bodu.
Uz vieme, ze ak chceme vykreslit bod, musime poznat adresu bajtu vo
videoramke, v ktorom sa nachadza tento bod a nejaku masku ktora by
obsahovala informaciu o tom ktory bit v tomto bajte predstavuje nas
bod. Adresu bajtu mozeme vyjadrit ako sucet adresy bodoveho riadku vo
videoramke a pozicie bajtu v tomto bodovom riadku. Kedze na urcenie
adresy bodoveho riadku sme v minulej casti velmi vyhodne pouzili
predpocitanu tabulku, skusme aj poziciu bajtu v bodovom riadku a
poziciu bodu v bajte urcit predpocitanymi tabulkami. Kedze obidve
tieto hodnoty zavisia vyhradne od X suradnice, co je prave jeden bajt
alebo 256 moznosti, bude na urcenie kazdej hodnoty treba 256 bajtov
dlhu tabulku. Celkovy rozsah tabuliek nam teda vychadza na 4x 256
bajtov co je presne jeden kilobajt.
Nasa rutinka "bod" pracuje tak, ze z predpocitanej tabulky podla
Y suradnice zisti adresu bodoveho riadku, k nej logickym suctom
pripocita poziciu bajtu na tomto riadku danu X suradnicou, potom
tiez podla X suradnice zisti masku pre dany bit v bajte a na zaver
maskou setne alebo zneguje tento bit v bajte videoramky. To, ci ho
ma setnut alebo znegovat urcuje to aka instrukcia je pouzita v rutinke
na adrese "bodset". Ak je tam OR (HL) tak sa bod setne a je to vlastne
sposob vykreslovania ako OVER 0 a ak je tam instrukcia XOR (HL) tak
sa zneguje - OVER 1. Rutinka "over" podla vstupneho udaja vypocita
aka instrukcia sa tam ma pouzit pre dany sposob vykreslovania.
tabbod | = | #6000 |
org | #8000 | |
run | call | mkbod |
ld | a,#01 | |
call | over | |
ld | bc,#00 | |
call | bod | |
ld | bc,#0202 | |
call | bod | |
ld | bc,#6080 | |
call | bod | |
ld | bc,#bfff | |
bod | ld | h,>tabbod |
ld | l,b | |
ld | d,(hl) | |
inc | h | |
ld | a,(hl) | |
inc | h | |
ld | l,c | |
or | (hl) | |
ld | e,a | |
inc | h | |
ld | a,(de) | |
bodset | xor | (hl) |
ld | (de),a | |
ret | ||
over | rrca | |
sbc | a,a | |
and | #18 | |
xor | #b6 | |
ld | (bodset),a | |
ret | ||
mkbod | ld | ix,tabbod |
ld | hl,#4000 | |
mkbb1 | ld | (ix+#00),h |
inc | xh | |
ld | (ix+#00),l | |
dec | xh | |
call | dole | |
inc | xl | |
jr | nz,mkbb1 | |
inc | xh | |
inc | xh | |
mkbb2 | ld | a,xl |
rrca | ||
rrca | ||
rrca | ||
and | #1f | |
ld | (ix+#00),a | |
ld | a,xl | |
cpl | ||
add | a,a | |
add | a,a | |
add | a,a | |
or | #c7 | |
ld | (mkbb3+1),a | |
xor | a | |
mkbb3 | set | 1,a |
inc | xh | |
ld | (ix+#00),a | |
dec | xh | |
inc | xl | |
jr | nz,mkbb2 | |
ret | ||
dole | inc | h |
ld | a,h | |
and | #07 | |
ret | nz | |
ld | a,#20 | |
add | a,l | |
ld | l,a | |
ret | c | |
ld | a,#f8 | |
add | a,h | |
ld | h,a | |
ret |
Zhrnutie: Rutinka "run" je taky malicky demonstracny priklad
ako pouzivat rutinky potrebne pre vykreslenie bodu na obrazovke.
Rutinka "bod" sluzi na samotne vykreslenie bodu, na vstupe ocakava
suradnice v registri BC (B=Y,C=X). Rutinka "over" specifikuje sposob
vykreslovania bodu, vstup: A=0 pre OVER 0 alebo A=1 pre OVER 1.
Rutinka "mkbod" sluzi na vypocet tabulky potrebnej pre rutinku "bod".
Treba ju zavolat raz na zaciatku pred prvym pouzitim rutinky "bod".
Nabuduce si ukazeme ako co najrychlejsie nakreslit vseobecnu ciaru.
Rutinky, ktore sme si dnes uviedli, si pozorne uschovajte, pretoze
dalsich castiach tohto serialu sa na ne budeme odvolavat.
Vas Busy.