.TITLE ADVANCE ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR ; ENTRY: 1 ARG ; EXIT: 1 ARG OR $EOF ; ERRORS: NONE ; CALLS: RDCHAR ; RDBKUP ; I2ATM ;(NOTE: CAN BACKUP MAX OF 6 CHARS) .GLOBL ADVANCE,ZADVANCE,EOF,QRDCHAR,QI2ATM,QRDBKUP ADVANCE:TST (R5)+ BNE ADV02 ADV01: QRDCHAR ;NULL[]--->READ NEXT CHAR BCS ADV09 ;JUMP IF EOF MOV R3,-(SP);ELSE RETURN INTEGER ATOM QI2ATM .WORD 0 ADV02: QRDBKUP ;BACKUP TWICE BCS ADV09 QRDBKUP BCC ADV01 ;AND READ NEXT CHAR ADV09: MOV EOF,-(R5) JMP @-(R4) ; ; ; UTILITY: INPUT ONE CHARACTER ; ENTRY: NO ARGS ; EXIT: R3 CONTAINS 7 BIT ASCII CHARACTER ; C BIT SET AND 0 RETURNED IF EOF ; ERRORS: O1, INPUT ERROR ; CALLS: PRNT ; GET ; .TTYIN ; .READW .GLOBL AREA,QO1ERR,RDCHAR,PCBUF,PCBUFL,QPRNT,LSWVAL .GLOBL SUBSYS,DEVTBL,BLKTBL,INSYS,PTRTBL,BFRTBL,OUTSYS .MCALL .READW,.TTYIN RDCHAR: CMP NXTC,#TOP ;IS A CHARACTER WAITING? BNE RDC18 ;JUMP IF SO MOV INSYS,R2 ;GET SYSIN CHANNEL BMI .+4 SWAB R2 ;USE CURRENT INPUT CHANNEL IF ANY BIC #177760,R2 MOV R2,R1 ASL R1 CMP DEVTBL(R1),(PC)+ ;TTY? .RAD50 /TT/ BEQ RDC07 ;JUMP IF SO RDC02: MOV PTRTBL(R1),R0 ;NO: GET NEXT CHAR FROM INPUT CHANNEL BNE RDC04 ;IF NONE LEFT IN IBUF DO A READ .READW #AREA,R2,BFRTBL(R1),#256.,BLKTBL(R1) BCC RDC03 TST @#52 ;CHECK IF EOF BEQ RDC06 QO1ERR ;IF NOT THEN FATAL ERROR RDC03: CLR R0 INC BLKTBL(R1) ;POINT TO NEXT RELATIVE BLOCK RDC04: ADD BFRTBL(R1),R0 ;GET CHAR MOVB @R0,R0 BIC #177600,R0 INC PTRTBL(R1) CMP PTRTBL(R1),#512. BLT RDC05 CLR PTRTBL(R1) ;RESET POINTER IF THAT WAS LAST CHAR RDC05: MOV #TEMP,R3;ECHO CHAR TO OUTPUT CHANNEL MOV R0,@R3 BEQ RDC02 ;IGNORE NULLS ON INPUT TST SUBSYS ;NO ECHO FOR SUBSYS INPUT BNE RDC5B CMP LSWVAL,#3 BEQ RDC5A CMP LSWVAL,#1 BNE RDC5B RDC5A: QPRNT RDC5B: MOV TEMP,R0 BR RDC10 RDC06: CLR R0 ; SIGNALLED WITH NULL BR RDC10 RDC07: .TTYIN ;GET A CHAR FROM TERMINAL MOV OUTSYS,R2 ;ECHO IF SYSOUT NOT TT: BMI .+4 SWAB R2 BIC #177760,R2 ASL R2 CMP DEVTBL(R2),(PC)+ .RAD50 /TT/ BNE RDC05 RDC10: MOV #BOT,R1 ;SLIDE UP WINDOW MOV R1,R2 INC R2 .REPT 5 MOVB (R2)+,(R1)+ .ENDM MOVB R0,@R1 ;INSERT NEW CHAR BR RDC20 RDC18: MOVB @NXTC,R0 INC NXTC RDC20: MOV R0,-(SP);SAVE CHAR BEQ RDC25 ;IF TRY TO ECHO PARBUF MOV #SCHAR,R1 CMPB R0,(R1)+;TAB? BEQ RDC21 CMPB R0,(R1)+;CR? BEQ RDC21 CMPB R0,(R1)+;IF LF BEQ RDC25 CMPB R0,(R1)+;OR FF BEQ RDC25 ;THEN ECHO PARBUF MOV #40,R0 ;OTHERWISE PUT SPACE RDC21: MOV PCNT,R2 ;CR OR TAB IN PARBUF BMI RDC29 CMP R2,#PCBUFL-2 BGE RDC30 ADD #PCBUF,R2 MOVB R0,@R2 BR RDC29 RDC25: MOV PCNT,R2 ;PUT LF OR FF IN PARBUF BMI RDC29 CMP R2,#PCBUFL-1 BLT RDC26 MOV #PCBUFL-2,R2;(SHOULD NEVER HAPPEN) RDC26: ADD #PCBUF,R2 MOVB R0,(R2)+ CLRB (R2)+ ;ZERO BYTE TERMINATOR CLR PCNT MOV #PCBUF,R3 TST SUBSYS ;NO ECHO IF READING SUBSYSTEMS BNE RDC30 CMP LSWVAL,#3 BNE RDC30 QPRNT ;ECHO PARBUF BR RDC30 RDC29: INC PCNT RDC30: MOV (SP)+,R3;RETURN CHARACTER CLC BNE .+4 SEC ;AND C BIT IF EOF JMP @-(R4) .PAGE ; UTILITY: BACKSPACE INPUT POINTER ; ENTRY: NO ARGS ; EXIT: NO ARGS ; C BIT SET IF ATTEMPT TO BACKUP TOO MUCH (>6 CHARS) ; ERRORS: NONE ; CALLS: NONE ; R1,R2,R3 PRESERVED .GLOBL RDBKUP RDBKUP: DEC PCNT DEC NXTC CMP NXTC,#BOT BHIS RDB2 MOV #BOT,NXTC RDB2: JMP @-(R4) ZADVANCE=.-ADVANCE ; ; ; ; UTILITY: LABEL PARENTHESIS ; ENTRY: 1 ARG (SP) LEVEL # ; EXIT: NO ARGS ; ERRORS: NONE ; CALLS: NONE ; R2,R3 PRESERVED .GLOBL PARLBL PARLBL: MOV (SP)+,R0 LBL1: SUB #36.,R0 ;GET R0 MOD 36. BPL LBL1 ADD #36.,R0 CMP R0,#9. ;CONVERT TO ASCII 0-9,A-Z BLE LBL2 ADD #7,R0 LBL2: ADD #60,R0 MOV PCNT,R1 DEC R1 BMI LBL3 ;IGNORE LABELING IF BUFFER ALREADY ECHOED ADD #PCBUF,R1 MOVB R0,@R1 LBL3: JMP @-(R4) ; TEMP: .WORD 0 SCHAR: .BYTE 11,15,12,14 .EVEN PCNT: .WORD 0 BOT: .WORD 0,0,0 TOP: NXTC: .WORD TOP .END