;THIS VERSION DOES NOT CHANGE THE BAUD RATE. THIS MUST BE SET BEFORE ENTERING ;THIS PROGRAM. ;THIS IS A PACKAGE FOR FILE TRANSFER BETWEEN CP/M COMPUTERS. IT IS ;DESIGNED SO THAT ALMOST ANY TYPE OF FILE CAN BE TRANSFERRED. CODES ;BELOW 20 AND ABOVE 7F ARE TRANSFERRED AS DOUBLE BYTES USING THREE SPECIAL ;SIGNALLING CODES (11H, 12H, AND 13H). THIS ALLOWS FOR THE FASTEST TRANSFER ;FOR MOST TYPES OF FILES INCLUDING OBJECT FILES SINCE DOUBLE BYTES ARE ONLY ;NECESSARY FOR OUT OF RANGE CODES. ;THIS PROGRAM MUST RESIDE ON BOTH THE SYSTEMS WISHING TO TRANSFER ESPECIALLY ;IF OBJECT FILES ARE TO BE TRANSFERRED, DUE TO THE UNIQUE FORMAT. ;****************************************************** ;* THIS VERSION IS FOR THE BIG BOARD SERIAL CHANNEL A * ;****************************************************** ; ; ; ASEG ;DEFINE AN ABSOLUTE SEGMENT ORG 0100H ;ORIGINED FOR START OF CP/M. ; CALL MES0 ;OUTPUT INITIAL HELP MESSAGE. CALL INIT ;INITIALIZE SERIAL PORT A. ; ; POLLOP: MVI C,06H ;CHECK CONSOLE STATUS TO SEE IF CHAR IN. MVI E,0FFH ; " " " CALL 0005H ; " " " CPI 00H ; " " " JZ NOCHAR ;IF NONE DO NOT TRANSMIT. ; ; CPI 03H ;IF ^C END PROGRAM. JZ 0000H ; " ; CPI 08H ;IF ^H DISPLAY HELP MESSAGE. JNZ NXT1 ; " " CALL MES0 ; " " JMP POLLOP ;RE-LOOP. ; NXT1: CPI 12H ;IF ^R RECEIVE FILE FROM REMOTE. JNZ NXT2 ; " " CALL RECEIV ; " " JMP POLLOP ;RE-LOOP. ; NXT2: CPI 14H ;IF ^T SEND FILE TO REMOTE. JNZ NXT3 ; " " CALL SEND ; " " JMP POLLOP ;RE-LOOP. ; NXT3: CALL TXDATA ;OUTPUT CHARACTER ON SERIAL PORT A. ; ; NOCHAR: CALL RXDATA ;CHECK FOR RECEIVE DATA. JZ POLLOP ;IF NONE JUST RE-LOOP. ; MVI C,06H ;SEND CHARACTER TO CONSOLE. MOV E,A ; " " CALL 0005H ; " " ; JMP POLLOP ;KEEP LOOPING. PAGE ;THIS IS THE RECEIVE ROUTINE. WHEN CALLED IT PROMPTS THE USER FOR THE ;FILE NAME AND THEN CAUSES A TRANSFER FROM THE REMOTE COMPUTER TO THIS ;SYSTEM. UPON FINISHING IT EXECUTES A RETURN TO THE MAIN LOOP IN ORDER TO ;ACCEPT FURTHER COMMANDS. ; ; ; RECEIV: CALL MES2 ;OUTPUT CP/M FILE NAME MESSAGE. CALL SETFCB ;LOAD FCB WITH FILE NAME ETC. JNZ ERROR ;PRINT ENTRY ERROR MESSAGE & RETURN. ; ; MVI C,0FH ;OPEN FILE. LXI D,005CH ; " CALL 0005H ; " ; CPI 0FFH ;IF ACC IS FF FILE NOT FOUND, JZ MAKER ;SO JUMP AND MAKE NEW FILE. ; ; FINLOP: CALL MES8 ;OUTPUT OVERWRITE Y/N MESSAGE. MVI C,01H ;READ CONSOLE CHARACTER. CALL 0005H ; " CPI 'N' ;IF NO OUTPUT ABORT MESSAGE. JZ MES9 ; " " CPI 'Y' ;IF YES CONTINUE AND LOAD FILE, JNZ FINLOP ;OTHERWISE RE-LOOP UNTIL Y OR N. ; MVI C,13H ;DELETE OLD FILE. LXI D,005CH ; " CALL 0005H ; " ; MAKER: MVI C,16H ;MAKE NEW FILE. LXI D,005CH ; " CALL 0005H ; " ; CPI 0FFH ;IF ACC IS FF NO SPACE IS LEFT. JZ MES7 ; " " ; ; CALL MES5 ;OUTPUT RECEIVING MESSAGE. ; TRANSX: LXI H,0080H ;PREPARE TO INPUT 128 BYTE BLOCK. ; PUTLOP: CALL RX800 ;INPUT CHARACTER. JZ TERMIN ;IF ^Z DETECTED TERMINATE. ; MOV M,A ;STORE INPUT IN DISK TRANSIENT MEMORY. ; INR L ;INCREMENT THE MEMORY POINTER. JNZ PUTLOP ;STOP IF L OVERFLOWS, OTHERWISE KEEP LOOPING. ; ; MVI C,15H ;WRITE FILE SEQUENTIALLY. LXI D,005CH ; " CALL 0005H ; " ; CPI 00H ;IF ACC IS NOT ZERO THEN JNZ MES7 ;NO SPACE IS LEFT ON DISK. JMP TRANSX ;RE-LOOP AND INPUT NEXT 128 BYTE BLOCK. ; ; ; TERMIN: MVI M,' ' ;PUT ASCII SPACES IN REST OF BLOCK. INR L ; " " JNZ TERMIN ; " " ; MVI C,15H ;WRITE FILE SEQUENTIALLY. LXI D,005CH ; " CALL 0005H ; " ; MVI C,10H ;CLOSE FILE. LXI D,005CH ; " CALL 0005H ; " ; CALL MES6 ;OUTPUT "FINISHED" MESSAGE. RET ;RETURN TO CALLING PROGRAM. PAGE ;THIS IS THE SEND ROUTINE. WHEN CALLED IT PROMPTS THE USER FOR THE FILE ;NAME AND THEN CAUSES A TRANSFER TO THE REMOTE COMPUTER FROM THIS ;SYSTEM. UPON FINISHING IT EXECUTES A RETURN TO THE MAIN LOOP IN ORDER TO ;ACCEPT FURTHER COMMANDS. ; ; ; SEND: CALL MES2 ;OUTPUT CP/M FILE NAME MESSAGE. CALL SETFCB ;LOAD FCB WITH FILE NAME ETC. JNZ ERROR ;PRINT ENTRY ERROR MESSAGE & RETURN. ; MVI C,0FH ;OPEN FILE. LXI D,005CH ; " CALL 0005H ; " ; CPI 0FFH ;IF ACC IS FF FILE NOT FOUND. JNZ FOUND ; " " CALL MES3 ;OUTPUT FILE NOT FOUND MESSAGE. RET ;RETURN TO CALLING PROGRAM. ; ; FOUND: CALL MES4 ;OUTPUT SENDING MESSAGE. ; TRANS: MVI C,14H ;READ FILE SEQUENTIALLY. LXI D,005CH ; " CALL 0005H ; " ; CPI 00H ;IF ACC IS NOT ZERO END OF FILE, JNZ STOPER ;SO SEND TERMINATION CHARACTERS ETC. ; ; LXI H,0080H ;PREPARE TO OUTPUT 128 BYTE BLOCK. ; TRNLOP: MOV A,M ;SEND CHARACTER TO REMOTE. CALL TX800 ; " " ; INR L ;POINT AT NEXT LOCATION FOR TRANSFER. JNZ TRNLOP ;IF L = 00 BLOCK IS TRANSFERRED, SO JMP TRANS ;JUMP AND PICK UP NEXT 128 BYTE BLOCK. ; ; STOPER: MVI A,1AH ;SEND ^Z TO TERMINATE FILE TRANSFER. CALL TXDATA ; " " CALL MES6 ;OUTPUT "FINISHED" MESSAGE. RET ;RETURN TO CALLING PROGRAM. PAGE ;THIS ROUTINE PREPARES THE FCB WITH DATA INPUT FROM THE KEYBOARD. IT RETURNES ;WHEN A CARRIAGE RETURN IS RECEIVED, THE FCB HAVING BEING LOADED WITH THE ;RELEVANT FILE NAME AND DISK DRIVE NUMBER. ;THE ROUTINE WAITS FOR A CHARACTER, IF IT IS A COLON THE PREVIOUS CHARACTER ;IS USED TO SET THE SELECTED DRIVE. IF A COLON IS NOT FOUND THE ;DEFAULT DRIVE IS SELECTED. NEXT CHARACTERS IMMEDIATELY AFTER THE COLON ;ARE LOADED INTO FCB LOCATIONS 1 TO 8 (MAX OF 8). FINALLY A FULL STOP IS ;SEARCHED FOR AND THE FIRST THREE CHARACTERS LOADED INTO THE THREE FILE TYPE ;BYTES. ENTRY ERRORS ARE FLAGGED BY THE ZERO BIT BEING CLEAR ON RETURN. ; ; SETFCB: LXI H,005CH ;PUT BLANKS UP TO 0067H. CLRLOP: MVI A,' ' ; " MOV M,A ; " MOV A,L ; " INX H ; " CPI 67H ; " JNZ CLRLOP ; " ; ZERLOP: MVI A,00H ;PUT ZERO IN REST. MOV M,A ; " MOV A,L ; " INX H ; " CPI 7FH ; " JNZ ZERLOP ; " ; ; LXI H,005CH ;SET HL TO POINT AT BEGINNING OF FCB. MVI M,00H ;SET THE DRIVE CODE TO DEFAULT. ; FCBLOP: PUSH H ;SAVE VITAL REGISTER PAIRS ON STACK. MVI C,01H ;SEÔ UÐ TÏ USÅ BDOÓ CONSOLÅ INPUT FUNCTION. CALL 0005H ;CALL BDOS. POP H ;RESTORE VITAL REGISTERS FROM STACK. ; CPI ' ' ;IGNORE A SPACE. JZ FCBLOP ; " ; CPI ':' ;IF A COLON SET DRIVE CODE AND RESET POINTER. JZ COLON ;OTHERWISE CHECK FOR CARRIAGE RETURN. ; CPI 0DH ;IF CARRIAGE RETURN END PROGRAM. RZ ; " " ; CPI '.' ;IF FULL STOP INPUT FILE TYPE. JZ FITYPE ; " " ; MOV C,A ;PUT CHARACTER IN REG C. INX H ;INCREMENT THE FCB POINTER MOV A,L ;AND ENSURE IT IS NOT 0065H. CPI 65H ; " " JZ SIGERR ;SIGNAL ENTRY ERROR. ; MOV M,C ;STORE CHARACTER IN FCB. JMP FCBLOP ;RE-LOOP FOR NEXT CHARACTER. ; ; ; COLON: MOV A,M ;PICK UP DRIVE CHARACTER. ORA A ;IF ZERO NO CHAR BEFORE COLON. JZ FCBLOP ; " " DCR A ;FIX DRIVE CODE. ANI 00001111B ; " INR A ; " ; LXI H,005CH ;PLACE DRIVE CODE IN FCB LOCATION 0. MOV M,A ; " " " JMP FCBLOP ;RE-LOOP FOR NEXT CHARACTER. ; ; ; FITYPE: LXI H,0064H ;POINT HL AT BEGINNING OF FILE TYPE - 1. ; TYPLOP: PUSH H ;SAVE VITAL REGISTER PAIRS ON STACK. MVI C,01H ;SEÔ UÐ TÏ USÅ BDOÓ CONSOLÅ INPUT FUNCTION. CALL 0005H ;CALL BDOS. POP H ;RESTORE VITAL REGISTERS FROM STACK. ; CPI 0DH ;IF CARRIAGE RETURN END ROUTINE. RZ ; " " ; MOV C,A ;PUT CHARACTER IN REG C. INX H ;INCREMENT THE FCB POINTER MOV A,L ;AND ENSURE IT IS NOT 0068H. CPI 68H ; " " JZ SIGERR ;SIGNAL ENTRY ERROR. ; MOV M,C ;STORE CHARACTER IN FCB. JMP TYPLOP ;RE-LOOP FOR NEXT CHARACTER. ; ; SIGERR: MVI A,80H ;CLEAR THE ZERO BIT. DCR A ; " RET ;RETURN TO CALLING PROGRAM. PAGE ;THIS ROUTINE OUTPUTS A STRING FROM MEMORY STARTING AT THE ADDRESS POINTED ;TO BY THE REGISTER PAIR HL AND ENDING AT THE LOCATION CONTAINING FF. ; ; ; STRING: MOV A,M ;LOAD ACC WITH CHARACTER. CPI 0FFH ;IF CHARACTER FF RETURN. RZ ; " ; CALL TX800 ;SEND CHARACTER TO REMOTE. INX H ;INC MEMORY POINTER AND, JMP STRING ;RE-LOOP. PAGE ;THIS ROUTINE OUTPUTS A STRING OF LENGTH N, WHERE N IS CONTAINED IN THE ;LOCATION POINTED TO BY HL. ;THE STRING STARTS AT THE LOCATION POINTED TO BY HL + 1. ; ; ; OUTBUF: MOV B,M ;LOAD B AS A LOOP COUNTER. ; OUTLOP: INX H ;OUTPUT CHARACTER TO REMOTE. MOV A,M ; " CALL TX800 ; " DCR B ;LOOP UNTIL B IS ZERO. JNZ OUTLOP ; " ; RET ;RETURN TO CALLING PROGRAM. ; ; ; KEYBUF: DB 0EH,00H ;DEFINE KEYBOARD INPUT BUFFER (MAX = 14) DB ' ' ; " " " DB ' ' ; " " " PAGE ;THIS ROUTINE IS USED TO TRANSMIT DATA TO THE REMOTE COMPUTER. ;TO ALLOW FOR DISK TRANSFERS AT THE REMOTE END IT ALLOWS FOR "ACK" PROTOCOL. ;THIS ROUTINE ONLY TRANSMITS A CHARACTER AFTER AN "ACK" IS RECEIVED. WHEN ;THE "ACK" IS RECEIVED CONTROL WILL BE RETURNED TO THE CALLING PROGRAM. ;TO USE THE ROUTINE THE ACCUMULATOR IS LOADED WITH THE CHARACTER TO BE SENT, ;AND THIS ROUTINE IS CALLED. ;THIS ROUTINE ALSO CAUSES THE REMAPPING OF THE CODES TO ALLOW TRANSMISSION ;OF OUT OF RANGE CHARACTERS USING DOUBLE BYTES. MAPPING IS AS FOLLOWS: ; ; (DC1) 11H ---------- CODES 00H TO 1FH ; (DC2) 12H ---------- CODES 80H TO 9FH ; (DC2) 13H ---------- CODES A0H TO FFH ; ; ; TX800: PUSH PSW ;SAVE DATA TO BE TRANSMITTED ON THE STACK. PUSH PSW ; " " " PUSH PSW ; " " " ; AKWAIT: CALL RXDATA ;WAIT FOR AN "ACK". JZ AKWAIT ; " CPI 06H ; " JNZ AKWAIT ; " POP PSW ;RESTORE DATA TO BE TRANSMITTED. ; CPI 20H ;IF DATA LESS THAN 20 OUTPUT DC1 FIRST. JNC RAWDAT ; " " " MVI A,11H ; " " " CALL TXDATA ; " " " POP PSW ;ADD 20 TO DATA THEN, ADI 20H ; " JMP DATOUT ;JUMP AND OUTPUT DATA. ; RAWDAT: CPI 80H ;IF DATA LESS THAN 80 JUST OUTPUT DATA. JNC TRYDC2 ; " " " POP PSW ;RESTORE DATA THEN, JMP DATOUT ;JUMP AND OUTPUT DATA. ; TRYDC2: CPI 0A0H ;IF DATA LESS THAN A0 OUTPUT DC2 FIRST. JNC TRYDC3 ; " " " MVI A,12H ; " " " CALL TXDATA ; " " " POP PSW ;ADD A0 TO DATA THEN, ADI 0A0H ; " JMP DATOUT ;JUMP AND OUTPUT DATA. ; TRYDC3: MVI A,13H ;IF DATA LESS THAN 100 OUTPUT DC3 FIRST. CALL TXDATA ; " " " POP PSW ;ADD 80 TO DATA THEN, ADI 80H ; " DATOUT: CALL TXDATA ;SEND DATA TO THE REMOTE COMPUTER. ; ; TXRETN: POP PSW ;RESTORE ACCUMULATOR AND, RET ;RETURN TO CALLING PROGRAM. PAGE ;THIS ROUTINE DOES THE INVERSE OF TX800. IT BASICALLY RECEIVES DATA AND ;PLACES IT IN THE ACCUMULATOR. WHERE THE SPECIAL CODES DC1, DC2 AND DC3 ;ARE RECEIVED THE ROUTINE WAITS FOR THE SECOND CHARACETR AND CAUSES THE ;NECESSARY CONVERSION TO AN 8 BIT QUANTITY. UPON EXIT IF THE ZERO BIT IS ;SET A ^Z HAS BEEN DETECTED. ; ; ; RX800: MVI A,06H ;OUTPUT AN "ACK". CALL TXDATA ; " ; RXWAIT: CALL RXDATA ;WAIT FOR CHARACTER TO BE RECEIVED. JZ RXWAIT ; " " ; CPI 1AH ;IF ^Z RECEIVED EXIT WITH ZERO BIT SET. RZ ; " " " ; CPI 11H ;IF DC1 RECEIVED WAIT FOR NEXT CHAR & ADD E0. JNZ RXDC2 ; " " " " RXWAI1: CALL RXDATA ; " " " " JZ RXWAI1 ; " " " " ADI 0E0H ; " " " " JMP RXEND ;JUMP AND EXIT WITH DATA. ; RXDC2: CPI 12H ;IF DC2 RECEIVED WAIT FOR NEXT CHAR & ADD 60. JNZ RXDC3 ; " " " " RXWAI2: CALL RXDATA ; " " " " JZ RXWAI2 ; " " " " ADI 60H ; " " " " JMP RXEND ;JUMP AND EXIT WITH DATA. ; RXDC3: CPI 13H ;IF DC3 RECEIVED WAIT FOR NEXT CHAR & ADD 80. JNZ RXEND ; " " " " RXWAI3: CALL RXDATA ; " " " " JZ RXWAI3 ; " " " " ADI 80H ; " " " " ; RXEND: CPI 80H ;CLEAR THE CARRY BIT & RETURN. RNZ ; " " CPI 81H ; " " RNZ ; " " PAGE ;THESE TWO ROUTINES ARE THE RECEIVE AND TRANSMIT SERIAL DATA ROUTINES. ;TXDATA CAUSES A CHARACTER TO BE SENT AS LONG AS THE TRANSMIT BUFFER IS ;EMPTY. IF IT IS NOT EMPTY THE PROGRAM WILL LOOP UNTIL IT IS. DATA IS PASSED ;TO TXDATA IN THE ACCUMULATOR. ;RXDATA CHECKS THE RECEIVE DATA READY FLAG. IF DATA IS READY IT IS LOADED ;IN THE ACCUMULATOR AND THE ZERO BIT IS CLEAR UPON RETURN, OTHERWISE THE ;ACCUMULATOR CONTENTS ARE INDETERMINATE AND THE ZERO BIT IS SET. ; ; ; TXDATA: PUSH PSW ;SAVE CHARACTER ON THE STACK. TXWAIT: IN 06H ;TEST BIT 2 TO SEE IF TX BUFFER IS EMPTY. ANI 00000100B ; " " " JZ TXWAIT ;LOOP UNTIL TRANSMITTER IS READY. POP PSW ;TRANSMIT CHARACTER. ANI 01111111B ;LIMIT DATA RANGE TO 7 BITS. OUT 04H ; " ; RET ;RETURN TO CALLING PROGRAM. ; ; ; RXDATA: IN 06H ;TEST BIT 0 TO SEE IF DATA AVAILABLE. ANI 00000001B ; " " " RZ ;IF NOT AVAILABLE RETURN WITH ZERO BIT SET. ; IN 04H ;PUÔ RECEIVÅ DATÁ IN ACCUMULATOR. CMA ;LIMIT DATA RANGE TO 7 BITS, ORI 10000000B ;AND CLEAR TO ZERO BIT. CMA ; " ; RET ;RETURN TO CALLING PROGRAM. PAGE ;INITIALIZATION ROUTINE FOR INTERFACES. WHEN INITIALIZATION IS COMPLETE THE ;Z80 SIO IS SET FOR 8 DATA BITS, NO PARITY, AUTOMATIC DCD & CTS AND CLOCK ;DIVIDE BY 16. ; ; ; INIT: LXI H,SETUP ;POINT HL AT BEGINNING OF UART SET UP TABLE. MVI D,11H ;SET UP FOR 17 LOOPS. ; INILOP: MOV A,M ;OUTPUT SET UP BYTE. OUT 06H ; " INX H ; " DCR D ;LOOP 17 TIMES. JNZ INILOP ; " RET ;RETURN TO CALLING PROGRAM. ; ; SETUP: DB 00011000B ;ENSURE CHANNEL RESET. DB 00011000B ; " DB 00000001B ;SETUP REG 1 INIT. DB 00000000B ;WRITE REG 1. DB 00000010B ;SETUP REG 2 INIT. DB 00000000B ;WRITE REG 2. DB 00000011B ;SETUP REG 3 INIT. DB 11000001B ;WRITE REG 3. DB 00000100B ;SETUP REG 4 INIT. DB 01000100B ;WRITE REG 4. DB 00000101B ;SETUP REG 5 INIT. DB 11101010B ;WRITE REG 5. DB 00000110B ;SETUP REG 6 INIT. DB 00000000B ;WRITE REG 6. DB 00000111B ;SETUP REG 7 INIT. DB 00000000B ;WRITE REG 7. DB 00000000B ;SELECT CHANNEL 0. PAGE MES0: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,HATPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. HATPRT: DB 0DH,0AH DB 'CP/M INTER COMPUTER COMMUNICATION PROGRAM, KAYPRO VERSION' DB 0DH,0AH DB 0DH,0AH DB 'MAKE SURE THAT BOTH COMPUTERS HAVE THEIR BAUD RATES',0DH,0AH DB 'SET TO THE SAME RATE, WHEN TRANSFERRING A FILE START',0DH,0AH DB 'UP THE TRANSMIT END FIRST, THE RECEIVE END CONTROLS',0DH,0AH DB 'THE TRANSFER PROCESS',0DH,0AH DB 0DH,0AH DB 0DH,0AH DB '^T --------- TRANSMIT FILE TO REMOTE',0DH,0AH DB '^R --------- RECEIVE FILE FROM REMOTE',0DH,0AH DB '^H --------- DISPLAY THIS HELP MESSAGE',0DH,0AH DB '^C --------- EXIT TO SYSTEM',0DH,0AH DB 0DH,0AH DB 0DH,0AH DB 'ENTER SELECTION -------> $' PAGE MES2: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,COMCPM ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. COMCPM: DB 0DH,0AH DB 0DH,0AH DB 'CP/M FILE NAME ------> $' MES3: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,NOTPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. NOTPRT: DB 0DH,0AH DB 0DH,0AH DB 'FILE NOT FOUND',0DH,0AH,'$' MES4: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,SENPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. SENPRT: DB 0DH,0AH DB 0DH,0AH DB 'SENDING FILE TO REMOTE',0DH,0AH,'$' PAGE MES5: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,RECPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. RECPRT: DB 0DH,0AH DB 0DH,0AH DB 'RECEIVING FILE FROM REMOTE',0DH,0AH,'$' MES6: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,DUNPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. DUNPRT: DB 0DH,0AH DB 0DH,0AH DB 'FINISHED ! ',0DH,0AH,'$' MES7: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,SPAPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. SPAPRT: DB 0DH,0AH DB 0DH,0AH DB 'NO MORE SPACE ON DISK ! ',0DH,0AH,'$' MES8: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,WISPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. WISPRT: DB 0DH,0AH DB 0DH,0AH DB 'DO YOU WISH TO OVERWRITE EXISTING FILE Y OR N ------> $' PAGE MES9: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,ABRPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. ABRPRT: DB 0DH,0AH DB 0DH,0AH DB 'OPERATION ABORTED ',0DH,0AH,'$' ERROR: MVI C,09H ;SET UP TO USE BDOS PRINT FUNCTION. LXI D,ERRPRT ; " " " CALL 0005H ;CALL BDOS. RET ;RETURN TO CALLING PROGRAM. ERRPRT: DB 0DH,0AH DB 0DH,0AH DB 'ENTRY ERROR',0DH,0AH,'$' PAGE END