.TITLE RT11 CONSOLE SWITCH HANDLER .IDENT /V1.1/ .REPT 0 This program allows the RT-11 user to swap consoles. It is written to look like a handler to the KMON SET command interface. There is no need to INSTALL it, since SET works just as well without. Two commands are supported: SET RT SHOW - Displays a list of console numbers with their vector and CSR SET RT CONSOL=n - Switches to console number n After a console switch occurs the programs sends BELL, ENQ. If the terminal answerback is set to "@filename" then the command file can set the terminal characteristics. The table at the end of the program can be changed to support different console addresses. Any comments or questions regarding this program should be directed to: Scott Samet The Miami Herald Publishing Co. 1 Herald Plaza Miami, Fla. 33101 (305) 350-2740 .ENDR .ENABL LC BITMAP= 326 SYSGEN= 372 MTTY$= 20000 .MCALL .MFPS,.MTPS,.PRINT,.EXIT,.DRDEF,.TTYOUT .MACRO ADDR ADR,REG MOV PC,REG ADD #ADR-.,REG .ENDM .DRDEF RT,25,0,0,0,0 .SBTTL INSTALLATION VERICATION CODE .ASECT .=200 NOP ; DO NOT INSTALL AS NON SYSTEM DEVICE ABORT: SEC ; SET CARRY BIT FOR ERROR MESSAGE RTS PC ; AND RETURN TO KMON .SBTTL OCTAL PRINT SUBROUTINE CSRVEC: JSR PC,@PC ; DO REST TWICE MOV (R4)+,R0 ; MOVE ADDRESS TO WORK REG OCTPRT: CLR R1 ; CLEAR DIGIT COUNT 1$: INC R1 ; BUMP DIGIT COUNT MOV R0,-(SP) ; GET 1 DIGIT ON STACK BIC #^C<7>,@SP ; CLEAR HIGH ORDER BITS ADD #'0,@SP ; MAKE IT AN ASCII CHARACTER ASR R0 ; DIVIDE R0 BY 10 ASR R0 ASR R0 BIC #100000,R0 ; STRIP THE SIGN BNE 1$ ; CONTINUE UNTIL ALL DIGITS DONE 2$: .TTYOUT (SP)+ ; POP DIGITS OFF STACK AND PRINT SOB R1,2$ ; THE WHOLE NUMBER .TTYOUT #11 ; FOLLOWED BY A TAB RTS PC .SBTTL VALIDATE THE INPUT CONSOLE NUMBER CHKCON: TST R0 ; IS IT LESS THAN ZERO BLE ABORT ; HOW %$#@ RUDE CMP R0,R3 ; IS IT GREATER THAN MAX BGT ABORT MOV R0,R4 ASL R4 ; MULTIPLY CONSOLE NUMBER BY 4 ASL R4 ADD PC,R4 ; AND INDEX INTO CONSOLE LIST ADD #LIST-.,R4 RTS PC .SBTTL SAVE REGISTERS SAVER: MOV (SP),-12.(SP) ; MOVE RETURN ADDR DOWN STACK MOV R0,(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) JMP @-2(SP) .SBTTL SET COMMANDS .DRSET CONSOL,</4>,CONSOL,NUM .DRSET SHOW,-1,SHOW .SBTTL SET CONSOL= CONSOL: CALL SAVER ; SAVE REGS ; CHECK FOR VALID CONDITIONS MOV @#54,R1 ; R1 -> RMON BIT #MTTY$,SYSGEN(R1) ; IS THIS AN MT SYSTEM? BNE ABORT2 ; -YES- ERROR JSR PC,CHKCON ; IS CONSOLE NUMBER VALID? BCS ABORT2 ; -NO- ERROR ; DISABLE INTERRUPTS .MFPS ; SAVE PS ON STACK .MTPS #340 ; DISABLE INTERRUPTS ; COPY INTERRUPT VECTORS MOV #60,R1 ; R1 -> OLD VECTOR MOV -(R4),R2 ; R2 -> NEW VECTOR MOV #4,R3 ; MOVE 4 WORDS FROM OLD TO NEW VECTOR 3$: MOV (R1)+,(R2)+ SOB R3,3$ ; PROTECT NEW VECTORS MOV @R4,R0 ; GET NEW VECTOR ADDRESS ASR R0 ; DIVIDE BY 20 TO GET BITMAP OFFSET ASR R0 ASR R0 ASR R0 MOV #17,R1 ; ASSUME VECTOR BIT 3 ON BCS 4$ ; BRANCH IF BIT 3 WAS ON MOV #360,R1 ; SET MASK VALUE FOR BIT 3 OFF 4$: ADD @#54,R0 ; ADD RMON BASE BISB R1,BITMAP(R0) ; SET BITMAP ; MOVE IN NEW CONSOLE REGISTER LIST MOV @#54,R1 ; R1 -> RMON ADD #304,R1 ; R1 -> CONSOLE REGISTER LIST MOV -(R4),R2 ; R2 -> NEW CSR CLR @(R1) ; DISABLE OLD CONSOLE BIS #100,@R2 ; ENABLE NEW CONSOLE MOV #4,R3 ; 4 ENTRIES IN LIST 2$: MOV R2,(R1)+ ; PUT ADDR IN LIST TST (R2)+ ; BUMP ADDR SOB R3,2$ ; LOOP THRU LIST ; RE-ENABLE INTERRUPTS AND EXIT .MTPS ; RESTORE PS FROM STACK .TTYOUT #7 ; RING THE BELL .TTYOUT #5 ; SEND ENQ RETURN: CLC ; CLEAR CARRY BIT BR RESTOR ABORT2: SEC RESTOR: MOV (SP)+,R5 ; RESTORE REGISTERS AND RETURN MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R1 RTS PC ; AND RETURN KMON .SBTTL SET SHOW COMMAND SHOW: CALL SAVER ; SAVE REGISTERS ADDR HEADER,R0 .PRINT R0 ADDR LIST,R4 ; TABLE POINTER CLR R3 ; CONSOLE NUMBER 1$: INC R3 MOV R3,R0 JSR PC,OCTPRT ; PRINT NUMBER JSR PC,CSRVEC ; PRINT CSR AND VECTOR ADDR CRLF,R0 .PRINT R0 CMP R3,#/4 BLT 1$ BR RETURN .SBTTL THE HANDLER (SUCH AS IT IS) .DRBEG RT MOV RTCQE,R5 BIS #HDERR$,@-(R5) BR RTEXIT RTS PC ; ABORT ENTRY POINT RTINT:: RTEXIT::.DRFIN RT .SBTTL LIST OF VALID CONSOLES ; CSR/VECTOR PAIRS LIST: .WORD 177560,060 ; CONSOLE 1 .WORD 176520,320 ; CONSOLE 2 LISTEN= . HEADER: .ASCIZ /# CSR VEC/ CRLF= .-1 .DREND RT .END