;
; SYSLIB Module Name:  SBLINE
; Author:  Richard Conn
; SYSLIB Version Number:  2.0
; Module Version Number:  1.0
; Module Entry Points:
;       BLINE
; Module External References:
;       CAPS
;

;
;  BLINE -- BDOS Input Line Editor
;       BLINE provides a very convenient interface to the BDOS for input
; line editor functions.  It uses a buffer supplied by the user for storage
; of the input line, and it returns a pointer to the first byte of the line
; upon return.  The line stored in this buffer is terminated by a binary zero.
;       To use BLINE, the user need only call it, with a capitalization flag
; stored in the A Register and HL pointing to the first byte of the user-
; supplied buffer which will contain the line.  This buffer is structured
; as follows:
;               1st Byte - Size (filled in by user)
;               2nd Byte - Char count (filled in by BLINE)
;               3rd to nth Byte - Characters of Line (filled in by BLINE)
;               n+1st Byte - Terminating Zero
; The number of bytes allocated to the entire buffer is SIZE+3, where SIZE
; is the buffer size as supplied by the user.
;       If A = 0, BLINE does not capitalize the input line characters;
; if A <> 0, BLINE capitalizes the input line characters
; before returning to the caller.
;       No error codes are returned by BLINE.  On return, HL points to the
; first byte of the input line and A contains a count of the number of
; characters in that line.
;

;
;  EQUATES
;
BDOS            EQU     5
B$RDLINE        EQU     10      ; READ LINE FUNCTION

;
;  EXTERNAL DECLARATIONS
;
       EXT     CAPS

;
;  MAIN ROUTINE FOR BLINE
;
BLINE::
       JMP     START   ; SKIP OVER BUFFER
LINEST:
       DS      2       ; ADDRESS OF START OF LINE BUFFER
CAPFLG:
       DS      1       ; CAPITALIZATION FLAG (0=NO CAP)
START:
       PUSH    D       ; SAVE DE, BC
       PUSH    B
       STA     CAPFLG  ; SAVE CAPITALIZATION FLAG
       SHLD    LINEST  ; SAVE ADDRESS OF FIRST BYTE
       XCHG            ; DE PTS TO BUFFER
       MVI     C,B$RDLINE      ; READ LINE FUNCTION IN BDOS
       CALL    BDOS    ; DO READ LINE FUNCTION
       LHLD    LINEST  ; PT TO RETURNED CHAR COUNT
       INX     H
       MOV     A,M     ; GET IT
       INX     H       ; PT TO FIRST CHAR
       PUSH    H       ; SAVE PTR TO FIRST CHAR
       ADD     L       ; ADD CHAR COUNT
       MOV     L,A
       MOV     A,H
       ACI     0
       MOV     H,A     ; HL PTS TO AFTER LAST CHAR
       MVI     M,0     ; STORE ENDING ZERO
       POP     H       ; GET PTR TO FIRST CHAR
       LDA     CAPFLG  ; CAPITALIZE?
       ORA     A       ; 0=NO
       JZ      DONE
       PUSH    H       ; SAVE PTR TO FIRST CHAR
CAPLP:
       MOV     A,M     ; GET CHAR
       ORA     A       ; END OF LINE?
       JZ      CAPDN
       CALL    CAPS    ; CAPITALIZE CHAR
       MOV     M,A     ; PUT IT BACK
       INX     H       ; PT TO NEXT
       JMP     CAPLP
CAPDN:
       POP     H       ; GET PTR TO FIRST CHAR
DONE:
       POP     B       ; RESTORE REGS
       POP     D
       DCX     H       ; PT TO CHAR COUNT
       MOV     A,M     ; GET CHAR COUNT
       INX     H       ; PT TO FIRST CHAR OF LINE
       RET

       END