.TITLE TALKMT .NLIST CND ; ; Purpose: Provide "PASS-ALL" communication between multi-terminal ports. ; ; Author: Steve C. Cribbs 20-Oct-81 ; Atomic Energy of Canada Limited ; Pinawa, Manitoba ; Canada R0E 1L0 ; NHD = 1 ;Assume processor has EIS instructions ; Set NHD = 1 if not (June 1984) .MCALL .GTLIN,.MTATCH,.MTGET,.MTSET,.MTRCTO,.PRINT,.EXIT,.SCCA .MCALL .MTIN,.MTOUT,.MTPRNT,.MTSTAT SYERRB = 52 ; SYSTEM ERROR BYTE START: .MTSTAT #EMT,#LBUF ; LOOK UP MULTI-TERMINAL STATUS BCS 5$ ; ABORT ON ERROR MOV #LBUF,R0 ; POINT TO FIRST STATUS WORD MOV (R0)+,R1 ; MONITOR OFFSET TO FIRST "TCB" MOV (R0)+,R2 ; MONITOR OFFSET TO CONSOLE "TCB" MOV 2(R0),R3 ; SIZE OF "TCB" CLR R0 ; INITIALIZE "LUN" COUNTER 1$: CMP R2,R1 ; TEST FOR OFFSET MATCH BEQ 2$ ; YES, LOCATED PROGRAMS CONSOLE "TCB" ADD R3,R1 ; NO, ADD "TCB" SIZE TO OFFSET INC R0 ; UPDATE "LUN" COUNTER BR 1$ ; LOOP UNTIL MATCH MADE 2$: MOV R0,CNSOLE ; SAVE AS CONSOLE "LUN" NUMBER MOV #LBUF,R5 ; POINT TO LINE BUFFER .GTLIN R5,#TMESG ; ASK FOR "LUN" NUMBER TSTB (R5) ; CHECK FIRST CHAR. RECEIVED BEQ START ; REPEAT IF NOTHING ENTERED CLR R0 ; INITIALIZE CLR R1 ; WORKING REGISTERS 3$: BIC #177760,R0 ; STRIP ASCII CODE FROM DIGIT .IF EQ NHD MUL #10,R1 ; Decimal scale number (EIS) .IFF ASL R1 ; Decimal scale number (NHD) MOV R1,-(SP) ; ++ NHD multiply by 10 ASL R1 ; + ASL R1 ; + ADD (SP)+,R1 ; +- .ENDC ;EQ NHD ADD R0,R1 ; ADD IN NEW DIGIT MOVB (R5)+,R0 ; GET NEXT DIGIT BNE 3$ ; LOOP UNTIL NULL FOUND MOV R1,REMOTE ; SAVE AS REMOTE TERMINAL "LUN" CLR MODE ; DEFAULT MODE = "TYPE AS RECEIVED" MOV #LBUF,R5 ; POINT TO LINE BUFFER .GTLIN R5,#SNOPMD ; QUERY USER FOR OPERATION MODE CMPB #'Y,(R5) ; WAS THE RESPONSE YES? BNE 4$ ; JUMP IF NOT INC MODE ; MODE = SNOOPY 4$: .SCCA #EMT,#SCCA ; DISABLE CNTRL_C ABORTS .PRINT #CANCEL ; INFORM USER CNTRL_C TRAP IS IN PLACE .PAGE .MTATCH #EMT,#0,CNSOLE ; ATTACH THE CONSOLE TERMINAL 5$: BCS MERR ; ABORT ON ERROR MOV #LBUF,R5 ; POINT TO LINE BUFFER .MTGET #EMT,R5,CNSOLE ; GET CONSOLE TERMINAL CHARACTERISTICS BCS MERR ; ABORT ON ERROR MOV R5,R4 ; NEED A WORKING COPY OF POINTER MOV #SVCNSL,R0 ; POINT TO TERM. #0 SAVE AREA MOV (R4)+,(R0)+ ; PRESERVE ORIGINAL CHARACTERISTICS MOV (R4)+,(R0)+ ; + MOV (R4)+,(R0)+ ; + MOV (R4)+,(R0)+ ; - BIC #12,(R5) ; CLEAR [CRLF] & ^X,^F,^B PROCESSING BIS #50305,(R5)+ ; SET BITS 14,12,7,6,2,0 IN M.TSTS BIS #100200,(R5)+ ; SET READ-WRITE PASS ALL CLR (R5)+ ; NO FILLERS REQUIRED MOVB #255.,(R5)+ ; TERMINAL WIDTH SET TO 255 CHARS. .MTSET #EMT,#LBUF,CNSOLE ; INSTALL CONDITIONS IN CONSOLE "TCB" BCS MERR ; ABORT ON ERROR .MTRCTO #EMT,CNSOLE ; RESET MULTI-TERMINAL CONTROL_O .MTATCH #EMT,#0,REMOTE ; ATTACH THE TERMINAL BCS MERR ; ABORT ON ERROR MOV #LBUF,R5 ; POINT TO LINE BUFFER .MTGET #EMT,R5,REMOTE ; GET TERMINAL CHARACTERISTICS BCS MERR ; ABORT ON ERROR MOV R5,R4 ; NEED A WORKING COPY OF POINTER MOV #SVREMT,R0 ; POINT TO TERM. #1 SAVE AREA MOV (R4)+,(R0)+ ; PRESERVE ORIGINAL CHARACTERISTICS MOV (R4)+,(R0)+ ; + MOV (R4)+,(R0)+ ; + MOV (R4)+,(R0)+ ; - BIC #12,(R5) ; CLEAR [CRLF] & ^X,^F,^B PROCESSING BIS #50305,(R5)+ ; SET BITS 14,12,7,6,2,0 IN M.TSTS BIS #100200,(R5)+ ; SET READ-WRITE PASS ALL CLR (R5)+ ; NO FILLERS REQUIRED MOVB #255.,(R5)+ ; TERMINAL WIDTH SET TO 255 CHARS. .MTSET #EMT,#LBUF,REMOTE ; INSTALL CONDITIONS IN "TCB" BCS MERR ; ABORT ON ERROR .MTRCTO #EMT,REMOTE ; RESET MULTI-TERMINAL CONTROL_O BR TX ; BEGIN I/O EXCHANGE MERR: MOVB @#SYERRB,R0 ; GET ERROR CODE ADD #'0,R0 ; ASCII ENCODE MOVB R0,ERRCDE ; INSTALL IN MESSAGE .PRINT #ERMESG ; TYPE OUT ON CONSOLE CLR R0 ; HARD EXIT .EXIT .PAGE TX: .MTIN #EMT,#LBUF,CNSOLE ; GET A CHAR. FROM CONSOLE BCS 2$ ; JUMP IF NONE AVAILABLE BIC #^C177,LBUF ; LEAVE ONLY LOWER 7 BITS CMPB #31,LBUF ; IS INPUT CHARACTER "CNTRL_Y"? BEQ STOP ; TERMINATE PROGRAM 1$: .MTOUT #EMT,#LBUF,REMOTE ; SEND TO ATTACHED TERMINAL BCS 1$ ; ON ERROR, REPEAT REQUEST 2$: .MTIN #EMT,#LBUF,REMOTE ; GET AT CHAR. FROM ATTACHED TERMINAL BCS TX ; JUMP IF NONE AVAILABLE BIC #^C177,LBUF ; LEAVE ONLY LOWER 7 BITS TST MODE ; CHECK MODE FLAG BEQ 5$ ; JUMP IF NOT "SNOOPY" MODE CMPB #177,LBUF ; IS CHARACTER ? BNE 3$ ; JUMP IF NOT MOV #40,R3 ; CREATE PROPER SUBSCRIPT BR 4$ ; GO TO DISPLAY SECTION 3$: CMPB #37,LBUF ; COMPARE INPUT CHAR. WITH HIGHEST SPECIAL CODE BMI 5$ ; JUMP IF GREATER MOV LBUF,R3 ; COPY TO ALLOW SINGLE REGISTER MULTIPLY .IF EQ NHD 4$: MUL #6,R3 ; Create proper table offset (EIS) .IFF 4$: ASL R3 ; Create proper table offset (NHD) MOV R3,-(SP) ; ++ NHD multiply by 6 ASL R3 ; + ASL R3 ; + SUB (SP)+,R3 ; +- .ENDC ;EQ NHD ADD #TRANSL,R3 ; BUILD POINTER TO TABLE ELEMENT .MTPRNT #EMT,R3,CNSOLE ; DISPLAY TRANSLATED CODE BR TX ; LOOP FOREVER 5$: .MTOUT #EMT,#LBUF,CNSOLE ; SEND TO CONSOLE BCS 5$ ; ON ERROR, REPEAT REQUEST BR TX ; LOOP FOREVER STOP: .MTSET #EMT,#SVCNSL,CNSOLE ; RESTORE CHARACTERISTICS OF CONSOLE .MTSET #EMT,#SVREMT,REMOTE ; RESTORE CHARACTERISTICS OF REMOTE .EXIT .PAGE MODE: .BLKW 1 SCCA: .BLKW 1 EMT: .BLKW 3 SVCNSL: .BLKW 4 SVREMT: .BLKW 4 CNSOLE: .BLKW 1 REMOTE: .BLKW 1 LBUF: .BLKB 81. .EVEN .NLIST BEX TRANSL: .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> .ASCII //<200> TMESG: .ASCIZ /ATTACH TO TERMINAL PORT NUMBER = /<200> SNOPMD: .ASCII /SNOOPY MODE? [Y OR ] /<200> CANCEL: .ASCIZ /TYPE CONTROL_Y [^Y] TO STOP THIS PROGRAM/ ERMESG: .ASCII /MULTI-TERMINAL REQUEST ERROR CODE = / ERRCDE: .BYTE 0,0 .END START