Vypis sestnastkoveho cisla

   V predchadzajucej lekcii sme riesili problem ako mozeme z hodnoty cisla vytvorit postupnost desiatkovych cislic, ktore zodpovedaju tomuto cislu. V tejto lekcii budeme riesit ten isty problem, ale namiesto desiatkovej sustavy budeme pracovat v sestnastkovej - budeme vytvarat postupnost sestnastkovych cislic.

   Na riesenie tohto problemu pouzijeme ten isty program, len si ho prisposobime na potreby sestnastkovej sustavy. Toto prisposobene vykoname tromi nasledovnymi zmenami:

  1. Nas novy program bude vytvarat cislo v sestnastkovej sustave, preto namiesto mocnin cisla 10 v nom budu mocniny cisla 16.
  2. Na vyjadrenie cisel ktore mozno zobrazit v parovom registri nam v sestnastkovej sustave stacia iba styri cislice namiesto piatich v desiatkovej sustave. Preto bude modifikovany program pracovat iba nad tymito styrmi cislicami.
  3. ASCII-kody sestnastkovych cislic na rozdiel od ASCII-kodov desiatkovych cislic nejdu bezprostredne za sebou, ale su rozdelene na dve skupiny - cislice 0-9 a pismena A-F. Kody v jednotlivych skupinach uz idu bezprostredne za sebou. Toto budeme musiet vhodnym sposobom v programe osetrit.

   Nas program z minulej lekcie po tychto troch upravach bude vyzerat takto:

run ld hl,#fc12 Priklad cisla 
bnhx ld bc,buffer Adresa buffera pre cislice 
 ld de,-#1000 pre sestnastkovy rad 4096 (16^3) 
 call cifra vypocet cislice 
 ld de,-#0100 ...256-ky   (16^2) 
 call cifra vypocet cislice 
 ld de,-#10 ...sestnastky (16^1) 
 call cifra vypocet cislice 
 ld e,-#01 ...jednotky  (16^0) 
cifra ld a,'0'-1 vypocet cislice jedneho radu: 
cif1 add hl,de odpocitavame hodnotu radu - 
 inc (sucasne pocitame kolko krat) 
 jr c,cif1 - az kym neprekrocime nulu 
 sbc hl,de Oprava prekrocenia nuly 
 cp '9'+1 cislica vecsia ako 9 ? 
 jr c,cif2 nie - skok 
 add a,'a'-':' ano - korekcia cislic A-F 
cif2 ld (bc),a ulozenie cislice do buffera 
 inc bc ukazovatel na dalsie miesto v bu 
 ret   
buffer db 'xxxxxxxxxxx' buffer pre nase cislice 

   To, co sme prave urobili, bola iba modifikacia uz existujuceho riesenia z minulej lekcie. Je to dobry a v praxi velmi pouzivany postup, ale tento postup nam neprinasa ziadne vecsie originalne myslienky. Skusme sa preto teraz pozriet na tento problem z uplne inej strany !

   Na vyjadrenie jednej sestnastkovej cislice potrebujeme prave styri bity (pretoze 2^4=16). Parovy register ma 16 bitov (rozdelme si to na styri stvorice bitov) a cislo v nom vyjadrene sa da zapisat styrmi sestnastkovymi cislicami. Ked sa nad tym zamyslime, prideme na to, ze jednu konkretnu sestnastkovu cislicu urcuje iba jej prisluchajuca stvorica bitov v parovom registri. Nedala by sa tato vlastnost vhodne vyuzit v nas prospech ?

   Vytvorme si rutinku (nazvime ju "bnhx4") ktora nam zo styroch bitov (napr. styri najnizsie bity v akumulatore) vypocita ASCII-kod prislusnej sestnastkovej cislice a ulozi ho do buffera. Tymto sa cely problem prevodu cisla na postupnost sestnastkovych cislic redukuje na postupne aplikovanie rutinky "bnhx4" na vsetky stvorice bitov v nasom cisle - v poradi od najvyznamnejsej stvorice po najmenej vyznamnu.

   Teraz si vytvorme rutinku "bnhx8" ktora vezme jeden bajt (dve stvorice bitov v akumulatore) a aplikuje rutinu "bnhx4" najprv na vyssie a potom na nizsie styri bity tohto bajtu. Nakoniec vytvorme poslednu rutinku "bnhx" ktora vezme nase cislo v (parovom registri HL) a aplikuje rutinku "bnhx8" najprv na register H (vyssi bajt) a potom na register L (nizsi bajt).

run ld hl,#fc12 Priklad cisla 
bnhx ld bc,buffer Adresa buffera pre cislice 
 ld a,h vyssy bajt = rady 4096 a 256 
 call bnhx8 spracovanie jedneho bajtu cisla 
 ld a,l nizsi bajt = rady 16 a 1 
bnhx8 push af uschova jedneho bajtu cisla 
 rrca  - presun vyssich styroch 
 rrca  - bitov tohto bajtu 
 rrca  - do nizsich bitov 
 rrca  - (kvoli vypisu) 
 call bnhx4 spracovanie tychto presunutych bitov 
 pop af obnova povodneho bajtu cisla 
bnhx4 and #0f vynulovanie nezaujimavych bitov 
 add a,'0' Vypocet ASCII-kodu cislic 0-9 
 cp '9'+1 cislica vecsia ako 9 ? 
 jr c,bnhx0 nie - skok 
 add a,'a'-':' ano - korekcia cislic A-F 
bnhx0 ld (bc),a ulozenie cislice do buffera 
 inc bc ukazovatel na dalsie miesto v bufferi 
 ret   
buffer db 'xxxxxxxxxxx' buffer pre nase cislice 

   Na domacu ulohu sa skuste zahrat na samotny procesor Z80 a skuste si tento program prejst od zaciatku (navestie "run") az do samotneho konca. Prave takto najlepsie uvidite a na vlastnej kozi pocitite, kadial a kolkokrat musi procesor prebehnut aby mohol splnit ulohu, ktorou sme ho poverili. Zvlast si davaje pozor na zasobnik - co a kedy sa don uklada a co a kedy sa z neho cita.

Vas Busy.

Nazad / back , predchadzajuca a dalsia lekcia