.TITLE TTYOUT 'REMOTE' TERMINAL SUBROUTINES .IDENT /V 1.1/ ; ; WRITTEN BY MICHAEL D. LAMPI DAC CAT ; ; UPDATED 10/25/79 ; ; REMOTE LINE HANDLING SUBROUTINES DESIGNED TO REPLACE ; FORTRAN VERSIONS WRITTEN FOR RT-11 ; ; USES STANDARD QIO FUNCTION IO.ATA TO ATTACH TO 'REMOTE' ; TERMINAL WITH AN ASYNCHRONOUS TRAP TO (HOPEFULLY) CATCH ; ALL THE INPUT CHARACTERS. ; .MCALL QIOW$,CLEF$S,ENAR$S,DSAR$S,ALUN$,QIO$,DIR$,ASTX$S .MCALL SETF$S ; .GLOBL IOUTT1 .GLOBL INPTT1 ; IOUTT1: CMP #-10.,@2(R5) ;SEE IF FIRST PARAMETER IS 'SETUP' (-10.) BNE OUTPUT ;NOPE - JUST PLAIN OLD OUTPUT ; MOV @4(R5),ALUN+A.LUNU ;GET TERMINAL NUMBER (BINARY) & PUT IN ALUN DPB DIR$ #ALUN ;ASSIGN A LUN TO THE REMOTE TERMINAL BCS LUNERR ;ERROR??!!? DIR$ #QIOATA ;NOW ATTACH TO THE TERMINAL & SET UP AST BCS ATAERR ;ERROR!!??! DIR$ #QIOSET ;SET MULTIPLE CHARACTERISTICS BCS SETERR ;ERROR? CLEF$S #11. ;INITIALIZE OUTPUT FLAG CLRED FLAG CLR R0 ;RETURN SUCCESS CODE (0) RETRN1: RTS PC ;AND RETURN TO CALLING PROGRAM ; LUNERR: MOV #2,R0 ;2 IS THE LUN ERROR BR RETRN1 ; ATAERR: MOV #3,R0 ;3 IS THE ATTACH FAILURE BR RETRN1 ; SETERR: MOV #4,R0 ;4 IS THE SET FAILURE BR RETRN1 ; ALUN: ALUN$ 4,TT,0 ; QIOATA: QIO$ IO.ATA,4,,,,, ; QIOSET: QIO$ SF.SMC,4,1,,,, SETBUF: .BYTE TC.NEC ;NO ECHO .BYTE 1 .BYTE TC.SLV ;SLAVED .BYTE 1 .BYTE TC.SMR ;LOWER-CASE .BYTE 1 ; .EVEN QIO: QIO$ IO.WAL!TF.WBT!TF.CCO,4,1,,,,<0,1,0> ; ; COMES HERE IF ALL THAT'S WANTED IS OUTPUT TO THE REMOTE DEVICE ; OUTPUT: CLR R0 ;INITIALIZE RETURN FLAG CMPB #-1,@2(R5) ;SEE IF HE WANTS A BREAK BNE 5$ ;NOPE RTS PC ;CAN'T DO A BREAK IN RSX-11, SO JUST RETURN 5$: TST @2(R5) ;SEE IF HE BPL DUMP ;MUST WANT TO REALLY DUMP A CHARACTER CMP #-2,@2(R5) ;SEE IF AST RECOGNITION IS TO BE DISABLED BEQ DISABL ;YES ; ENAR$S ;ENABLE AST RECOGNITION RTS PC ;THEN RETURN ; DISABL: DSAR$S ;DISABLE AST RECOGNITION RTS PC ;THEN RETURN ; DUMP: CLEF$S #1 ;CLEAR THE EVENT FLAG CMPB #IS.SET,$DSW ;SEE IF FLAG WAS SET BEQ DUMPIT ;YES - I/O COMPLETE - OK TO SHIP IT OFF DEC R0 ;NO - INDICATE I/O STILL IN PROCESS RTS PC ;THEN RETURN ; DUMPIT: MOV #1,QIO+Q.IOPL+2 ;MOVE BUFFER LENGTH MOV 2(R5),QIO+Q.IOPL ;MOVE ADDRESS OF BUFFER DIR$ #QIO ;NOW WRITE IT OUT RTS PC ;THEN RETURN ; ; ; ; THE FOLLOWING ROUTINE HANDLES THE ASYNCHRONOUS TRAP FOR INPUT ; OUTAST: CMP IEND,#299.+BUFF ;SEE IF AT END OF 300 CHARACTER BUFFER BNE 5$ ;NOPE MOV #BUFF-1,IEND ;YUP - SET POINTER TO BEGINNING 5$: INC IEND ;POINT TO NEXT POSITION IN BUFFER CMP IPTR,IEND ;SEE IF DE-QUEUEING POINTER AT THIS POSITION BEQ OVRFLO ;YUP - WE HAVE AN OVERFLOW GETCHR: MOVB (SP)+,@IEND ;MOVE CHARACTER FROM STACK TO BUFFER SETF$S #13. ;INDICATE THAT WE HAVE A LIVE ONE ASTX$S ;RETURN FROM AST ; OVRFLO: SETF$S #3 ;SET FLAG TELLING THAT WE OVERFLOWED BR GETCHR ;THEN PUT THIS LAST CHARACTER IN THE BUFFER ; ; INPTT1: CLEF$S #3 ;CLEAR THE OVERFLOW FLAG CMPB #IS.SET,$DSW ;SEE IF IT WAS SET BNE 1$ ;NOT SET - GO ABOUT OUR BUSINESS MOV #OVRFL,Q.IOPL+QTHRU ;PRINT AN ERROR!!!! MOV #OVRFLL,Q.IOPL+QTHRU+2 DIR$ #QTHRU ;***OVERFLOW*** 1$: CMP IEND,IPTR ;SEE IF ANYTHING IN BUFFER BNE 5$ ;YES - CONTINUE CLEF$S #13. ;CLEAR THE CHARACTER AVAILABLE FLAG CMPB #IS.SET,$DSW ;SEE IF THE CHARACTER AVAIL FLAG JUST SET BEQ INPTT1 ;YES - GO & GET THIS CHARACTER MOV #-1,R0 ;NO - SET NOTHING THERE FLAG RTS PC ;RETURN 5$: CMP IPTR,#299.+BUFF ;SEE IF AT END OF RING BUFFER BNE 10$ ;NO MOV #BUFF-1,IPTR ;YES - RESET TO BEGINNING OF BUFFER 10$: INC IPTR ;POINT TO NEXT CHARACTER MOVB @IPTR,R0 ;GET CHARACTER BIC #177400,R0 ;KNOCK OFF ANY HIGH-ORDER STUFF RTS PC ;THEN RETURN ; IPTR: .WORD BUFF IEND: .WORD BUFF BUFF: .BLKB 300. ; QTHRU: QIOW$ IO.WBT!TF.CCO,5,,,,,<0,0,40> OVRFL: .ASCII /**INPUT QUEUE OVERFLOW**/ OVRFLL=.-OVRFL ; .END