.TITLE RDAST ; ; FORTRAN-CALLABLE ROUTINE THAT, ONCE CALLED, WILL INCREMENT A SPECIFIED ; FLAG WHENEVER THERE IS A LINE OF UNSOLICITED INPUT FROM THE TERMINAL. ; RDAST USES THE ATTACH WITH UNSOLICITED READ AST FEATURE (IO.ATA) OF THE ; FULL DUPLEX TERMINAL HANDLER ; ; CALLING SEQUENCE ; ; CALL RDAST(IAST,INBUF,IOST,TTYPE) ; ; IAST - FLAG TO BE INCREMENTED WHEN UNSOLICITED INPUT IS AVAILABLE ; INBUF - BUFFER WHERE THE INPUT IS STORED ; IOST - BYTE COUNT OF CHARACTERS STORED IN INBUF ; TTYPE - TERMINAL TYPE NUMBER ; ; WRITTEN MARCH 1979 R B FRENCH THE BOEING COMPANY ; UPDATED AUGUST 1981 S L DOVER MCC POWERS ; .MCALL DIR$,QIOW$,ASTX$S,SETF$C,DSAR$S ; ASTFLG: .WORD 0 ; FLAG SET WHEN INPUT IS AVAILABLE INBUF: .WORD 0 ; ADDRESS OF THE INPUT BUFFER COUNT: .WORD 0 ; ADDRESS OF BYTE COUNT TTYPE: .WORD 0 ; ADDRESS OF TERMINAL TYPE R1SAV: .WORD 0 ; TEMP STORAGE FOR R1 CRFLAG: .WORD 0 ; CARRIAGE RETURN FLAG ECHO: .BYTE 0 ; STORAGE AREA ECHO1: .BYTE 0 ; USED TO OUTPUT ECHO2: .BYTE 0 ; TO ANY TERMINAL ECHO3: .BYTE 0 ; TYPE THAT MAY ECHO4: .BYTE 0 ; BE DESIRED ECHO5: .BYTE 0 ; !!!!!!! .EVEN SETAST::QIOW$ IO.ATA,1,1,,,, ECHOIT: QIOW$ IO.WAL,1,10.,,,, .EVEN ; RDAST:: MOV 2(R5),ASTFLG ; SAVE THE ASTFLG FLAG ADDRESS MOV 4(R5),INBUF ; SAVE THE INPUT BUFFER ADDRESS MOV 6(R5),COUNT ; INPUT BYTE COUNT NOT COUNTING CR MOV 8.(R5),TTYPE ; TERMINAL TYPE DIR$ #SETAST ; SET UP FOR UNSOLICITED READ RTS PC ; AST: CMPB #177,(SP) ; CHECK FOR DELETE CHAR BNE AST1 ; NO GO TO CHAR RETURN CHECK DEC @COUNT ; DECREMENT THE COUNT BGE AST3 ; POSITIVE OR 0 -- DELETE THE CHAR CLR @COUNT ; IF LESS THAN 0, MAKE IT 0 BR ASTEX ; NOTHING ELSE TO DO BUT EXIT AST1: CMPB #15,(SP) ; CHECK FOR CARRIAGE RETURN BNE AST2 ; NO SAVE THE CHARACTER TST @COUNT ; IS THERE ANYTHING IN INPUT BUFFER BEQ ASTEX ; BRANCH IF NOT INC @ASTFLG ; TELL THE CALLER THAT INPUT HAS ARRIVED INC CRFLAG ; SET THAT A CR WAS THE LAST CHAR DSAR$S ; WATCH THIS DISABLE AST'S TILL WE ARE DONE SETF$C 4 ; SET EVENT FLAG FOUR BR ASTEX ; EXIT THE AST AST2: TST CRFLAG ; IS THIS A NEW COMMAND BEQ AST3 ; NO DON'T 0 COUNT CLR @COUNT ; CLEAR THE BYTE COUNT CMPB #2,@TTYPE ; IS IT A VT52 OR VT100? BNE 10$ CALL VTCLR ; CLEAR VT52 (OR VT100 IN VT52 MODE) BR 100$ 10$: CMPB #3,@TTYPE ; IS IT AN ISC? BNE 100$ CALL ISCCLR ; CLEAR THE ISC INPUT LINE 100$: DIR$ #ECHOIT ; CLEAR THE ECHO LINE TOO CLR CRFLAG ; CR WAS NOT THE LAST CHAR AST3: MOV R1,R1SAV ; SAVE R1 MOV @COUNT,R1 ; THIS SHOULD PUT THE CURRENT BYTE COUNT IN R1 CMPB #2,@TTYPE ; IS IT A VT52 OR VT100? BNE 210$ CALL VTWRT ; WRITE TO VT52 /VT100 IN VT52 MODE BR 300$ 210$: CMPB #3,@TTYPE ; IS IT AN ISC? BNE 300$ CALL ISCWRT ; WRITE TO AN ISC 300$: ADD INBUF,R1 ; ADD THE CONTENTS OF INBUF TO R1 ; THIS SHOULD ADD THE ADDRESS OF THE START OF ; THE INPUT BUFFER TO R1 MOVB (SP),@R1 ; PUT THE CHAR IN THE LOCATION MOVB (SP),ECHO4 ; PUT THE CHAR IN THE ECHO AREA CMPB #177,(SP) ; CHECK FOR DELETE CHAR BEQ AST4 INC @COUNT ; COUNT THE INPUT CHARACTER BR AST5 AST4: MOVB #40,ECHO4 ; BLANK OUT THE DELETED CHAR MOVB #10,ECHO5 ; BACKSPACE TO THE CORRECT POSITION MOVB #6,ECHOIT+Q.IOPL+2 ; LENGTH OF QIO AST5: MOV R1SAV,R1 ; RESTORE R1 DIR$ #ECHOIT ; WRITE THE ECHO STRING ASTEX: TST (SP)+ ; POP THE CHAR OFF THE STACK ASTX$S ; EXIT THE AST ROUTINE ; SUBROUTINE TO WRITE TO A VT52 /VT100 (IN VT52 MODE) ; VTWRT: MOVB #33,ECHO ; MOVE IN ESCAPE CHAR MOVB #131,ECHO1 ; MOVE IN DIRECT CURSOR CONTROL CHAR MOVB #50.,ECHO2 ; MOVE IN INPUT ROW NUMBER ADD #40,R1 ; OFFSET FOR VT52 MOVB R1,ECHO3 ; ALSO MAKE THIS THE COLUMN MOV @COUNT,R1 ; GET THE COUNT AGAIN MOVB #5,ECHOIT+Q.IOPL+2 ; LENGTH OF QIO RETURN ; SUBROUTINE TO CLEAR A VT52 / VT100 (IN VT52 MODE) ; VTCLR: MOVB #33,ECHO ; MOVE IN ESCAPE CHAR MOVB #131,ECHO1 ; MOVE IN DIRECT CURSOR CONTROL CHAR MOVB #50.,ECHO2 ; MOVE IN INPUT ROW NUMBER MOVB #40,ECHO3 ; SET TO COLUMN 0 -- DOES NOT MATTER FOR CLEAR MOVB #33,ECHO4 ; CLEAR LINE CODE FOR VT52/ VT100 MOVB #113,ECHO5 ; CLEAR LINE CODE MOVB #6,ECHOIT+Q.IOPL+2 ; LENGTH OF QIO RETURN ; SUBROUTINE TO WRITE TO AN ISC TERMINAL ; ISCWRT: MOVB #3,ECHO ; MOVE IN CURSOR CONTROL CHARACTER MOVB R1,ECHO1 ; MOVE IN COLUMN NUMBER MOVB #44.,ECHO2 ; MOVE IN ROW NUMBER CLRB ECHO3 ; UNUSED BYTE MOVB #5,ECHOIT+Q.IOPL+2 ; LENGTH OF QIO RETURN ; SUBROUTINE TO CLEAR AN ISC TERMINAL ; ISCCLR: MOVB #3,ECHO ; MOVE IN CURSOR CONTROL CLRB ECHO1 ; CLEAR COLUMN NUMBER MOVB #44.,ECHO2 ; MOVE IN ROW NUMBER MOVB #11.,ECHO3 ; MOVE IN CLEAR LINE CODE MOVB #4,ECHOIT+Q.IOPL+2 ; LENGTH OF QIO RETURN .END