BCD számok kezelése


Ezzel tulajdonképpen a számok kiíratási lehetőségeit többé kevésbé letárgyaltuk, az összes többi már ezek kombinálása. Van azonban a számok tárolásának még egy nagyon gyakori fajtája az úgynevezett BCD számábrázolás. Ez nem más mint a decimális és a hexadecimális ábrázolás keveréke. Itt a hexa számban a legmagasabb használható érték a 9. Ilyen módon legfőképpen a ROM BIOS programjai kezelik a számokat. A most bemutatásra kerülő példa is erre támaszkodik, a pontos időt fogjuk a képernyőre írni. Itt például a 16 óra 42 perc 1642h számként tárolódik. Használatuk igen egyszerű, hasonlít a decimális számok kiíratására, mivel itt is hozzá kell adni a számhoz 48-at a kiírás előtt, de itt is egyszerre csak egy számjegyet teszünk ki.

A ROM program elindítása után az eredményt az egyes regiszterekben kapjuk mégpedig ch-ban az órát, cl-ben a percet és dh-ban pedig a másodpercet BCD formátumban.

Pelda09 Segment ;Szegmensdefinicio
assume cs:Pelda09,ds:Pelda09 ;Cs, ds beallitasa
Start: mov ax,Pelda09 ;Ds regiszter beallitasa
mov ds,ax ;a kod elejere
mov ax,0b800h ;A kepernyomemoria szegmens-
mov es,ax ;cimet es regiszterbe tolti.
mov ax,3 ;80*25 karakteres mod be-
int 10h ;allitasa, kepernyotorles.
.1_Pelda09: mov ax,200h ;Az ido lekerdezese
int 1ah
call Kiiro ;es kiirasa.
mov ax,100h ;Figyeli, hogy van-e
int 16h ;lenyomott billentyu.
jz .1_Pelda09 ;Ha nincs, ugrik az elejere.
xor ax,ax ;Ha van, akkor kiolvassa azt
int 16h
mov ax,4c00h ;es visszater a DOS-hoz.
int 21h
Kiiro Proc ;A rutin kezdete.
mov di,1670 ;A kepernyo kozepe taja.
mov ah,15 ;Szinbeallitas
mov bx,cx ;Az ora,perc erteket attolti
;bx-be.
call Kiiro2 ;kiirja az ora erteket.
add di,2 ;Helyet hagy a kettospontnak.
call Kiiro2 ;Kiirja a percet.
add di,2 ;A kettospont helye.
mov bh,dh ;A masodperc erteket bh-ba
call Kiiro2 ;tolti es kiiratja.
mov al,":" ;Al regiszterbe a ":" jel
mov es:[di-6],ax ;kodjat teszi es kiirja
mov es:[di-12],ax ;azt a ket megadott helyre.
ret ;Visszateres a rutinbol.
Kiiro Endp ;A kiiro rutin vege.
Kiiro2 Proc ;A kiiro2 rutin kezdete.
mov cx,2 ;Egyszerre 2 szamjegyet
.1_Kiiro2: push cx ;irunk ki.
mov cx,4 ;Ami egyenkent 4 bitbol all.
xor al,al ;Al nullazasa.
.2_Kiiro2: shl bx,1 ;Bx felso 4 bitjet atforgatja
rcl al,1 ;al regiszterbe.
loop .2_Kiiro2
add al,48 ;Atalakitja karakterkodda
mov es:[di],ax ;es kiirja a kepernyore.
add di,2 ;A kovetkezo kephely.
pop cx ;A kovetkezo szamjegy.
loop .1_Kiiro2
ret ;Visszateres a rutinbol.
Kiiro2 Endp ;Az eljaras vege.
Pelda09 Ends ;A szegmens vege.
End Start ;A program vege.


A program új utasításokat nem tartalmaz, ami mégis új az a REAL TIME óra kezelése. Ez nem más, mint egy a számítógép által kezelt óra amit software úton lekérdezhetünk, beállíthatunk stb. Ennek a kezelésére most az 1Ah BIOS program 02 funkciója lett alkalmazva. A hívás után a már említett regiszterekben kapjuk az idő értékét. A feladat csak annyi, hogy ezt kiírjuk a képernyőre. Persze ahhoz, hogy valami formája is legyen a dolognak, ne árt elválasztó kettőspontokat rakni az óra perc illetve a perc másodperc értékek közé. Ezenkívül meg kell oldani, hogy az óra járjon, de mégis ki lehessen lépni belőle. Ha az eddigi billentyűzet figyelést alkalmaztuk volna, az óra nem járna, csak kiírná az aktuális értéket és egy gombnyomásra kilépne. Ha egy jmp utasítással visszaugrálnánk a kiíratáshoz, akkor az óra járna, de billentyűfigyelés nélkül nem lehetne kiszállni a program futásából. A megoldás egy másik fajta figyelés kombinálása a visszaugrással. A 16h rutinnak a 01 funkciója nem vár egy billentyű lenyomására, csak az aktuális állapotról ad információt az ax regiszteren illetve a flagen keresztül. A z jelzőbit 1 értéke jelenti, hogy nincs lenyomott gomb tehát visszaugorhatunk az óralekérdezésre. Amennyiben van, azt ki kell olvasni a billentyűzet pufferből az eddig is használt rutinnal de itt a különbség annyi, hogy nem vár mivel már van lenyomott billentyű, ha ezt a kiolvasást kihagynánk akkor kilépés után kiírná azt a betűt amit lenyomtunk. Ezután a megszokott módon visszatérünk a DOS-hoz. A program egyszerűsítése érdekében a kiíratás egy eljárással lett megoldva amit egy másik eljárás kezel. A főprogram csak az időinformációk lehívását illetve a billentyűzetkezelést végzi. A megjelenítést egy rutin vezérli, hogy minden a megfelelő helyre kerüljön.

Egy szintet vissza, vagy vissza a főmenübe.