; Figure 5-5 ; ; RL$RDR ; Read Line from Reader Device. ; Carriage Returns are ignored, and input terminates ; when specified number of characters have been read ; or a Line Feed is input. ; ; Note : Potential weakness is that there is no ; timeout in this subroutine. It will wait forever ; if no more characters arrive at the Reader device. ; ; Calling sequence ; ; LXI H,BUFFER ; LXI B,MAXCOUNT ; CALL RL$RDR ; ; Exit Parameters ; ; HL -> 00H byte terminating string ; BC = Residual Count (0 if Max. chars read) ; E = Last Character Read ; B$READIN EQU 3 ;Reader Input BDOS EQU 5 ;BDOS Entry Point ; CR EQU 0DH ;Carriage Return LF EQU 0AH ;Line Feed (Terminator) ; RL$RDR: MOV A,C ;Check if count 0 ORA B ;If count 0 on entry, MOV E,A ; fake last char. read (00H) JZ RL$RDRX ;Yes, exit PUSH B ;Save Max. Chars count PUSH H ;Save Buffer Pointer RL$RDRI: ;Loop back here to ignore char. MVI C,B$READIN CALL BDOS ;A = Character input MOV E,A ;Preserve copy of characters CPI CR ;Check if Carriage Return JZ RL$RDRI ;Yes, ignore it POP H ;Recover Buffer pointer POP B ;Recover Max. Count CPI LF ;Check if Line Feed JZ RL$RDRX ;Yes, exit MOV M,A ;No, store character in buffer INX H ;Update Buffer pointer DCX B ;Downdate count JMP RL$RDR ;Loop back for next char. RL$RDRX: MVI M,0 ;Null byte terminate buffer RET