.TITLE TIAST - TYPE IN AST SERVICE FOR TECOIO .IDENT "X0202" ; ANDREW C. GOLDSTEIN 28-JUN-77 21:49 .MCALL ASTX$S ;+ ; ; *** - TIAST TYPE IN AST SERVICE ; ; THIS ROUTINE IS CALLED WHEN A CHARACTER IS TYPED WHILE TECO DOES NOT ; HAVE A READ OUTSTANDING. IF THE CHARACTER IS A CONTROL C, TFLG IS SET ; TO ABORT THE CURRENT COMMAND LINE. IF IT IS ANY OTHER CHARACTER, IT ; IS ENTERED INTO THE TYPE IN BUFFER (AS LONG AS THERE IS NO TYPE IN ; OR TYPE OUT IN PROGRESS). IF TYPING IS IN PROGRESS, THE CHARACTER ; MUST BE RATHOLED TO AVOID RE-ENTERING CODE WHICH DEALS WITH STATIC ; DATA. THIS LEADS TO SOME SMALL BUT UNAVOIDABLE WINDOWS IN WHICH TYPE ; IN MAY STILL BE LOST (I.E., WHILE EXECUTING TTY I/O CODE). ; NEEDLESS TO SAY, THE CHARACTER IS ALSO FLUSHED IF INPUT IS FROM AN ; INDIRECT FILE. ; ;- .PSECT CODE,RO,I TIAST:: MOV R0,-(SP) ; SAVE R0 MOV 2(SP),R0 ; GET THE CHARACTER MOV (SP)+,(SP) ; AND CLEAN IT OFF THE STACK 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 BIC #^C177,R0 ; MASK GARBAGE OFF CHARACTER BEQ 80$ ; FLUSH NULLS CMP R0,#CTRLC ; IS THIS CONTROL C? BNE 20$ ; BRANCH IF NO 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 BR 80$ ; AND EXIT 20$: TSTB TYO ; SEE IF TYPE IN OR TYPE OUT IN PROGRESS BNE 80$ ; IF SO, DUMP THE CHARACTER 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 MOV (SP)+,R0 ASTX$S ; BYE, BYE .END