Podprogram za pretvorbo podatkovnih tipov

Krmiljenje mostičnega dvigala je izvedeno preko znakovnega niza, zaključenega z \0 (tipka Enter). Sam ukaz je sestavljen kot:

                 N<1-16>                   (tovor v skladišče),
                 V<1-16>                   (tovor iz skladišča).

Količina tovora je iz začetne omejitve na polje 4×4 (16 možnih mest) razširjena na 255 mest oz. število tovora 1 do 255. Ker je logistika krmiljenja snovana tako, da iz vnešenega ukaza program razbere, ali gre za natovarjanje ali raztovarjanje ter številko tovora, je potrebno iz danega niza izluščiti potrebne informacije za izvedbo ukaza in nepredznačeno 16-bitno število kot številka tovora s pomočjo podprograma. Rutina je poimenovana S2I [string to integer]. Na sprejeti niz postavimo kazalec X, ki kaže na prvi znak, na katerem se prične pretvorba. Podprogram S2I dopušča na prvem mestu predznak, sicer pa sprejema izključno samo števila. Ob pretvorbi upošteva vsa števila do prvega znaka, ki ni število; tako lahko pride do prikoračitve obsega predznačenih oz. nepredznačenih 16-bitnih števil, kar nam sporoči zastavica prenosa [carry] C, ki se ob prekoračitvi postavi C=1, ob pravilni pretvorbi pa C=0. Nepravilno pretvorbo lahko prepoznamo tudi zaradi nespremenjene lege indeksnega registra (lega je nespremenjena, ker niz ni vseboval števil ali C=1). Ob koncu pretvorbe se v akumulatorju D nahaja razbrana vrednost. Dana rutina S2I potrebuje pri pretvorbi iz poljubnega niza v desetiški sistem 16-bitno množenje s konstanto 10. Potrebni podprogram je opisan v podpoglavju Aritmetični podprogram. Ob koncu množenja vrne produkt v akumulatorju D in postavi zastavico C=0 ob pravilnem neprekoračenem rezultatu množenja.

Komunikacijski parametri podprogramov MUL10 in S2I

;_______________________________ CONVERT STRING TO INTEGER (~<=695) __________________
;  Convert characters in null-terminated string variable at X to an signed or
;  unsigned 16bit integer in D. In case of conversion overflow C is set and D
;  is undefined. In any case, X points to the last NOT converted character
;  in the string!
;----------------------------------------------------------------------------------------
S2I     pshx              ;4  Potisne kazalec X niza na prvo mesto pretvorbe,
        clra              ;2  izbriše bodoče mesto za pretvarjanje znakov
        psha              ;3     in
        psha              ;3     potisne A
        psha              ;3     še
        psha              ;3     štirikrat, nato
        ldaa  0,X         ;4  naloži 1. znak
        psha              ;3     in ga potisne na sklad
        inx               ;3     ter ga poveča;
        eora  #"-"        ;2  primerja 1. znak z "-" (preverba predznaka neg.) ter
        beq   S2I1        ;3     če je enak, skoči na S2I1, sicer
        eora  #"+"        ;2  primerja znak z "+" (preverba predznaka poz.) ter
        beq   S2I1        ;3     in če je enak, skoči na S2I1, sicer
        dex               ;3     pomakne kazalec niza nazaj.
S2I1    ldaa  0,X         ;4  Naloži znak niza,
        pshx              ;4  pomakne kazalec niza in
        tsx               ;3     kazalec sklada na X,
        suba  #"0"        ;2  odšteje konstantno vrednost 0 od AKU A (A=A-0),
        bcs   S2I2        ;3  če je vrednost v AKU A<0, skoči na S2I2, sicer
        cmpa  #10         ;2     primerja vrednost v AKU A z 10 in
        bcc   S2I2        ;3     če je vrednost v AKU A>=10, skoči na S2I2, sicer
        staa  4,X         ;4     spravi binarni digit.
        ldd   5,X         ;5  Naloži binarno število,
        jsr   MUL10       ;6+52  kliče rutino MUL10 (zmnoži z 10)
        bcs   S2I4        ;3     in skoči na S2I4 v primeru preliva, sicer
        addd  3,X         ;6  prišteje binarni digit binarnemu številu in
        bcs   S2I4        ;3     skoči navzdol v primeru preliva ali
        std   5,X         ;5  obnovi binarno število.
        pulx              ;5  Potegne kazalec niza iz sklada in
        inx               ;3     ga poveča ter
        bra   S2I1        ;3  skoči nazaj na začetek pretvorbe S2I1.
S2I2    ldaa  2,X         ;4  Naloži 1. znak niza
        eora  #"-"        ;2     in ga primerja z "-" (preverba predznaka neg.)
        bne   S2I3        ;3     ter skoči na S2I3, če je različen, sicer
        clra              ;2  sprazni D
        clrb              ;2     za 2. komplement.
        subd  5,X         ;6  Odšteje binarno število
        std   5,X         ;5     in shrani novo vrednost.
        bpl   S2I4        ;3  V primeru, da je število pozitivno, skoči na S2I4, sicer
S2I3    clc               ;2     zbriše zastavico carry (do preliva ni prišlo).
        ldd   0,X         ;5  Naloži trenutni kazalec niza
        std   7,X         ;5     in ga shrani kot prvotni kazalec na niz.
S2I4    pulx              ;5  Dummy pull
        pulx              ;5     lokacij
        pula              ;4     s sklada.
        pula              ;4  Potegne rezultat iz AKU A in B
        pulb              ;4     v D.
        pulx              ;5  V X se nahaja zadnji nepretvorjen znak.
        rts               ;5  RETURN(D,X,C)


Nazaj!