.TITLE DUPLEX DO COMMUNICATIONS BETWEEN TERMINALS (MACHINES?) .IDENT /1.20A/ .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$,SVTK$S .MCALL MRKT$S FCSMC$ ;--------------------------------------------------------------------------- ; ; AUTHOR: MARTIN HELLER DATE:24-OCT-79 ; DUPLEX: ; The idea here is to provide the wiring (in software) ; so that a single terminal (unit 1, by convention) can ; be hard wired to the PDP-11 and yet function as a terminal ; to any computer that can be called on the telephone or ; wired to another terminal port. ; For dial-up use, a full-duplex modem needs to be ; connected to another port on the PDP-11. This is useful ; anyway, so that you can dial into the PDP-11; this program ; lets you reverse the process and dial out. When you ; task-build, ASG=TI:1, and explicitly assign the proper ; port to unit 2. ; There is no reason that the second port couldn't be ; hardwired as well. Therefore, if you have two computers within ; a few hundred yards of each other, you can connect them together ; through EIA ports and have just one terminal at your desk ; to talk to both of them. ; CONTROL-B CAUSES EXIT FROM THE PROGRAM ; ;** 26-OCT-79: VERSION 1.01 -- CTRL-T IS TRANSMIT A FILE ; ; TO USE: TYPE CONTROL AND T SIMULTANEOUSLY. THIS WILL NOT BE TRANSMITTED. ; THE PROGRAM WILL PROMPT FOR AN INPUT FILE SPECIFICATION, I.E. ; DUPLEX>=SY0:[25,34]FILENAME.TYP;4 ; THE USUAL RULES FOR DEFAULTS APPLY; NO WILDCARDS OR LISTS ARE ALLOWED. ; NOTICE THAT THE EQUALS SIGN IS NOT OPTIONAL--PARSING IS FOR AN INPUT FILE. ; ; ** 31-OCT-79: VERSION 1.02 ; CTRL-P TOGGLES BETWEEN FILE TRANSMISSION AND LINE TRANSMISSION ; CTRL-N CAUSES TRANSMISSION OF NEXT LINE OF FILE IN LINE MODE ; ; VERSION 1.03 ; CTRL-A ABORTS A FILE TRANSMISSION ; CTRL-F OPENS/CLOSES FILE OF RECEIVED DATA ; ; ** 26-NOV-79: VERSION 1.04 ; MESSAGES FOR CTRL-F ; USE DIR$ FORM FOR QIO'S ISSUED FROM AST HANDLERS ; ; ** 7-DEC-79: VERSION 1.05 ; HANDLING OF CONTROL CHARACTERS FROM TERMINAL 2 CHANGED: ; ALL BOTHERSOME NULLS AND CONTROL CHARACTERS IGNORED FROM TERM 2 ; ; ** 23-MAR-83 VERSION 1.20 ; G. EVERHART ; ADD DELAY LOGIC. CTRL-\ SETS DELAY UP... SETS UP A PREDEFINED ; NUMBER OF TICKS DELAY AFTER EACH LINE (IF IN LINE MODE) AND ; AUTOMATICALLY SENDS LINES OUT AFTER THAT DELAY. ANOTHER CTRL-\ ; TOGGLES THE MODE OFF AGAIN. (36 OCTAL) ; CTRL-^ SETS CHARACTER DELAY OF (NOMINALLY) 1 TICK PER CHAR SENT ; OR TURNS THIS DELAY OFF AGAIN. (34 OCTAL) ; CTRL-] (OCTAL 35) ALLOWS DELAY FOR LINES TO BE SET. 1 CHARACTER ; IS READ AND 60 OCTAL SUBTRACTED FROM IT TO GIVE DELAY. ; IF RESULT IS NEGATIVE, DELAY IS SET TO 4. ; ; JUNE 15 84 F. BORGER MOD TO WORK UNDER IAS ; ; DO 1 CHAR AST'S AS SINGLE CHARACTER QIO'S ; ;--------------------------------------------------------------------------- .PAGE .SBTTL DIRECTIVES .PSECT DIRECT,D,REL,RW ; AQ1: QIO$ IO.WVB!TF.WAL,2,2,,,,<0,1,0> AQ2: QIO$ IO.WVB!TF.WAL,1,1,,,,<0,1,0> OPERR: QIOW$ IO.WVB,1,1,,,, ROMSG: QIOW$ IO.WVB,1,1,,,, RCMSG: QIOW$ IO.WVB,1,1,,,, ; ; ; .SBTTL TABLES .PSECT TABLE,D,REL,RO ; ; SUBROUTINES FOR SPECIAL FUNCTIONS ; TABLE: XMIT ;#1 -- CTRL-T RECV ;#2 -- CTRL-F LDM ;#3 -- CTRL-\ (LINE DELAY ACTIVE MSG) CDM ;#4 -- CTRL-Y (CHARACTER DELAY ACTIVE MSG) LDS ;#5 -- CTRL-] (SET UP DELAYS) ENTRIES = .-TABLE/2 ; ; ODD ADDRESS SST TABLE ; SSTTAB: .WORD ODDAD ;ONLY ONE ENTRY .PAGE .SBTTL INITIALIZATION FSRSZ$ 2 ;INITIALIZE FCS RECORD BUFFER CSI$ ;DEFINE CSI CONTROL BLOCK .PSECT DUPLEX,I,REL,RO DUPLEX:: SVTK$S #SSTTAB,#1 ;SPECIFY TRAP VECTOR TABLE FOR ODD ADDRESS QIOW$S #SF.SMC,#1,#1,,,,<#SETBUF,#SETSIZ> ;SET DEVICE 1 ;FB DEV 2 PERM SET ; QIOW$S #SF.SMC,#2,#2,,,,<#SETBUF,#SETSIZ> ;SET DEVICE 2 ; QIOW$S #IO.ATA,#1,#1,,,,<#AST1> ;ATTACH DEVICE 1 ; QIOW$S #IO.ATA,#2,#2,,,,<#AST2> ;ATTACH DEVICE 2 QIO$S #IO.RLB!TF.RAL!TF.RNE,#1,#1,,,#AST1,<#DV1BUF,#1> QIO$S #IO.RLB!TF.RAL!TF.RNE,#2,#2,,,#AST2,<#DV2BUF,#1> FINIT$ ;INITIALIZE FCS MOV #BUF1,B1PTR ;INITIALIZE BUFFERS FOR EACH TERMINAL MOV #BUF2,B2PTR 1$: CLEF$S #3 ;WAIT FOREVER: ALL WE WANT IS THE AST HANDLING WTSE$S #3 MOVB SENTIN,R1 ;SOMETHING SPECIAL CALLED FOR? BGT 20$ ;YES QIOW$S #IO.KIL,#1,#1 ;NO -- EXIT QIOW$S #IO.KIL,#2,#2 ; QIOW$S #IO.DET,#1,#1 ; QIOW$S #IO.DET,#2,#2 QIOW$S #SF.SMC,#1,#1,,,,<#RESBUF,#RESSIZ> ;RESET DEVICE 1 ;FB DEV 2 PERM SET ; QIOW$S #SF.SMC,#2,#2,,,,<#RESBUF,#RESSIZ> ;RESET DEVICE 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 BR 1$ ;GO WAIT (PROCESS AST'S) .PAGE .SBTTL BUFFERS AND POINTERS .PSECT DATA,D,REL,RW SETBUF: .BYTE TC.BIN,1,TC.FDX,1 ;SET TERMINAL CHARACTERISTICS SETSIZ=.-SETBUF RESBUF: .BYTE TC.BIN,0,TC.FDX,0 ;RESET TERMINAL CHARS RESSIZ=.-RESBUF DV1BUF: .WORD 0 ;BUFFER FOR DEV 1 READ DV2BUF: .WORD 0 ;BUFFER FOR DEV 2 READ CIRSIZ = 256. BUFSIZ = 136. B1PTR: .WORD 0 B2PTR: .WORD 0 SAVE: .WORD 0 RPTR: .WORD 0 IOSB: .BLKW 2 ; 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 .EVEN RCVFDB: FDBDF$ FDRC$A ,RCVBUF,BUFSIZ FDOP$A 4,,RCVNAM RCVBUF: .BLKB BUFSIZ .EVEN RCVNAM: NMBLK$ RECEIVED,DAT ; BUF1: .BLKB CIRSIZ ;THESE CIRCULAR BUFFERS JUST HAVE TO BE BUF2: .BLKB CIRSIZ ;BIG ENOUGH TO PROVIDE A REASONABLE TYPE-AHEAD SENTIN: .BYTE 0 ;CAPABILITY WHEN THE TERMINALS GO AT DIFFERENT SPEEDS XFMODE: .BYTE 0 XABORT: .BYTE 0 RCVFIL: .BYTE 0 XACTIV: .BYTE 0 .EVEN LDLYV: .WORD 6 ;NUMBER OF TICKS TO WAIT BETWEEN LINES CHDLV: .WORD 1 ;NUMBER OF TICKS BETWEEN CHARACTERS (IF WAITING) LWF: .WORD 0 ;ZERO IF LINEWAIT ACTIVE CWF: .WORD -1 ;ZERO IF CHAR WAIT ACTIVE, (ONLY WITH NO LINE WAIT) .PAGE .SBTTL ASCII MESSAGES ; FASK: .ASCII /DUPLEX>/ FASKL = .-FASK OPNERR: .ASCII /ERROR OPENING FILE/<12> OPNERL = .-OPNERR LMSG: .ASCII /TYPE CTRL-N TO TRANSMIT A LINE/<12> LMSGL = .-LMSG ROMT: .ASCII /RECEIVED DATA FILE HAS BEEN OPENED/<12> ROML = .-ROMT RCMT: .ASCII /RECEIVED DATA FILE HAS BEEN CLOSED/<12> RCML = .-RCMT LDMT: .ASCII /LINE DELAY SET TO / DSMB: LDMC: .ASCII /4 TICKS/<12> LDML=.-LDMT CDMT: .ASCII /CHARACTER DELAY SET TO 1 TICK/<12> CDML=.-CDMT LUMT: .ASCII /LINE DELAY CLEARED/<12> LUML=.-LUMT CUMT: .ASCII /CHAR DELAY CLEARED/<12> CUML=.-CUMT XCMT: .ASCII /Transmission Complete/<12> XCML=.-XCMT DSMT: .ASCII /Enter value (1 char) for delay:/ DSML=.-DSMT .EVEN .PAGE .SBTTL ASYNCHRONOUS TRAP HANDLERS .PSECT AST,I,REL,RO ; ; AST SERVICE ROUTINE FOR TERMINAL 1 ; AST1: MOV R0,SAVE ;ON GENERAL PRINCIPLES ; MOV (SP)+,R0 ;CHARACTER RECIEVED AND PARAMETER2 TST (SP)+ ;GET RID OF IO STAT BLOCK ADDRESS MOV DV1BUF,R0 ;GET CHARACTER RECEIVED BIC #177600,R0 ;CLEAR UPPER BYTE AND PARITY FOR CHECKS QIO$S #IO.RLB!TF.RAL!TF.RNE,#1,#1,,,#AST1,<#DV1BUF,#1> ;NOTE THE TEST FOR EXIT IS NOW CONTROL B. THIS ALLOWS CONTROL C TO BE ;USED TO CONTROL THE REMOTE COMPUTER. CMP #2,R0 ;CTRL-B WANTS IMMEDIATE EXIT FROM PROGRAM 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$ ;RECEIVE FILE OPEN/CLOSE CMP #34,R0 ;CTRL-\ BEQ 507$ ;TOGGLE LINE DELAY MODE CMP #31,R0 ;CTRL-Y BEQ 508$ ;TOGGLE CHARACTER DELAY MODE CMP #35,R0 ;CTRL-] BEQ 509$ ;SET UP DELAY MAGNITUDE FOR LINES MOVB DV1BUF,@B1PTR ;TRANSMIT BYTE MOV B1PTR,AQ1+Q.IOPL DIR$ #AQ1 INC B1PTR ;MAINTAIN CIRCULAR BUFFER CMP B1PTR,#BUF1+CIRSIZ BLE 5$ MOV #BUF1,B1PTR 5$: MOV SAVE,R0 ;GENERAL PRINCIPLES AGAIN ASTX$S ;RETURN FROM AST SERVICE ; 10$: MOVB #1,SENTIN 11$: SETF$S #3 BR 5$ ; CTRL-A: ABORT TRANSMISSION 15$: INCB XABORT BR 5$ ; CTRL-P: TOGGLE TRANSMISSION MODE 20$: COMB XFMODE CLEF$S #4 BR 5$ ; CTRL-F: OPEN/CLOSE FILE FOR DATA RECEIVED 25$: MOVB #2,SENTIN BR 11$ ; CTRL-N: TRANSMIT NEXT LINE 30$: SETF$S #4 BR 5$ ; CTRL-\: TOGGLE LINE DELAY 507$: COM LWF ;SET FLAG OR CLEAR IT MOVB #3,SENTIN BR 11$ ; OCTAL 35 : SET UP DELAY MAGNITUDE 509$: MOVB #5,SENTIN BR 11$ ;35 - SET UP DELAY ; ; CTRL-Y: TOGGLE CHARACTER DELAY 508$: COM CWF MOVB #4,SENTIN BR 11$ ; ; CONTROL-B PRESSED: IMMEDIATE EXIT ; XIT: CLRB SENTIN SETF$S #3 MOV SAVE,R0 ASTX$S ; ; AST HANDLER FOR 2ND TERMINAL ; AST2: MOV R0,SAVE ; MOV (SP)+,R0 TST (SP)+ ;GET RID OF IO STAT BLOCK ADDRESS MOV DV2BUF,R0 BIC #177400,R0 ;1 BYTE FOR KEY PRESSED QIO$S #IO.RLB!TF.RAL!TF.RNE,#2,#2,,,#AST2,<#DV2BUF,#1> CMP #3,R0 ;CTRL-C BEQ 5$ ;IGNORE CTRL-C ( THIS IS A CHANGE ) CMP #24,R0 ;CTRL-T (DC4) BEQ 5$ ;IGNORE DC4 (GENERATED BY 6800 EDITOR) CMP #25,R0 ;CTRL-U (NAK) BEQ 5$ ;IGNORE NAK (GENERATED BY 6800 BASIC) CMP #177,R0 ;DEL BEQ 5$ ;IGNORE DEL (GENERATED BY 6800 BASIC) MOVB R0,@B2PTR ;TRANSMIT BYTE MOV B2PTR,AQ2+Q.IOPL DIR$ #AQ2 TSTB RCVFIL ;FILE OPEN TO RECEIVE DATA? BEQ 2$ ;NO CALL RCVCHR ;YES: PUT CHARACTER INTO FILE 2$: INC B2PTR CMP B2PTR,#BUF2+CIRSIZ BLE 5$ MOV #BUF2,B2PTR 5$: MOV SAVE,R0 ASTX$S ;RETURN FROM AST SERVICE .PAGE .SBTTL XMIT - TRANSMIT A FILE .PSECT XMIT,I,REL,RO ; ; GET FILE DESCRIPTER, PARSE IT, OPEN INPUT FILE ; XMIT: QIOW$S #IO.KIL,#1,#1 ;KILL OUTSTANDING READ QIOW$S #SF.SMC,#1,#1,,,,<#RESBUF,#RESSIZ> JSR PC,LDM JSR PC,CDM QIOW$S #IO.RPR,#1,#1,,#IOSB,,<#FILENAME,#30.,#6,#FASK,#FASKL,#'$> QIOW$S #SF.SMC,#1,#1,,,,<#SETBUF,#SETSIZ> QIO$S #IO.RLB!TF.RAL!TF.RNE,#1,#1,,,#AST1,<#DV1BUF,#1> BR 522$ 521$: JMP 10$ 520$: JMP 20$ 522$: CSI$1 #CSIBLK,#FILENAME,IOSB+2 ;COMPRESS LINE BCS 520$ ;ERROR HANDLING CSI$2 #CSIBLK,INPUT ;PARSE FILE DESCRIPTOR BCS 520$ ;ERROR HANDLING OPEN$R #XMTFDB ;OPEN FILE FOR READING BCS 520$ ;ERROR HANDLING CLRB XABORT ;INITIALIZE INCB XACTIV ;FLAG FILE ACTIVE TSTB XFMODE BEQ 5$ QIOW$S #IO.WVB,#1,#15,,,,<#LMSG,#LMSGL,#'0> ;SAY LINE MODE ACTIVE ; ; READ A RECORD FROM FILE AND WRITE IT TO TERMINAL 2 ; 5$: TSTB XABORT ;STOP NOW? BNE 521$ ;YES TST LWF ;DELAY PER LINE ? BNE 55$ ;BR IF NOT MRKT$S #7,LDLYV,#1 ;SET FLAG 7 AFTER 'LDLYV' TICKS WTSE$S #7 ;AWAIT TIMEOUT BR 8$ ;AND NOW DO LINE 55$: TSTB XFMODE ;TRANSMIT WHOLE FILE INTACT? BEQ 8$ ;YES ;WAIT FOR ^-N DELAY ROUTINE WTSE$S #4 ;WAIT FOR PERMISSION FOR THIS LINE CLEF$S #4 ;INHIBIT NEXT LINE 8$: GET$ #XMTFDB BCS 10$ ; END AND ERROR HANDLING TST CWF ;ARE WE INSERTING DELAYS BETWEEN CHARACTERS? BNE 502$ ;IF NE NO...(THANK HEAVEN...DELAY IS COSTLY) ;CHARACTER DELAY. THIS MUST BE HANDLED BY SINGLE-CHARACTER QIO$'S ;SO LET'S GET AT IT. TST XMTFDB+F.NRBD ;ZERO BYTES? NORMAL IF SO BLE 502$ MOV R0,-(SP) MOV R1,-(SP) ;NEED SOME REGISTERS MOV #XMTFDB+F.NRBD+2,R0 ;ADDRESS TO SHOOT OUT MOV XMTFDB+F.NRBD,R1 ;BYTE COUNT DEC R1 ;AJUST COUNT 504$: QIOW$S #IO.WVB,#2,#5,,,, ;EMIT CHAR INC R0 ;PASS CHARACTER EMITTED MRKT$S #6,CHDLV,#1 WTSE$S #6 ;WAIT FOR 'CHDLV' TICKS DEC R1 BGT 504$ QIOW$S #IO.WVB,#2,#5,,,, ;EMIT LAST CHAR WITH CR AT END MOV (SP)+,R1 ;RESTORE REGS USED... MOV (SP)+,R0 JMP 5$ 502$: QIOW$S #IO.WVB,#2,#5,,,, JMP 5$ ; ; DONE WITH FILE (EITHER END OR ERROR) -- CLOSE IT ; 10$: CLOSE$ #XMTFDB CLRB XACTIV ;FLAG FILE CLOSED QIOW$S #IO.WVB,#1,#15,,,,<#XCMT,#XCML,#'0> ;SAY TRANSMISSION DONE RETURN ; ; ERROR OPENING FILE -- SAY SO AND WAIT ; 20$: DIR$ #OPERR RETURN .PAGE .SBTTL RECV - HANDLE DATA RECEIVED .PSECT RECV,I,REL,RO RECV: TSTB RCVFIL ;IS A FILE OPEN BNE 10$ ;YES -- CLOSE IT ;OPEN FILE FDAT$R #RCVFDB,#R.VAR,#FD.CR,,#-5,#-5 OPEN$W #RCVFDB BCS 20$ ; ERROR HANDLING MOVB #1,RCVFIL ;MARK FILE OPEN MOV #RCVBUF,RPTR 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 ; ; LDM - LINE DISPLAY MESSAGE DISPLAY ; LDM: TST LWF ;NOW IN LINEWAITING MODE? BNE 510$ ;IF NE NO, WAITING CLEARED QIOW$S #IO.WVB,#1,#14,,,,<#LDMT,#LDML,#'0> RETURN 510$: QIOW$S #IO.WVB,#1,#14,,,,<#LUMT,#LUML,#'0> RETURN ; ; CDM - CHAR DISPLAY MESSAGE DISPLAY ; CDM: TST CWF ;NOW IN CHAR WAITING MODE? BNE 511$ ;IF NE NO, WAITING CLEARED QIOW$S #IO.WVB,#1,#14,,,,<#CDMT,#CDML,#'0> RETURN 511$: QIOW$S #IO.WVB,#1,#14,,,,<#CUMT,#CUML,#'0> RETURN ; ; ; LDS - LINE DELAY MAGNITUDE SETUP LDS: QIOW$S #IO.WVB,#1,#14,,,,<#DSMT,#DSML,#'$> QIOW$S #IO.KIL,#1,#14 ;KILL OUTSTANDING READ QIOW$S #SF.SMC,#1,#14,,,,<#RESBUF,#RESSIZ> QIOW$S #IO.RVB,#1,#14,,,,<#DSMB,#1> QIOW$S #SF.SMC,#1,#14,,,,<#SETBUF,#SETSIZ> QIO$S #IO.RLB!TF.RAL!TF.RNE,#1,#14,,,#AST1,<#DV1BUF,#1> ;READ 1 CHARACTER INTO BUFFER. THEN SET DELAY FROM IT. ; (SUBTRACT ASCII 0) MOVB DSMB,-(SP) BIC #177400,(SP) ;ZERO HIGH BYTE SUB #60,(SP) ;ADJUST THE ASCII MOV (SP)+,LDLYV ;STORE AS NEW DELAY VALUE BGT 512$ ;AS LONG AS >0 ALL'S WELL MOV #4,LDLYV ;IF NEGATIVE JUST PUT IN 4 512$: RETURN ; ; ; RECIEVE A CHAR: BYTE IN R0 IS TO BE STUFFED INTO BUFFER ; WHEN BUFFER IS FULL OR CR DETECTED, FLAG BUFFER FOR WRITING RCVCHR: CMPB #15,R0 ;CR? BEQ 20$ ;YES - PUT BUFFER CMPB #12,R0 ;LF? BEQ 10$ ;IGNORE LF TSTB R0 ;NUL? BEQ 10$ ;IGNORE NUL MOVB R0,@RPTR ;STUFF CHAR INTO BUFFER INC RPTR ;MAINTAIN POINTER CMP RPTR,#RCVBUF+BUFSIZ ;CHECK FOR BUFFER FULL BGT 20$ ;NEED TO PUT BUFFER 10$: RETURN ;ALL DONE 20$: MOV RPTR,R0 ;COMPUTE RECORD LENGTH SUB #RCVBUF,R0 BLT 25$ ;NEGATIVE CHARS WOULD BE AN ERROR MOV R0,RCVFDB+F.NRBD ;SET LENGTH PUT$ #RCVFDB ;SHIP IT OUT 25$: MOV #RCVBUF,RPTR ;SET UP FOR NEW BUFFER RETURN ; ; ODD ADRESS SERVICE ; ODDAD: QIOW$S #IO.KIL,#1,#1 QIOW$S #IO.KIL,#2,#2 QIOW$S #SF.SMC,#1,#1,,,,<#RESBUF,#RESSIZ> ;RESET DEVICE 1 TSTB RCVFIL ;FILE OPEN? BEQ 10$ ;NO CLOSE$ #RCVFDB ;YES - CLOSE IT 10$: EXIT$S ; .END DUPLEX