; THESE SUBROUTINES REPLACE THE ITTINR & ITTOUR SUBROUTINES IN RT-11 ; FORTRAN. NOTE THAT THE QIO ATTACH IS USED TO INTERCEPT CHARACTERS ; TYPED IN AT THE KEYBOARD. ; ; USES STANDARD QIO FUNCTION IO.ATA TO ATTACH TO 'LOCAL' ; 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 WTSE$S .MCALL WSIG$S,WTLO$S,SETF$S ; .GLOBL ITTINR .GLOBL ITTOUR .MCALL MRKT$S,CLEF$S,CMKT$S .GLOBL WLOS WLOS: MRKT$S #11.,#15.,#1 ;WAIT 15 TICKS (1/4 SEC) MAX WTLO$S 0,#3700 ;WAIT FOR EF 7-11. (ANY) CMKT$S #11. RTS PC ;REPLACES OLD WSIG$S CALLS ; ITTOUR: CMP #-10.,@2(R5) ;SEE IF FIRST PARAMETER IS 'SETUP' (-10.) BNE OUTPUT ;NOPE - JUST PLAIN OLD OUTPUT ; DIR$ #QIOATA ;NOW ATTACH TO THE TERMINAL & SET UP AST BCS ATAERR ;ERROR!!??! .IF DF,I$AS .MCALL TCSMC$ TCSMC$ CTC$T CLAIM ;GET ^C NOTIFICATION HERE .ENDC DIR$ #QIOSET ;SET CHARACTERISTICS FOR USER TERMINAL BCS SETERR CLEF$S #7 ;LEAVE EVENT FLAG OFF AFTERWARDS CLR R0 ;RETURN SUCCESS CODE (0) RETRN1: RTS PC ;AND RETURN TO CALLING PROGRAM ; ATAERR: MOV #3,R0 ;3 IS THE ATTACH FAILURE BR RETRN1 ; SETERR: MOV #4,R0 ;4 IS THE SET FAILURE CLEF$S #7 BR RETRN1 ; QIOATA: QIO$ IO.ATA,5,,,,, QIOSET: QIO$ SF.SMC,5,7,,,, SETBUF: .IF NDF,I$$AS .BYTE TC.NEC,1 ;NO ECHO .IFF .BYTE TF.RNE,1 ;NO ECHO .ENDC .BYTE TC.SMR,1 ;UPPER & LOWER CASE ; .BYTE TC.BIN,1 ;BINARY INPUT .BYTE TC.FDX,1 ;FULL DUPLEX ; .BYTE TC.P8B,1 ;8 BIT CHARS (IAS) ; .BYTE TC.8BC,1 ;8-BIT CHARACTERS .BYTE TC.RAT,1 ;READ WITH TYPE-AHEAD BUFFER .BYTE TC.WID,255. ;255. CHARACTER BUFFER SETL=.-SETBUF ; CLRBUF: .BYTE TC.NEC,0 ;NO ECHO RESET TO ECHO ; .BYTE TC.BIN,0 CLRBFL=.-CLRBUF .EVEN ; QIOCLR: QIO$ SF.SMC,5,7,,,, ; QIO: QIO$ IO.WAL,5,10.,,,,<0,1,0> ; READ: QIOW$ IO.RAL!TF.RNE,5,7,,,,<0,0> ; ; ; ; COMES HERE IF ALL THAT'S WANTED IS OUTPUT TO THE REMOTE DEVICE ; OUTPUT: CLR R0 ;INITIALIZE RETURN CODE TST @2(R5) ;SEE IF SOME ACTION OTHER THAN DUMP WANTED 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 #10. ;GET THE EVENT FLAGS CMPB #IS.SET,$DSW ;SEE IF EVENT FLAG 2 WAS SET BEQ DUMPIT ;YES - I/O COMPLETE - OK TO SHIP IT OFF ;IF OUTPUT INCOMPLETE, WAIT AND SHIP NEXT CHAR OUT ANYWAY. JSR PC,WLOS ; WSIG$S ; BR DUMPIT ;THEN JUST STUFF IT OUT ANYWAY ; DEC R0 ; RTS PC ;OLD ACTION RETURNED -1 ; DUMPIT: MOV #1,QIO+Q.IOPL+2 ;MOVE BUFFER LENGTH MOV 2(R5),QIO+Q.IOPL ;MOVE ADDRESS OF BUFFER CLR R0 ;RETURN ALL'S WELL SIGNAL TOO. DIR$ #QIO ;NOW WRITE IT OUT RTS PC ;THEN RETURN ; ; ; ; THE FOLLOWING ROUTINE HANDLES THE ASYNCHRONOUS TRAP FOR INPUT ; .GLOBL INPCHR INPCHR: .WORD 0 ;CHARACTERS IN, NOT READ BY PGM INPAST: CMP IEND,#100.+BUFF ;SEE IF AT END OF 100 CHARACTER BUFFER BLO 5$ ;IF BELOW IT, LET BY. ; 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 INC INPCHR ;COUNT CHARACTERS IN GETCHR: MOVB (SP)+,@IEND ;MOVE CHARACTER FROM STACK TO BUFFER SETF$S #15 ;SET E.F. 15 AS SIGNAL ALL'S HERE ASTX$S ;RETURN FROM AST ; ;OVRFLO: TRAP ;ABORT FOR TESTING PURPOSES OVRFLO: WSIG$S WSIG$S WSIG$S DEC IEND ;DISALLOW WWRAPAROUND BR GETCHR ;JUST IGNORE (FOR NOW) ; ; .MCALL WSIG$S ITTING:: ;ENTRY TO GET A CHARACTER (WAITING IF NECESSARY) ; CMP IEND,IPTR ;ANY DATA THERE ALREADY? BNE ITTINR ;YES, GET IT ; CLEF$S #15 ;ZERO EVENT FLAG & AWAIT AST WTSE$S #15 ;WAIT TILL IT ARRIVES ITTINR: CMP IEND,IPTR ;SEE IF ANYTHING IN BUFFER BNE 5$ ;YES - CONTINUE MOV #-1,R0 ;NO - SET NOTHING THERE FLAG JSR PC,WLOS ;AWAIT SOME SIGNIFICANT ACTION FOR US ; WSIG$S ;LET HIM WAIT A BIT RTS PC ;RETURN 5$: CLEF$S #15 ;ZERO AST FLAG CMP IPTR,#100.+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 DEC INPCHR ;COUNT DOWN CHARS TO DO BGE 15$ CLR INPCHR ;CLAMP TO + 15$: RTS PC ;THEN RETURN ; IPTR: .WORD BUFF IEND: .WORD BUFF BUFF: .BLKB 102. .WORD 0,0,0,0 ;SAFETY SPARES ; .END