.ENABLE LC .TITLE DECOM .NLIST BEX ;TSTE.MAC - TIME SHARE TERMINAL EMULATOR UNDER RT-11 - DECUS #11-383 ;Version 1.0 [31-Oct-78] by: T.L. Starr and L.T. Nieh ; General Electric Company ; Appliance Park 35-1101 ; Louisville, Kentucky 40225 ;Version 1.2 [10-Oct-80] by: Rick Lesniak ; 100 Catherine Street ; Williamsville, NY 14221 ; DELETE key echoed as BACKSPACE - SPACE - BACKSPACE ; for RT-11 compatibility ;Version 3.0 [2-Oct-80] by: Chuck Sadoian ; PO Box 397 ; Dinuba, Calif 93618 ;Version 3.1 [10-Oct-80] by: Duncan Tanner ; Livermore, CA. ; Added automatic receiver file close when it is full. Added feature ; which forces RT-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. ;Version 4.1 [31-Aug-81] by: Chuck Sadoian and Barry Shaklan ; Litchfield Park, AZ ; Additions and corrections ;Version 4.7 [31-Oct-81] by Chuck Sadoian ; Corrections ;Version 4.8 [16-Dec-81] by Chuck Sadoian ; PO Box 397 ; Dinuba, Calif 93618 ; Corrected bug in file transmit routine. If a nonexistant file was ; specified, the transmit channel became busy and would not allow a ; filespec to be re-entered. Fix was to place a .PURGE #OUTCHN at the ; start of the TRANS: routine. ;Version 5.0 [19-Nov-81] by Chuck Sadoian ; CompuServe "A" protocol added ;Version 5.5 [23-Nov-81] by Chuck Sadoian ; Corrected various bugs, added auto Tymnet log-on ; Improved binary transfer routine ;Version 5.6 [01-Dec-81] by Chuck Sadoian ; Added code to clear protocol mode when CSEXEC transfer is completed. ; Changed the .BLKW directives of BUFE & FBUFF to .BLKB ; Corrected error in GETBLK routine--Start of CSBUFF was getting lost ; when an incorrect block was received. ;Version 5.7 [07-Dec-81] by Chuck Sadoian ; Corrected bug in file transmit routine. Program failed to purge the ; I/O channel when a non-existant file was specified, which caused the ; program to report "FILE NOT FOUND" error messages when subsequent ; existing files were specified. ;Version 5.8 [05-Jan-82] by Chuck Sadoian ; Corrected error at beginning of program that sets the baud rate to ; 300 baud (if a DLV11 is present). The instruction BIS #54000,@#RCSR ; has been changed to BIS #54000,@#XCSR. Also, the remote RCSR is ; cleared at start-up to be sure no unwanted bits are set. Modified ; .ENTER routines so that a filesize can be entered along with the ; standard RT-11 filespec (for example: DX1:FILE.LST[10] will allocate ; 10 blocks for the file "FILE.LST" on device DX1. If no size is ; specified, one half the largest free space is allocated. ;Version 5.9 [01-Jul-82] by Michael N. Ashman ; 7206 Denberg Road ; Baltimore, Maryland 21209 ; Phone: 301-484-0419 ; Compuserve ID: 70315,224 ; MODEM.MAC is a version of TSTE.MAC modified from: ; TSTEH.MAC by Rick Lesniak and EXEC.MAC by Chuck Sadoian ; to include delete a character function with the key and ; automatic dialing and logon to CompuServe and The Source ; with the Hayes smartmodem auto dial modem. ;Version 6.0 [09-AUG-82] by Thomas E. McCoy ; 8745 Capistrano Ave. ; Canoga Park, California 91304 ; Phone: 213-888-7535 ; Compuserve ID: 71555,345 ; DECOM.MAC is still another version of TSTE.MAC which is modified ; to utilize the DEC DF02-AC automatic dialing modem in stead of ; Hayes smart modem. The program actually traps the control char- ; actors form the modem and prints a message to the user to verify ; connect or failure to do so by the modem. Auto redial was not ; included in this version however. ;Version 7.0 [25-MAY-85] by Thomas E. McCoy ; 8745 Capistrano Ave. ; Canoga Park, California 91304 ; Phone: 213-888-7535 ; This version is same as above except TSX has been replaced and ; Auto call function is improved to drive DF03-AC type modem (300/1200 ; Baud). The program expects DF03 modem to be setup as follows: Speed ; select line enabled on interface modem interface board Sw Pack 1 ; SW7=ON (XCSR Bit=3) Sec Xmit wire on EIA cable. Program selects ; Comm Speed with this line. Dialer is expected to be hardwired to ; expect commands at 1200 Baud. Program automatically changes to 1200 ; baud during dial sequence. Autodail numbers are in menu form for ; easy selection. Other timing problems have also been improved. ; ;***************************************************************************** ; **********ASSEMBLY INSTRUCTIONS*********** ;TSTE will work under any RT-11 system. There is one option that can be ;selected at assembly time to allow the use of a DLV11-E serial interface ;with modem control. ;Set the DLV11E flag to 1 to assemble TSTE with the DLV11E option enabled. ;With the option enabled, TSTE will respond to the "B" command from the ;program to change the baud rate 'on the fly.' Another effect of the option ;causes TSTE 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 is cleared. ;Assembly flags: DLV11E = 1 TSX$FLG = 0 ;***************************************************************************** ;All DECOM commands begin with a LINE FEED, followed by any of the following ;keys (upper or lower case OK): ;ESC = Terminate DECOM program & drop modem line ;W = Toggle RECEIVE FILE ON AND OFF ;O = Exit DECOM 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 ;U = Toggle upper/lower case conversion ;H = Help with DECOM functions ;L = Auto logon to CIS ;M = Hangup and clear modem ;C = Call remote system automatically ;The following characters function only while in the file ;transmit mode - they are NOT preceded by a LINE FEED: ;Control-Y = Abort file transmission ;SPACE = Pause when transmitting file to remote ;***************************************************************************** ;Define DLV11-E I/O addresses and vector locations: RVEC=350 ;DLV11-E VECTOR ADDRESS RCSR=175610 ;DLV11-E RECEIVE STATUS ADDRESS RBUF=RCSR+2 ;DLV11-E RECEIVE BUFFER ADDRESS XCSR=RCSR+4 ;DLV11-E TRANSMIT STATUS ADDRESS XBUF=RCSR+6 ;DLV11-E TRANSMIT BUFFER ADDRESS ;***************************************************************************** ;Declare various symbols: CR=15 ;CARRAGE RETURN CSCHAN=5 ;CSEXEC channel CTRLA=1 ;Control-A (MODEM, CANCEL DIAL ROUTINE) CTRLB=2 ;Control-B (MODEM, BEGIN DIAL ROUTINE) CTRLQ=21 ;Control-Q (DC1 - XON) CTRLS=23 ;Control-S (DC3 - XOFF) CTRLY=31 ;Control-Y *** ABORT FILE TRANSMISSION *** DELETE=177 ;Local DELETE key (Rubout) ERRWD=52 ;ERROR WORD INCHN=3 ;RECIEVE CHANNEL NO. JSW=44 ;JOB STATUS WORD LF=12 ;LINE FEED LPCHN=4 ;LINE PRINTER CHANNEL OUTCHN=2 ;TRANSMIT CHANNEL NO. SPACE=40 ;SPACE *** PAUSE WHEN TRANSMITTING FILE TO REMOTE *** ; 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 ;***************************************************************************** .MCALL .REGDEF,.PRINT,.EXIT,.CSISPC,.SERR,.SRESET .MCALL .ENTER,.LOOKUP,.WRITE,.FETCH,.READW .MCALL .TTYOUT,.WAIT,.WRITW,.CLOSE .MCALL .LOCK,.PURGE,.DEVICE .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 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 peiority 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 DLV11-E interrupt vector MOV #300,@#RVEC+2 ;Priority 6 .ENDC SETUP: .IF NE DLV11E BIS #54000,@#XCSR ;Set to 300 baud (only affects DLV11E) BIS #54000,SPDMSK ;Also set up spdmsk keeps current spd .ENDC .SERR ;Let program handle fatal errors .SRESET ;SOFTWARE RESET MOV #LIMIT,FREE ;Start of free area MOV #BUFA,ADDR ;Ring buffer address pointer MOV #4000,CNT ;Ring buffer character count CLR BCOUNT ;Active character count MOV #BUFA,ADDR2 ;Process address pointer MOV #4000,CNT2 ;Process character 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 Message (ready to loop) MOV #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 keyboard input, loop CMPB R0,#DELETE ;A Delete (Rubout) ? BNE 4$ JSR PC,DELKEY ;Send Backspace-Space-Backspace BR READY 4$: JSR PC,CKMND ;Check for EXEC commands BR READY ;***************************************************************************** ;Check for EXEC commands CKMND: TST CMDFLG ;COMMAND SEQENCE IN PROG? BNE 4$ ;Yes, Process command sequence JMP 340$ ;No, Try to send character 4$: CLR CMDFLG ;Process command sequence JSR PC,LCCVT ;Make sure commands are UC CMPB R0,#'0 ;Compuserve autodial/logon? BNE 30$ ;If not check for another command JSR PC,DIALA ;Autodial and logon to Compuserve RTS PC 30$: CMPB R0,#'F ;Hangup and clear modem? BNE 31$ ;If not, check for another command. JSR PC,MCLR ;Hangup and clear modem? RTS PC 31$: CMPB R0,#'L ;Logon to Compuserve ? BNE 32$ ;No, check again .PRINT #CLS ;First, clear screen JSR PC,LOGON1 ;Auto login to CIS RTS PC 32$: CMPB R0,#'S ;Logon to The Source via Telenet ? BNE 70$ ;No, check again .PRINT #CLS ;First, clear screen JSR PC,LOGON2 ;Go login through TELENET RTS PC 70$: CMPB R0,#'U ;Upper lower case toggle? BNE 80$ JSR PC,SETLC ;Go set toggle RTS PC 80$: CMPB R0,#'T ;TRANSMIT FILE ? BNE 90$ JSR PC,TRANS RTS PC 90$: CMPB R0,#'R ;OPEN RECEIVER FILE ? BNE 100$ JSR PC,OPEN RTS PC 100$: CMPB R0,#'D ;CLOSE RECEIVER FILE ? BNE 120$ JSR PC,CLOSE RTS PC 120$: CMPB R0,#'K ;BREAK CHARACTER ? BNE 130$ JSR PC,BREAK RTS PC 130$: CMPB R0,#'C ;Call remote system BNE 140$ JSR PC,Call RTS PC 140$: .IF EQ TSX$FLG ;Dissable if under TSX CMPB R0,#'O ;Exit to monitor? BNE 150$ BIC #100,@#RCSR ;Disable interrupts JMP EXITC .ENDC 150$: CMPB R0,#'M ;Manual dial modem routine BNE 160$ ;Check for another command? JSR PC,DIAL ;Manual number entry 160$: CMPB R0,#ESC ;Terminate program? BNE 180$ JMP EXIT ;Terminate DECOM 180$: CMPB R0,#'P ;OPEN LP? BNE 200$ JSR PC,LPOPN ;OPEN LINE PRINTER CHAN. RTS PC 200$: CMPB R0,#'Z ;CLOSE LINE PRINTER? BNE 220$ JSR PC,LPCLS ;CLOSE LP RTS PC 220$: CMPB R0,#'W ;CHECK FOR TOGGLE INPUT BNE 280$ ;NO, Continue TST RXFLG ;IS FILE OPEN NOW? BNE 240$ ;No, skip toggle RTS PC 240$: TST TGFLG ;Current Flag Status? BEQ 260$ ;Flag is 0, we want a 1 CLR TGFLG ;Flag was 1, now 0 RTS PC 260$: INC TGFLG ;Change Flag from 0 to 1 RTS PC 280$: .IF NE DLV11E CMPB R0,#'B ;Set baud rate? BNE 300$ ;no JSR PC,STBAUD 300$: .ENDC CMPB R0,#'H ;Help? BNE 320$ .PRINT #CLS ;First, clear screen .PRINT #HLPMSG ;Print help message RTS PC 320$: CMPB R0,#LF ;A LF? BEQ XMIT ;send it RTS PC ;Else flush the letter 340$: CMPB R0,#LF ;LINE FEED? BNE XMIT INC CMDFLG RTS PC XMIT: JSR PC,SEND ;SEND ALL OTHER CHAR RTS PC ;***************************************************************************** ;ECHO 'DELETE' AS BACKSPACE-SPACE-BACKSPACE DELKEY: MOV #10,R0 ;Get 'BACKSPACE' JSR PC,SEND ;Send 'BACKSPACE' to remote MOV #40,R0 ;Get 'SPACE' JSR PC,SEND ;Send 'SPACE' to remote MOV #10,R0 ;Get 'BACKSPACE' JSR PC,SEND ;Send 'BACKSPACE' to remote RTS PC ;Return ;***************************************************************************** ;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$: MOV OUTSP+8.,R1 ;Get filesize (if any) .ENTER #CSAREA,#CSCHAN,#OUTSP,R1 ;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 CLR CSSTAT ;Clear protocol mode 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$ CLR CSSTAT ;Clear protocol mode 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 BR 2$ ;and start over 34$: CMPB RECNBR,RECHST ;Record numbers match? BEQ 36$ ;Yes BHI 4$ ;Abort if greater than expected MOVB #'.,R0 ;Else it must be a duplicate record JSR PC,SEND ;Accept it, and try again 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: .PURGE #OUTCHN ;Make sure channel is clear .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 10$ ;Error ? .PRINT #MSG1 ;YES, INFORM USER RTS PC ;and return 10$: 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 20$ ;Error ? .PRINT #MSG10 ;YES, FILE NOT FOUND RTS PC ;and return 20$: .PRINT #MSGD CLR R2 ;Block Number 30$: .READW #AREA,#OUTCHN,#BUFC,#256.,R2 ;Read a block BCS 90$ ;READ ERROR OR EOF ? MOV #512.,R4 ;NO, CHAR COUNT MOV #BUFC,R5 ;Point to buffer 40$: MOVB (R5)+,R0 ;Get a character TSTB R0 ;NULL ? BEQ 80$ ;YES, SKIP CMPB R0,#LF ;LF? BEQ 80$ ;YES, SKIP TST HNDSK ;Ok to send to remote? BEQ 50$ ;Yes JSR PC,PAUSE ;Else wait for remote to clear 50$: JSR PC,SEND ;Send character JSR PC,PRINT ;CHECK ECHO JSR PC,TTYIN ;CHECK KEYBOARD BCS 80$ ;CONTINUE IF NOTHING CMPB R0,#SPACE ;A SPACE? BNE 70$ ;No, Go on 60$: JSR PC,PRINT ;Check print JSR PC,TTYIN ;ELSE WAIT FOR A CHARACTER BCS 60$ 70$: CMPB R0,#CTRLY ;Control-Y ? BNE 80$ ;NO GO ON .PURGE #OUTCHN ;DUMP CHANNEL .PRINT #MSGH ;PRINT MESSAGE RTS PC 80$: DEC R4 ;DEC CHAR COUNT BNE 40$ ;BLOCK DONE ? INC R2 ;YES, NEXT BLOCK BR 30$ ;AGAIN 90$: TSTB @#ERRWD ;EOF ? BEQ 100$ ;YES, DONE .PRINT #MSG3 ;NO, READ ERROR 100$: .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 10$ ;NO, CHANNEL AVAILABLE .PRINT #OPNERR ;FILE ALREADY OPEN, SKIP BR 70$ 10$: .PRINT #MSG8 ;ASK USER FOR FILE NAME JSR PC,FILSPC ;GET FILE NAME TST ERRFLG ;ERROR? BNE 70$ ;Yes, abort 20$: MOV FREE,R1 .FETCH R1,#OUTSP ;GET HANDLER BCC 30$ ;ERROR? .PRINT #MSG1 ;FETCH ERROR RTS PC ;RETURN 30$: 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 50$ ;NO, CREATE IT .PRINT #MSGI ;ASK USER FOR PERMISSION .PURGE #INCHN ;Clear I/O channel first 40$: JSR PC,TTYIN ;Keyboard BCS 40$ JSR PC,LCCVT ;Make sure only UC .TTYOUT ;Echo the character JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'S ;Supercede? BEQ 50$ ;Yes CMPB R0,#'R ;Re-enter filespec? BEQ 10$ ;Yes .PRINT #MSGJ ;Else file is not superceded RTS PC 50$: MOV OUTSP+8.,R1 ;Get size of file (if any) .ENTER #INAREA,#INCHN,#OUTSP,R1;Open receiver file BCC 60$ ;ERROR ? 55$: .PRINT #MSG2 ;YES, OPEN ERROR .PURGE #INCHN ;Dump channel RTS PC ;AND RETURN 60$: TST R0 ;No room for file? [TSX bug in 2.0] BEQ 55$ ;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 70$: RTS PC ;***************************************************************************** FCLOSE: MOV #CTRLS,R0 ;SHUT OFF REMOTE JSR PC,SEND ;Send Control-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 10$ ;YES, CAN CLOSE .PRINT #CLSERR ;NO, ALREADY CLOSED BR 30$ 10$: MOVB #0,@INPNT ;PAD BUFFER WITH NULLS INC INPNT DEC INCHR BNE 10$ MOV #BUFB,R1 ;WRITE LAST BLOCK MOV INBLK,R3 .WRITW #AREA,#INCHN,R1,#256.,R3 BCC 20$ ;ERROR ? .PRINT #MSG5 20$: .CLOSE #INCHN ;CLOSE FILE .PRINT #MSGB ;FILE CLOSED CLR RXFLG 30$: RTS PC ;***************************************************************************** ;BREAK ROUTINE BREAK: CLR R0 JSR PC,SEND ;SEND A NULL MOV #30.,R1 10$: BIS #1,@#XCSR ;SET BREAK BIT JSR PC,SEND ;SEND A NULL, 30 TIMES DEC R1 BNE 10$ JSR PC,SEND ;SEND A NULL BIC #1,@#XCSR ;CLEAR BREAK BIT RTS PC ;***************************************************************************** ;TRANSMIT A CHARACTER TO REMOTE COMPUTER 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 10$: TST HNDSK ;OK to resume sending? BEQ 20$ ;Yes JSR PC,PRINT ;CHECK REMOTE ECHO JSR PC,TTYIN ;KEYBOARD INPUT BCS 10$ ;NO, SKIP BICB #200,R0 ;STRIP PARITY CMPB R0,#CTRLQ ;Control-Q ? BNE 10$ ;No, wait some more 20$: 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,#DELETE ;Delete (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 character 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 10$ ;NO, CHANNEL AVAILABLE .PRINT #MSG6 ;ALREADY OPEN, SKIP BR 40$ 10$: .PRINT #MSGF MOV FREE,R1 .FETCH R1,#LPNAME ;GET LP HANDLER BCC 20$ .PRINT #MSG1 ;ERROR, TELL USER RTS PC ;AND EXIT 20$: MOV R0,FREE ;UPDATE FREE AREA .ENTER #LPAREA,#LPCHN,#LPNAME ;OPEN LINE PRINTER CHANNEL BCC 30$ ;ERROR? .PRINT #MSG6 BR 40$ 30$: MOV #BUFD,LPPNT ;BUFFER POINTER CLR LPBLK ;BLOCK COUNT MOV #512.,LPCHR ;CHARACTER COUNT INC LPFLG 40$: RTS PC ;***************************************************************************** ;CLOSE LINE PRINTER CHANNEL LPCLS: TST LPFLG ;LP ACTIVE? BNE 10$ ;YES, CAN CLOSE .PRINT #MSG7 ;NO, NOT ACTIVE BR 30$ 10$: MOVB #0,@LPPNT ;PAD WITH NULLS INC LPPNT DEC LPCHR BNE 10$ MOV #BUFD,R1 ;WRITE LAST BLOCK MOV LPBLK,R3 .WRITW #LAREA,#LPCHN,R1,#256.,R3 BCC 20$ .PRINT #MSG5 20$: .CLOSE #LPCHN .PRINT #MSGG ;PRINT MESSAGE CLR LPFLG 30$: RTS PC ;***************************************************************************** ;ROUTINE TO GET FILESPEC FILSPC: MOV #FBUFF,R4 ;SET UP BUFFER 10$: JSR PC,TTYIN ;GET KEYBOARD INPUT BCS 10$ CMPB R0,#DELETE ;DELETE character ? BNE 20$ CMPB R4,#FBUFF ;No characters to delete? BEQ 10$ DEC R4 ;Else back up buffer MOV #10,R0 ;Backspace cursor .TTYOUT MOV #40,R0 ;and delete character .TTYOUT MOV #10,R0 ;Backspace cursor again .TTYOUT BR 10$ 20$: CMPB R0,#LF ;A line feed? BEQ 10$ ;Ignore it CMPB #10,R0 ;Backspace? BEQ 10$ ;IGNORE BACKSPACES .TTYOUT CMPB R0,#CR ;A CR? BEQ 30$ ;YES, FINISH CMP R4,#FBUFF+80. ;END OF BUFFER? BHI 10$ ;YES, WAIT FOR LF MOVB R0,(R4)+ ;ELSE STORE CHARACTER BR 10$ 30$: JSR PC,CRLF ;Send CR/LF for formatting CMPB R4,#FBUFF ;Nothing entered? BEQ 40$ ;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 50$ ;ERROR IN FILESPEC? 40$: .PRINT #MSG9 ;YES, INFORM USER INC ERRFLG ;SET ERROR FLAG BR 60$ 50$: CLR ERRFLG 60$: RTS PC ;RETURN ;***************************************************************************** ;Routine to send ^A to the modem to clear it in the event user wants ;to abort dialing after modem has started the dial sequence ABMOD: .PRINT #CLS ;Clear screen prior to message .PRINT #MSGAB ;User aborted with ^Y, print message MOV #CTRLA,R0 ;Get ^A ready to clear and reset modem JSR PC,SEND ;Send above to clear modem memory JSR PC,READY ;And return to main loop ;***************************************************************************** ;Routine to dump DTR (Data terminal ready) at the interface to hangup the phone ;and reset the modem logic. DTC is then returned after 1 sec. delay. MCLR: BIT #10000,@#RCSR ;Carrier dropped? BEQ 2$ ;Yes, terminate .PRINT #MSG13 ;Else, inform the user 1$: JSR PC,TTYIN ;Get user response BCS 1$ ;No responce yet keep looking JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'Y ;User confirms termination? BEQ 2$ ;Yes CMPB R0,#'y ;Check for lower case, too BEQ 2$ ;Go kill DTR in DL11-E JMP READY ;Else, return to main loop 2$: BIC #102,@#RCSR ;Disable interrupts & hang up MOV #4.,R2 ;Wait 1 sec. 20$: MOV #65535.,R1 30$: DEC R1 BNE 30$ DEC R2 BNE 20$ BIS #102,@#RCSR ;Force DTR and enable interrupts RTS PC ;And return ;**************************************************************************** ;Routine to manually dial the DF02-AC modem real time. DIAL: .PRINT #CLS ;Clear the screen to be nice BIS #74000,@#XCSR ;Force speed to 1200 for dial .PRINT #MSGDL ;Send user request for number to dial MOV #CTRLB,R0 ;Gets ^B to send (starts dial seq.) JSR PC,SEND ;Sends ^B (modem off hook & dial) 4$: JSR PC,TTYIN ;Look for phone number from user BCS 6$ ;No input go see if modem has anything CMPB R0,#CTRLY ;If user input, is it an abort (^Y) BEQ 40$ ;Yes, the user entered an abort, exit 5$: .TTYOUT ;Echo the number inputed by the user JSR PC,SEND ;Send the number to the modem 6$: JSR PC,REMOTE ;Look for control response from modem BCS 7$ ;Got a response from the modem BR 4$ ;No response from go back to user tty 7$: BICB #200,R0 ;Strip parity off of modem response CMPB R0,#'A ;Test modem response A= link up ok BNE 20$ ;Nope, keep looking .PRINT #CLS ;Clears screen prior to message .PRINT #MSGMU ;Print up message at users terminal BR 50$ ;And return 20$: CMPB R0,#'B ;Test modem response B= Com problem BNE 30$ ;Nope, keep looking .PRINT #CLS ;Clears screen prior to message .PRINT #MSGMD ;Print down message at users terminal BR 50$ ;And return 30$: CMPB R0,#'G ;Test modem response G= modem busy BNE 4$ ;Nope, must not be valid go to begin .PRINT #CLS ;Clears screen prior to message .PRINT #MSGMB ;Print Busy Message to user 35$: JSR PC,TTYIN ;Get user response BCS 35$ ;keep looking for a response JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'Y ;User confirms modem kill routine BEQ 45$ ;Go and clear the modem CMPB R0,#'y ;Do the same for lowercase Y BEQ 45$ ;Go and clear the modem BR 50$ ;And return 40$: .PRINT #CLS ;Clear screen prior to message .PRINT #MSGAB ;User aborted with ^Y, print message 45$: MOV #CTRLA,R0 ;Get ^A ready to clear and reset modem JSR PC,SEND ;Send above to clear modem memory 50$: BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return ;***************************************************************************** ;Routine to autodial and login to Compuserve with DEC DF02-AC auto dial modem DIALA: .PRINT #CLS ;Clear screen BIS #74000,@#XCSR ;Force speed to 1200 for dial .PRINT #MSGDM ;Tell user auto-dial in progress MOV #CTRLA,R0 ;Get ^A ready to clear and reset modem JSR PC,SEND ;Send above to clear modem memory MOV #CTRLB,R0 ;Get ^B ready to send JSR PC,SEND ;Send the control-B to start dialing MOV #NUMBR1,R1 ;Get phone number JSR PC,SNDLIN ;Send it to DF02-AC auto dial modem MOV #FBUFF,R2 ;Get address for buffer 100$: JSR PC,GTCHAR ;Check for reply BCS 310$ ;^C intercepted from user JSR PC,LCCVT ;Convert to UC CMPB R0,#'A ;Communications established BNE 200$ ;Look for dialing trouble .PRINT #MSGMU ;Get up message to user modem is up 110$: MOV #20.,R2 ;Start 5 sec. delay for HOST ID: 120$: MOV #65535.,R1 130$: DEC R1 BNE 130$ DEC R2 BNE 120$ JSR PC,LOGON1 ;go to Compuserve autologon routine BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return 200$: CMPB R0,#'B ;Not able to complete dialing sequence BNE 100$ ;Not found .PRINT #MSGMD ;Get message to user modem failure 300$: BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return 310$: JSR PC,ABMOD ;User requested modem abort ;***************************************************************************** ;Routine to dial a phone number with DEC DF02-AC auto dial modem CALL: .PRINT #CLS ;Clear scrren make it pretty BIS #74000,@#XCSR ;Force speed to 1200 for dial .PRINT #NUMMSG ;Tell user auto-dial in progress .PRINT #NUMBER ;Ask which number 1$: JSR PC,TTYIN ;Wait for response BCS 1$ .TTYOUT ;Echo charactor JSR PC,CRLF CMPB R0,#'A ;Human wants CIS autologin BEQ 600$ ;Get him to subroutine CMPB R0,#'K ;Test for Kill BEQ 500$ ;He wants to do it, Exit CMPB R0,#'1 ;Which number do you want? BEQ 10$ CMPB R0,#'2 BEQ 20$ CMPB R0,#'3 BEQ 30$ CMPB R0,#'4 BEQ 40$ CMPB R0,#'5 BEQ 50$ CMPB R0,#'6 BEQ 60$ CMPB R0,#'7 BEQ 70$ CMPB R0,#'8 BEQ 80$ CMPB R0,#'9 BEQ 90$ MOV #7,R0 ;Error, ring bell .TTYOUT ;Send the bell BR CALL ;Give the guy another chance 10$: MOV #NUMBR1,R1 ;Load the correct number into R1 BR 100$ 20$: MOV #NUMBR2,R1 BR 100$ 30$: MOV #NUMBR3,R1 BR 100$ 40$: MOV #NUMBR4,R1 BR 100$ 50$: MOV #NUMBR5,R1 BR 100$ 60$: MOV #NUMBR6,R1 BR 100$ 70$: MOV #NUMBR7,R1 BR 100$ 80$: MOV #NUMBR8,R1 BR 100$ 90$: MOV #NUMBR9,R1 100$: .PRINT #CLS ;Clear screen .PRINT #MSGDM ;Send Message of intention (Dil modem) MOV #CTRLA,R0 ;Get ^A ready to clear and reset modem JSR PC,SEND ;Send above to clear modem memory MOV #CTRLB,R0 ;Get ^B ready to send JSR PC,SEND ;Send the control-B to start dialing JSR PC,SNDLIN ;Send the at address placed in R1 MOV #FBUFF,R2 ;Get address for buffer 200$: JSR PC,GTCHAR ;Check for reply BCS 300$ ;^C intercepted from user JSR PC,LCCVT ;Convert to UC CMPB R0,#'A ;Communications established BNE 250$ ;Look for dialing trouble .PRINT #MSGMU ;Get up message to user modem is up BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return 250$: CMPB R0,#'B ;Not able to complete dialing sequence BNE 200$ ;Not found .PRINT #MSGMD ;Get message to user modem failure BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return 300$: JSR PC,ABMOD ;User requested modem abort BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate RTS PC ;And return 500$: .PRINT #CLS ;Clear screen RTS PC ;Exit 600$: BIS SPDMSK,@#XCSR ;Dialing cmplt. restore old baud rate JSR PC,DIALA ;Give him CIS auto dial/login routine ;***************************************************************************** ;Routine to stop autologin routine if user desires STOP: MOV R0,-(SP) ;Save R0 JSR PC,TTYIN ;Check keyboard for input BCS 4$ ;Nothing entered CMPB R0,#CTRLC ;Was it a ^C BNE 4$ ;Go on back SEV ;Set carry flag for abort BR 5$ ;Flag is set lets go abort 4$: CLV ;Clear flag, no ^C or ^Y 5$: MOV (SP)+,R0 ;Restore R0 CLC ;Clear carry bit, just in case RTS PC ;And return ;***************************************************************************** ;Routine to auto-log onto CompuServe LOGON1: .PRINT #MSGAL ;Inform user that autolog in progress MOV #LOG1,R1 ;Send Message 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 LOGON1 ;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 10$ ;Loop if nothing .TTYOUT ;Echo the character 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 RTS PC 10$: .PRINT #MSGKIL ;Get abort message RTS PC ;And return ;***************************************************************************** ;Routine to auto-log onto The Source via Telenet LOGON2: MOV #FBUFF,R2 ;Get address for buffer MOV #LOG22,R1 ;Send terminal identifier JSR PC,SNDLIN 6$: JSR PC,GTCHAR ;Check response BCS 10$ ;Abort if flag set .TTYOUT ;Display it CMPB R0,#'@ ;Prompt character? BNE 6$ ;No, check again MOV #LOG23,R1 ;Send Source System Number 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 #LOG24,R1 ;Send ID and 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 10$ ;YES, GO GET IT SEC ;SET CARRY FLAG RTS PC ;AND RETURN 10$: 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 20$ ;END OF BUFFER? MOV #BUFE,KADDR2 ;YES, RESET POINTERS MOV #240,KCNT2 20$: RTS PC ;AND RETURN ;***************************************************************************** ;Set LC/UC toggle SETLC: TST LCFLG ;What mode are we in now? BNE 10$ INC LCFLG ;Make UC only BR 20$ 10$: CLR LCFLG ;Else make LC/UC 20$: 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 BIT #EXEFLG,CSSTAT ;Executive mode enabled? BNE 30$ ;Yes, skip all checks CMPB R0,#SI ;Protocol mode? BNE 4$ ;No BIS #EXEFLG,CSSTAT ;Set protocol mode BR 40$ 4$: CMPB R0,#CTRLS ;Control-S ? BNE 10$ ;No, Go on INC HNDSK ;SET WAIT FLAG BR 40$ 10$: CMPB R0,#CTRLQ ;Control-Q ? BNE 30$ ;NO, PICK UP CHARACTER CLR HNDSK ;CLEAR WAIT FLAG BR 40$ 30$: INC BCOUNT ;INC ACTIVE CHAR COUNT MOVB TEMP,@ADDR ;Move to ring buffer INC ADDR ;ADVANCE ADDR POINTER DEC CNT ;DEC RING BUFFER CHAR COUNT BNE 40$ ;END OF BUFFER ? MOV #BUFA,ADDR ;YES, RESET POINTERS MOV #4000,CNT 40$: MOV (SP)+,R0 ;Restore R0 .IF EQ TSX$FLG RTI .IFF RTS PC .ENDC ;***************************************************************************** ;CONSOLE INTERRUPT SERVICE ROUTINE TTYINT: MOVB @#KBUF,@KADDR ;Move character 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 2$ ;Yes, terminate .PRINT #MSG13 ;Else, inform the user 1$: JSR PC,TTYIN ;Get user response BCS 1$ ;No responce yet keep looking JSR PC,CRLF ;Send CR/LF for formatting CMPB R0,#'Y ;User confirms termination? BEQ 2$ ;Yes CMPB R0,#'y ;Check for lower case, too BEQ 2$ ;Go kill DTR in DL11-E JMP READY ;Else, return to main loop 2$: .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 .ENDC CLR @#RCSR ;Disable interrupts & hang up EXITC: BIC #100,@#RCSR ;Disable interrupts only TST RXFLG ;Receiver file active? BEQ 100$ ;No JSR PC,CLOSE ;Else, force it closed 100$: TST LPFLG ;LP active? BEQ 200$ JSR PC,LPCLS ;Yes, force it closed 200$: .IF EQ TSX$FLG MOV SAVE1,@#KVEC ;Restore RT-11 vectors .ENDC .EXIT ;and exit to monitor ;***************************************************************************** .IF NE DLV11E STBAUD: BIT #10000,@#RCSR ;Carrier dropped? BEQ 2$ ;Yes, let human play with speed .PRINT #MODBSY ;Tell human no can do modem is busy 1$: JSR PC,TTYIN ;Ask if ok to dump line BCS 1$ ;Wait JSR PC,LCCVT ;Convert input to upper case CMPB R0,#'Y ;Looking for yes to Zap call BEQ 2$ ;Good, lets zap the call in progress RTS PC ;Abort speed change 2$: CLR @#RCSR ;Clear DTR and interupts (Zap modem) .PRINT #CLS ;Make it pretty for human .PRINT #PROMPT ;Ask user for baud rate 10$: JSR PC,TTYIN ;Get response BCS 10$ .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 MOV #102,R2 ;Setup modem speed (DTR only) BR SET MEDIUM: MOV #64000,R1 MOV #102,R2 ;Setup modem speed (DTR only) BR SET FAST: MOV #74000,R1 MOV #112,R2 ;Setup modem speed (DTR & High speed) SET: MOV R1,SPDMSK ;Save new mask for DLV11-E Baud select MOV R2,SPDBIT ;Save new mask for MODEM speed select CLR @#RCSR ;Zap the modem (clr DTR and interupts BIS SPDMSK,@#XCSR ;Program baud rate into interface BIS SPDBIT,@#RCSR ;Set high speed bit (10) if required RTS PC ;Return, operation complete .ENDC ;***************************************************************************** .IF NE TSX$FLG MAP: .BYTE 5,140 ;TSX map to I/O area IEMT: .BYTE 11,140 ;TSX completion routine vector .WORD RVEC ;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 consol vector .WORD KVEC CPEEK2: .BYTE 1,140 .WORD KVEC+2 .IFF SAVE1: .BLKW 1 ;AREA TO SAVE RT-11 KB ADDR .ENDC SPDMSK: .WORD 0 ;Comm. Speed mask word SPDBIT: .WORD 0 ;Bits to send to set modem speed 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 .IF EQ TSX$FLG MSGA: .ASCII "DECOM - Version 6.0 [09-AUG-82]" .IFF MSGA: .ASCII "DECOM - TSX Version 6.0 [09-Aug-82]" .ENDC .ASCII " (DL11-E REQUIRED)" .ASCIZ "Use H for help" .IF NE DLV11E .ASCII " (300 Baud)" .ENDC MSGB: .ASCIZ " DECOM-I-Receiver file closed." MSGD: .ASCIZ " DECOM-I-Transmitting file." MSGC: .ASCIZ <7>" DECOM-I-File transmitted." MSGE: .ASCIZ " DECOM-I-Receiver file opened." MSGF: .ASCIZ " DECOM-I-Printer on." MSGG: .ASCIZ " DECOM-I-Printer off." MSGH: .ASCIZ <7>" DECOM-I-Transmission aborted." MSGI: .ASCII <7>"File exists - upercede, e-enter, bort:" .BYTE 200 MSGJ: .ASCIZ " DECOM-I-File not opened." MSGK: .ASCIZ <7>" DECOM-I-Sending CSEXEC System ID to host." MSGL: .ASCIZ " DECOM-I-Beginning download." MSGM: .ASCIZ " DECOM-I-Beginning upload." MSGN: .ASCIZ <7>" DECOM-E-Aborting transfer." MSGO: .ASCIZ " DECOM-I-Initializing file transfer." MSGP: .ASCIZ <7>" DECOM-I-Invalid data block/re-transmitting." MSGQ: .ASCII <7>"File exists - upercede or bort:" .BYTE 200 MSGR: .ASCIZ <7>" DECOM-E-Receiver file is full." MSGDM: .ASCIZ <7>" DECOM-I-Auto-dial has been activated, ^C will abort and reset the modem." MSGKIL: .ASCIZ <7>" DECOM-I-Auto-login has been aborted at users request." MSGMU: .ASCIZ <7>" DECOM-I-Communications is established with remote system." MSGAB: .ASCIZ <7>" DECOM-I-Automatic dial has been aborted and modem is cleared." MSGAL: .ASCII <7>" DECOM-I-Automatic logon in progress please wait for prompt." .ASCIZ " DECOM-I-A ^C will abort the automatic login in progress." MSGDL: .ASCII " DECOM-I-Please enter the phone number to dial, a ^Y aborts." .ASCII " A ^C re-dials the last number dialed (omit spaces or hyphens)." .ASCII .ASCII "COMMAND OR NUMBER==>" .BYTE 200 MSGMD: .ASCIZ <7>" DECOM-F-Connect failure, verify equipment and try again." MSGMB: .ASCII <7>" DECOM-F-Modem is busy at this time, do you wish to force clear it (Y/N):" .BYTE 200 MSG1: .ASCIZ <7>" DECOM-F-Fetch error." MSG2: .ASCIZ <7>" DECOM-F-File open error." MSG3: .ASCIZ <7>" DECOM-F-Read error." MSG5: .ASCIZ <7>" DECOM-F-Write error." MSG6: .ASCIZ " DECOM-I-Printer already on." MSG7: .ASCIZ " DECOM-I-Printer already closed." MSG8: .ASCII "Enter receiver filespec: " .BYTE 200 MSG8A: .ASCII "Enter transmit filespec: " .BYTE 200 MSG9: .ASCIZ <7>" DECOM-I-Illegal filename." MSG10: .ASCIZ <7>" DECOM-I-File not found." MSG12: .ASCIZ <7>" DECOM-I-Receiver file full; ^S sent to remote." ;.IF NE DLV11E MSG13: .ASCII " DECOM-Q-Modem carrier detected - Are you sure (Y/N): " .BYTE 200 PROMPT: .ASCII "0=300 1=600 2=1200" .ASCII "Enter baud code: "<200> MODBSY: .ASCII " DECOM-Q-Modem carrier detected - OK to ZAP (Y/N): " .byte 200 ;.ENDC .IF NE TSX$FLG MSG11: .ASCIZ <7>" DECOM-F-TSX timesharing line in use" GENERR: .ASCIZ <7>" DECOM-F-Real time support not genned or no operator privilege" NUMERR: .ASCIZ <7>" DECOM-F-Max number of interrupts in use" JOBERR: .ASCIZ <7>" DECOM-F-Unable to connect to interrupt vector" .ENDC OPNERR: .ASCIZ " DECOM-I-Receiver file already open." CLSERR: .ASCIZ " DECOM-I-Receiver file already closed." CLS: .ASCII <33><133><62><112><33><133><110><200> HLPMSG: .ASCII " DECOM 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 DECOM to RT-11 (Non TSX only)" .ASCII "P - Open printer channel H - Help; prints this list" .ASCII "Z - Close printer channel B - Alter baud rate (DLV11-E only)" .ASCII "U - Case toggle (UC/LC) ESC - Exit DECOM and hang up the phone" .ASCII "L - Auto logon to CompuServe S - Auto logon The Source via Telenet" .ASCII "F - Force hang up and clear modem M - Manual dial, modem requests number" .ASCII "C - Call Remote system from list" .ASCIZ "Precede all commands with the Line Feed key" NUMMSG: .ASCII " DECOM Phone list" .ASCII "1 - Dial CompuServe (300/1200) 2 - Dial CompuServe (300 only)" .ASCII "3 - Dial GTE Telenet link 4 - Dial TRW 'DIF' VAX" .ASCII "5 - Dial The BBS Palos Verdes CA. 6 - Dial 997-7575 DIAL A MATCH" .ASCII "7 - Dial 842-6969 DIAL A MATCH 8 - Dial 708-3409 Steve Saevig's BBS " .ASCII "9 - Dial 506-4617 DAVE ALLEN'S BBS A - Dial and autologon Compuserve" .ASCIZ "K - Abort" .ASCIZ NUMBER: .ASCII "Enter number to call: " .byte 200 CSMSG: .ASCIZ " DECOM-I-Protocol mode disabled" SYSID: .ASCIZ "#DEC H11/LSI-11,CC,HC,PA,PL" NUMBR1: .ASCIZ "9020934" ;Dial CompuServe (300/1200 baud) NUMBR2: .ASCIZ "9020932" ;Dial CompuServe (300 baud only) NUMBR3: .ASCIZ "12134521907" ;Dial GTE Telenet link NUMBR4: .ASCIZ "12132972550" ;Dial TRW "DIF" VAX NUMBR5: .ASCIZ "12135412503" ;Dial BBS Palos Verdes NUMBR6: .ASCIZ "9977575" ;Dial dial a match NUMBR7: .ASCIZ "8886600" ;Dial dial a match NUMBR8: .ASCIZ "7083409" ;dial Steve Saevigs system NUMBR9: .ASCIZ "5064617" ;dial David Allen's system LOG1: .ASCIZ "CPS;WELCOME" ;Logon to CompuServe LOG2: .ASCIZ "71555,1377" ;Compuserve ID LOG3: .ASCIZ "BIG MONEY" ;Compuserve Password LOG21: .ASCIZ ;Logon to The Source via Telenet LOG22: .ASCIZ "D1" ;Telenet Terminal Identifier LOG23: .ASCIZ "C 30147" ;The Source System Number LOG24: .ASCIZ "ID CL2653 PASSWORD" ;ID and Password HANGUP: .ASCIZ "" ;DEC DF02-AC auto dial modem Hangup Command .EVEN BUFA: .BLKB 2048. ;2K Ring buffer BUFB: .BLKW 256. ;RECEIVE BUFFER BUFC: .BLKW 256. ;TRANSMIT BUFFER BUFD: .BLKW 256. ;LP BUFFER BUFE: .BLKB 80. ;80 character keyboard input buffer FBUFF: .BLKB 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