;
; SYSLIB Module Name:  SLPSTR
; Author:  Richard Conn
; SYSLIB Version Number:  2.0
; Module Version Number:  1.0
; Module Entry Points:
;       LPSTR
; Module External References:
;       CLOUT           LOUT
;

;
;  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

;
;  ASCII SPECIAL CHARACTER EQUATES
;
NULL    EQU      0      ; NULL
BEL     EQU      7      ; BELL
BS      EQU      8      ; BACKSPACE
TAB     EQU      9      ; TAB
LF      EQU     10      ; LINE FEED
CR      EQU     13      ; CARRIAGE RETURN
CTRLR   EQU     'R'-40H ; CTRL-R
CTRLU   EQU     'U'-40H ; CTRL-U
CTRLX   EQU     'X'-40H ; CTRL-X
DEL     EQU     7FH     ; DELETE CHAR

       END