; BIGBURST--BIG FILE BACKUP/RESTORE ; COPYRIGHT 1982, G. YOUNG, INC. ; UPDATED 10/9/82 * * TO EXECUTE, ENTER THE PROGRAM NAME FOLLOWED BY THE FILE MASK: * A>BIGBURST FILENAME.TYP/B (FOR BACKUP) OR * A>BIGBURST FILENAME.TYP/R (FOR RESTORE) * THE PURPOSE OF THIS PROGRAM IS TO BACKUP AND RESTORE FILES FROM/TO * A HARD DISK WHERE THE FILE IS TOO BIG TO FIT ON ONE FLOPPY DISK. * IT BACKS UP BY COPYING THE LARGE FILE TO MULTIPLE SMALL FILES * WHICH WILL FIT ON THE FLOPPY. THE FILE TYPE OF EACH OF THESE SMALL * FILES IS A SEQUENTIAL NUMBER FROM 001 TO 255 WITH THE LAST RECORD * ON THE LAST FILE CONTAINING AN INDICATOR THAT THIS IS THE LAST FILE. * THE RESTORE PROCESS IS DONE BY COMBINING THESE SMALL FILES BACK INTO * THE LARGE FILE. * CHANGED 10/9/82 TO ASK QUESTIONS ON FLOPPY DRIVE # * WRITTEN BY GARY YOUNG, BOX 3218, NO. HOLLYWOOD, CA 91609 TITLE '*** BIG FILE BACKUP/RESTORE ***' BDOS EQU 5 CR EQU 0DH LF EQU 0AH TBUF EQU 80H TFCB EQU 5CH BOOT EQU 0 ORG 100H JMP START DB 'COPYRIGHT 1982, G. YOUNG, INC.' START LXI SP,STACK+80 LDA TFCB+1 ;SEE IF A MASK WAS ENTERED CPI 20H ;BUFFER WILL BE BLANK IF NOT JZ INPUTERR LXI H,TFCB ;SAVE THE INPUT FILE NAME LXI D,HOLDFCB MVI B,16 CALL MOVE LXI D,HOLDFCB+16 MVI B,20 CALL CLEAR LXI H,TBUF ;SEARCH FOR /B OR /R MVI B,80 FINDSLSH MOV A,M CPI '/' JZ BORR INX H DCR B JNZ FINDSLSH INPUTERR LXI D,ERROR1 ERROR CALL OUTPUT JMP BOOT BORR INX H ;NEXT CHAR MUST BE A B OR R MOV A,M CPI 'B' JZ QUEST1 CPI 'R' JNZ INPUTERR QUEST2 LXI D,SRCFLPMSG CALL QUESTION ORA A JNZ QUEST2A LDA SRCFLP JMP QUEST2B QUEST2A LDA INREC QUEST2B STA FLOPPY JMP RESTORE QUEST1 LXI D,DESTFLPMSG CALL QUESTION ORA A JNZ QUEST1A LDA DESTFLP JMP QUEST1B QUEST1A LDA INREC QUEST1B STA FLOPPY JMP BACKUP RESTORE LXI H,TFCB LXI D,HDFCB MVI B,12 ;CREATE A HARD DISK FCB CALL MOVE LXI D,HDFCB+12 MVI B,24 CALL CLEAR LXI H,0000 SHLD RECCNT XRA A STA FILECNT MVI A,'$' ;CREATE A TEMPORARY FILE STA HDFCB+9 STA HDFCB+10 STA HDFCB+11 LXI H,MSG3A ;MARK AS "RESTORE" IN MESSAGE LXI D,MSG3 MVI B,8 CALL MOVE LXI H,MSG0A LXI D,MSG0 ;CHANGE THE PROMPT MESSAGE MVI B,10 CALL MOVE LXI D,HDFCB ;SEE IF THE TEMP FILE IS THERE ON MVI C,0FH ;THE HARD DISK CALL BDOS INR A JZ MAKEHD LXI D,HDFCB ;DELETE IT IF IT IS MVI C,13H CALL BDOS MAKEHD LXI D,HDFCB ;MAKE THE HARD DISK FILE MVI C,16H CALL BDOS LXI D,ERROR4 ;ERROR IF DIRECTORY FULL INR A JZ ERROR LOADFLP CALL GENFCB LOAD2 CALL MOUNT LXI D,FLPFCB ;SEE IF FLOPPY FILE IS ON THAT DISK MVI C,0FH CALL BDOS INR A JNZ OPEN2 ;YES, THE RIGHT ONE IS MOUNTED LXI D,MESSAGE2 ;NO, WRONG DISK IS MOUNTED CALL OUTPUT JMP LOAD2 OPEN2 LXI D,HDFCB+12 ;OPEN THE HARD DISK AGAIN MVI B,24 CALL CLEAR LXI D,HDFCB MVI C,0FH CALL BDOS LHLD RECCNT ;POSITION TO END OF FILE SHLD HDFCB+33 LXI D,HDFCB ;RANDOM READ MVI C,21H CALL BDOS COPYLOOP2 CALL LOADBUFF2 ;ACTUAL COPY IS DONE HERE CALL WRITEBUF2 CALL DEBUG LDA EOF CPI 2 JZ ENDOFFILE2 CPI 1 JZ DISKMPTY JMP COPYLOOP2 ENDOFFILE2 LXI D,HDFCB ;CLOSE HARD DISK MVI C,10H CALL BDOS LXI D,HOLDFCB ;SEE IF THE FILE IS THERE MVI C,0FH CALL BDOS INR A JZ RENAME ;NO, RENAME THE TEMP VERSION AS THE FINAL NAME LXI D,BAKFCB ;SEE IF THERE IS A BACKUP FILE NAME THERE MVI B,36 CALL CLEAR LXI H,HOLDFCB LXI D,BAKFCB MVI B,36 CALL MOVE LXI H,BAK LXI D,BAKFCB+9 MVI B,3 CALL MOVE ;CREATE THE BACKUP FILE NAME LXI D,BAKFCB ;DELETE IT IF IT IS THERE MVI C,13H CALL BDOS LXI H,BAKFCB LXI D,HOLDFCB+16 MVI B,16 CALL MOVE LXI D,HOLDFCB ;RENAME THE FINAL FILE NAME AS .BAK MVI C,17H CALL BDOS RENAME LXI H,HOLDFCB LXI D,HDFCB+16 ;RENAME THE TEMP FILE TO THE PERMANENT NAME MVI B,16 CALL MOVE LXI D,HDFCB MVI C,17H ;RENAME .$$$ AS .XXX (FINAL NAME) CALL BDOS LXI D,ERROR5 ;FINISHED JMP ERROR DISKMPTY LXI D,FLPFCB ;CLOSE THE CURRENT FLOPPY FILE MVI C,10H CALL BDOS LXI D,HDFCB ;CLOSE THE HARD DISK FILE ALSO, WILL OPEN MVI C,10H ;AGAIN LATER, BUT MOUNTING THE NEW FLOPPY CALL BDOS ;REQUIRES A RESET WHICH ASSUMES ALL CLOSED JMP LOADFLP BACKUP LXI H,TFCB LXI D,HDFCB MVI B,12 CALL MOVE LXI D,HDFCB+12 MVI B,24 CALL CLEAR LXI H,0000 SHLD RECCNT LXI D,HDFCB ;MAKE SURE HARD DISK FILE IS THERE MVI C,0FH CALL BDOS INR A JNZ CLEARCNT LXI D,ERROR2 ;FILE NOT FOUND JMP ERROR CLEARCNT XRA A STA FILECNT CREATEFLP CALL GENFCB ;CREATE FLOPPY FCB CALL MOUNT LHLD RECCNT ;POSITION FILE SHLD HDFCB+33 LXI D,HDFCB ;RANDOM READ MVI C,21H CALL BDOS LXI D,FLPFCB ;LOOK FOR FLOPPY NAME MVI C,0FH CALL BDOS INR A JZ MAKEFLOP LXI D,FLPFCB ;DELETE IT IF IT IS THERE MVI C,13H CALL BDOS MAKEFLOP LXI D,FLPFCB ;CREATE THE FILE MVI C,16H CALL BDOS LXI D,ERROR4 INR A JZ ERROR ;DIRECTORY FULL COPYLOOP1 CALL LOADBUFF1 ;DO ACTUAL COPYING HERE CALL WRITEBUF1 CALL DEBUG LDA EOF CPI 1 JZ ENDOFFILE1 CPI 2 JZ DISKFULL JMP COPYLOOP1 ENDOFFILE1 LXI D,LASTREC ;ADD END OF ALL FILES RECORD MVI C,1AH CALL BDOS LXI D,FLPFCB MVI C,15H ;WRITE IT CALL BDOS LXI D,FLPFCB MVI C,10H ;CLOSE FLOPPY CALL BDOS LXI D,ERROR5 JMP ERROR ;FINISHED DISKFULL LXI D,FLPFCB MVI C,10H ;CLOSE FLOPPY CALL BDOS JMP CREATEFLP GENFCB LXI D,FLPFCB ;CREATE THE FLOPPY NAME MVI B,36 CALL CLEAR LXI H,HOLDFCB+1 LXI D,FLPFCB+1 MVI B,11 CALL MOVE LDA FLOPPY ANI 0FH STA FLPFCB LXI D,ERROR3 LDA FILECNT INR A STA FILECNT JZ ERROR ;TOO MANY FLOPPIES MVI H,0 MOV L,A SHLD MPTY LXI D,FLPFCB+9 ;SET FILE TYPE TO SEQUENCE NUMBER LXI H,64H SHLD TEMP2 CALL DIVID2 LXI H,0AH SHLD TEMP2 CALL DIVID2 LDA MPTY ADI '0' STAX D RET DEBUG LHLD RECCNT ;THIS PRINTS THE RECORD # JUST WRITTEN SHLD MPTY ;FOR DEBUG PURPOSES LXI D,DBMSG+2 LXI H,2710H SHLD TEMP2 CALL DIVID2 LXI H,03E8H SHLD TEMP2 CALL DIVID2 LXI H,64H SHLD TEMP2 CALL DIVID2 LXI H,0AH SHLD TEMP2 CALL DIVID2 LDA MPTY ADI '0' STAX D LXI D,DBMSG CALL OUTPUT RET DIVID2 PUSH D MVI E,0 LHLD MPTY SHLD TEMP SB22 LXI B,TEMP LXI H,TEMP2 XRA A LDAX B SBB M STAX B INX B INX H LDAX B SBB M STAX B JC NEG2 INR E PUSH H LHLD TEMP SHLD MPTY POP H JMP SB22 NEG2 MOV A,E DIV2 ADI '0' POP D STAX D INX D RET MOUNT LXI H,FLPFCB+1 LXI D,MSG1 MVI B,8 CALL MOVE LXI D,MSG4 CALL MOVE LXI H,FLPFCB+9 LXI D,MSG2 MVI B,3 CALL MOVE LXI D,MSG5 CALL MOVE LXI D,MESSAGE1 CALL OUTPUT LXI D,INBUF MVI C,0AH CALL BDOS MVI C,0DH ;RESET THE DISK SYSTEM CALL BDOS RET CLEAR XRA A CLEAR2 STAX D INX D DCR B JNZ CLEAR2 RET ;FOR BACKUP...LOAD FROM HARD DISK, WRITE TO FLOPPY LOADBUFF1 EQU $ ;THIS ROUTINE LOADS AS MUCH OF LXI H,0000 ;MEMORY WITH THE FILE AS POSSIBLE SHLD MAX1 LXI H,ADDR3 SHLD TEMP XRA A STA EOF ;CLEAR EOF FLAG LOADNEXT LHLD TEMP XCHG ;SET DMA ADDRESS MVI C,1AH CALL BDOS LXI D,HDFCB ;READ HARD DISK MVI C,14H CALL BDOS ORA A JNZ HDEOF ;EOF? LHLD MAX1 INX H ;INCREMENT RECORD COUNT SHLD MAX1 LHLD TEMP ;SEE IF NEXT RECORD WOULD EXCEED THE LXI D,128 ;TPA AREA DAD D SHLD TEMP DAD D ;WILL THE NEXT RECORD OVERWRITE BDOS? XCHG LHLD BDOS+1 ;FIND THE TOP OF MEMORY CALL COMPREG ;COMPARE REGISTERS RC ;RETURN IF MEMORY ALREADY FULL JMP LOADNEXT ;GET ANOTHER RECORD HDEOF MVI A,1 ;SET FILE EOF STA EOF RET WRITEBUF1 EQU $ ;WRITE FROM THE MEMORY BUFFER LXI H,ADDR3 SHLD TEMP LHLD MAX1 ;ALLOW FOR FILES THAT HAVE NO LXI D,0000 ;RECORDS SUCH AS RESTART CALL COMPREG RZ WRITENEXT LHLD TEMP XCHG ;SET DMA ADDRESS MVI C,1AH CALL BDOS LXI D,FLPFCB MVI C,15H ;WRITE SEQUENTIAL CALL BDOS ORA A JNZ FPFULL2 LHLD RECCNT INX H SHLD RECCNT LHLD MAX1 ;DECREASE RECORD COUNT DCX H SHLD MAX1 LXI D,0000 ;CHECK FOR NO MORE TO WRITE CALL COMPREG RZ LHLD TEMP LXI D,128 ;INCREMENT WRITE ADDRESS DAD D SHLD TEMP JMP WRITENEXT FPFULL2 MVI A,2 ;FULL DISKETTE STA EOF RET ;FOR RESTORE, LOAD FROM FLOPPY, WRITE TO HARD DISK LOADBUFF2 EQU $ ;THIS ROUTINE LOADS AS MUCH OF LXI H,0000 ;MEMORY WITH THE FILE AS POSSIBLE SHLD MAX1 LXI H,ADDR3 SHLD TEMP XRA A STA EOF ;CLEAR EOF FLAG LOADNEXT2 LHLD TEMP XCHG ;SET DMA ADDRESS MVI C,1AH CALL BDOS LXI D,FLPFCB ;READ THE FLOPPY MVI C,14H CALL BDOS ORA A JNZ HDEOF2 ;EOF? LHLD TEMP LXI D,LASTREC MVI B,26 ;SEE IF THIS IS THE LASTREC OF LAST FILE CALL COMPARE JZ EOFHD LHLD MAX1 INX H ;INCREMENT RECORD COUNT SHLD MAX1 LHLD TEMP ;SEE IF NEXT RECORD WOULD EXCEED THE LXI D,128 ;TPA AREA DAD D SHLD TEMP DAD D ;WILL THE NEXT RECORD OVERWRITE BDOS? XCHG LHLD BDOS+1 ;FIND THE TOP OF MEMORY CALL COMPREG ;COMPARE REGISTERS RC ;RETURN IF MEMORY ALREADY FULL JMP LOADNEXT2 ;GET ANOTHER RECORD EOFHD MVI A,2 STA EOF RET HDEOF2 MVI A,1 ;SET FILE EOF STA EOF RET WRITEBUF2 EQU $ ;WRITE FROM THE MEMORY BUFFER LXI H,ADDR3 SHLD TEMP LHLD MAX1 ;ALLOW FOR FILES THAT HAVE NO LXI D,0000 ;RECORDS SUCH AS RESTART CALL COMPREG RZ WRITENEXT2 LHLD TEMP XCHG ;SET DMA ADDRESS MVI C,1AH CALL BDOS LXI D,HDFCB MVI C,15H ;WRITE SEQUENTIAL CALL BDOS ORA A JNZ FPFULL ;FLOPPY DISK FULL LHLD RECCNT INX H SHLD RECCNT LHLD MAX1 ;DECREASE RECORD COUNT DCX H SHLD MAX1 LXI D,0000 ;CHECK FOR NO MORE TO WRITE CALL COMPREG RZ LHLD TEMP LXI D,128 ;INCREMENT WRITE ADDRESS DAD D SHLD TEMP JMP WRITENEXT2 FPFULL MVI A,2 ;FULL DISKETTE STA EOF RET COMPREG MOV A,H ;COMPARE HL TO DE CMP D RNZ MOV A,L CMP E RET OUTPUT PUSH D ;PUT OUT A CRLF LXI D,CRLF MVI C,09 CALL BDOS POP D ;NOW PUT OUT THE MESSAGE OUT1 MVI C,09 JMP BDOS QUESTION CALL OUTPUT ;PUT OUT THE QUESTION LXI D,INBUF MVI C,0AH ;INPUT THE REPLY CALL BDOS LDA INCNT RET MOVE PUSH H ;MOVE DATA POINTED TO IN HL PUSH D ;TO THE AREA POINTED TO IN DE PUSH B ;BY THE BYTE COUNT IN B MOVE1 MOV A,M STAX D INX H INX D DCR B JNZ MOVE1 POP B ;RESTORE THE TOTAL ENVIRONMENT POP D POP H RET COMPARE PUSH H ;COMPARE THE STRINGS POINTED TO IN HL PUSH D ;TO THE STRING POINTED TO IN DE PUSH B ;FOR A LENGTH OF B CHARACTERS COMP1 LDAX D ; JC IF HL > DE CMP M ; JZ IF HL = DE JNZ COMP2 ;JNC IF HL < DE INX H INX D DCR B JNZ COMP1 COMP2 POP B POP D POP H RET CRLF DB CR,LF,'$' ERROR1 DB 'INPUT ERROR...ENTER FILENAME.TYP/B OR /R',CR,LF,LF,'$' ERROR2 DB 'FILE NOT FOUND',CR,LF,LF,'$' ERROR3 DB 'NEEDS MORE THAN 255 FLOPPY DISKS',CR,LF,LF,'$' ERROR4 DB 'DIRECTORY FULL',CR,LF,LF,'$' ERROR5 DB 'FINISHED',CR,LF,LF,'$' MSG0A DB 'CONTAINING' BAK DB 'BAK' MSG3A DB 'RESTORE ' LASTREC DB 'ENDENDENDBIGBURSTENDENDEND' MESSAGE1 DB CR,LF,LF,'MOUNT THE DISKETTE ' MSG0 DB 'TO CONTAIN ' MSG1 DS 8 DB '.' MSG2 DS 3 DB ' FOR ' MSG3 DB 'BACKUP ' DB 'AND HIT RETURN$' MESSAGE2 DB CR,LF,'FILE ' MSG4 DS 8 DB '.' MSG5 DS 3 DB ' IS NOT ON THIS DISKETTE$' SRCFLPMSG DB 'SOURCE FLOPPY DRIVE (DEFAULT=' SRCFLP DB 'D) $' DESTFLPMSG DB 'DESTINATION FLOPPY DRIVE (DEFAULT=' DESTFLP DB 'D) $' DBMSG DB CR,LF DB '00000$' INBUF DB 30 INCNT DS 1 INREC DS 30 FLOPPY DS 1 RECCNT DS 2 HOLDFCB DS 36 HDFCB DS 36 BAKFCB DS 48 FILECNT DS 1 FLPFCB DS 36 TEMP DS 2 TEMP2 DS 2 MPTY DS 2 MAX1 DS 2 EOF DS 1 STACK DS 90 ADDR3 EQU $ END 100H