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)