; TTY I/O DRIVER EXT $IOERR,$BL,$BF,$ERR,$TTYIN,$TTYOT IRECER EQU 22Q ;INPUT RECORD TOO LONG ENTRY $DRV3 $DRV3: DW DRV3FR ;FORMATTED READ DW DRV3FW ;FORMATTED WRITE DW DRV3BR ;BINARY READ DW DRV3BW ;BINARY WRITE DW DRV3RE ;REWIND DW DRV3BA ;BACKSPACE DW DRV3EN ;ENDFILE DRV3EN: XRA A ;THESE OPERATIONS ARE ;NO-OPS FOR TTY DRV3RE EQU DRV3EN DRV3BA EQU DRV3EN RET DRV3BW: JMP $IOERR ;ILLEGAL OPERATIONS ;(PRINT ERROR AND RETURN) DRV3BR EQU DRV3BW DRV3FR: XRA A ;READ STA $BL ;ZERO BUFFER LENGTH DRV31: CALL $TTYIN ;INPUT A CHAR ANI 177Q ;AND OFF PARITY CPI 10 ;IGNORE LINE FEEDS JZ DRV31 PUSH PSW ;SAVE IT LHLD $BL ;GET CHAR POSIT IN BUFFER MVI H,0 ;ONLY 1 BYTE XCHG LHLD $BF ;GET BUFFER ADDR DAD D ;ADD OFFSET POP PSW ;GET CHAR MOV M,A ;PUT IT IN BUFFER INX D ;INCREMENT $BL XCHG SHLD $BL ;SAVE IT CPI 15Q ;CR? RZ ;YES--DONE MOV A,L ;$BL CPI 128 ;MAX IS DECIMAL 128 JC DRV31 ;GET NEXT CHAR CALL $ERR DB IRECER ;INPUT RECORD TOO LONG XRA A ;CLEAR FLAGS RET DRV3FW: LDA $BL ;BUFFER LENGTH ORA A RZ ;EMPTY BUFFER LHLD $BF ;BUFFER ADDRESS DCR A ;DECREMENT LENGTH PUSH PSW ;SAVE IT MVI A,13 ;CR CALL $TTYOT ;OUTPUT IT MOV A,M ;GET FIRST CHAR IN BUFFER CPI '+' JZ DR3FW2 ;NO LINE FEEDS CPI '1' JNZ DR3FW1 ;NOT FORM FEED MVI A,12 ;FORM FEED CALL $TTYOT ;OUTPUT IT JMP DR3FW2 DR3FW1: MVI A,10 ;LF CALL $TTYOT MOV A,M ;GET CHAR BACK CPI ' ' JZ DR3FW2 ;NO MORE LINE FEEDS CPI '0' JNZ DR3FW2 ;NO MORE LINE FEEDS MVI A,10 ;LF CALL $TTYOT DR3FW2: POP PSW ;GET LENGTH BACK INX H ;INCREMENT PTR DRV32: RZ PUSH PSW ;SAVE CHAR COUNT MOV A,M ;GET NEXT CHAR INX H ;INCREMENT PTR CALL $TTYOT ;OUTPUT CHAR POP PSW ;GET COUNT DCR A ;DECREMENT IT JMP DRV32 ;ONE MORE TIME END