2. Rychly putpixel alebo PLOT

   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:

ld (hl),a

   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 
 ld a,(hl) 
 inc 
 ld l,c 
 or (hl) 
 ld e,a 
 inc 
 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 
mkbb3 set 1,a 
 inc xh 
 ld (ix+#00),a 
 dec xh 
 inc xl 
 jr nz,mkbb2 
 ret  
   
dole inc 
 ld a,h 
 and #07 
 ret nz 
 ld a,#20 
 add a,l 
 ld l,a 
 ret 
 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.

Nazad / back , predchadzajuca a dalsia lekcia