IMD 1.17: 14/12/2009 9:48:56 ad19 no 1 of 2 disks insite library cp/m-80 format non-system    0ISIS.PDS VOL1ISISPDS M 04 1                         RX COM TX COMRX ASM RX ASMTX ASMTX ASM&BOOT8 COMBOOT8 ASM        DATE -- MARCH 7, 19831!C"A/!]~8@P@A@ Y2<#~2S Y#~8mPmAm Y2=O:< Y:=A‘>G> :<8+TX!F#N° :=8:F*|"|ͬ!z5!"|*|Pۑې8ɯ:=P=ۑې38LBL:=8 O! ~W#^"\\\\:=8*A^#"A*A~ ̬:=PۑyӐ8y> y:=DATE -- MARCH 7, 19831 !]~87P7A7͎2#~2J͎#~8dPdAd͎2O:x͎!\lw#€:A˜>G> `:8R2X2!V#N2· 2222q͚:>'>22!hw#!PۑӐ8!y> !y:PDۑ:ې8SIɯS:Prۑېh8wÁ:8 :O\ƁO * w#¸">2Ú*6!"\:8*^#"*~ : "|͔͚%ͣ͂Y!{5!C"A>Y! "|TYŸ!hw#_y͂͋Y !]~#‰Y°:2{2zͣY Y!"~!"WW:*|"~!]"Pۑې8ɯ:=P=ۑې38LBL:=8 O! ~W#^"\\ INPUT FILE NOT FOUND$ DIRECTORY FULL$ FILE HAS BEEN TRANSMITTED$ OUTPUT DISK FULL--ABORT$ 1234"!d"*~$>'͎]s> ~#=,"q͎ʹ> !]'2_(͎!d"ͽʀ>2:Ì:<22e:ҩ>22ʩV͎>!'!d">*'*":=2¹>2͎!":_:>2PۑӐ8!y> !y:PDۑ:ې8SIɯS:Prۑېh8wÁ:8 :O\ƁO * w#¸">2Ú*6!"\:8*^#"*~ :~:W=WW!~#)!!yg)I>g>!o=r#s# 4*~w#"~*O! ~W#^"\\\\:=8*A^#"A*A~ ̬:=PۑyӐ8y> y:=56789AB $ END OF TRANSMISSION$ INVALID RX/TX DEFINITION$ $C1234567890 1234567890 1234567890 1234567890 12345678901 \\ INPUT FILE NOT FOUND$ DIRECTORY FULL$ FILE HAS BEEN TRANSMITTED$ OUTPUT DISK FULL--ABORT$ 12342V͎>':͎2" 2x2 !" : ͙:͙: [G* ~͙#N* LM21!!yg)ҋ>g>!or#s# vO* O! ~W#^" \*T] "\\:8*^#"*~ :Pۑ INPUT FILE NOT FOUND$ DIRECTORY FULL$ FILE HAS BEEN TRANSMITTED$ OUTPUT DISK FULL--ABORT$ 123456789AB $ END OF TRANSMISION$ INVALID COMPUTER DEFINITION$ $1234567890 1234567890 1234567890 1234567890 12345678901dPۑې8ɯ:=P=ۑې38LBL:=8 O! ~W#^"\\\\:=8*A^#"A*A~ ̬:=PۑyӐ8y> y:=PۑyӐ8!y> !y:PDۑ:ې8SIɯS:Prۑېh8wÁ:8 :O\ƁO * w#¸">2Ú*6!"\:8*^#"*~ :     TITLE 'RX' ; Submitted by: Duane O'Shay, Consultant ; 36259 Forest Trail ; Elizabeth, Colorado 80107 ; March 7, 1983 ; ;********************************** 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 ; ; ; CEXT ; ; EXAMPLE: ; ; RX 82P B:*.FTN TRANSFER ALL .FTN FILES ; FROM B: ON THE MDS-800 TO ; THE PDS. ; RX WILL BRING UP TX ON THE ; MDS-800. ; ; ;NOTE: ALL FILES ARE WRITTEN ONTO DRIVE A: BY THE RX PROGRAM. ; ; THE DEF PA = 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. ; ; ;RX********************************* ; ; 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 computersonnect 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-RAMETER 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. ; ; ;////////////////////////////////////////////////////////////: Initialize program values. ; Build the CRC table. ; 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 Def', ; Abort. ; ;RX1: If the second (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 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, re/////// ; ; ; RX SPECS ; ; ; EXCEPTION to specs: If RX is running on the MDS-800 which ; has no CRT connected, no messages are ; displayed. ; ; Format of messages from TX to RX. ; byte of the definition is not = 2, ; Display 'Invalid RX/TX Def', ; Abort. ; ;RX2: If the RX computer is not P, 8, or A, ; Display 'Invalid RX/TX Def', ; Abort. ; ;RX3: If the TX computer & the RX computer are the same, ; Display '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 1lease 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>RX DEF FN. ; 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 3Invalid RX/TX Def', ; Abort. ; ;RX4: If the RX computer is the Alternate computer, ; Configure the serial port to 9600 baud. ; ;RX5: If the TX computer is the MDS-800, ; Remove any trash from the serial port, ; Bring up TX in the MDS-80    0, ; Wait for the response returned by CP/M. ; ;RX7: If the RX computer is the MDS-800, ; Send ACK to TX to tell him we are ready. ; ;RX8: Call RECMSG to get a message from TX. ; If the msg code is 4 (Data) (Data is already stored by REC), ; w file, ; If there is no room in the directory, ; Display 'Directory Full', ; Send NAK to TX. ; Abort. ; Send an ACK to TX, ; Go to RX8. ; ;RX16: If the code is 3 (Sector Count), ; Set Write count to the sector count,e RX calculated CRC is not = zero, ; Send a RESEND to TX, ; Go to RECMSG. ; Send ACK to TX. ; Return. ;*************************************************************** ; ; EQUATES ; ;********************************************* ; '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 Update buffer addr for next sector, ; Decrement the read count, ; Display low digit of sector number (1-50), ; If the read count is not = zero, ; Go to RX8. ; ;RX9: Write the sectors (the number is in the write count), ; I ; Set read count to the sector count, ; Go to RX8. ; ;RX17: If the code is 5 (CLOSE), ; Close the file, ; Display 'File has been transmitted', ; Send ACK to TX. ; Go to RX8. ; ;RX18: If the message code is 6 (EOT), ; Displa****************** ; ORG 100H BOOT EQU 0000H BDOS EQU 0005H TAIL EQU 80H ;COMMAND TAIL ADDR FCB EQU 05CH CONOUT EQU 2 PRINTL EQU 9 ;PRINT LINE ON CONSOLE LOGIN 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 ;Xf write error, ; Delete the file, ; Send NAK to TX, ; Display 'Output Disk Full', ; Abort. ; Start new sector number line, ; Set buffer pointer to beginning of buffer, ; Send ACK to TX, ; Go to RX8. ; ;RX11: If the message cody 'End of Transmission', ; Exit to CP/M. ; ; Go to RX8. ; ;*************************************************************** ; ;RECMSG:Set MSGPTR to MSGBUF address. ; Reset the CRC. ; Call REC to get the message byte count from TX. ; Call REC to 14 OPEN EQU 15 CLOSE EQU 16 SEARCHF EQU 17 DELETE EQU 19 READ EQU 20 WRITE EQU 21 CREATE EQU 22 SETDMA EQU 26 BS EQU 08H CR EQU 0DH LF EQU 0AH BELL EQU 07H ACK ^12 POLY2 EQU 021H ;X^5 + 1 ; ;************************************************************** ; ; CODE SECTION ; ;*************************************************************** ; ; RX: JMP RX0 DB 'DATE -- MARCH 7, 1983' Re is 1 (Input file not found), ; Display 'Input File Not Found', ; Abort. ; ;RX12: If the code is 2 (OPEN), ; Zero the FCB, ; Get 11 byte file name from TX, ; Login drive A, ; Delete the existing file (if any), ; Create the ne get the message code. ; If msg code = data, ; Set MSGPTR to NEXT (the pointer to BUFFER). ; ;RECM1: If msg code = OPEN, ; Set MSGPTR to FCB+1. ; ;RECM2: Call REC to get the data bytes. ; ;RECM4: Call REC to accept the TX CRC bytes. ; If th 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 X0: LXI SP,STACK LXI H,SNUM SHLD NEXTL ;FOR SECTOR COUNT ON DISPLAY CALL BLDTAB ;BUILD THE CRC TABLE LXI H,FCB+1 MOV A,M ;CHECK TX COMPUTER DEF CPI MDS800 JZ RX1 CPI PDS JZ RX1 CPI ALTN JZ RX1 ;JUMP IF VALID TX DEF LXI     D,MSG9 ;'INVALID TX/RX DEF' CALL PRINT JMP BOOT RX1: STA TXC ;TX COMPUTER INX H MOV A,M CPI '2' ;SECOND BYTE MUST BE A 2 JZ RX2 LXI D,MSG9 ;'INVALID TX/RX DEF' CALL PRINT JMP BOOT RX2: INX H MOV A,M ;CHECK RX COMPUTER JNZ RX7 CALL CLEAR ;REMOVE TRASH FROM PORT (A>) FROM ; ANY PREVIOUS EXECUTION. MVI C,'T' ;BRING UP TX IN MDS-800 CALL POUT CALL PIN ;TO GET THE ECHO MVI C,'X' CALL POUT CALL  SHLD NEXT RX9: LHLD NEXT LXI B,128 DAD B SHLD NEXT ;NEXT SECTOR ADDR XCHG CALL SETDM ;SET DMA CALL WRITEF ;TO WRITE 1 SECTOR ORA A JZ RX10 ;JUMP IF WRITE WAS GOOD CALL CLOSEF  INTO FCB CALL LOGN ;LOGIN DRIVE A CALL DELET ;DELETE THE FILE IF IT IS HERE CALL MAKE ;CREATE THE FILE CPI 255 JNZ RX14 ;JUMP IF ROOM IN DIR LXI D,MSG2 ;'DIRECTORY FULL' CALL PRINT MVI C,NAK  DEF CPI MDS800 JZ RX3 CPI PDS JZ RX3 CPI ALTN JZ RX3 ;JUMP IF VALID RX DEF LXI D,MSG9 ;'INVALID TX/RX DEF' CALL PRINT JMP BOOT RX3: STA RXC ;RX COMPUTER MOV C,A LDA TXC ;TX COMPUTER CMP C JNZ RX4 ;JUMP IF RX IS NOPIN ;TO GET THE ECHO LXI H,TAIL MOV B,M ;CMD TRAIL BYTE COUNT RX6: INX H MOV C,M ;SEND CMD TAIL CALL POUT CALL PIN ;TO GET THE ECHO DCR B JNZ RX6 MVI C,CR CALL DELET ;DELETE THE FILE MVI C,NAK CALL POUT LXI D,MSG5 ;'Output disk full' CALL PRINT JMP BOOT RX10: LXI H,WRCNT ;SECTOR WRITE COUNT DCR M JNZ RX9 ;LOOP TILL BUFFERCALL POUT ;NOTIFY TX JMP BOOT RX14: MVI B,11 LXI H,FCB+1 ;MOVE THE FILE NAME LXI D,MSG7+2 RX15: MOV A,M STAX D INX H INX D DCR B JNZ RX15 LXI D,MSG7 CALL PRINT ;LIST THE FILE NAME MVI C,ACK CALL POUT ;TELLT = TX LXI D,MSG9 ;'INVALID TX/RX DEF' CALL PRINT JMP BOOT RX4: LDA RXC CPI ALTN JNZ RX5 ;JUMP IF NOT ALTERNATE COMPUTER MVI A,47H ;SERIAL PORT TO 9600 BAUD OUT 0EH MVI A,0DH OUT 0EH ; IF MDS-8 CALL POUT CALL PIN ;TO GET THE ECHO CALL PIN CALL PIN ;WAIT FOR CP/M RESPONSE RX7: LDA RXC ;RX COMPUTER CPI MDS800 JNZ RX8 MVI C,ACK CALL POUT ;TELL TX WE ARE READY NOW RX8: CALL RECMSG ;WAIT FOR MESSAGE  IS EMPTY LXI H,SNUM SHLD NEXTL LXI D,CRLF ;START NEW SECTOR NUMBER LINE CALL PRINT LXI H,BUFFER SHLD NEXT MVI C,ACK CALL POUT ;TELL TX WRITE WAS OK JMP RX8 RX11: CPI I TX THAT OPEN WAS OK JMP RX8 RX16: CPI SC ;SECTOR COUNT JNZ RX17 LDA MSGBUF+2 ;GET THE SECTOR COUNT THAT IS COMING STA WRCNT STA RDCNT JMP RX8 RX17: CPI CLOSEM JNZ RX18 ;JUMP IF NOT CLOSE CODE CALL C00 IS SENDING, HE HAS NO ; CONSOLE AS THAT PORT IS BEING USED ; FOR THE TRANSMISSION. THEREFORE RX ; WILL BRING UP TX. RX5: LDA TXC ;TX COMPUTER CPI MDS800 LDA MSGBUF+1 ;MESSAGE CODE CPI DATA JNZ RX11 ;JUMP IF NOT DATA BLOCK LHLD NEXT LXI D,128 DAD D SHLD NEXT CALL LOG ;PUT SECTOR COUNT ONTO SCREEN LXI H,RDCNT DCR M JNZ RX8 ;JUMP IF NOT TIME TO WRITE LXI H,BUFFER-128 NPUTNF JNZ RX12 LXI D,MSG1 ;'INPUT FILE NOT FOUND' CALL PRINT JMP BOOT RX12: CPI OPENM JNZ RX16 ;JUMP IF NOT OPEN CODE LXI H,FCB+12 ;ZERO THE FCB MVI B,24 XRA A RX13: MOV M,A INX H DCR B JNZ RX13 ;NOTE REC PUT FILE NAMELOSEF LXI D,MSG4 ;'File has been transmitted' CALL PRINT MVI C,ACK CALL POUT ;TELL TX THAT THE CLOSE IS FINISHED JMP RX8 RX18: CPI 6 JNZ RX8 ;JUMP IF NOT EOT (TX FAILED) LXI D,MSG8 ;'END OF TRAN    SMISSION' CALL PRINT JMP BOOT ; ;************************************************************; ; ; SUBROUTINES ; ;************************************************************ RECMSG: LXI H,MSGBUF SHLD MSGPTR LXI H,0 SHLD ************************* ; ; 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 ;BUILOGN: LXI D,0 ;LOGIN DRIVE A MVI C,LOGIN CALL BDOS RET DELET: LXI D,FCB MVI C,DELETE CALL BDOS ;DELETE THE FILE RET MAKE: LXI D,FCB MVI C,CREATE CALL BDOS RET SETD************************************************************* ; ; ENTRY: BYTE IS IN C ; ;................................................................ ; POUT: LDA RXC ;RX COMPUTER CPI PDS JNZ POUT2 ;JUMP IF NOT PDS COMPUTER CKODE ;RESET CRC CODE CALL REC ;GET MSG BYTE COUNT CALL REC ;GET MSG CODE LDA MSGBUF+1 CPI DATA JNZ RECM1 ;JUMP IF NOT DATA BLOCK LHLD NEXT SHLD MSGPTR ;SET SO THAT REC WILL STORE DATA IN BUF JMP RECM2 RECM1: CPI OPENM JNZ RD 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 OFM: MVI C,SETDMA CALL BDOS RET WRITEF: LXI D,FCB MVI C,WRITE CALL BDOS ;WRITE 1 SECTOR RET CLOSEF: LXI D,FCB MVI C,CLOSE CALL BDOS RET ;***************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 ;ALECM2 ;JUMP IF NOT OPEN MESSAGE LXI H,FCB+1 SHLD MSGPTR RECM2: LDA MSGBUF ;GET BYTE COUNT RECM3: ORA A JZ RECM4 ;JUMP IF DONE PUSH PSW CALL REC ;GET A BYTE POP PSW DCR A JMP RECM3 ;LOOP TO GET ALL BYTES RECM4: CALL REC ; 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 REC: CALL PIN ;GET THE CHARACTER LHLD MSGPTR MOV M,A ;STORE THE BYTE INX H SHLD MSGPTR LHLD CKODE XCH************************************************ ; LOG: ;LOG SECTOR # ON CONSOLE LDA RXC ;RX COMPUTER CPI MDS800 RZ ;RETURN IF NO CRT LHLD NEXTL MOV E,M INX H SHLD NEXTL TERNATE 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 ; ;********GET FIRST CRC BYTE CALL REC ;SECOND BYTE OF CRC LXI H,CKODE MOV A,M INX H ORA M JZ RECM5 ;JUMP IF CRC IS OK MVI C,RESEND CALL POUT JMP RECMSG RECM5: MVI C,ACK CALL POUT RET ; ;*****************************************G ;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 L MVI C,CONOUT ;CONSOLE OUT FUNCTION CALL BDOS LHLD NEXTL MOV A,M CPI ' ' ;LOOK FOR TENS SEPARATOR CZ LOG RET ; ;**************************************************************** ; ;POUT ; ;********************************************************** ; ;PIN ; RETURN BYTE IN A PIN: LDA RXC ;RX 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 AST ENTRY DE=ADDR OF STRING ; PRINT: LDA RXC ;RECEIVE COMPUTER CPI MDS800 RZ ;RETURN IF NO CRT MVI C,PRINTL CALL BDOS RET ; ;*********************************************************** ; ; 0 ' DB '12345678901' RDCNT: DB 0 ;READ SECTOR COUNT WRCNT: DB 0 ;WRITE SECTOR COUNT NEXT: DW BUFFER MSGPTR: DW MSGBUF MSGBUF: DS 140 ;BUFFER FOR MESSAGES FROM TX BUFFER: DS 50*128 END AT ANI 1 JZ PIN4 ;IF BYTE IS NOT HERE IN ADATA ;GET THE BYTE RET ;*********************************************************** ; ; CLEAR ; ;********************************* DATA SECTION ; ;*********************************************************** ; DS 50 STACK: CKODE: DW 0 ;CALCULATED CRC CRCTAB: DS 512 ;CRC TABLE MSG1: DB CR,LF,'INPUT FILE NOT FOUND',BELL,'$' MSG2: DB ************************** ; CLEAR: LDA RXC ;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- 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,'$' ;FOR FILE NAME MSG8: DB CR,LF,'END OF TRANSMISSION$' MSG9: 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 ; ;*********************************************************** ; DB CR,LF,'INVALID RX/TX DEFINITION',BELL,'$' TXC: DB 0 ;TX COMPUTER RXC: DB 0 ;RX COMPUTER CRLF: DB CR,LF,'$' NEXTL: DW SNUM ;POINTER TO SECTOR NUMBER BYTE SNUM: DB '1234567890 1234567890 1234567890 123456789     TITLE 'TX' ; Submitted by: Duane O'Shay, Consultant ; 36259 Forest Trail ; Elizabeth, Colorado 80107 ; March 7, 1983 ; ;********************************************************UND) ; 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 th ; 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 DEFIe 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*********** ; ; 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 Ae 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 consolNED 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  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 nlternate ; (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: e 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 swSPECS ; ; ; 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 - binaot = 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  ; (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 GROitch. ; ; 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: ; ry 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 bytcomputer & 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 res. ; 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 K, ; 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 n00H 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 OCCURAponse. ; 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, ; AWrite 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 begext file. ; ;**************************************************************** ; ; SNDMSG ; ENTRY A = MESSAGE CODE ; B = BYTE COUNT ; HL = DATA ADDR ;................................................................ ; ;SNDMSG:Initialize routinNCE 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 ; 'MEbort. ; ;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 inning 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.e. ; ;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. ;SSAGE 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 Einput 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 ; 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 AC Return. ; ;**************************************************************** ; ; EQUATES ; ;**************************************************************** ; ORG 100H TRUE EQU 0FFH FALSE EQU 000H BOOT EQU 00QU '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 ;*************************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 OV 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 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********************************* ; ; CODE SECTION ; ;********************************************************** ; TX: JMP TX0 DB 'DATE -- MARCH 7, 1983' TX0: LXI SP,STACK LXI H,FCB+1 MOV A,M ;CHECK TX COMPUTER 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 ;  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 ,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 EF 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  IF MDS-800 IS RECEIVING, HE HAS NO ; CONSOLE AS THAT PORT IS BEING USED ; FOR THE TRANSMISSION. THEREFORE TX ; WILL BRING UP RX. LDAXRA 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 ;WESETDM ;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  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  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 M 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  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,FAL    SE 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 LL 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 TRAMOV 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 C 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 B 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 ADNSMITTED' CALL PRINT CALL CLOSEF CALL PIN JMP TX9 ;TO GET NEXT FILE ;**************************************************************** ; ; SUBROUTINE SECTION ; ;**************************************************ALL PIN ;GET RESPONSE CPI RESEND RNZ ;RETURN IF NOT RESEND JMP SND1 ; ;****************************************************************** ; ; BLDTAB BUILD CRC TABLE ; ;****************************************************************** YTE 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 DRESS 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 ************** ; ; 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; 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,POLY 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;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 CA 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: 1 ;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      VI C,CONOUT ;CONSOLE OUT FUNCTION CALL BDOS LHLD NEXTL MOV A,M CPI ' ' ;LOOK FOR TENS SEPARATOR CZ LOG RET ; ;**************************************************************** ; ;POUT ; ;********************************************************** ; ;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 I 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 ; ;**************************************************************** ; ;  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***************************************************** ; ; ENTRY: BYTE IS IN C ; ;................................................................ ; POUT: LDA TXC ;TX COMPUTER CPI PDS JNZ POUT2 ;JUMP IF NOT PDS COMPUTER POUT1: 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  ENTRY DE=ADDR OF STRING ; ;**************************************************************** ; PRINT: LDA TXC ;TX COMPUTER CPI MDS800 RZ ;RETURN IF NO CRT MVI C,PRINTL CALL BDOS RET ; ;****** 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 REIN 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  ANI 1 JZ PIN4 ;IF BYTE IS NOT HERE IN ADATA ;GET THE BYTE RET ;*********************************************************** ; ; CLEAR ; ;******************************************************************************************************* ; ; 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. ; ;*****T ; ;************************************************************ ; ; DATA SECTION ; ;************************************************************ ; ; DS 50 STACK: ADDR: DW 0 ;DATA ADDRESS CKODE: DW 0 ;CALCULATECOMPUTER 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 ; ;********************************** ; 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 AN*************************************************************** ; 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 D 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 TRA     NSMITTED$' 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 DATE -- MARCH 7, 1983ۑ> Ӑۑ#ې>#TX ASMTX ASM&"BOOT8 COMBOOT8 ASM 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       TITLE BOOT8 ; Submitted by: Duane O'Shay, Consultant ; 36259 Forest Trail ; Elizabeth, Colorado 80107 ; March 7, 1983 ; ;******************************************************************* ; ; ROUTINE TO BOOT THE MDS-800 FROM THE PDS ; ; (SEE RX OR TX FOR MORE INFORMATION) ; PSTAT EQU 91H PDATA EQU 90H BOOT EQU 0000H ORG 100H BOOT8: JMP POUT DB 'DATE -- MARCH 7, 1983' POUT: IN PSTAT ANI 1 JZ POUT MVI A,' ' ;SPACE FOR BOOT OUT PDATA PIN: IN PSTAT ANI 2 JZ PIN IN PDATA CPI '>' JNZ PIN ;WAIT FOR A> JMP BOOT END : JMP POUT DB 'DATE -- MARCH 7, 1983' POUT: IN PSTAT ANI 1 JZ POUT MVI A,' ' ;SPACE FOR BOOT OUT PDATA PIN:                                                                                                                                                                                             !    !    "    "    #    #    $    $    %    %    &    &    '    '    (    (    )    )    *    *    +    +    ,    ,    -    -    .    .    /    /    0    0    1    1    2    2    3    3    4    4    5    5    6    6    7    7    8    8    9    9    :    :    ;    ;    <    <    =    =    >    >    ?    ?    @    @    A    A    B    B    C    C    D    D    E    E    F    F    G    G    H    H    I    I    J    J    K    K    L    L    M    M    N    N    O    O