;
; LPSTR --
; PRINT STRING PTED TO BY HL ON LST:
; AFFECT ONLY HL -- WHEN DONE, HL PTS TO BYTE AFTER STRING
;
EXT CLOUT
EXT LOUT
LPSTR::
PUSH D ; SAVE REGS
PUSH B
PUSH PSW ; SAVE REG A AND FLAGS
MVI C,0 ; SET POSITION COUNT
PSL: MOV A,M ; GET BYTE
INX H ; PT TO NEXT
ORA A ; 0=DONE
JZ PSD
CPI TAB ; EXPAND <TAB>
JZ PST
; PRINT CHAR
INR C ; INCR POSITION
CALL CLOUT ; PRINT IT ON LST:
CPI CR ; CHECK FOR <CR>
JZ PCR
CPI LF ; CHECK FOR <LF>
JZ PLF
CPI BEL ; CHECK FOR <BEL>
JZ PLF
CPI BS ; CHECK FOR <BS>
JZ PBS
JMP PSL
; <CR> -- RESET POSITION COUNT
PCR: MVI C,0 ; RESET
JMP PSL
; <LF>, <BEL>, <NULL> -- CURSOR DIDN'T ADVANCE
PLF: DCR C ; BACK UP COUNT BY 1
JMP PSL
; <BS> -- CURSOR WENT BACKWARD, MAYBE
PBS: MOV A,C ; CHECK FOR ZERO
ORA A
JZ PSL
DCR C ; BACK UP COUNT BY 2
DCR C
JMP PSL
; EXPAND <TAB>
PST: MOV A,C ; GET COUNT
ANI 7 ; MASK FOR SUB FROM 8
MOV B,A ; STORE TEMPORARILY
MVI A,8 ; SUBTRACT FROM 8 FOR <SP> COUNT
SUB B
MOV B,A ; COUNT IN B
ADD C ; ADD TO POSITION COUNT
MOV C,A
MVI A,' ' ; PRINT <SP>
PSTL: CALL LOUT
DCR B ; COUNT DOWN
JNZ PSTL
JMP PSL
; PSTR DONE
PSD: POP PSW ; RESTORE REG A AND FLAGS
POP B ; RESTORE REGS
POP D
RET