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 / MBUG / MBUG042.ARC / MCAT45.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  41KB  |  1,967 lines

  1.  
  2. ; MCAT v4.5 DISK CATALOG PROGRAM 08/29/84  -  (CP/M 3.0 COMPATIBLE)
  3. ;
  4. ;            COPYRIGHTED 1984 BY IRV HOFF
  5. ;
  6. ; This catalog program updates the 'MAST.CAT' file, which was previously
  7. ; started by the user with his editor.    A Companion program named 'XCAT'
  8. ; can then be used to make a cross-reference listing  which can generate
  9. ; a disk file called 'MAST.LST' or can print a paginated hard copy using
  10. ; either fanfold or roll paper. An additional file called 'FIND.COM' can
  11. ; be used on either 'MAST.LST' or 'MAST.CAT' programs to quickly  locate
  12. ; any file names.  Example:
  13. ;
  14. ;    A>FIND MAST.LST MCAT <ret>
  15. ;
  16. ; would find any/all files in 'MAST.LST' containing the letters:   MCAT.
  17. ; 'MAST.CAT' must have at least one 'IGNORE' file.  Each disk to be pro-
  18. ; cessed must have  an "ID number" different from any  other disk.  This
  19. ; number must go in the "file type" area.  Example:
  20. ;
  21. ;    A>SAVE 0 -.123 <ret>
  22. ;
  23. ;
  24. ;        NOTE: FOR CP/M 3.0 USERS - the SAVE command is not
  25. ;          used in the same way as in CP/M 2.2 and before.
  26. ;          You can not save a file with 0 bytes.  A spe-
  27. ;          cial program called NULL.ASM was written by
  28. ;          Guy Gamble that will allow easy naming of CP/M
  29. ;          3.0 disks.  This is a necessary utility for
  30. ;          using this program with CP/M 3.0.
  31. ;
  32. ;
  33. ; The '-' identifies this  as a special number    to the MCAT program.  A
  34. ; typical 'MAST.CAT' file might have  a few names  in the "IGNORE" list
  35. ; (those files which are plentiful enough you do not need to know their
  36. ; quantity or location).  Example:
  37. ;
  38. ;    (CONFIG.COM        (note opening left parenthesis)
  39. ;    LOAD.COM
  40. ;    PIP.COM
  41. ;    STAT.COM)        (note closing right parenthesis,
  42. ;                which must be followed with a RET)
  43. ;
  44. ; If all files are to be cataloged, this could be used:
  45. ;
  46. ;    ()            followed with a RET
  47. ;
  48. ;
  49. ; HOW TO USE:
  50. ; ----------
  51. ;
  52. ;    MCAT        for one drive systems, or cataloging the main disk
  53. ;            itself.
  54. ;
  55. ;    MCAT B:     main disk in A: with disks to be cataloged put in B:
  56. ;
  57. ;    MCAT B: A:  main disk in B: with disks to be cataloged put in A:
  58. ;
  59. ;                    - Notes by Irv Hoff W6FFC
  60. ;
  61. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  62. ;
  63. ; 08/29/84  Fixed NEXTS: so large disks with more than 256 names will
  64. ;   v4.5    be able to use the program consistently.  Restored program
  65. ;        to my original format.    - Irv Hoff
  66. ;
  67. ; 07/04/84  Added code to ignore CP/ 3.0 time and date stamping.
  68. ;   v4.4                    - Guy Gamble
  69. ;    
  70. ; 03/29/84  Restored to work with all computers, not just the Osborne
  71. ;   v4.3    Executive.  Other changes.    - Irv Hoff
  72. ;
  73. ; 03/19/84  Added CP/M 3.0 free disk space routine from MDM7.
  74. ;   v4.2                - Guy Gamble
  75. ;
  76. ; 01/21/84  Added suggestion by Bill Boulton for large directories.
  77. ;   v4.1                - Irv Hoff
  78. ;
  79. ; 11/20/83  Released to the public domain.
  80. ;   v4.0                - Irv Hoff
  81. ;
  82. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83. ;
  84. ;
  85.     ORG    0100H        ;normal program start
  86. ;
  87. ;
  88.     JMP    START        ;program start
  89. ;
  90. ;
  91. YES:    EQU    0FFH
  92. NO:    EQU    0
  93. ;
  94. ;
  95. FILERR:    SET    EXIT        ;exit if errors
  96. ;
  97. BELL:    EQU    07H        ;bell character
  98. CR:    EQU    0DH        ;carriage return character
  99. EOF:    EQU    1AH        ;end of file marker
  100. LF:    EQU    0AH        ;line feed character
  101. ;
  102. ;
  103. ;-----------------------------------------------------------------------
  104. ;
  105. ; SEE COMMENTS IN HELP MESSAGE AT END OF FILE
  106. ;
  107. ; USER MODIFIABLE EQUATES:
  108. ;
  109. ;-----------------------------------------------------------------------
  110. ;
  111. ; Clear screen - If set YES, set the CLS equate to the character your
  112. ; CRT uses.  (Many use CTL-Z)
  113. ;
  114. CLSCRN:    EQU    NO        ;yes = clear screen
  115. CLS    EQU    'Z'-40H        ;change to your 'clear screen' character
  116. ;                ;  if not CTL-Z
  117. ;
  118. ;-----------------------------------------------------------------------
  119. ;
  120. ; Space for the IGNORE buffer (for file names not to be cataloged.)  Few
  121. ; lists use more than 10-12 names.  Each name stores as 14 characters.
  122. ; Change the first number below if you need more than 36 file names.
  123. ;
  124. IGNSIZE:EQU    (36*14)+2    ;buffer size for ignored names
  125. ;
  126. ;-----------------------------------------------------------------------
  127. ;
  128. ; Some CP/M systems offer only 64 file names per disk.    Some offer up to
  129. ; 1024.  At 14/16 bytes per file name, this is the difference between
  130. ; 896 and 13,336 Bytes.  Few would wish to discard that much RAM unless
  131. ; required.  Most DD, DS 8" systems only offer 128 file names on both
  132. ; sides combined.  Change the following number for your system:
  133. ;
  134. NAMES:    DW    (256*NAMSIZE)    ;buffer size for directory names
  135. ;
  136. ;    NOTE:    If you DO change this to another value, you may
  137. ;        want to change the similar number in the "Help"
  138. ;        area, opposite label: NAMES$NUMBER:
  139. ;
  140. ;-----------------------------------------------------------------------
  141. ;
  142. ; Set USER to 'NO' if you want a normal display of each file.
  143. ; Set USER to 'YES' if you want to include the user area for each file.
  144. ;
  145. USER:    EQU    NO        ;NO=user areas not shown, YES=shown
  146. ;
  147. ;-----------------------------------------------------------------------
  148. ;
  149. ;
  150. ;***********************************************************************
  151. ;                                       ;
  152. ;                                       ;
  153. ;        ..... PROGRAM STARTS HERE .....                ;
  154. ;                                       ;
  155. ;                                       ;
  156. ;***********************************************************************
  157. ;
  158. ;
  159. START:    LXI    H,0
  160.     DAD    SP
  161.     SHLD    STACK
  162.     LXI    SP,STACK
  163.     CALL    ILPRT
  164. ;
  165.      IF    CLSCRN
  166.     DB    CLS
  167.      ENDIF            ;CLSCRN
  168. ;
  169.      IF    NOT CLSCRN
  170.     DB    CR,LF
  171.      ENDIF            ;NOT CLSCRN
  172. ;
  173. START1:    DB    'MCAT CATALOG PGM v4.5 - 08/29/84',0
  174.     CALL    ILPRT
  175. ;
  176.      IF    USER
  177.     DB    CR,LF,'(user areas included)'
  178.      ENDIF            ;USER
  179. ;
  180.     DB    CR,LF,'For help, reboot then type: MCAT ?',0
  181.     LDA    FCB+1
  182.     CPI    '?'        ;help wanted?
  183. ;
  184. P1:    JZ    HELP        ;jump if so
  185.     LXI    H,EXIT        ;disable 'HELP' code for subsequent runs
  186.     SHLD    P1+1        ;  as it will be ovewritten by buffers
  187. ;                ;  at end
  188. ;
  189. ; Finds amount of space available for buffers, divides into 2 equal
  190. ; parts for the in/out buffers
  191. ;
  192.     LXI    D,NABUF        ;start of name buffer
  193.     LHLD    NAMES        ;get length of buffer
  194.     DAD    D        ;start of main buffer
  195.     INX    H        ;one extra for isolation
  196.     SHLD    MASTINADR    ;main buffer start address
  197.     SHLD    MASTINPTR    ;main buffer start pointers
  198.     SHLD    NAMEND        ;names buffer stopping address
  199.     XCHG            ;buffer address to 'DE'
  200.     LDA    BDOS+2        ;get 'BDOS' entry point, even page
  201.     MOV    H,A        ;store in 'H'
  202.     XRA    A        ;nulls the 'A' reg.
  203. ;
  204. ;
  205. ; Calculate the difference to get free space
  206. ;
  207.     SUB    E
  208.     MOV    L,A
  209.     MOV    A,H
  210.     SBB    D
  211.     ANI    0F8H
  212.     MOV    H,A
  213. ;
  214. ;
  215. ; Now have the difference in 'HL' pair, so divide into 2 equal parts
  216. ;
  217.     XRA    A        ;clear carry if set
  218.     MOV    A,H
  219.     RAR
  220.     MOV    H,A
  221.     XRA    A
  222.     MOV    L,A        ;make buffers full 256-byte pages
  223. ;
  224. ;
  225. ; Now store the buffer length at appropriate places
  226. ;
  227.     SHLD    BUFFERSIZE
  228.     SHLD    MASTINLEN
  229.     SHLD    MASTOUTLEN
  230. ;
  231. ;
  232. ; Set up the output buffer address
  233. ;
  234.     DAD    D        ;add end of program to buffer length
  235.     SHLD    MASTOUTADR
  236.     SHLD    MASTOUTPTR
  237.     MVI    C,CPMVER    ;if ALLUSR enabled, see that we are
  238.     CALL    BDOS        ;  running under CP/M 2.x or later; if
  239.     MOV    A,H        ;  not, do an error exit
  240.     ORA    L
  241.     JZ    BADVERS
  242. ;
  243. ;
  244. ; All error checking done, start actual program code
  245. ;
  246. NEW1:    MVI    C,CURDSK    ;which disk is logged
  247.     CALL    BDOS        ;disk in reg 'A'
  248.     LXI    H,CDRIVE    ;assume the catalog to be on this drive
  249.     MOV    M,A
  250.     INX    H        ;point to MAST.CAT drive
  251.     MOV    M,A        ;assume to be on this drive, too
  252.     LDA    FCB+16        ;drive for MAST.CAT specified?
  253.     ORA    A
  254.     JZ    NEW2        ;nope, stick with logged drive
  255.     DCR    A        ;else make into drive select code
  256.     MOV    M,A        ;and stash for use later (in mdrive)
  257. ;
  258. NEW2:    LDA    FCB        ;drive for disk to be catalog specified?
  259.     ORA    A
  260.     JZ    NEW4        ;nope, stick with logged drive
  261.     DCR    A
  262.     STA    CDRIVE        ;ditto, above
  263. ;
  264. NEW4:    LDA    CDRIVE        ;re-get catalog drive
  265.     CMP    M        ;same as MAST.CAT drive
  266.     MVI    A,0        ;assume so
  267.     JZ    NEW6
  268.     DCR    A        ;else make non-zero
  269. ;
  270. NEW6:    STA    DRIVE
  271.     JNZ    NEW8        ;jump if multi-drive system
  272. ;
  273. ;
  274. ; Come here if instructed to use the same drive for catalog and MAST.CAT
  275. ;
  276.     LDA    MDRIVE
  277.     ADI    'A'        ;make drive code ASCII [A..P]
  278.     STA    DR1        ;hot-patch message texts
  279.     STA    CDR1
  280.     STA    MDR1
  281.     CALL    DISKA        ;tell them to leave a disk in drive A:
  282.     CALL    ILPRT        ;tell user about drive usage
  283.     DB    CR,LF,CR,LF
  284.     DB    'The DISK TO BE CATALOGED and the CATALOG SYSTEM DISK'
  285.     DB    CR,LF
  286.     DB    'will alternately be placed in Drive '
  287. ;
  288. DR1:    DB    'A:'        ;hot-patched at run-time
  289.     DB    CR,LF,0
  290.     JMP    AGAIN
  291. ;...
  292. ;
  293. ;
  294. DISKA:    LDA    CDRIVE        ;drive A: for catalog disk?
  295.     ORA    A
  296.     RZ            ;done if so
  297.     LDA    MDRIVE        ;drive A: for MAST.CAT?
  298.     ORA    A
  299.     RZ            ;done if so
  300.     CALL    ILPRT        ;else tell user
  301.     DB    CR,LF
  302.     DB    'A scratch disk must remain in Drive A:',0
  303.     RET
  304. ;.....
  305. ;
  306. ;
  307. ; Come here if the disk to be cataloged and MAST.CAT disk are on differ-
  308. ; ent drives
  309. ;
  310. NEW8:    LDA    CDRIVE        ;hot patch message texts with
  311.     ADI    'A'        ;drive to be cataloged...
  312.     STA    CDR1
  313.     LDA    MDRIVE        ;and MAST.CAT drive
  314.     ADI    'A'
  315.     STA    MDR1
  316.     CALL    DISKA        ;tell them to leave disk in drive A:?
  317.     CALL    ILPRT        ;tell user about drive usage
  318.     DB    CR,LF,0
  319. ;
  320. AGAIN:    LXI    SP,STACK    ;reset stack each time through
  321.     LXI    H,NABUF        ;set up file name buffer
  322.     SHLD    BUFPTR
  323.     SHLD    FREPTR        ;initialize 'PHANTOM FILE' pointer
  324.     LXI    H,0
  325.     SHLD    BLKSFRE        ;initialize blocks free
  326.     LXI    H,2020H        ;get 2 spaces
  327.     SHLD    COUNT        ;blank out entry counter
  328.     SHLD    COUNT+2        ;(needed for multiple passes)
  329.     MVI    A,')'        ;fix IGNORE table
  330.     STA    IGNORE
  331.     XRA    A        ;get a zero...
  332.     STA    MIEOFLG        ;fix end-of-file flags
  333.     STA    NAEOFLG
  334.     LXI    H,1        ;initialize file counter to one, to
  335.     SHLD    FCT        ;save 16-bit value
  336. ;
  337. CATMSG:    CALL    ILPRT
  338.     DB    CR,LF,'Mount DISK TO BE CATALOGED in Drive '
  339. ;
  340. CDR1:    DB    'B:'        ;hot-patched to show correct drive
  341.     DB    ' Ready? (Y/N): ',0
  342.     CALL    CRTIN        ;get a keyboard character.
  343.     CPI    'Y'        ;process disk if yes
  344.     JZ    CATMS1
  345.     CPI    CR        ;accept 'CR' as yes
  346.     JZ    CATMS1
  347.     CPI    ' '           ;accept 'SPACE' character as yes
  348.     JNZ    CATMSG        ;ask again if none of these
  349.     CALL    SHOW$Y
  350. ;
  351. CATMS1:    CALL    CRLF        ;acknowledge with a new line
  352. ;
  353. ;
  354. ; The following is necessary with double density systems to allow the
  355. ; system to log in a diskette with (possibly) changed disk character-
  356. ; istics (density, sector size, etc)
  357. ;
  358.     MVI    C,RESET
  359.     CALL    BDOS        ;(exit with drive A: selected)
  360. ;
  361. ;
  362. ; Select the disk to be cataloged as either the originally logged drive
  363. ; or the drive specified at runtime
  364. ;
  365.     LDA    CDRIVE
  366.     ORA    A        ;set flags
  367.     MOV    E,A
  368.     MVI    C,SELDSK
  369.     CNZ    BDOS        ;do not bother reselecting drive A:
  370. ;
  371. ;
  372. ; Now that the drive to be cataloged has been selected, get the address
  373. ; of the disk parameter block for that drive and the extent mask.
  374. ;
  375.     MVI    C,DPB
  376.     CALL    BDOS
  377.     SHLD    DPBADDR
  378.     LXI    D,4
  379.     DAD    D
  380.     MOV    A,M
  381.     STA    EXMASK
  382. ;
  383. ;
  384. ; Make FCB all '?'
  385. ;
  386.     LXI    D,AMB
  387.     LXI    H,FCB
  388.     MVI    B,13
  389.     CALL    MOVER
  390. ;
  391. ;
  392. ; Create a "phantom file" with free disk space
  393. ;
  394.     LXI    H,NABUF
  395.     CALL    AAAA
  396.     DB    '        .FRE'
  397. ;
  398. AAAA:    MVI    B,NAMSIZE-2
  399.     POP    D
  400.     CALL    MOVER
  401.     CALL    FRESPC        ;get free space on disk to new file
  402.     LXI    H,NABUF+NAMSIZE-2
  403.     MVI    M,CR        ;delimiters
  404.     INX    H
  405.     MVI    M,LF
  406.     INX    H
  407. ;
  408. ;
  409. ; Read the directory entries
  410. ;
  411.     MVI    C,SRCHF
  412.     JMP    CALLB
  413. ;
  414. LOOP:    MVI    C,SRCHN
  415. ;
  416. CALLB:    CALL    BUFLEN        ;see if names buffer is long enough
  417.     PUSH    H        ;save current buffer address
  418.     LXI    D,FCB
  419.     CALL    BDOS
  420.     POP    H        ;get current buffer address back
  421.     INR    A
  422.     JZ    NOMORE
  423. ;
  424. ;
  425. ; Move the name into the buffer
  426. ;
  427.     DCR    A        ;get back original value
  428.     ANI    3
  429.     PUSH    H
  430.     MOV    L,A
  431.     MVI    H,0
  432.     DAD    H        ;x32
  433.     DAD    H
  434.     DAD    H
  435.     DAD    H
  436.     DAD    H
  437.     LXI    D,TBUF
  438.     DAD    D
  439. ;
  440. ;
  441. ; 'HL' now points to entry (table entries will be 14/16 bytes each)
  442. ;
  443.     XCHG
  444.     LXI    H,12        ;if extent byte in directory entry is
  445.     DAD    D        ;  larger than the extent mask, the en-
  446.     LDA    EXMASK        ;  try we are looking at is not the
  447.     CMP    M        ;  'PRIMARY' directory entry for this
  448.     POP    H        ;  file, ignore.
  449.     JC    LOOP
  450.     LDAX    D        ;if the file has been erased do not move
  451.     CPI    0E5H        ;  it to the buffer (do not include it
  452.     JZ    LOOP        ;  in the catalog).
  453. ;
  454.      IF    USER
  455.     MOV    C,A        ;save the user number for this file
  456.      ENDIF            ;USER
  457. ;
  458.     INX    D        ;skip first byte
  459.     LDAX    D        ;  replace the '-' token used to mark
  460.     CPI    '-'        ;  the disk name file with a null.  This
  461.     JNZ    TOK        ;  is for internal use only, and pre-
  462.     XRA    A        ;  serves the correct sort-order.
  463.     STAX    D
  464. ;
  465. TOK:    MVI    B,8        ;number of characters in filename
  466.     CALL    MOVNC        ;move, filtering out commas & hi-order
  467.     MVI    M,'.'        ;   bits.
  468.     INX    H
  469.     MVI    B,3        ;do filetype, too
  470.     CALL    MOVNC
  471. ;
  472.      IF    USER
  473.     MVI    M,';'
  474.     INX    H
  475.     MOV    A,C        ;get user area number
  476.     ADI    90H
  477.     DAA
  478.     ACI    40H
  479.     DAA
  480.     MOV    M,A        ;set user number
  481.     INX    H
  482.      ENDIF            ;USER
  483. ;
  484.     MVI    M,CR        ;finish the end of line
  485.     INX    H
  486.     MVI    M,LF
  487.     INX    H
  488. ;
  489. ;
  490. ; Increment file count (16 bit)
  491. ;
  492.     PUSH    H
  493.     LHLD    FCT
  494.     INX    H
  495.     SHLD    FCT
  496.     POP    H
  497.     JMP    LOOP
  498. ;.....
  499. ;
  500. ;
  501. ; See if buffer is long enough for directory entries
  502. ;
  503. BUFLEN:    PUSH    H        ;save current address
  504.     XCHG            ;put present address into 'DE'
  505.     LHLD    NAMEND        ;get end address of buffer
  506.     DCX    H        ;protect next buffer
  507.     MOV    A,L
  508.     SUB    E
  509.     MOV    A,H
  510.     SBB    D
  511.     POP    H        ;get current address back
  512.     JC    BUFERR        ;if past buffer end, error
  513.     RET            ;get next directory name
  514. ;.....
  515. ;
  516. ;
  517. ; If not long enough, display an error message and exit
  518. ;
  519. BUFERR:    POP    H        ;reset stack "call buflen"
  520.     MVI    C,PRINT
  521.     LXI    D,BUFMSG    ;send error message
  522.     CALL    BDOS
  523.     JMP    EXIT
  524. ;.....
  525. ;
  526. ;
  527. ; Names buffer error message
  528. ;
  529. BUFMSG:    DB    CR,LF,'*** File names buffer not big '
  530.     DB    'enough.        MAKE LARGER ***',CR,LF
  531.     DB    '    (See MCAT.SET file for instructions.)'
  532.     DB    CR,LF,'$'
  533. ;.....
  534. ;
  535. ;
  536. ; No more entries
  537. ;
  538. NOMORE:    MVI    M,'Z'-40H    ;endflag names buffer
  539. ;
  540. NEXTS:    LHLD    FCT        ;get file count
  541.     DCX    H
  542.     SHLD    FCT
  543.     SHLD    TFCT        ;save count for this pass
  544.     MOV    A,H
  545.     ORA    L        ;done all yet?
  546.     JZ    DONE        ;jump if thru sorting
  547. ;
  548. ;
  549. ; Else pass thru the buff, sorting it.
  550. ;
  551.     LXI    D,NABUF
  552. ;
  553. COMPAR:    LXI    H,NAMSIZE
  554.     DAD    D
  555.     PUSH    D
  556.     PUSH    H
  557.     MVI    B,NAMSIZE    ;compare length
  558. ;
  559. CLCLP:    LDAX    D
  560.     CMP    M
  561.     JC    NEXTC
  562.     JNZ    DIFF
  563. ;
  564. SAME:    INX    D
  565.     INX    H
  566.     DCR    B
  567.     JNZ    CLCLP
  568. ;
  569. NEXTC:    POP    H
  570.     POP    D
  571.     XCHG
  572. ;
  573. NEXTC2:    LHLD    TFCT        ;done all for this pass yet
  574.     DCX    H
  575.     SHLD    TFCT
  576.     MOV    A,H
  577.     ORA    L
  578.     JNZ    COMPAR        ;check next 2 if not
  579. ;
  580. ;
  581. ; Completed pass thru buff, do next pass if needed
  582. ;
  583.     JMP    NEXTS
  584. ;.....
  585. ;
  586. ;
  587. ; Unequal compare
  588. ;
  589. DIFF:    POP    H
  590.     POP    D        ;get pointers
  591.     MVI    B,NAMSIZE
  592.     PUSH    B
  593. ;
  594. SWAP:    MOV    C,M
  595.     LDAX    D
  596.     MOV    M,A
  597.     MOV    A,C
  598.     STAX    D
  599.     INX    D
  600.     INX    H
  601.     DCR    B
  602.     JNZ    SWAP
  603.     POP    B
  604.     JMP    NEXTC2
  605. ;.....
  606. ;
  607. ;
  608. ; Sort all done - verify "flag" file present
  609. ;
  610. DONE:    LDA    NABUF
  611.     ORA    A
  612.     JZ    NAMEOK
  613.     CALL    ILPRT
  614.     DB    CR,LF,'++ MISSING "-.nnn" FILE ON DISK.',CR,LF
  615.     DB    '      (Put the volume number file on',CR,LF
  616.     DB    '      the disk, then run it again.)',CR,LF,0
  617.     JMP    AGAIN
  618. ;.....
  619. ;
  620. ;
  621. ; Get disk id number, display
  622. ;
  623. NAMEOK:    LXI    D,NABUF+1
  624.     LXI    H,IDNAME
  625.     MVI    B,11
  626.     CALL    MOVER
  627.     LXI    D,NABUF+1
  628.     LXI    H,COUNT1
  629.     MVI    B,11
  630.     CALL    MOVER
  631.     CALL    ILPRT        ;display disk ID number
  632.     DB    CR,LF,'                      Processing disk: ',0
  633.     CALL    ILPRTS
  634. ;
  635. IDNAME:    DB    '       .   ',CR,LF,0
  636. ;
  637.     LDA    DRIVE        ;two drives??
  638.     ORA    A
  639.     JNZ    OK1        ;yes, proceed
  640. ;
  641. NAME1:    CALL    ILPRT        ;else ask for system disk
  642.     DB    CR,LF,'Mount CATALOG SYSTEM DISK  in Drive '
  643. ;
  644. MDR1:    DB    'A: Ready? (Y/N): ',0  ;hot patched at runtime
  645.     CALL    CRTIN        ;get a keyboard character
  646.     CPI    CR        ;accept 'CR' as yes
  647.     JZ    MDR2
  648.     CPI    'Y'        ;if yes, update MAST.CAT
  649.     JZ    MDR2
  650.     CPI    ' '        ;accept 'SPACE' character as yes
  651.     JNZ    NAME1        ;otherwise, ask again
  652.     CALL    SHOW$Y        ;display a 'Y' for yes
  653. ;
  654. MDR2:    CALL    CRLF
  655. ;
  656. OK1:    MVI    C,RESET        ;reset disk, killing r/o status
  657.     CALL    BDOS        ;  (and reselecting drive A:)
  658.     LDA    MDRIVE        ;then select drive for MAST.CAT
  659.     ORA    A
  660.     MOV    E,A
  661.     MVI    C,SELDSK
  662.     CNZ    BDOS        ;do not bother reselecting if drive A:
  663. ;
  664. ;
  665. ; Now update mast.cat and set up the files
  666. ;
  667.     MVI    C,ERASE
  668.     LXI    D,FCBBAK    ;erase MAST.BAK to save disk space
  669.     CALL    BDOS
  670.     JMP    AAA
  671. ;.....
  672. ;
  673. ;
  674. FCBMASTIN: DB 0,'MAST    CAT'
  675. ;
  676.        DB    0
  677.        DS    20
  678. ;
  679. MASTINADR: DS 2            ;input buffer start address
  680. ;
  681. MASTINLEN: DS 2            ;input buffer length
  682. ;
  683. MASTINPTR: DS 2            ;input buffer pointer address
  684. ;
  685. AAA:       JMP    AAE
  686. ;.....
  687. ;
  688. ;
  689. GETMASTIN:
  690.     LHLD    MASTINLEN
  691.     XCHG
  692.     LHLD    MASTINPTR
  693.     MOV    A,L
  694.     SUB    E
  695.     MOV    A,H
  696.     SBB    D
  697.     JC    AADD
  698.     LXI    H,0
  699.     SHLD    MASTINPTR
  700. ;
  701. AAB:    XCHG
  702.     LHLD    MASTINLEN
  703.     MOV    A,E
  704.     SUB    L
  705.     MOV    A,D
  706.     SBB    H
  707.     JNC    AAD
  708.     LHLD    MASTINADR
  709.     DAD    D
  710.     XCHG
  711.     MVI    C,SETDMA
  712.     CALL    BDOS
  713.     LXI    D,FCBMASTIN
  714.     MVI    C,READ
  715.     CALL    BDOS
  716.     ORA    A
  717.     JNZ    AAC
  718.     LXI    D,TBUF
  719.     LHLD    MASTINPTR
  720.     DAD    D
  721.     SHLD    MASTINPTR
  722.     JMP    AAB
  723. ;.....
  724. ;
  725. ;
  726. AAC:    LHLD    MASTINPTR
  727.     SHLD    MASTINLEN
  728. ;
  729. AAD:    LXI    D,TBUF
  730.     MVI    C,SETDMA
  731.     CALL    BDOS
  732.     LXI    H,0000H
  733.     SHLD    MASTINPTR
  734. ;
  735. AADD:    XCHG
  736.     LHLD    MASTINADR
  737.     DAD    D
  738.     XCHG
  739.     LHLD    MASTINLEN
  740.     MOV    A,L
  741.     ORA    H
  742.     MVI    A,26
  743.     RZ
  744. ;
  745.     LDAX    D
  746.     LHLD    MASTINPTR
  747.     INX    H
  748.     SHLD    MASTINPTR
  749.     RET
  750. ;.....
  751. ;
  752. ;
  753. AAE:    XRA    A
  754.     STA    FCBMASTIN+12
  755.     STA    FCBMASTIN+32
  756.     LHLD    BUFFERSIZE
  757.     SHLD    MASTINLEN
  758.     SHLD    MASTINPTR
  759.     MVI    C,OPEN
  760.     LXI    D,FCBMASTIN
  761.     CALL    BDOS
  762.     INR    A
  763.     JNZ    AAG
  764.     MVI    C,PRINT
  765.     LXI    D,AAF
  766.     CALL    BDOS
  767.     JMP    FILERR
  768. ;
  769. AAF:    DB    CR,LF,'++ NO MAST.CAT FILE ++','$'
  770. ;
  771. AAG:    JMP    AAH
  772. ;
  773. ;
  774. FCBMASTOUT: DB 0,'NEW     CAT'
  775. ;
  776.     DB    0
  777.     DS    20
  778. ;.....
  779. ;
  780. ;
  781. BUFFERSIZE: DS    2        ;buffer input/output size
  782. ;
  783. MASTOUTADR: DS    2        ;output buffer start address
  784. ;
  785. MASTOUTLEN: DS    2        ;output buffer length
  786. ;
  787. MASTOUTPTR: DS    2        ;output buffer pointer address
  788. ;
  789. AAH:        JMP    AAMM
  790. ;.....
  791. ;
  792. ;
  793. PUTMASTOUT:
  794.     PUSH PSW
  795.     LHLD    MASTOUTLEN
  796.     XCHG
  797.     LHLD    MASTOUTPTR
  798.     MOV    A,L
  799.     SUB    E
  800.     MOV    A,H
  801.     SBB    D
  802.     JC    AAM
  803.     LXI    H,0000H
  804.     SHLD    MASTOUTPTR
  805. ;
  806. AAI:    XCHG
  807.     LHLD    MASTOUTLEN
  808.     MOV    A,E
  809.     SUB    L
  810.     MOV    A,D
  811.     SBB    H
  812.     JNC    AAL
  813.     LHLD    MASTOUTADR
  814.     DAD    D
  815.     XCHG
  816.     MVI    C,SETDMA
  817.     CALL    BDOS
  818.     LXI    D,FCBMASTOUT
  819.     MVI    C,21
  820.     CALL    BDOS
  821.     ORA    A
  822.     JNZ    AAJ
  823.     LXI    D,TBUF
  824.     LHLD    MASTOUTPTR
  825.     DAD    D
  826.     SHLD    MASTOUTPTR
  827.     JMP    AAI
  828. ;.....
  829. ;
  830. ;
  831. AAJ:    MVI    C,PRINT
  832.     LXI    D,AAK
  833.     CALL    BDOS
  834.     POP    PSW
  835.     JMP    FILERR
  836. ;.....
  837. ;
  838. ;
  839. AAK:    DB    CR,LF,'++ DISK FULL: MASTOUT ++','$'
  840. ;
  841. AAL:    LXI    D,TBUF
  842.     MVI    C,SETDMA
  843.     CALL    BDOS
  844.     LXI    H,0000H
  845.     SHLD    MASTOUTPTR
  846. ;
  847. AAM:    XCHG
  848.     LHLD    MASTOUTADR
  849.     DAD    D
  850.     XCHG
  851.     POP    PSW
  852.     STAX    D
  853.     LHLD    MASTOUTPTR
  854.     INX    H
  855.     SHLD    MASTOUTPTR
  856.     RET
  857. ;.....
  858. ;
  859. ;
  860. AAMM:    XRA    A
  861.     STA    FCBMASTOUT+12
  862.     STA    FCBMASTOUT+32
  863.     LHLD    BUFFERSIZE
  864.     SHLD    MASTOUTLEN
  865.     LXI    H,0000H
  866.     SHLD    MASTOUTPTR
  867.     MVI    C,ERASE
  868.     LXI    D,FCBMASTOUT
  869.     CALL    BDOS
  870.     MVI    C,MAKE
  871.     LXI    D,FCBMASTOUT
  872.     CALL    BDOS
  873.     INR    A
  874.     JNZ    AAP
  875.     MVI    C,PRINT
  876.     LXI    D,AAN
  877.     CALL    BDOS
  878.     JMP    FILERR
  879. ;.....
  880. ;
  881. ;
  882. AAN:    DB    CR,LF,'NO DIR SPACE: MASTOUT','$'
  883. AAP:    JMP    INITRD
  884. ;.....
  885. ;
  886. ;
  887. FCBBAK:    DB    0,'MAST    BAK'
  888.     DB    0
  889.     DS    20
  890. ;
  891. INITRD:    CALL    READNA        ;read disk name from buffer
  892.     LXI    D,NADAT+1
  893.     LXI    H,DKNAME
  894.     MVI    B,7
  895.     CALL    MOVER
  896.     LXI    D,NADAT+9
  897.     LXI    H,DKNAME+9
  898.     MVI    B,3
  899.     CALL    MOVER
  900. ;
  901. ;
  902. ; Read in the names to be ignored (i.e., not cataloged).  They are at
  903. ; the front of MAST.CAT.  They are simply a list of filename.filetype
  904. ; (cr/lf) with the first having a ( before it, and the last having a )
  905. ; after it.
  906. ;
  907.     CALL    GETMASTIN    ;get the leading '('
  908.     JZ    NOMAST        ;if EOF
  909.     CPI    '('
  910.     JNZ    NOIGN
  911.     CALL    PUTMASTOUT
  912.     LXI    H,IGNORE    ;point to buffer
  913.     LXI    B,IGNSIZE    ;for buffer overflow test
  914. ;
  915. IGNRD:    PUSH    B
  916.     PUSH    H
  917.     CALL    GETMASTIN
  918.     JZ    IGNEOF        ;unexpected EOF
  919.     PUSH    PSW        ;save character
  920.     CALL    PUTMASTOUT
  921.     POP    PSW
  922.     POP    H
  923.     POP    B
  924.     MOV    M,A
  925.     INX    H
  926.     CPI    ')'
  927.     JZ    IGNEND        ;table is loaded
  928.     DCX    B        ;more room in table?
  929.     MOV    A,B
  930.     ORA    C
  931.     JNZ    IGNRD
  932. ;
  933. ;
  934. ; Table overflow
  935. ;
  936.     CALL    EREXIT
  937.     DB    CR,LF,'++ TOO MANY IGNORE NAMES FOR TABLE ++','$'
  938. ;
  939. NOMAST:    CALL    EREXIT
  940.     DB    CR,LF,'++ MISSING OR EMPTY MAST.CAT ++','$'
  941. ;
  942. NOIGN:    CALL    EREXIT
  943.     DB    CR,LF,'++ NO IGNORE NAMES IN MAST.CAT ++','$'
  944. ;
  945. IGNEOF:    CALL    EREXIT
  946.     DB    CR,LF,'++ EOF READING FOR IGNORE NAMES.'
  947.     DB    CR,LF,'MAY BE MISSING ")" AFTER LAST NAME ++','$'
  948. ;
  949. ;
  950. ; Ignore names have been read into table ok
  951. ;
  952. IGNEND:    CALL    GETMASTIN
  953.     JZ    IGNEOF
  954.     PUSH    PSW
  955.     CALL    PUTMASTOUT
  956.     POP    PSW
  957.     CPI    LF
  958.     JNZ    IGNEND        ;delete CRLF
  959. ;
  960. ;
  961. ; Prime the buffers
  962. ;
  963. NAMELP:    CALL    READNA        ;read name into nadat
  964. MASTLP:    CALL    READMI        ;read master into midat
  965. ;
  966. ;
  967. ; If EOF on both files, we are all done
  968. ;
  969. COMPLP:    LDA    NAEOFLG        ;name file EOF?
  970.     ORA    A
  971.     JZ    NOTEOF        ;..no
  972.     LDA    MIEOFLG        ;master in EOF?
  973.     ORA    A
  974.     JNZ    ALLDONE        ;yes, that is it
  975. ;
  976. NOTEOF:    MVI    B,MASTSIZE
  977.     LXI    D,NADAT
  978.     LXI    H,MIDAT
  979.     CALL    COMPR
  980.     JZ    EQUAL
  981.     JC    WRITEN
  982. ;
  983. ;
  984. ; Master is lower - write it if for another disk
  985. ;
  986.     MVI    B,DKSIZE
  987.     LXI    D,MIDSK
  988.     LXI    H,DKNAME
  989.     CALL    COMPR
  990.     JZ    DELMI        ;deleting MIDAT
  991.     LXI    D,MIDAT
  992.     LXI    H,MODAT
  993.     MVI    B,MASTSIZE
  994.     CALL    MOVER
  995.     CALL    WRITEMO
  996.     JMP    MASTLP
  997. ;.....
  998. ;
  999. ;
  1000. ; Delete master in
  1001. ;
  1002. DELMI:    LXI    D,DELMSG
  1003.     LXI    H,MIDAT
  1004.     CALL    MESG
  1005.     JMP    MASTLP
  1006. ;.....
  1007. ;
  1008. ;
  1009. DELMSG:    DB    'DEL: ','$'
  1010. ;
  1011. ;
  1012. ; Name is lower - write it
  1013. ;
  1014. WRITEN:    LXI    D,NADAT
  1015.     LXI    H,MODAT
  1016.     MVI    B,MASTSIZE
  1017.     CALL    MOVER
  1018.     CALL    WRITEMO
  1019. ;
  1020. ;
  1021. ; Print that name was added
  1022. ;
  1023.     LXI    D,ADDMSG
  1024.     LXI    H,NADAT
  1025.     CALL    MESG
  1026.     CALL    READNA        ;read next name
  1027.     JMP    COMPLP
  1028. ;
  1029. ADDMSG:    DB    'ADD: ','$'
  1030. ;
  1031. ;
  1032. ; Both files equal
  1033. ;
  1034. EQUAL:    LXI    D,MIDAT
  1035.     LXI    H,MODAT
  1036.     MVI    B,MASTSIZE
  1037.     CALL    MOVER
  1038.     CALL    WRITEMO        ;write out master
  1039.     JMP    NAMELP        ;read both
  1040. ;.....
  1041. ;
  1042. ;
  1043. ; Read name file
  1044. ;
  1045. READNA:    LXI    H,NADAT
  1046.     MVI    B,8
  1047.     CALL    READNAC        ;read characters
  1048.     MVI    M,'.'
  1049.     INX    H
  1050.     MVI    B,3        ;type length
  1051.     CALL    READNAC
  1052.     MVI    M,','
  1053. ;
  1054.      IF    USER
  1055.     LXI    H,UDAT
  1056.     MVI    M,';'
  1057.     INX    H
  1058.     MVI    B,1
  1059.     CALL    READNAC
  1060.      ENDIF            ;USER
  1061.  
  1062. ;
  1063. ;
  1064. ; If this is a name not to be cataloged, read the next
  1065. ;
  1066.     LXI    D,IGNORE    ;get ignore table
  1067. ;
  1068. IGNLP:    LXI    H,NADAT
  1069.     MVI    B,DKSIZE    ;# of characters to match
  1070. ;
  1071. IGNCLP:    LDAX    D
  1072.     CMP    M
  1073.     JZ    IGNMAT        ;matched
  1074.     MOV    A,M        ;get character
  1075.     CPI    ' '           ;space?
  1076.     JZ    IGNMAT1
  1077. ;
  1078. ;
  1079. ; Get next entry
  1080. ;
  1081. IGNEXTE:LDAX    D
  1082.     INX    D
  1083.     CPI    ')'        ;end of table?
  1084.     RZ            ;..yes, return
  1085.     CPI    LF        ;next line?
  1086.     JNZ    IGNEXTE
  1087.     JMP    IGNLP
  1088. ;
  1089. ;
  1090. ; Character matched
  1091. ;
  1092. IGNMAT:    INX    D        ;skip match character
  1093. ;
  1094. IGNMAT1:INX    H
  1095.     DCR    B
  1096.     JNZ    IGNCLP        ;loop until done
  1097. ;
  1098. ;
  1099. ; Name is to be deleted
  1100. ;
  1101.     JMP    READNA        ;read next name
  1102. ;.....
  1103. ;
  1104. ;
  1105. ; All done - write EOF to output, ask if more to do
  1106. ;
  1107. ALLDONE:MVI    A,'Z'-40H    ;EOF character
  1108.     CALL    PUTMASTOUT
  1109. ;
  1110. BBBB:    LHLD    MASTOUTPTR
  1111.     MOV    A,L
  1112.     ANI    7FH
  1113.     JNZ    CCCC
  1114.     SHLD    MASTOUTLEN
  1115. ;
  1116. CCCC:    MVI    A,EOF
  1117.     PUSH    PSW
  1118.     CALL    PUTMASTOUT
  1119.     POP    PSW
  1120.     JNZ    BBBB
  1121.     MVI    C,CLOSE
  1122.     LXI    D,FCBMASTOUT
  1123.     CALL    BDOS
  1124.     INR    A
  1125.     JNZ    EEEE
  1126.     MVI    C,PRINT
  1127.     LXI    D,DDDD
  1128.     CALL    BDOS
  1129.     JMP    EEEE
  1130. DDDD:    DB    CR,LF,'CANNOT CLOSE MASTOUT','$'
  1131. ;
  1132. ;
  1133. ; Run was successful - set final file dispositions
  1134. ;
  1135. EEEE:    JMP    HHHH
  1136. ;
  1137. FFFF:    PUSH    H
  1138.     LXI    B,16
  1139.     DAD    B
  1140. ;
  1141. GGGG:    LDAX    D
  1142.     MOV    M,A
  1143.     INX    D
  1144.     INX    H
  1145.     DCR    C
  1146.     JNZ    GGGG
  1147.     POP    D
  1148.     MVI    C,RENAME
  1149.     CALL    BDOS
  1150.     RET
  1151. ;.....
  1152. ;
  1153. ;
  1154. HHHH:    LXI    H,FCBMASTIN
  1155.     LXI    D,FCBBAK
  1156.     CALL    FFFF
  1157.     LXI    H,FCBMASTOUT
  1158.     LXI    D,FCBMASTIN
  1159.     CALL    FFFF
  1160.     CALL    ILPRT
  1161.     DB    CR,LF,'MAST.CAT has '
  1162. ;
  1163. COUNT:    DB    '     entries,  with disk: ',0
  1164.     CALL    ILPRTS
  1165. ;
  1166. COUNT1:    DB    '       .   ',CR,LF,0
  1167. ;
  1168.     JMP    AGAIN        ;go do another (or quit)
  1169. ;.....
  1170. ;
  1171. ;
  1172. ; Read characters into name buffer
  1173. ;
  1174. READNAC:LDA    NAEOFLG        ;EOF on names?
  1175.     ORA    A
  1176.     JNZ    NAEOF        ;yes, pad with 0FFH
  1177.     PUSH    H
  1178.     PUSH    B
  1179. ;
  1180. GETNA:    CALL    GETNAM        ;get from buffer, not disk
  1181.     CPI    LF
  1182.     JZ    GETNA        ;ignore lf
  1183.     POP    B
  1184.     POP    H
  1185.     CPI    '.'        ;end?
  1186.     JZ    NAEND
  1187. ;
  1188.      IF    USER
  1189.     CPI    ';'
  1190.     JZ    NAEND
  1191.      ENDIF            ;USER
  1192. ;
  1193.     CPI    CR        ;end?
  1194.     JZ    NAEND
  1195.     CPI    'Z'-40H        ;EOF?
  1196.     JZ    NAEOF
  1197.     MOV    M,A
  1198.     INX    H
  1199.     DCR    B
  1200.     JNZ    READNAC
  1201.     PUSH    B
  1202.     PUSH    H
  1203.     CALL    GETNAM        ;kill delimiter character
  1204.     POP    H
  1205.     POP    B
  1206.     CPI    'Z'-40H        ;EOF?
  1207.     RNZ
  1208.     STA    NAEOFLG
  1209.     RET
  1210. ;.....
  1211. ;
  1212. ;
  1213. NAEND:    MVI    M,' '
  1214.     INX    H
  1215.     DCR    B
  1216.     JNZ    NAEND
  1217.     RET
  1218. ;.....
  1219. ;
  1220. ;
  1221. NAEOF:    MVI    M,0FFH
  1222.     INX    H
  1223.     DCR    B
  1224.     JNZ    NAEOF
  1225.     MVI    A,1
  1226.     STA    NAEOFLG
  1227.     RET
  1228. ;.....
  1229. ;
  1230. ;
  1231. ; Subroutine to simulate reading from the old NAMES.SUB  file.    Actually
  1232. ; the characters come from the names buffer provided by the first part
  1233. ; of the program
  1234. ;
  1235. GETNAM:    LHLD    BUFPTR        ;get pointer to NABUF
  1236.     MOV    A,M        ;get next character
  1237.     INX    H        ;bump the pointer
  1238.     SHLD    BUFPTR
  1239.     RET
  1240. ;.....
  1241. ;
  1242. ;
  1243. ; Read master-in name
  1244. ;
  1245. READMI:    LXI    H,MIDAT
  1246.     CALL    MINAME        ;get file name
  1247.     MVI    M,','        ;separator
  1248.     INX    H
  1249.     CALL    MINAME        ;get disk name
  1250. ;
  1251.      IF    USER
  1252.     MVI    A,' '
  1253.     STA    MIUSR+1
  1254.     LDA    MASDEL        ;delimiter
  1255.     CPI    ';'
  1256.     RNZ            ;no user areas
  1257.     CALL    GETMASTIN
  1258.     STA    MIUSR+1        ;save user number
  1259.     CALL    GETMASTIN
  1260.      ENDIF            ;USER
  1261. ;
  1262.     RET
  1263. ;.....
  1264. ;
  1265. ;
  1266. ; Read master-in, 1 field
  1267. ;
  1268. MINAME:    MVI    B,8
  1269.     CALL    READMIC        ;get characters
  1270.     MVI    M,'.'
  1271.     INX    H
  1272.     MVI    B,3
  1273.     CALL    READMIC        ;get type
  1274.     RET
  1275. ;.....
  1276. ;
  1277. ;
  1278. ; Read characters into master name
  1279. ;
  1280. READMIC:LDA    MIEOFLG
  1281.     ORA    A
  1282.     JNZ    MIEOF
  1283.     PUSH    H
  1284.     PUSH    B
  1285. ;
  1286. GETMI:    CALL    GETMASTIN
  1287.     CPI    LF        ;ignore LF
  1288.     JZ    GETMI
  1289.     POP    B
  1290.     POP    H
  1291.     CPI    ','
  1292.     JZ    MIEND
  1293.     CPI    '.'
  1294.     JZ    MIEND
  1295. ;
  1296.      IF    USER
  1297.     CPI    ';'
  1298.     JZ    MIEND
  1299.      ENDIF            ;USER
  1300. ;
  1301.     CPI    CR
  1302.     JZ    MIEND
  1303.     CPI    'Z'-40H        ;EOF?
  1304.     JZ    MIEOF
  1305.     MOV    M,A
  1306.     INX    H
  1307.     DCR    B
  1308.     JNZ    READMIC
  1309.     PUSH    B
  1310.     PUSH    H
  1311.     CALL    GETMASTIN    ;get delimiter
  1312. ;
  1313.      IF    USER
  1314.     STA    MASDEL        ;save delimiter
  1315.      ENDIF            ;USER
  1316. ;
  1317.     POP    H
  1318.     POP    B
  1319.     CPI    'Z'-40H        ;EOF?
  1320.     RNZ
  1321.     STA    MIEOFLG
  1322.     RET
  1323. ;.....
  1324. ;
  1325. ;
  1326. MIEND:    MVI    M,' '
  1327.     INX    H
  1328.     DCR    B
  1329.     JNZ    MIEND
  1330.     RET
  1331. ;.....
  1332. ;
  1333. ;
  1334. MIEOF:    MVI    M,0FFH
  1335.     INX    H
  1336.     DCR    B
  1337.     JNZ    MIEOF
  1338.     STA    MIEOFLG        ;show EOF
  1339.     RET
  1340. ;.....
  1341. ;
  1342. ;
  1343. ; Write an entry to master out - also bump count of entries written
  1344. ;
  1345. WRITEMO:MVI    B,3
  1346.     LXI    D,MODAT+9
  1347.     LXI    H,FTFRE
  1348.     CALL    COMPR
  1349.     JZ    BUMPD        ;if yes, do not count it
  1350.     LXI    H,COUNT+3
  1351. ;
  1352. BUMP:    MOV    A,M        ;get count digit
  1353.     CPI    ' '
  1354.     JNZ    BUMPNB
  1355.     MVI    A,'0'
  1356. ;
  1357. BUMPNB:    INR    A
  1358.     MOV    M,A
  1359.     CPI    '9'+1        ;time to carry?
  1360.     JNZ    BUMPD        ;no, done
  1361.     MVI    M,'0'
  1362.     DCX    H
  1363.     JMP    BUMP
  1364. ;.....
  1365. ;
  1366. ;
  1367. BUMPD:    LXI    H,MODAT
  1368.     MVI    B,MASTSIZE
  1369. ;
  1370. WRMOL:    MOV    A,M
  1371.     CPI    ' '           ;null character?
  1372.     JZ    WRSKIP
  1373.     PUSH    B
  1374.     PUSH    H
  1375.     CALL    PUTMASTOUT
  1376.     POP    H
  1377.     POP    B
  1378. ;
  1379. WRSKIP:    INX    H        ;point to next character
  1380.     DCR    B
  1381.     JNZ    WRMOL        ;loop until done
  1382.     MVI    A,CR
  1383.     CALL    PUTMASTOUT
  1384.     MVI    A,LF
  1385.     CALL    PUTMASTOUT
  1386.     RET
  1387. ;.....
  1388. ;
  1389. ;
  1390. ; Print message in 'DE', then name in 'HL'
  1391. ;
  1392. MESG:    PUSH    H
  1393.     MVI    C,PRINT
  1394.     CALL    BDOS
  1395.     POP    H
  1396.     MVI    B,12        ;name,'.',type
  1397. ;
  1398. MESGL:    PUSH    H
  1399.     PUSH    B
  1400.     MOV    A,M        ;get character
  1401.     CPI    ' '
  1402.     CNZ    CRTOUT        ;display the character
  1403. ;
  1404. MESGS:    POP    B
  1405.     POP    H
  1406.     INX    H
  1407.     DCR    B
  1408.     JNZ    MESGL
  1409.     MVI    A,CR        ;'CR' char.
  1410.     CALL    CRTOUT        ;display the character
  1411.     MVI    A,LF        ;'LF' char.
  1412.     CALL    CRTOUT        ;display the character
  1413.     RET
  1414. ;.....
  1415. ;
  1416. ;
  1417. ; Move subroutine (DE)=>(HL), length in (B)
  1418. ;
  1419. MOVER:    LDAX    D
  1420.     ANI    7FH        ;strip
  1421.     MOV    M,A
  1422.     INX    D
  1423.     INX    H
  1424.     DCR    B
  1425.     JNZ    MOVER
  1426.     RET
  1427. ;.....
  1428. ;
  1429. ;
  1430. ; MOVNC subroutine (DE)=>(HL), length in (B).  This version strips the
  1431. ; hi-order bit, if set.  It also filters out commas which  might other-
  1432. ; wise mess up the database.
  1433. ;
  1434. MOVNC:    LDAX    D
  1435.     ANI    7FH        ;strip the hi-order bit
  1436.     CPI    ','        ;is it a comma?
  1437.     JNZ    MN1        ;jump if not
  1438.     MVI    A,'/'        ;else change to slash
  1439. ;
  1440. MN1:    MOV    M,A
  1441.     INX    D
  1442.     INX    H
  1443.     DCR    B
  1444.     JNZ    MOVNC
  1445.     RET
  1446. ;.....
  1447. ;
  1448. ;
  1449. ; Compare routine (DE)<=>(HL), length in (B)
  1450. ;
  1451. COMPR:    LDAX    D
  1452.     CMP    M
  1453.     RNZ            ;ret with non zero set
  1454.     INX    D
  1455.     INX    H
  1456.     DCR    B
  1457.     JNZ    COMPR
  1458.     RET            ;zero set, shows =
  1459. ;.....
  1460. ;
  1461. ;
  1462. ; Get free disk space; plug it into the phantom file.  Since number of
  1463. ; blocks on disk is DSM+1, get DSM.
  1464. ;
  1465. FRESPC:    CALL    CKCPM3        ;go calculate free space if CP/M 3.0
  1466.     LHLD    DPBADDR        ;retrieve adr. of disk parameter block
  1467.     LXI    D,5        ;dsm is at DPB+5
  1468.     DAD    D
  1469.     MOV    E,M        ;low byte of DSM
  1470.     INX    H
  1471.     MOV    D,M        ;high byte of DSM
  1472.     XCHG            ;'HL'=DSM
  1473.     INX    H        ;block=DSM+1
  1474.     SHLD    TBTR        ;save total bits to read
  1475. ;
  1476. ;
  1477. ; Get code for bytes per block, where 1=1024, 2=2048, 3=4096, etc.
  1478. ;
  1479.     LHLD    DPBADDR        ;recover DPB address
  1480.     INX    H        ;bsh is at DPB+2
  1481.     INX    H
  1482.     MOV    A,M        ;BSH is 3-7,
  1483.     SUI    2        ;make it 1-5
  1484.     CPI    5+1        ;check for over 5
  1485.     JNC    NONSTAN        ;if so, it is non-standard
  1486.     CPI    1        ;check for under 1
  1487.     JC    NONSTAN        ;if so, it is non-standard
  1488.     STA    BLKSIZE        ;save the block size
  1489. ;
  1490. ;
  1491. ; Find allocation vector and count the bits reset.
  1492. ;
  1493.     LHLD    TBTR
  1494.     XCHG            ;'DE'=total of all vector bits to read
  1495.     MVI    C,ALLVEC    ;tell 'BDOS' to get address of
  1496.     CALL    BDOS        ;  the allocation vector in 'HL'
  1497. ;
  1498. NXTBYT:    MOV    A,M        ;get a byte of allocation vector
  1499.     MVI    C,8        ;it has eight bits, right?
  1500. ;
  1501. ROTAT:    RLC            ;move a bit to carry
  1502.     CNC    COUNTIT        ;not set?  it'S A FREE BLOCK
  1503.     DCX    D        ;count the bit just checked
  1504.     PUSH    PSW        ;save the bit pattern
  1505.     MOV    A,D        ;have we done the whole
  1506.     ORA    E        ;  allocation vector?
  1507.     JZ    KFREE        ;finished here, if so
  1508.     POP    PSW        ;restore the bit pattern
  1509.     DCR    C        ;count a bit done
  1510.     JNZ    ROTAT        ;more bits this byte?  do another
  1511.     INX    H        ;done with byte?  bump pointer,
  1512.     JMP    NXTBYT        ;  and get the next byte
  1513. ;
  1514. COUNTIT:PUSH    H        ;save the allocation vector pointer
  1515.     LHLD    BLKSFRE        ;increment the 'BLOCKS FREE' count
  1516.     INX    H
  1517.     SHLD    BLKSFRE
  1518.     POP    H        ;restore the pointer
  1519.     RET
  1520. ;.....
  1521. ;
  1522. ;
  1523. ; Free space on disk is block size times number of free blocks.
  1524. ;
  1525. KFREE:    POP    PSW        ;clean the stack
  1526.     LDA    BLKSIZE        ;get block size
  1527.     LHLD    BLKSFRE        ;get free blocks
  1528. ;
  1529. MULT:    DCR    A        ;free space=free blocks
  1530.     JZ    CONDEC        ;  times block size
  1531.     DAD    H
  1532.     JMP    MULT
  1533. ;.....
  1534. ;
  1535. ;
  1536. ; Calculate free disk space if CP/M 3.0
  1537. ;
  1538. CKCPM3:    MVI    C,CPMVER    ;check version #
  1539.     CALL    BDOS
  1540.     MOV    A,L
  1541.     CPI    30H        ;version 3.0?
  1542.     RC            ;use normal method if not CP/M 3.0
  1543.     POP    H        ;remove 'CALL  CKCPM3' from stack
  1544.     MVI    C,CURDSK
  1545.     CALL    BDOS
  1546.     MOV    E,A
  1547.     MVI    C,46        ;CP/M 3.0 compute free space call
  1548.     CALL    BDOS
  1549.     MVI    C,3        ;answer is 3 bytes long (24 bits)
  1550. ;
  1551. FREE30:    LXI    H,TBUF+2    ;answer is locted here
  1552.     MVI    B,3        ;convert to 'K' length
  1553.     ORA    A
  1554. ;
  1555. FREE31:    MOV    A,M
  1556.     RAR
  1557.     MOV    M,A
  1558.     DCX    H
  1559.     DCR    B
  1560.     JNZ    FREE31        ;loop for 3 bytes
  1561.     DCR    C
  1562.     JNZ    FREE30        ;shift 3 times
  1563.     LHLD    TBUF        ;get result in 'K'
  1564.     JMP    CONDEC        ;display result
  1565. ;....
  1566. ;
  1567. ;
  1568. NONSTAN:CALL    EREXIT
  1569.     DB    CR,LF,'++ CAN''T READ FREE DISK SPACE ++','$'
  1570. ;.....
  1571. ;
  1572. ;
  1573. ; Arrive here with 'HL' = free disk space.  Convert to decimal and store.
  1574. ;
  1575. CONDEC:    MVI    B,0        ;leading zero flag
  1576.     LXI    D,-10000
  1577.     CALL    CONDEC1
  1578.     LXI    D,-1000
  1579.     CALL    CONDEC1
  1580.     LXI    D,-100
  1581.     CALL    CONDEC1
  1582.     LXI    D,-10
  1583.     CALL    CONDEC1
  1584.     MOV    A,L
  1585.     ADI    '0'
  1586.     CALL    CONDEC4        ;print it
  1587.     MVI    A,'k'
  1588.     JMP    CONDEC4        ;print it, finished
  1589. ;...
  1590. ;
  1591. ;
  1592. ; Subtract until negative
  1593. ;
  1594. CONDEC1:MVI    C,'0'-1        ;count in ASCII
  1595. ;
  1596. CONDEC2:INR    C
  1597.     DAD    D
  1598.     JC    CONDEC2
  1599. ;
  1600. ;
  1601. ; Too many, add one back.
  1602. ;
  1603.     MOV    A,D        ;get two's complement
  1604.     CMA            ;  of two's complement
  1605.     MOV    D,A        ;  to get value to
  1606.     MOV    A,E        ;  add back
  1607.     CMA
  1608.     MOV    E,A
  1609.     INX    D
  1610.     DAD    D
  1611. ;
  1612. ;
  1613. ; Arrive here with decimal digit in 'C'
  1614. ;
  1615.     MOV    A,C        ;get count in 'A'
  1616.     CPI    '1'        ;zero?
  1617.     JNC    CONDEC3        ;no
  1618.     MOV    A,B        ;yes, is it a leading zero?
  1619.     ORA    A
  1620.     MOV    A,C        ;get digit to 'A'
  1621.     JNZ    CONDEC4        ;not leading zero, store it
  1622.     MVI    A,'+'        ;convert leading zero
  1623.     JMP    CONDEC4
  1624. ;
  1625. CONDEC3:DCR    B        ;set no leading zero flag
  1626. ;
  1627. CONDEC4:PUSH    H        ;save value
  1628.     LHLD    FREPTR        ;point to current 'NABUF' slot
  1629.     MOV    M,A        ;store the digit
  1630.     INX    H        ;bump the pointer
  1631.     SHLD    FREPTR        ;save it
  1632.     POP    H        ;recover value
  1633.     RET
  1634. ;.....
  1635. ;
  1636. ;
  1637. ; Show an error if CP/M ver 3.0
  1638. ;
  1639. CPM3:    CALL    ILPRT
  1640.     DB    CR,LF,CR,LF,'*** CP/M 3.0 NOT SUPPORTED ***',CR,LF,0
  1641.     JMP    EXIT1
  1642. ;.....
  1643. ;
  1644. ;
  1645. CRLF:    CALL    ILPRT        ;carriage ret - line feed
  1646.     DB    CR,LF,0
  1647.     RET
  1648. ;.....
  1649. ;
  1650. ;
  1651. ; Gets a character from the keyboard
  1652. ;
  1653. CRTIN:    MVI    C,RDCON
  1654.     CALL    BDOS
  1655.     ANI    07FH        ;strip off any parity
  1656.     CPI    ' '           ;space character?
  1657.     RZ            ;return, if yes
  1658.     CPI    'C'-40H        ;CTL-c?
  1659.     JZ    EXIT        ;if yes, abort
  1660.     CPI    'X'-40H        ;CTL-x?
  1661.     JZ    EXIT        ;abort, if yes
  1662.     CPI    ' '           ;some other control character?
  1663.     RC            ;return if yes
  1664.     ANI    5FH        ;change to upper case, if lower
  1665.     CPI    'N'        ;'N' for 'NO'
  1666.     JZ    EXIT
  1667.     RET
  1668. ;.....
  1669. ;
  1670. ;
  1671. ; Displays one character on the CRT
  1672. ;
  1673. CRTOUT:    PUSH    PSW        ;save the character
  1674.     MVI    C,WRCON
  1675.     MOV    E,A        ;get the character into 'E' reg.
  1676.     CALL    BDOS        ;show the character on the crt
  1677.     POP    PSW        ;get the character back
  1678.     RET
  1679. ;.....
  1680. ;
  1681. ;
  1682. ; Exit with error message
  1683. ;
  1684. EREXIT:    POP    D        ;get message address
  1685.     MVI    C,PRINT
  1686.     CALL    BDOS
  1687. ;
  1688. EXIT:    CALL    CRLF
  1689.     CALL    CRLF
  1690.     JMP    0000H        ;to CP/M return address
  1691. ;.....
  1692. ;
  1693. ;
  1694. ; Inline print subroutine
  1695. ;
  1696. ILPRT:    XTHL            ;get starting address of string to 'HL'
  1697. ;
  1698. ILPLP:    MOV    A,M
  1699.     PUSH    H
  1700.     CALL    CRTOUT        ;show the character on the CRT
  1701.     POP    H
  1702.     INX    H
  1703.     MOV    A,M
  1704.     ORA    A
  1705.     JNZ    ILPLP
  1706.     INX    H
  1707.     XTHL            ;return address to top of stack
  1708.     RET
  1709. ;.....
  1710. ;
  1711. ;
  1712. ; Inline print subroutine, does not show spaces
  1713. ;
  1714. ILPRTS:    XTHL            ;get starting address of string to 'HL'
  1715. ;
  1716. ILPLPS:    MOV    A,M
  1717.     CPI    ' '           ;ignore spaces
  1718.     JZ    ILPLPT
  1719.     PUSH    H
  1720.     CALL    CRTOUT        ;display the character
  1721.     POP    H
  1722. ;
  1723. ILPLPT:    INX    H
  1724.     MOV    A,M
  1725.     ORA    A
  1726.     JNZ    ILPLPS
  1727.     INX    H
  1728.     XTHL            ;return addr to top of stack
  1729.     RET
  1730. ;.....
  1731. ;
  1732. ;
  1733. ; If using space bar for 'YES', show a 'Y'
  1734. ;
  1735. SHOW$Y:    MVI    A,'H'-40H    ;display a backspace
  1736.     CALL    CRTOUT        ;display on the crt
  1737.     MVI    A,'Y'        ;display a 'Y' on the crt
  1738.     JMP    CRTOUT
  1739. ;.....
  1740. ;
  1741. ;
  1742.     DS    80        ;stack space (40 levels)
  1743. ;
  1744. STACK:    DB    0,0
  1745. ;.....
  1746. ;
  1747. ;
  1748. AMB:    DB    '????????????',0  ;to return all directory entries,
  1749. NADAT:    DB    'XXXXXXXX.YYY,'
  1750. DKNAME:    DB    '        .   '
  1751. DKSIZE:    EQU    $-DKNAME    ;size of disk name
  1752. ;
  1753.      IF    USER
  1754. UDAT:    DB    '  '        ;user number
  1755.      ENDIF            ;USER
  1756. ;
  1757. NAMSIZE:EQU    $-NADAT-DKSIZE+1
  1758. ;
  1759. MIDAT:    DB    'XXXXXXXX.YYY,'
  1760. MIDSK:    DB    'XXXXXXXX.YYY'
  1761. ;
  1762.      IF    USER
  1763. MIUSR:    DB    ';z'        ;user number
  1764.      ENDIF            ;USER
  1765. ;
  1766. MODAT:    DB    'XXXXXXXX.YYY,XXXXXXXX.YYY'
  1767. ;
  1768.      IF    USER
  1769.     DB    ';z'        ;user number
  1770.      ENDIF            ;USER
  1771. ;
  1772. MASTSIZE: EQU    $-MODAT        ;size of masterfile record
  1773. ;
  1774. FTFRE:    DB    'FRE'        ;phantom file type
  1775.     RET
  1776. ;.....
  1777. ;
  1778. ;
  1779. ; Help code and text is overlaid by ignore table in a normal run
  1780. ;
  1781. HELP:    CALL    ILPRT                    ;frame 1
  1782.     DB    CR,LF,CR,LF
  1783.     DB    'CATALOGING YOUR DISK SYSTEM:',CR,LF,CR,LF
  1784.     DB    '     Three programs are needed.  They are usually all '
  1785.     DB    'on the same disk:',CR,LF,CR,LF
  1786.     DB    '         1)  MAST.CAT',CR,LF
  1787.     DB    '         2)  MCAT.COM',CR,LF
  1788.     DB    '         3)  XCAT.COM',CR,LF,CR,LF
  1789.     DB    '             MCAT.DOC   (not required but '
  1790.     DB    'usually included)',CR,LF
  1791.     DB    '             MCAT.SET   (for setting file names '
  1792.     DB    'buffer)',CR,LF,CR,LF
  1793.     DB    'You originate MAST.CAT (Master Catalog) yourself.  '
  1794.     DB    'Use your editor to',CR,LF,'open a file by that name.  '
  1795.     DB    'It must have at least ONE file name which',CR,LF
  1796.     DB    'will be in parenthesis.  This is the "Ignore list".  '
  1797.     DB    'It contains names',CR,LF,'of files which you do not '
  1798.     DB    'particularly want to display in the catalog',CR,LF
  1799.     DB    'listing since you have numerous copies of them.  It '
  1800.     DB    'might include such',CR,LF,'files as:  ASM, ED, DDT, '
  1801.     DB    'LOAD, PIP, STAT, SUBMIT, XSUB, etc.  Example:'
  1802.     DB    CR,LF,CR,LF,'        (ASM.COM         Note opening '
  1803.     DB    'parenthesis at left',CR,LF,'        ED.COM',CR,LF
  1804.     DB    '        SUBMIT,COM)      Note closing parenthesis at '
  1805.     DB    'right',CR,LF,CR,LF,'[more] ',0
  1806. ;                            ;end of frame 1
  1807.     CALL    CRTIN
  1808.     CALL    ILPRT
  1809.     DB    CR,'       ',CR,LF
  1810.     DB    '     If you want all files to show, use one name that '
  1811.     DB    'is unlikely to ',CR,LF,'ever appear such as:  (DUMMY.'
  1812.     DB    'ABC) or just use:  () <ret>',CR,LF,CR,LF,'     All '
  1813.     DB    'disks to be catalogued need a special "volume number" '
  1814.     DB    'file.',CR,LF,'This uses a "-" as the first character '
  1815.     DB    'in the file so the MCAT program',CR,LF,'can recognize '
  1816.     DB    'this special file name.  It can include both a name '
  1817.     DB    'and',CR,LF,'a number for the user''s reference, but '
  1818.     DB    'the name will be ignored.  A',CR,LF,'leading zero may '
  1819.     DB    'be used.  Example:',CR,LF,CR,LF,'       A>SAVE 0 B:-'
  1820.     DB    '.012',CR,LF,CR,LF,'     MCAT.COM is used next.  It '
  1821.     DB    'usually expects the master catalog disk',CR,LF,'to be '
  1822.     DB    'placed in the A: drive and the disks to be cataloged '
  1823.     DB    'into the B:',CR,LF,'drive one at a time.  It reads the'
  1824.     DB    ' disk directory and puts each file',CR,LF,'name into '
  1825.     DB    'memory and then alphabetizes the list.  It then up'
  1826.     DB    'dates the',CR,LF,'MAST.CAT file with the new names or '
  1827.     DB    'deletes those previously listed that',CR,LF,'are no '
  1828.     DB    'longer on that disk.',CR,LF,CR,LF,'     Double drive '
  1829.     DB    'users type MCAT B:  Thereafter when it asks if ready,'
  1830.     DB    CR,LF,'place the next disk to be cataloged into drive '
  1831.     DB    'B: and type "Y" or "RET"',CR,LF,'or "SPACE" for Yes.'
  1832.     DB    CR,LF,CR,LF,'[more] ',0
  1833. ;                            ;end of frame 2
  1834.     CALL    CRTIN
  1835.     CALL    ILPRT
  1836.     DB    CR,'       ',CR,LF
  1837.     DB    '     This does not allow the A: drive to be cataloged.'
  1838.     DB    '  Use the same',CR,LF,'procedure as for a single drive'
  1839.     DB    ' system:',CR,LF,CR,LF,'     Single drive users type '
  1840.     DB    'MCAT or MCAT A:  You will alternately be',CR,LF,'asked'
  1841.     DB    ' to insert the disk to be cataloged and then the '
  1842.     DB    'system catalog',CR,LF,'disk.  An update of MAST.CAT '
  1843.     DB    'is made with each new disk.',CR,LF,CR,LF,'     When '
  1844.     DB    'finished updating, use the XCAT.COM program.  This '
  1845.     DB    'creates a',CR,LF,'new file automatically, called '
  1846.     DB    'MAST.LST (Master List) which is ready to',CR,LF
  1847.     DB    'print. You can also search through this listing '
  1848.     DB    'rapidly for any file',CR,LF,'you know (or suspect) '
  1849.     DB    'you have, using a program called FIND.COM.  You'
  1850.     DB    CR,LF,'can also use XCAT.COM to print the MAST.CAT '
  1851.     DB    'file.',CR,LF,CR,LF,'     At present the program '
  1852.     DB    'allows 36 ''IGNORE'' file names in MAST.CAT',CR,LF
  1853.     DB    'and '
  1854. ;
  1855. NAMES$NUMBER:
  1856.     DB    '256'
  1857. ;
  1858.     DB    ' file names.  Either may be easily changed by editing '
  1859.     DB    'the user',CR,LF,'option area in the source code, then '
  1860.     DB    'reassembling.  (Or use MCAT.SET.)',CR,LF,CR,LF,'      '
  1861.     DB    '  MCAT C: B:     C: drive for disks to be cataloged'
  1862.     DB    CR,LF,'                       B: drive for the MAST.CAT'
  1863.     DB    ', MCAT.COM system disk',CR,LF,CR,LF,'(For 3 or more '
  1864.     DB    'drives.)  Read the MCAT.DOC file for more information.'
  1865.     DB    CR,LF,CR,LF,'[more] ',0
  1866. ;                            ;end of frame 3
  1867.     CALL    CRTIN
  1868.     CALL    ILPRT
  1869.     DB    CR,'       ',CR,LF
  1870.     DB    'NOTE FOR CP/M 3.0 USERS:',CR,LF,CR,LF,'     CP/M 3.0 '
  1871.     DB    'does not have the same SAVE 0 FILENAME.EXT function '
  1872.     DB    'that',CR,LF,'CP/M 2.2 and earlier versions have.  If '
  1873.     DB    'you want to write an unique ID',CR,LF,'number to disk,'
  1874.     DB    ' you will need the program called NULL.COM, as the '
  1875.     DB    'CP/M',CR,LF,'3.0 ''SAVE'' command does something '
  1876.     DB    'totally different.  There is no easy',CR,LF,'way to '
  1877.     DB    'write a directory entry like  -.123  that does not use'
  1878.     DB    ' at least',CR,LF,'1024 bytes of disk space.'
  1879.     DB    CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,0
  1880. ;.....                            ;end of frame 4
  1881. ;
  1882. ;
  1883. EXIT1:    XRA    A        ;clear the 'A' reg. and all flags
  1884.     LHLD    STACK        ;get the original stack pointer back
  1885.     SPHL            ;set the stack pointer to that address
  1886.     RET            ;return to original CCP location
  1887. ;.....
  1888. ;
  1889. ;
  1890. ; Error message text if attempting to catalog all user areas while
  1891. ; running under a pre 2.0 cp/m release.
  1892. ;
  1893. BADVERS:CALL    EREXIT
  1894.     DB    BELL,CR,LF
  1895.     DB    '++ FATAL ERROR - No user areas in this CP/M verion ++'
  1896.     DB    CR,LF,CR,LF,'$'
  1897. ;.....
  1898. ;
  1899. ;
  1900.     ORG    HELP
  1901. ;
  1902. ;
  1903. ; Ignore file-name table overlays help code, since only one or the other
  1904. ; would be used in any run.
  1905. ;
  1906. IGNORE:     DS    1        ;dummy end of table mark stored here
  1907.      DS    IGNSIZE        ;ignore table
  1908. ;
  1909. CDRIVE:     DS    1        ;drive for disk to be cataloged
  1910. MDRIVE:     DS    1        ;drive for MAST.CAT must follow CDRIVE
  1911. DRIVE:     DS    1        ;flag for both drives the same
  1912. ;
  1913. FCT:     DS    2        ;file count
  1914. TFCT:     DS    2        ;file count for this sort pass
  1915. BUFPTR:     DS    2        ;name buffer pointer
  1916. NAEOFLG: DS    1        ;name buffer EOF flag
  1917. NAMEND:     DS    2        ;name buffer end address
  1918. MIEOFLG: DS    1        ;master in EOF flag
  1919.  
  1920.       IF    USER
  1921. MASDEL:     DS    1        ;master name file delimited character
  1922.       ENDIF            ;USER
  1923. ;
  1924. BLKSIZE: DS    1        ;block size code
  1925. BLKSFRE: DS    2        ;free blocks
  1926. DPBADDR: DS    2        ;disk parameter block address
  1927. EXMASK:     DS    1        ;extent mask
  1928. TBTR:     DS    2        ;total bits to read in allocation vector
  1929. FREPTR:     DS    2        ;phantom file pointer
  1930. ;
  1931. ;
  1932. ; BDOS/CBIOS equates
  1933. ;
  1934. RDCON:    EQU    1        ;read character from console keybord
  1935. WRCON:    EQU    2        ;show character on console
  1936. PRINT:    EQU    9        ;print string, ends with '$'
  1937. CPMVER:    EQU    12        ;CP/M version number
  1938. RESET:    EQU    13        ;reset disk system
  1939. SELDSK:    EQU    14        ;select disk
  1940. OPEN:    EQU    15        ;open file
  1941. CLOSE:    EQU    16        ;close file
  1942. SRCHF:    EQU    17        ;search for first
  1943. SRCHN:    EQU    18        ;search for next
  1944. ERASE:    EQU    19        ;delete file
  1945. READ:    EQU    20        ;read sequential
  1946. WRITE:    EQU    21        ;write sequential
  1947. MAKE:    EQU    22        ;make file
  1948. RENAME:    EQU    23        ;rename file
  1949. CURDSK:    EQU    25        ;query current logged disk
  1950. SETDMA:    EQU    26        ;set DMA address
  1951. ALLVEC:    EQU    27        ;get disk drive allocation vector
  1952. DPB:    EQU    31        ;get disk parameter block address
  1953. BDOS:    EQU    0005H        ;location of BDOS jump vector
  1954. FCB:    EQU    005CH        ;location of file control block
  1955. TBUF:    EQU    0080H        ;location of CP/M buffer
  1956. ;.....
  1957. ;
  1958. ;
  1959. ; Disk directory entries stored here (see user setable options)
  1960. ;
  1961. NABUF:    DS    0
  1962. ;.....
  1963. ;
  1964. ;
  1965. ;
  1966.     END    START
  1967.