.TITLE TIAST - TYPE IN AST SERVICE FOR TECOIO .IDENT "X0206" ; ANDREW C. GOLDSTEIN 20-MAR-80 23:36 ; MARK H. BRAMHALL 25-MAR-79 22:01 .MCALL ASTX$S ; ; DEFINE THE FOLLOWING SYMBOL TO ENABLE UNSOLICITED CHARACTERS AS TYPE-AHEAD ; FOR USE WITH THE OLD RSX-11M TERMINAL DRIVER ; ; TYPAHD = 1 ;+ ; ; *** - TIAST TYPE IN AST SERVICE ; ; THIS ROUTINE IS CALLED WHEN TECO RECEIVES AN UNSOLICITED CHARACTER AST. ; THIS HAPPENS ONLY WHEN CONTROL-C IS TYPED (TO WIT, THE VMS TERMINAL DRIVER ; ONLY GIVES AST'S FOR CTRL-C, AND IN RSX-11M WE ENABLE FOR CTRL-C ONLY). ; SHOULD ANOTHER CHARACTER SHOW UP, IT IS FLUSHED. ; ;- .PSECT CODE,RO,I TIAST:: .IF DF,TYPAHD ; IF DEFINED, INCLUDE SIMULATED TYPE-AHEAD .IFF CMPB OPSYS,#3 ; SEE IF THIS IS IAS BEQ 10$ ; BRANCH IF YES (SO MUCH FOR COMPATIBILITY) BIC #^C177,(SP) ; MASK GARBAGE OFF CHARACTER CMP (SP)+,#CTRLC ; IS THIS CONTROL C? BNE 30$ ; BRANCH IF NO 10$: MOV R5,-(SP) ; SAVE R5 MOV SAVR5,R5 ; GET STATE AREA POINTER DECB CTCFLG ; FLAG PRESENCE BIT #ET.CC,ETYPE(R5) ; CHECK FOR CTRL C TRAP BNE 20$ ; BRANCH IF YES DECB TFLG+1(R5) ; ELSE SET STOP FLAG 20$: BIC #ET.CC,ETYPE(R5) ; CLEAR CTRL C TRAP FLAG MOV (SP)+,R5 ; RESTORE REGISTER 30$: ASTX$S ; BYE, BYE .IFT BIC #^C177,(SP) ; MASK GARBAGE OFF CHARACTER CMP (SP),#CTRLC ; IS THIS CONTROL C? BNE 20$ ; BRANCH IF NO MOV R5,(SP) ; SAVE R5 MOV SAVR5,R5 ; GET STATE AREA POINTER DECB CTCFLG ; FLAG PRESENCE BIT #ET.CC,ETYPE(R5) ; CHECK FOR CTRL C TRAP BNE 10$ ; BRANCH IF YES DECB TFLG+1(R5) ; ELSE SET STOP FLAG 10$: BIC #ET.CC,ETYPE(R5) ; CLEAR CTRL C TRAP FLAG MOV (SP)+,R5 ; RESTORE REGISTER 20$: MOV R0,-(SP) ; SAVE R0 MOV 2(SP),R0 ; GET THE CHARACTER MOV (SP)+,(SP) ; AND CLEAN IT OFF THE STACK BEQ 90$ ; FLUSH NULLS MOV R1,-(SP) ; SAVE OTHER REGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CLR R4 ; IMMEDIATE TYPE OUT FLAG MOV SAVR5,R5 ; POINT R5 TO IMPURE AREA TST INDIR(R5) ; SEE IF INDIRECT FILE IS OPEN BNE 80$ ; IF SO, FLUSH 30$: MOV CMDFDB+F.NRBD,R1 ; GET CURRENT INPUT BUFFER COUNT CMP R1,CMDFDB+F.URBD ; COMPARE AGAINST BUFFER LENGTH BLO 40$ ; BRANCH IF ROOM IN BUFFER MOV #BELL,R0 ; BUFFER IS FULL, SO CALL TYPEC ; SO ECHO CONTROL G (BELL) BR 80$ ; AND GO AWAY 40$: MOV CMDFDB+F.NRBD+2,R2 ; POINT TO CURRENT START OF BUFFER MOV CMDFDB+F.URBD+2,R3 ; AND START OF ALLOCATED BUFFER CMP R2,R3 ; IF SAME BEQ 60$ ; SKIP BUFFER SHUFFLE MOV R3,CMDFDB+F.NRBD+2 TST R1 ; CHECK FOR ZERO LENGTH BEQ 60$ 50$: MOVB (R2)+,(R3)+ ; ELSE SHUFFLE THE BUFFER DOWN SOB R1,50$ 60$: ADD R1,R3 ; POINT TO END OF BUFFER MOVB R0,(R3) ; APPEND CHARACTER TO BUFFER INC CMDFDB+F.NRBD ; BUMP CHARACTER COUNT BIT #ET.NCH,ETYPE(R5) ; SEE IF CONTROL-T NO ECHO BNE 70$ ; SKIP ECHO IF SET CALL TYPEC ; ECHO THE CHARACTER 70$: CMPB (R3),#CR ; SEE IF THIS WAS A CR BNE 80$ ; BRANCH IF NOT MOVB #LF,R0 ; IF YES, ECHO WITH LF BR 30$ 80$: MOV (SP)+,R5 ; RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 90$: MOV (SP)+,R0 ASTX$S ; BYE, BYE .ENDC .END