.TITLE DUPLEX DO COMMUNICATIONS BETWEEN TERMINALS .IDENT /5.0ejc/ .ENABL LC .MCALL QIO$S,QIOW$S,CLEF$S,WTSE$S,ASTX$S,EXIT$S,SETF$S .MCALL FCSMC$,CSI$,CSI$1,CSI$2,DIR$,QIO$,QIOW$,ALUN$S .MCALL MRKT$S FCSMC$ .PAGE ;************************************************************************ ; DUPLEX ; Written by Martin Heller 24-Oct-79 ; ; Modified by Thomas D. East 30-MAY-83 ; ; Modified by Edward J. Cetron 1-May-84 ; ; as last modifier, please send further modifications ; back to me for update into this latest version, I will ; then resubmit it to the SIG Tape. ; ; Edward J. Cetron ; Center for Biomedical Design ; 3168 MEB, Univ. of Utah ; Salt Lake City, Utah 84112 ; ; Emergency phone calls accepted.... (801)-581-6499 ; ;************************************************************************ .PAGE .SBTTL DIRECTIVES .PSECT DIRECT,D,REL,RW ; AQ1: QIO$ IO.WAL,2,2,,,,<,1> AQ2: QIO$ IO.WAL,1,1,,,,<,1> OPERR: QIOW$ IO.WVB,1,1,,,, IMSG: QIOW$ IO.WVB,1,1,,,, IMSG2: QIOW$ IO.WVB,1,1,,,, ISETO: QIOW$ IO.WVB,2,3,,,, ISETI: QIOW$ IO.Rlb!TF.RNE!TF.RAL!TF.TMO,2,5,,,, ISET: QIOW$ IO.RPR!TF.RNE!TF.RAL,2,5,,,, IDIALI: QIOW$ IO.Rlb!TF.RNE!TF.TMO,2,2,,,, CHKDIL: QIOW$ IO.RLB!TF.RNE!TF.TMO,2,2,,,, ICMD: QIOW$ IO.WAL,2,2,,,, IHNG: QIOW$ IO.WAL,2,2,,,, GLMSG: QIOW$ IO.WVB,1,1,,,, ROMSG: QIOW$ IO.WVB,1,1,,,, RCMSG: QIOW$ IO.WVB,1,1,,,, CLEAR: QIOW$ IO.WAL,2,2,,,, .PAGE .SBTTL INITIALIZATION FSRSZ$ 2,5120. ;INITIALIZE FCS RECORD BUFFER CSI$ ;DEFINE CSI CONTROL BLOCK .PSECT DUPLEX,I,REL,RO DUPLEX:: QUERY: DIR$ #IMSG2 ;CLEAR THE SCREEN MRKT$S #5,#3.,#2 ;WAIT FOR TERMINAL wtse$s #5 ;TO CLEAR DIR$ #GLMSG ;QUERY USER FOR WHICH TERMINAL QIOW$S #IO.RLB,#1,#1,,,,<#TERM,#2,> ;READS TT # MOV #TERM,R0 CALL $COTB MOV R1,LINE CMP LINE,#0. BMI QUERY ;CHECK IF LESS THAN 0 CMP #40,LINE ;CHECK IF GREATER THAN 40 BMI QUERY ;IF SO THEN RE-QUERY USER ALUN$S #2.,#"TT,LINE ;ALLOCATES THAT TT TO LUN #2 ; ALUN$S #2.,#"TI MOV #RCVBUF,RPTR MOV #RCVBUF,RPTR2 MOV #RCVBUF,RPTR3 MOV #TMPBUF,TPTR DIR$ #IMSG ;PRINT INTRO MESSAGE CMP #37,LINE ;CHECK IF MODEM BEQ 40$ ;IF SO GO TO AUTO DIAL ROUTINE JMP 43$ ;IF NOT GO DIRECTLY TO AST ROUTINE 40$: QIOW$S #SF.SMC,#2,#2,,,,<#SADIAL,#4> ;SET no remote CMP $DSW,#1 BEQ 499$ MOV $DSW,R0 IOT 499$: ; QIOW$S #IO.WVB,#1,#1,,,,<#done,#12> QIOW$S #IO.ATT,#2,#2 ;Temporarily attach modem ; QIOW$S #IO.WVB,#1,#1,,,,<#done,#12> MOVB #0,ERRC 479$: mov #15.,r1 ; clear stat mov #stat,r0 990$: clr (r0)+ sob r1,990$ 497$: mov #setl,r0 ; get output string length mov #set,r1 ; get output string start 4992$: movb (r1)+,outchr ; get outchr mov r1,save ; qiow$s #io.wvb,#1,#1,,,,<#outchr,#1> DIR$ #ISETO ; send out character CMP $DSW,#1 BEQ 4993$ MOV $DSW,R0 IOT 4993$: mov save,r1 MRKT$S #5,#1.,#2 wtse$s #5 sob r0,4992$ ; QIOW$S #IO.WVB,#1,#1,,,,<#done,#12> DIR$ #ISETI ;check Set up modem to proper mode CMP $DSW,#1 ; post read to pick up echo BEQ 493$ MOV $DSW,R0 IOT 493$: ; QIOW$S #IO.WVB,#1,#1,,,,<#dn493,#ln493> ; QIOW$S #IO.WVB,#1,#1,,,,<#STAT,#30.> MOVB STAT+14.,R4 BICB #200,R4 cmpb #117,R4 beq 14$ MOVB STAT+15.,R4 BICB #200,R4 CMPB #113,R4 BEQ 14$ MOVB STAT+2.,R4 BICB #200,R4 CMPB #117,R4 BEQ 14$ QIOW$S #IO.WVB,#1,#1,,,,<#ERR1,#ERR1L> ;If not then send message inc errc cmp errc,#1 beq 4799$ JMP 41$ ;Then GO TO AST ROUTINE 4799$: jmp 479$ 14$: clr errc QIOW$S #IO.WVB,#1,#1,,,,<#ERR2,#ERR2L>;Send Message about setup QIOW$S #IO.RLB,#1,#1,,,,<#DIAL+7,#13.> ;Get Phone Number 42$: mov #15.,r1 mov #stat,r0 991$: clr (r0)+ sob r1,991$ mov #diall,r0 mov #dial,r1 4998$: movb (r1)+,outchr mov r1,save dir$ #iseto MRKT$S #5,#1.,#2 wtse$s #5 mov save,r1 sob r0,4998$ 9984$: DIR$ #IDIALI ; pick up first bicb #200,stat+1 cmpb #105,stat+1 beq 458$ 456$: bicb #200,stat cmpb #105,stat beq 458$ 457$: dir$ #idiali ; pick up dial tone ; QIOW$S #IO.WVB,#1,#1,,,,<#done,#12.> QIOW$S #IO.WVB,#1,#1,,,,<#STAT-2,#30.> BICB #200,STAT+1 CMPB #104,STAT+1 ;Check to see if the dial tone BEQ 177$ ;successful cmpb #122,stat+1 beq 457$ ; ring return code is ignored cmpb #103,stat+1 ; connect code already!!!!!!!!! bne 458$ jmp 17$ 458$: QIOW$S #IO.WVB,#1,#1,,,,<#ERR3,#ERR3L> ;IF NOT CONNECT RETRY INCB ERRC ;Increment an error counter CMPB ERRC,#2 ;If no connect in 3 tries BNE 42$ ;then exit jmp 1779$ 177$: clr errc ; start mov #15.,r1 mov #stat,r0 994$: clr (r0)+ sob r1,994$ 9949$: dir$ #idiali ; pick up phone number qiow$s #io.wvb,#1,#1,,,,<#stat-2,#30.> cmpb stat+1,#0 beq 9949$ bicb #200,stat+1 cmpb #103,stat+1 ; connect code already!!!!!!!!! bne 8978$ jmp 17$ 8978$: mov #15.,r1 mov #stat,r0 995$: clr (r0)+ sob r1,995$ 9965$: dir$ #idiali ; pick up connect ..... qiow$s #io.wvb,#1,#1,,,,<#stat-2,#30.> cmpb stat+1,#0 beq 9965$ qiow$s #io.rlb!tf.tmo,#2,#2,,,,<#stat,#1,#1> ; qiow$s #io.wvb,#1,#1,,,,<#stat,#30.> bicb #200,stat+1 cmpb #103,stat+1 ; connect beq 17$ cmpb #102,stat+1 ; line is busy beq 1778$ qiow$s #io.wvb,#1,#1,,,,<#err5,#err5l> jmp 41$ 1778$: qiow$s #io.wvb,#1,#1,,,,<#err6,#err6l> br 1780$ 1779$: QIOW$S #IO.WVB,#1,#1,,,,<#ERR5,#ERR5L> 1780$: DIR$ #IHNG ;HANG UP PHONE MRKT$S #5,#3.,#2 ;WAIT FOR MODEM wtse$s #5 ;TO CLEAR JMP 41$ 17$: QIOW$S #IO.WVB,#1,#1,,,,<#ERR4,#ERR4L> ;IF CONNECT THEN CONTINUE 41$: QIOW$S #IO.DET,#2,#2 ;Detach the modem 43$: QIOW$S #SF.SMC,#1,#1,,,,<#STERM,#2> ;SET TI: TO BE RPA QIOW$S #SF.SMC,#2,#2,,,,<#STERM,#4> ;SET REMOTE TO BE RPA,SLAVE QIOW$S #IO.ATA,#1,#1,,,,<#AST1> ;SET UP AST1 QIOW$S #IO.ATA,#2,#2,,,,<#AST2> ;SET UP AST2 FINIT$ ;INITIALIZE FCS MOV #BUF1,B1PTRO ;INITIALIZE BUFFERS FOR EACH TERMINAL MOV #BUF2,B2PTRO mov #buf1,b1ptri mov #buf2,b2ptri 1$: MRKT$S #5,#1.,#1 wtse$s #5 cmpb sentin,#0 ; time to exit? BNE 31$ ;If it is time to exit transfer buffer 13$: TSTB WFLG ;Is a file transfer ready? BNE 31$ ;If not skip this section 33$: JMP 21$ 31$: CMP RPTR,RPTR2 ;Are there any characters? BEQ 33$ ;If not then go on BGT 44$ ;Check for wrapped pointers BR 56$ ;IF wrapped to first part 44$: JMP 30$ ;If not wrapped output all 56$: MOV RPTR2,RPTR3 ;initialize CR pointer 64$: MOV RPTR3,RPTR2 ;Start of CR search loop MOV RPTR3,RCVFDB+F.NRBD+2 ;move start into fdb 61$: CMPB #15,@RPTR3 ;Check for CR BEQ 60$ ;If it is then output line INC RPTR3 ;If not then increment pointer CMP RPTR3,#RCVBUF+BUFSIZ ;Check if end of buffer BLE 61$ ;If not go on.... BR 66$ ;If it is then go wrap routine 60$: MOV RPTR3,R0 ;Determine length of string SUB RPTR2,R0 MOV R0,RCVFDB+F.NRBD ;Put length in control block PUT$ #RCVFDB ;Send the string INC RPTR3 ;Skip the CR and LF cmpb #12,@rptr3 ; check for LF bne 63$ INC RPTR3 63$: CMP RPTR3,#RCVBUF+BUFSIZ ;Check for end of buffer BLE 64$ ;If not go look for more CR 62$: MOV #RCVBUF,RPTR2 ;If it is then reset RPTR2 CMP RPTR2,RPTR ;Check if any more characters BEQ 57$ ;If not then go on BR 30$ ;If there are then go to routine 57$: JMP 22$ ;to send them out ;Routine to handle lines wrapped around the end of the buffer 66$: MOV RPTR2,RPTR3 ;Re-initialize CR pointer MOV #TMPBUF,TPTR ;Re-initialize Temp. Buf pointer MOV RPTR,R1 ;Save the current write pointer 67$: MOVB @RPTR3,@TPTR ;Move a char to temp buffer INC RPTR3 ;Increment both pointers INC TPTR CMP RPTR3,#RCVBUF+BUFSIZ ;Determine if end of buffer BLE 67$ ;If not move more charcters MOV #RCVBUF,RPTR3 ;If so, zero CR pointer 36$: CMPB #15,@RPTR3 ;Now, start checking for CR BEQ 65$ ;If it is then go send line MOVB @RPTR3,@TPTR ;If not move character to temp buf INC RPTR3 ;Increment both pointers INC TPTR CMP RPTR3,R1 ;Check to see if at write pointer BLE 36$ ;If not continue JMP 22$ ;If so then exit disc routine 65$: MOV #TMPBUF,RCVFDB+F.NRBD+2 ;Move starting address of temp buf MOV TPTR,R0 ;Determine length of string in SUB #TMPBUF,R0 ;Temp buf MOV R0,RCVFDB+F.NRBD ;Put it into the control block PUT$ #RCVFDB ;Send the string INC RPTR3 ;Skip the CR and LF cmpb #12,@rptr3 ; check for LF bne 52$ INC RPTR3 52$: MOV RPTR3,RPTR2 ;Reset the Read pointer 30$: MOV RPTR,R1 ;Save the write pointer MOV RPTR2,RPTR3 ;Initialize the CR pointer 74$: MOV RPTR3,RPTR2 MOV RPTR3,RCVFDB+F.NRBD+2 ;move start into fdb 71$: CMPB #15,@RPTR3 ;Check for CR BEQ 70$ ;If it is then send it out INC RPTR3 ;If not incrment pointer CMP RPTR3,R1 ;Check if greater than write pointer BLE 71$ ;If not then go on BR 22$ ;If it is then exit disc routine 70$: MOV RPTR3,R0 ;Determine length of string SUB RPTR2,R0 MOV R0,RCVFDB+F.NRBD ;Put length in FDB PUT$ #RCVFDB ;Send out the string INC RPTR3 ;Skip CR and LF cmpb #12,@rptr3 ; check for LF bne 73$ INC RPTR3 73$: CMP RPTR3,R1 ;Check if greater than write pointer BLE 74$ ;If not, do next line MOV R1,RPTR2 ;If so then exit 22$: MOVB #0,WFLG ;Reset flag for disc I/O 21$: cmp b1ptri,b1ptro ; is input pointer eq to output pointer beq 3$ ; yes bgt 2$ ; input pointer greater than output mov b1ptro,aq1+q.iopl ; wrapped pointers, output from pointer mov #buf1+cirsiz,r0 ; to the end of the buffer sub b1ptro,r0 ; find length mov r0,aq1+q.iopl+2 ; and store it dir$ #aq1 ; send it on its way mov #buf1,b1ptro ; and reset the pointer to beginning cmp b1ptro,b1ptri ; is the input pointer at beginning beq 3$ ; ...yes 2$: mov b1ptri,r0 ; get input pointer mov r0,r1 ; and save it sub b1ptro,r0 ; get string length mov r0,aq1+q.iopl+2 ; and store it mov b1ptro,aq1+q.iopl ; store buffer start dir$ #aq1 ; and send it out. mov r1,b1ptro ; update pointer to next buffer start 3$: cmp b2ptri,b2ptro ; is input pointer eq to output pointer beq 5$ ; yes bgt 4$ ; input pointer greater than output mov b2ptro,aq2+q.iopl ; wrapped pointers, output from pointer mov #buf2+cirsiz,r0 ; to the end of the buffer sub b2ptro,r0 ; find length mov r0,aq2+q.iopl+2 ; and store it dir$ #aq2 ; send it on its way mov #buf2,b2ptro ; and reset the pointer to beginning cmp b2ptro,b2ptri ; is the input pointer at beginning beq 5$ ; ...yes 4$: mov b2ptri,r0 ; get input pointer mov r0,r1 ; and save it sub b2ptro,r0 ; get string length mov r0,aq2+q.iopl+2 ; and store it mov b2ptro,aq2+q.iopl ; store buffer start dir$ #aq2 ; and send it out. mov r1,b2ptro ; set next buffer start 5$: cmpb sentin,#3 beq 6$ movb sentin,r1 ; any special commands? bgt 11$ ; special command jmp 1$ 11$: JMP 20$ 6$: CMP #37,LINE ;CHECK FOR MODEM BEQ 498$ ;IF SO THEN HANGUP JMP 50$ 498$: QIOW$S #IO.DET,#2,#2 QIOW$S #IO.ATT,#2,#2 ;Temporarily attach modem QIOW$S #IO.WVB,#1,#1,,,,<#HMSG,#HMSGL> MRKT$S #5,#2.,#2 ;WAIT FOR TERMINAL wtse$s #5 ;TO CLEAR QIOW$S #IO.KIL,#1,#1 ;NO----- EXIT QIOW$S #IO.KIL,#2,#2 DIR$ #ICMD ;GET INTO COMMAND MODE MRKT$S #5,#3.,#2 ;WAIT FOR MODEM wtse$s #5 ;TO CLEAR DIR$ #IHNG ;HANG UP PHONE MRKT$S #5,#3.,#2 ;WAIT FOR MODEM wtse$s #5 ;TO CLEAR QIOW$S #IO.DET,#2,#2 QIOW$S #SF.SMC,#2,#2,,,,<#CADIAL,#2> ;SET REMOTE TO NOT BE AUTO-DIAL QIOW$S #IO.ATT,#2,#2 ;Temporarily attach modem 50$: QIOW$S #IO.WVB,#1,#1,,,,<#BYE,#BYEL> QIOW$S #SF.SMC,#1,#1,,,,<#RTERM,#2> ;SET TI: TO BE NORPA QIOW$S #SF.SMC,#2,#2,,,,<#RTERM,#2> ;SET REMOTE:NORPA qiow$s #sf.smc,#2,#2,,,,<#necho,#4> QIOW$S #IO.DET,#1,#1 16$: QIOW$S #IO.DET,#2,#2 TSTB RCVFIL ;FILE OPEN? BEQ 10$ ;NO CLOSE$ #RCVFDB ;YES- CLOSE IT 10$: EXIT$S ;****************************************************************** ;SPECIAL FUNCTION DESIRED: R1 HOLDS INDEX ;****************************************************************** 20$: CMP #ENTRIES,R1 ;CHECK FOR NON-EXISTENT CALL BLT 25$ ;NO GOOD - IGNORE DEC R1 ASL R1 ;CHANGE INDEX TO OFFSET CALL @TABLE(R1) ;GO DO THE GOOD WORK 25$: CLRB SENTIN ;SET UP FOR ANOTHER REQUEST jmp 1$ ;GO WAIT(PROCESS AST'S) .PAGE .SBTTL BUFFERS AND POINTERS .PSECT DATA,D,REL,RW CIRSIZ = 3072. BUFSIZ = 1024. TMPSIZ = 1024. B1PTRI: .WORD 0 B2PTRI: .WORD 0 b1ptro: .word 0 b2ptro: .word 0 SAVE: .WORD 0 RPTR: .WORD 0 RCTR: .WORD 0 RPTR2: .WORD 0 RPTR3: .WORD 0 TPTR: .WORD 0 .even wflg: .byte 0 .EVEN IOSB: .BLKW 2 TERM: .ASCII /AAA/ .EVEN BYTE: .BYTE 0 BYTE2: .BYTE 0 .EVEN outchr: .byte 0 .even typ: .byte 71 .byte 0 .even STERM: .BYTE 65 .BYTE 1 .BYTE 50 .BYTE 1 .even RTERM: .BYTE 65 .BYTE 0 .BYTE 50 .BYTE 0 .even necho: .byte 47 .byte 1 .byte 64 .byte 1 .even SADIAL: .BYTE 41 .BYTE 0 .byte 64 .byte 1 .even CADIAL: .BYTE 41 .BYTE 1 .even TYPE: .BLKB 2 .even LINE: .WORD 0 ; XMTFDB: FDBDF$ FDRC$A ,XMTBUF,BUFSIZ FDOP$A 3,CSIBLK+C.DSDS ;FILENAME WILL BE PARSED BY CSI XMTBUF: .BLKB BUFSIZ FILENAME: .BLKB 30. .EVEN CSIBLK: .BLKB C.SIZE RCVFDB: FDBDF$ FDRC$A ,RCVBUF,BUFSIZ FDOP$A 4,CSIBLK+C.DSDS ;FILENAME WILL BE PARSED BY CSI RCVBUF: .BLKB BUFSIZ ; TMPBUF: .BLKB TMPSIZ BUF1: .BLKB CIRSIZ ;CIRCULAR BUFFERS IF TERMINALS BUF2: .BLKB CIRSIZ ;ARE AT DIFFERENT SPEEDS TO PROVIDE SENTIN: .BYTE 0 ;TYPE AHEAD BUFFERING XFMODE: .BYTE 0 XABORT: .BYTE 0 RCVFIL: .BYTE 0 XACTIV: .BYTE 0 .even ovbs: .word 2560. ; MSG: .ASCII <15><12><33>/[2J/<33>/[1/<73>/1f/<33> .ASCII /#6 DUPLEX COMMUNICATIONS PACKAGE/ .ASCII <33>/[5/<73>/1fConnecting to remote port....../ .ASCII <33>/[7/<73>/1f/ MSGL = .-MSG MSG2: .ASCII <33>/[?41/ MSGL2 = .-MSG2 .EVEN GMSG: .ASCII <33>/[2J/<33>/[1/<73>/1f/ .ascii /Available remote lines are:/<15><12> .ascii / 20 - M. E. Vax 750/<15><12> .ascii / 34 - Dec 20 LocalNet/<15><12> .ascii / 35 - Dec 20 LocalNet/<15><12> .ascii / 36 - 300 baud, manual dial modem/<15><12> .ascii / 37 - 1200 baud, auto dial modem/<15><12><15><12> .ASCII /Please enter the TT # you wish to talk to (0-37):/ GMSGL = .-GMSG .EVEN FASK: .ASCII <15><12><33>/[7mDUPLEX:Enter file name '/<75> .ASCII /DL0:EXAMPLE.TXT'/<33>/[0m/<15><12> FASKL = .-FASK .EVEN OPNERR: .ASCII <15><12><33>/[7mDUPLEX:Error Opening File/ .ASCII <33>/[0m/<15><12> OPNERL = .-OPNERR .EVEN LMSG: .ASCII <15><12><33>/[7mDUPLEX:Type Ctrl-N to Transmit a Line/ .ASCII <33>/[0m/<15><12> LMSGL = .-LMSG .EVEN DNMSG: .ASCII <15><12><33>/[7mDUPLEX: Transmission of file complete./ .ASCII <33>/[0m/<15><12> DNMSGL = .-DNMSG .EVEN ROMT: .ASCII <15><12><33>/[7mDUPLEX:Received Data File has been Opened/ .ASCII <33>/[0m/<15><12> ROML = .-ROMT .EVEN RCMT: .ASCII <15><12><33>/[7mDUPLEX:Received Data File has been Closed/ .ASCII <33>/[0m/<15><12> RCML = .-RCMT .EVEN ERRC: .word .EVEN DONE: .ASCII <15><12>/*DONE*/<15><12> .EVEN CLR: .ASCII <15>/AT Z/<15> CLRL = .-CLR .EVEN SET: .ASCII <15><15>/AT E0 V1 Q0/<15> SETL = .-SET .EVEN DIAL: .ASCII <15>/ATDT9,/<0><0><0><0><0><0><0><0><0><0><0><15> DIALL = .-DIAL .EVEN CMD: .ASCII /+++/ CMDL = .-CMD .EVEN HNG: .ASCII /ATH0Q1/<15> HNGL = .-HNG .EVEN .ascii <15><12> STAT: .BLKB 30. .EVEN HMSG: .ASCII <15><12><33>/[7mDUPLEX:I am hanging up now.../ .ASCII <15><12>/This will take about 10 seconds./ .ASCII <33>/[0m/<15><12> HMSGL = .-HMSG .EVEN BYE: .ASCII <15><12>/DUPLEX program is now finished./<15><12> .ascii <33>/[>1h/ BYEL = .-BYE .EVEN ERR1: .ASCII <15><12>/Modem initialization was NOT successful./ .ASCII <15><12>/Please fix modem and retry./<15><12> ERR1L = .-ERR1 .EVEN ERR2: .ASCII <15><12>/I am ready to dial your number now./ .ASCII <15><12>/It will take a while to dial the phone/ .ASCII /....Please be patient!/<15><12> .ASCII <15><12>/Please enter your phone number (13 digits max):/ ERR2L = .-ERR2 .EVEN ERR3: .ASCII <15><12>/Connection was NOT made with your number/ .ASCII <15><12>/I will try again......(3 Tries Max)/ .ASCII <15><12> ERR3L = .-ERR3 .EVEN ERR4: .ASCII <15><12>/Remote connection was made./ err4a: .ASCII <15><12>/You are now ON-LINE./ .ASCII <15><12> ERR4L = .-ERR4 .EVEN ERR5: .ASCII <15><12>/Phone connection was not made in two/ .ASCII <15><12>/tries.....please check your number/ .ASCII <15><12>/and try again./<15><12> .ascii / if still in duplex, / .ascii /use ctrl-\ to exit, or ATDTxxxxxxxx to redial./<15><12> ERR5L = .-ERR5 .EVEN err6: .ascii <15><12>/Phone number is busy, please try later./<15><12> .ascii / use ctrl-\ to exit, or ATDTxxxxxxxx to redial./<15><12> err6l = .-err6 dn991: .ascii <15><12>/done 991/<15><12> ln991 = .-dn991 dn493: .ascii <15><12>/done 493/<15><12> ln493 = .-dn493 .SBTTL TABLES .PSECT TABLE,D,REL,RO ;********************************************************** ;SUBROUTINES FOR SPECIAL FUNCTIONS ;********************************************************** TABLE: XMIT ;#1 --- CTRL-T RECV ;#2 --- CTRL-F ENTRIES = .-TABLE/2 .PAGE .SBTTL ASYNCHRONOUS TRAP HANDLERS .PSECT AST,I,REL,RO ;********************************************************** ;AST SERVICE ROUTINE FOR TERMINAL 1 ;********************************************************** AST1: MOV R0,SAVE ;ON GENERAL PRINCIPALS MOV (SP)+,R0 ;CHARACTER RECEIVED AND PAR 2 BIC #177400,R0 ;LOW BYTE FOR KEY PRESSED CMP #28.,R0 ;CTRL-\ IMMEDIATE EXIT BEQ XIT ;EXIT TASK CMP #24,R0 ;CTRL-T BEQ 10$ ;TRANSMIT FILE CMP #20,R0 ;CTRL-P BEQ 20$ ;TOGGLE XMIT MODE CMP #16,R0 ;CTRL-N BEQ 30$ ;XMIT NEXT LINE CMP #1,R0 ;CTRL-A BEQ 15$ ;ABORT TRANSMISSION CMP #6,R0 ;CTRL-F BEQ 25$ ;RECEIVED FILE OPEN/CLOSE MOVB R0,@B1PTRI ;TRANSMIT BYTE INC B1PTRI ;MAINTAIN CIRCULAR BUFFER CMP B1PTRI,#BUF1+CIRSIZ BLE 5$ MOV #BUF1,B1PTRI 5$: MOV SAVE,R0 ;GENERAL PRINCIPALS AGAIN ASTX$S ;RETURN FROM AST SERVICE ;**** TRANSMIT FILE **** 10$: MOVB #1,SENTIN 11$: BR 5$ ;***** ABORT TRANSMISSION **** 15$: INCB XABORT BR 5$ ;***** TOGGLE TRANSMISSION MODE **** 20$: COMB XFMODE CLEF$S #4 BR 5$ ;***** OPEN/CLOSE FILE FOR DATA RECEIVED **** 25$: MOVB #2,SENTIN BR 11$ ;***** TRANSMIT NEXT LINE ***** 30$: SETF$S #4 BR 5$ ;***** IMMEDIATE EXIT ***** XIT: movb #3,SENTIN MOV SAVE,R0 ASTX$S ;******************************************************************** ;AST HANDLER FOR THE SECOND TERMINAL ;******************************************************************** AST2: MOV R0,SAVE MOV (SP)+,R0 BIC #177600,R0 ;1 ASCII CHAR FOR KEY PRESSED CMP #19.,R0 ;CTRL S (XOFF) BEQ 5$ ;IGNORE XOFF CMP #17.,R0 ;CTRL Q (XON) BEQ 5$ ;IGNORE XON CMP #15.,R0 ;CTRL O (SCREEN SUSPEND) BEQ 5$ ;IGNORE CTRL O ; CMP #10.,R0 ;LF ; BEQ 5$ ;IGNORE LF CMP #0,R0 ;NULL BEQ 5$ ;IGNORE NULL CMP #3,R0 ;CTRL C BEQ 5$ ;IGNORE CTRL-C CMP #24,R0 ;CTRL T BEQ 5$ ;IGNORE DC4, CTRL T CMP #25,R0 ;CTRL-U BEQ 5$ ;IGNORE NAK CMP #177,R0 ;DELETE BEQ 5$ ;IGNORE DELETE MOVB R0,@B2PTRI ;TRANSMIT BYTE TSTB RCVFIL ;FILE OPEN TO RECEIVED DATA? BEQ 2$ ;NO ;***** RECEIVE A CHAR: BYTE IN R0 IS TO BE STUFFED INTO BUFFER ;***** WHEN BUFFER IS HALF-FULL , FLAG BUFFER FOR WRITING MOVB R0,@RPTR ;STUFF CHAR INTO BUFFER INC RPTR ;MAINTAIN POINTER CMP RPTR,#RCVBUF+BUFSIZ ;CHECK FOR FULL BUFFER BLE 20$ ;IF NOT PROCEED MOV #RCVBUF,RPTR ;If full then reset pointer 20$: INC RCTR ;Increment char. coutner CMP #200.,RCTR ;Check to see how big block is BNE 2$ ;If .eq. to 500 then send to disc MOVB #1,WFLG ;FLAG BUFFER FOR OUTPUT MOVB #0,RCTR ;RESET COUNTER 2$: INC B2PTRI ;Increment pointer CMP B2PTRI,#BUF2+CIRSIZ ;Check to see if it is at end BLE 5$ ;If not continue MOV #BUF2,B2PTRI ;If it is then reset it 5$: MOV SAVE,R0 ;Restore r0 ASTX$S ;RETURN FROM AST SERVICE .PAGE .SBTTL XMIT -TRANSMIT A FILE .PSECT XMIT,I,REL,RO ;********************************************************** ; GET FILE DESCRIPTOR, PARSE IT, OPEN INPUT FILE ;********************************************************** XMIT: QIOW$S #SF.SMC,#1,#1,,,,<#RTERM,#2> ;SET TI: TO BE NORPA QIOW$S #IO.RPR,#1,#1,,#IOSB,,<#FILENAME,#30.,#6,#FASK,#FASKL,#'$> QIOW$S #SF.SMC,#1,#1,,,,<#STERM,#2> ;SET TI: TO BE RPA CSI$1 #CSIBLK,#FILENAME,IOSB+2 ;COMPRESS LINE BCS 20$ ;ERROR HANDLING CSI$2 #CSIBLK,INPUT ;PARSE FILE DESCRIPTOR BCS 20$ ;ERROR HANDLING OPEN$R #XMTFDB ;OPEN FILE FOR READING BCS 20$ ;ERROR HANDLING CLR R5 ; RECORD COUNTER CLRB XABORT ;INITIALIZE INCB XACTIV ;FLAG FILE ACTIVE TSTB XFMODE BEQ 5$ QIOW$S #IO.WVB,#1,#1,,,,<#LMSG,#LMSGL,#'0> ;LINE MODE ACIVE ;************************************************************ ; READ A RECORD FROM FILE AND WRITE IT TO TERMINAL 2 ;************************************************************ 5$: TSTB XABORT ;STOP NOW? BNE 10$ ;YES TSTB XFMODE ;TRANSMIT WHOLE FILE INTACT? BEQ 8$ ;YES WTSE$S #4 ;NO-WAIT FOR PERMISSION FOR THIS LINE CLEF$S #4 ;INHIBIT NEXT LINE 8$: GET$ #XMTFDB BCS 10$ ;END AND ERROR HANDLING INC R5 QIOW$S #IO.WVB,#2,#2,,,, BR 5$ ;************************************************************ ; DONE WITH FILE (EITHER END OR ERROR).... CLOSE IT ;************************************************************ 10$: CLOSE$ #XMTFDB CLRB XACTIV ;FLAG FILE CLOSED QIOW$S #IO.WVB,#1,#1,,,,<#DNMSG,#DNMSGL,#'0> ;DONE RETURN ;************************************************************ ; ERROR OPENING FILE....SAY SO AND WAIT ;************************************************************ 20$: DIR$ #OPERR RETURN .PAGE ;************************************************************ ; OPEN OR CLOSE RECEIVED DATA FILE AND HANDLE IO ;************************************************************ .SBTTL RECV - HANDLE DATA RECEIVED .PSECT RECV,I,REL,RO RECV: TSTB RCVFIL ;IS A FILE OPEN beq 456$ ; no, so go on and open it jmp 10$ ;YES .... CLOSE IT ;********************************************************** ; GET FILE DESCRIPTOR, PARSE IT, OPEN OUTPUT FILE ;********************************************************** 456$: QIOW$S #SF.SMC,#1,#1,,,,<#RTERM,#2> ;SET TI: TO BE NORPA QIOW$S #IO.RPR,#1,#1,,#IOSB,,<#FILENAME,#30.,#6,#FASK,#FASKL,#'$> QIOW$S #SF.SMC,#1,#1,,,,<#STERM,#2> ;SET TI: TO BE RPA CSI$1 #CSIBLK,#FILENAME,IOSB+2 ;COMPRESS LINE BCS 20$ ;ERROR HANDLING CSI$2 #CSIBLK,INPUT ;PARSE FILE DESCRIPTOR BCS 20$ ;ERROR HANDLING ;**** OPEN FILE ***** FDAT$R #RCVFDB,#R.VAR,#FD.CR,,#-5,#-5 mov #2560.,ovbs fdbf$r #rcvfdb,,ovbs,1 OPEN$W #RCVFDB BCS 20$ ;ERROR HANDLING MOVB #1,RCVFIL ;MARK FILE OPEN MOV #RCVBUF,RPTR MOV #RCVBUF,RPTR2 MOV #RCVBUF,RPTR3 MOV #TMPBUF,TPTR DIR$ #ROMSG ;SAY FILE OPENED RETURN ;**** CLOSE FILE ****** 10$: CLOSE$ #RCVFDB CLRB RCVFIL ;MARK FILE CLOSED DIR$ #RCMSG ;SAY FILE CLOSED RETURN ;***** ERROR OPENING FILE....SAY SO AND WAIT ***** 20$: DIR$ #OPERR RETURN .END DUPLEX