;******************************************************************* ;* * ;* THIS PROGRAM COPIES A FILE FROM * ;* ONE DISC TO ANOTHER USING ONLY ONE DISC DRIVE * ;* PROGRAM BY JTS SOFTWARE; ALL RIGHTS RESERVED * ;* DATE: 7/16/81 * ;* EDITION: 1 * ;* * ;******************************************************************* ; BOOT EQU 000H ;SYSTEM REBOOT BDOS EQU 0005H ;BDOS ENTRY POINT FCBL EQU 005CH ;FIRST FILE NAME SFCB EQU FCBL ;SOURCE FCB FCB2 EQU 006CH ;SECOND FILE NAME TPA EQU 100H ;BEGINNING OF TPA SAVE EQU 80H ; CONSIN EQU 1 ;CONSOLE INPUT FUNC# PRINTF EQU 9 ;PRINT BUFFER FUNC# OPENF EQU 15 ;OPEN FILE FUNC# CLOSEF EQU 16 ;CLOSE FILE FUNC# DELETEF EQU 19 ;DELETE FILE FUNC# READF EQU 20 ;SEQUENTIAL READ WRITEF EQU 21 ;SEQUENTIAL WRITE MAKEF EQU 22 ;MAKE FILE FUNC# RESETD EQU 13 ;RESET DISK SYSTEM DMA EQU 26 ;SET DMA ADDRESS ; ORG TPA ;BEGINNING OF TPA START: LXI SP,STACK ;LOCAL STACK ; ; MOVE SECOND FILE NAME TO DFCB MVI C,16 ;HALF AN FCB LXI D,FCB2 ;SOURCE OF MOVE LXI H,DFCB ;DESTINATION FCB MFCB: LDAX D ;SOURCE FCB INX D ;READY NEXT MOV M,A ;DESTINATION FCB INX H ;READY NEXT DCR C ;COUNT 16...0 JNZ MFCB ;LOOP 16 TIMES ; ; NAME HAS BEEN MOVED, ZERO CR XRA A ;A = 00 STA DFCBCR ;CURRENT REC = 0 ; ; SOURCE AND DESTINATION FCB'S READY ; LXI D,SFCB ;SOURCE FILE CALL OPEN ;ERROR IF 255 LXI D,NOFILE ;READY MESSAGE INR A ;255 BECOMES 0 CZ FINIS ;DONE IF NO FILE ; ; SOURCE FILE OPEN, COPY UNTIL ; END OF FILE ON SOURCE MVI B,01H COPY: CALL UPDATE ;UP TO RIGHT DATA BUFFER PUSH B MVI C,DMA ;SET DMA ADDRESS CALL BDOS ; LXI D,SFCB ;SOURCE CALL READ ;READ NEXT RECORD ORA A ;END OF FILE? JNZ EOFILE ;JMP TO CLOSE SOURCE FILE ; ; NOT END OF FILE, CONTINUE TO READ POP B INR B ; JMP COPY ;LOOP UNTIL EOF ; ; END OF FILE, PREPARE TO COPY EOFILE: LXI D,READY ;READY MESSAGE MVI C,PRINTF ; CALL BDOS ;WRITE MESSAGE MVI C,CONSIN ; CALL BDOS ;GET OK FROM OPERATOR THAT DEST IS READY ANI 0DFH ;AND OFF 5TH BIT FOR SHIFT CPI 59H ;IF OP TYPED Y THEN DISC IS READY JNZ EOFILE ;JMP BACK IF NOT READY LXI D,CRLF ;CARRAGE RET LINE FEED MVI C,PRINTF ;PRINT CARRAGE RET LINE CALL BDOS ;DO IT ; ; PREPARE DESTINATION FILE MVI C,RESETD ;RESET DISK SYSTEM CALL BDOS ; LXI D,DFCB ;DESTINATION MVI A,00H ;MAKE SURE DEST FCB HAS RIGHT DISC NUM STAX D ;STORE ZERO IN FIRST BYTE OF DFCB CALL DELETE ;REMOVE IF PRESENT ; LXI D,DFCB ;DESTINATION CALL MAKE ;CREATE THE FILE LXI D,NODIR ;READY MESSAGE INR A ;255 BECOMES 0 CZ FINIS ;DONE IF NO DIR SPACE ; ; DEST FILE OPEN, ; COPY UNTIL END OF FILE ON SOURCE POP B ;RETREIVE COUNTR MOV A,B STA STORE ;STORE COUNTR IN BUFFER MVI B,01H ;SET RECORD COUNTR COPY2: CALL UPDATE ;UPDATE DBUFF POINTR PUSH B MVI C,DMA ;UPDATE DMA NUMBER CALL BDOS ; LXI D,DFCB ;DESTINATION CALL WRITE ;WRITE RECORD LXI D,SPACE ;READY MESSAGE ORA A ;00 IF WRITE OK JNZ FINIS ;END IF DISC IS FULL LDA STORE ;GET COUNTR DCR A ;DECREMENT COUNTR JZ DONE ;DONE ? STA STORE ;STORE COUNTR IF NOT DONE POP B INR B ;INCREMENT RECORD COUNTR JMP COPY2 ;LOOP UNTIL EOF ; END OF FILE, CLOSE DESTINATION DONE: LXI D,DFCB ;DESTINATION CALL CLOSE ;255 IF ERROR LXI D,WRPROT ;READY MESSAGE INR A ;255 BECOMES 00 CZ FINIS ;SHOULDN'T HAPPEN ; ;COPY COMPLETE, END LXI D,NORMAL ;READY MESSAGE ; FINIS: ;WRITE MESSAGE GIVEN BY DE, REBOOT MVI C,PRINTF CALL BDOS ;WRITE MASSAGE JMP BOOT ; ; SYSTEM INTERFACE SUBROUTINES ; (ALL RETURN DIRECTLY FROM BDOS) ; OPEN: MVI C,OPENF JMP BDOS ; CLOSE: MVI C,CLOSEF JMP BDOS ; DELETE: MVI C,DELETEF JMP BDOS ; READ: MVI C,READF JMP BDOS ; WRITE: MVI C,WRITEF JMP BDOS ; MAKE: MVI C,MAKEF JMP BDOS UPDATE: LXI D,300H ;BASE ADDRESS FOR DATA BUFFER MOV A,B ;MOV COUNTR TO A REG FOR MANIPULATION LOOP: PUSH H LXI H,80H ; DAD D ;ADD BASE FOR ADDRESS UPDATE MOV D,H ;RESTORE D REG MOV E,L ;RESTORE E REG POP H ;RETORE H AND L DCR A ;DECR COUNTR JNZ LOOP ;JMP BACK IF NOT DONE RET ; CONSOLE MESSAGES CRLF DB 0DH,0AH,'$' READY: DB 'TYPE "Y" WHEN DESTINATION DISC IS IN DRIVE $' NOFILE: DB 'NO SOURCE FILE$' SPACE: DB 'OUT OF DATA SPACE$' WRPROT: DB 'WRITE PROTECTED$' NODIR: DB 'NO DIRECTORY SPACE$' NORMAL: DB 'COPY COMPLETE$' ; ; DATA AREAS DFCB: DS 33 ;DESTINATION FCB DFCBCR: EQU DFCB+32 ;CURRENT RECORD ; DS 32 ;16 LEVEL STACK STACK: STORE: DS 1 END  PUSH B 0180 0E1A MVI C,DMA ;UPDATE DMA NUMBER 0182 CD0500 CALL BDOS ; 0185 116A02 LXI D,DFCB ;DESTINATION