;TSTE.MAC - TIME SHARE TERMINAL EMULATOR UNDER RT-11 ;VERSION 1.0 31-OCT-78 ;BY T.L.STARR AND L.T.NIEH ;GENERAL ELECTRIC CO ;APPLIANCE PARK 35-1101 ;LOUISVILLE, KENTUCKY 40225 ;1 MODIFIED BY GLENN BEVER, 3-MAR-84. ;2 SLU "EASY CHANGE" PARAMETER ADDED--G. BEVER, 13-MAR-84. ;3 DEFAULTS ADDED--5-JUN-84, G. BEVER. ; ;CTRL T = TRANSMIT RK0:OUT.DAT FILE ;CTRL R = OPEN RECEIVER INPUT FILE ;CTRL D = CLOSE RECEIVER INPUT FILE ;CTRL K = BREAK ;CTRL N = CONTROL SHIFT CHARACTER ;1 CTRL X = QUIT PROGRAM. .IFNDF SLU ;3 SLU=1 ;2 SERIAL LINE UNIT #. .ENDC ;3 RVEC=SLU*10+300 ;2 DL11-W VECTOR ADDRESS RCSR=SLU*10+176500 ;2 DL11-W RECEIVE STATUS ADDRESS RBUF=RCSR+2 ;1 DL11-W RECEIVE BUFFER ADDRESS XCSR=RCSR+4 ;1 DL11-W TRANSMIT STATUS ADDRESS XBUF=RCSR+6 ;1 DL11-W TRANSMIT BUFFER ADDRESS CTRLX=30 ;1 CONTROL X CTRLT=24 ;CONTROL T CTRLR=22 ;CONTROL R CTRLD=4 ;CONTROL D CTRLK=13 ;CONTROL K CTRLN=16 ;CONTROL N RUBOUT=377 ;RUBOUT ERRWD=52 ;ERROR WORD JSW=44 ;JOB STATUS WORD OUTCHN=2 ;TRANSMIT CHANNEL NO. INCHN=3 ;1 RECEIVE CHANNEL NO. CR=15 ;CARRAGE RETURN LF=12 ;LINE FEED ;***************************************************** .MCALL ..V2..,.REGDEF,.PRINT,.EXIT,.INTEN,.SYNCH .MCALL .ENTER,.LOOKUP,.READ,.WRITE,.FETCH,.GTJB .MCALL .TTINR,.TTYOUT,.WAIT,.WRITW,.CLOSE,.READW .MCALL .CSISPC,.DSTAT,.SCCA ;1 ..V2.. .REGDEF ;***************************************************** START: MOV #RINT,@#RVEC ;LOAD DL11-E INT VECTOR MOV #200,@#RVEC+2 ;BR4 MOV #100,@#RCSR ;ENABLE INTERRUPT MOV #JOB,R5 .GTJB #AREA,R5 ;GET JOB NUMBER MOV (R5),AREA2+2 1$: MOV #BUFA,ADDR ;RING BUFFER ADR PTR MOV #10000,CNT ;RING BUFFER CHAR COUNT CLR BCOUNT ;ACTIVE CHAR COUNT MOV #BUFA,ADDR2 ;PROCESS ADR POINTER MOV #10000,CNT2 ;PROCESS CHAR COUNT .SCCA #MAREA,#SCCA ;1 DISABLE CTRL C ABORT. .PRINT #MSGA ;READY TO LOOP ;***************************************************** ;MAIN PROGRAM LOOP READY: JSR PC,PRINT ;CHECK PRINT BUFFER BIS #050100,@#JSW ;1 KEYBOARD IN SPECIAL MODE .TTINR ;KEYBOARD INPUT ? BCS READY ;1 NO KEYBOARD INPUT, SKIP CMPB R0,#LF ;1 LF ? BEQ READY ;YES, SKIP CMPB R0,#CTRLT ;TRANSMIT FILE ? BNE 1$ JSR PC,TRANS BR READY 1$: CMPB R0,#CTRLR ;OPEN RECEIVER FILE ? BNE 2$ JSR PC,OPEN BR READY 2$: CMPB R0,#CTRLD ;CLOSE RECEIVER FILE ? BNE 3$ JSR PC,CLOSE BR READY 3$: CMPB R0,#CTRLK ;BREAK CHARACTER ? BNE 4$ JSR PC,BREAK BR READY 4$: CMPB R0,#CTRLN ;CONTROL SHIFT ? BNE 9$ BISB #100,SHIFT ;SET SHIFT MASK BR READY 9$: CMPB R0,#CTRLX ;1 CONTROL X? BNE 10$ ;1 .EXIT ;1 QUIT. 10$: JSR PC,SEND ;SEND ALL OTHER CHAR BR READY ;***************************************************** ;1 TRANSMIT REQUESTED FILE TO REMOTE COMPUTER TRANS: .PRINT #MSGD BIC #050100,@#JSW ;1 KEYBOARD TO NORMAL MODE. MOV (SP)+,STACK ;1 SAVE RETURN ADDRESS. .CSISPC #OUTSP,#DEFEXT ;1 GET NAME OF FILE. MOV STACK,-(SP) ;1 RESTORE RETURN ADDRESS. BIS #050100,@#JSW ;1 KEYBOARD IN SPECIAL MODE .DSTAT #STAT,#INSPEC ;1 CHECK ON THE OUTPUT DEVICE. TST STAT+4 ;1 SEE IF THE DEVICE IS RESIDENT. BNE 20$ ;1 BRANCH IF ALREADY OPEN. .FETCH #HANLOD,#INSPEC ;1 IT'S NOT LOADED...BRING IT INTO MEMORY. BCC 20$ ;1 BRANCH IF SUCCESSFUL. .PRINT #FEFAIL ;1 FETCH FAILED...PRINT ERROR MESSAGE. RTS PC ;1 RETURN. 20$: .LOOKUP #AREA,#OUTCHN,#INSPEC ;1 OPEN OUTPUT FILE BCC 11$ JSR PC,FLERR ;OPEN ERROR 11$: CLR R2 ;BLOCK NO 1$: .READW #AREA,#OUTCHN,#BUFC,#256.,R2 ;READ A BLOCK BCS 4$ ;READ ERROR OR EOF ? MOV #512.,R4 ;NO, CHAR COUNT MOV #BUFC,R5 ;POINT TO BUFFER 2$: MOVB (R5)+,R0 ;GET CHAR TSTB R0 ;NULL ? BEQ 3$ ;YES, SKIP JSR PC,SEND ;SEND CHARACTER JSR PC,PRINT ;CHECK ECHO 3$: DEC R4 ;DEC CHAR COUNT BNE 2$ ;BLOCK DONE ? INC R2 ;YES, NEXT BLOCK BR 1$ ;AGAIN 4$: TSTB @#ERRWD ;EOF ? BEQ 9$ ;YES, DONE JSR PC,RDERR ;READ ERROR 9$: .CLOSE #OUTCHN ;CLOSE FILE JSR PC,PRINT ;CHECK PRINT .PRINT #MSGC ;FILE TRANSMITTED RTS PC ;***************************************************** ;OPEN INPUT FILE OPEN: .PRINT #MSGE BIC #050100,@#JSW ;1 KEYBOARD TO NORMAL MODE. MOV (SP)+,STACK ;1 SAVE RETURN ADDRESS. .CSISPC #OUTSP,#DEFEXT ;1 GET NAME OF FILE. MOV STACK,-(SP) ;1 RESTORE RETURN ADDRESS. BIS #050100,@#JSW ;1 KEYBOARD IN SPECIAL MODE .DSTAT #STAT,#INSPEC ;1 CHECK ON THE OUTPUT DEVICE. TST STAT+4 ;1 SEE IF THE DEVICE IS RESIDENT. BNE 20$ ;1 BRANCH IF ALREADY OPEN. .FETCH #HANLOD,#INSPEC ;1 IT'S NOT LOADED...BRING IT INTO MEMORY. BCC 20$ ;1 BRANCH IF SUCCESSFUL. .PRINT #FEFAIL ;1 FETCH FAILED...PRINT ERROR MESSAGE. RTS PC ;1 RETURN. 20$: .WAIT #INCHN ;1 CHANNEL ACTIVE ? BCS 1$ ;NO, CHANNEL AVAILABLE .PRINT #OPNERR ;FILE ALREADY OPEN, SKIP BR 9$ 1$: .ENTER #INAREA,#INCHN,#INSPEC,#-1 ;1 OPEN RECEIVER FILE BCC 2$ ;ERROR ? JSR PC,FLERR ;YES, OPEN ERROR 2$: MOV #BUFB,INPNT ;BUFFER POINTER CLR INBLK ;BLOCK COUNT MOV #512.,INCHR ;CHARACTER COUNT 9$: RTS PC ;***************************************************** CLOSE: .WAIT #INCHN ;CHANNEL ACTIVE ? BCC 1$ ;YES, CAN CLOSE .PRINT #CLSERR ;NO, ALREADY CLOSED BR 9$ 1$: MOVB #0,@INPNT ;PAD BUFFER WITH NULLS INC INPNT DEC INCHR BNE 1$ MOV #BUFB,R1 ;WRITE LAST BLOCK MOV INBLK,R3 .WRITW #AREA,#INCHN,R1,#256.,R3 BCC 2$ ;ERROR ? JSR PC,WRTERR ;WRITE ERROR 2$: .CLOSE #INCHN ;CLOSE FILE .PRINT #MSGB ;FILE CLOSED 9$: RTS PC ;***************************************************** BREAK: CLR R0 JSR PC,SEND1 ;SEND A NULL MOV #30.,R0 1$: BIS #1,@#XCSR ;SET BREAK BIT JSR PC,SEND1 ;SEND A NULL, 30 TIMES DEC R0 BNE 1$ JSR PC,SEND1 ;SEND A NULL BIC #1,@#XCSR ;CLEAR BREAK BIT RTS PC ;***************************************************** ;TRANSMIT A CHARACTER TO REMOTE SEND: JSR PC,SEND1 ;SEND CHARACTER CMPB R0,#LF ;1 WAS IT A LF ? BNE 9$ ;NO, SKIP MOV FILL,FILL1 ;SET NO. OF FILL CHAR MOVB #RUBOUT,R0 1$: JSR PC,SEND1 ;SEND RUBOUTS DEC FILL1 BNE 1$ 9$: RTS PC SEND1: TSTB @#XCSR ;BUSY ? BPL SEND1 ;AGAIN BICB SHIFT,R0 ;NO, MASK CONTROL SHIFT MOVB R0,@#XBUF ;SEND CHAR CLRB SHIFT ;CLEAR CONTROL SHIFT BYTE RTS PC ;***************************************************** ;PRINT REMOTE INPUTS AND TRANSMISSION ECHOS PRINT: TST BCOUNT ;ANY THING IN BUFFER ? BEQ 9$ ;NO, SKIP MOV R0,-(SP) ;SAVE REG R0 1$: MOVB @ADDR2,R0 ;GET CHARACTER BICB #200,R0 ;STRIP PARITY BIT INC ADDR2 ;ADVENCE PROC ADR PTR DEC BCOUNT ;DEC ACTIVE CHAR COUNT DEC CNT2 ;DEC PROC CHAR COUNT BNE 4$ ;END OF REC. BUFFER ? MOV #BUFA,ADDR2 ;YES, RESET PROC ADR PTR MOV #10000,CNT2 ;RESET PROC CHAR COUNT 4$: MOVB R0,CHRSAV ;SAVE CHARACTER .TTYOUT ;PRINT IT .WAIT #INCHN ;RECEIVER FILE ACTIVE ? BCS 3$ ;NO, SKIP CMPB CHRSAV,#177 ;RUBOUT ? BEQ 3$ ;YES, SKIP MOVB CHRSAV,@INPNT ;MOVE CHAR TO IN BUFFER INC INPNT ;ADVANCE POINTER DEC INCHR ;BLOCK FULL? BNE 3$ ;NO, SKIP MOV #BUFB,R1 ;YES, WRITE A BLOCK MOV INBLK,R3 .WRITE #AREA,#INCHN,R1,#256.,R3 BCC 2$ JSR PC,WRTERR ;WRITE ERROR 2$: INC INBLK ;RESET POINTERS MOV #512.,INCHR MOV #BUFB,INPNT 3$: TST BCOUNT ;DONE ? BNE 1$ ;NO, AGAIN MOV (SP)+,R0 9$: RTS PC ;***************************************************** ;INTERRUPT SERVICE ROUTINE RINT: INC BCOUNT ;INC ACTIVE CHAR COUNT MOVB @#RBUF,@ADDR ;MOVE TO RING BUFFER INC ADDR ;ADVANCE ADR POINTER DEC CNT ;DEC RING BUFFER CHAR CNT BNE 9$ ;END OF BUFFER ? MOV #BUFA,ADDR ;YES, RESET POINTERS MOV #10000,CNT 9$: RTI ;***************************************************** ;FATAL ERRORS - ABNORMAL TERMINATION FERR: .PRINT #MSG1 ;FETCH ERROR .EXIT FLERR: .PRINT #MSG2 ;OPEN FILE ERROR .EXIT WRTERR: .PRINT #MSG5 ;WRITE ERROR .EXIT RDERR: .PRINT #MSG3 ;READ ERROR .EXIT ;***************************************************** INAREA: .BLKW 10 INPNT: .WORD 0 ;RECEIVE BUFFER POINTER INBLK: .WORD 0 ;RECEIVE BLOCK COUNT INCHR: .WORD 0 ;RECEIVE CHAR COUNT ADDR: .WORD 0 ;RING BUFFER ADR PTR CNT: .WORD 0 ;RING BUFFER CHAR COUNT ADDR2: .WORD 0 ;PROCESS ADR PTR CNT2: .WORD 0 ;PROCESS CHAR COUNT BCOUNT: .WORD 0 ;ACTIVE CHAR COUNT JOB: .BLKW 12. ;1 AREA: .BLKW 10 AREA2: .BLKW 5 .WORD -1 .WORD 0 CHRSAV: .WORD 0 FILL: .WORD 4 ;FILL CHAR COUNT FILL1: .WORD 0 ;TEMP. FILL CHAR CNT SHIFT: .BYTE 0,0 ;CONTROL SHIFT MASK MSGA: .ASCIZ "# READY FOR REMOTE COMPUTER" MSGB: .ASCIZ "# INPUT FILE CLOSED" MSGD: .ASCIZ "# ENTER FILE TO OUTPUT" MSGC: .ASCIZ "# FILE TRANSMITTED" MSGE: .ASCIZ "# OPEN FILE FOR INPUT" MSG1: .ASCIZ "# DEVICE NOT FOUND" MSG2: .ASCIZ "# FILE OPEN ERROR" MSG3: .ASCIZ "# FILE READ ERROR" MSG5: .ASCIZ "# FILE WRITE ERROR" OPNERR: .ASCIZ "# FILE ALREADY OPEN" CLSERR: .ASCIZ "# FILE ALREADY CLOSED" FEFAIL: .ASCIZ "# FETCH FAILED" ;1 .EVEN BUFA: .BLKW 4000 ;RING BUFFER BUFB: .BLKW 256. ;RECIEVE BUFFER BUFC: .BLKW 256. ;TRANSMIT BUFFER STAT: .BLKW 4 ;1 BLOCK FOR STATUS. DEFEXT: .WORD 0,0,0,0 ;1 NO DEFAULT EXTENSIONS. MAREA: .BLKW 2. ;1 SCCA PARAMETER BLOCK. SCCA: .WORD 0 ;1 ^C^C STATUS WORD. STACK: .BLKW 1. ;1 OUTSP = . ;1 OUTPUT SPEC GOES HERE. INSPEC = .+30. ;1 INPUT SPEC GOES HERE. HANLOD = .+76. ;1 HANDLER LOADED HERE. .END START