aboutsummaryrefslogtreecommitdiffstats
path: root/tests/t_fl900/conout.inc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t_fl900/conout.inc')
-rw-r--r--tests/t_fl900/conout.inc154
1 files changed, 154 insertions, 0 deletions
diff --git a/tests/t_fl900/conout.inc b/tests/t_fl900/conout.inc
new file mode 100644
index 0000000..6483884
--- /dev/null
+++ b/tests/t_fl900/conout.inc
@@ -0,0 +1,154 @@
+; CONOUT.INC
+;******************************************************************************
+;* Konsolenausgabe fr Micro-ICE TLCS900 *
+;* *
+;* Routinen CONOUT, PSTR, A_ASC von Oliver Sellke *
+;* Routine WriteDec von Alfred Arnold, Oktober 1993 *
+;* 20.11.1993 StrTerm C-konform auf 00h ge„ndert *
+;* TXTAUS hinzugefgt *
+;* *
+;* Routine Funktion Eingabe Stack *
+;* *
+;* CONOUT Zeichen ausgeben A 1..3 Byte *
+;* TXTAUS String ausgeben (XHL) *
+;* PSTR String ausgeben hinter CALL+StrTerm als Ende 6 Byte *
+;* A_ASC Byte hex ausgeben A 2 Byte *
+;* WriteDec Wort dez ausgeben WA 6 Byte *
+;* *
+;* - Da die Routinen lokale Labels verwenden, ist mindestens AS 1.39 erfor- *
+;* derlich *
+;* - Der Prozessor muá sich im Maximum-Modus befinden *
+;* - Symbol SIODelay setzen, falls langsames Terminal vorhanden *
+;* - MACROS.INC muá vorher eingebunden werden *
+;******************************************************************************
+
+;------------------------------------------------------------------------------
+; gemeinsamer Anfang, Definitionen
+
+ section ConOut
+
+ public StrTerm
+StrTerm equ 0
+
+SC0BUF EQU 050H
+INTES0 EQU 077H
+
+;******************************************************************************
+; (7 bit ASCII) Ausgabe ber SIO-Kanal 0
+
+ proc CONOUT
+ PUSH A ;sichern
+ RES 7,A ;MSB ausblenden (nur ASCII!)
+CONOUT1: BIT 7,(INTES0) ;ist der Buffer frei?
+ JR Z,CONOUT1 ;Wenn nicht, dann weiter prfen
+ LD (INTES0),0Dh ;Flag rcksetzen
+ LD (SC0BUF),A ;Zeichen in Transmit-Buffer
+ ifdef SIODelay
+ PUSH HL ;sichern
+ LD HL,80H ;Verz”gerungszeit laden
+WAIT: DEC 1,HL ;Z„hler - 1
+ CP HL,0 ;Ist Z„hler = 0?
+ JR NZ,WAIT ;Wenn nicht, dann weiter DEC
+ POP HL ;restaurieren
+ endif
+ POP A ;restaurieren
+ RET ;Zurck zum Aufruf
+ endp
+
+;******************************************************************************
+; ASCIIZ-String ab (XHL) ausgeben:
+
+ proc TXTAUS
+ push xhl ; Register retten
+ push a
+Schl: ld a,(xhl+) ; ein Zeichen holen
+ cp a,StrTerm ; Endemarkierung ?
+ jr eq,Ende
+ call CONOUT ; nein, ausgeben
+ jr Schl ; Go on...
+Ende: pop a ; Register zurck
+ pop xhl
+ ret
+ endp
+
+;******************************************************************************
+; String der dem Aufruf folgt bis zur Endemarkierung ausgeben
+; Siehe auch TXTAUS:
+
+ proc PSTR
+ PUSH XHL ;sichern
+ LD XHL,(XSP+4) ;Datenadresse lesen
+ PUSH F ;sichern
+ PUSH A ;dito
+PSTR1: LD A,(XHL) ;Zeichen holen
+ INC 1,C ;Zeichenz„hler + 1
+ INC 1,XHL ;Zeichenzeiger + 1
+ CP A,StrTerm ;Endemarkierung erwischt?
+ JR Z,PSTR2 ;Wenn ja, dann Ende
+ AND A,A ;Null-Zeichen erwischt?
+ JR Z,PSTR1 ;Wenn ja, dann nicht ausgeben
+ CALL CONOUT ;Zeichen ausgeben
+ AND A,A ;War das 8. Bit gesetzt?
+ JR P,PSTR1 ;Wenn nicht, dann n„chstes Zeichen
+PSTR2: POP A ;restaurieren
+ POP F ;dito
+ LD (XSP+4),XHL ;Rcksprungadresse restaurieren
+ POP XHL ;Rcksprungadresse abspeichern
+ RET ;Zurck zum Aufruf
+ endp
+
+;******************************************************************************
+; "A" als ASCII Text ausgeben
+
+ proc A_ASC
+ PUSH F ;Sichern
+ PUSH A ;dito
+ RR 4,A ;high nibble an die richtige
+ CALL A_ASC00 ;Stelle und ausgeben
+ POP A ;restaurieren bzw.
+ POP F ;low nibble laden
+A_ASC00: AND A,00FH ;low nibble maskieren
+ CP A,00AH ;eine Zahl ?
+ JR C,A_ASC01 ;ja
+ ADD A,007H ;Offset A-F
+A_ASC01: ADD A,'0' ;Offset ASCII
+ JP CONOUT ;Ausgabe und Ende UP
+ endp
+
+;******************************************************************************
+; Zahl in WA dezimal ausgeben
+; C = minimale Stellenzahl
+; B = Fllzeichen (z.B. ' ', '0')
+
+ proc WriteDec
+ push xwa ; Register retten
+ push de
+
+ sub de,de ; E z„hlt echte Stellenzahl, D=1 falls Null
+InLoop: extz xwa ; fr Division vorbereiten
+ div xwa,10 ; letzte Stelle ausmaskieren
+ add qa,'0' ; ASCII-Offset
+ cp d,1 ; schon im Nullbereich ?
+ jr ne,NormVal
+ ld qa,b ; ja, dann gewnschtes Leerzeichen
+NormVal: push qa ; ein Zeichen mehr
+ inc e
+ or wa,wa ; schon Null ?
+ scc z,d
+ jr nz,InLoop ; wenn nicht Null, auf jeden Fall weiter
+ cp e,c ; noch nicht genug Zeichen ?
+ jr ult,InLoop ; dann auch weiter
+
+OutLoop: pop a ; umgekehrt ausgeben
+ call ConOut
+ djnz e,OutLoop
+
+ pop de
+ pop xwa
+ ret
+ endp
+
+;******************************************************************************
+; Modulende
+
+ endsection