home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol060 / d-24.asm < prev    next >
Assembly Source File  |  1984-04-29  |  17KB  |  885 lines

  1. ;              D.ASM ver 2.4
  2. ;        RESTRICTED DIRECTORY LIST PROGRAM
  3. ;            (revised 03/01/81)
  4. ;
  5. ;D.COM is a directory list program, which writes
  6. ;5 entries on a line, separated by colons.
  7. ;
  8. ;The command contains an internal table of file names,
  9. ;which are not to be shown when just "D" is typed.
  10. ;(NOTE typing "D *.*" always shows all files)
  11. ;
  12. ;Why is this useful:  A typical CP/M disk contains many
  13. ;utility files: ed.com, asm.com, submit.com, etc.  When
  14. ;you do a directory listing, you typically aren't interested
  15. ;in seeing all those files, but rather just the "current"
  16. ;or "active" files.  This is what "D.COM" can do.
  17. ;
  18. ;
  19. ;Revisions/updates: (in reverse order to minimize reading time)
  20. ;
  21. ;03/01/81 Added reset of DMA to 80H default on exit so D will
  22. ;      work properly with submit.  Deleted CEXIT routine,
  23. ;      which was no longer used.  Expanded documentation.
  24. ;      (KBP)
  25. ;
  26. ;02/28/81 Mod. of 2/21 changed by popular demand to use of direct
  27. ;         BIOS calls for freezing and aborting output. (CS)
  28. ;
  29. ;02/21/81 Abort on receipt of control-C character only (to prevent
  30. ;      premature exit on remote systems with noisy telephone
  31. ;      connections). Charlie Strom
  32. ;
  33. ;12/23/80 Changed sign-on message, revised documentation. (KBP)
  34. ;
  35. ;12/22/80 Fixed stack and file extent problems.  Fully expanded
  36. ;      macros so ASM may be used.  Fixed problem in LOK routine
  37. ;      By Keith Petersen, W8SDZ.
  38. ;
  39. ;12/07/80 Added drive select byte and expanded move macro in WRBACK
  40. ;      routine.  Also added "LOK" command.  By Ron Fowler.
  41. ;
  42. ;12/02/80 Added "NOSYS" equate to ignore system files, code to strip
  43. ;      attributes from files for CP/M 2.x, added date display and
  44. ;      print options.  Fixed up display format.  By Ron Fowler
  45. ;
  46. ;12/01/80 Added "FILES NOT FOUND" feature of updated
  47. ;      D.ASM of Ward Christensen.  By Ron Fowler.
  48. ;
  49. ;11/23/78 Originally written by Ward Christensen.
  50. ;
  51. ;===================================================
  52. ;
  53. ;Use:    D *.*    prints all names, 5 across.
  54. ;
  55. ;    D *.ASM prints selected files just like DIR.
  56. ;
  57. ;    D SET    builds a table (in D.COM) of all
  58. ;        names currently on the disk. (see *NOTE).
  59. ;
  60. ;    D SET <DATE>  adds the date for printing whenever
  61. ;        D is called by 'A>D<CR>' with no options.
  62. ;        If the date field is left blank, it will
  63. ;        be ignored. Note that the date must be 8
  64. ;        characters or less (see *NOTE).
  65. ;
  66. ;    D ADD FN.FT  adds a name to the table in
  67. ;        D.COM, so FN.FT won't be listed
  68. ;        by the 'D' command (see *NOTE).
  69. ;
  70. ;    D DEL FN.FT  deletes a name from the table
  71. ;        in D.COM, so if FN.FT is in the
  72. ;        directory, it will be listed by 'D'
  73. ;        (see *NOTE).
  74. ;
  75. ;    D    lists the directory 5 across, listing
  76. ;        only those files NOT in D.COM, as
  77. ;        put there by 'D SET' or 'D ADD FN.FT'
  78. ;        command.
  79. ;
  80. ;*NOTE: the program must write itself back to disk,
  81. ;modified, so your disk must not be write protected.
  82. ;
  83. ;------------------------------------------------
  84. ;
  85. ;Examples:  Suppose your disk has: 
  86. ;    D.COM
  87. ;    ASM.COM
  88. ;    ED.COM        on it initially.
  89. ;    LOAD.COM
  90. ;    DDT.COM
  91. ;
  92. ;You would type:  D SET
  93. ;to set these names into the D.COM program.
  94. ;
  95. ;Typing "D" would then list:
  96. ;
  97. ;    -->New files
  98. ;    A: ++NONE++
  99. ;
  100. ;    -->Deleted files
  101. ;    A: ++NONE++
  102. ;
  103. ;Suppose you ED TEST.ASM, ASM it, and LOAD it.
  104. ;Typing D would then list:
  105. ;
  106. ;    -->New files
  107. ;    A: TEST    ASM : TEST    BAK : TEST    HEX : TEST    COM
  108. ;
  109. ;    -->Deleted files
  110. ;    A: ++NONE++
  111. ;
  112. ;i.e. it tells you of the "current" files on the disk.
  113. ;
  114. ;Now, supposing you wanted to add TEST.COM as a "regular"
  115. ;file on your disk.  Type:
  116. ;
  117. ;    D ADD TEST.COM
  118. ;
  119. ;Now, typing D will show:
  120. ;
  121. ;    -->New files
  122. ;    A: TEST    ASM : TEST    BAK : TEST    HEX
  123. ;
  124. ;    -->Deleted files
  125. ;    A: ++NONE++
  126. ;
  127. ;i.e. TEST.COM is now considered a "permanent" file.
  128. ;
  129. ;-----
  130. ;
  131. ;Now, suppose you accidentally erased ASM.COM from your
  132. ;disk.  Typing D gives:
  133. ;
  134. ;    -->New files
  135. ;    A: TEST    ASM : TEST    BAK : TEST    HEX
  136. ;
  137. ;    -->Deleted files
  138. ;    A: ASM     COM
  139. ;
  140. ;showing you are missing one of the "regular" files.
  141. ;
  142. ;If, in fact, you didn't want ASM.COM to be on the disk,
  143. ;type:
  144. ;
  145. ;    D DEL ASM.COM
  146. ;
  147. ;which will delete the name from the D.COM table, so ASM.COM
  148. ;won't show up as "deleted".
  149. ;
  150. ;===================================================
  151. ;
  152. ;    SPECIAL NOTES FOR REMOTE SYSTEM USE:
  153. ;
  154. ;If you keep a dedicated copy of this program on each drive of
  155. ;your remote system, you can 'dedicate' each copy of this program
  156. ;to a drive by filling in the byte at 103H with the drive number.
  157. ;This prevents such things as:
  158. ;
  159. ;    A>D B:
  160. ;        or
  161. ;    B>A:D
  162. ;
  163. ;Do this by using the command:
  164. ;
  165. ;    A>D LOK A:    to lock to a drive
  166. ;        or
  167. ;    A>D LOK     to unlock
  168. ;
  169. ;If the conditional 'NOSYS' is set TRUE, $SYS files in CP/M 2.x
  170. ;will be ignored in both directory listings and when the "ADD"
  171. ;option is invoked, unless the override char is specified.  This
  172. ;allows D.COM to be used as a "WHAT'S NEW" program for remote CP/M
  173. ;systems, where the $SYS files must not be listed.
  174. ;
  175. ;Examples:
  176. ;    A>D *.* S     displays everything
  177. ;    A>D SET S     puts ALL files in table
  178. ;    A>D SET 12/23/80 sets date for reference
  179. ;        (if you use 'D SET S', you lose the date option..
  180. ;        ..sorry about that).
  181. ;
  182. ;If you use this program on a remote system, you will likely
  183. ;want to change the commands (ADD, DEL, and SET) for security.
  184. ;You will also want to change the $SYS suppress override character.
  185. ;You may also want to change the name of the program to make the
  186. ;name itself more informative, e.g. "WHATSNEW.COM".
  187. ;
  188. ;-->IMPORTANT: If you want the program to be 'TAG'ed after every
  189. ;D SET (so it cannot be taken by XMODEM), see the note at label
  190. ;"WRBACK" for setting the F1 bit in the filename itself.
  191. ;
  192. ;Note that this program defines its own name for write-back
  193. ;purposes under the label "WRBACK".
  194. ;
  195. ;===================================================
  196. ;
  197. FALSE    EQU    0
  198. TRUE    EQU    NOT FALSE
  199. ;
  200. BDOS    EQU    5
  201. FCB    EQU    5CH 
  202. FCBRNO    EQU    FCB+32
  203. CR    EQU    13    ;CARRIAGE RETURN
  204. LF    EQU    10    ;LINE FEED
  205. ;
  206. NOSYS    EQU    TRUE    ;SET TRUE TO IGNORE SYSTEM FILES
  207. FENCE    EQU    ':'    ;FILENAME SEPARATOR
  208. NPL    EQU    5    ;NAMES PER LINE
  209. SYSOK    EQU    'S'    ;OVERRIDE CHAR FOR SYS SUPPRESSION
  210. ;
  211.     ORG    100H
  212. ;
  213. DENTRY:    JMP    AROUND
  214. ;
  215. DRIVE:    DB    0    ;<---DRV # IS PUT HERE IF DEDICATED
  216. ;
  217. ;Init local stack
  218. AROUND:    LXI    H,0    ;HL=0
  219.     DAD    SP    ;HL=STACK
  220.     SHLD    STACK    ;SAVE STACK POINTER
  221.     LXI    SP,STACK ;INIT LOCAL STACK
  222.     CALL    START
  223.     DB    'D ver 2.4',CR,LF
  224.     DB    'CTL-S pauses, CTL-C aborts',CR,LF,'$'
  225. ;
  226. ;Print ID message
  227. ;
  228. START:    POP    D    ;GET ID ADDRESS
  229.     MVI    C,PRINT ;GET PRINT FNC
  230.     CALL    BDOS    ;PRINT ID MSG
  231.     LHLD    1
  232.     LXI    D,3
  233.     DAD    D    ;HL=CONSTAT
  234.     SHLD    CSTSC+1
  235.     DAD    D    ;HL=CONIN
  236.     SHLD    CIC+1
  237. ;
  238. ;Set file control block
  239.     LDA    DRIVE
  240.     ORA    A    ;NON-DEDICATED?
  241.     JZ    NOND    ;JUMP IF SO
  242.     STA    FCB
  243. ;
  244. NOND:    LDA    FCB+17    ;GET SYS OVERRIDE CHAR
  245.     STA    SYSTOO ;SAVE FOR LATER
  246. ;
  247. ;See if request to add name to list
  248.     LXI    H,FCB+1
  249.     CALL    ADDCM2
  250. ADDCM:    DB    'ADD        '
  251. ;
  252. ADDCM2:    POP    D    ;GET TO
  253.     LXI    B,ADDCM2-ADDCM
  254.     CALL    COMPR
  255.     JNZ    NOADD
  256. ;
  257. ;Got request to add name to table
  258.     CALL    DELNAM ;FIRST, DELETE THE NAME
  259.     CALL    FINDFF    ;FIND END OF TABLE
  260.     XCHG        ;ADDR TO DE
  261. ;
  262. ;Move name to table
  263.     LXI    H,FCB+17
  264.     LXI    B,11
  265.     CALL    MOVER
  266.     MVI    A,0FFH
  267.     STAX    D    ;SET NEW END
  268.     JMP    WRBACK    ;WRITE PROGRAM BACK
  269. ;
  270. ;See if request to lock D.COM to a drive
  271. ;
  272. NOADD:    LXI    H,FCB+1
  273.     CALL    NOADD3
  274. NOADD2:    DB    'LOK        '
  275. ;
  276. NOADD3:    POP    D    ;GET TO
  277.     LXI    B,NOADD3-NOADD2
  278.     CALL    COMPR
  279.     JNZ    NOLOK
  280. ;
  281. ;Got request to lock
  282.     LDA    FCB+16
  283.     STA    DRIVE
  284.     STA    FCB
  285.     JMP    WRBACK
  286. ;
  287. ;See if request to DEL name from list
  288. ;
  289. NOLOK:    LXI    H,FCB+1
  290.     CALL    NOLOK3
  291. NOLOK2:    DB    'DEL        '
  292. ;
  293. NOLOK3:    POP    D    ;GET TO
  294.     LXI    B,NOLOK3-NOLOK2
  295.     CALL    COMPR
  296.     JNZ    NODEL
  297. ;
  298. ;Got request to delete a name from the file
  299.     CALL    DELNAM ;DELETE THE NAME
  300.     JNC    WRBACK    ;WRITE BACK IF OK
  301.     CALL    MSGXIT
  302.     DB    '++NAME NOT IN TABLE++$'
  303. ;
  304. ;See if request to setup table from directory
  305. ;
  306. NODEL:    LXI    H,FCB+1
  307.     CALL    NODEL3
  308. NODEL2:    DB    'SET        '
  309. ;
  310. NODEL3:    POP    D    ;GET TO
  311.     LXI    B,NODEL3-NODEL2
  312.     CALL    COMPR
  313.     JNZ    NOSET
  314. ;
  315. ;Got request to setup table.
  316. ;Move the date (may be blank).
  317.     LXI    H,FCB+17
  318.     LXI    D,DATE
  319.     LXI    B,8
  320.     CALL    MOVER
  321.     MVI    A,1    ;TURN ON..
  322.     STA    SETFLG    ;..SET FLAG
  323.     MVI    A,0FFH    ;CLEAR..
  324.     STA    NAMES    ;..NAMES TABLE
  325.     CALL    FILLQ    ;MAKE FCB '????????.???'
  326. ;
  327. NOSET:    LDA    FCB+1
  328.     SUI    ' '
  329.     STA    PRTFLG
  330.     PUSH    PSW
  331.     CZ    HEAD1
  332.     POP    PSW
  333.     JNZ    GOTNAM
  334.     CALL    FILLQ    ;MAKE NAME ????????.???
  335. ;
  336. GOTNAM:    LDA    FCB
  337.     ORA    A
  338.     JZ    NODISK
  339.     DCR    A
  340.     MOV    E,A
  341.     MVI    C,0EH
  342.     CALL    BDOS
  343. ;
  344. NODISK:    MVI    B,NPL    ;NAMES PER LINE
  345.     CALL    LINMRK
  346.     MVI    C,SRCHF
  347.     JMP    CALLIT
  348. ;
  349. LINE:    MVI    B,NPL    ;NAMES PER LINE
  350.     CALL    LINMRK
  351. ;
  352. NEXT:    MVI    C,SRCHN
  353. ;
  354. CALLIT:    PUSH    B
  355.     LXI    D,FCB
  356.     CALL    BDOS
  357.     INR    A
  358.     JZ    CKNONE
  359.     DCR    A
  360.     ANI    03H
  361.     MOV    L,A
  362.     MVI    H,00H
  363.     DAD    H
  364.     DAD    H
  365.     DAD    H
  366.     DAD    H
  367.     DAD    H
  368.     LXI    D,81H
  369.     DAD    D
  370. ;
  371. ;Check for $SYS attribute, then clear all attributes
  372.     PUSH    H
  373.     LXI    D,9    ;SYS ATT OFFSET
  374.     DAD    D
  375.     MOV    A,M
  376.     ANI    80H
  377.     STA    SYSFLG
  378.     POP    H    ;RETRIEVE FILENAME PTR
  379.     PUSH    H
  380.     MVI    E,11    ;11 CHARS IN FILENAME
  381. ;
  382. ATTLP:    MOV    A,M    ;PICK UP CHAR
  383.     ANI    7FH    ;KILL ATTRIBUTE
  384.     MOV    M,A    ;PUT BACK DOWN
  385.     INX    H
  386.     DCR    E
  387.     JNZ    ATTLP
  388.     POP    H
  389. ;
  390. ;See if name is to be printed
  391.     XCHG        ;NAME POINTER TO DE
  392.     LDA    SETFLG    ;REQUEST TO SETUP TABLE?
  393.     ORA    A
  394.     JNZ    SETUP    ;GO SET ENTRY INTO TABLE
  395.     LDA    PRTFLG
  396.     ORA    A
  397.     JNZ    GOPRNT    ;EXPLICIT REQUEST FOR ALL
  398.     PUSH    D
  399.     LXI    H,NAMES
  400. ;
  401. CKNEXT:    POP    D    ;GET NAME POINTER
  402.     POP    B
  403.     PUSH    B
  404.     MOV    A,M    ;END OF TABLE?
  405.     INR    A    ;WAS IT 0FFH?
  406.     JZ    GOPRNT
  407.     MVI    B,0
  408.     MVI    C,11    ;NAME LENGTH
  409.     PUSH    D
  410. ;
  411. CKLP:    LDAX    D
  412.     CMP    M
  413.     JNZ    NOMACH
  414.     INX    D
  415.     INX    H
  416.     DCR    C
  417.     JNZ    CKLP    ;LOOP FOR 11 CHARS
  418. ;
  419. ;Got match, mark it found and don't print it
  420.     LXI    D,-11    ;POINT BACK TO NAME
  421.     DAD    D
  422.     MVI    M,0    ;MARK IT FOUND
  423.     POP    D    ;POP POINTER
  424.     POP    B
  425.     JMP    NEXT    ;SKIP THE NAME
  426. ;
  427. ;Name didn't match, try next
  428. ;
  429. NOMACH:    DAD    B    ;POINT TO NEXT NAME
  430.     JMP    CKNEXT
  431. ;
  432. ;Print the name
  433. ;
  434. GOPRNT:    CALL    CSTS    ;KEY PRESSED?
  435.     ORA    A
  436.     CNZ    CKKB    ;YES, SEE WHICH ONE
  437. ;
  438.     IF    NOSYS
  439.     LDA    SYSTOO
  440.     CPI    SYSOK
  441.     JZ    DONAME
  442.     LDA    SYSFLG
  443.     RAL
  444.     POP    B
  445.     JC    NEXT
  446.     PUSH    B
  447.     ENDIF        ;NOSYS
  448. ;
  449. DONAME:    MVI    A,1    ;SAY WE GOT ONE
  450.     STA    GOTFLG
  451.     MVI    C,8
  452.     XCHG        ;NAME BACK TO HL
  453. ;
  454. NAMELP:    MOV    A,M
  455.     CALL    TYPE
  456.     INX    H
  457.     DCR    C
  458.     JNZ    NAMELP
  459.     MVI    A,'.'
  460.     CALL    TYPE
  461.     MVI    C,3
  462. ;
  463. NLP2:    MOV    A,M
  464.     CALL    TYPE
  465.     INX    H
  466.     DCR    C
  467.     JNZ    NLP2
  468.     POP    B
  469.     MVI    A,' '
  470.     CALL    TYPE
  471.     MVI    A,FENCE
  472.     DCR    B
  473.     PUSH    PSW
  474.     CNZ    TYPE
  475.     MVI    A,' '
  476.     CALL    TYPE
  477.     POP    PSW
  478.     JNZ    NEXT
  479.     CALL    CRLF
  480.     JMP    LINE
  481. ;
  482. CKNONE:    LDA    GOTFLG
  483.     ORA    A
  484.     JNZ    NOTFND
  485.     LDA    PRTFLG
  486.     ORA    A
  487.     JNZ    NOTFND
  488.     LXI    D,NONMSG ;PRINT "NONE"
  489.     MVI    C,PRINT
  490.     CALL    BDOS
  491. ;
  492. ;Print the files not found
  493. ;
  494. NOTFND: LDA    SETFLG    ;IS THIS 'D SET'?
  495.     ORA    A
  496.     JNZ    FINI    ;DONE IF SO
  497.     LDA    PRTFLG    ;ARE WE PRINTING?
  498.     ORA    A
  499.     JNZ    CKNON2    ;DONE IF NOT
  500. ;
  501. ;If this D.COM is dedicated ("DRIVE" is non-zero),
  502. ;then be sure to print the "FILES NOT FOUND"
  503.     LDA    DRIVE
  504.     ORA    A
  505.     JNZ    NOCHK
  506.     LDA    FCB    ;DRIVE SPECIFIED?
  507.     ORA    A
  508.     JNZ    FINI    ;SKIP NOT FOUND IF SO
  509. ;
  510. NOCHK:    CALL    HEAD2    ;PRINT NOT FND HEADER
  511.     LXI    H,NAMES ;START OF TABLE
  512.     LXI    D,11
  513. ;
  514. LINE2:    CALL    LINMRK
  515.     MVI    C,NPL
  516. ;
  517. NEXT2:    MOV    A,M    ;FIRST CHAR OF NAME
  518.     ORA    A    ;MARKED FOUND?
  519.     JZ    NOPRNT    ;JUMP IF SO
  520.     INR    A    ;CHECK FOR TABLE END
  521.     JZ    CKNON2    ;JUMP IF END
  522.     MVI    A,1
  523.     STA    GOTNF
  524.     MVI    B,8
  525. ;
  526. NAMLP2: MOV    A,M
  527.     CALL    TYPE
  528.     INX    H
  529.     DCR    B
  530.     JNZ    NAMLP2
  531.     MVI    A,'.'
  532.     CALL    TYPE
  533.     MVI    B,3
  534. ;
  535. NLP3:    MOV    A,M
  536.     CALL    TYPE
  537.     INX    H
  538.     DCR    B
  539.     JNZ    NLP3
  540.     MVI    A,' '
  541.     CALL    TYPE
  542.     MVI    A,FENCE
  543.     DCR    C
  544.     PUSH    PSW
  545.     CNZ    TYPE
  546.     MVI    A,' '
  547.     CALL    TYPE
  548.     POP    PSW
  549.     JNZ    NEXT2
  550.     CALL    CRLF
  551.     JMP    LINE2
  552. ;
  553. NOPRNT:    DAD    D
  554.     JMP    NEXT2
  555. ;
  556. ;Print header
  557. ;
  558. HEAD1:    LXI    D,NEWMSG
  559.     JMP    HEDPRT
  560. ;
  561. HEAD2:    LXI    D,DELMSG
  562. ;
  563. HEDPRT: MVI    C,PRINT
  564.     CALL    BDOS
  565.     LDA    DATE
  566.     CPI    ' '
  567.     JZ    NODATE
  568.     CPI    SYSOK
  569.     JZ    NODATE
  570.     LXI    D,ASOF
  571.     MVI    C,PRINT
  572.     CALL    BDOS
  573. ;
  574. NODATE: MVI    A,':'
  575.     CALL    TYPE
  576.     JMP    CRLF
  577. ;
  578. NEWMSG: DB    CR,LF,'-->New files$'
  579. ;
  580. DELMSG: DB    CR,LF,CR,LF,'-->Deleted files$'
  581. ;
  582. CKNON2: LDA    GOTNF
  583.     ORA    A
  584.     JNZ    FINI    ;JMP IF GOT NO 'NOT FOUND'S
  585.     LDA    PRTFLG
  586.     ORA    A
  587.     JNZ    FINI
  588.     LXI    D,NONMSG
  589.     MVI    C,PRINT ;ELSE PRINT 'NONE'
  590.     CALL    BDOS
  591.     JMP    FINI
  592. ;
  593. ;Set up the name in the table
  594. ;
  595. SETUP:
  596.     IF    NOSYS
  597.     LDA    SYSTOO
  598.     CPI    SYSOK
  599.     JZ    SETU2
  600.     LDA    SYSFLG
  601.     RAL
  602.     JC    SETSKP
  603.     ENDIF        ;NOSYS
  604. ;
  605. SETU2:    CALL    FINDFF    ;FIND END OF TABLE
  606.     XCHG        ;SETUP FOR MOVE
  607. ;(HL = name, DE = end of table)
  608.     LXI    B,11
  609.     CALL    MOVER
  610.     MVI    A,0FFH    ;GET TABLE END FLAG
  611.     STAX    D    ;STORE IT
  612. ;
  613. SETSKP: POP    B    ;DELETE STACK GARBAGE
  614.     JMP    NEXT    ;GET NEXT ENTRY
  615. ;
  616. CRLF:    MVI    A,CR
  617.     CALL    TYPE
  618.     MVI    A,LF
  619. ;
  620. TYPE:    PUSH    B
  621.     PUSH    D
  622.     PUSH    H
  623.     MOV    E,A
  624.     MVI    C,02H
  625.     CALL    BDOS
  626.     POP    H
  627.     POP    D
  628.     POP    B
  629.     RET
  630. ;
  631. ;MOVE ROUTINE
  632. ;
  633. MOVER:    MOV    A,M
  634.     STAX    D
  635.     INX    D
  636.     INX    H
  637.     DCX    B
  638.     MOV    A,B
  639.     ORA    C
  640.     JNZ    MOVER
  641.     RET
  642. ;
  643. ;Compare routine
  644. ;
  645. COMPR:    LDAX    D
  646.     CMP    M
  647.     RNZ
  648.     INX    D
  649.     INX    H
  650.     DCX    B
  651.     MOV    A,B
  652.     ORA    C
  653.     JNZ    COMPR
  654.     RET        ;EQUAL
  655. ;
  656. ;Routine to find 0FFH at end of table
  657. ;
  658. FINDFF:    LXI    H,NAMES
  659. ;
  660. FINDLP:    MOV    A,M
  661.     INX    H
  662.     INR    A    ;0FFH?
  663.     JNZ    FINDLP
  664.     DCX    H    ;BACK UP TO TABLE END
  665.     RET
  666. ;
  667. ;Delete the name from the table
  668. ;
  669. DELNAM:    LXI    H,NAMES
  670. ;
  671. DELLP:    MOV    A,M
  672.     CPI    0FFH
  673.     STC
  674.     RZ        ;NOT FOUND
  675.     LXI    D,FCB+17
  676.     LXI    B,11
  677.     CALL    COMPR
  678.     JZ    DELETE
  679.     DAD    B    ;CALC NEXT
  680.     JMP    DELLP
  681. ;
  682. ;Delete the name
  683. ;
  684. DELETE:    XCHG        ;NEXT NAME TO DE
  685.     LXI    H,-11    ;TO BACK UP..
  686.     DAD    D    ;..TO NAME TO DEL
  687. ;
  688. DELCH:    LDAX    D
  689.     MOV    M,A
  690.     INX    H
  691.     INX    D
  692.     INR    A    ;MOVED THE 0FFH?
  693.     JNZ    DELCH
  694.     ORA    A    ;SHOW FOUND
  695.     RET
  696. ;
  697. ;Fill FCB with all '?'
  698. ;
  699. FILLQ:    LXI    H,FCB+1
  700.     MVI    B,8+3
  701.     MVI    A,'?'
  702. ;
  703. QMLOOP:    MOV    M,A
  704.     INX    H
  705.     DCR    B
  706.     JNZ    QMLOOP
  707.     RET
  708. ;
  709. ;Write back the program - note that you may set any of the
  710. ;CP/M 2.x attribute bits in the file name (be sure to define
  711. ;all 11 characters of the name).
  712. ;
  713. WRBACK: LXI    D,FCB+1
  714.     CALL    WRBK2
  715. WRBK1:    DB    'D'        ;<--PUT 'D'+80H HERE TO SET TAG
  716.     DB    '       COM'    ;SEE COMMENT ABOVE
  717.     DB    0        ;EXTENT NUMBER
  718. ;
  719. WRBK2:    POP    H
  720.     LXI    B,WRBK2-WRBK1
  721.     CALL    MOVER
  722.     MVI    C,ERASE
  723.     LXI    D,FCB
  724.     CALL    BDOS
  725.     XRA    A    ;GET 0
  726.     STA    SETFLG    ;CLEAR THE FLAGS..
  727.     STA    GOTFLG
  728.     STA    GOTNF
  729.     STA    SYSTOO
  730.     STA    FCBRNO    ;ZERO RECORD NUMBER
  731.     MVI    C,MAKE
  732.     LXI    D,FCB
  733.     CALL    BDOS
  734. ;
  735. ;Before writing back, find end of table
  736.     CALL    FINDFF
  737.     MOV    B,H    ;B=END PAGE
  738.     INR    B    ;FOR COMPARE
  739.     LXI    D,100H    ;STARTING ADDR
  740. ;
  741. WRLP:    PUSH    B
  742.     PUSH    D
  743.     PUSH    H
  744.     MVI    C,SETDMA
  745.     CALL    BDOS
  746.     MVI    C,WRITE
  747.     LXI    D,FCB
  748.     CALL    BDOS
  749.     POP    H
  750.     POP    D
  751.     POP    B
  752.     ORA    A    ;SUCCESSFUL WRITE?
  753.     JNZ    WRERR    ;..NO
  754.     LXI    H,80H    ;POINT TO..
  755.     DAD    D    ;..NEXT BLOCK
  756.     XCHG        ;ADDR TO DE
  757.     MOV    A,D    ;GET PAGE
  758.     CMP    B    ;PAST TABLE END?
  759.     JC    WRLP    ;LOOP UNTIL DONE
  760.     MVI    C,CLOSE
  761.     LXI    D,FCB
  762.     CALL    BDOS
  763.     INR    A    ;SUCCESSFUL CLOSE?
  764.     JZ    BADCLS    ;..NO, PRINT ERR MSG
  765.     CALL    MSGXIT ;OK, EXIT W/MSG
  766.     DB    '++DONE++$'
  767. ;
  768. WRERR:    CALL    MSGXIT
  769.     DB    '++WRITE ERROR++$'
  770. ;
  771. BADCLS:    CALL    MSGXIT
  772.     DB    '++BAD CLOSE, D.COM CLOBBERED!!++$'
  773. ;
  774. ;Finished.  If building table, write back
  775. ;
  776. FINI:    LDA    SETFLG
  777.     ORA    A
  778.     JZ    EXIT    ;NOT WRITING
  779.     JMP    WRBACK
  780. ;
  781. ;Direct BIOS calls follow
  782. ;
  783. CSTS    PUSH    B    ;CONSOLE STATUS
  784.     PUSH    D
  785.     PUSH    H
  786. CSTSC    CALL    $-$    ;SUPPLIED AT START
  787.     POP    H
  788.     POP    D
  789.     POP    B
  790.     RET
  791. ;
  792. CI    PUSH    B    ;CONSOLE INPUT
  793.     PUSH    D
  794.     PUSH    H
  795. CIC    CALL    $-$    ;SUPPLIED AT START
  796.     POP    H
  797.     POP    D
  798.     POP    B
  799.     RET
  800. ;
  801. CKKB:    CALL    CI
  802.     CPI    'S'-40H
  803.     CZ    CI
  804.     CPI    'C'-40H
  805.     JZ    ABORT
  806.     RET
  807. ;
  808. ABORT:    CALL    MSGXIT
  809.     DB    CR,LF,CR,LF,'++ABORTED++',CR,LF,'$'
  810.     JMP    EXIT
  811. ;
  812. ;Exit with message (error or informational)
  813. ;
  814. MSGXIT:    POP    D    ;GET MSG
  815.     MVI    C,PRINT
  816.     CALL    BDOS
  817. ;
  818. ;Exit, restoring dma and stack, then return
  819. ;
  820. EXIT:    LXI    D,80H    ;RESET DMA ADR TO NORMAL
  821.     MVI    C,SETDMA
  822.     CALL    BDOS
  823.     LHLD    STACK    ;GET OLD STACK
  824.     SPHL        ;RESTORE IT
  825.     RET        ;TO CCP
  826. ;
  827. LINMRK: PUSH    B
  828.     PUSH    D
  829.     PUSH    H
  830.     LDA    FCB    ;GET DRIVE NAME FROM FCB
  831.     ORA    A    ;ANY THERE?
  832.     JNZ    GOTDRV    ;YES, GO PRINT IT
  833.     MVI    C,CURDSK ;ELSE GET CURRENT DISK
  834.     CALL    BDOS
  835.     INR    A    ;MAKE 'A'=1
  836. ;
  837. GOTDRV:    ADI    40H    ;MAKE ASCII
  838.     CALL    TYPE    ;PRINT DRIVE NAME
  839.     CALL    GOTDR2    ;THEN ': '
  840.     DB    ': $'
  841. ;
  842. GOTDR2:    POP    D    ;GET MSG ADR
  843.     MVI    C,PRINT    ;PRINT IT
  844.     CALL    BDOS
  845.     POP    H
  846.     POP    D
  847.     POP    B
  848.     RET
  849. ;
  850.     DS    64    ;ROOM FOR STACK
  851. STACK:    DS    2    ;OLD STACK STORED HERE
  852. GOTFLG:    DB    0
  853. GOTNF:    DB    0
  854. SYSTOO:    DB    0
  855. NONMSG:    DB    '++NONE++',CR,LF,'$'
  856. ASOF:    DB    ' since '
  857. DATE:    DB    '        '
  858.     DB    '$'
  859. SETFLG:    DB    0    ;1 => SETUP TABLE
  860. PRTFLG:    DB    0    ;PRINT ONLY SOME
  861. SYSFLG:    DB    0    ;$SYS ATTRIB INDICATOR
  862. NAMES    EQU    $    ;NAMES NOT TO PRINT, STORED HERE
  863. ;
  864. ;Note the names are initially built by:    D SET
  865. ;
  866.     DB    0FFH    ;END OF TABLE
  867. ;
  868. ;BDOS equates
  869. ;
  870. RDCON    EQU    1
  871. DIO    EQU    6
  872. PRINT    EQU    9
  873. CONST    EQU    11
  874. CLOSE    EQU    16
  875. SRCHF    EQU    17
  876. SRCHN    EQU    18
  877. ERASE    EQU    19
  878. READ    EQU    20
  879. WRITE    EQU    21
  880. MAKE    EQU    22
  881. CURDSK    EQU    25
  882. SETDMA    EQU    26
  883. ;
  884.     END
  885.