.ENABL LC .TITLE EXEC .IDENT /V5.5/ .NLIST BEX ;Version 5.5 23-Nov-81 By Chuck Sadoian ;Corrected various bugs, added auto Tymnet log-on ;Improved binary transfer routine ;Version 5.0 - CompuServe "A" protocol added 19-Nov-81 ; By Chuck Sadoian ;Version 4.7 - TSX code, HT-11, corrections added 31-Oct-81 ; By: Chuck Sadoian ; PO Box 397 ; Dinuba, Calif 93618 ;Version 4.1 - Additions/corrections by Chuck Sadoian ; and Barry Shaklan (Litchfield Park, AZ) ; 31-AUG-81 ;VERSION 3.1 - Additions by: Duncan Tanner ; Livermore, CA. ; ; Added automatic receiver file close when it is full. ; Added feature which forces RT-11/HT-11 to read a fresh ; copy of the directory for the filesave and file transmit ; commands. This allows a disk change after the program ; is run without fear of destroyed directories. ;PROGRAM MODIFIED BY: Chuck Sadoian ; PO Box 397 ; Dinuba, Calif 93618 ; October 2, 1980 ;VERSION 3.0 ;VERSION 1.0 31-OCT-78 ;BY T.L.STARR AND L.T.NIEH ;GENERAL ELECTRIC CO (ORIGINAL AUTHORS) ;APPLIANCE PARK 35-1101 ;LOUISVILLE, KENTUCKY 40225 ; **********ASSEMBLY INSTRUCTIONS*********** ;EXEC will work under any RT-11 system, V2C and later, including ;HT-11. There are two options that can be selected at assembly ;time to allow the use of a DLV11E modem board and the ability ;to run EXEC under TSX-Plus 2.0 ;Set the DLV11E flag to 1 to assemble EXEC with the DLV11E ;option enabled. With the option enabled, EXEC will respond to the "B" ;command from the program to change the baud rate 'on the fly.' ;Another effect of the option causes EXEC to check the 'carrier' bit ;(bit 12) in the DLV11E status register when you try to exit ;using the "ESC" command. If the bit is set (indicating carrier is ;present), the program will print an error message and will not ;allow termination until the bit it cleared. DLV11E = 0 ;Set the TSX$FLG to 1 to assemble EXEC for TSX-Plus V2.0 or ;later system. Before using EXEC under TSX-Plus, you MUST ;have REAL-TIME program support sysgened into the system. You ;must allow for 2 interrupt connections. In addition, YOU MUST ;HAVE OPERATOR PRIVILEGES, and the program can only be run from ;the console terminal. TSX$FLG = 0 ;************************************************************ ;All EXEC commands begin with a LINE FEED, followed by ;any of the following keys (upper/lower case ok): ;ESC = Terminate EXEC program & drop modem line ;W = Toggle RECEIVE FILE ON AND OFF ;O = Exit EXEC to monitor [disable interrupts only] ;T = Transmit file ;R = Open receiver file ;D = Close receiver file ;K = Break ;P = Printer on code ;Z = Printer off code ;B = Set baud rate ;C = Toggle upper/lower case conversion ;H = Help with EXEC functions ;L = Auto logon to Tymnet/CIS ;The following characters function only while in the file ;transmit mode - they are NOT preceded by a LINE FEED ;CNTRL-Y = ABORT FILE TRANSMISSION ;SPACE = PAUSE WHEN TRANSMITTING FILE TO REMOTE ;********************************************************* ;Define modem I/O addresses and vector location RVEC=330 ;MODEM VECTOR ADDRESS RCSR=176530 ;MODEM RECEIVE STATUS ADDRESS RBUF=176532 ;MODEM RECEIVE BUFFER ADDRESS XCSR=176534 ;MODEM TRANSMIT STATUS ADDRESS XBUF=176536 ;MODEM TRANSMIT BUFFER ADDRESS ;************************* ;Declare various symbols CTRLS=23 ;CONTROL S (DC3 - XOFF) CTRLQ=21 ;CONTROL Q (DC1 - XON ) CTRLY=31 ;CONTROL Y RUBOUT=177 ;RUBOUT CR=15 ;CARRIAGE RETURN LF=12 ;LINE FEED SPACE=40 ;SPACE ; The following are used for CSEXEC transfer SI=17 ;Shift into protocol SO=16 ;Shift out of protocol NAK=25 ;Abort/end transfer DLE=20 ;Transparancy flag SOH=1 ;Start of text ETX=3 ;End of text EOT=4 ;End of transmission ESC=33 ;ESCAPE CHARACTER CTRLC=3 ;Control C ; CSEXEC Status word flags TFTYPE=1 ;0=ASCII transfer, 1=Binary Transfer TRNSFR=2 ;1=Data transfer in progress ESCFLG=4 ;1=Escape sequence in progress EOTFLG=10 ;1=EOT received MSKFLG=20 ;0=Ok to mask, 1=do not mask EXEFLG=40 ;1=Executive mode enabled ; Console terminal addresses/vector KVEC=60 ;KEYBOARD VECTOR KBUF=177562 ;KEYBOARD BUFFER KSTAT=177560 ;KEYBOARD STATUS REGISTER ERRWD=52 ;ERROR WORD JSW=44 ;JOB STATUS WORD OUTCHN=2 ;TRANSMIT CHANNEL NO. INCHN=3 ;RECEIVE CHANNEL NO. LPCHN=4 ;LINE PRINTER CHANNEL CSCHAN=5 ;CSEXEC channel ;***************************************************** .MCALL .REGDEF,.PRINT,.EXIT,.CSISPC .MCALL .ENTER,.LOOKUP,.FETCH,.READW .MCALL .TTYOUT,.WAIT,.WRITW,.CLOSE .MCALL .PURGE,.DEVICE,.SERR .REGDEF ;***************************************************** .IF NE TSX$FLG START: MOV #MAP,R0 ;Map I/O page EMT 375 BIT #10000,@#RCSR ;Timesharing line in use? BEQ 2$ .PRINT #MSG11 ;Yes, tell user .EXIT ;and exit to monitor 2$: MOV #LOCK,R0 ;Lock program in low memory EMT 375 MOV #MPEEK1,R0 ;Get current vector contents EMT 375 ;for modem line MOV R0,SAVE2 ;and save it MOV #MPEEK2,R0 ;Get priority EMT 375 MOV R0,SAVE3 ;and save it MOV #CPEEK1,R0 ;Get current vector contents EMT 375 ;for console line MOV R0,SAVE4 ;and save it MOV #CPEEK2,R0 ;Get priority EMT 375 MOV R0,SAVE5 ;and save it MOV #IEMT,R0 ;Attach completion routine EMT 375 BCC OK ;Error? TSXERR: MOVB @#52,R0 ;Yes, find out which one BEQ GENN DEC R0 BNE JOB .PRINT #NUMERR ;Code 1 .EXIT JOB: .PRINT #JOBERR ;Code 2 .EXIT GENN: .PRINT #GENERR ;Code 0 .EXIT OK: MOV #CONEMT,R0 EMT 375 BCC SETUP BR TSXERR .IFF START: MOV #RINT,@#RVEC ;Load interrupt vector MOV #300,@#RVEC+2 ;Priority 6 .ENDC SETUP: BIS #54000,@#RCSR ;Set to 300 baud .SERR ;LET PROGRAM HANDLE FATAL ERRORS MOV #LIMIT,FREE ;START OF FREE AREA MOV #BUFA,ADDR ;RING BUFFER ADR PTR MOV #4000,CNT ;RING BUFFER CHAR COUNT CLR BCOUNT ;ACTIVE CHAR COUNT MOV #BUFA,ADDR2 ;PROCESS ADR POINTER MOV #4000,CNT2 ;PROCESS CHAR COUNT MOV #BUFE,KADDR ;KEYBOARD BUFFER ADR PNTR MOV #240,KCNT ;KEYBOARD BUFFER CHAR COUNT CLR KCOUNT ;KEYBOARD ACTIVE CHAR COUNT MOV #BUFE,KADDR2 ;KEYBOARD PROCESS ADR PNTR MOV #240,KCNT2 ;KEYBOARD PROCESS CHAR COUNT .IF EQ TSX$FLG MOV @#KVEC,SAVE1 ;SAVE ADDRESS OF RT-11 KEYBOARD MOV #TTYINT,@#KVEC ;PUT IN OUR ADDRESS BIS #100,@#KSTAT ;ENABLE INTERRUPTS .ENDC .PRINT #CLS ;Clear screen .PRINT #MSGA ;Sign on BIS #102,@#RCSR ;ENABLE INTERRUPT ;FORCE DTR CLR CMDFLG CLR CSSTAT ;Clear status word ;***************************************************** ;MAIN PROGRAM LOOP READY: JSR PC,PRINT ;CHECK PRINT BUFFER BIT #ESCFLG,CSSTAT ;Escape sequence in progress (CSEXEC)? BEQ 2$ ;No, continue JSR PC,CSEXEC ;Else go do protocol CLR CSSTAT ;Clear executive mode 2$: JSR PC,TTYIN ;KEYBOARD INPUT ? BCS READY ;No, loop JSR PC,CKMND ;Check for EXEC commands BR READY ;***************************************************** ;Check for EXEC commands ckmnd: CMPB R0,#RUBOUT ;A rubout? BNE 2$ MOV #10,R0 ;Substitute a backspace 2$: TST CMDFLG ;COMMAND SEQENCE IN PROG? BEQ 34$ ;NO, TRY TO SEND CHARACTER CLR CMDFLG ;ELSE PROCESS COMMAND SEQUENCE JSR PC,LCCVT ;Make sure commands are UC CMPB R0,#'L ;Login to Tymnet? BNE 4$ ;No, check again JSR PC,LOGIN RTS PC 4$: CMPB R0,#'C ;Upper lower case toggle? BNE 6$ JSR PC,SETLC ;Go set toggle RTS PC 6$: CMPB R0,#'T ;TRANSMIT FILE ? BNE 8$ JSR PC,TRANS RTS PC 8$: CMPB R0,#'R ;OPEN RECEIVER FILE ? BNE 10$ JSR PC,OPEN RTS PC 10$: CMPB R0,#'D ;CLOSE RECEIVER FILE ? BNE 12$ JSR PC,CLOSE RTS PC 12$: CMPB R0,#'K ;BREAK CHARACTER ? BNE 14$ JSR PC,BREAK RTS PC 14$: .IF EQ TSX$FLG CMPB R0,#'O ;Exit to monitor? BNE 16$ BIC #100,@#RCSR ;Disable interrupts JMP EXITC .ENDC 16$: CMPB R0,#ESC ;Terminate program? BNE 18$ JMP EXIT ;Terminate EXEC 18$: CMPB R0,#'P ;OPEN LP? BNE 20$ JSR PC,LPOPN ;OPEN LINE PRINTER CHAN. MOVB @#KBUF,R0 20$: CMPB R0,#'Z ;CLOSE LINE PRINTER? BNE 22$ JSR PC,LPCLS ;CLOSE LP RTS PC 22$: CMPB R0,#'W ;CHECK FOR TOGGLE INPUT BNE 28$ ;NO, Continue TST RXFLG ;IS FILE OPEN NOW? BNE 24$ ;No, skip toggle RTS PC 24$: TST TGFLG ;Current Flag Status? BEQ 26$ ;Flag is 0, we want a 1 CLR TGFLG ;Flag was 1, now 0 RTS PC 26$: INC TGFLG ;Change Flag from 0 to 1 RTS PC 28$: .IF NE DLV11E CMPB R0,#'B ;Set baud rate? BNE 30$ ;no JSR PC,STBAUD 30$: .ENDC CMPB R0,#'H ;Help? BNE 32$ .PRINT #HLPMSG ;Print help message RTS PC 32$: CMPB R0,#LF ;A LF? BEQ XMIT ;send it RTS PC 34$: CMPB R0,#LF ;LINE FEED? BNE XMIT INC CMDFLG RTS PC XMIT: JSR PC,SEND ;SEND ALL OTHER CHAR RTS PC ;***************************************************** ;Process CSEXEC escape sequences here CSEXEC: BIC #ESCFLG!TRNSFR,CSSTAT ;Clear escape & transfer bits CLR ERRFLG ;Clear error flag JSR PC,HOSTIN ;Get character from host BCS 4$ ;Abort? CMPB R0,#'I ;Send ID string? BNE 2$ ; JMP SNDID ;Send ID string to host 2$: CMPB R0,#'A ;Initialize for data transmission? BNE 4$ JMP MNTRAN ;Go to transfer routine 4$: JMP ABORT ;Else abort the sequence ;***************************************************** ;Initialize for CSEXEC data transfer MNTRAN: .PRINT #MSGO ;Tell user we are initializing MOV #'0,RECNBR ;Init record number JSR PC,GET1 ;Get a command line BCS 6$ ;Abort? CMPB 1(R3),#'A ;ASCII transfer? BEQ 2$ ;Yes, continue BIS #TFTYPE,CSSTAT ;Else set Binary transfer 2$: CMPB (R3),#'U ;Upload? BNE 4$ ;no JMP UPLOAD ;Else go do upload 4$: CMPB (R3),#'D ;Download? BNE 6$ ;No, abort JMP DNLOAD ;Else go do download 6$: JMP ABORT ;Abort ;***************************************************** ;Routine to pharse filespec PHARSE: BIS #TRNSFR,CSSTAT ;We are transferring now MOV #CSBUFF,R3 ;Point to buffer TST (R3)+ ;Point to filespec MOV #FBUFF,R1 ;Point to CSI buffer 2$: CMPB (R3),#CR ;End of filespec? BEQ 4$ MOVB (R3)+,(R1)+ ;Move byte into buffer BR 2$ 4$: MOVB #'=,(R1)+ ;Finish filespec CLRB (R1) MOV #FBUFF,R1 ;Reset to start of buffer MOV SP,R2 ;Save stack .CSISPC #OUTSP,#DEXT,R1 ;process filename MOV R2,SP ;Restore stack BCC 8$ ;Error? .PRINT #MSG9 ;Yes, tell user 6$: SEC ;Set abort flag RTS PC ;and return 8$: MOV FREE,R0 ;Get current free area .FETCH R0,#OUTSP ;Load handler BCC 10$ ;Error? .PRINT #MSG1 ;Yes, fetch error BR 6$ ;Abort transfer 10$: MOV R0,FREE ;Update free area .PURGE #CSCHAN ;Clear channel first .IF EQ TSX$FLG MOV @#54,R0 ;Force directory read CLR 256(R0) ;So we can interchange disks .ENDC CLC ;Clear abort flag RTS PC ;and return ;***************************************************** ;Routine to handle downloading DNLOAD: .PRINT #MSGL ;Download message JSR PC,PHARSE ;Pharse filespec BCC 2$ ;Error? JMP ABORT ;Yes, abort it 2$: .LOOKUP #CSAREA,#CSCHAN,#OUTSP ;See if file exists BCS 6$ ;No, you can open it ok .PRINT #MSGQ ;Else ask user what to do .PURGE #CSCHAN ;Purge channel first 4$: JSR PC,TTYIN ;Get input BCS 4$ JSR PC,LCCVT ;Upper case only .TTYOUT ;Echo the response JSR PC,CRLF ;CR/LF for formatting CMPB R0,#'S ;Supercede? BEQ 6$ ;Yes JMP ABORT ;Else abort transfer 6$: .ENTER #CSAREA,#CSCHAN,#OUTSP,#0 ;Open the file BCC 10$ ;Error? 8$: .PRINT #MSG2 ;File open error .PURGE #CSCHAN ;Dump channel JMP ABORT ;and abort transfer 10$: TST R0 ;No room for file [TSX only] BEQ 8$ ;Yes, open error MOV R0,CSMAX ;Save size of file MOV #BUFC,CSPNT ;Set up buffer pointer MOV #512.,CSCHR ;Character count CLR CSBLK ;Block count DOWN1: JSR PC,GETBLK ;Get a checksummed block of data BCC 2$ INC ERRFLG ;Set error flag BR 10$ ;And attempt to close file 2$: BIT #EOTFLG,CSSTAT ;End of transmission? BNE 10$ ;Yes, wrap it up MOVB (R3)+,@CSPNT ;Move character into buffer INC CSPNT ;Increment pointer DEC CSCHR ;Block full? BNE 8$ ;No, continue .WRITW #AREA2,#CSCHAN,#BUFC,#256.,CSBLK BCC 4$ ;Error? .PRINT #MSG5 ;Write error .PURGE #CSCHAN ;Dump channel JMP ABORT 4$: INC CSBLK ;Next block CMP CSBLK,CSMAX ;Is this the last block? BLT 6$ ;No INC ERRFLG ;Set error flag .PRINT #MSGR ;Tell user BR 12$ 6$: MOV #512.,CSCHR ;Reset pointers MOV #BUFC,CSPNT 8$: DEC MSGLEN ;Message finished? BNE 2$ ;No, back for more BR DOWN1 ;Else get another line 10$: MOVB #0,@CSPNT ;Pad buffer with nulls INC CSPNT DEC CSCHR BNE 10$ .WRITW #AREA2,#CSCHAN,#BUFC,#256.,CSBLK BCC 12$ .PRINT #MSG5 ;Error? 12$: .CLOSE #CSCHAN ;Close it TST ERRFLG ;Check if error in progress BEQ 14$ ;No error, continue JMP ABORT ;Else abort transmission 14$: MOVB #'.,R0 ;Tell host we got it JSR PC,SEND RTS PC ;***************************************************** ;Routine to handle uploading UPLOAD: .PRINT #MSGM ;Beginning upload message JSR PC,PHARSE ;Pharse filespec BCC 2$ ;Error? JMP ABORT ;Yes, abort this 2$: .LOOKUP #CSAREA,#CSCHAN,#OUTSP ;Open file BCC 4$ ;File exists? .PRINT #MSG10 ;File not found message JMP ABORT ;No, abort transfer 4$: BIC #MSKFLG,CSSTAT ;Allow normal masking CLR UPBLK ;Block number to read MOVB #'.,R0 ;Tell host we are ready JSR PC,SEND JSR PC,HOSTIN ;Get character from host BCS 8$ ;Abort? CMPB R0,#'. ;Right prompt? BNE 8$ ;No, abort this 6$: .READW #CSAREA,#CSCHAN,#BUFC,#256.,UPBLK ;Read a block BCC 10$ ;error or EOF? TSTB @#ERRWD ;EOF? BEQ 16$ ;Yes, transfer finished 8$: .CLOSE #CSCHAN ;Else read error, close chan JMP ABORT 10$: MOV #CSBUFF,R3 ;Point to start of CS buffer MOV #BUFC,R2 ;Get address of input file buffer CLR MSGLEN ;Init message length 12$: MOVB (R2)+,(R3)+ ;Put data in buffer INC MSGLEN ;bump counter CMP MSGLEN,#256. ;Buffer full? BNE 12$ ;No, back for more JSR PC,SNDBLK ;Send a checksummed line BCS 8$ MOV #CSBUFF,R3 ;Point to start of CS buffer CLR MSGLEN ;Init message length 14$: MOVB (R2)+,(R3)+ ;put second half of block in INC MSGLEN CMP MSGLEN,#256. ;Buffer full? BNE 14$ ;No, back for more JSR PC,SNDBLK ;send a checksummed line BCS 8$ INC UPBLK ;next block BR 6$ ;back for another block 16$: .CLOSE #CSCHAN ;close input channel BIS #MSKFLG,CSSTAT ;Clear mask MOV #1,MSGLEN ;Message length MOV #EOT,@#CSBUFF ;send EOT JSR PC,SNDBLK ;send checksummed line BCS 8$ RTS PC ;***************************************************** ;Send a checksummed block to remote SNDBLK: TST MSGLEN ;No message? BEQ 20$ INC RECNBR ;bump record number CMPB RECNBR,#'9 ;Roll over? BLOS 2$ ;No MOVB #'0,RECNBR ;Else reset record number 2$: MOV #CSBUFF,R3 ;point to buffer MOV MSGLEN,R1 ;message length CLR CKSUM ;Clear checksum MOVB #SOH,R0 ;Start the message JSR PC,SEND MOVB RECNBR,R0 ;send record number JSR PC,SEND JSR PC,UPDATE ;update checksum 4$: MOVB (R3)+,R0 ;Get data byte JSR PC,UPDATE ;Update checksum TSTB R0 ;Is this character a null? BEQ 6$ ;Yes, don't display it BIT #TFTYPE,CSSTAT ;ASCII transfer? BNE 6$ ;No, binary, don't display .TTYOUT ;Else display is ASCII 6$: BIT #MSKFLG,CSSTAT ;Ok to mask? BNE 12$ ;No, if flag set CMPB R0,#4 ;A control character? BHI 10$ ;no 8$: BISB #100,R0 ;Mask it MOVB R0,R4 ;Save character MOVB #DLE,R0 JSR PC,SEND ;Send mask MOVB R4,R0 ;Restore character 10$: CMPB R0,#17 ;Mask ASCII 17-25 BLO 12$ CMPB R0,#25 BLOS 8$ 12$: JSR PC,SEND ;Send character DEC R1 ;Decrement counter BNE 4$ ;Message finished MOVB #ETX,R0 ;Send End of text JSR PC,SEND CMPB CKSUM,#40 ;Cksum <40? BHIS 14$ ;nope MOVB #DLE,R0 ;send it masked JSR PC,SEND BISB #100,CKSUM ;Mask it 14$: MOVB CKSUM,R0 ;send it JSR PC,SEND 16$: JSR PC,HOSTIN ;Get host's reply BCS 22$ ;Abort? BIT #TFTYPE,CSSTAT ;Binary transfer? BEQ 18$ ;No, no need to display reply .TTYOUT ;Else display the reply 18$: CMPB R0,#'. ;Transmission ok? BEQ 20$ ;Yes, return CMPB R0,#'/ ;Invalid transmission? BNE 16$ ;No, try to get another reply .PRINT #MSGP ;Tell user we are re-sending BR 2$ 20$: CLC ;clear abort flag RTS PC ;and return 22$: SEC ;Set abort flag RTS PC ;***************************************************** ;Routine to receive a checksummed block from remote GETBLK: MOVB #'.,R0 ;Prompt remote for next record JSR PC,SEND BIT #TFTYPE,CSSTAT ;Binary transfer? BEQ GET1 ;No, don't display prompt .TTYOUT ;Else dusplay it (Binary) GET1: INC RECNBR ;bump record number CMPB RECNBR,#'9 ;Roll over? BLOS 2$ ;No MOVB #'0,RECNBR ;Else reset record number 2$: MOV #CSBUFF,R3 ;Get start of buffer JSR PC,HOSTIN ;Get a character from remote BCC 6$ ;Abort? 4$: RTS PC ;Yes, return 6$: CMPB R0,#SOH ;Start of heading? BEQ 8$ ;Yes, start receiving the record CMPB R0,#ETX ;ETX by itself is questionable BNE 2$ MOVB #'/,R0 ;Send a logical nak JSR PC,SEND BR 2$ 8$: CLR CKSUM ;Clear checksum BIC #EOTFLG,CSSTAT ;Clear EOT bit CLR MSGLEN ;and message length 10$: JSR PC,HOSTIN ;Get sender's record number BCS 4$ MOVB R0,RECHST ;Save host record number BR 24$ ;and update checksum 12$: JSR PC,HOSTIN ;Get a character BCS 4$ CMPB R0,#NAK ;A nak? BNE 14$ SEC ;Set for abort RTS PC 14$: CMPB R0,#ETX ;End of text? BEQ 26$ CMPB R0,#EOT ;End of transmission? BNE 16$ BIS #EOTFLG,CSSTAT ;set end of transmission flag 16$: CMPB R0,#DLE ;Masked character comming? BNE 20$ ;No 18$: JSR PC,HOSTIN ;Else get next character BCS 4$ BICB #340,R0 ;Make control character 20$: BIT #TRNSFR,CSSTAT ;Transfer in progress? BEQ 22$ ;No, don't display this BIT #TFTYPE,CSSTAT ;Binary transfer? BNE 22$ ;Yes, don't display this TSTB R0 ;Null byte? BEQ 22$ ;Then don't display it .TTYOUT ;Display byte 22$: MOVB R0,(R3)+ ;Move character into buffer INC MSGLEN ;Bump message length 24$: JSR PC,UPDATE ;Update checksum BR 12$ ;And back for more 26$: JSR PC,HOSTIN ;Get checksum BCS 4$ CMPB R0,#DLE ;Masked? BNE 30$ 28$: JSR PC,HOSTIN ;Get masked character BCS 4$ BICB #340,R0 ;Unmask character 30$: CMPB CKSUM,R0 ;Checksum match? BEQ 34$ ;Yes, continue 32$: .PRINT #MSGP ;No, tell user MOVB #'/,R0 ;and request retransmission JSR PC,SEND BIT #TFTYPE,CSSTAT ;Binary transfer? BEQ 2$ ;No, don't display reply .TTYOUT ;Else display it BR 2$ ;and start over 34$: CMPB RECNBR,RECHST ;Record numbers match? BEQ 36$ ;No, duplicate record MOVB #'.,R0 ;Accept it and request another block JSR PC,SEND BIT #TFTYPE,CSSTAT ;Binary transfer? BEQ 2$ ;No, don't display it .TTYOUT ;Else display it BR 2$ 36$: MOV #CSBUFF,R3 ;Point to start of buffer RTS PC ;***************************************************** ;Routine to update checksum UPDATE: MOVB CKSUM,R4 ;Get checksum ASLB R4 ;Rotate 1 bit left ADC R4 ;Add carry (if any) MOVB R4,R4 ;Sign extend it ADD R0,R4 ;Add new checksum ADC R4 ;Add carry (if any) MOVB R4,CKSUM ;save new checksum RTS PC ;***************************************************** ;Send ID string to host SNDID: .PRINT #MSGK ;Tell user we are sending ID MOV #SYSID,R1 ;Get address of ID string JSR PC,SNDLIN ;Send it RTS PC ;***************************************************** ;Routine to get character from Remote HOSTIN: JSR PC,SCAN ;Check keyboard for abort BCC 2$ ;Abort this? RTS PC ;Yes 2$: JSR PC,REMOTE ;Check remote input BCS HOSTIN ;Loop if nothing 4$: CMPB R0,#NAK ;Abort this? BNE 6$ ;No SEC ;Else set abort flag RTS PC 6$: CLC ;Clear abort flag RTS PC ;and return ;***************************************************** ;Abort CSEXEC mode here ABORT: .PRINT #MSGN ;Inform user CLR CSSTAT ;Clear status word MOVB #NAK,R0 ;Send a nak to host JSR PC,SEND ;to kill transfer RTS PC ;and return to terminal mode ;***************************************************** ;Scan keyboard for abort character SCAN: JSR PC,TTYIN ;Check keyboard BCS 4$ ;Nothing entered CMPB R0,#CTRLC ;Was character a CTRL-C? BEQ 2$ ;Yes, abort this JSR PC,SEND ;Else send character BR 4$ 2$: SEC ;Set carry flag for abort RTS PC ;Return 4$: CLC ;Clear abort flag RTS PC ;Return ;***************************************************** ;TRANSMIT FILE TO THE REMOTE COMPUTER TRANS: .PRINT #MSG8A ;ASK FOR FILESPEC JSR PC,FILSPC ;GET FILESPEC TST ERRFLG ;ERROR? BNE RETRN ;Yes, abort MOV FREE,R1 ;FETCH HANDLER .FETCH R1,#OUTSP BCC 2$ ;ERROR? .PRINT #MSG1 ;YES, INFORM USER RTS PC ;AND RETURN 2$: MOV R0,FREE ;UPDATE FREE MEMORY .IF EQ TSX$FLG MOV @#54,R0 ;Get RMON location CLR 256(R0) ;Force directory read .ENDC .LOOKUP #AREA,#OUTCHN, #OUTSP ;OPEN TRANSMIT FILE BCC 4$ ;ERROR? .PRINT #MSG10 ;YES, FILE NOT FOUND RTS PC ;AND RETURN 4$: .PRINT #MSGD CLR R2 ;BLOCK NO 6$: .READW #AREA,#OUTCHN,#BUFC,#256.,R2;READ A BLOCK BCS 18$ ;READ ERROR OR EOF ? MOV #512.,R4 ;NO, CHAR COUNT MOV #BUFC,R5 ;POINT TO BUFFER 8$: MOVB (R5)+,R0 ;GET CHAR TSTB R0 ;NULL ? BEQ 16$ ;YES, SKIP CMPB R0,#LF ;LF? BEQ 16$ ;YES, SKIP TST HNDSK ;Ok to send to remote? BEQ 10$ ;Yes JSR PC,PAUSE ;Else wait for remote to clear 10$: JSR PC,SEND ;SEND CHARACTER JSR PC,PRINT ;CHECK ECHO JSR PC,TTYIN ;CHECK KEYBOARD BCS 16$ ;CONTINUE IF NOTHING CMPB R0,#SPACE ;A SPACE? BNE 14$ ;NO, GO ON 12$: JSR PC,PRINT ;CHECK PRINT JSR PC,TTYIN ;ELSE WAIT FOR A CHARACTER BCS 12$ 14$: CMPB R0,#CTRLY ;CNTRL-Y? BNE 16$ ;NO GO ON .PURGE #OUTCHN ;DUMP CHANNEL .PRINT #MSGH ;PRINT MESSAGE RTS PC 16$: DEC R4 ;DEC CHAR COUNT BNE 8$ ;BLOCK DONE ? INC R2 ;YES, NEXT BLOCK BR 6$ ;AGAIN 18$: TSTB @#ERRWD ;EOF ? BEQ 20$ ;YES, DONE .PRINT #MSG3 ;NO, READ ERROR 20$: .CLOSE #OUTCHN ;CLOSE FILE JSR PC,PRINT ;CHECK PRINT .PRINT #MSGC ;FILE TRANSMITTED RETRN: RTS PC ;***************************************************** ;OPEN RECEIVER FILE OPEN: .WAIT #INCHN ;CHANNEL ACTIVE ? BCS 2$ ;NO, CHANNEL AVAILABLE .PRINT #OPNERR ;FILE ALREADY OPEN, SKIP BR 16$ 2$: .PRINT #MSG8 ;ASK USER FOR FILE NAME JSR PC,FILSPC ;GET FILE NAME TST ERRFLG ;ERROR? BNE 16$ ;Yes, abort 4$: MOV FREE,R1 .FETCH R1,#OUTSP ;GET HANDLER BCC 6$ ;ERROR? .PRINT #MSG1 ;FETCH ERROR RTS PC ;RETURN 6$: MOV R0,FREE ;UPDATE FREE AREA .IF EQ TSX$FLG MOV @#54,R0 ;Get RMON address CLR 256(R0) ;Force directory read .ENDC .LOOKUP #INAREA,#INCHN,#OUTSP ;FILE EXISTS? BCS 10$ ;NO, CREATE IT .PRINT #MSGI ;ASK USER FOR PERMISSION .PURGE #INCHN ;Clear I/O channel first 8$: JSR PC,TTYIN ;KEYBOARD BCS 8$ JSR PC,LCCVT ;Make sure only UC .TTYOUT ;Echo the character JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'S ;Supercede? BEQ 10$ ;Yes CMPB R0,#'R ;Re-enter filespec? BEQ 2$ ;Yes .PRINT #MSGJ ;Else file is not superceded RTS PC 10$: .ENTER #INAREA,#INCHN,#OUTSP,#0;OPEN RECEIVER FILE BCC 14$ ;ERROR ? 12$: .PRINT #MSG2 ;YES, OPEN ERROR .PURGE #INCHN ;Dump channel RTS PC ;AND RETURN 14$: TST R0 ;No room for file [TSX] BEQ 12$ ;File error MOV #BUFB,INPNT ;BUFFER POINTER CLR INBLK ;BLOCK COUNT MOV #512.,INCHR ;CHARACTER COUNT MOV R0,MAXBLK ;SAVE FILESIZE JUST IN CASE .PRINT #MSGE ;FILE OPEN MESSAGE CLR TGFLG INC RXFLG 16$: RTS PC ;***************************************************** FCLOSE: MOV #CTRLS,R0 ;SHUT OFF REMOTE JSR PC,SEND ;SEND CNTRL-S DEC INBLK ;RESTORE LAST BLOCK .PRINT #MSG12 ;TELL USER THE FILE IS FULL .CLOSE #INCHN ;CLOSE THE FILE .PRINT #MSGB ;TELL USER IT IS CLOSED CLR RXFLG CLR TGFLG RTS PC ;***************************************************** CLOSE: TST RXFLG ;CHANNEL ACTIVE ? BNE 2$ ;YES, CAN CLOSE .PRINT #CLSERR ;NO, ALREADY CLOSED BR 6$ 2$: MOVB #0,@INPNT ;PAD BUFFER WITH NULLS INC INPNT DEC INCHR BNE 2$ MOV #BUFB,R1 ;WRITE LAST BLOCK MOV INBLK,R3 .WRITW #AREA,#INCHN,R1,#256.,R3 BCC 4$ ;ERROR ? .PRINT #MSG5 4$: .CLOSE #INCHN ;CLOSE FILE .PRINT #MSGB ;FILE CLOSED CLR RXFLG 6$: RTS PC ;***************************************************** BREAK: CLR R0 JSR PC,SEND ;SEND A NULL MOV #30.,R1 2$: BIS #1,@#XCSR ;SET BREAK BIT JSR PC,SEND ;SEND A NULL, 30 TIMES DEC R1 BNE 2$ JSR PC,SEND ;SEND A NULL BIC #1,@#XCSR ;CLEAR BREAK BIT RTS PC ;***************************************************** ;TRANSMIT A CHARACTER TO REMOTE SEND: TSTB @#XCSR ;BUSY ? BPL SEND ;AGAIN 2$: BIT #EXEFLG,CSSTAT ;Executive mode? BNE 4$ ;Yes, transfer byte untouched JSR PC,LCOPT ;Check if LC ok 4$: MOVB R0,@#XBUF ;SEND CHAR 6$: RTS PC ;***************************************************** ;PAUSE ROUTINE PAUSE: MOV R0,-(SP) ;Save R0 2$: TST HNDSK ;Ok to resume sending? BEQ 4$ ;Yes JSR PC,PRINT ;CHECK REMOTE ECHO JSR PC,TTYIN ;KEYBOARD INPUT BCS 2$ ;NO, SKIP BICB #200,R0 ;STRIP PARITY CMPB R0,#CTRLQ ;Control Q? BNE 2$ ;No, wait some more 4$: CLR HNDSK MOV (SP)+,R0 ;Restore R0 RTS PC ;***************************************************** ;PRINT REMOTE INPUTS AND TRANSMISSION ECHOS PRINT: JSR PC,REMOTE ;Character to print? BCC 2$ ;Yes, process RTS PC ;Else return 2$: BICB #200,R0 ;Strip parity JSR PC,LCOPT ;Check if LC ok BIT #EXEFLG,CSSTAT ;protocol mode enabled? BEQ PRINT1 ;no, skip this CMPB R0,#SO ;Shift out of protocol mode? BNE 4$ ;no CLR CSSTAT ;Else clear status word RTS PC 4$: CMPB R0,#ESC ;escape sequence starting? BNE PRINT1 ;No, continue processing BIS #ESCFLG,CSSTAT ;Set escape sequence flag RTS PC ;and return PRINT1: MOVB R0,CHRSAV ;SAVE CHARACTER .TTYOUT ;PRINT IT TST RXFLG ;RECEIVER FILE ACTIVE ? BEQ 10$ ;NO, SKIP CMPB CHRSAV,#RUBOUT ;RUBOUT ? BEQ 10$ ;YES, SKIP CMPB R0,#LF ;Line feed? BNE 4$ ;No, skip TST TGFLG ;IS FILE TOGGLE ON OR OFF? BEQ 2$ ;Toggle on MOVB #'*,R0 ;Tell user filesave is off .TTYOUT BR 10$ 2$: MOV #':,R0 ;Filesave is on .TTYOUT 4$: TST TGFLG ;Filesave on? BNE 10$ ;No, skip this MOVB CHRSAV,@INPNT ;MOVE CHAR TO IN BUFFER INC INPNT ;ADVANCE POINTER DEC INCHR ;BLOCK FULL? BNE 10$ ;NO, SKIP MOV #BUFB,R1 ;YES, WRITE A BLOCK MOV INBLK,R3 .WRITW #AREA,#INCHN,R1,#256.,R3 BCC 6$ ;ERROR? JMP RXFATL ;YES, FATAL ERROR 6$: INC INBLK ;RESET POINTERS CMP INBLK,MAXBLK ;IS THIS THE LAST BLOCK? BLT 8$ ;NO KEEP GOING JSR PC,FCLOSE ;YES, FORCE FILE CLOSED BR 10$ 8$: MOV #512.,INCHR MOV #BUFB,INPNT 10$: TST LPFLG ;LINE PRINTER ACTIVE? BEQ 14$ ;NO, SKIP MOVB CHRSAV,@LPPNT ;MOVE CHAR INTO BUFFER INC LPPNT ;BUMP POINTER DEC LPCHR ;BLOCK FULL? BNE 14$ ;NO, SKIP MOV #BUFD,R1 ;YES, WRITE A BLOCK MOV LPBLK,R3 .WRITW #LAREA,#LPCHN,R1,#256.,R3 BCC 12$ ;ERROR? JMP LPFATL ;YES, FATAL ERROR 12$: INC LPBLK MOV #512.,LPCHR ;RESET POINTERS MOV #BUFD,LPPNT 14$: TST KCOUNT ;Keyboard need servicing? BNE RET ;Yes, go check it JMP PRINT ;Yes, back to print it RET: RTS PC ;***************************************************** ;PRINTER ENABLE LPOPN: .WAIT #LPCHN ;CHANNEL ACTIVE? BCS 2$ ;NO, CHANNEL AVAILABLE .PRINT #MSG6 ;ALREADY OPEN, SKIP BR 8$ 2$: .PRINT #MSGF MOV FREE,R1 .FETCH R1,#LPNAME ;GET LP HANDLER BCC 4$ .PRINT #MSG1 ;ERROR, TELL USER RTS PC ;AND EXIT 4$: MOV R0,FREE ;UPDATE FREE AREA .ENTER #LPAREA,#LPCHN,#LPNAME ;OPEN RECEIVER FILE BCC 6$ ;ERROR? .PRINT #MSG6 BR 8$ 6$: MOV #BUFD,LPPNT ;BUFFER POINTER CLR LPBLK ;BLOCK COUNT MOV #512.,LPCHR ;CHARACTER COUNT INC LPFLG 8$: RTS PC ;***************************************************** ;CLOSE LINE PRINTER CHANNEL LPCLS: TST LPFLG ;LP ACTIVE? BNE 2$ ;YES, CAN CLOSE .PRINT #MSG7 ;NO, NOT ACTIVE BR 6$ 2$: MOVB #0,@LPPNT ;PAD WITH NULLS INC LPPNT DEC LPCHR BNE 2$ MOV #BUFD,R1 ;WRITE LAST BLOCK MOV LPBLK,R3 .WRITW #LAREA,#LPCHN,R1,#256.,R3 BCC 4$ .PRINT #MSG5 4$: .CLOSE #LPCHN .PRINT #MSGG ;PRINT MESSAGE CLR LPFLG 6$: RTS PC ;***************************************************** ;ROUTINE TO GET FILESPEC FILSPC: MOV #FBUFF,R4 ;SET UP BUFFER 2$: JSR PC,TTYIN ;GET KEYBOARD INPUT BCS 2$ CMPB R0,#RUBOUT ;DELETE CHAR? BNE 4$ CMPB R4,#FBUFF ;No characters to delete? BEQ 2$ DEC R4 ;Else back up buffer MOV #10,R0 ;Backspace cursor .TTYOUT MOV #40,R0 ;and delete character .TTYOUT MOV #10,R0 .TTYOUT BR 2$ 4$: CMPB R0,#LF ;A line feed? BEQ 2$ ;Ignore it CMPB #10,R0 ;Backspace? BEQ 2$ ;IGNORE BACKSPACES .TTYOUT CMPB R0,#CR ;A CR? BEQ 6$ ;YES, FINISH CMP R4,#FBUFF+80. ;END OF BUFFER? BHI 2$ ;YES, WAIT FOR LF MOVB R0,(R4)+ ;ELSE STORE CHARACTER BR 2$ 6$: jsr pc,crlf ;Send CR/LF for formatting CMPB R4,#FBUFF ;Nothing entered? BEQ 8$ ;Yes, error MOVB #'=,(R4)+ ;FINISH FILESPEC FOR CSI CLRB (R4) ; MOV #FBUFF,R4 ;RESET BUFFER ADDRESS MOV SP,R5 ;SAVE STACK POINTER .CSISPC #OUTSP,#DEXT,R4 ;CSI IN SPECIAL MODE MOV R5,SP ;RESTORE STACK BCC 10$ ;ERROR IN FILESPEC? 8$: .PRINT #MSG9 ;YES, INFORM USER INC ERRFLG ;SET ERROR FLAG BR 12$ 10$: CLR ERRFLG 12$: RTS PC ;RETURN ;***************************************************** ;Routine to auto-log into MicroNet via Tymnet LOGIN: MOV #LOG1,R1 ;Send CPS;WELCOME JSR PC,SNDLIN ;Send a line to remote MOV #FBUFF,R2 ;Get address for buffer 2$: JSR PC,GTCHAR ;Check for reply BCS 10$ ;Abort is error flag .TTYOUT ;Echo the character JSR PC,LCCVT ;Convert to UC CMPB R0,#': ;Prompt found? BEQ LOGIN ;Yes, try to send ID again CMPB R0,#'D ;Look for "D" in "User ID" BNE 2$ ;Not found 4$: JSR PC,GTCHAR ;Get next character BCS 4$ ;Loop if nothing CMPB R0,#': ;Prompt character? BNE 2$ ;No, must be error 6$: MOV #LOG2,R1 ;Send User ID JSR PC,SNDLIN 8$: JSR PC,GTCHAR ;Check response BCS 10$ ;Abort if flag set .TTYOUT ;Display it CMPB R0,#': ;Prompt character? BNE 8$ ;No, check again MOV #LOG3,R1 ;Send password JSR PC,SNDLIN 10$: RTS PC ;And return ;***************************************************** ;Routine to get a character and check for CNTRL-C abort GTCHAR: JSR PC,TTYIN ;Check keyboard first BCS 2$ ;Character is available CMPB R0,#CTRLC ;A CNTRL-C? BEQ 4$ ;Yes, set abort flag 2$: JSR PC,REMOTE ;Anything from remote? BCS GTCHAR ;No, keep looping BICB #200,R0 ;Clear parity CLC ;Else clear carry RTS PC ;And return 4$: SEC ;Set carry flag (abort) RTS PC ;And return ;***************************************************** ;Routine to send a line to the remote SNDLIN: TSTB (R1) ;End of message? BEQ 2$ ;Yes MOVB (R1)+,R0 JSR PC,SEND ;Send the message BR SNDLIN 2$: MOVB #CR,R0 ;Send a CR JSR PC,SEND RTS PC ;***************************************************** ;Routine to get a character from remote REMOTE: TST BCOUNT ;Anything in buffer? BEQ 4$ ;No, return with carry set MOVB @ADDR2,R0 ;Get character INC ADDR2 ;Advance proc adr pointer DEC BCOUNT ;Dec active character count DEC CNT2 ;Dec proc character count BNE 2$ ;End of buffer? MOV #BUFA,ADDR2 ;Yes, reset pointers MOV #4000,CNT2 2$: CLC ;Clear carry BR 6$ 4$: SEC ;Else set carry 6$: RTS PC ;***************************************************** ;GET A KEYBOARD CHARACTER TTYIN: TST KCOUNT ;ANYTHING IN BUFFER? BNE 2$ ;YES, GO GET IT SEC ;SET CARRY FLAG RTS PC ;AND RETURN 2$: MOVB @KADDR2,R0 ;GET THE CHARACTER INC KADDR2 ;ADVANCE CHARACTER ADR PNTR DEC KCOUNT ;DEC ACTIVE CHARACTER COUNT DEC KCNT2 ;DEC PROC CHARACTER COUNT BNE 4$ ;END OF BUFFER? MOV #BUFE,KADDR2 ;YES, RESET POINTERS MOV #240,KCNT2 ; 4$: RTS PC ;AND RETURN ;***************************************************** ;Set LC/UC toggle SETLC: TST LCFLG ;What mode are we in now? BNE 2$ ; INC LCFLG ;Make UC only BR 4$ 2$: CLR LCFLG ;Else make LC/UC 4$: RTS PC ;And return ;***************************************************** ;Lower case/upper case conversion LCOPT: TST LCFLG ;Option enabled? BEQ LCRET ;No, leave alone lccvt: CMPB R0,#140 ;Check to see if these are LC BLOS LCRET CMPB R0,#173 BHIS LCRET SUB #40,R0 ;Convert LC to UC LCRET: RTS PC ;and return ;***************************************************** ;Routine to send CR/LF to console terminal crlf: MOV R0,-(SP) ;Save register 0 MOVB #CR,R0 ;Send CR .TTYOUT MOVB #LF,R0 ;Send LF .TTYOUT MOV (SP)+,R0 ;Restore register 0 RTS PC ;***************************************************** ;MODEM INTERRUPT SERVICE ROUTINE rint: MOV R0,-(SP) ;Save register 0 MOVB @#RBUF,R0 ;get character MOVB R0,TEMP ;Save 8 bit character BICB #200,R0 ;Strip parity 2$: BIT #EXEFLG,CSSTAT ;Executive mode enabled? BNE 8$ ;Yes, skip all checks CMPB R0,#SI ;Protocol mode? BNE 4$ ;no BIS #EXEFLG,CSSTAT ;Set protocol mode BR 10$ 4$: CMPB R0,#CTRLS ;Control S? BNE 6$ ;no, go on INC HNDSK ;SET WAIT FLAG BR 10$ 6$: CMPB R0,#CTRLQ ;Control Q? BNE 8$ ;NO, PICK UP CHARACTER CLR HNDSK ;CLEAR WAIT FLAG BR 10$ 8$: INC BCOUNT ;INC ACTIVE CHAR COUNT MOVB TEMP,@ADDR ;Move to ring buffer INC ADDR ;ADVANCE ADR POINTER DEC CNT ;DEC RING BUFFER CHAR CNT BNE 10$ ;END OF BUFFER ? MOV #BUFA,ADDR ;YES, RESET POINTERS MOV #4000,CNT 10$: MOV (SP)+,R0 ;Restore r0 .IF EQ TSX$FLG RTI .IFF RTS PC .ENDC ;***************************************************** ;CONSOLE INTERRUPT SERVICE ROUTINE TTYINT: MOVB @#KBUF,@KADDR ;Mov char into ring buffer BICB #200,@KADDR ;Get rid of parity INC KCOUNT ;INC CHAR COUNT INC KADDR ;ADVANCE KEYBOARD ADDRESS PTR DEC KCNT ;DEC RING BUFFER CHAR CNT BNE 2$ ;END OF BUFFER? MOV #BUFE,KADDR ;YES, RESET POINTERS MOV #240,KCNT 2$: .IF EQ TSX$FLG RTI .IFF RTS PC .ENDC ;****************************************************** ;Receiver file Fatal I/O RXFATL: .PURGE #INCHN ;Dump receiver channel .PRINT #MSG5 ;Tell user CLR RXFLG ;Clear RX file flag CLR TGFLG ;Clear toggle RTS PC ;****************************************************** ;Line printer fatal I/O LPFATL: .PURGE #LPCHN ;Dump LP channel .PRINT #MSG5 ;Tell user CLR LPFLG ;Clear LP flag RTS PC ;****************************************************** ;TERMINATE PROGRAM HERE EXIT: .IF NE DLV11E BIT #10000,@#RCSR ;Carrier dropped? BEQ 4$ ;Yes, terminate .PRINT #MSG13 ;Else inform the user 2$: JSR PC,TTYIN ;Get user response BCS 2$ JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'Y ;User confirms termination? BEQ 4$ ;Yes CMPB R0,#'y ;Check for lower case, too BEQ 4$ JMP READY ;Else return to main loop .ENDC 4$: .IF NE TSX$FLG MOV #RELEAS,R0 ;Release real-time vectors EMT 375 MOV #CRELSE,R0 EMT 375 .DEVICE #TAREA,#TSXLST ;Make TSX restore old vectors BIS #54000,@#XCSR ;Restore dial-up line to 300 baud .ENDC CLR @#RCSR ;Disable interrupts & hang up EXITC: BIC #100,@#RCSR ;Disable interrupts only TST RXFLG ;Receiver file active? BEQ 2$ ;No JSR PC,CLOSE ;Else force it closed 2$: TST LPFLG ;LP active? BEQ 4$ JSR PC,LPCLS ;Yes, force it closed 4$: .IF EQ TSX$FLG MOV SAVE1,@#KVEC ;Restore RT-11 vectors .ENDC .EXIT ;and exit to monitor ;***************************************************** .IF NE DLV11E STBAUD: .PRINT #PROMPT ;Ask user for baud rate 2$: JSR PC,TTYIN ;Get response BCS 2$ .TTYOUT ;ECHO CHARACTER JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'0 ;300 Baud? BEQ SLOW ;Yes, set for 300 CMPB R0,#'1 ;600 Baud? BEQ MEDIUM ;Yes, set for 600 CMPB R0,#'2 ;1200 Baud? BEQ FAST ;Yes, set up for 1200 MOV #7,R0 ;Error, ring bell .TTYOUT BR STBAUD SLOW: MOV #54000,R1 BR SET MEDIUM: MOV #64000,R1 BR SET FAST: MOV #74000,R1 SET: BIS R1,@#XCSR RTS PC .ENDC ;***************************************************** .IF NE TSX$FLG MAP: .BYTE 5,140 ;TSX Map to I/O area IEMT: .BYTE 11,140 ;TSX completion routine vector .WORD 330 ;Modem vector .WORD RINT ;Interrupt entry point .WORD 7 ;Priority 7 (Highest) RELEAS: .BYTE 12,140 ;Release interrupt vector .WORD RVEC CONEMT: .BYTE 11,140 ;Console interrupt vector .WORD KVEC ;for real-time .WORD TTYINT .WORD 7 CRELSE: .BYTE 12,140 ;Release console vector .WORD KVEC LOCK: .BYTE 7,140 ;Lock program in memory TAREA: .BLKW 3 ;.DEVICE area for TSX TSXLST: .WORD RVEC ;vectors - modem vector SAVE2: .WORD 0 .WORD RVEC+2 SAVE3: .WORD 0 .WORD KVEC ;Console terminal SAVE4: .WORD 0 .WORD KVEC+2 SAVE5: .WORD 0 .WORD 0 MPEEK1: .BYTE 1,140 ;Peek at modem vector .WORD RVEC MPEEK2: .BYTE 1,140 .WORD RVEC+2 CPEEK1: .BYTE 1,140 ;Peek at console vector .WORD KVEC CPEEK2: .BYTE 1,140 .WORD KVEC+2 .IFF SAVE1: .BLKW 1 ;AREA TO SAVE RT-11 KB ADDR .ENDC LCFLG: .WORD 0 ;Lower case toggle flag CMDFLG: .WORD 0 ;COMMAND SEQUENCE FLAG TGFLG: .WORD 0 ;RECEIVER FILE TOGGLE. RXFLG: .WORD 0 LPFLG: .WORD 0 CSSTAT: .WORD 0 ;Executive status word UPBLK: .WORD 0 ;Block number RECHST: .WORD 0 ;Record number from host CKSUM: .WORD 0 ;Checksum RECNBR: .WORD 0 ;Record number MSGLEN: .WORD 0 ;Message length CSMAX: .WORD 0 ;Maximum # blocks for download file LPNAME: .RAD50 "LP " ;LINE PRINTER INAREA: .BLKW 10 INPNT: .WORD 0 ;RECEIVE BUFFER POINTER INBLK: .WORD 0 ;RECEIVE BLOCK COUNT INCHR: .WORD 0 ;RECEIVE CHAR COUNT LPAREA: .BLKW 10 LPPNT: .WORD 0 ;POINTER LPBLK: .WORD 0 ;BLOCK COUNT LPCHR: .WORD 0 ;CHARACTER COUNT CSAREA: .BLKW 10 ;EMT area for CSEXEC transfers CSPNT: .WORD 0 ;pointer CSBLK: .WORD 0 ;Block count CSCHR: .WORD 0 ;Character 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 KADDR: .WORD 0 ;KEYBOARD RING BUFFER ADR PTR KCOUNT: .WORD 0 ;KEYBOARD ACTIVE CHAR COUNT KCNT: .WORD 0 ;KEYBOARD RING BUFFER CHAR COUNT KADDR2: .WORD 0 ;KEYBOARD PORCESS ADR PTR KCNT2: .WORD 0 ;KEYBOARD PROCESS CHAR COUNT LAREA: .BLKW 10 AREA: .BLKW 10 AREA2: .BLKW 5 .WORD -1 .WORD 0 CHRSAV: .WORD 0 ERRFLG: .WORD 0 ;ERROR FLAG MAXBLK: .WORD 0 ;RECEIVER FILE SIZE HNDSK: .WORD 0 ;HANDSHAKING FLAG TEMP: .WORD 0 ;TEMP CHARACTER SAV DEXT: .WORD 0 .RAD50 "LST" .WORD 0,0 OUTSP: .BLKW 39. ;CSI FILE SPEC .NLIST BIN .IF EQ TSX$FLG MSGA: .ASCII "EXEC - Version 5.5 23-Nov-81" .IFF MSGA: .ASCII "EXEC - TSX Version 5.5 23-Nov-81" .ENDC .IF NE DLV11E .ASCII " (300 Baud)" .ENDC .ASCIZ "Use H for help" MSGB: .ASCIZ "EXEC-I-Receiver file closed" MSGD: .ASCIZ "EXEC-I-Transmitting file" MSGC: .ASCIZ <7>"EXEC-I-File transmitted" MSGE: .ASCIZ "EXEC-I-Receiver file opened" MSGF: .ASCIZ "EXEC-I-Printer on" MSGG: .ASCIZ "EXEC-I-Printer off" MSGH: .ASCIZ <7>"EXEC-I-Transmission aborted" MSGI: .ASCII <7>"File exists - upercede, e-enter, bort:" .BYTE 200 MSGJ: .ASCIZ "EXEC-I-File not opened" MSGK: .ASCIZ <7>"EXEC-I-Sending CSEXEC System ID to host" MSGL: .ASCIZ "EXEC-I-Beginning download" MSGM: .ASCIZ "EXEC-I-Beginning upload" MSGN: .ASCIZ <7>"EXEC-E-Aborting transfer" MSGO: .ASCIZ "EXEC-I-Initializing file transfer" MSGP: .ASCIZ <7>"EXEC-I-Invalid data block/re-transmitting" MSGQ: .ASCII <7>"File exists - upercede or bort:" .BYTE 200 MSGR: .ASCIZ <7>"TSTE-E-Receiver file is full" MSG1: .ASCIZ <7>"EXEC-E-Fetch error" MSG2: .ASCIZ <7>"EXEC-E-File open error" MSG3: .ASCIZ <7>"EXEC-E-Read error" MSG5: .ASCIZ <7>"EXEC-E-Write error" MSG6: .ASCIZ "EXEC-I-Printer already on" MSG7: .ASCIZ "EXEC-I-Printer already closed" MSG8: .ASCII "Enter receiver filespec: " .BYTE 200 MSG8A: .ASCII "Enter transmit filespec: " .BYTE 200 MSG9: .ASCIZ <7>"EXEC-E-Illegal filename" MSG10: .ASCIZ <7>"EXEC-E-File not found" MSG12: .ASCIZ <7>"EXEC-I-Receiver file full; ^S sent to remote" .IF NE DLV11E MSG13: .ASCII "EXEC-I-Modem carrier detected - Are you sure (Y/N): " .BYTE 200 PROMPT: .ASCII "0=300 1=600 2=1200" .ASCII "Enter baud code: "<200> .ENDC .IF NE TSX$FLG MSG11: .ASCIZ <7>"EXEC-F-TSX timesharing line in use" GENERR: .ASCIZ <7>"EXEC-F-Real time support not genned or no operator privilege" NUMERR: .ASCIZ <7>"EXEC-F-Max number of interrupts in use" JOBERR: .ASCIZ <7>"EXEC-F-Unable to connect to interrupt vector" .ENDC OPNERR: .ASCIZ "EXEC-E-Receiver file already open" CLSERR: .ASCIZ "EXEC-E-File already closed" CLS: .ASCII <33><110><33><112><200> HLPMSG: .ASCII " EXEC Commands" .ASCII "T - Transmit file K - Send 'BREAK' to remote" .ASCII "R - Open receiver file W - Toggle receiver file ON/OFF" .ASCII "D - Close receiver file O - Exit EXEC to RT-11" .ASCII "P - Open printer channel H - Help; prints this list" .ASCII "Z - Close printer channel B - Alter baud rate" .ASCII "C - Case toggle (UC/LC) ESC-Exit EXEC and disconnect" .ASCII "L - Auto logon to Tymnet/CIS" .ASCIZ "Precede all commands with the key" CSMSG: .ASCIZ "EXEC-I-Protocol mode disabled" SYSID: .ASCIZ "#DEC H11/LSI-11,CC,HC,PA,PL" LOG1: .ASCIZ "CPS;WELCOME" LOG2: .ASCIZ "70000,1" LOG3: .ASCIZ "SECRET" .EVEN BUFA: .BLKB 2048. ;2K Ring buffer BUFB: .BLKW 256. ;RECEIVE BUFFER BUFC: .BLKW 256. ;TRANSMIT BUFFER BUFD: .BLKW 256. ;LP BUFFER BUFE: .BLKW 80. ;80 character keyboard input buffer FBUFF: .BLKW 80. ;80 character file name buffer CSBUFF: .BLKB 256. ;256 byte buffer for CSEXEC .EVEN FREE: .WORD 0 LIMIT: .+2 ;LIMIT OF PROGRAM .END START