Bře 272005
 

Dnes si ukážeme, jak je možné tiskat čísla bez prvních, nepodstatných nul na začátku.

Naučíme se, jak je možné tyto nuly nahradit libovolným znakem, ba dokonce i přímo tak, aby nevytiskla ani mezera a číslo bylo zarovnané nalevo.

Takže, princip je jednoduchý, místo znaku ‚0‘ vytisknout znak jiný, nejlépe ‚ ‚ (mezeru). Na to využijeme registr c a do něj vložíme kód nahrazovaného znaku. Tesně před tiskem zkontrolujeme, zda se nebude náhodou tisknout znak ‚0‘ a jestli ano, tak se nahradí znakem z registru c. Ale co když bude nula uprostřed čísla? Musíme tedy změnit obsah registru c na ‚0‘ v tom případě, že se bude tisknout jiná číslice než nula. Taky se musí změnit, má-li se tisknout poslední nula v řádu jedniček.

                ld      hl,3605         ;cislo
                call    CISLO           ;a vytiskni jej dekadicky
                ld      a,13            ;odradkuj
                call    ZNAK
                ld      hl,3605         ;jeste jednou
                ld      c,0             ;neplatne nuly netiskni
                call    CISLO2          ;volej rutinu trochu niz

                ld      a,13            ;odradkuj
                call    ZNAK

                ld      hl,$0560        ;to same cislo
                call    HEXCISLO        ;tiskni jako hexa
                ld      a,13            ;opet odradkuj
                call    ZNAK
                ld      hl,$0560        ;jeste jednou
                ld      c,0             ;a zase netiskni nuly
                call    HEXCISLO2       ;vytiskni
                ret

CISLO           ld      c,' '           ;uvodni znak
CISLO2          ld      de,-10000       ;rad desetitisicu
                call    CIFRA
                ld      de,-1000        ;rad tisicu
                call    CIFRA
                ld      de,-100         ;rad stovek
                call    CIFRA
                ld      de,-10          ;rad desitek
                call    CIFRA
                ld      c,'0'           ;posledni rad, nastav nulu.
                ld      de,-1           ;rad jednicek
CIFRA           ld      a,'0'-1         ;do A znak 0 zmenseny o 1
CIFRA1          add     hl,de           ;pricti zaporny rad
                inc     a               ;zvys pocitadlo
                jr      c,CIFRA1        ;jeste jsme jej neprekrocili
                cp      '0'             ;neni to nahodou nula?
                jr      nz,CIFRA2       ;neni,skoc
                ld      a,c             ;nahrad nulu znakem pro nulu
CIFRA3          sbc     hl,de           ;oprav cislo
                or      a               ;neni to primo nula, nema se vubec tisknout
                call    nz,ZNAK         ;a vytiskni pocitadlo
                ret
CIFRA2          ld      c,'0'           ;bude se tisknou cislo
                jr      CIFRA3          ;takze dalsi cislice budou platne

HEXCISLO        ld      c,' '
HEXCISLO2       ld      de,-$1000       ;rad 16^3
                call    HEXCIFRA
                ld      de,-$100        ;rad 16^2
                call    HEXCIFRA
                ld      de,-$10         ;rad 16^1
                call    HEXCIFRA
                ld      c,'0'           ;posledni rad, nastav nulu.
                ld      de,-1           ;rad 1
HEXCIFRA        ld      a,'0'-1         ;pocatecni inializace pocitadla
HEXCIFRA1       add     hl,de           ;odecitej rady (pricitej zaporne)
                inc     a               ;zvys pocitadlo
                jr      c,HEXCIFRA1     ;neprekrocilo
                cp      '0'             ;neni to nahodou nula?
                jr      nz,HEXCIFRA3    ;neni,skoc
                ld      a,c             ;nahrad nulu znakem pro nulu
HEXCIFRA4       sbc     hl,de           ;oprav cislo
                cp      '9'+1           ;je pocitadlo vyse nez 9?
                jr      c,HEXCIFRA2     ;ne, skoc
                add     a,'A'-':'       ;oprav na znak A-F
HEXCIFRA2       or      a               ;pokud je to primo nula, nema se tisknout
                call    nz,ZNAK         ;a vytiskni
                ret
HEXCIFRA3       ld      c,'0'           ;bude se tisknou cislo
                jr      HEXCIFRA4       ;takze dalsi cislice budou platne

Stažení: dil9.zip

Je nám líto, ale formulář pro přidávání komentářů je momentálně uzavřen.