I$$AS=0 ; 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. ; ; EDITS: 01 F.BORGER CALL TTSYM$ TO DEFINE TC.XXX OFFSETS ; CAUSE THEY'RE DIFFERENT, RESTORE SOME ; MORE TC.XXX VALUES ON EXIT ; ; 02 F.BORGER CLEAR WRITE FLAG IN AST CODE SO DONT ; LOOP CONTINUALLY ; .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 .MCALL TTSYM$ TTSYM$ ;MAKE SURE WE USE RIGHT TC.XXX VALUES ; ; MAIN WAIT FOR EVENT SUBROUTINE ; .GLOBL WLOS WLOS: MRKT$S #11.,#6.,#1 ;WAIT 6 TICKS (0.1 SEC) MAX WTLO$S 0,#3700 ;WAIT FOR EF 7-11. (ANY) CMKT$S #11. RTS PC ;REPLACES OLD WSIG$S CALLS .PAGE .SBTTL MAIN TI OUTPUT CODE ; ITTOUR: CMP #-10.,@2(R5) ;SEE IF FIRST PARAMETER IS 'SETUP' (-10.) BNE OUTPUT ;NOPE - JUST PLAIN OLD OUTPUT ; .IF DF,I$$AS ;ONCE ONLY SETUP CODE ;DON'T ATTACH FOR AST ON OTHER TERMINAL IN IAS... USE READ QIO$ INSTEAD .IFF DIR$ #QIOATA ;NOW ATTACH TO THE TERMINAL & SET UP AST BCS ATAERR ;ERROR!!??! .IFT .MCALL TCSMC$ TCSMC$ ; CTC$T CLAIM ;GET ^C NOTIFICATION HERE ;USE CONTROL-X IN IAS INSTEAD OF CONTROL C FOR LOCAL ACTIVATION. ;(JUST TOO BAD TO LOSE 1 MORE CHARACTER) .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 ; .IF NDF,I$$AS ATAERR: MOV #3,R0 ;3 IS THE ATTACH FAILURE BR RETRN1 .ENDC ; SETERR: MOV #4,R0 ;4 IS THE SET FAILURE CLEF$S #7 BR RETRN1 .PAGE .SBTTL TERMINAL (TI) QIO'S, ETC ; .IF NDF,I$$AS QIOATA: QIOW$ IO.ATA,5,,150,,, ; ** IAS MAKE IT QIOW$ .ENDC QIOSET: QIOW$ SF.SMC,5,7,150,,, ; ** IAS MAKE IT QIOW$ SETBUF: .IF NDF,I$$AS .BYTE TC.NEC,1 ;NO ECHO .IFF ; .BYTE TF.RNE,1 ;NO ECHO .BYTE TC.BIN,1 ;BINARY INPUT .ENDC .BYTE TC.SMR,1 ;UPPER & LOWER CASE .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: .IF DF,I$$AS .BYTE TC.FDX,0 ;RESET FULLDUPLEX ATTR .BYTE TC.RAT,2 ;RESTORE REESE READ-AHEAD TYPE .BYTE TC.WID,80. ;ASSUME SOROC TYPE SCOPE WIDTH .BYTE TC.BIN,0 .IFF .BYTE TC.NEC,0 ;NO ECHO RESET TO ECHO .ENDC CLRBFL=.-CLRBUF .EVEN ; QIOCLR: QIOW$ SF.SMC,5,7,150,,, ; .IF NDF,I$$AS QIO: QIO$ IO.WAL,5,10.,150,,,<0,1,0> ; READ: QIOW$ IO.RAL!TF.RNE,5,7,150,,,<0,0> ; .IFF QIO: QIO$ IO.WAL,5,10.,150,,WRAST,<0,1,0> ; QIOKIL: QIOW$ IO.KIL,5,14. .ENDC ; .PAGE .SBTTL MAIN TI OUTPUT CODE ; ; COMES HERE IF ALL THAT'S WANTED IS OUTPUT TO TI ; 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 DIR$ #QIOKIL ;KILL OUTSTANDING READS F.B. FIX RTS PC ;THEN RETURN ; .IF DF,I$$AS TRIES: .WORD 0 .ENDC DUMP: .IF DF,I$$AS CLR TRIES DUMP2: INC TRIES ;COUNT HOW LONG WE TRIED FOR OUTPUT .ENDC .IF NDF,I$$AS 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 .IFF ;IAS AWAIT STUFF FREE UP CLEF$S #10. ;GET THE EVENT FLAGS TST WRTGOI ;ANY I/O STARTED? BEQ DUMPIT ;IF NOT START SOME ;DISALLOW FURTHER STUFF NOW. WAIT A BIT BEFORE CHECK WSIG$S JSR PC,WLOS CMP WRTGOI,#7 ;ALLOW 7 QIO'S OUTSTANDING MAX BLO DUMPIT ;IF THAT IS OK, GO AHEAD ENAR$S ;ELSE BE SURE THE ASTS CAN BE HANDLED CMP TRIES,#7 ;ALLOW EVENTUAL SUCCESS (??) BLO DUMP2 ;THEN FORGET IT CLR TRIES CLR WRTGOI ;(MAYBE WE MADE A MISTAKE??) BR DUMPIT ;JUST GO AHEAD WITH IT .ENDC ; 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 .IIF DF,I$$AS, INC WRTGOI CLR R0 ;RETURN ALL'S WELL SIGNAL TOO. DIR$ #QIO ;NOW WRITE IT OUT RTS PC ;THEN RETURN .IF DF,I$$AS ; ; AST SERVICE FOR IAS TI WRITE ; WRTGOI: .WORD 0 ;NO OUTSTANDING WRITES WRAST: DEC WRTGOI BGT 1$ ;COUNT DOWN OUTSTANDING QIO'S CLR WRTGOI 1$: ; CLEF$S #10. ;CLEAR EVENT FLAG F.B. FIX .MCALL ASTX$S TST (SP)+ ;POP OFF IOSB ADDRESS ASTX$S ;EXIT THE AST .ENDC .PAGE .SBTTL INPUT FROM TI AST SERVICE (NOT FOR IAS) ; ; ; ; THE FOLLOWING ROUTINE HANDLES THE ASYNCHRONOUS TRAP FOR INPUT ; .GLOBL INPCHR INPCHR: .WORD 0 ;CHARACTERS IN, NOT READ BY PGM .IF NDF,I$$AS 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) .ENDC .PAGE .SBTTL TI INPUT CODE ; ; WREAD: QIOW$ IO.RAL!TF.RNE,5,7,150,,, WRBF: .WORD 0 ;BUFFER FOR READIN UWREAD: QIO$ IO.RAL!TF.RNE,5,7,150,,, ;UNWAITED READ RFG: .WORD 0 ;READ ISSUED FLAG IF NONZERO .MCALL WSIG$S ITTING:: ;ENTRY TO GET A CHARACTER (WAITING IF NECESSARY) ; .IF NDF,I$$AS 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 .IFF ;IAS, JUST READ AND WAIT FOR A CHARACTER TST RFG ;ANY READ ISSUED ALREADY? BEQ 1$ ;IF NOT GO ISSUE ONE WTSE$S #7 ;IF SO WAIT FOR IT BR 2$ ;AND DELIVER THE GOODS 1$: DIR$ #WREAD ;NONE ISSUED...READ AND WAIT 2$: MOVB WRBF,R0 ;GET THE CHARACTER BIC #177400,R0 ;MASK TO 8 BITS ONLY CLR RFG ;SAY NO READS OUTSTANDING NOW RTS PC .ENDC ITTINR: .IF NDF,I$$AS 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$: .IFF ;IAS READ QIO$ HERE FOR 1 CHARACTER OR RETURN (AFTER WLOS CALL) ;WITH R0=-1 TST RFG ;ANY READS STARTED? BNE 1$ ;IF SO JUST SEE IF DONE DIR$ #UWREAD ;IF NOT START ONE NOW INC RFG ;SAY ONE IS GOING 1$: ;NOW CHECK FOR READ DONE (COULD HAVE BEEN INSTANT) .MCALL CLEF$S CLEF$S #7 ;CLR FLAG 7 CMPB #IS.SET,@#$DSW ;WAS IT SET? BNE 3$ ;IF NOT, WAIT A BIT AND RETURN MOVB WRBF,R0 ;IF SO, GRAB THE CHARACTER BIC #177400,R0 ;ZAP HIGH BITS OFF CLR RFG ;AND SAY READ NOT IN PROGRESS BR 4$ ;THEN RETURN 3$: JSR PC,WLOS ;ELSE WAIT A BIT FOR THINGS TO HAPPEN WSIG$S ;ALSO AWAIT SIG EVENT NEXT (FOR GOOD LUCK) MOV #-1,R0 ;SAY NOTHING THERE YET 4$: ;COMMON RETURN .ENDC RTS PC ;THEN RETURN ; IPTR: .WORD BUFF IEND: .WORD BUFF BUFF: .BLKB 102. .WORD 0,0,0,0 ;SAFETY SPARES ; .END