Vhodno-izhodni programi

Na naslednjih straneh sta opisana potrebna podprograma za delo z znakovnim nizom in pripadajoča podprograma, ki skrbita za prenos posameznih znakov, ki ta niz sestavljajo. Analiza le-teh je podrobneje podana v nadaljevanju. Rutina TRACHR prenese vsak sprejeti znak iz akumulatorja A na ustrezno mesto v medpomnilnik, pri čemer pomakne kazalec TRAE, ki kaže na konec podatkovnega toka oz. označuje mesto polnenja. Rutina mora prav tako preverjati, ali ni medpomnilnik poln, pri čemer postavi ničelno zastavico Z [zero] Z=1, v nasprotnem primeru pa pri pravilnem vpisu postavi Z=0. Rutina RECCHR skrbi za prenos znakov iz sprejemnega medpomnilnika in vsak sprejeti znak nato shrani v medpomnilnik na lokaciji RECB-RECE. Ker je vloga tega podprograma komplementarna delovanju rutine TRACHR, oblikujemo rutino RECCHR tako, da osnovno zgradbo rutine TRACHR prepišemo, zamenjamo le mesto kazalcev (TRAB-TRAE v RECB-RECE).

Komunikacijski parametri podprogramov TRACHR in RECCHR

;________________________________ TRANSMIT CHARACTER (~<=51) __________________________
;  Place binary in A to the SCI transmitting buffer TRAB-TRAE. In case of a     
;  full buffer, the procedure returns Z=1, otherwise Z=0. The contents of all   
;  registers are preserved. This procedure must never be interrupted by another 
;  call to TRACHR!                                                              
;---------------------------------------------------------------------------------------- 
TRACHR
        pshx              ;4  Potisne X na sklad,
        ldx  TRAE         ;6  naloži logični konec medpomnilnika v X
        staa 0,X          ;4    in zapše znak iz A v medpomnilnik,
        inx               ;3    poveča kazalec X in
        cpx #TRAE         ;4    ga primerja s fizičnim koncem medpomnilnika
        bne TRAC1         ;3  Če presežemo fizični konec, skoči na TRAC1, sicer
        ldx #TRAB+2       ;3    preskoči na začetek.
TRAC1   cpx TRAB          ;6  Primerja logični konec z začetkom
        beq TRAERR        ;3    in ob polnem medpomnilniku konča (skoči na TRAERR)
        stx TRAE          ;5    sicer shrani novi logični konec
TRAERR  pulx              ;5    ter potegne X s sklada.
        rts               ;5  RETURN(Z)




;________________________________ RECEIVE CHARACTER (~<=51) ___________________________
;  Read one character from the SCI receiveing buffer RECB-RECE to A. In case
;  of an empty buffer, the procedure returns Z=1. A successful read is
;  indicated by Z=0. The contents of all registers are preserved. This
;  procedure must never be interrupted by another call to RECCHR!!
;----------------------------------------------------------------------------------------
RECCHR
        pshx              ;4  Potisne X na sklad
        ldx  RECB         ;6  Naloži začetek medpomnilnika,
        cpx  RECE         ;4    ga primerja s koncem medpomnilnika in
        beq  KON          ;3    v primeru enakosti zaključi (skoči na KON), sicer
        ldaa 0,X          ;4    naloži prvi znak,
        inx               ;3  poveča X,
        cpx  #RECE        ;4  primerja s fizičnim koncem medpomnilnika,
        bne  WRTE         ;3    ob presegu fizičnega konca
        ldx  #RECB+2      ;6    preskoči na fizični začetek
WRTE    stx  RECB         ;5    in spravi novi začetek
KON     pulx              ;5  Potegne X s sklada.
        rts               ;5  RETURN(Z)

Samo pisanje rutine RECSTR je povzročalo kljub osnovnim navodilom o delovanju oz. opravljanju nalog še največje težave zaradi svoje kompleksnosti. Prav tako je bilo poleg osnovnih funkcij rešiti še problem kontrole nepravilnega vnosa (piskanje ob pritisku neveljavnega znaka), takojšnji prikaz vsakega pravilno sprejetega znaka na terminal (echo), pravilno zasnovanje dela programa, ki se odziva kot tipka Backspace, torej briše napačno vpisan znak in preverjanje dolžine niza, ki v nobenem primeru ne sme presežti maksimalne dovoljene velikosti. Zadnji del je realiziran z uporabo konstante, ki se povečuje v primeru pravilno vnešenega znaka in zmanjšuje v primeru pritiska tipke Backspace ter primerja s končno dolžino niza v akumulatorju B. V primeru brisanja napačno vnešenega znaka se lahko pomikamo nazaj le tolikokrat, kolikor je vpisanih znakov, sicer program ne dopusti ponovnega pomika nazaj. Tak pomik bi namreč pomenil napačno delovanje programa. V zadanem projektu je bila uporabljena le rutina za sprejem znakovnega niza, RECSTR. Poleg omenjene rutine je vključena še rutina za oddajanje znakovnega niza, TRASTR.

Komunikacijski parametri podprogramov TRASTR in RECSTR

;___________________________ TRANSMIT STRING (~<=32+x*73) _____________________________
;  Transmit string staring with the character at X. TRASTR copies characters
;  from string to the transmision buffer TRAB-TRAE until the null-character
;  is encountered or until the tranmision buffer is full. In the later case
;  the transmision is interrupted and Z=1 is returned. Z=0 on the other hand
;  indicates a successfull transmission.
;----------------------------------------------------------------------------------------
TRASTR
PAUSE1  jsr TRACHR        ;6+51Skoči na podrutino za vpis znaka
        beq PAUSE1        ;3     in čaka, dokler ne vnesemo znaka, sicer
        psha              ;3   Potisne A na sklad
        pshx              ;4   Potisne X na sklad
TRAST1  ldaa  0,X         ;4   Naloži prvi znak v medpomnilnik na pozicijo TRAE
        beq  OUTSTR       ;3     in če je enak, skoči na OUTSTR (znak0, poln mp.), sicer
        jsr  TRACHR       ;6   Skoźi na rutino TRACHR
        inx               ;3     poveča kazalec in
        bra TRAST1        ;3     ponovno vnese naslednji znak
OUTSTR  pulx              ;5   Pri skoku potegne nazaj X
        pula              ;4     in A
        rts               ;5   RETURN(Z)




;________________________ RECEIVE STRING FROM SCI (~> ) _____________________________
;  Get a CR-terminated string from the SCI receiveing buffer using RECCHR.
;  As they are read, the characters are echoed back via TRACHR. Backspace
;  characters ($08) cause the deletion of the leftmost character. The resulting
;  null-terminated string is stored in memory at X. The string length will not
;  exceed A characters excluding the termination byte. The final string length
;  is returned in B.
;----------------------------------------------------------------------------------------
RECSTR
        pshx              ;4  Potisne X na sklad,
        tab               ;2  zamenja vrednost v AKU A z vrednostjo v AKU B 
        clr     DOLNIZ    ;6    in izprazni sprem., ki označuje pravilno dolžino niza.


;PREVERJANJE VNOSA PRAVILNEGA ZNAKA

CAKAJ   jsr     RECCHR    ;6  Skoči na rutino za sprejem znaka RECCHR,
        beq     CAKAJ     ;3    ponavlja sprejem toliko časa, da znak sprejme.
        cmpa    #$0D      ;2  Preveri pritisk tipke ENTER,
        beq     RECSTVN   ;3    če je pritisnjena, skoči ven (RECSTVN), sicer
        cmpa    #$08      ;2  preveri pritisk tipke BACKSPACE in
        beq     RECSBAK   ;3    če je pritisnjena, skoči na RECSBAK, sicer
        cmpa    #$20      ;2  preveri, če so znaki med začetkom veljavnih,
        bhs     RECSTR1   ;3    skoči na preverjanje naprej, sicer
        bra     RECSTP    ;3    skoči na RECSTP.
RECSTR1 cmpa    #$7E      ;2  Preveri, če so znaki med koncem veljavnih ter
        bls     RECSEHO   ;3    skoči (znak=pravilen!) in ga vpiše.
RECSTP  ldaa    #$07      ;3  Naloži znak za pisk "$07"
        jsr     TRACHR    ;6    in ga pošlje (PISKANJE!) ter preverja naprej.
        bra     CAKAJ     ;3  Skoči na ponoven vpis znaka.
RECSEHO staa    0,X       ;4  Spravi sprejet znak, 
        inx               ;3    pomakne kazalec za nov vpis in 
        jsr     TRACHR    ;6  skoči na rutino TRACHR, s katero pošlje znak na ekran.
        inc     DOLNIZ    ;3  Poveča spr. z dolžino niza
        decb              ;2  Zmanjša dolžino niza v AKU B
        beq     RECSTVN   ;3    ju primerja in če sta dolžini enaki,
        bra     CAKAJ     ;3    nadaljuje s sprejemom znakov.
RECSBAK jsr     TRACHR    ;6  Pošlje ukaz backspace na ekran skozi TRACHR
        ldaa    DOLNIZ    ;3  Naloži spr. z dolžino niza DOLNIZ
        beq     CAKAJ     ;3    in če sta enaki, skoči na nov vpis, sicer
        dec     DOLNIZ    ;6    zmanjša vrednost spr. DOLNIZ
        dex               ;3   in X
        incb              ;2    ter poveča končno dolžino niza v B,
        bra     CAKAJ     ;3    skoči na vpis naslednjega znaka.
RECSTVN jsr     TRACHR    ;6  Skoči na rutino TRACHR za oddajo znaka
        ldaa    #$0C      ;3  Naloži kontrolno kodo za skok v novo vrstico
        jsr     TRACHR    ;6    in jo pošlje.
        ldaa    #0        ;2  Naloži vrednost 0
        staa    0,X       ;4    in jo vpiše (zaključen niz).
        ldab    DOLNIZ    ;4  Naloži še končno dolžino niza
        pulx              ;5    in potegne X s sklada.
        rts               ;5  RETURN (B)


Nazaj!