.TITLE XON .SBTTL /MRH001/ ; ; PROGRAM TO PLACE A CONTROL-Q IN THE INPUT BUFFER ; OF A TERMINAL PRESENTLY IN X-OFF CONDITION. USED ON ; TERMINALS WITHOUT KEYBOARDS, OR REMOTE LINES WHERE IT'S TOO ; FAR TO WALK ; ; SOURCE, AUGUST 82 DEVIAS NEWSLETTER ; ; MUST BE LINKED TO A RE-BUILT VERSION OF TT HANDLER (USING ; STB FILE) SO IT KNOWS JUST WHERE TABLES ARE ; ; WILL GENERATE AN ERROR 'LOAD ADDRESS OUT OF RANGE' ; ; MCR>XON TTXX (WHERE XX IS TERMINAL NUMBER) ; ; ; .MCALL EXIT$S,GMCR$,DIR$ ; CH.XON=21 M$$PRI=4 .SBTTL GET COMMAND LINE START: DIR$ #GETMCR ;GET MCR COMMAND LINE MOV #GETMCR+G.MCRB,R0 ;POINT TO BUFFER ADD #4,R0 ;SHOULD BE AT "TT" CMP (R0)+,#"TT ;BETTER BE BNE END ;EXIT IF NOT CALL $COTB ;CONVERT TERMINAL NUMBER TO OCTAL MOV R1,DEVUN ;SAVE UNIT NUMBER CMPB R2,#15 ;TERMINATED ON CAR-RET BEQ OK ;IF SO OK CMPB R2,#': ;OR COLON AFTER NUMBER ? BEQ OK ;IF SO,OK CMPB R2,#33 ;OR ESCAPE BNE END ;ITS OK TOO .PAGE .SBTTL MAP TO TT'S DATA AREA OK: MOV #.ATLLH,R0 ;START ATL SCAN 10$: MOV (R0),R0 ;GET NEXT ATL ENTRY CMP R0,#.ATLLH ;THROUGH ATL ? BEQ END ;BR IF FELL THRU MOV A.TD(R0),R1 ;GET STD ADDRESS OF TASK CMP #<^RTT.>,S.TN(R1) ;IS THIS TT.... ? BNE 10$ ;BR IF NOT CMP #<^R...>,S.TN+2(R1) BNE 10$ MOV #77406,-(SP) ;SET TO MAP TO TT.... TASK HEADER MOV A.HA(R0),-(SP) CALL @#..SPD1 ;MAP TO TASK HEADER CMP (SP)+,(SP)+ ;CLEAR STACK MOV #77406,-(SP) ;SET FOR A 4-K READ/WRITE REGION MOV @#20000+H.PA2,-(SP) ;MAP PAR 2 TO TT'S APR2 CALL @#..SPD2 CMP (SP)+,(SP)+ ;CLEAR STACK MOV #77406,-(SP) ;SET FOR A 4-K READ/WRITE REGION MOV @#20000+H.PA3,R1 ;GET PURE AREA GCD ADDRESS MOV G.BA(R1),-(SP) ;SET BASE ADDRESS OF PURE AREA CALL @#..SPD3 CMP (SP)+,(SP)+ .SBTTL SCAN PUD FOR CORECT TERMINAL ENTRY MOV .PUDBA,R0 ;NOW START PUD SCAN LOOP: CMP #"TT,U.DN(R0) ;FOUND A TT BNE NEXT ;NO CMPB DEVUN,U.UN(R0) ;YES, CHECK UNIT BEQ FOUND ;IF OK, CONTINUE NEXT: ADD #U.SZ,R0 ;ELSE BUMP TO NEXT PUD UNIT CMP R0,.PUDEA ;AT END YET BLO LOOP ;BR IF NOT BR END ;ELSE EXIT .SBTTL PLANT THE X-ON CHARACTER FOUND: MOV U.SL(R0),R4 ;GET TERMINAL ENTRY ADDRESS BEQ END ;BR IF NOT INITIALIZED BIC #SC.XOF,(R4) ;ELSE CLEAR THE FLAG MOV T.INUM(R4),R3 ;GET OFFSET INTO INTERFACE TABLE ADD #IFCTBL,R3 ;POINT TO START OF TABLE MOVB I.FLG(R3),R3 ;GET INTERFACE TYPE BIC #177760,R3 ;BLANK FLAGS TO TYPE BITS BMI END ;SKIP IF SOMETHING WRONG CMP R3,#IT.DZ ;CHECK UPPER BOUND BGT END ;TOO ASL R3 ;CONVERT TO WORD OFFSET TST L.RSUM(R3) ;VERIFY ROUTINE IS THERE BEQ END ;SKIP IF NOT CALL @L.RSUM(R3) ;CALL LINE DEPENDANT RESUME ROUTINE END: EXIT$S ;AND EXIT .PAGE .SBTTL MISC STORAGE ; ; DISPATCH ROUTINE FOR LINE ENABLE ; L.RSUM: .WORD DLIE ;DL INTERRUPT ENABLE .WORD DCIE ;DC INTERRUPT ENABLE .WORD DZIE ;DZ INTERRUPT ENABLE ; ; ; DEVUN: .WORD 0 ;SAVED UNIT NUMBER GETMCR: GMCR$ .PAGE .SBTTL INTERRUPT ENABLE ROUTINES ; ;DL INTERRUPT ENABLE ; DLIE: MOV T.EPA(R4),R0 ;GET EXTERNAL PAGE ADDRESS BIS #DL.XIE,D.LXCS(R0) ;TURN INTERRUPT BACK ON RETURN ; ;DC INTERRUPT ENABLE ; DCIE: MOV T.EPA(R4),R0 ;GET EXT PAGE ADDRESS BIS #DC.XIE,D.CXCS(R0) ;TURN INTERRUPT BACK ON RETURN ; ;DZ INTERRUPT ENABLE; ; DZIE: CALL MXSET ;SET UP REGISTERS MOV (R5),R5 ;GET EXTERNAL PAGE ADDRESS BIS R1,D.ZXCR(R5) ;ENABLE INTERRUPTS MOVB #0,D.ZXBF(R5) ;GIVE HARDWARE CHAR IT NEEDS 1$: RETURN ; ;SET UP FOR MULTIPLEXED INTERFACE ; MXSET: MOVTC ISL,R0 ;GET SUBLINE NUMBER MOV #1,R1 ;SET FOR SHIFT ASH R0,R1 ;NOW HAVE BIT IN CORRECT POSITION MOVB T.INUM(R4),R5 ;GET INTERFACE TABLE OFFSET ADD #IFCTBL,R5 ;MAKE ABSOLUTE RETURN .END START