Bře 242005
 

Určitě se všichni těšíte na další díl našeho seriálu, tak tu je. Naučíme se vytisknout číslo dekadické a hexa.

Použijeme na to již hotové rutinky od Busyho, jen lehce upravíme, aby bylo vidět, že jsem je jen neobšlehnul. Náš úkol je jasný: máme v registru hodnotu a potřebujeme ji dostat na obrazovku.

Princip rutinek je následující: od čísla budeme odečítat celý řád tolikrát, dokud nebude číslo záporné. Pak tento řád jednou přičteme, aby se dalo s číslem dále pracovat, a tolikrát, kolikrát jsme odečetli je naše hodnota daného řádu. Toto „kolečko“ provedeme s každým řádem.

Protože na odečítání potřebujeme instrukci sbc a ta musí mít neprve vynulovaný flag carry, použijeme fintu v tom, že budeme přičítat čísla záporná instrukcí add a budeme mít na salámu nějaké flagy a ještě ušetříme jednu instukci.

                ld      hl,43655        ;cislo
                call    CISLO           ;a vytiskni jej dekadicky

                ld      a,'='           ;znak =
                call    ZNAK            ;vytiskni

                ld      hl,43655        ;to same cislo
                call    HEXCISLO        ;tiskni jako hexa
                ret

CISLO           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      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
                sbc     hl,de           ;pokud ano, oprav cislo
                call    ZNAK            ;a vytiskni pocitadlo
                ret

HEXCISLO        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      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
                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       call    ZNAK            ;a vytiskni
                ret

Pro hexadecimální číslo je postup stejný, akorát po skončení odečítání ještě musíme opravit hodnty počítadla 10-15 na znaky A-F pomocí instrukce cp.

Domácí úkol bude tentokrát triviální, zkuste přinutit obě rutiny, aby čísla netiskla rovnou na obrazovku, ale ukládala do jakéhosi tiskového bufferu.

Stažení: dil8.zip

  Jeden komentář na “8.díl: čísla – část prvá”

  1. Pri hexadecimalnych cislach sa moze vyuzit vlastnost, ze kazda cislica zabera presne 4 bity (4 bity sa odborne nazyvaju nibel). Napriklad cislo 1EE7h bude v binarnom vyjadreni vyzerat ako:

    0001 1110 1110 0111

    Skuste vyuzit tuto vlastnost, rutinka na vypis takychto cisiel je velmi jednoducha. V podstate nou mozete vypisat lubovolne dlhe hexadecimalne cislo.

    Podobne rutiny sa daju napisat na kazdu ciselnu sustavu so zakladom 2^x.

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