.TITLE TTYOUT 'REMOTE' TERMINAL ROUTINES .IDENT /V 1.1/ ; ; WRITTEN BY MICHAEL D. LAMPI DAC CAT ; ; WRITTEN 10/2/79 ; ; LAST UPDATE 11/9/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 MRKT$S,WTSE$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? 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$ 3,TT,0 ; QIOATA: QIO$ IO.ATA,3,,,,, ; READ: QIOW$ IO.RAL!TF.RNE,3,1,,,,<0,0> ; ; QIOSET: QIO$ SF.SMC,3,1,,,, SETBUF: .BYTE TC.NEC,1 ;NO ECHO .BYTE TC.SLV,1 ;SLAVED .BYTE TC.SMR,1 ;LOWER-CASE .BYTE TC.BIN,1 ;BINARY READ .BYTE TC.FDX,1 ;FULL DUPLEX .BYTE TC.8BC,1 ;EIGHT-BIT CHARACTERS .BYTE TC.RAT,1 ;TYPE-AHEAD BUFFER .BYTE TC.WID,255. ;255. CHARACTER BUFFER ; CLRBUF: .BYTE TC.NEC,0 ;RESET ECHO .BYTE TC.SLV,0 ;SET NOSLAVE CLRBFL=.-CLRBUF .EVEN QIOCLR: QIO$ SF.SMC,3,1,,,, QIO: QIO$ IO.WAL!TF.WBT!TF.CCO,3,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 PREDMP ;NOPE ; ; DEFAULT COMMAND IS 'BREAK', OR LOGICAL SPACING CONDITION WANTED ; SINCE WE HAVE NO STANDARD METHOD FOR THIS REQUEST OF THE TERMINAL ; DRIVER, WE MUST DIRECTLY ADDRESS THE 3 DL-11 & 1 DZ-11 CSR'S TO ; ACCESS THE 'BREAK' FUNCTION OF THESE DEVICES. ; MOV ALUN+A.LUNU,R0 ;GET TERMINAL # FROM ALUN$ DPB MOV R0,R1 ;COPY IT ASL R1 ;MULTIPLY BY TWO ; BISB BPOS(R0),@CLRAD(R1) ;SET THE 'BREAK' BIT FOR THIS TERMINAL MRKT$S #6,#20.,#1 ;WAIT FOR THE BREAK TO BE NOTICED WTSE$S #6 ;(ABOUT 1/3 SECOND SHOULD BE ENOUGH) ; BICB BPOS(R0),@CLRAD(R1) ;CLEAR THE 'BREAK' CONDITION CLR R0 ;TELL 'EM IT'S OK RTS PC ;CAN'T DO A BREAK IN RSX-11, SO JUST RETURN ; ; THE FOLLOWING IS A TABLE OF THE TERMINAL BREAK BIT POSITIONS ; AS WELL AS THEIR RESPECTIVE CSR ADDRESSES. ; NOTE THAT 11 (10) TERMINALS ARE IN THE TABLE, CORRESPONDING (IN ORDER) ; FROM TT0: THRU TT12: ; BPOS: .BYTE 1,1,1,1,2,4,10,20,40,100,200 .EVEN CLRAD: .WORD 177560,175610,175620,160107 .WORD 160107,160107,160107,160107 .WORD 160107,160107,160107 ; PREDMP: 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 DIR$ #QIOCLR ;RESET TERMINAL ATTRIBUTES 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,#300.+BUFF ;SEE IF AT END OF 300 CHARACTER BUFFER BNE 5$ ;NOPE MOV #BUFF,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 MOVB (SP)+,@IEND ;MOVE CHARACTER FROM STACK TO BUFFER ASTX$S ;RETURN FROM AST ; OVRFLO: IOT ;ABORT!! (SHOULD RARELY HAPPEN--JUST TESTING) ;OVRFLO: BR GETCHR ;JUST IGNORE (FOR NOW) ; ; INPTT1: CMP IEND,IPTR ;SEE IF ANYTHING IN BUFFER BNE 5$ ;YES - CONTINUE MOV #-1,R0 ;NO - SET NOTHING THERE FLAG RTS PC ;RETURN 5$: CMP IPTR,#300.+BUFF ;SEE IF AT END OF RING BUFFER BNE 10$ ;NO MOV #BUFF,IPTR ;YES - RESET TO BEGINNING OF BUFFER 10$: INC IPTR ;POINT TO NEXT CHARACTER MOV IPTR,R0 ;GET POINTER MOVB (R0),R0 ;GET CHARACTER BIC #177400,R0 ;KNOCK OFF ANY HIGH-ORDER STUFF RTS PC ;THEN RETURN ; IPTR: .WORD BUFF IEND: .WORD BUFF BUFF: .BLKB 302. ; .END