; 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 SETF$S ; .GLOBL ITTINR .GLOBL ITTOUR ; 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!!??! DIR$ #QIOGET ;GET CHARACTERISTICS FOR USER TERMINAL DIR$ #QIOSET ;SET CHARACTERISTICS FOR USER TERMINAL BCS SETERR CLEF$S #10. ;INITIALIZE CLRED FLAG FLAG 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 BR RETRN1 ; QIOATA: QIO$ IO.ATA,5,,,,, QIOGET: QIO$ SF.GMC,5,2,,,, QIOSET: QIO$ SF.SMC,5,2,,,, SETBUF: .BYTE TC.NEC,1 ;NO ECHO .BYTE TC.SMR,1 ;UPPER AND LOWER CASE .BYTE TC.FDX,1 ;FULL DUPLEX .BYTE TC.RAT,1 ;READ WITH TYPE AHEAD BUFFER .BYTE TC.WID,255. ;255. CHARACTER BUFFER SETBFL=.-SETBUF CLRBUF: .BYTE TC.NEC,0 ;NO ECHO .BYTE TC.SMR,0 ;UPPER AND LOWER CASE .BYTE TC.FDX,0 ;FULL DUPLEX .BYTE TC.RAT,0 ;READ WITH TYPE AHEAD BUFFER .BYTE TC.WID,0 ;255. CHARACTER BUFFER CLRBFL=.-CLRBUF ; .EVEN QIOCLR: QIO$ SF.SMC,5,2,,,, ; QIO: QIO$ IO.WAL,5,2,,,,<0,1,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 CHARACTERISTICS RTS PC ;THEN RETURN ; DUMP: CLEF$S #2 ;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 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 ; INPAST: CMP IEND,#99.+BUFF ;SEE IF AT END OF 99 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 #14. ;TELL 'EM WE GOT A LIVE ONE ASTX$S ;RETURN FROM AST ; OVRFLO: SETF$S #4 ;INDICATE A QUEUE OVERFLOW TRAP ; TESTING TRAP!!!!!!!!! BR GETCHR ;THEN PUT LAST CHARACTER RECEIVED INTO BUFFER ; ; ITTINR: CMP IEND,IPTR ;SEE IF ANYTHING IN BUFFER BNE 5$ ;YES - CONTINUE CLEF$S #4. ;SEE IF WE HAD AN OVERFLOW CMPB #IS.SET,$DSW ;WELL, DID WE? BNE 1$ ;GUESS NOT MOV #OVRFL,Q.IOPL+QTHRU ;YUP - PRINT AN ERROR MOV #OVRFLL,Q.IOPL+QTHRU+2 DIR$ #QTHRU ;OVERFLOW!!!! 1$: CLEF$S #14. ;CLEAR CHARACTER AVAILABLE FLAG CMPB #IS.SET,$DSW ;SEE IF IT JUST GOT SET BEQ ITTINR ;YES - START THIS MESS OVER AGAIN MOV #-1,R0 ;NO - SET NOTHING THERE FLAG RTS PC ;RETURN 5$: CMP IPTR,#99.+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 100. ; QTHRU: QIO$ IO.WBT!TF.CCO,5,,,,,<0,0,40> OVRFL: .ASCII /**KEYBOARD INPUT OVERFLOW**/ OVRFLL=.-OVRFL ; .END