home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / UTILS / HDUTL / BAKUP23A.LBR / BAKUP23A.AQM / BAKUP23A.ASM
Assembly Source File  |  2000-06-30  |  34KB  |  1,306 lines

  1. ; DISK DIRECTORY AND BACKUP PROGRAM
  2. ; COPYRIGHT 1980, G. YOUNG, INC.'
  3. ; UPDATED 6/23/83
  4. ; updated again by W. F. Dudley N4BYT - 6/3/84 - marked by ### in comment
  5. ;
  6. * THE PRIMARY PURPOSE OF THIS PROGRAM IS TO BACKUP HARD DISKS ON TO
  7. * MULTIPLE FLOPPIES.  FIRST, IT EXTRACTS THE DIRECTORIES FROM ALL OF
  8. * THE HARD DISKS, SORTS BY TYPE AND FILE NAME, AND PRINTS A CONSOLIDATED
  9. * DIRECTORY.  THEN IT DELETES DUPLICATE FILES FROM THE CONSOLIDATED
  10. * DIRECTORY, DELETES UNWANTED TYPES (PRN, BAK, ETC), AND UNWANTED
  11. * FILES TO CREATE A LIST OF FILES TO BACKUP.  THESE ARE COPIED TO
  12. * MULTIPLE FLOPPIES AS NEEDED WHILE PRODUCING AN INDEX OF WHAT FILES ARE
  13. * ON EACH DISKETTE.  RESTART CAPABILITY IS PROVIDED TO BEGIN THE BACKUP
  14. * AT ANY FILE.
  15.  
  16. * WRITTEN BY GARY YOUNG, BOX 3218, NO. HOLLYWOOD, CA 91609
  17. * CORRECTIONS BY RON STEVENSON, 35 E. GAULT WAY, SPARKS, NV.  89431
  18. * Corrections by W. F. Dudley Jr., N4BYT, uucpnet hou2g!dud
  19.  
  20. ; 06/03/84 wfd  v2.3a
  21. ; added to routine QUESTION so that lower case responses are converted
  22. ;    to upper case.
  23. ; changed routine REPORT and TOPOFFORM so that a <cr> is sent to the
  24. ;    printer before formfeeds.  This is because some printers (like my
  25. ;    Base 2) won't print the line buffer until a <cr> is rec'd, but will
  26. ;    do a formfeed any old time.
  27. ; added the DIAGNST equate to switch on or off the diagnostic display
  28. ;    without having to remove or add comment semicolons.
  29.  
  30. ; What this sucker really needs is the ability to scan across all 16 user
  31. ;    areas, and write all of the files it finds in the different areas
  32. ;    out to the floppys, preserving user numbers and other attributes.
  33. ; I'd do it, but it is not obvious to me how the file name data structure is
  34. ;    kept in the ram buffer.  Is it just a bunch of FCB copies?
  35.  
  36. ; 08/22/83 rds    v2.3
  37. ; Added the following options.    First is for a printed report of all
  38. ; files to be backup is now turn on or off by answering the question
  39. ; of 'Do you wish a Printed Report (Y/N)' at the start.  Move the
  40. ; verify inputed data question to after the input of date to verify
  41. ; this as well.  Last is an add at end of program to ask if you wish
  42. ; to run this program again in case you have two areas with same file
  43. ; names but different data like a personal and buisness GL.  This is
  44. ; only needed if you have a disk that's divided into two or more
  45. ; logical drives/volumes like the Molecular.
  46.  
  47. ; 07/01/83 rds    v2.2
  48. ; Added features to mark files that have been backed up on the floppy
  49. ; bye eather setting the 'T3' byte of the FCB for Molecular computers
  50. ; or setting the 'F4' byte for other computers.  This is done at asm.
  51. ; time bye setting the MOLEC equate for eather.
  52.  
  53. ; 06/23/83 rds    v2.1
  54. ; Corrected problem in code for backing up to copying to drive 'P'.
  55. ; original code stripe off too many bits which wouldn't allow program
  56. ; to see drive 'P' no matter what.  Also clean up some of the code.
  57.  
  58. ; 06/13/83 rds    v2.0
  59. ; Added code at begining for setting up the drive to backup from as
  60. ; well as too. You are now prompted as to which drives you want backup
  61. ; and then which drive to put the stuff on..
  62. ;
  63.     TITLE    '*** HARD DISK BACKUP PROGRAM ***'
  64.     ORG    100H
  65.     JMP    START
  66.     DB    'COPYRIGHT 1980, G. YOUNG, INC.'
  67. ;
  68. FALSE    EQU    0
  69. TRUE    EQU    NOT FALSE
  70. ;
  71. MOLEC    EQU    false        ;TRUE FOR MOLECULAR and FALSE FOR OTHERS
  72. diagnst    equ    false
  73. ;
  74. RECSIZE EQU    12        ;RECORD SIZE AS FOLLOWS
  75.                 ; TYPE     = 3 BYTES
  76.                 ; FILE     = 8 BYTES
  77.                 ; DISKID = 1 BYTES
  78. NOSKIP        EQU    6            ;NUMBER OF FILES IN SKIP LIST
  79. SKIPTYPE    DB    'PRNHEXSYMBAK$$$TMP'    ;FILES TO NOT BACK UP
  80. IDSIZE        EQU    1    ;ID NOW MEANS A:, B:, C:, ETC
  81. LINESPAGE    EQU    60    ;LINES PER PAGE
  82. RECLINE     EQU    4    ;ENTRIES PER LINE
  83. ;
  84. ;
  85. START    LXI    SP,STACK+80
  86.     LXI    H,RAM        ;SET UP TABLE ADDRESS
  87.     SHLD    TABADDR
  88.     LXI    H,0000H
  89.     SHLD    TABCNT
  90.     XRA    A        ;THE TABLE REFERS TO THE REMAINING AREA
  91.     STA    ABORT        ;OF RAM TO HOLD AS MANY DIRECTORY ENTRIES
  92.     STA    EOF        ;AS POSSIBLE
  93.     STA    PRNTFLG     ;TURN ON PRINTER FLAG 0 = PRINT
  94. START1:    LXI    D,SIGNON    ;PRINT SIGNON MESSAGE
  95.     CALL    OUTPUT
  96.     LXI    D,DRIVMSG    ;ASK FOR THE DRIVE LETTERS TO BACKUP
  97.     CALL    QUESTION
  98.     CPI    0        ;CK TO SEE IF ANYTHING WAS ADDED
  99.     JZ    START1        ;IF NOT START OVER
  100.     ADI    1
  101.     STA    MAX1
  102.     MOV    B,A        ;SETUP COUNT FOR MOVE
  103.     LXI    H,INREC     ;DATA TO MOVE
  104.     LXI    D,DRIVES    ;WHERE TO PUT THE DATE
  105.     CALL    MOVE
  106.     XCHG
  107.     DCR    B        ;CORRECT THE COUNT BEFOR CKING
  108. STRT:    MOV    A,M        ;GET A DRIVE CHAR
  109.     CPI    'Q'        ;CK IT FOR GOOD CHAR
  110.     JP    START1        ;NO GOOD IF POSITIVE
  111.     INX    H        ;POINT TO NEXT
  112.     DCR    B        ;DEC COUNT
  113.     JNZ    STRT        ;LOOP
  114.     MVI    M,'$'        ;STORE END-OF-STRING CHAR AT END
  115.     LXI    D,BKUPMSG    ;ASK FOR THE DRIVE LETTER TO STORE IT TO
  116.     CALL    QUESTION
  117.     CPI    1
  118.     JNZ    START1        ;IF NO INPUT THEN START OVER
  119.     LDA    INREC        ;GET DRIVE LETTER TO STORE TO
  120.     STA    BACKUPDRV
  121. MSG1:    LXI    D,DATEMSG    ;GET CURRENT DATE FOR REPORTS
  122.     CALL    QUESTION    ;PRINT MSG AND GET REPLY
  123.     CPI    8        ;8 CHAR MUST HAVE BEEN ENTERED
  124.     JNZ    MSG1        ;REPEAT QUESTION IF NOT
  125.     LXI    H,INREC     ;MOVE DATE FROM INREC
  126. ; IF YOU DO NOT HAVE A CLOCK/DATE BOARD, REMOVE THE * FROM THE ABOVE
  127. ; LINES AND ASTERISK THE NEXT 2 LINES WHICH CALL THE CLOCK TO GET THE
  128. ; DATE
  129. *    CALL    GETDATE     ;GET DATE FROM CLOCK BOARD
  130. *    LXI    H,DATETIME+1
  131.     MVI    B,8        ;MOVE THE DATE TO A HOLD AREA
  132.     LXI    D,DATE        ;TO "DATE"
  133.     CALL    MOVE
  134. STRT1    LXI    D,PRINTMSG    ;CK FOR OUTPUT TO THE PRINTER
  135.     CALL    QUESTION    ;AND GET response
  136.     CPI    1
  137.     JNZ    STRT1        ;NO INPUT THEN LOOP
  138.     LDA    INREC        ;GET ANSWER
  139.     CPI    'N'
  140.     JNZ    START2
  141.     MVI    A,0FFH        ;SET PRNTFLG NONZERO FOR NO PRINTING
  142.     STA    PRNTFLG
  143. START2    LXI    D,CORRMSG    ;VERIFY ALL DATA IS CORRECT
  144.     CALL    OUTPUT
  145.     LXI    D,DRIVES    ;GET DRIVES TO BACKUP
  146.     CALL    OUT1        ;OUTPUT DRIVE LETTER CHAIN
  147.     LXI    D,CORRMSG1
  148.     CALL    OUT1
  149.     LDA    BACKUPDRV    ;GET DRIVE TO BACKUP TO BACK AGAIN
  150.     MOV    E,A
  151.     MVI    C,CONOUT
  152.     CALL    BDOS        ;OUTPUT DRIVE TO BACKUP TO OUT
  153.     LXI    D,DATVERMSG    ;GET DATE MESSAGE
  154.     CALL    OUT1
  155.     LXI    D,DATE        ;THEN THE DATE ITSELF
  156.     CALL    OUT1
  157.     LXI    D,CORRY$N    ;GET CORRECT MESSAGE
  158.     CALL    QUESTION    ;AND GET response
  159.     CPI    1
  160.     JNZ    START2        ;NO INPUT THEN LOOP
  161.     LDA    INREC        ;GET ANSWER
  162.     CPI    'Y'
  163.     JNZ    START1
  164.     CALL    EXTRACT     ;GET DIRECTORY ENTRIES
  165.     LDA    ABORT        ;SEE IF TOO MANY ENTRIES FOR MEMORY SIZE
  166.     ORA    A        ;SHOULD BE ZERO TO BE OK
  167.     JZ    NOMORE
  168.     LXI    D,TABFULL    ;REPORT WILL NOT BE COMPLETE
  169.     CALL    OUTPUT        ;MEMORY FULL ERROR
  170. NOMORE    CALL    SORT        ;SORT THE MEMORY TABLE BY TYPE, FILE
  171.                 ;NAME, THEN DISK ID
  172.     MVI    A,RECSIZE    ;SETUP TO REMOVE DUPLICATE ENTRIES
  173.     STA    COMPSIZE    ;COMPARE ON ALL CHAR
  174.     CALL    KILLDUPS    ;REMOVE DUPLICATE ENTRIES
  175.     CALL    REPORT        ;PRINT ALL ENTRIES
  176.     MVI    A,11        ;REMOVE FILES THAT ARE ON MULTIPLE DISKS
  177.     STA    COMPSIZE
  178.     CALL    KILLDUPS
  179.     CALL    SELECT        ;RESTRICT THE FILES TO BACKUP
  180. MSG3    LXI    D,BACKQUS    ;ASK IF YOU WANT BACKUP FUNCTION
  181.     CALL    QUESTION
  182.     CPI    1
  183.     JNZ    MSG3
  184.     LDA    INREC
  185.     CPI    'N'
  186.     JZ    FINISHED
  187.     CPI    'Y'
  188.     JNZ    MSG3
  189.     CALL    BACKUP        ;BACKUP THOSE FILES REPORTED ON
  190. FINISHED    MVI    C,0
  191.     JMP    BDOS        ;RESET AND RETURN TO CPM
  192. *
  193. * THE EXTRACT ROUTINE SCANS ALL THE DRIVES IN THE DRIVE TABLE
  194. * WHEN COMPLETE, IT ASKS FOR THE NEXT DRIVE ID
  195. * WHEN THE HARD DISK IS UP, IT WILL NOT ASK FOR THE DRIVE ID BUT
  196. * WILL AUTOMATICALLY SCAN THE THREE HARD DISKS AND FINISH WITHOUT
  197. * EVER ASKING FOR THE DRIVE ID.
  198. *
  199. * THE DUMMYFCB SETS UP A SKELETON TO READ ALL FILES ON THE DIRECTORY
  200. *
  201. DUMMYFCB    DB    0,'????????????',0,0,0,0,0,0,0,0,0
  202.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  203. EXTRACT LXI    H,DRIVES    ;GET ADDRESS OF THE DRIVE TABLE
  204.     SHLD    ADDR1        ;TO SCAN
  205. *    MVI    A,NODRV+1    ;SET UP COUNTER FOR THE NUMBER TO SCAN
  206. *    STA    MAX1
  207. NEXTDRV LDA    MAX1        ;SEE IF THERE ARE MORE DRIVES TO SCAN
  208.     DCR    A
  209.     STA    MAX1        ;RETURN WHEN ALL HAVE BEEN SCANNED
  210.     RZ
  211.     LHLD    ADDR1        ;GET ADDRESS OF DRIVE TABLE
  212.     MOV    A,M        ;GET DRIVE CHARACTER
  213.     STA    RDISK
  214.     ANI    1FH        ;CONVERT A=1...P=16
  215.     STA    DUMMYFCB    ;SET IN DR OF DUMMYFCB
  216.     INX    H        ;SET FOR NEXT READ OF DRIVE TABLE
  217.     SHLD    ADDR1
  218.     LXI    D,DISKBUF    ;SET A DMA ADDRESS FOR DIRECTORY ENTRIES
  219.     MVI    C,1AH
  220.     CALL    BDOS        ;SET DMA
  221.     LXI    D,DUMMYFCB    ;GET FIRST DIRECTORY ENTRY
  222.     MVI    C,11H
  223.     CALL    BDOS        ;GET DIRECTORY
  224.     INR    A
  225.     JZ    NEXTDRV     ;NO MORE ENTRIES ON THIS DRIVE
  226.     JMP    GETFCB        ;EXTRACT DATA FROM FCB
  227. NEXTFCB LXI    D,DUMMYFCB    ;GET NEXT ENTRY AFTER THE FIRST
  228.     MVI    C,12H
  229.     CALL    BDOS
  230.     INR    A
  231.     JZ    NEXTDRV     ;NO MORE DIRECTORIES ON THIS DISK
  232. GETFCB    LXI    D,32        ;EACH ENTRY IS 32 BYTES LONG
  233.     LXI    H,DISKBUF    ;DIRECTORY RECORD IS IN DISKBUF
  234.     CPI    1        ;FIRST ENTRY IN RECORD???
  235.     JZ    FORMREC     ;YES
  236.     DAD    D        ;ADD 32 TO ADDRESS IN RECORD
  237.     CPI    2        ;SECOND ENTRY IN RECORD???
  238.     JZ    FORMREC
  239.     DAD    D        ;ADD 64 TO ADDRESS OF RECORD
  240.     CPI    3        ;THIRD ENTRY IN RECORD???
  241.     JZ    FORMREC
  242.     DAD    D        ;ADD 96 TO ADDRESS OF RECORD
  243. FORMREC INX    H        ;PASS DRIVE BYTE
  244.     LXI    D,RFILE     ;MOVE FILE NAME
  245.     MVI    B,8        ;MOVE 8 CHARACTERS
  246.     CALL    MOVE
  247.     LXI    D,8        ;POSITION PAST NAME TO TYPE
  248.     DAD    D
  249.     LXI    D,RTYPE     ;MOVE TYPE
  250.     MVI    B,3        ;MOVE 3 CHARACTERS
  251.     CALL    MOVE
  252.  
  253.     IF    NOT MOLEC
  254.     PUSH    H        ;SAVE IT FOR A MIN
  255.     LXI    H,RFILE+4    ;GET FILE NAME TO CK FOR 'F4' TAGED
  256.     MOV    A,M
  257.     POP    H        ;GET IT BACK
  258.     ENDIF
  259.  
  260.     ANI    80H        ;CK TO SEE IF WE SHOULD BACKUP THIS FILE
  261.     JNZ    NEXTFCB     ;BY CHECKING 'T3' FOR MOLECULAR COMPUTERS
  262.                 ;OR 'F4' FOR OTHER COMPUTERS
  263.     INX    H        ;POSITION TO THE EXTENT NUMBER
  264.     INX    H
  265.     INX    H
  266.     MOV    A,M        ;GET THE EXTENT
  267.     if    diagnst
  268.     ORI    30H        ;DIAGNOSTIC DISPLAY
  269.     STA    RDISK+1
  270.     LXI    D,RTYPE
  271.     CALL    OUTPUT
  272.     LDA    RDISK+1
  273.     ANI    0FH
  274.     endif
  275.     LXI    H,RTYPE     ;STRIP OFF THE HIGH BIT SET BY
  276.     MVI    B,11        ;THE VERSION PROGRAM
  277. STRIP    MOV    A,M
  278.     ANI    07FH
  279.     MOV    M,A
  280.     INX    H
  281.     DCR    B
  282.     JNZ    STRIP
  283.     LXI    H,RTYPE     ;SKIP OVER JUNK DISK ENTRIES
  284.     MVI    B,11        ;CONTAINING NONPRINTING CHARACTERS
  285. NONPRNT MOV    A,M
  286.     CPI    20H        ;ANY CHAR LESS THAN A BLANK
  287.     JC    NEXTFCB     ;GO TO NEXT ONE IF SO
  288.     INX    H
  289.     DCR    B
  290.     JNZ    NONPRNT
  291. FIRSTEXT    EQU    $    ;GOT THE FIRST EXTENT
  292.     LHLD    TABADDR     ;GET MEMORY TABLE ADDRESS
  293.     LXI    D,RTYPE     ;GET MEMORY RECORD ADDRESS
  294.     XCHG            ;RTYPE (HL) TO TABADDR (DE)
  295.     MVI    B,RECSIZE    ;MOVE RECSIZE BYTES
  296.     CALL    MOVE
  297.     LHLD    TABADDR     ;INCREMENT FOR NEXT ENTRY
  298.     LXI    D,RECSIZE        ;RECSIZE BYTES IN RECORD
  299.     DAD    D
  300.     SHLD    TABADDR     ;SAVE NEW ADDRESS
  301.     MVI    M,1AH        ;SET AN END-OF-TABLE INDICATOR
  302.     LHLD    TABCNT        ;GET RECORD COUNT
  303.     INX    H
  304.     SHLD    TABCNT        ;INCREMENT RECORD COUNT
  305.     LHLD    TABADDR     ;SEE IF NEW ADDRESS IS GREATER
  306.     XCHG            ;THAN THE TOP OF TPA-128
  307.     LHLD    BDOS+1        ;HL=TOP...DE=TABLE+RECSIZE
  308.     LXI    B,-128
  309.     DAD    B        ;SUBTRACT 128 FROM TOP
  310.     CALL    COMPREG     ;COMPARE REGISTER VALUES
  311.     JNC    NEXTFCB     ;THERE IS ROOM FOR MORE
  312.     MVI    A,1        ;NO MORE ROOM...ABORT NOW
  313.     STA    ABORT
  314.     RET
  315.  
  316.  
  317. * THE FOLLOWING ROUTINE IS A BUBBLE SORT.  IN PSEUDOBASIC
  318. * IS WOULD BE DONE AS FOLLOWS:
  319. *SORT    ADDR1=BOTTOM(RAM)-RECSIZE (RECSIZE IS COUNT OF BYTES IN ONE RECORD)
  320. *    MAX1=0
  321. *LOOP1    MAX1=MAX1+1
  322. *    ADDR1=ADDR1+RECSIZE    (FIRST TIME THIS WOULD BE THE BOTTOM)
  323. *    IF MAX1>TABCNT-1 THEN GO TO SORTED
  324. *    ADDR2=ADDR1
  325. *    MAX2=MAX1
  326. *LOOP2    MAX2=MAX2+1
  327. *    ADDR2=ADDR2+RECSIZE
  328. *    IF MAX2>TABCNT THEN GO TO LOOP1
  329. *    IF TABLE(ADDR1)<TABLE(ADDR2) THEN GO TO LOOP2
  330. *    TEMP=TABLE(ADDR1)
  331. *    TABLE(ADDR1)=TABLE(ADDR2)
  332. *    TABLE(ADDR2)=TEMP
  333. *    GO TO LOOP2
  334. *SORTED RETURN
  335. *
  336. *NOW THAT THIS LOGIC IS INTUITIVELY OBVIOUS, HERE'S THE NOT SO
  337. *OBVIOUS CODE:
  338.  
  339. SORT    LXI    D,SORTMSG    ;PUT OUT A MESSAGE SO THE USER DOES
  340.     CALL    OUTPUT        ;NOT THINK THIS CRASHED WHILE SORTING
  341.     LXI    H,0000        ;INITIALIZE COUNT
  342.     SHLD    MAX1        ;SINCE IT WILL DECREMENT FIRST
  343.     LXI    D,-RECSIZE    ;SUBTRACT RECSIZE FROM THE BEGINNING
  344.     LXI    H,RAM        ;OF THE TABLE SINCE IT WILL ADD
  345.     DAD    D        ;RECSIZE TO IT FIRST
  346.     SHLD    ADDR1
  347. LOOP1    LHLD    ADDR1        ;GET THE CURRENT ADDRESS
  348.     LXI    D,RECSIZE        ;INCREMENT IT BY RECSIZE
  349.     DAD    D        ;PAST THE NEXT ENTRY
  350.     SHLD    ADDR1
  351.     LHLD    MAX1        ;SEE IF THE COUNT HAS REACHED THE LIMIT
  352.     INX    H        ;INCREMENT THE COUNTER
  353.     SHLD    MAX1
  354.     XCHG            ;MOVE TO DE TO COMPARE TO LIMIT
  355.     LHLD    TABCNT
  356.     DCX    H        ; IS MAX1 > TABCNT - 1 ???
  357.     CALL    COMPREG     ;COMPARE DE (CURRENT COUNT) TO HL (TABCNT-1)
  358.     JC    SORTED        ;FINISHED WHEN MAX1 > TABCNT-1
  359.     LHLD    ADDR1        ;SETUP FOR THE INNER LOOP
  360.     SHLD    ADDR2
  361.     LHLD    MAX1
  362.     SHLD    MAX2
  363. LOOP2    LHLD    ADDR2        ;START WITH ONE ENTRY GREATER THEN
  364.     LXI    D,RECSIZE        ;THE OUTER LOOP AND INCREMENT
  365.     DAD    D        ;BY RECSIZE EACH TIME PAST THE NEXT RECORD
  366.     SHLD    ADDR2        ;POINTER TO THE CURRENT RECORD
  367.     LHLD    MAX2        ;LIKEWISE SEE IF THE COUNTER FOR THE
  368.     INX    H
  369.     SHLD    MAX2
  370.     XCHG
  371.     LHLD    TABCNT
  372.     CALL    COMPREG
  373.     JC    LOOP1        ;WHEN FINISHED, INCREMENT OUTER LOOP
  374.     LHLD    ADDR2
  375.     XCHG            ;ADDR2 NOW IN DE
  376.     LHLD    ADDR1
  377.     CALL    COMPARE     ;COMPARE STRINGS POINTED TO BY DE/HL
  378.     JNC    LOOP2        ;TABLE(HL) < TABLE (DE)
  379. * EXCHANGE THE TWO ENTRIES VIA A TEMPORARY RECORD
  380.     LXI    D,TEMP
  381.     LHLD    ADDR1
  382.     MVI    B,RECSIZE
  383.     CALL    MOVE        ;TEMP=TABLE(ADDR1)
  384.     XCHG            ;ADDR1=DESTINATION
  385.     LHLD    ADDR2        ;ADDR2=SOURCE
  386.     CALL    MOVE        ;TABLE(ADDR1)=TABLE(ADDR2)
  387.     XCHG            ;ADDR2 = DESTINATION
  388.     LXI    H,TEMP
  389.     CALL    MOVE        ;TABLE(ADDR2)=TEMP
  390.     JMP    LOOP2
  391. SORTED    RET            ;FINISHED SORTING
  392.  
  393.  
  394. * REPORT PRINTS THE SORTED CONSOLIDATED DIRECTORY ENTRIES.  
  395. * LINESPAGE IS THE NUMBER OF LINES PER PAGE AND RECLINE IS THE
  396. * NUMBER OF 20 BYTE ENTRIES PER LINE.  EACH TYPE BEGINS ON A 
  397. * NEW PAGE.
  398.  
  399. REPORT:    LHLD    TABCNT        ;SET COUNT OF ENTRIES
  400.     INX    H        ;PLUS ONE
  401.     SHLD    LASTTYPE    ;INIT LASTTYPE TO INVALID DATA
  402.     SHLD    MAX1        ;TO DECREMENT FIRST
  403.     LXI    H,RAM-RECSIZE    ;SET STARTING ADDRESS
  404.     SHLD    ADDR1
  405.     CALL    HEADING
  406. NEXTPRT LHLD    ADDR1
  407.     LXI    D,RECSIZE    ;SET TO ADD THE REC LENGTH
  408.     DAD    D
  409.     SHLD    ADDR1
  410.     LHLD    MAX1        ;DECREMENT COUNT TO SEE WHEN DONE
  411.     DCX    H
  412.     SHLD    MAX1
  413.     LXI    D,0000        ;SEE IF REACHED ZERO YET
  414.     CALL    COMPREG
  415.     JZ    TOPPAGE     ;GO TO TOP OF NEXT PAGE
  416.     LHLD    ADDR1        ;CURRENT TYPE = LAST TYPE?
  417.     MVI    B,3        ;COMPARE 3 CHARACTERS
  418.     LXI    D,LASTTYPE
  419.     CALL    COMPARE
  420.     JNZ    SKIP3        ;NEW TYPE ON NEW PAGE
  421. PRNTNOW LDA    MAX2        ;DECREMENT RECORDS PER LINE
  422.     DCR    A
  423.     STA    MAX2
  424.     JZ    NEWLINE     ;LINE FULL, GO TO NEW LINE
  425.     CALL    FORMAT
  426.     LXI    D,PRNTREC
  427.     CALL    LIST
  428.     JMP    NEXTPRT
  429. SKIP3    LDA    LINECNT
  430.     DCR    A
  431.     JZ    NEWPAGE
  432.     DCR    A
  433.     JZ    NEWPAGE
  434.     DCR    A
  435.     JZ    NEWPAGE
  436.     STA    LINECNT
  437.     LXI    D,CRLFLFLF
  438.     CALL    LIST
  439.     JMP    CHKTYPE
  440. NEWPAGE CALL    HEADING
  441. CHKTYPE LXI    D,LASTTYPE    ;SET LAST TYPE TO CURRENT TYPE
  442.     LHLD    ADDR1
  443.     MVI    B,3
  444.     CALL    MOVE
  445. SETCNT    MVI    A,RECLINE+1
  446.     STA    MAX2
  447.     JMP    PRNTNOW
  448. NEWLINE LXI    D,CRLF
  449.     CALL    LIST
  450.     LDA    LINECNT
  451.     DCR    A
  452.     STA    LINECNT
  453.     JZ    NEWPAGE     ;PAGE FULL
  454.     JMP    SETCNT
  455. TOPPAGE LXI    D,CRLF        ;###
  456.     CALL    LIST        ;###
  457.     RET
  458.  
  459.  
  460. * THE PURPOSE OF SELECT IS TO CREATE A FINAL LIST OF FILES TO
  461. * BACKUP.  SINCE BACKING UP 26 MEG CAN BE QUITE LONG, THIS REDUCES
  462. * THE LIST TO ONLY NECCESSARY FILES.   IT ALSO ALLOWS A RESTART
  463. * AT ANY FILE.    IT WILL DELETE DUPLICATE FILE NAMES (FILES ON A:
  464. * WILL BE USED SINCE THAT IS ASSUMED TO BE THE LATEST), AND
  465. * WILL DELETE THE FILE TYPES LISTED IN THE SKIP TABLE.    THEN IT
  466. * WILL LIST EACH TYPE AND ASK IF YOU DO WANT TO BACK UP ALL OF
  467. * THIS TYPE (Y), SKIP BACKING UP OF THE ENTIRE TYPE (N), OR
  468. * SELECT CERTAIN FILES (S) TO BACK UP.    IF THE SELECT OPTION IS
  469. * CHOSEN, EACH FILE NAME WILL BE PRINTED AND YOU BE ASKED TO
  470. * BACK UP THE FILE (Y), IGNORE THE FILE DURING THE BACKUP
  471. * (N), OR CONTINUE (C) TO BACKUP ALL OF THE REMAINING FILES
  472. * WITHIN THIS TYPE WITHOUT ASKING ANY FURTHER NAMES (USED FOR 
  473. * RESTART).  AFTER THE LIST HAS BEEN REDUCED, IT WILL BE LISTED
  474. * BEFORE THE BACKUP ACTUALLY BEGINS.
  475.  
  476. KILLDUPS EQU    $    ;KILL DUPLICATE ENTRIES FROM MULTIPLE EXTENTS
  477.     LXI    H,RAM
  478.     SHLD    ADDR1            ;SET THE START OF THE TABLE
  479. NEXTEQUAL    LHLD    ADDR1        ;CHECK EACH ENTRY AGAINST THE NEXT
  480.     LXI    D,RECSIZE
  481.     DAD    D
  482.     SHLD    ADDR2
  483. NEXTCHK MOV    A,M            ;CHECK FOR END OF TABLE
  484.     CPI    1AH
  485.     RZ
  486.     XCHG
  487.     LHLD    ADDR1            ;COMPARE ADDR1 WITH ADDR2
  488.     LDA    COMPSIZE
  489.     MOV    B,A
  490.     CALL    COMPARE
  491.     JNZ    SAVELAST
  492.     PUSH    H            ;SAVE CURRENT POSITION
  493.     LHLD    ADDR2            ;SET UP FOR MOVING LIST
  494.     SHLD    ADDR1            ;DOWN ONE ENTRY
  495.     LXI    D,RECSIZE
  496.     DAD    D            ;MOVE THIRD ENTRY TO THE SECOND
  497.     SHLD    ADDR2
  498.     CALL    MOVELIST
  499.     LHLD    TABCNT
  500.     DCX    H
  501.     SHLD    TABCNT
  502.     POP    H            ;RESTORE CURRENT POSITION
  503.     SHLD    ADDR1            ;NOW COMPARE 1ST & 3RD
  504.     JMP    NEXTEQUAL
  505. SAVELAST    LHLD    ADDR2        ;MAKE NEW ONE THE CURRENT ONE
  506.     SHLD    ADDR1
  507.     JMP    NEXTEQUAL        ;COMPARE
  508.  
  509. SELECT    EQU    $
  510. NOWSELECT    EQU    $        ;LET USER ELIMINATE SOME
  511.     LXI    H,RAM-RECSIZE        ;INITIALIZE
  512.     SHLD    ADDR1
  513.     SHLD    LASTTYPE        ;MAKE SURE LASTTYPE DOES NOT MATCH
  514. NEXTENTRY    LHLD    ADDR1        ;GET NEXT RECORD IN TABLE
  515.     LXI    D,RECSIZE
  516.     DAD    D
  517.     SHLD    ADDR1            ;INCREMENT TABLE ENTRY
  518. CHKNEXT MOV    A,M            ;CHECK FOR THE END OF THE TABLE
  519.     CPI    1AH            ;CNTL-Z IS AT END
  520.     JZ    LISTBKUP        ;LIST THE FINAL TABLE
  521.     LXI    D,LASTTYPE        ;SEE IF THE CURRENT TYPE IS THE
  522.     LHLD    ADDR1            ;LAST TYPE
  523.     MVI    B,3
  524.     CALL    COMPARE
  525.     JZ    CHKSELECT        ;TYPES MATCH, CHECK FILE SELECT
  526.     CALL    MOVE            ;TYPES DON'T MATCH, MAKE THE
  527.                     ;LAST TYPE = CURRENT TYPE NOW
  528.     MVI    C,NOSKIP+1        ;SEE IF THE NEW TYPE IS IN THE
  529.     LXI    D,SKIPTYPE        ;LIST OF FILE TYPES TO SKIP
  530.     MVI    B,3
  531. NEXTSKIP    DCR    C        ;DECREMENT NO OF FILES TO SKIP
  532.     JZ    FORMQUS         ;FILE IS GOOD
  533.     LHLD    ADDR1
  534.     CALL    COMPARE
  535.     JZ    SKIPALLTYPE        ;FILE WAS ON THE SKIP LIST
  536.     INX    D            ;INCREMENT TO NEXT SKIP FILE
  537.     INX    D
  538.     INX    D
  539.     JMP    NEXTSKIP
  540. FORMQUS LXI    D,QTYPE         ;FORM THE QUESTION ABOUT WHETHER
  541.     LHLD    ADDR1            ;TO SKIP THIS FILE TYPE OR NOT
  542.     MVI    B,3            ;MOVE THE FILE TYPE TO THE 
  543.     CALL    MOVE            ;QUESTION PRINT LINE
  544.     XRA    A
  545.     STA    SELFLAG         ;RESET THE SELECT FLAG
  546. REASK1    LXI    D,QUEST1
  547.     CALL    QUESTION        ;ASK THE QUESTION ABOUT THE TYPE
  548.     CPI    1            ;ONE CHARACTER RESPONSE ALLOWED
  549.     JNZ    REASK1
  550.     LDA    INREC            ;GET THE RESPONSE
  551.     CPI    'N'
  552.     JZ    SKIPALLTYPE
  553.     CPI    'Y'
  554.     JZ    SAVEALLTYPE
  555.     CPI    'S'            ;S=SELECT CERTAIN FILES FROM THIS
  556.     JNZ    REASK1            ;TYPE
  557.     MVI    A,1            ;SET THE SELECT FLAG
  558.     STA    SELFLAG         ;TO ASK THE NEXT QUESTION
  559. ASKFILE LHLD    ADDR1            ;FORMAT A QUESTION TO ASK IF THIS
  560.     LXI    D,QTYPE2        ;PARTICULAR FILE IS TO BE SAVED
  561.     MVI    B,3
  562.     CALL    MOVE
  563.     LXI    D,QFILE2        ;MOVE THE FILE NAME TO THE QUESTION
  564.     INX    H
  565.     INX    H            ;POSITION PAST THE FILE TYPE
  566.     INX    H            ;IN THE TABLE
  567.     MVI    B,8
  568.     CALL    MOVE            ;MOVE THE NAME
  569.     LXI    D,8            ;POSITION PAST NAME TO THE
  570.     DAD    D            ;DISK ID
  571.     LXI    D,QDISK2        ;MOVE THE DISK ID
  572.     MVI    B,IDSIZE
  573.     CALL    MOVE    
  574. REASK2    LXI    D,QUEST2        ;ASK THE FILE QUESTION
  575.     CALL    QUESTION
  576.     CPI    1            ;ONLY A 1 CHAR RESPONSE ALLOWED
  577.     LDA    INREC
  578.     JNZ    REASK2
  579.     CPI    'C'            ;CONTINUE WITH THE REST OF THE
  580.     JZ    SAVEALLTYPE        ;FILES WITHIN THIS TYPE - RESTART
  581.     CPI    'Y'            ;SAVE THIS PARTICULAR FILE
  582.     JZ    NEXTENTRY
  583.     CPI    'N'
  584.     JNZ    REASK2
  585.     LHLD    ADDR1            ;SHORTEN THE LIST BY ONE ENTRY
  586.     LXI    D,RECSIZE
  587.     DAD    D
  588.     SHLD    ADDR2            ;SKIP THE LAST ONE
  589.     CALL    MOVELIST        ;MOVES THE LIST DOWN FROM ADDR1
  590.                     ;TO ADDR2
  591.     LHLD    ADDR1
  592.     JMP    CHKNEXT         ;CHECK NEXT ENTRY
  593. CHKSELECT    LDA    SELFLAG     ;CHECK THE SELECT FLAG
  594.     ORA    A            ;IF NOT ZERO, ASK THE QUESTION
  595.     JNZ    ASKFILE         ;ABOUT EACH FILE
  596.     JMP    NEXTENTRY
  597. SKIPALLTYPE    CALL    FINDTYPE    ;FIND THE NEXT TYPE NOT MATCHING
  598.     CALL    MOVELIST        ;THIS ONE AND MOVE THE LIST DOWN
  599.     LHLD    ADDR1
  600.     JMP    CHKNEXT         ;TO SKIP THIS TYPE
  601. SAVEALLTYPE    CALL    FINDTYPE    ;SAVE ALL OF THIS TYPE
  602.     LHLD    ADDR2            ;RESET THE ADDRESS TO THE NEXT
  603.     SHLD    ADDR1            ;TYPE
  604.     JMP    CHKNEXT
  605. MOVELIST    LHLD    ADDR2        ;MOVE THE TABLE FROM ADDR2 DOWN
  606.     XCHG                ;TO ADDR1 THEREBY ELIMINATING
  607.     LHLD    ADDR1            ;UNWANTED ENTRIES
  608. MOVENEXT    LDAX    D        ;AND MAKING MORE ROOM FOR THE
  609.     MOV    M,A
  610.     CPI    1AH
  611.     RZ
  612.     INX    H
  613.     INX    D
  614.     JMP    MOVENEXT
  615. FINDTYPE    LHLD    ADDR1        ;FIND THE NEXT ENTRY
  616.     SHLD    ADDR2            ;WITH A TYPE DIFFERENT
  617. FINDIT    LHLD    ADDR2            ;THAN THE CURRENT TYPE
  618.     LXI    D,RECSIZE
  619.     DAD    D
  620.     SHLD    ADDR2
  621.     MOV    A,M            ;STOP AT END OF THE TABLE
  622.     CPI    1AH
  623.     RZ
  624.     XCHG
  625.     LHLD    ADDR1
  626.     MVI    B,3
  627.     CALL    COMPARE
  628.     RNZ
  629.     JMP    FINDIT            ;ADDR2 WILL HAVE THE ADDRESS OF
  630.                     ;THE NEXT TYPE WHEN FINISHED
  631. LISTBKUP    EQU    $        ;LIST THE FILES TO BE BACKED
  632.     SHLD    ADDR2            ;SAVE THE END OF THE TABLE FOR LATER
  633.     LXI    H,RAM-RECSIZE
  634.     SHLD    ADDR1
  635.     CALL    HEADING2
  636. NEXTONE LHLD    ADDR1            ;PRINT THE NEXT TABLE ENTRY
  637.     LXI    D,RECSIZE
  638.     DAD    D
  639.     SHLD    ADDR1            ;INCREMENT TO THE NEXT ENTRY
  640.     MOV    A,M            ;CHECK FOR THE END OF THE
  641.     CPI    1AH            ;TABLE
  642.     RZ
  643.     CALL    FORMAT            ;FORMAT ENTRY
  644.     LXI    D,PRNTREC
  645.     CALL    LIST            ;PRINT IT
  646.     LDA    MAX2            ;SEE MORE WILL FIT ON THIS LINE
  647.     DCR    A
  648.     STA    MAX2
  649.     JZ    LINEFULL
  650.     JMP    NEXTONE
  651. LINEFULL    LXI    D,CRLF
  652.     CALL    LIST
  653.     LDA    LINECNT
  654.     DCR    A
  655.     STA    LINECNT
  656.     JZ    PAGEFULL
  657.     JMP    SETLINE
  658. PAGEFULL    CALL    HEADING2
  659.     MVI    A,LINESPAGE
  660.     STA    LINECNT
  661. SETLINE MVI    A,RECLINE
  662.     STA    MAX2
  663.     JMP    NEXTONE
  664. HEADING2    LXI    D,HEAD2
  665.     CALL    LIST
  666.     LXI    D,CRLF
  667.     CALL    LIST
  668.     MVI    A,LINESPAGE
  669.     STA    LINECNT
  670.     MVI    A,RECLINE
  671.     STA    MAX2
  672.     RET
  673.  
  674.  
  675.  
  676. * BACKUP IS USED TO BACKUP THE FILES IN THE CREATED LIST.  IT
  677. * WILL NOT BACK UP ANY FILE THAT WILL NOT FIT ON ONE DISK ENTIRELY.
  678. * THE FILES THAT IT BACKS UP WILL COME FROM ANY OF THE HARD DISKS,
  679. * BUT NOT NECCESSARILY IN DISK ORDER, BUT RATHER ALPHABETICAL FILE
  680. * NAME ORDER.  IT WILL PROMPT FOR THE FLOPPY DISK ID AND PRINT A 
  681. * REPORT SHOWING THE FLOPPY ID AND THE FILES COPIED FOR INDEX.
  682. * IF THE FILE WILL NOT FIT ON A DISK, IT WILL BE DELETED FROM THE
  683. * DISK, THAT DISK CLOSED AND REMOVED, AND PROMPTED FOR A NEW DISK
  684. * TO RECEIVE THE FILE.    BLANK 1024 BYTE SECTORED DISKS SHOULD BE
  685. * USED FOR BEST PERFORMANCE.  WHEN ONE DISKETTE IS FULL, IT WILL
  686. * PROMPT FOR A NEW ONE SO MANY DISKETTES CAN BE USED TO BACKUP
  687. * THE HARD DISKS.  IF IT IS NECESSARY TO ABORT DURING THIS PROCESS,
  688. * USE THE RESTART CAPABILITY PROVIDED IN "SELECT".  THE AREA
  689. * FOR THE DISK BUFFER IS ALL OF RAM FROM THE END OF THE TABLE
  690. * TO THE START OF BDOS.
  691.  
  692. BACKUP    EQU    $
  693.     CALL TOPOFFORM
  694.     LHLD    ADDR2        ;GET THE CURRENT END OF TABLE
  695.     INX    H        ;PLUS ONE FOR THE START OF THE
  696.     SHLD    ADDR3        ;READ/WRITE BUFFER
  697.     LXI    H,RAM        ;SET THE ADDRESS OF THE FIRST ENTRY
  698.     SHLD    ADDR1
  699.     LXI    D,RECSIZE    ;SET AN ADDRESS FOR THE SECOND ENTRY
  700.     DAD    D        ;NEXT ENTRY = CURRENT + RECSIZE
  701.     SHLD    ADDR2        ;LATER, USE MOVELIST TO MOVE THE LIST
  702.                 ;DOWN FROM ADDR2 TO ADDR1 AFTER EACH FILE
  703.                 ;HAS BEEN COPIED.  THIS IS SO THAT THE
  704.                 ;RAM BUFFER WILL EXPAND AS THE FILES ARE
  705.                 ;COPIED SO THAT COPYING WILL BE FASTER.
  706.     CALL    MOUNT
  707.     JMP    PASSMOVE
  708. NEXTFILE    EQU    $
  709.     CALL    MOVELIST
  710.     INX    H        ;NEW START OF READ/WRITE BUFFER
  711.     SHLD    ADDR3
  712.     XRA    A        ;RESET THE FLAG FOR FILES TOO BIG
  713.     STA    TOOBIG        ;TO FIT ON ONE FLOPPY
  714. PASSMOVE    LXI    H,RAM    ;THE TABLE SHRINKS SO THE CURRENT 
  715.                 ;ENTRY IS ALWAYS AT "RAM" BUT THE
  716.                 ;READ/WRITE BUFFER GROWS
  717.     MOV    A,M
  718.     CPI    1AH
  719.     JZ    DISMOUNT    ;FINISHED
  720. FORMFCB LXI    D,HDFCB     ;CLEAR THE FCB
  721.     MVI    B,36
  722.     XRA    A
  723. ZEROFCB STAX    D
  724.     INX    D
  725.     DCR    B
  726.     JNZ    ZEROFCB
  727.     LXI    H,RAM        ;GET ADDRESS OF TABLE ENTRY
  728.     LXI    D,HDTYPE    ;MOVE IN THE TYPE
  729.     MVI    B,3
  730.     CALL    MOVE
  731.     INX    H
  732.     INX    H        ;POSITION TO NAME
  733.     INX    H
  734.     LXI    D,HDFILE    ;MOVE THE FILE NAME
  735.     MVI    B,8
  736.     CALL    MOVE
  737.     LXI    D,8
  738.     DAD    D        ;POSITION TO DISK ID, A:, B: ETC
  739.     MOV    A,M
  740.     ANI    1FH        ;CONVERT A=1...P=16
  741.     STA    HDFCB
  742.     LXI    D,FPFCB     ;COPY THE HDFCB TO THE FLOPPY FCB
  743.     LXI    H,HDFCB
  744.     MVI    B,36
  745.     CALL    MOVE
  746.     LDA    BACKUPDRV    ;SET THE RECEIVING FLOPPY DRIVE NUMBER
  747.     ANI    1FH        ;CONVERT FLOPPY DRIVE TO NUMBER
  748.     STA    FPFCB
  749.     LXI    D,HDFCB     ;OPEN THE HD FILE
  750.     MVI    C,0FH
  751.     CALL    BDOS        ;OPEN THE INPUT FILE
  752.     INR    A
  753.     JZ    NOTFOUND
  754.     LXI    D,FPFCB     ;DELETE THE FILE ON FLOPPY IF IT
  755.     MVI    C,13H        ;EXISTS
  756.     CALL    BDOS
  757.     LXI    D,FPFCB     ;CREATE THE FILE ON FLOPPY 
  758.     MVI    C,16H
  759.     CALL    BDOS        ;MAKE FILE
  760.     INR    A
  761.     JZ    DISKFULL
  762.     LXI    H,RAM
  763.     CALL    FORMAT
  764.     LXI    D,PRNTREC
  765.     CALL    OUTPUT
  766. COPYLOOP    CALL    LOADBUFF    ;LOAD MEMORY WITH FILE
  767.     CALL    WRITEBUF        ;WRITE MEMORY FILE
  768.     LDA    EOF            ;DISPLAY THE STATUS
  769.     ADI    30H
  770.     MOV    E,A            ;CONSOLE OUTPUT
  771.     MVI    C,2
  772.     CALL    BDOS
  773.     LDA    EOF
  774.     CPI    1
  775.     JZ    ENDOFFILE
  776.     CPI    2
  777.     JZ    DISKFULL
  778.     JMP    COPYLOOP
  779. ENDOFFILE    LXI    D,FPFCB     ;CLOSE FLOPPY FILE
  780.     MVI    C,10H
  781.     CALL    BDOS            ;CLOSE
  782.  
  783.     IF    MOLEC
  784.     LXI    H,HDFCB+11        ;TAG 'T3' BYTE TO INDICATE BACKUPED
  785.     ENDIF
  786.  
  787.     IF    NOT MOLEC
  788.     LXI    H,HDFCB+4        ;TAG 'F4' BYTE TO INDICATE BACKUPED
  789.     ENDIF
  790.  
  791.     MOV    A,M            ;GET 'T3' BYTE FOR TAGING ON MOLECULAR
  792.                     ;OR 'F4' BYTE FOR OTHER COMPUTERS
  793.     ORI    80H            ;SET THE BIT
  794.     MOV    M,A            ;PUT IT BACK IN HDFCB
  795.     LXI    D,HDFCB         ;SETUP FOR ATTRIBUTE SETTING
  796.     MVI    C,1EH
  797.     CALL    BDOS            ;WRITE IT ON THE DISK
  798.     LXI    H,RAM
  799.     CALL    PRINTFILE    ;WRITE FILE NAME ON INDEX LIST
  800.     JMP    NEXTFILE
  801. DISKFULL    LXI    D,FPFCB
  802.     MVI    C,13H        ;DELETE FILE ON FLOPPY
  803.     CALL    BDOS
  804.     LDA    TOOBIG            ;IS THIS THE SECOND FLOPPY
  805.     ORA    A            ;IT HAS TRIED TO COPY TO?
  806.     JZ    FIRSTTRY        ;NO, FIRST FLOPPY. RETRY
  807.     LXI    D,BIGMSG        ;YES, SECOND FLOPPY. SEND MESSAGE
  808.     CALL    LIST            ;WARNING THAT THIS FILE CANNOT
  809.     LXI    H,RAM
  810.     CALL    FORMAT            ;BE BACKED UP WITH THIS PROGRAM
  811.     LXI    D,PRNTREC
  812.     CALL    LIST            ;PRINT THE FILE NAME ALSO
  813.     CALL    MOUNT
  814.     JMP    NEXTFILE
  815. FIRSTTRY    INR    A        ;SET INDICATOR THAT IT HAS TRIED
  816.     STA    TOOBIG            ;ONCE ALREADY TO COPY IT
  817.     CALL    MOUNT        ;GET NEW DISK
  818.     JMP    FORMFCB
  819. NOTFOUND LXI    H,RAM
  820.     CALL    FORMAT
  821.     LXI    D,NFMSG
  822.     CALL    OUTPUT
  823.     LXI    D,PRNTREC
  824.     CALL    OUTPUT
  825.     RET
  826. DISMOUNT CALL    BELL
  827.     LXI    D,DMNTMSG    ;DISMOUNT FLOPPY
  828.     CALL    QUESTION
  829. DISM1    LXI    D,AGAINMSG
  830.     CALL    QUESTION    ;AND GET response
  831.     CPI    1
  832.     JNZ    DISM1        ;NO INPUT THEN LOOP
  833.     LDA    INREC        ;GET ANSWER
  834.     CPI    'Y'
  835.     JZ    START        ;IF YES THEN START OVER
  836.     CALL    TOPOFFORM
  837.     RET
  838.  
  839.  
  840.  
  841. * ASSORTED ROUTINES
  842.  
  843. PRINTFILE    CALL    FORMAT
  844.     LXI    D,PRNTREC    ;PRINT THE FILE ENTRY
  845.     CALL    LIST
  846.     LDA    MAX2
  847.     DCR    A
  848.     STA    MAX2        ;ENTRIES PER LINE COUNTER
  849.     RNZ
  850.     LXI    D,CRLF        ;GO TO NEW LINE
  851.     CALL    LIST
  852.     MVI    A,RECLINE
  853.     STA    MAX2
  854.     RET
  855.  
  856. HEADING3    LXI    D,CRLFLFLF    ;INDEX HEADING NOT AT TOP OF FORM
  857.     CALL    LIST
  858.     LXI    D,IDISKNO        ;MOVE THE DISK ID NO TO HEADING
  859.     LXI    H,VOLSER
  860.     MVI    B,3
  861.     CALL    MOVE
  862.     LXI    D,IDATE
  863.     LXI    H,DATE
  864.     MVI    B,8
  865.     CALL    MOVE
  866.     LXI    D,INDEX
  867.     CALL    LIST
  868.     LXI    D,CRLF
  869.     CALL    LIST
  870.     MVI    A,RECLINE
  871.     STA    MAX2
  872.     MVI    A,LINESPAGE
  873.     STA    LINECNT
  874.     RET
  875.  
  876. TOPOFFORM:
  877.     LDA    PRNTFLG        ;SEE IF PRINTER IS ON
  878.     ORA    A
  879.     RNZ            ;IF ZERO THEN PRINTER IS ON
  880.     MVI    E,0dH        ;### finish current line
  881.     MVI    C,5        ;###
  882.     call    BDOS        ;###
  883.     MVI    E,0CH        ;POSITION PRINTER TO TOP OF FORM
  884.     MVI    C,5
  885.     JMP    BDOS
  886.  
  887. MOUNT    CALL    BELL
  888.     LXI    D,MNTMSG
  889.     CALL    QUESTION
  890.     CPI    3
  891.     JNZ    MOUNT
  892.     LXI    H,INREC
  893.     LXI    D,ENDLIT
  894.     MVI    B,3
  895.     CALL    COMPARE
  896.     JZ    FINISHED
  897.     LXI    D,VOLSER
  898.     LXI    H,INREC
  899.     MVI    B,3
  900.     CALL    MOVE        ;MOVE VOLSER ID TO VOLSER
  901.     MVI    C,0DH        ;DO A SYSTEM RESET TO  CHANGE DISKS
  902.     CALL    BDOS
  903. ERA    LXI    D,ERASE
  904.     CALL    QUESTION
  905.     CPI    1
  906.     JNZ    ERA
  907.     LDA    INREC
  908.     CPI    'N'
  909.     JZ    NOERA
  910.     CPI    'Y'
  911.     JNZ    ERA
  912.     LDA    BACKUPDRV
  913.     ANI    1FH
  914.     STA    DUMMYFCB
  915.     MVI    C,13H
  916.     LXI    D,DUMMYFCB
  917.     CALL    BDOS        ;DELETE ALL FILES ON FLOPPY
  918. NOERA    EQU    $
  919.     CALL    HEADING3
  920.     LXI    D,FPFCB     ;CLEAR THE FCB TO CREATE A FILE NAME
  921.     MVI    B,36
  922.     XRA    A
  923. CLRFCB    STAX    D
  924.     INX    D
  925.     DCR    B
  926.     JNZ    CLRFCB
  927.     LDA    BACKUPDRV    ;SET UP THE DRIVE AS THE BACKUP
  928.     ANI    1FH        ;CONVERT FLOPPY DRIVE TO NUMBER
  929.     STA    FPFCB
  930.     LXI    H,DATE        ;CREATE A NULL FILE WITH THE DATE AS
  931.     LXI    D,FPFCB+1    ;THE FILE NAME AND THE 3 DIGIT
  932.     MVI    B,8
  933.     CALL    MOVE
  934.     LXI    H,VOLSER        ;3 DIGIT VOLSER AS THE FILE TYPE
  935.     LXI    D,FPFCB+9
  936.     MVI    B,3        ;THIS FILE WILL BE USED TO IDENTIFY
  937.     CALL    MOVE        ; THE DISK AND MARK THE DATE
  938.     LXI    D,FPFCB
  939.     MVI    C,16H        ;CREATE THE FILE
  940.     CALL    BDOS
  941.     INR    A
  942.     JZ    MOUNT        ;DISK FULL?
  943.     LXI    D,FPFCB
  944.     MVI    C,10H        ;CLOSE THE FILE
  945.     CALL    BDOS
  946.     RET
  947.  
  948. LOADBUFF    EQU    $    ;THIS ROUTINE LOADS AS MUCH OF
  949.     LXI    H,0000        ;MEMORY WITH THE FILE AS POSSIBLE
  950.     SHLD    MAX1
  951.     LHLD    ADDR3        ;NEW TOP OF TABLE +2
  952.     SHLD    TEMP
  953.     XRA    A
  954.     STA    EOF        ;CLEAR EOF FLAG
  955. LOADNEXT    LHLD    TEMP
  956.     XCHG            ;SET DMA ADDRESS
  957.     MVI    C,1AH
  958.     CALL    BDOS
  959.     LXI    D,HDFCB     ;READ HARD DISK
  960.     MVI    C,14H
  961.     CALL    BDOS
  962.     ORA    A
  963.     JNZ    HDEOF        ;EOF?
  964.     LHLD    MAX1
  965.     INX    H        ;INCREMENT RECORD COUNT
  966.     SHLD    MAX1
  967.     LHLD    TEMP        ;SEE IF NEXT RECORD WOULD EXCEED THE
  968.     LXI    D,128        ;TPA AREA
  969.     DAD    D
  970.     SHLD    TEMP
  971.     DAD    D        ;WILL THE NEXT RECORD OVERWRITE BDOS?
  972.     XCHG
  973.     LHLD    BDOS+1        ;FIND THE TOP OF MEMORY
  974.     CALL    COMPREG     ;COMPARE REGISTERS
  975.     RC            ;RETURN IF MEMORY ALREADY FULL
  976.     JMP    LOADNEXT    ;GET ANOTHER RECORD
  977. HDEOF    MVI    A,1        ;SET FILE EOF
  978.     STA    EOF
  979.     RET
  980.  
  981. BELL    EQU    $
  982.     MVI    C,9
  983.     LXI    D,MSG
  984.     CALL    BDOS
  985. BEEP:
  986. *    MVI    C,5        ;BELL ON PRINTER
  987. *    MVI    E,07H
  988. *    CALL    BDOS
  989.     MVI    C,2        ;07H ON CRT
  990.     MVI    E,07H
  991.     CALL    BDOS
  992. bepe:    MVI    C,0BH
  993.     CALL    BDOS        ;GET CONSOLE STATUS
  994.     ORA    A
  995.     JZ    BEPE
  996.     MVI    C,01
  997.     CALL    BDOS        ;GET THE DUMMY CHAR
  998.     RET
  999. MSG    DB    0DH,0AH,0AH,'PRESS ANY KEY TO CONTINUE'
  1000.     DB    0DH,0AH,0AH,'$'
  1001.  
  1002. WRITEBUF    EQU    $    ;WRITE FROM THE MEMORY BUFFER
  1003.     LHLD    ADDR3
  1004.     SHLD    TEMP
  1005.     LHLD    MAX1        ;ALLOW FOR FILES THAT HAVE NO 
  1006.     LXI    D,0000        ;RECORDS SUCH AS RESTART
  1007.     CALL    COMPREG
  1008.     RZ
  1009. WRITENEXT    LHLD    TEMP
  1010.     XCHG            ;SET DMA ADDRESS
  1011.     MVI    C,1AH
  1012.     CALL    BDOS
  1013.     LXI    D,FPFCB
  1014.     MVI    C,15H        ;WRITE SEQUENTIAL
  1015.     CALL    BDOS
  1016.     ORA    A
  1017.     JNZ    FPFULL        ;FLOPPY DISK FULL
  1018.     LHLD    MAX1        ;DECREASE RECORD COUNT
  1019.     DCX    H
  1020.     SHLD    MAX1
  1021.     LXI    D,0000        ;CHECK FOR NO MORE TO WRITE
  1022.     CALL    COMPREG
  1023.     RZ
  1024.     LHLD    TEMP
  1025.     LXI    D,128        ;INCREMENT WRITE ADDRESS
  1026.     DAD    D
  1027.     SHLD    TEMP
  1028.     JMP    WRITENEXT
  1029. FPFULL    MVI    A,2        ;FULL DISKETTE
  1030.     STA    EOF
  1031.     RET
  1032.  
  1033. FORMAT    LXI    D,PRNTYPE    ;FORMAT THE ENTRY FROM THE TABLE
  1034.     MVI    B,3        ;FORMAT TO THE PRINT FORMAT
  1035.     CALL    MOVE        ;THE TABLE ADDRESS IS ASSUMMED TO BE
  1036.     LXI    D,3        ;IN HL. FIRST MOVE THE TYPE
  1037.     DAD    D        ;NOW POSITION TO THE FILE NAME
  1038.     LXI    D,PRNFILE    ;MOVE THE FILE NAME
  1039.     MVI    B,8
  1040.     CALL    MOVE
  1041.     LXI    D,8        ;POSITION TO THE DISK ID
  1042.     DAD    D
  1043.     LXI    D,PRNTREC    ;MOVE THE DISK ID TO THE LINE
  1044.     MVI    B,IDSIZE
  1045.     CALL    MOVE
  1046.     RET
  1047.  
  1048. COMPREG MOV    A,H        ;COMPARE HL TO DE
  1049.     CMP    D
  1050.     RNZ
  1051.     MOV    A,L
  1052.     CMP    E
  1053.     RET
  1054.  
  1055. OUTPUT:    PUSH    D        ;PUT OUT A CRLF
  1056.     LXI    D,CRLF
  1057.     MVI    C,09
  1058.     CALL    BDOS
  1059.     POP    D        ;NOW PUT OUT THE MESSAGE
  1060. OUT1    MVI    C,09
  1061.     JMP    BDOS
  1062.  
  1063. HEADING LXI    D,HEAD1
  1064.     CALL    LIST
  1065.     LXI    D,DATE
  1066.     CALL    LIST
  1067.     LXI    D,TABFULL
  1068.     LDA    ABORT
  1069.     ORA    A
  1070.     CNZ    LIST
  1071.     MVI    A,LINESPAGE
  1072.     STA    LINECNT
  1073.     LXI    D,CRLF
  1074.     CALL    LIST
  1075.     LXI    D,CRLF
  1076.     JMP    LIST
  1077.  
  1078. LIST    PUSH    H        ;THIS DIFFERS FROM OUTPUT
  1079.     PUSH    B        ; IN THAT LIST GOES TO THE
  1080.     PUSH    D        ;LIST DEVICE AND OUTPUT GOES
  1081.     LDA    PRNTFLG        ;CK FOR PRINTER OUTPUT
  1082.     ORA    A        ;IF ZERO THEN PRINT ELSE JUMP AROUND
  1083.     JNZ    LIST2
  1084. LIST1    LDAX    D        ;TO THE CONSOLE DEVICE
  1085.     CPI    '$'
  1086.     JZ    LIST2
  1087.     INX    D
  1088.     PUSH    D
  1089.     MOV    E,A
  1090.     MVI    C,5
  1091.     CALL    BDOS
  1092.     POP    D
  1093.     JMP    LIST1
  1094. LIST2    POP    D
  1095.     POP    B
  1096.     POP    H
  1097.     RET
  1098.  
  1099.  
  1100. QUESTION:    CALL    OUTPUT    ;PUT OUT THE QUESTION
  1101.     LXI    D,INBUF
  1102.     MVI    C,0AH        ;INPUT THE REPLY
  1103.     CALL    BDOS
  1104.     LDA    INCNT        ;SEE IF ANYTHING WAS ENTERED
  1105.     ora    a        ;### added by wfd, 6/3/84
  1106.     rz            ;### nope, return anyway
  1107.     push    psw        ;###
  1108.     push    b        ;###
  1109.     push    h        ;###
  1110.     lxi    h,inrec        ;###
  1111.     mov    b,a        ;###
  1112. touppr:    mov    a,m        ;###
  1113.     cpi    'a'        ;### lower case ?
  1114.     jc    toupdn        ;### no
  1115.     cpi    '{'        ;### 'z' or less?
  1116.     jnc    toupdn        ;### no
  1117.     ani    5fh        ;### make upper
  1118.     mov    m,a        ;###
  1119. toupdn:    inx    h        ;###
  1120.     dcr    b        ;###
  1121.     jnz    touppr        ;###
  1122.     pop    h        ;###
  1123.     pop    b        ;###
  1124.     pop    psw        ;###
  1125.     RET
  1126.  
  1127. MOVE    PUSH    H        ;MOVE DATA POINTED TO IN HL
  1128.     PUSH    D        ;TO THE AREA POINTED TO IN DE
  1129.     PUSH    B        ;BY THE BYTE COUNT IN B
  1130. MOVE1    MOV    A,M
  1131. *    ANI    7FH        ;RESET THE HIGH ORDER BIT BECAUSE IT
  1132. *                ;MAY HAVE BEEN TURNED ON FOR THE TYPE
  1133.     STAX    D
  1134.     INX    H
  1135.     INX    D
  1136.     DCR    B
  1137.     JNZ    MOVE1
  1138.     POP    B        ;RESTORE THE TOTAL ENVIRONMENT
  1139.     POP    D
  1140.     POP    H
  1141.     RET
  1142.  
  1143. COMPARE PUSH    H        ;COMPARE THE STRINGS POINTED TO IN HL
  1144.     PUSH    D        ;TO THE STRING POINTED TO IN DE
  1145.     PUSH    B        ;FOR A LENGTH OF B CHARACTERS
  1146. COMP1    LDAX    D        ; JC IF HL > DE
  1147.     CMP    M        ; JZ IF HL = DE
  1148.     JNZ    COMP2        ;JNC IF HL < DE
  1149.     INX    H
  1150.     INX    D
  1151.     DCR    B
  1152.     JNZ    COMP1
  1153. COMP2    POP    B
  1154.     POP    D
  1155.     POP    H
  1156.     RET
  1157.  
  1158.  
  1159. ; THIS ROUTINE READS THE COMPUTIME CLOCK AND FORMATS THE TIME AND DATE
  1160. GETDATE EQU    $
  1161.     MVI    A,16        ;RAISE THE HOLD SIGNAL
  1162.     OUT    C2
  1163.     MVI    A,50        ;DELAY AT LEAST 50 MILLISECONDS
  1164. WAIT50 DCR    A
  1165.     JNZ    WAIT50
  1166.     LXI    H,DATETIME    ;SET MESSAGE START.  NOTE 1ST CHAR IS SPACE
  1167.     MVI    A,42        ;GET MONTH TENS CHAR
  1168.     CALL    GETTIME
  1169.     MVI    A,41        ;GET MONTH UNITS CHAR
  1170.     CALL    GETTIME
  1171.     INX    H        ;SKIP SLASH
  1172.     MVI    A,40        ;GET DAY TENS CHAR
  1173.     CALL    GETTIME
  1174.     ANI    0F3H        ;DROP LEAP YEAR INDICATOR
  1175.     MOV    M,A
  1176.     MVI    A,39        ;GET DAY UNITS CHAR
  1177.     CALL    GETTIME     
  1178.     INX    H        ;SKIP SLASH
  1179.     MVI    A,44        ;GET YEAR TENS CHAR
  1180.     CALL    GETTIME
  1181.     MVI    A,43        ;GET YEAR UNITS CHAR
  1182.     CALL    GETTIME
  1183.     INX    H        ;SKIP BLANK
  1184.     MVI    A,37        ;GET HOUR TENS CHAR
  1185.     CALL    GETTIME
  1186.     ANI    0F3H        ;DROP AM/PM AND 24HR INDICATORS
  1187.     MOV    M,A
  1188.     MVI    A,36        ;GET HOUR UNITS CHAR
  1189.     CALL    GETTIME
  1190.     INX    H        ;SKIP COLON
  1191.     MVI    A,35        ;GET MINUTES TENS CHAR
  1192.     CALL    GETTIME
  1193.     MVI    A,34        ;GET MINUTES UNITS CHAR
  1194.     CALL    GETTIME
  1195.     INX    H        ;SKIP COLON
  1196.     MVI    A,33        ;GET SECONDS TENS CHAR
  1197.     CALL    GETTIME
  1198.     MVI    A,32        ;GET SECONDS UNITS CHAR
  1199.     CALL    GETTIME
  1200.     XRA    A
  1201.     OUT    C2        ;LOWER HOLD SIGNAL
  1202.     RET
  1203. C1    EQU    254        ;CLOCK ADDRESS PORT
  1204. C2    EQU    253        ;CLOCK DATA OUTPUT PORT
  1205. GETTIME INX    H        ;ADVANCE TO NEXT PRINT POSITION
  1206.     OUT    C1
  1207.     MVI    A,6        ;DELAY AT LEAST 6 MILLISECONDS
  1208. WAIT6    DCR    A
  1209.     JNZ    WAIT6
  1210.     IN    C1
  1211.     ORI    30H        ;CONVERT TO ASCII
  1212.     MOV    M,A
  1213.     RET
  1214. DATETIME    DB     ' 00/00/00 HH:MM:SS$'
  1215. DRIVES        DB     'ABCDEFGHIJKLMNOP'     ;DRIVE NOS FOR THE HARD DISKS
  1216. BACKUPDRV    DS    1              ;BACKUP FLOPPY DRIVE LETTER
  1217.  
  1218.  
  1219. SIGNON    DB    1AH,'HARD DISK CATALOG AND BACKUP   v2.3  8/22/83 rds$'
  1220. DRIVMSG DB    0AH,'Enter Letter of Drives to Backup from as "ABCD..ect."? $'
  1221. BKUPMSG DB    0AH,'Enter Letter of Floppy Drive to Backup to? $'
  1222. CORRMSG DB    0AH,'Backing up Drives  $'
  1223. CORRMSG1 DB    '  to Floppy Drive  $'
  1224. PRINTMSG DB    0AH,'Do you wish a Printed Report (Y/N)? $'
  1225. CORRY$N DB    0AH,'Is this Correct (Y/N)? $'
  1226. DATEMSG DB    0AH,'Enter 8 Char Date for Reports (MM/DD/YY)? $'
  1227. DATVERMSG DB    '  for Date $'
  1228. ERASE    DB    0AH,07H,'ERASE Floppy Disk First (Y/N)? $'
  1229. TABFULL DB    0AH,07H,'MEMORY FULL...REPORT NOT COMPLETE$'
  1230. BACKQUS DB    0AH,'Begin Backup Procedure (Y/N)? $'
  1231. SORTMSG DB    0AH,'SORTING...$'
  1232. NFMSG    DB    0AH,07H,'FILE NOT FOUND...ABORTING$'
  1233. DMNTMSG DB    'DISMOUNT BACKUP DISK AND ENTER RETURN$'
  1234. AGAINMSG DB    0AH,'Do you wish to run Backup again (Y/N)? $'
  1235. MNTMSG    DB    'MOUNT DISKETTE FOR BACKUP AND ENTER '
  1236.     DB    '3 CHAR DISK ID OR "END"? $'
  1237. ENDLIT    DB    'END'
  1238. VOLSER    DS    3
  1239. QUEST1    DB    'BACKUP ALL FILES OF TYPE '
  1240. QTYPE    DS    3
  1241.     DB    ', (Y/N/S)? $'
  1242. QUEST2    DB    'BACKUP FILE NAMED '
  1243. QDISK2    DS    1
  1244.     DB    ':'
  1245. QFILE2    DS    8
  1246.     DB    '.'
  1247. QTYPE2    DS    3
  1248.     DB    ', (Y/N/C)? $'
  1249. HEAD2    DB    0CH,'THE FOLLOWING FILES WILL BE COPIED TO DISKETTES$'
  1250. PRNTFLG DS    1
  1251. PRNTREC DS    1
  1252.     DB    ':'
  1253. PRNFILE DS    8
  1254.     DB    '.'
  1255. PRNTYPE DS    3
  1256.     DB    '    $'
  1257. CRLFLFLF DB    0DH,0AH,0AH,0AH,'$'
  1258. INDEX    DB    'THE FOLLOWING FILES ARE ON DISKETTE NO. '
  1259. IDISKNO DS    3
  1260.     DB    ' AS OF '
  1261. IDATE    DS    8
  1262.     DB    '$'
  1263. CRLF    DB    0DH,0AH,'$'
  1264. HEAD1    DB    0CH,'CONSOLIDATED INDEX BY FILE TYPE AS OF $'
  1265. DATE    DS    8
  1266.     DB    '   $'
  1267. BIGMSG    DB    0DH,0AH,'FILE TOO LARGE TO FIT ON ONE DISKETTE '
  1268.     DB    'SO NOT BACKED UP **** $'
  1269. HDFCB    DS    1
  1270. HDFILE    DS    8
  1271. HDTYPE    DS    3
  1272.     DS    24
  1273. FPFCB    DS    36
  1274. TOP    DB    0CH,'$'
  1275. INBUF    DB    30
  1276. INCNT    DS    1
  1277. INREC    DS    30
  1278. STACK    DS    80
  1279. EOF    DS    1
  1280. ABORT    DS    1
  1281. LINECNT DS    1
  1282. LASTTYPE DS    3
  1283. LASTFILE DS    8
  1284. TABADDR DS    2
  1285. TABCNT    DS    2
  1286. SELFLAG DS    1
  1287. TOOBIG    DS    1
  1288. ADDR1    DS    2
  1289. ADDR2    DS    2
  1290. ADDR3    DS    2
  1291. MAX1    DS    2
  1292. MAX2    DS    2
  1293. RTYPE    DS    3
  1294. RFILE    DS    8
  1295. RDISK    DS    3
  1296.     DB    '$'
  1297. TEMP    DS    RECSIZE
  1298. DISKBUF DS    128
  1299. COMPSIZE DS    1
  1300. RAM    EQU    $
  1301. BDOS    EQU    05H
  1302. CONIN    EQU    01H
  1303. CONOUT    EQU    02H
  1304.     END    100H
  1305. *)('&%$#"! 
  1306.