TITLE 'TX' ; Submitted by: Duane O'Shay, Consultant ; 36259 Forest Trail ; Elizabeth, Colorado 80107 ; March 7, 1983 ; ;******************************************************************* ; ; TX & RX DOCUMENTATION ; ; Two programs (TX & RX) work together to transfer files between ; computers under CP/M-80. The programs are currently designed to ; run on 3 different computers (PDS, MDS-800, & an Alternate ; (non-Intel) computer). The programs will handle binary as well as ; text files. ; ; ; A SPECIAL CABLE MUST BE USED TO LINK THE MDS-800 AND THE PDS ; COMPUTER. ; ; The cable used in testing TX & RX can be constructed as below: ; (For more information see "The Modem Eliminator" by ; Dennis J. Murray, Microcomputing, February 1981) ; ; MATERIALS: A 20 FOOT 4-WIRE CABLE ; 2 RS232C MALE CONNECTORS (25-PIN) ; ; CONSTRUCTION: ; ; PIN 1 TO PIN 1 (COMMON GROUND) ; PINS 2 & 3 TO PINS 3 & 2 (TX & RX CROSSED) ; PIN 7 TO PIN 7 (SIGNAL GROUND) ; ; JUMPERS IN EACH CONNECTOR: ; ; PIN 4 TO 5 ; PIN 6 TO 8 TO 20 ; ; THIS CABLE IS A FULL DUPLEX MODEM ELIMINATOR ; ; ; Connect the cable to the serial port on the PDS system (This is the ; port located nearest the top of the back of the computer). It is ; already configured for 9600 baud. ; ; Connect the other end of the cable to the console port of the ; MDS-800 (unplug the console CRT). ; ; Power on the PDS & boot up CP/M. ; ; Power on the MDS-800. ; ; Press the BOOT & RESET switches on the MDS-800. ; ; Run BOOT8 on the PDS system. ; ; When the interrupt 2 light goes out on the MDS-800, release the ; boot switch. ; ; BOOT8 will complete on the PDS when CP/M is up on the MDS-800. ; ; YOU ARE NOW READY TO RUN TX OR RX FROM THE PDS CONSOLE. ; ;////////////////////////////////////////////////////////////////////// ; ;A>TX DEF FN.EXT ; ; EXAMPLE: ; ; TX P28 E:*.FTN TRANSFER ALL .FTN FILES ; FROM E: ON THE PDS TO THE ; MDS-800. ; TX WILL BRING UP RX ON THE ; MDS-800. ; ; ;NOTE: ALL FILES ARE WRITTEN ONTO DRIVE A: BY THE RX PROGRAM. ; ; THE DEF PARAMETER IS ALWAYS DEFINED WITH THE TX COMPUTER ; FIRST AND THE RX COMPUTER LAST. A 2 MUST BE THE MIDDLE BYTE. ; ; THE FILE DEFINITION IS ALWAYS FOR THE FILES ON THE TX COMPUTER. ; ; ;/////////////////////////////////////////////////////////////////// ; ; ; TX SPECS ; ; ; EXCEPTION to specs: If TX is running on the MDS-800 which ; has no CRT connected, no messages are ; displayed. ; ; Format of messages from TX to RX. ; ; 1 byte - binary count of data bytes ; 1 byte - binary code value ; data field - (may be zero length) ; 2 bytes - CRC for the message ; ; Code 1 = Input file not found. ; Code 2 = Open file, File name is in data field. ; Code 3 = Sector count, 1 byte binary sector count in ; data field. ; Code 4 = Data, Data for the sector in the data field. ; Code 5 = Close file. ; Code 6 = End of transmission. ; ; RX returns has only 3 responses: ; ; ACK, RESEND, NAK. ; ; ;TX: Check and save TX/RX definition (the def is in filename 1 pos) ; If TX computer is not P, 8, or A (PDS, MDS-800, or Alternate), ; Display 'Invalid RX/TX Definition', ; Abort. ; ;TX1: If the second byte of the definition is not = 2, ; Display 'Invalid RX/TX Definition', ; Abort. ; ;TX2: If the RX computer is not P, 8, or A, ; Display 'Invalid RX/TX Definition', ; Abort. ; ;TX3: If the TX computer & the RX computer are the same, ; Display 'Invalid RX/TX Definition', ; Abort. ; ;TX4: Move the transmit file definition down into the lower FCB. ; If the TX computer is the Alternate computer, ; Configure the serial port to 9600 baud. ; ;TX6: Remove any trash on the input port. ; If the MDS-800 is the RX computer, ; Build the command to bring RX up in the MDS-800, ; Send the command to the MDS-800, ; Wait for the CP/M response. ; Wait for RX response indicating that he is ready. ; ;TX8: Build the CRC table. ; Build the list of files to transmit. ; If no files were found, ; Display 'Input file not found', ; Send message to RX, ; Abort. ; ;TX9: Initialize program values for transfer of next file. ; If there are no more files, ; Send EOT message to RX, ; Exit to CP/M. ; ;TX11: Move file name to FCB and console message. ; Display file name. ; Open the input file. ; Send OPEN message to RX. ; Get response from RX. ; If response is not ACK, ; Display 'Directory Full', ; Abort. ; ;TX13: Set up to read data into beginning of buffer. ; ;TX14: Set DMA address. ; Read 1 sector. ; If EOF, ; Set EOF flag = TRUE, ; If sector count = zero, ; Go to TX22. ; Go to TX16. ; Increment the sector count. ; If sector count is less than 50, ; Go to TX14. ; ;TX16: If Write Flag = TRUE, ; Set the Write Flag to FALSE, ; Wait for RX response from his write, ; If response is not ACK, ; Display 'Output Disk Full', ; Abort. ; ;TX17: Send sector count message to RX. ; Set buffer address to the beginning of the buffer. ; ;TX18: Send 1 sector to RX. ; Update the buffer address. ; Display the units digit of the sector number. (1-50) ; Decrement the sector count. ; If the sector count is not = zero, ; Go to TX18. ; Set the Write Flag to TRUE. ; Start a new line for sector numbers on the CRT. ; If EOF flag = FALSE, ; Go to TX13. ; ;TX22: If the Write Flag = TRUE, ; Wait for RX response from his write, ; If response is not ACK, ; Display 'Output Disk Full', ; Abort. ; ;TX23: Send CLOSE message code to RX. ; Display 'File has been transmitted'. ; Close the file. ; Wait for response from RX for finish of Close function. ; Go to TX9 for the next file. ; ;**************************************************************** ; ; SNDMSG ; ENTRY A = MESSAGE CODE ; B = BYTE COUNT ; HL = DATA ADDR ;................................................................ ; ;SNDMSG:Initialize routine. ; ;SND1: Call SEND to send byte count. ; Call Send to send the code. ; ;SND2: For each data byte, ; Call Send to send the byte. ; Send the CRC. ; Wait for the response of ACK, RESEND, or NAK. ; If the response is RESEND, ; Go to SND1. ; Return. ; ;**************************************************************** ; ; EQUATES ; ;**************************************************************** ; ORG 100H TRUE EQU 0FFH FALSE EQU 000H BOOT EQU 0000H BDOS EQU 00005H FCB EQU 05CH TAIL EQU 80H ;COMMAND TAIL ADDR SBUF EQU 80H CONOUT EQU 2 PRINTL EQU 9 ;PRINT LINE ON CONSOLE OPEN EQU 15 CLOSE EQU 16 SEARCHF EQU 17 ;SEARCH FOR FIRST OCCURANCE SEARCHN EQU 18 ;SEARCH FOR NEXT OCCURANCE READ EQU 20 WRITE EQU 21 SETDMA EQU 26 BS EQU 08H CR EQU 0DH LF EQU 0AH BELL EQU 07H ACK EQU 06H NAK EQU 15H RESEND EQU 00H ; 'MESSAGE CODES' INPUTNF EQU 1 ;INPUT FILE NOT FOUND OPENM EQU 2 ;OPEN MESSAGE SC EQU 3 ;SECTOR CODE DATA EQU 4 ;DATA MESSAGE CLOSEM EQU 5 ;CLOSE MESSAGE EOT EQU 6 ;END OF TRANSMISSION ; 'COMPUTER CODES' PDS EQU 'P' ;PDS COMPUTER MDS800 EQU '8' ;MDS-800 COMPUTER ALTN EQU 'A' ;ALTERNATE COMPUTER ; ; 'PORTS' PSTAT EQU 91H ;PDS STATUS PDATA EQU 90H ;PDS DATA ASTAT EQU 1FH ;ALTN STATUS ADATA EQU 1EH ;ALTN DATA CSTSP EQU 0F7H ;MDS-800 CONSOLE STATUS COP EQU 0F6H ;MDS-800 CONSOLE OUTPUT CIP EQU 0F6H ;MDS-800 CONSOLE INPUT ; ; 'CRC CALULATION VALUES' POLY1 EQU 010H ;X^12 POLY2 EQU 021H ;X^5 + 1 ;********************************************************** ; ; CODE SECTION ; ;********************************************************** ; TX: JMP TX0 DB 'DATE -- MARCH 7, 1983' TX0: LXI SP,STACK LXI H,FCB+1 MOV A,M ;CHECK TX COMPUTER DEF CPI MDS800 JZ TX1 CPI PDS JZ TX1 CPI ALTN JZ TX1 ;JUMP IF VALID TX DEF LXI D,MSG9 ;'INVALID RX/TX DEFINITION' CALL PRINT JMP BOOT TX1: STA TXC ;TX COMPUTER INX H MOV A,M CPI '2' ;SECOND BYTE MUST BE A 2 JZ TX2 LXI D,MSG9 ;'INVALID RX/TX DEFINITION' CALL PRINT JMP BOOT TX2: INX H MOV A,M ;CHECK RX COMPUTER DEF CPI MDS800 JZ TX3 CPI PDS JZ TX3 CPI ALTN JZ TX3 ;JUMP IF VALID RX DEF LXI D,MSG9 ;'INVALID RX/TX DEFINITION' CALL PRINT JMP BOOT TX3: STA RXC ;RX COMPUTER MOV C,A LDA TXC ;TX COMPUTER CMP C JNZ TX4 ;JUMP IF RX IS NOT = TX LXI D,MSG9 ;'INVALID RX/TX DEFINITION' CALL PRINT JMP BOOT TX4: MVI B,16 LXI H,FCB LXI D,FCB+16 TX5: LDAX D ;MOVE FN DOWN IN FCB MOV M,A INX H INX D DCR B JNZ TX5 LDA TXC CPI ALTN JNZ TX6 ;JUMP IF NOT ALTERNATE COMPUTER MVI A,47H ;SERIAL PORT TO 9600 BAUD OUT 0EH MVI A,0DH OUT 0EH TX6: CALL CLEAR ;REMOVE GARBAGE BYTES ; IF MDS-800 IS RECEIVING, HE HAS NO ; CONSOLE AS THAT PORT IS BEING USED ; FOR THE TRANSMISSION. THEREFORE TX ; WILL BRING UP RX. LDA RXC ;RX COMPUTER CPI MDS800 JNZ TX8 MVI C,'R' CALL POUT CALL PIN ;GET THE ECHO MVI C,'X' CALL POUT CALL PIN ;GET THE ECHO LXI H,TAIL MOV D,M ;CMD TAIL BYTE COUNT TX7: INX H MOV C,M CALL POUT ;SEND CMD TAIL CALL PIN ;GET THE ECHO DCR D JNZ TX7 MVI C,CR CALL POUT CALL PIN CALL PIN CALL PIN CALL PIN ;WAIT FOR RX TO RESPOND TX8: CALL BLDTAB ;BUILD THE CRC TABLE CALL XDIR ;BUILD LIST OF FILES LDA TABLE ;CHECK FOR NO INPUT FILES ORA A JNZ TX9 ;JUMP IF LIST IS NOT EMPTY MVI A,INPUTNF ;SEND NO INPUT FILE MESSAGE TO RX MVI B,0 CALL SNDMSG JMP BOOT TX9: MVI A,FALSE STA EOF XRA A STA SCOUNT ;SECTOR COUNT TO ZERO LXI H,FCB+12 MVI B,24 TX10: MOV M,A INX H DCR B JNZ TX10 ;ZEROS TO FCB LXI H,SNUM ;ADDR OF SECTOR COUNT DIGIT DISPLAY SHLD NEXTL LXI H,BUFFER SHLD NEXT LHLD NEXTF MOV A,M CPI 0 ;WE ARE DONE IF BYTE IS ZERO JNZ TX11 MVI A,EOT ;SEND EOT MESSAGE TO RX MVI B,0 CALL SNDMSG LXI D,MSG8 ;'END OF TRANSMISSION' CALL PRINT JMP BOOT ;ABORT TX11: LXI D,FCB+1 LXI B,MSG7+2 MVI A,11 ;MOVE 11 BYTES TX12: PUSH PSW MOV A,M STAX D ;INTO FCB STAX B ;INTO FN MSG INX H INX D INX B POP PSW DCR A JNZ TX12 SHLD NEXTF ;ADDR FOR NEXT FN LXI D,MSG7 ;DISPLAY THE FILE NAME CALL PRINT CALL OPENF MVI A,OPENM ;SEND OPEN MESSAGE TO RX MVI B,11 LXI H,FCB+1 ;FILE NAME CALL SNDMSG CALL PIN ;GET RESPONSE FROM RX CPI ACK JZ TX13 ;JUMP IF OPEN WAS OK LXI D,MSG2 ;'DIRECTORY FULL' CALL PRINT JMP BOOT ;ABORT TX13: LXI H,BUFFER SHLD NEXT TX14: CALL SETDM ;SET DMA ADDR CALL READF CPI 0 JZ TX15 ;JUMP IF NOT EOF MVI A,TRUE STA EOF LDA SCOUNT ;SECTOR COUNT CPI 0 JZ TX22 JMP TX16 TX15: LDA SCOUNT ;SECTOR COUNT INR A STA SCOUNT CPI 50 JNZ TX14 ;LOOP IF LESS THAN 50 SECTORS TX16: LDA WRTFLG RAR JNC TX17 ;JUMP IF FALSE MVI A,FALSE STA WRTFLG CALL PIN ;GET RESPONSE FROM RX WRITE CPI ACK JZ TX17 ;JUMP IF OK LXI D,MSG5 ;'OUTPUT DISK FULL-- ABORT' CALL PRINT JMP BOOT TX17: MVI A,SC ;SEND SECTOR COUNT MSG TO RX MVI B,1 LXI H,SCOUNT CALL SNDMSG LXI H,BUFFER SHLD NEXT ;INITIALIZE TX ADDRESS TX18: MVI A,DATA ;SEND SECTOR TO RX MVI B,128 LHLD NEXT ;DATA BYTES ADDR CALL SNDMSG LHLD NEXT LXI D,128 DAD D SHLD NEXT ;SAVE THE NEXT SECTOR ADDRESS CALL LOG ;TO DISPLAY SECTOR NUMBER LDA SCOUNT ;SECTOR COUNT DCR A STA SCOUNT CPI 0 JNZ TX18 MVI A,TRUE STA WRTFLG ;RX IS WRITING LXI D,CRLF ;FOR NEW SECTOR # LINE CALL PRINT LXI H,SNUM SHLD NEXTL LDA EOF RAR JNC TX13 ;LOOP IF NOT EOF TX22: LDA WRTFLG RAR JNC TX23 ;JUMP IF RX IS NOT WRITING MVI A,FALSE STA WRTFLG CALL PIN CPI ACK JZ TX23 ;JUP IF WRITE WAS OK LXI D,MSG5 ;'OUTPUT DISK FULL -- ABORT' CALL PRINT JMP BOOT ;ABORT TX23: MVI A,CLOSEM ;SEND CLOSE MESSAGE TO RX MVI B,0 CALL SNDMSG LXI D,MSG4 ;'FILE HAS BEEN TRANSMITTED' CALL PRINT CALL CLOSEF CALL PIN JMP TX9 ;TO GET NEXT FILE ;**************************************************************** ; ; SUBROUTINE SECTION ; ;**************************************************************** ; ; ENTRY A = MESSAGE CODE ; B = DATA BYTE COUNT ; HL= DATA ADDR ; ;................................................................ ; SNDMSG: SHLD ADDR ;DATA ADDRESS STA MCODE ;MESSAGE CODE MOV A,B STA COUNT ;DATA BYTE COUNT SND1: LXI H,0 SHLD CKODE ;INITIALIZE MESSAGE CRC LDA COUNT CALL SEND ;SEND DATA BYTE COUNT LDA MCODE ;MESSAGE CODE CALL SEND LDA COUNT ORA A JZ SND3 ;JUMP IF ZERO DATA BYTES MOV B,A LHLD ADDR ;ADDR OF DATA SND2: MOV A,M PUSH B PUSH H CALL SEND ;SEND DATA BYTE POP H INX H ;MOVE TO NEXT BYTE POP B DCR B JNZ SND2 SND3: LHLD CKODE ;GET THE CRC PUSH H MOV C,H CALL POUT ;SEND UPPER PART POP H MOV C,L CALL POUT ;SEND LOWER PART CALL PIN ;GET RESPONSE CPI RESEND RNZ ;RETURN IF NOT RESEND JMP SND1 ; ;****************************************************************** ; ; BLDTAB BUILD CRC TABLE ; ;****************************************************************** ; BLDTAB: LXI H,CRCTAB ;BUILD CRC TABLE MVI C,0 ;LOOP COUNTER BLD1: XCHG LXI H,0 ;INITIALIZE THE CRC MOV A,C ;BUILD CRC FOR THIS CHAR MVI B,8 XRA H MOV H,A BLD2: DAD H ;SHIFT HL LEFT 1 JNC BLD3 ;JUMP IF X^16 NOT SET MVI A,POLY1 ;GET NEW REMAINDER XRA H MOV H,A MVI A,POLY2 XRA L MOV L,A BLD3: DCR B JNZ BLD2 ;LOOP TO PROCESS EACH BIT OF CHAR XCHG ;CRC IS NOW IN DE MOV M,D INX H MOV M,E ;CRC TO TABLE INX H INR C JNZ BLD1 ;LOOP FOR 256 ENTRIES RET SEND: MOV C,A CALL POUT ;SEND BYTE TO RX LHLD CKODE XCHG ;DE = CURRENT CRC XRA D MOV C,A MVI B,0 LXI H,CRCTAB ;FOR TABLE LOOKUP DAD B DAD B ;HL= ADDR IN TABLE MOV A,M XRA E MOV D,A ;1st TAB BYTE XORED WITH 1st CRC BYTE INX H MOV E,M XCHG ;HL=NEW CRC VALUE SHLD CKODE RET OPENF: LXI D,FCB MVI C,OPEN CALL BDOS RET SETDM: LHLD NEXT ;ADDR FOR NEXT SECTOR MOV D,H MOV E,L LXI B,128 DAD B SHLD NEXT ;UPDATE NEXT ADDR MVI C,SETDMA CALL BDOS RET READF: MVI C,READ LXI D,FCB CALL BDOS ;TO READ 1 SECTOR RET CLOSEFċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċVI C,CONOUT ;CONSOLE OUT FUNCTION CALL BDOS LHLD NEXTL MOV A,M CPI ' ' ;LOOK FOR TENS SEPARATOR CZ LOG RET ; ;**************************************************************** ; ;POUT ; ;**************************************************************** ; ; ENTRY: BYTE IS IN C ; ;................................................................ ; POUT: LDA TXC ;TX COMPUTER CPI PDS JNZ POUT2 ;JUMP IF NOT PDS COMPUTER POUT1: IN PSTAT ANI 1 JZ POUT1 MOV A,C OUT PDATA RET POUT2: CPI MDS800 JNZ POUT4 POUT3: IN CSTSP ;MDS-800 OUTPUT ANI 1 JZ POUT3 MOV A,C OUT COP RET POUT4: MVI A,10H ;ALTERNATE COMPUTER OUT ASTAT IN ASTAT ;GET STATUS ANI 0CH CPI 0CH JNZ POUT4 ;JUMP IF NOT READY MOV A,C OUT ADATA ;SEND THE BYTE RET ; ;*************************************************************** ; ;PIN ; RETURN BYTE IN A PIN: LDA TXC ;TX COMPUTER CPI PDS JNZ PIN2 ;JUMP IF NOT PDS COMPUTER PIN1: IN PSTAT ANI 2 JZ PIN1 IN PDATA RET PIN2: CPI MDS800 JNZ PIN4 ;JUMP IF NOT MDS-800 PIN3: IN CSTSP ANI 2 JZ PIN3 ;JUMP IF NO INPUT YET IN CIP RET PIN4: XRA A ;ALTERNATE COMPUTER OUT ASTAT IN ASTAT ANI 1 JZ PIN4 ;IF BYTE IS NOT HERE IN ADATA ;GET THE BYTE RET ;*********************************************************** ; ; CLEAR ; ;*********************************************************** ; CLEAR: LDA TXC ;CLEAR ANY TRASH ON THE LINE CPI PDS JNZ CLEAR2 CLEAR1: IN PSTAT ;CLEAR PDS ANI 2 RZ ;RETURN IF CLEAR IN PDATA JMP CLEAR1 CLEAR2: CPI MDS800 JNZ CLEAR6 CLEAR3: IN CSTSP ;CLEAR MDS-800 ANI 2 RZ ;RETURN IF CLEAR IN CIP JMP CLEAR3 CLEAR6: XRA A ;CLEAR ALTERNATE COMPUTER OUT ASTAT IN ASTAT ANI 1 RZ ;RETURN IF CLEAR IN ADATA JMP CLEAR6 ; ;**************************************************************** ; ; ENTRY DE=ADDR OF STRING ; ;**************************************************************** ; PRINT: LDA TXC ;TX COMPUTER CPI MDS800 RZ ;RETURN IF NO CRT MVI C,PRINTL CALL BDOS RET ; ;******************************************************************** ; ; FIND MATCHING ENTRIES IN THE DIRECTORY & BUILD 11 BYTE ENTRY ; INTO TABLE FOR EACH MATCHING ENTRY ; ; THE LAST ENTRY IS FLAGGED BY A ZERO BYTE IN THE FIRST BYTE. ; ;******************************************************************** ; XDIR: LDA CODE ;SEARCHF OR SEARCHN MOV C,A LXI D,FCB ;ADDR FOR MATCHING NAME CALL BDOS CPI 255 JZ XDIR2 ;IF DONE ADD A ;CALCULATE ADDR IN SBUF OF ENTRY ADD A ADD A ADD A ADD A ADI SBUF+1 MOV C,A MVI B,0 MVI E,11 ;MOVE 11 BYTES LHLD NEXTF XDIR1: LDAX B INX B MOV M,A INX H DCR E JNZ XDIR1 SHLD NEXTF ;ADDR FOR NEXT FN MVI A,SEARCHN STA CODE ;USE NEXT FUNCTION ON NEXT TRY JMP XDIR ;FOR NEXT FILE MATCH XDIR2: LHLD NEXTF MVI M,0 ;FLAG END OF LIST LXI H,TABLE SHLD NEXTF RET ; ;************************************************************ ; ; DATA SECTION ; ;************************************************************ ; ; DS 50 STACK: ADDR: DW 0 ;DATA ADDRESS CKODE: DW 0 ;CALCULATED CRC COUNT: DB 0 ;DATA BYTE COUNT CRCTAB: DS 512 EOF: DB FALSE MCODE: DB 0 ;MESSAGE CODE MSG1: DB CR,LF,'INPUT FILE NOT FOUND',BELL,'$' MSG2: DB CR,LF,'DIRECTORY FULL',BELL,'$' MSG4: DB CR,LF,'FILE HAS BEEN TRANSMITTED$' MSG5: DB CR,LF,'OUTPUT DISK FULL--ABORT',BELL,'$' MSG7: DB CR,LF,'123456789AB',CR,LF,'$' MSG8: DB CR,LF,'END OF TRANSMISION$' MSG9: DB CR,LF,'INVALID COMPUTER DEFINITION',BELL,'$' CRLF: DB CR,LF,'$' NEXTL: DW SNUM ;POINTER TO SECTOR NUMBER BYTE SNUM: DB '1234567890 1234567890 1234567890 1234567890 ' DB '12345678901' SCOUNT: DB 0 ;SECTOR COUNT TXC: DB 0 ;TX COMPUTER RXC: DB 0 ;RX COMPUTER WRTFLG: DB FALSE ;TRUE WHEN RX IS WRITING THE DISK NEXT: DW BUFFER CODE: DB SEARCHF NEXTF: DW TABLE TABLE: DS 2410 BUFFER: DS 50*128 END