home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / dirutl / dirr5.lbr / DIRR5.AQM / DIRR5.ASM
Assembly Source File  |  1986-01-19  |  59KB  |  2,452 lines

  1. ; DIRR5.ASM - Directory program with print and disk options - 01/07/86
  2. ;
  3. ; Based on the Archives-supplied "D.COM" for which the original source
  4. ; code and supplier of same cannot be located but may have originally
  5. ; been written in 'C' by Rick Rump.
  6. ;
  7. ; Enhancements written by James R. King     December 17,1983
  8. ;
  9. ;     NOTE:  CAN BE USED WITH 8080, 8085 OR Z80 PROCESSORS.
  10. ;        SUPPORTS BOTH CP/M V2.2 AND CP/M V3.0. - IMH
  11. ;
  12. ;-----------------------------------------------------------------------
  13. ;
  14. ; 01/07/86  Adapted to CP/M 3.0 so people with Commodore C128, Osborne
  15. ;    v5     Executive One, and others with CP/M+ could use it as well as
  16. ;        those with CP/M 2.2 versions.  Suggest you rename it D.COM
  17. ;        on your working disk, as very easy to type.
  18. ;                    - Irv Hoff W6FFC
  19. ;
  20. ; 12/09/85  Sorry for the new update so soon.  The 'A' option for "all"
  21. ;    v4     user areas did not work correctly with v3.    Pre-distribution
  22. ;        versions worked fine, until I decided to write some tighter
  23. ;        code in the options area - then failed to test it adequately
  24. ;        before release.  My apology.  Hopefully I was the first to
  25. ;        notice that problem, when I tried it on somebody else's big
  26. ;        system.  It's fixed now.  The 'A' option in conjunction with
  27. ;        the 'E' and 'S' options are a wonderful feature of this pro-
  28. ;        gram.            - Irv Hoff
  29. ;
  30. ; 12/07/85  Rewritten for Intel 8080 code.  Eliminated need for macro
  31. ;    v3     libraries, can now be assembled with any normal assembler.
  32. ;        Added "QUIT" routine so program may be easily aborted, also
  33. ;        added a help guide.  Extensively revised the header section.
  34. ;        Added a "N" (non-stop) option.  Rewrote the options to be
  35. ;        compatible (where possible) with the SD directory program.
  36. ;        Now checks both the 4th character of the file name as well
  37. ;        as the last byte of the extent to see if the file has been
  38. ;        archived, and displays an 'A' if using the 'E' option which
  39. ;        shows attributes and archive bits.    This all but eliminates
  40. ;        any need for (or advantage to) any highlighting or reverse
  41. ;        video.  Now has an extra row for the filesize to display
  42. ;        files over 100k without jamming them against the end of the
  43. ;        file extent.  Made the special printer and terminal routines
  44. ;        optional with assembly-time equates.  Rewrote the stack area
  45. ;        which was backwards.  Numerous other changes.
  46. ;                    - Irv Hoff
  47. ;
  48. ;-----------------------------------------------------------------------
  49. ;
  50. NO    EQU    0
  51. YES    EQU    0FFH        ; Some assemblers cannot use NOT NO here
  52. ;
  53. FALSE    EQU    NO
  54. TRUE    EQU    NOT NO        ; Some assemblers cannot use 0FFH here
  55. ;
  56. ;
  57. ; The following two must be TRUE or FALSE, the YES or NO won't work
  58. ; properly with some assemblers, which need a 16-bit value for "IF" con-
  59. ; ditionals, while others have to have a 8-bit value (such as 0FFH) for
  60. ; YES for DB strings, sorry but that's the only way it can be made to
  61. ; work properly with "any assembler".
  62.  
  63. PNTRSP    EQU    FALSE        ; TRUE if using special printer calls
  64. VIDEO    EQU    FALSE        ; TRUE if using VIDEO for highligting,
  65. ;                ;   reverse, etc., then set in proper
  66. ;                ;   values for your terminal, starting
  67. ;                ;   at TRMINI: label, below
  68. ;
  69. ; BDOS equates
  70. ;
  71. BDOS    EQU    0005H        ; CP/M BDOS entry point
  72. DFCB    EQU    005CH        ; Default file control block
  73. ALTFCB    EQU    006CH        ; Alternate file control block
  74. SBUFFR    EQU    5000H        ; Location of stolen 'DI' output
  75. TBUF    EQU    0080H        ; Default buffer location
  76. ;
  77. RDCON    EQU    1        ; CP/M console input function
  78. WRCON    EQU    2        ; Send character to console
  79. WRLST    EQU    5        ; List output
  80. CONST    EQU    11        ; Check console status
  81. CPMVER    EQU    12        ; CP/M version
  82. SELDSK    EQU    14        ; Select disk drive function
  83. CLOSEF    EQU    16        ; Close disk file function
  84. SRFST    EQU    17        ; Search for first FCB match
  85. SRNXT    EQU    18        ; Search for next FCB match
  86. DELETE    EQU    19        ; Delete file function
  87. WRSEQ    EQU    21        ; Write sequentially to disk function
  88. MAKEF    EQU    22        ; Make file function
  89. CURDSK    EQU    25        ; Get current disk function
  90. STDMA    EQU    26        ; Set direct memory access function
  91. GETADR    EQU    27        ; Get the allocation block address
  92. PARMS    EQU    31        ; Get disk parameters address
  93. GETUSR    EQU    32        ; Get (or set) the user code
  94. ;
  95. ;
  96. CR    EQU    0DH        ; ASCII carriage return
  97. LF    EQU    0AH        ; ASCII line feed
  98. FF    EQU    0CH        ; ASCII form feed
  99. ESC    EQU    1BH        ; ASCII escape code (lead-in)
  100. PLINES    EQU    56        ; Number of lines for page printer
  101. ;
  102. ;
  103. ;***********************************************************************
  104. ;
  105. ;
  106.     ORG    100H
  107. ;
  108. ;
  109.     JMP    START
  110.  
  111. ;
  112. ; The user flags start at 0103H and can be changed from NO to YES to
  113. ; default to that option.
  114. ;
  115. AFLAG:    DB    NO        ; Checks all user areas
  116. CFLAG:    DB    NO        ; Compresses display by suppressing size
  117. EFLAG:    DB    NO        ; Extended display - users & attributes
  118. FFLAG:    DB    NO        ; Disk file flag
  119. NFLAG:    DB    NO        ; Non-stop flag
  120. PFLAG:    DB    NO        ; Printer off, YES = default to printer
  121. SFLAG:    DB    NO        ; Display system files if YES
  122. VFLAG:    DB    NO        ; Shows version number and date
  123. ;
  124.     DB    0,0,0,0        ; Reserved for 4 extra flag bytes
  125. ;
  126. HEIGHT:    DB    24,0        ; Lines per screen
  127. NUMROW:    DB    4        ; Number of rows per line
  128. ;
  129. ;
  130. ;=======================================================================
  131. ;      p r i n t e r   i n i t i a l i z a t i o n   c o d e s
  132. ;=======================================================================
  133. ;
  134. ; Enter the escape codes to be sent to the printer here, such as bold
  135. ; type, compressed type, etc.  Maximum of 15 user bytes, 16th must = 0.
  136. ; Sent to list device prior to sending any characters and only if the
  137. ; "$P" (output to list device) option is selected.
  138. ;
  139.      IF    PNTRSP
  140. PTRONM:    DB    ESC,'Q'        ; C. ITOH compressed (17 cpi) type
  141.     DB    CR,LF        ; Flush printer buffer
  142.     DW    0,0,0,0,0,0    ; Patch area fills to 012fh
  143. ;
  144. ;
  145. ; Enter the escape sequence to be sent to printer at conclusion of
  146. ; directory printing to clear the special effects introduced above.
  147. ; Maximum is 16 bytes and the last byte must be 0.  This is sent after
  148. ; all other text has been sent, to restore normal printer attributes.
  149. ;
  150. PTROFM:    DB    ESC,'N'        ; C. ITOH pica pitch (10 cpi.) select
  151.     DB    CR,LF        ; Flush buffer
  152.     DB    FF,CR        ; Form feed and flush again
  153.     DW    0,0,0,0,0    ; Patch area ends with "0"
  154.      ENDIF            ; PNTRSP
  155. ;
  156. ;
  157. ;=======================================================================
  158. ;   t e r m i n a l   p a t c h  a r e a   b e g i n s     h e r e
  159. ;=======================================================================
  160. ;
  161. ; Used to initialize terminal background.  This is sent prior to any
  162. ; characters fron the directory listing.
  163. ;
  164.      IF    VIDEO
  165. TRMINI:    DB    ESC,019H    ; Set attributes for normal background
  166.     DW    0,0        ; During directory screen display. sent
  167.     DW    0,0        ; To terminal before anything else.
  168.     DW    0,0,0        ; User gets 15 bytes, 16th must be = 0
  169. ;
  170. FGNDON:    DB    ESC,01FH    ; Code required to highlight, underline,
  171.     DW    0,0,0        ;   etc.  Sent to terminal before send-
  172.                 ;   ing character with bit 7 set ($R/O,
  173.                 ;   $SYS  or archived) file flag indi-
  174.                 ;   cator in screen display.  Sequence
  175.                 ;   is used for highlighting, underlin-
  176.                 ;   ing, inverse video, etc. as desired.
  177. ;
  178. FGNDOF:    DB    ESC,019H    ; Code to "UNDO" the above after one
  179.     DW    0,0,0        ;   special character has been sent.
  180.                 ;   Returns attributes to normal.  May
  181.                 ;   use the same code "TRMINI" above.
  182.                 ;   8 bytes, must end with 0.be
  183. ;
  184. CRSRUP:    DB    CR        ; Move cursor to far left column, move
  185.     DB    ESC,0CH        ;   cursor up one line (HZ1500)  Patch
  186.     DB    0,0,0,0,0    ;   area must end with 0.  User gets 7
  187.                 ;   7 bytes, 8th must = 0
  188. ;
  189. CLREOL:    DB    ESC,0FH        ; Patch clear to end-of-line code here
  190.     DW    0,0,0        ;   supported by your terminal.  Cannot
  191.                 ;   exceed 7 bytes, 8th byte must be 0.
  192. ;
  193. ;
  194. ; "TRMUNI" is sent to the terminal after all directory characters have
  195. ; been sent to the terminal. this is used to restore the normal terminal
  196. ; characteristics.
  197.  
  198. TRMUNI:    DB    ESC,019H    ; Background follows (HZ1500)
  199.     DW    0,0,0        ; 15 bytes for user to restore normal
  200.     DW    0,0,0,0        ;   screen attributes prior to return to
  201.                 ;   CP/M, last byte must be 0.
  202. ;
  203. PG2MSG:    DB    CR,LF,0FH    ; Sent after hitting space for next page
  204.     DW    0,0,0,0        ;   display, insert carriage return and
  205.                 ;   'clear to end of line' code here.
  206.                 ;   Else insert CR,LF
  207.      ENDIF            ; VIDEO
  208. ;
  209. ;
  210. ;=======================================================================
  211. ;         s t a r t     o f   m a i n     p r o g r a m
  212. ;=======================================================================
  213. ;
  214. ;
  215. START:    LXI    H,0
  216.     DAD    SP        ; Get CCP stack in <HL>
  217.     SHLD    STACK        ; Save for direct exit to CCP
  218.     LXI    SP,STACK    ; Set up the local stack
  219. ;
  220. ;
  221. ; Program to run the directory program, send the directory to the print-
  222. ; er printer if 'P' toggle is set, save the directory output to a disk
  223. ; file if the 'F' toggle is set, and return to CP/M command without in-
  224. ; voking a warm reboot.
  225. ;
  226. SETUP:    LHLD    BDOS+1        ; Get BDOS vector in <HL>
  227.     SHLD    HERE+1        ; Store in the 'save' routine
  228.     SHLD    LSTOT1+1    ; Store in the printer output routine
  229.     SHLD    SNDC1+1        ; Store in the console output routine
  230.     LHLD    HEIGHT        ; Compensate for the [more] message
  231.     DCX    H
  232.     SHLD    HEIGHT        ; Screen height minus [more] message
  233.     LDA    NFLAG        ; Non-stop flag set to default?
  234.     ORA    A
  235.     JZ    SETUP1        ; If not, exit
  236.     LXI    H,0FFFFH
  237.     SHLD    HEIGHT        ; Else prevent any stopping
  238. ;
  239. ;
  240. ; Get command for enhancements portion of program
  241. ;
  242. SETUP1:    LXI    H,DFCB+1    ; Point to command line tail
  243.     MOV    A,M        ; Get a byte in the accumulator
  244.     CPI    '$'        ; Dollar sign there?
  245.     JZ    SETUP2        ; Yes, check the command tail
  246.     LXI    H,DFCB+17    ; Check alternate FCB too
  247.     MOV    A,M        ; Get that byte to check for "$"
  248.     CPI    '$'        ; Well, is there one here?
  249.     JNZ    CKFNDO        ; No, use defaults
  250. ;
  251. ;
  252. ; We scan whichever file control block we find the "$" heading in while
  253. ; looking for the printer, file non-stop toggles.  (no "$", no scan.)
  254. ; Original program will scan file control block for the rest of them.
  255. ;
  256. SETUP2:    INX    H        ; Bump the pointer to the next byte
  257.     MVI    B,8        ; We will check 9 bytes for options
  258. ;
  259. SETUP3:    PUSH    B        ; Save the count
  260.     PUSH    H        ; Save the memory pointer
  261.     MOV    A,M        ; Get a byte from tail (isn't this fun?)
  262.     ANI    7FH        ; Strip off any parity
  263.     CPI    '?'        ; Help wanted?
  264.     JZ    HELP        ; Exit if help is requested
  265.     CPI    'F'        ; Disk file save flag
  266.     CZ    STSAVF        ; Set the flag true
  267.     CPI    'N'        ; Non-stop request
  268.     CZ    NOSTOP        ; Set the non-stop flag
  269.     CPI    'P'        ; Want a printer copy?
  270.     CZ    SPFLAG        ; Set the printer flag
  271.     POP    H        ; Restore memory pointer
  272.     INX    H        ; Bump the pointer
  273.     POP    B        ; Restore count to <BC>
  274.     DCR    B
  275.     JNZ    SETUP3        ; Loop until done
  276. ;
  277. CKFNDO:    LDA    FFLAG        ; Making a disk file?
  278.     ORA    A
  279.     CNZ    SNITCH        ; Yes, set up for data capture
  280.     LDA    PFLAG        ; Get the printer toggle flag
  281.     ORA    A        ; Is flag set to true?
  282.     CNZ    PTRON        ; Turn printer on if so
  283.     LXI    SP,STACK    ; Expected <SP> location
  284.     CALL    DBEGIN        ; Now do the directory
  285.     JMP    EXITJ        ; Do the exit routine
  286. ;.....
  287. ;
  288. ;
  289. ;=======================================================================
  290. ;          m a i n    o p e r a t i n g   l o o p
  291. ;=======================================================================
  292. ;
  293. DBEGIN:    CALL    SELDRV        ; Select proper drive
  294.     CALL    SEARCH        ; Search for requested files
  295.     XRA    A
  296.     LXI    D,XTNL10    ; Get address of (?????) in <DE>
  297.     CALL    A0B23
  298.     ORA    L
  299.     JZ    A022D
  300.     MVI    A,1
  301.     LXI    H,XTNL10
  302.     CALL    A0B2E
  303.     JNC    A022A
  304.     CALL    A04AA
  305. ;
  306. A022A:    CALL    A0665
  307. ;
  308. A022D:    XRA    A
  309.     LXI    D,XTNL0E
  310.     CALL    A0B23
  311.     ORA    L        ; Did we find any files that match?
  312.     JZ    XIT        ; Exit if no files to display
  313.     CALL    SIGNON        ; Else we are on our way
  314. ;
  315. XIT:    CALL    SUMMRY        ; Get and display disk parameters
  316.     RET            ; Exit from directory program here
  317. ;.....
  318. ;
  319. ;
  320. SPACE1:    MVI    C,' '        ; ASCII space in <C> for F2OUT
  321. ;
  322. SP1A:    JMP    F2OUT        ; Send space to console, auto return
  323. ;
  324. CRLF:    MVI    C,CR        ; ASCII carriage return in <C> for F2OUT
  325.     CALL    F2OUT        ; Send the CR
  326.     MVI    C,LF        ; ASCII line feed in <C> for F2OUT
  327.     JMP    SP1A        ; Send the line feed, auto return
  328. ;.....
  329. ;
  330. ;
  331. A0256:    LXI    H,XTNL42
  332.     MOV    M,D
  333.     DCX    H
  334.     MOV    M,E
  335.     DCX    H
  336.     MOV    M,B
  337.     DCX    H
  338.     MOV    M,C
  339.     LXI    B,XTNL41
  340.     LXI    D,XTNL3F
  341.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  342.     LHLD    XTNL41
  343.     RNC            ; @@@ added
  344.     LHLD    XTNL3F
  345.     RET
  346. ;.....
  347. ;
  348. ;
  349. GETCMD:    LDA    DFCB+1        ; Beginning of command tail
  350.     CPI    '?'
  351.     JNZ    GETCME
  352.     LDA    DFCB+2        ; Check 2nd character
  353.     CPI    ' '
  354.     JZ    HELP
  355. ;
  356. GETCME:    CPI    '$'        ; Request delimiter there?
  357.     JNZ    A028E        ; Skip if not there
  358.     LXI    B,12        ; 12 characters to move
  359.     PUSH    B        ; Store 12 on stack
  360.     LXI    D,ALTFCB    ; <DE> points to alt FCB (destination)
  361.     LXI    B,DFCB+1    ; <BC> points to FCB (source)
  362.     CALL    MOVMEM        ; Move the FCB to new location
  363.     LXI    H,DFCB+1    ; Back to the first character
  364.     MVI    M,' '        ; Insert an ASCII space there
  365. ;
  366. ;
  367. ; Initialize the options flag area (original toggles)
  368. ;
  369. A028E:    LXI    H,FLGIND    ; Initialize the options flag area
  370.     MVI    M,0
  371.     LXI    H,XTNL43
  372.     MVI    M,0
  373. ;
  374. FLSCAN:    CALL    QUIT        ; Want to quit?
  375.     LXI    D,12
  376.     LDA    XTNL43
  377.     CALL    A0B0C
  378.     JC    CFLGCK        ; Check compressed filesize flag
  379. ;
  380.     LHLD    XTNL43        ; <L> = flag
  381.     MVI    H,0        ; Zap <H> but leave <L> in place
  382.     LXI    B,ALTFCB    ; Point to alternate file control block
  383.     DAD    B        ; Alt FCB address in <HL>
  384.     MOV    A,M        ; Get first byte
  385.     STA    XTNL44        ; Store it for later reference
  386.     CPI    'A'        ; Want to check all user areas?
  387.     JNZ    C1        ; Not there, check for other commands
  388.     STA    AFLAG
  389. ;
  390. C1:    LDA    XTNL44
  391.     CPI    'C'        ; Check for "compressed" toggle
  392.     JNZ    E1        ; Not there, check for other commands
  393.     STA    CFLAG        ; And store it at the proper location
  394. ;
  395. E1:    LDA    XTNL44
  396.     CPI    'E'        ; Check for "extended" toggle
  397.     JNZ    N1        ; Not there, check for other commands
  398.     STA    EFLAG        ; And store it for later reference
  399. ;
  400. N1:    LDA    XTNL44
  401.     CPI    'N'        ; Check for non-stop
  402.     JNZ    S1
  403.     MVI    A,0FFH
  404.     STA    HEIGHT
  405.     STA    HEIGHT+1
  406. ;
  407. S1:    LDA    XTNL44
  408.     CPI    'S'        ; Want to check system files also?
  409.     JNZ    V1        ; Not there, check for other commands
  410.     STA    SFLAG        ; And store it at the proper location
  411. ;
  412. V1:    LDA    XTNL44
  413.     CPI    'V'
  414.     JNZ    A02F4
  415.     STA    VFLAG
  416. ;
  417. A02F4:    LXI    H,XTNL43
  418.     INR    M
  419.     JMP    FLSCAN        ; Loop until done
  420. ;.....
  421. ;
  422. ;
  423. CFLGCK:    LDA    CFLAG        ; Check for filesize
  424.     ORA    A        ; Carry flag is set if flag is "YES"
  425.     JZ    ENHCK        ; No, check for "extended"
  426.     LXI    H,NUMROW    ; Point to number of rows per line
  427.     INR    M        ; Add one, file size not being used
  428.     RET
  429. ;.....
  430. ;
  431. ;
  432. ; Here we check for extended option & reduce screen width if EFLAG "YES"
  433. ;
  434. ENHCK:    LDA    EFLAG        ; Get 'extended' flag in <A>
  435.     ORA    A
  436.     RZ            ; No, finished
  437.     LXI    H,NUMROW    ; Byte for number of rows per line
  438.     DCR    M        ; Additional information, reduce by one
  439.     RET
  440. ;.....
  441. ;
  442. ;
  443. PAGECK:    LXI    B,HEIGHT    ; 'Number of lines on screen' byte
  444.     LXI    D,LINECT    ; Line count storage location
  445.     CALL    CMP16B        ; Sets carry if BC<DE
  446.     ORA    L        ; Align CPU flags
  447.     SUI    1        ; Make one less for subtract with borrow
  448.     SBB    A        ; 0FFH if BC=DE, else 00H
  449.     RNC            ; Done here if no carry
  450.     LXI    B,HTSPCM    ; Point to the '[more]' message
  451.     CALL    SNDCON        ; Tell user to hit space (console only)
  452.     LDA    PFLAG        ; Get printer flag byte
  453.     INR    A        ; Is the printer on?
  454.     CZ    FORMFD        ; Send formfeed to printer if it is on
  455.     MVI    C,RDCON        ; Wait for a keyboard response
  456.     CALL    BDOS
  457. ;
  458.      IF    VIDEO
  459.     LXI    B,PG2MSG    ; Start a new line, clear to end of line
  460.     JMP    SNDMSG
  461.      ENDIF            ; VIDEO
  462. ;
  463.     RET
  464. ;.....
  465. ;
  466. ;
  467. SELDRV:    CALL    GETCMD        ; Get command tail info
  468.     LDA    DFCB        ; Get first byte of tail in <acc>
  469.     ORA    A        ; Contains ASCII space if "$" delimited
  470.                 ;   command follows in alt FCB, else
  471.                 ;   drive code if other drive requested
  472.     JZ    WLDCRD        ; Default to current drive if empty
  473.     DCR    A        ; Reduce by one for disk select function
  474.     MOV    E,A        ; In <E> for disk select
  475.     MVI    C,SELDSK    ; CP/M disk select function
  476.     CALL    BDOS        ; Completes disk select
  477. ;
  478. WLDCRD:    LDA    DFCB+1        ; Check for contents of command tail
  479.     CPI    ' '        ; ASCII blank indicates wildcard search
  480.     JNZ    USER        ; Skip if no ASCII space
  481.     MVI    C,11        ; Number of bytes to fill
  482.     PUSH    B        ; Save the count
  483.     MVI    E,'?'        ; Fill with "???????????" for wildcard
  484.     LXI    B,DFCB+1    ; Beginning of area to be filled
  485.     CALL    FILL        ; Fill it
  486. ;
  487. USER:    LDA    AFLAG        ; Get "USER" flag - true if $A appeared in tail
  488.     RAR            ; Set carry flag if false
  489.     JNC    GUSRCD        ; Get user code if true - skip if false
  490.     LXI    H,INTFCB    ; User code storage location is first byte
  491.     MVI    M,'?'        ; ASCII "?" for search of all user areas
  492.     JMP    MKFCB        ; Make a file control block
  493. ;
  494. GUSRCD:    LXI    D,0FFH        ; 0FFH in <E> for "GET"
  495.     MVI    C,GETUSR    ; Get/set user function
  496.     CALL    BDOS        ; Get current user code in <A>
  497.     STA    INTFCB        ; Store user code in memory
  498. ;
  499. MKFCB:    MVI    C,11        ; Number of bytes in filename+ext
  500.     PUSH    B        ; Save the count in <C>
  501.     LXI    D,INTFCB+1    ; Internal file control block for search parms
  502.     LXI    B,DFCB+1    ; Beginning of dfcb input/output line
  503.     CALL    MOVMEM        ; Move the DFCB to the internal FCB
  504. ;
  505. ;
  506. ; Now fill the default file control block with question marks
  507. ;
  508.     MVI    C,13        ; <C> contains number of bytes to fill
  509.     PUSH    B        ; Save count in <C> on stack
  510.     MVI    E,'?'        ; Fill with ASCII "?"
  511.     LXI    B,DFCB        ; Point to the default file control block
  512.     CALL    FILL        ; Fill the DFCB with ?????
  513.     MVI    C,PARMS        ; Get disk parameter address in <HL>
  514.     CALL    BDOS
  515.     LXI    D,INTDPB    ; Store 15 bytes into INTDPT area
  516.     MVI    B,15
  517. ;
  518. RPTFCB:    MOV    A,M
  519.     STAX    D
  520.     INX    D
  521.     INX    H
  522.     DCR    B
  523.     JNZ    RPTFCB
  524.     LXI    H,STACK        ; Get address of stack in <HL>
  525.     SHLD    STAKAD        ; Save the address of the stack here
  526.     LHLD    DPBDRM        ; Get maximum number of entries possible in dir
  527.     INX    H        ; Add one for zero offset
  528.     INX    H        ; Then another for headroom
  529.     DAD    H        ; Double it
  530.     XCHG            ; Now put it in <DE>
  531.     LHLD    STAKAD        ; Get address of stack in <HL>
  532.     DAD    D        ; Add them together
  533.     SHLD    LSTLOC        ; Store the sum here as pointer for first entry
  534.     LHLD    DPBBLM        ; <L> = block mask, <H> = extent mask
  535.     MVI    H,0        ; Eliminate the extent mask
  536.     INX    H        ; Add for zero offset
  537.     MVI    C,007H        ; Multiplier for use in H2CPWR routine
  538.     CALL    H2CPWR        ; Multiply <HL>*<HL>, <C> times
  539.     SHLD    XTNL21
  540.     LHLD    DPBDRM        ; <HL> = number of directory entries possible
  541.     INX    H        ; Add one for zero offset
  542.     SHLD    XTNL23
  543.     MVI    C,10
  544.     LXI    H,XTNL21
  545.     CALL    A0AF2
  546.     SHLD    XTNL25
  547.     MVI    A,0FFH
  548.     LXI    H,DPBDSM    ; Point to disk storage capacity data in DPB
  549.     CALL    A0B2E
  550.     SBB    A
  551.     STA    XTNL27
  552.     RET
  553. ;.....
  554. ;
  555. ;
  556. ; Search the directory for the files specified on the command line
  557. ;
  558. SEARCH:    LXI    D,DFCB        ; Point to default file control block
  559.     MVI    C,SRFST        ; Search for first match function
  560.     CALL    BDOS        ; Get first match at 080H + 32*offset
  561.     STA    NDSRCH        ; A*32 = offset from 080H = start pos.
  562. ;
  563. ;
  564. ; Now get all the files that match our requirements written into memory
  565. ; as they come into the buffer area at 080H.
  566. ;
  567. GETONE:    LDA    NDSRCH        ; Get a directory entry in buffer at 080H + offset
  568.     CPI    0FFH        ; Did the last pass reach the end of matches
  569.     RZ            ; And done here if no more matches
  570.     LDA    NDSRCH        ; Redundant load gets last offset in <acc>
  571.     ANI    3        ; Strip all but 2l
  572.     ADD    A        ; Multiply accumulator by 32
  573.     ADD    A        ; *4
  574.     ADD    A        ; *8
  575.     ADD    A        ; *16
  576.     ADD    A        ; *32 = offset now in <A>
  577.     ADI    080H        ; Dma address + offset = true address of fn.ext
  578.     MOV    L,A        ; Put the address in <L>
  579.     MVI    H,0        ; Put 0 in <H> since we are in page 0
  580.     SHLD    BUFLOC        ; Store the buffer location here
  581.     MOV    A,M        ; Get the first byte in <A>
  582.     CPI    0E5H        ; Has it been erased?
  583.     JZ    SNEXT        ; Search for next match if so
  584.     LHLD    XTNL23        ; Else get (?) in <HL>
  585.     DCX    H        ; Decrease it one
  586.     SHLD    XTNL23        ; And put the decremented (?) back in same place
  587.     LHLD    BUFLOC        ; Get the buffer location in <HL>
  588.     MOV    B,H        ; And transfer it to <BC>
  589.     MOV    C,L
  590.     CALL    A0A59        ; (?)
  591.     RAR            ; Rotate LSB into carry
  592.     JNC    SNEXT        ; Search for next match if no carry
  593.     LXI    B,16        ; Number of bytes to move
  594.     LHLD    BUFLOC        ; Where to get them
  595.     DAD    B        ; Add the count
  596.     MOV    B,H        ; Move <HL> to <BC>
  597.     MOV    C,L        ; <BC> now = <HL>
  598.     CALL    A0A7F
  599.     LXI    B,13
  600.     PUSH    H
  601.     LHLD    LSTLOC
  602.     DAD    B
  603.     POP    B
  604.     MOV    M,C
  605.     INX    H
  606.     MOV    M,B
  607.     LHLD    XTNL0C
  608.     DAD    B
  609.     SHLD    XTNL0C
  610.     MVI    L,11
  611.     PUSH    H
  612.     LHLD    BUFLOC
  613.     INX    H
  614.     MOV    B,H
  615.     MOV    C,L
  616.     LHLD    LSTLOC
  617.     XCHG
  618.     POP    H
  619. ;
  620. A0465:    LDAX    B
  621.     STAX    D
  622.     INX    B
  623.     INX    D
  624.     DCR    L
  625.     JNZ    A0465
  626.     LHLD    BUFLOC        ; Get buffer location in <HL>
  627.     LXI    B,11        ; Number of characters in filename+ext
  628.     PUSH    H
  629.     LHLD    LSTLOC        ; Last used location in <HL>
  630.     DAD    B        ; Add 11 to last used location
  631.     POP    D
  632.     LDAX    D
  633.     MOV    M,A
  634.     LHLD    XTNL10
  635.     INX    H
  636.     SHLD    XTNL10
  637.     DAD    H
  638.     XCHG
  639.     LHLD    STAKAD        ; Get the address of the stack in <HL>
  640.     DAD    D
  641.     PUSH    H
  642.     LHLD    LSTLOC        ; Get last location used in <HL>
  643.     XCHG            ; Now in <DE>
  644.     POP    H
  645.     MOV    M,E
  646.     INX    H
  647.     MOV    M,D
  648.     LXI    D,15        ; Number of bytes in memory per filename stored
  649.     LHLD    LSTLOC        ; Last location used
  650.     DAD    D        ; Add 15 to the last location used
  651.     SHLD    LSTLOC        ; And store it for the next pass
  652. ;
  653. SNEXT:    LXI    D,0        ; Zap <DE>
  654.     MVI    C,SRNXT        ; Search for next function call
  655.     CALL    BDOS        ; Continue the search beginning at last found
  656.     STA    NDSRCH        ; Returns 0FFH if no more matches
  657.     JMP    GETONE        ; Get one (more) directory entry that matches
  658. ;....
  659. ;
  660. ;
  661. A04AA:    LXI    H,XTNL53
  662.     MVI    M,1
  663.     LXI    H,1
  664.     SHLD    XTNL56
  665.     LHLD    XTNL10
  666.     SHLD    XTNL6E
  667. ;
  668. A04BB:    XRA    A        ; Zap <A>
  669.     LXI    H,XTNL53    ; Point to (?)
  670.     CMP    M
  671.     RNC            ; Return if no carry
  672.     LHLD    XTNL53
  673.     MVI    H,0
  674.     LXI    B,XTNL54
  675.     DAD    H        ; Multiply <HL> by 2
  676.     DAD    B
  677.     MOV    E,M
  678.     INX    H
  679.     MOV    D,M
  680.     XCHG
  681.     SHLD    XTNL4B
  682.     DCX    B
  683.     LDAX    B
  684.     MOV    C,A
  685.     MVI    B,0
  686.     LXI    H,XTNL6C
  687.     DAD    B
  688.     DAD    B
  689.     MOV    E,M
  690.     INX    H
  691.     MOV    D,M
  692.     XCHG
  693.     SHLD    XTNL4D
  694.     LDA    XTNL53
  695.     DCR    A
  696.     STA    XTNL53
  697. ;
  698. A04ED:    LXI    B,XTNL4D
  699.     LXI    D,XTNL4B
  700.     CALL    CMP16B        ; 16b compare sets carry if (BC) < (DE)
  701.     JNC    A04BB
  702.     LHLD    XTNL4B
  703.     SHLD    XTNL47
  704.     LHLD    XTNL4D
  705.     SHLD    XTNL49
  706.     XCHG
  707.     LHLD    XTNL4B
  708.     DAD    D        ; Get XTNL4D + XTNL4B in <HL>
  709.     MVI    C,1
  710.     CALL    A0AF6
  711.     DAD    H
  712.     XCHG
  713.     LHLD    STAKAD
  714.     DAD    D
  715.     MOV    E,M
  716.     INX    H
  717.     MOV    D,M
  718.     XCHG
  719.     SHLD    XTNL4F
  720. ;
  721. A051C:    LXI    D,XTNL49
  722.     LXI    B,XTNL47
  723.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  724.     JC    A05C7
  725. ;
  726. A0528:    LHLD    XTNL47
  727.     DAD    H
  728.     XCHG
  729.     LHLD    STAKAD
  730.     DAD    D
  731.     MOV    C,M
  732.     INX    H
  733.     MOV    B,M
  734.     LHLD    XTNL4F
  735.     XCHG
  736.     CALL    CMPR12
  737.     CPI    0FFH
  738.     JNZ    A054A
  739.     LHLD    XTNL47
  740.     INX    H
  741.     SHLD    XTNL47
  742.     JMP    A0528        ; Loop until done
  743. ;.....
  744. ;
  745. ;
  746. A054A:    LHLD    XTNL49
  747.     DAD    H
  748.     XCHG
  749.     LHLD    STAKAD
  750.     DAD    D
  751.     MOV    E,M
  752.     INX    H
  753.     MOV    D,M
  754.     LHLD    XTNL4F
  755.     MOV    B,H
  756.     MOV    C,L
  757.     CALL    CMPR12
  758.     CPI    0FFH
  759.     JNZ    A056D
  760.     LHLD    XTNL49
  761.     DCX    H
  762.     SHLD    XTNL49
  763.     JMP    A054A        ; Loop until done
  764. ;.....
  765. ;
  766. ;
  767. A056D:    LXI    D,XTNL49
  768.     LXI    B,XTNL47
  769.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  770.     JC    A051C
  771.     LHLD    XTNL47
  772.     DAD    H
  773.     XCHG
  774.     LHLD    STAKAD
  775.     DAD    D
  776.     MOV    E,M
  777.     INX    H
  778.     MOV    D,M
  779.     XCHG
  780.     SHLD    XTNL51
  781.     LHLD    XTNL49
  782.     DAD    H
  783.     XCHG
  784.     LHLD    STAKAD
  785.     DAD    D
  786.     PUSH    H
  787.     LHLD    XTNL47
  788.     DAD    H
  789.     XCHG
  790.     LHLD    STAKAD
  791.     DAD    D
  792.     XTHL
  793.     MOV    C,M
  794.     INX    H
  795.     MOV    B,M
  796.     POP    H
  797.     MOV    M,C
  798.     INX    H
  799.     MOV    M,B
  800.     LHLD    XTNL49
  801.     DAD    H
  802.     XCHG
  803.     LHLD    STAKAD
  804.     DAD    D
  805.     PUSH    H
  806.     LHLD    XTNL51
  807.     XCHG
  808.     POP    H
  809.     MOV    M,E
  810.     INX    H
  811.     MOV    M,D
  812.     LHLD    XTNL47
  813.     INX    H
  814.     SHLD    XTNL47
  815.     LHLD    XTNL49
  816.     DCX    H
  817.     SHLD    XTNL49
  818.     JMP    A051C        ; Back to beginning of big loop
  819. ;.....
  820. ;
  821. ;
  822. A05C7:    LXI    B,XTNL4B
  823.     LXI    D,XTNL49
  824.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  825.     LXI    B,XTNL47
  826.     LXI    D,XTNL4D
  827.     PUSH    H
  828.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  829.     POP    D
  830.     CALL    A0B05
  831.     JNC    A0621
  832.     LXI    B,XTNL4D
  833.     LXI    D,XTNL47
  834.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  835.     JNC    A0618
  836.     LDA    XTNL53
  837.     INR    A
  838.     STA    XTNL53
  839.     MOV    C,A
  840.     MVI    B,0
  841.     LXI    H,XTNL54
  842.     DAD    B
  843.     DAD    B
  844.     PUSH    H
  845.     LHLD    XTNL47
  846.     XCHG
  847.     POP    H
  848.     MOV    M,E
  849.     INX    H
  850.     MOV    M,D
  851.     LHLD    XTNL53
  852.     MVI    H,0
  853.     LXI    B,XTNL6C
  854.     DAD    H
  855.     DAD    B
  856.     PUSH    H
  857.     LHLD    XTNL4D
  858.     XCHG
  859.     POP    H
  860.     MOV    M,E
  861.     INX    H
  862.     MOV    M,D
  863. ;
  864. A0618:    LHLD    XTNL49
  865.     SHLD    XTNL4D
  866.     JMP    A065E
  867. ;.....
  868. ;
  869. ;
  870. A0621:    LXI    B,XTNL49
  871.     LXI    D,XTNL4B
  872.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  873.     JNC    A0658
  874.     LDA    XTNL53
  875.     INR    A
  876.     STA    XTNL53
  877.     MOV    C,A
  878.     MVI    B,0
  879.     LXI    H,XTNL54
  880.     DAD    B
  881.     DAD    B
  882.     PUSH    H
  883.     LHLD    XTNL4B
  884.     XCHG
  885.     POP    H
  886.     MOV    M,E
  887.     INX    H
  888.     MOV    M,D
  889.     LHLD    XTNL53
  890.     MVI    H,0
  891.     LXI    B,XTNL6C
  892.     DAD    H
  893.     DAD    B
  894.     PUSH    H
  895.     LHLD    XTNL49
  896.     XCHG
  897.     POP    H
  898.     MOV    M,E
  899.     INX    H
  900.     MOV    M,D
  901. ;
  902. A0658:    LHLD    XTNL47
  903.     SHLD    XTNL4B
  904. ;
  905. A065E:    JMP    A04ED
  906. ;.....
  907. ;
  908. ;
  909. A0665:    LXI    H,0        ; Zap <HL>
  910.     SHLD    XTNL84
  911.     SHLD    XTNL86
  912. ;
  913. A066E:    LXI    B,XTNL10
  914.     LXI    D,XTNL86
  915.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  916.     JNC    A0723
  917.     LHLD    XTNL86
  918.     INX    H
  919.     SHLD    XTNL86
  920.     DAD    H
  921.     XCHG
  922.     LHLD    STAKAD
  923.     DAD    D
  924.     PUSH    H
  925.     LHLD    XTNL84
  926.     INX    H
  927.     SHLD    XTNL84
  928.     DAD    H
  929.     XCHG
  930.     LHLD    STAKAD
  931.     DAD    D
  932.     XTHL
  933.     MOV    C,M
  934.     INX    H
  935.     MOV    B,M
  936.     POP    H
  937.     MOV    M,C
  938.     INX    H
  939.     MOV    M,B
  940. ;
  941. A069D:    LXI    B,XTNL10
  942.     LXI    D,XTNL86
  943.     CALL    CMP16B        ; 16B compare sets carry if (DE) < (BC)
  944.     SBB    A
  945.     PUSH    PSW
  946.     LHLD    XTNL84
  947.     DAD    H
  948.     XCHG
  949.     LHLD    STAKAD
  950.     DAD    D
  951.     PUSH    H
  952.     LHLD    XTNL86
  953.     LXI    B,2
  954.     DAD    H
  955.     DAD    B
  956.     XCHG
  957.     LHLD    STAKAD
  958.     DAD    D
  959.     MOV    E,M
  960.     INX    H
  961.     MOV    D,M
  962.     POP    H
  963.     MOV    C,M
  964.     INX    H
  965.     MOV    B,M
  966.     CALL    CMPR12
  967.     SUI    0
  968.     SUI    1
  969.     SBB    A
  970.     POP    B
  971.     MOV    C,B
  972.     ANA    C
  973.     RAR
  974.     JNC    A066E
  975.     LHLD    XTNL86
  976.     INX    H
  977.     SHLD    XTNL86
  978.     DAD    H
  979.     XCHG
  980.     LHLD    STAKAD
  981.     DAD    D
  982.     MOV    E,M
  983.     INX    H
  984.     MOV    D,M
  985.     XCHG
  986.     SHLD    LSTLOC
  987.     LXI    B,13
  988.     LHLD    LSTLOC
  989.     DAD    B
  990.     MOV    E,M
  991.     INX    H
  992.     MOV    D,M
  993.     XCHG
  994.     SHLD    XTNL88
  995.     LHLD    XTNL84
  996.     DAD    H
  997.     XCHG
  998.     LHLD    STAKAD
  999.     DAD    D
  1000.     MOV    E,M
  1001.     INX    H
  1002.     MOV    D,M
  1003.     XCHG
  1004.     SHLD    LSTLOC
  1005.     LHLD    LSTLOC
  1006.     DAD    B
  1007.     LXI    D,XTNL88
  1008.     CALL    A0AAA
  1009.     LXI    B,13
  1010.     PUSH    H
  1011.     LHLD    LSTLOC
  1012.     DAD    B
  1013.     POP    B
  1014.     MOV    M,C
  1015.     INX    H
  1016.     MOV    M,B
  1017.     JMP    A069D        ; Loop until done
  1018. ;.....
  1019. ;
  1020. ;
  1021. A0723:    LHLD    XTNL84
  1022.     SHLD    XTNL0E
  1023.     RET
  1024. ;.....
  1025. ;
  1026. ;
  1027. A072A:    LXI    H,XTNL8B
  1028.     MOV    M,B
  1029.     DCX    H
  1030.     MOV    M,C
  1031.     LHLD    XTNL8A
  1032.     DAD    H
  1033.     XCHG
  1034.     LHLD    STAKAD
  1035.     DAD    D
  1036.     MOV    E,M
  1037.     INX    H
  1038.     MOV    D,M
  1039.     XCHG
  1040.     SHLD    LSTLOC
  1041.     LXI    H,XTNL8C
  1042.     MVI    M,0
  1043. ;
  1044. A0745:    MVI    A,10
  1045.     LXI    H,XTNL8C
  1046.     CMP    M
  1047.     JC    A0769        ; Send filesize when done here
  1048.     LHLD    XTNL8C
  1049.     MVI    H,0
  1050.     XCHG
  1051.     LHLD    LSTLOC
  1052.     DAD    D
  1053.     MOV    C,M        ; Character in <C> for output
  1054.     CALL    CHROUT        ; Send a character & hilite if necessary
  1055.     LDA    XTNL8C
  1056.     INR    A
  1057.     STA    XTNL8C
  1058.     CPI    8
  1059.     JNZ    A0745        ; Loop until done
  1060. ;;;
  1061. ;;;  MVI C,' '            ; *** (PUT A SPACE IF PREFERRED)
  1062.     MVI    C,'.'        ; *** (PERIOD BETWEEN FILENAMD AND EXT.)
  1063. ;;;
  1064.     CALL    CHROUT
  1065.     JMP    A0745
  1066. ;.....
  1067. ;
  1068. ;
  1069. ; See if using 'compressed', if not, compute and show file size.
  1070. ;
  1071. A0769:    LDA    CFLAG        ; Get compressed size flag in <A>
  1072.     CMA            ; Complement the bits in <A>
  1073.     RAR            ; Rotate <A> thru carry
  1074.     RNC            ; Skip if flag was false
  1075. ;
  1076.     LXI    B,13        ; 13 bytes used if "C" option
  1077.     LHLD    LSTLOC        ; Get the last address used in <HL>
  1078.     DAD    B        ; Add 13 to it
  1079.     MOV    E,M
  1080.     INX    H
  1081.     MOV    D,M
  1082.     LHLD    XTNL25        ; Get filesize
  1083.     CALL    A0AD4
  1084.     MOV    B,H
  1085.     MOV    C,L
  1086.     MVI    E,4        ; *** filesize, plus leading spaces
  1087.     CALL    A0B66        ; Compute and display the filesize
  1088.     MVI    C,'k'        ; Tag the filesize with "k"
  1089.     CALL    F2OUT        ; Send it to the console device
  1090.     LDA    EFLAG        ; Want extended display?
  1091.     RAR            ; Carry set if flag is YES
  1092.     RNC            ; Skip the listing if flag was false
  1093.     LXI    B,11        ; 11th byte is dir/sys status byte
  1094.     LHLD    LSTLOC        ; Get filename pointer in <HL>
  1095.     DAD    B        ; Add offset to get dir/sys status
  1096.     MOV    C,M        ; Get status byte in <C>
  1097.     MVI    B,0        ; Zap <B>
  1098.     MVI    E,3
  1099.     CALL    A0B66        ; Compute and display dir/sys status
  1100.     CALL    SPACE1        ; Insert a space in display
  1101.     LXI    B,3        ; User archive bit (4th char. in name)
  1102.     LHLD    LSTLOC        ; Address at start of filename
  1103.     DAD    B        ; Index into the name for archive bit
  1104.     MOV    A,M        ; Get the character there
  1105.     CPI    80H        ; See if high bit is set
  1106.     JC    NOTAA        ; If not, this file not archived
  1107. ;
  1108. SENDA:    MVI    C,'A'        ; Else show it is archived
  1109.     CALL    F2OUT
  1110.     JMP    NOTDR        ; Skip the DRI archive check
  1111. ;
  1112. NOTAA:    LXI    B,10        ; Special DRI archive byte, end of extent
  1113.     LHLD    LSTLOC        ; Start of filename
  1114.     DAD    B        ; Index into filename to end of extent
  1115.     MOV    A,M        ; Get the character at end of extent
  1116.     CPI    80H        ; See if the high bit is set
  1117.     JNC    SENDA        ; If yes, display it
  1118.     CALL    SPACE1        ; Else put a blank for archive display
  1119. ;
  1120. NOTDR:    LXI    B,8        ; Count in <C> = 8
  1121.     LHLD    LSTLOC        ; Get base address of filename
  1122.     DAD    B        ; Add offset to filetype
  1123.     PUSH    H
  1124.     MOV    A,M        ; Get first byte of extent in <A>
  1125.     CPI    80H        ; Check for R/O status
  1126.     JC    NOTRR        ; Skip - not R/O file
  1127.     MVI    C,'R'        ; R/O indicator
  1128.     CALL    F2OUT        ; Send indicator
  1129.     JMP    A07BE        ; Do next
  1130. ;
  1131. NOTRR:    CALL    SPACE1
  1132. ;
  1133. A07BE:    POP    H        ; Get address of R/O byte in extent back
  1134.     INX    H        ; Next byte is the system flag byte
  1135.     MOV    A,M        ; Get the byte in <A>
  1136.     CPI    080H        ; Check for system file
  1137.     MVI    C,'S'        ; System file, put "S" on screen too
  1138.     JNC    F2OUT
  1139.     JMP    SPACE1        ; Send space if not system file, done
  1140. ;.....
  1141. ;
  1142. ;
  1143. SIGNON:    LDA    VFLAG        ; Want to show the version number?
  1144.     ORA    A
  1145.     LXI    B,VERMSG
  1146.     CNZ    SNDCON
  1147.     LDA    PFLAG        ; Get the printer flag byte
  1148.     INR    A        ; Set appropriate cpu flags
  1149.     JZ    SKPSIN        ; Skip the cursor controls if printer on
  1150. ;
  1151.      IF    VIDEO
  1152.     LXI    B,TRMINI    ; Point to user terminal initialization string
  1153.     CALL    SNDCON
  1154.     LXI    B,CRSRUP    ; Move cursor up one line
  1155.     CALL    SNDCON
  1156.     LXI    B,CLREOL    ; Clear the line
  1157.     CALL    SNDCON
  1158.     LXI    B,CRSRUP    ; Move cursor up one line
  1159.     CALL    SNDCON
  1160.     LXI    B,CLREOL    ; Clear the line
  1161.     CALL    SNDCON
  1162.      ENDIF            ; VIDEO
  1163. ;
  1164. SKPSIN:    DCX    B        ; Back up the pointer to the <lf>
  1165.     DCX    B        ; Then to the <cr> at end of message
  1166.     STAX    B        ; And stop the crlf output there
  1167.     LXI    H,ROWCNT    ; Point to present row number count byte
  1168.     MVI    M,1        ; Make this the first row
  1169. ;
  1170. HEADER:    LDA    NUMROW        ; Number of rows per line
  1171.     LXI    H,ROWCNT    ; Row number count
  1172.     CMP    M        ; Carry set if NUMROW < current number
  1173.     JC    A0827        ;
  1174.     LDA    CFLAG        ; Get compressed size flag
  1175.     CMA            ; Invert it
  1176.     RAR            ; Rotate through carry
  1177.     JNC    ADD3SP        ; Skip if flag was set YES to suppress
  1178. ;
  1179. ADD3SP:    LXI    H,NUMROW    ; Number of rows per line
  1180.     LDA    ROWCNT        ; Row count totalizer byte
  1181.     CMP    M        ; Carry set if this is not the last row
  1182.     JNC    BMPCNC        ; Skip sending 3 spaces if last row
  1183.     LXI    B,SPCS3M    ; Send 3 spaces
  1184.     CALL    SNDMSG        ; This call does it
  1185. ;
  1186. BMPCNC:    LDA    ROWCNT        ; Get current row number count
  1187.     INR    A        ; Bump it
  1188.     STA    ROWCNT        ; Store the incremented count
  1189.     JNZ    HEADER        ; Loop until done
  1190. ;
  1191. A0827:    LHLD    XTNL0E
  1192.     SHLD    XTNL95
  1193.     LXI    H,1
  1194.     SHLD    XTNL91
  1195. ;
  1196. A0833:    XRA    A        ; Zap <A>
  1197.     LXI    H,XTNL95
  1198.     CALL    A0B2E
  1199.     RNC            ; Done here if no carry
  1200.     LHLD    XTNL95
  1201.     XCHG
  1202.     LHLD    NUMROW        ; Number of rows per line
  1203.     MVI    H,0        ; Make sure not more that 255 rows
  1204.     CALL    A0AB5
  1205.     XCHG
  1206.     SHLD    LINECT        ; Store the line count
  1207.     LHLD    XTNL95
  1208.     XCHG
  1209.     LHLD    NUMROW        ; Number of rows per line
  1210.     MVI    H,0        ; Make sure not more than 255
  1211.     CALL    A0AB5
  1212.     XRA    A        ; Zap <A>
  1213.     CALL    A0B02
  1214.     ORA    L        ; Are we done?
  1215.     JZ    A086A
  1216.     LHLD    LINECT        ; Get line count in <HL>
  1217.     INX    H        ; Bump the count
  1218.     SHLD    LINECT        ; And put it back
  1219. ;
  1220. A086A:    LHLD    HEIGHT        ; Get number of lines per screen
  1221.     MOV    B,H        ; Put high order byte in <B>
  1222.     MOV    C,L        ; Put low order byte in <C>
  1223.     LHLD    LINECT        ; Get current line count in <HL>
  1224.     XCHG            ; Then put line count in <DE>
  1225.     CALL    A0256
  1226.     SHLD    LINECT        ; Store the line count
  1227.     LXI    H,0
  1228.     SHLD    XTNL8D        ; Make zero for fresh start
  1229.  
  1230. A087F:    LXI    B,LINECT    ; Point to current screen line number
  1231.     LXI    D,XTNL8D
  1232.     CALL    CMP16B        ; 16B compare returns carry if (BC)=(DE)
  1233.     JNC    A08FA
  1234.     CALL    CRLF        ; Send CRLF at end of line
  1235.     LXI    H,0        ; Zap <HL>
  1236.     SHLD    XTNL8F
  1237.     MOV    A,L
  1238.     STA    ROWCNT        ; Restore present row count to 0
  1239. ;
  1240. A0898:    LDA    ROWCNT        ; Get present row count in <A>
  1241.     INR    A        ; Bump it up one
  1242.     STA    ROWCNT        ; Store the incremented number
  1243.     MOV    C,A        ; Now put it in <C> for comparison
  1244.     LDA    NUMROW        ; Number of rows per line
  1245.     CMP    C        ; Compare, carry set if not done
  1246.     JC    A08F0        ; Bump the pointers and loop until done
  1247.     LHLD    XTNL8F
  1248.     XCHG
  1249.     LHLD    XTNL8D
  1250.     DAD    D
  1251.     PUSH    H
  1252.     LHLD    XTNL91
  1253.     POP    B
  1254.     DAD    B
  1255.     SHLD    XTNL93
  1256.     LXI    D,XTNL0E
  1257.     LXI    B,XTNL93
  1258.     CALL    CMP16B        ; 16B compare sets carry if (BC) < (DE)
  1259.     JC    A08E2
  1260.     MVI    A,1
  1261.     LXI    H,ROWCNT    ; Point to present row count
  1262.     CMP    M        ; Set carry if more rows to follow
  1263.     JNC    A08D3
  1264.     LXI    B,CDELIM    ; Row delimiter = ":" in <C>
  1265.     CALL    SNDMSG        ; Show it to user on console
  1266. ;
  1267. A08D3:    LHLD    XTNL93
  1268.     MOV    B,H
  1269.     MOV    C,L
  1270.     CALL    A072A
  1271.     LHLD    XTNL95
  1272.     DCX    H
  1273.     SHLD    XTNL95
  1274. ;
  1275. A08E2:    LHLD    LINECT        ; Line count in <HL>
  1276.     XCHG            ; Put it in <DE>
  1277.     LHLD    XTNL8F
  1278.     DAD    D
  1279.     SHLD    XTNL8F
  1280.     JMP    A0898
  1281. ;
  1282. A08F0:    LHLD    XTNL8D
  1283.     INX    H
  1284.     SHLD    XTNL8D
  1285.     JMP    A087F
  1286. ;
  1287. A08FA:    LHLD    NUMROW        ; Number of rows per line into <HL>
  1288.     MVI    H,0        ; Make sure not more that 255
  1289.     XCHG            ; Row count in <E>
  1290.     LHLD    LINECT        ; Get line count in <HL>
  1291.     CALL    A0AD4
  1292.     XCHG
  1293.     LHLD    XTNL91
  1294.     DAD    D
  1295.     SHLD    XTNL91
  1296.     CALL    PAGECK        ; Check for full screen or page
  1297.     JMP    A0833
  1298. ;
  1299. SUMMRY:    LHLD    DPBDSM        ; Get maximum disk storage capacity in <HL>
  1300.     INX    H        ; Add one for the zero offset
  1301.     SHLD    XTNL9E        ; Save as maximum capacity
  1302.     SHLD    XTNLA0
  1303.     SHLD    XTNLA2
  1304.     LHLD    DPBAL0        ; Get alloc vect 0 in <L> alloc vector 1 in <h>
  1305.     SHLD    XTNL9C        ; Store the space used data
  1306. ;
  1307. A0928:    XRA    A        ; Zap <A>
  1308.     LXI    D,XTNL9C    ; Point to the drive space used data
  1309.     CALL    A0B23
  1310.     ORA    L
  1311.     JZ    A0952        ; Calculate space remaining, display
  1312.     LDA    XTNL9C
  1313.     RAR
  1314.     JNC    A0942
  1315.     LHLD    XTNL9E
  1316.     DCX    H
  1317.     SHLD    XTNL9E
  1318. ;
  1319. A0942:    MVI    C,1
  1320.     LXI    H,XTNL9C
  1321.     CALL    A0AF2
  1322.     XCHG
  1323.     DCX    H
  1324.     MOV    M,E
  1325.     INX    H
  1326.     MOV    M,D
  1327.     JMP    A0928
  1328. ;.....
  1329. ;
  1330. ;
  1331. ; Calculates disk space remaining, check first if CP/M 3.0
  1332. ;
  1333. A0952:    MVI    C,CPMVER    ; Check version #
  1334.     CALL    BDOS
  1335.     MOV    A,L
  1336.     CPI    30H        ; Version 3.0?
  1337.     JC    A0955        ; Use normal method if not CP/M+
  1338. ;
  1339.     POP    H        ; Remove "call CKCPM3" from stack
  1340.     MVI    C,CURDSK
  1341.     CALL    BDOS
  1342.     MOV    E,A
  1343.     MVI    C,46        ; CP/M+ compute free space call
  1344.     CALL    BDOS
  1345.     MVI    C,3        ; Answer is 3 bytes long (24 bits)
  1346. ;
  1347. A0953:    LXI    H,TBUF+2    ; Answer is located here
  1348.     MVI    B,3        ; Convert to 'k' length
  1349.     ORA    A
  1350. ;
  1351. A0954:    MOV    A,M
  1352.     RAR
  1353.     MOV    M,A
  1354.     DCX    H
  1355.     DCR    B
  1356.     JNZ    A0954        ; Loop for 3 bytes
  1357.     DCR    C
  1358.     JNZ    A0953        ; Shift 3 times
  1359.     LHLD    TBUF        ; Get result in 'k'
  1360.     JMP    A0961        ; Display result
  1361. ;.....
  1362. ;
  1363. ;
  1364. A0955:    MVI    C,PARMS        ; Current disk parameter block
  1365.     CALL    BDOS
  1366.     INX    H
  1367.     INX    H
  1368.     MOV    A,M        ; Get block shift factor
  1369.     STA    A0964
  1370.     INX    H        ; Bump to block mask
  1371.     MOV    A,M        ; Get it
  1372.     STA    A0963
  1373.     INX    H
  1374.     INX    H
  1375.     MOV    E,M        ; Get maximum block number
  1376.     INX    H
  1377.     MOV    D,M
  1378.     XCHG
  1379.     SHLD    A0962        ; Put it away
  1380.     MVI    C,GETADR    ; Address of CP/M allocation vector
  1381.     CALL    BDOS
  1382.     XCHG            ; Get its length
  1383.     LHLD    A0962
  1384.     INX    H
  1385.     LXI    B,0        ; Initialize block count to zero
  1386. ;
  1387. A0956:    PUSH    D        ; Save allocation address
  1388.     LDAX    D
  1389.     MVI    E,8        ; Set to process 8 blocks
  1390. ;
  1391. A0957:    RAL            ; Test bit
  1392.     JC    A0958
  1393.     INX    B
  1394. ;
  1395. A0958:    MOV    D,A        ; Save bits
  1396.     DCX    H
  1397.     MOV    A,L
  1398.     ORA    H
  1399.     JZ    A0959        ; Quit if out of blocks
  1400.     MOV    A,D        ; Restore bits
  1401.     DCR    E        ; Count down 8 bits
  1402.     JNZ    A0957        ; Do another bit
  1403.     POP    D        ; Next count of allocation vector
  1404.     INX    D
  1405.     JMP    A0956        ; Process it
  1406. ;
  1407. A0959:    POP    D        ; Clear alloc vector pointer from stack
  1408.     MOV    L,C        ; Copy block to HL
  1409.     MOV    H,B
  1410.     LDA    A0964        ; Get block shift factor
  1411.     SUI    3        ; Convert from records to thousands (k)
  1412.     JZ    A0961        ; Skip shifts if 1k blocks
  1413. ;
  1414. A0960:    DAD    H        ; Multiply blocks by 'k' per block
  1415.     DCR    A
  1416.     JNZ    A0960
  1417. ;
  1418.  
  1419. A0961:    SHLD    XTNLA0
  1420.     JMP    A09B6
  1421. ;.....
  1422. ;
  1423. ;
  1424. ; Uninitialized storage
  1425. ;
  1426. A0962:    DB    0,0        ; Highest block number on drive
  1427. A0963:    DB    0        ; Rec/blk - 1
  1428. A0964:    DB    0        ; # of shifts to multiply by rec/blk
  1429. ;.....
  1430. ;
  1431. ;
  1432. A09B6:    CALL    CRLF
  1433.     CALL    CRLF
  1434.     LHLD    LINECT        ; Get the line count for the printer
  1435.     INX    H
  1436.     SHLD    LINECT        ; Increment it for this new line
  1437.     CALL    QUIT        ; Want to quit now?
  1438.     LXI    D,0
  1439.     MVI    C,CURDSK    ; Get current disk function call
  1440.     CALL    BDOS        ; Get it with BDOS call
  1441.     ADI    'A'        ; Make it ASCII
  1442.     MOV    C,A        ; F2OUT expects character in <C>
  1443.     CALL    F2OUT        ; Send the drive code
  1444.     MVI    C,':'        ; ASCII colon in <C>
  1445.     CALL    F2OUT        ; Send colon following drive code
  1446.     MVI    C,' '        ; Space after the colon
  1447.     CALL    F2OUT
  1448. ;
  1449.     LHLD    XTNL9E
  1450.     XCHG
  1451.     LHLD    XTNL25
  1452.     CALL    A0AD4        ; Compute total capacity of drive
  1453.     MOV    B,H
  1454.     MOV    C,L
  1455.     MVI    E,1
  1456.     CALL    A0B66
  1457.     LXI    B,TCAPM        ; Total capacity in k
  1458.     CALL    SNDMSG
  1459.     LXI    B,USEDM
  1460.     CALL    SNDMSG
  1461. ;
  1462.     LHLD    XTNL0E
  1463.     MOV    B,H
  1464.     MOV    C,L
  1465.     MVI    E,1
  1466.     CALL    A0B66        ; Compute number of files on disk
  1467.     LXI    B,FILESM    ; Total files
  1468.     CALL    SNDMSG
  1469. ;
  1470.     LHLD    XTNL0C
  1471.     XCHG
  1472.     LHLD    XTNL25
  1473.     CALL    A0AD4        ; Compute amount of space used
  1474.     MOV    B,H
  1475.     MOV    C,L
  1476.     MVI    E,001H
  1477.     CALL    A0B66
  1478.     LXI    B,KOFMSG
  1479.     CALL    SNDMSG
  1480. ;
  1481.     LHLD    XTNL23        ; Get number of entries remaining <HL>
  1482.     MOV    B,H        ; Move <HL> to <BC>
  1483.     MOV    C,L        ; Complete the above move
  1484.     MVI    E,1
  1485.     CALL    A0B66        ; Send the number remaining
  1486.     MVI    C,'/'
  1487.     CALL    F2OUT
  1488. ;
  1489.     LHLD    XTNLA0        ; Get space remaining in HL
  1490.     MOV    B,H        ; Put into BC
  1491.     MOV    C,L
  1492.     MVI    E,001H        ; Offset
  1493.     CALL    A0B66        ; Send remaining space figures
  1494.     MVI    C,'k'
  1495.     CALL    F2OUT
  1496.     CALL    CRLF
  1497. ;
  1498.     CALL    PAGECK        ; Check for full screen (or page)
  1499. ;
  1500.      IF    VIDEO
  1501.     LXI    B,TRMUNI    ; Point to user terminal restoration string
  1502.     CALL    SNDCON        ; Send exit de-initialization if installed
  1503.      ENDIF            ; VIDEO
  1504. ;
  1505.     RET
  1506. ;.....
  1507. ;
  1508. ;
  1509. ; Compare 12 characters (user area, filename, ext.)
  1510. ;
  1511. CMPR12:    MVI    L,12        ; Load character count
  1512. ;
  1513. CMPRLP:    LDAX    D        ; Get byte in <A>
  1514.     ANI    07FH        ; Strip the parity if set
  1515.     MOV    H,A        ; Save stripped byte in <H>
  1516.     LDAX    B        ; Get a byte in <A>
  1517.     ANI    07FH        ; Strip this one too
  1518.     SUB    H        ; 0 if equal
  1519.     JNZ    DIFF12        ; Jump if they are not equal
  1520.     INX    D        ; Equal, bump the pointers
  1521.     INX    B        ; Bump both pointers
  1522.     DCR    L        ; Reduce the count
  1523.     JNZ    CMPRLP        ; Loop until done
  1524.     RET
  1525. ;...
  1526. ;
  1527. ;
  1528. DIFF12:    MVI    A,0FFH        ; Set flag for return if (DE) > (BC)
  1529.     RC            ; <DE> is larger
  1530.     MVI    A,1        ; Else flag shows <DE> is smaller than <BC>
  1531.     RET            ; And done here
  1532. ;.....
  1533. ;
  1534. ;
  1535. ; Check for match in INTFCB parms with user number
  1536. ;
  1537. A0A59:    LXI    H,INTFCB    ; Get address of first byte of search parms
  1538.     MVI    E,12        ; 12 bytes to check
  1539. ;
  1540. A0A5E:    MOV    A,M        ; Get drive/user code in <A>
  1541.     CPI    '?'        ; Wildcard?
  1542.     JZ    A0A6C        ; Yes, search all user areas
  1543.     MOV    D,A        ; Get user area in <D>
  1544.     LDAX    B        ; Get user area from immediate filename
  1545.     ANI    07FH        ; Strip the high bit if set
  1546.     CMP    D        ; Are they equal?
  1547.     MVI    A,0        ; Zap <A>, cannot use  XRA A  here
  1548.     RNZ            ; Not same, no match, check no further
  1549. ;
  1550. ;
  1551. ; Arrive here if we have match or all user areas to be shown
  1552. ;
  1553. A0A6C:    INX    B        ; Bump the filename pointer
  1554.     INX    H        ; Bump the memory pointer too
  1555.     DCR    E        ; One less byte to go
  1556.     JNZ    A0A5E        ; Loop until done
  1557.     LDA    SFLAG        ; Get system flag in <A>
  1558.     ORA    A        ; Set the appropriate cpu flags
  1559.     RNZ            ; Return if system flag is true
  1560.     DCX    B        ; Back up the pointer
  1561.     DCX    B        ; Pointer set to 2nd extent byte
  1562.     LDAX    B        ; Get it in the <A>
  1563.     CMA            ; Set carry if system file
  1564.     RLC            ; Rotate carry into bit 0 position
  1565.     ANI    1        ; Isolate bit 0
  1566.     RET            ; Return 0 if dir file or 1 if system
  1567. ;.....
  1568. ;
  1569. ;
  1570. A0A7F:    LXI    H,0        ; Zap <HL
  1571.     LDA    XTNL27        ; Get (???)
  1572.     ORA    A        ; Align flags properly
  1573.     JNZ    A0A97
  1574.     MVI    E,16        ; Byte count in <E>
  1575. ;
  1576. A0A8B:    LDAX    B
  1577.     ORA    A
  1578.     JZ    A0A91
  1579.     INX    H
  1580. ;
  1581. A0A91:    INX    B
  1582.     DCR    E
  1583.     JNZ    A0A8B
  1584.     RET
  1585. ;.....
  1586. ;
  1587. ;
  1588. A0A97:    MVI    E,008H
  1589. ;
  1590. A0A99:    LDAX    B
  1591.     MOV    D,A
  1592.     INX    B
  1593.     LDAX    B
  1594.     ORA    D
  1595.     JZ    A0AA2
  1596.     INX    H
  1597. ;
  1598. A0AA2:    INX    B
  1599.     DCR    E
  1600.     JNZ    A0A99
  1601.     RET
  1602. ;.....
  1603. ;
  1604. ;
  1605. A0AAA:    MOV    C,M
  1606.     INX    H
  1607.     MOV    B,M
  1608.     LDAX    D
  1609.     ADD    C
  1610.     MOV    L,A
  1611.     INX    D
  1612.     LDAX    D
  1613.     ADC    B
  1614.     MOV    H,A
  1615.     RET
  1616. ;.....
  1617. ;
  1618. ;
  1619. A0AB5:    MOV    B,H
  1620.     MOV    C,L
  1621.     LXI    H,0
  1622.     MVI    A,16
  1623. ;
  1624. A0ABC:    PUSH    PSW
  1625.     DAD    H
  1626.     XCHG
  1627.     SUB    A
  1628.     DAD    H
  1629.     XCHG
  1630.     ADC    L
  1631.     SUB    C
  1632.     MOV    L,A
  1633.     MOV    A,H
  1634.     SBB    B
  1635.     MOV    H,A
  1636.     INX    D
  1637.     JNC    A0ACE
  1638.     DAD    B
  1639.     DCX    D
  1640. ;
  1641. A0ACE:    POP    PSW
  1642.     DCR    A
  1643.     JNZ    A0ABC
  1644.     RET
  1645. ;.....
  1646. ;
  1647. ;
  1648. A0AD4:    MOV    B,H
  1649.     MOV    C,L
  1650.     LXI    H,0
  1651.     MVI    A,16
  1652. ;
  1653. A0ADB:    DAD    H
  1654.     XCHG
  1655.     DAD    H
  1656.     XCHG
  1657.     JNC    A0AE3
  1658.     DAD    B
  1659. ;
  1660. A0AE3:    DCR    A
  1661.     JNZ    A0ADB
  1662.     RET
  1663. ;.....
  1664. ;
  1665. ;
  1666. ; Raise the count in <HL> to the power of number in <C>
  1667. ;
  1668. H2CPWR:    DAD    H        ; Double <HL>
  1669.     DCR    C        ; Reduce the count
  1670.     JNZ    H2CPWR        ; Loop until done
  1671.     RET
  1672. ;.....
  1673. ;
  1674. ;
  1675. A0AF2:    MOV    E,M
  1676.     INX    H
  1677.     MOV    D,M
  1678.     XCHG
  1679. ;
  1680. A0AF6:    MOV    A,H
  1681.     ORA    A
  1682.     RAR
  1683.     MOV    H,A
  1684.     MOV    A,L
  1685.     RAR
  1686.     MOV    L,A
  1687.     DCR    C
  1688.     JNZ    A0AF6
  1689.     RET
  1690. ;.....
  1691. ;
  1692. ;
  1693. A0B02:    MOV    E,A
  1694.     MVI    D,0
  1695. ;
  1696. A0B05:    MOV    A,E
  1697.     SUB    L
  1698.     MOV    L,A
  1699.     MOV    A,D
  1700.     SBB    H
  1701.     MOV    H,A
  1702.     RET
  1703. ;.....
  1704. ;
  1705. ;
  1706. A0B0C:    MOV    C,A
  1707.     MVI    B,0
  1708.     MOV    A,E
  1709.     SUB    C
  1710.     MOV    L,A
  1711.     MOV    A,D
  1712.     SBB    B
  1713.     MOV    H,A
  1714.     RET
  1715. ;.....
  1716. ;
  1717. ;
  1718. ; 16 bit comparison routine.  At entry <BC> points to memory address
  1719. ; of the high limit and <DE> points to memory address of the present
  1720. ; count to be checked.    Returns with two's complement of the actual
  1721. ; difference in <HL>, carry flag is set if memory at <BC> is greater
  1722. ; than that at <DE>, zero flag if difference is zero, <A> contains
  1723. ; low order two's complement (<A> = <L>.
  1724. ;
  1725. CMP16B:    MOV    L,C        ; Move low order of count address to <L>
  1726.     MOV    H,B        ; Move high order of count address to <H>
  1727.     MOV    C,M        ; Move the low order count limit into <C>
  1728.     INX    H        ; Point to high order of count limit
  1729.     MOV    B,M        ; <BC> contains 16 bit count limit
  1730.     LDAX    D        ; Get the low order present count in <acc>
  1731.     SUB    C        ; Subtract high limit from present count
  1732.     MOV    L,A        ; Move the remainder to <L>
  1733.     INX    D        ; Point to high order of 16 bit present count
  1734.     LDAX    D        ; Move high order bits of present ct to <A>
  1735.     SBB    B        ; Subtract high limit from present
  1736.     MOV    H,A        ; <HL> contains difference, <A> = <L>
  1737.     RET
  1738. ;.....
  1739. ;
  1740. ;
  1741. A0B23:    MOV    L,A
  1742.     MVI    H,0
  1743.     LDAX    D        ; Get ? from memory at <DE>
  1744.     SUB    L
  1745.     MOV    L,A
  1746.     INX    D
  1747.     LDAX    D        ; Get next ? from memory
  1748.     SBB    H
  1749.     MOV    H,A
  1750.     RET
  1751. ;.....
  1752. ;
  1753. ;
  1754. A0B2E:    MOV    E,A
  1755.     MVI    D,0
  1756.     MOV    A,E
  1757.     SUB    M
  1758.     MOV    E,A
  1759.     MOV    A,D
  1760.     INX    H
  1761.     SBB    M
  1762.     MOV    D,A
  1763.     XCHG
  1764.     RET
  1765. ;.....
  1766. ;
  1767. ;
  1768. HILITE:    PUSH    B        ; Save pointer
  1769. ;
  1770.      IF    VIDEO
  1771.     LXI    B,FGNDON    ; Point to foreground on string
  1772.     CALL    SNDCON        ; Send the string
  1773.      ENDIF            ; VIDEO
  1774. ;
  1775.     POP    B        ; Recover pointer
  1776.     LDAX    B        ; Get the character
  1777.     INX    B        ; Bump the pointer
  1778.     PUSH    B        ; And save again
  1779.     ANI    07FH        ; Clear the high bit
  1780.     MOV    C,A        ; In <C> for output
  1781.     CALL    F2OUT        ; Send character
  1782. ;
  1783.      IF    VIDEO
  1784.     LXI    B,FGNDOF    ; Point to foreground off string
  1785.     CALL    SNDCON        ; Send the turn off code
  1786.      ENDIF            ; VIDEO
  1787. ;
  1788.     POP    B        ; Recover the pointer
  1789. ;
  1790. SNDMSG:    LDAX    B        ; Get byte of message in <A>
  1791.     CPI    80H        ; High bit set?
  1792.     JNC    HILITE        ; Show it highlited if so
  1793.     ORA    A        ; Are we done yet?
  1794.     RZ            ; Return if so
  1795. ;
  1796.     PUSH    B        ; Else save <BC>
  1797.     MOV    C,A        ; Put the character in <C> for F2OUT
  1798.     CALL    F2OUT        ; Send a character
  1799.     POP    B        ; Get address back
  1800.     INX    B        ; Bump the pointer
  1801.     JMP    SNDMSG        ; Loop until done
  1802. ;.....
  1803. ;
  1804. ;
  1805. ; Send "FGNDON" to console, send one character after stripping the
  1806. ; high bit, then send "FGNDOF" to return to normal attributes
  1807. ;
  1808. CHROUT:    MOV    A,C        ; Get character in <A> for testing
  1809.     CPI    080H        ; Is bit 7 high?
  1810.     JC    F2OUT        ; No, use F2OUT routine
  1811.     ANI    7FH        ; Now strip the high bit
  1812.     MOV    C,A        ; And put in <C>
  1813. ;
  1814.      IF    VIDEO
  1815.     PUSH    B        ; Alt. entry point for printer code output
  1816.     LXI    B,FGNDON    ; Point to foreground "ON" escape sequence
  1817.     CALL    SNDCON        ; Sent the escape sequence to the console
  1818.     POP    B        ; Recover character in <c>
  1819.      ENDIF            ; VIDEO
  1820. ;
  1821.     CALL    F2OUT        ; Send the character
  1822. ;
  1823.      IF    VIDEO
  1824.     LXI    B,FGNDOF
  1825.     CALL    SNDCON
  1826.      ENDIF            ; VIDEO
  1827. ;
  1828.     RET
  1829. ;.....
  1830. ;
  1831. ;
  1832. ; Send a string to the console only. Does not go to disk file or list
  1833. ; device (printer)
  1834. ;
  1835. SNDCON:    LDAX    B        ; Get character in <A>
  1836.     ORA    A        ; Are we done?
  1837.     RZ            ; Return if done
  1838.     PUSH    B        ; Save pointer
  1839.     MOV    E,A        ; Character to <E> for console output
  1840.     MVI    C,2        ; Console output function
  1841. ;
  1842. SNDC1:    CALL    $-$        ; Address provided at initialization
  1843.     POP    B        ; Recover pointer
  1844.     INX    B        ; Increment to next character
  1845.     JMP    SNDCON        ; And loop until done
  1846. ;.....
  1847. ;
  1848. ;
  1849. ; CP/M function 2 (console output)
  1850. ;
  1851. F2OUT:    MOV    E,C        ; Move character from <C> to <E>
  1852.     PUSH    D        ; Store the <E> value
  1853.     MVI    C,WRCON        ; Console output function
  1854.     CALL    BDOS
  1855.     POP    D        ; Get character in <E> back again
  1856.     LDA    PFLAG        ; Printing also?
  1857.     ORA    A
  1858.     JZ    QUIT
  1859.     MVI    C,5        ; If yes, send character to printer
  1860.     CALL    BDOS
  1861.     JMP    QUIT        ; Want to quit now?
  1862. ;.....
  1863. ;
  1864. ;
  1865. ; See if operator has typed CTL-C to quit if yes, delete partial file
  1866. ;
  1867. QUIT:    PUSH    H
  1868.     PUSH    D
  1869.     PUSH    B
  1870.     MVI    C,CONST        ; Get keyboard status
  1871.     CALL    BDOS
  1872.     RAR            ; Anything typed?
  1873.     JNC    QUIT2        ; If not, back to work
  1874.     MVI    C,RDCON        ; Otherwise get the character
  1875.     CALL    BDOS
  1876.     CPI    'C'-40H        ; "CTL-C" to quit
  1877.     JZ    QUIT1
  1878.     CPI    'X'-40H        ; "CTL-X" to quit
  1879.     JZ    QUIT1
  1880.     ANI    5FH        ; Change to upper-case if needed
  1881.     CPI    'K'
  1882.     JZ    QUIT1
  1883.     CPI    'X'
  1884.     JNZ    QUIT2        ; If neither, back to work
  1885. ;
  1886. QUIT1:    POP    B        ; Restore the stack
  1887.     POP    D
  1888.     POP    H
  1889.     POP    H        ; Remove 'call quit' from stack
  1890.     JMP    EXIT
  1891. ;
  1892. QUIT2:    POP    B        ; Restore the stack
  1893.     POP    D
  1894.     POP    H
  1895.     RET
  1896. ;.....
  1897. ;
  1898. ;
  1899. ; Arrive here with source location in <BC>, destination in <DE>, and
  1900. ; byte count on the stack just above the return address
  1901. ;
  1902. MOVMEM:    POP    H        ; Get the return address in <HL>
  1903.     XTHL            ; Put it back on the stack
  1904. ;
  1905. MOVMOR:    LDAX    B        ; Get byte here
  1906.     STAX    D        ; Put it there
  1907.     INX    B        ; Bump pointers
  1908.     INX    D        ; Both pointers
  1909.     DCR    L        ; Reduce the count remaining
  1910.     JNZ    MOVMOR        ; Loop until done
  1911.     RET
  1912. ;.....
  1913. ;
  1914. ;
  1915. ; Arrive here with fill byte in <E>, count as low order byte on stack
  1916. ; just above return address, and beginning address to fill in <BC>
  1917. ;
  1918. FILL:    POP    H        ; Return address from last call in <HL>
  1919.     XTHL            ; Put return address back on stack and
  1920.                 ;   get number of bytes to fill in <L>
  1921.     MOV    A,E        ; Fill byte now in <A>
  1922. ;
  1923. FLOOP:    STAX    B        ; Store it at address indicated in <BC>
  1924.     INX    B        ; Bump memory pointer
  1925.     DCR    L        ; Reduce count remaining
  1926.     JNZ    FLOOP        ; Loop until done
  1927.     RET
  1928. ;.....
  1929. ;
  1930. ;
  1931. A0B66:    LXI    H,XTNLA8
  1932.     MOV    M,E
  1933.     DCX    H
  1934.     MOV    M,B
  1935.     DCX    H
  1936.     MOV    M,C
  1937.     LHLD    XTNLA6
  1938.     PUSH    H
  1939.     MVI    E,6
  1940.     LXI    B,XTNLAB
  1941.     CALL    A0BBC
  1942.     STA    XTNLAA
  1943.     INR    A
  1944.     STA    XTNLA9
  1945. ;
  1946. A0B81:    LDA    XTNLA8
  1947.     LXI    H,XTNLA9
  1948.     CMP    M
  1949.     JC    A0B97
  1950.     MVI    C,' '        ; ASCII space character
  1951.     CALL    F2OUT        ; Send the space to the console
  1952.     LXI    H,XTNLA9
  1953.     INR    M
  1954.     JMP    A0B81
  1955. ;
  1956. A0B97:    LXI    H,XTNLA9
  1957.     MVI    M,0
  1958. ;
  1959. A0B9C:    LDA    XTNLAA
  1960.     DCR    A
  1961.     LXI    H,XTNLA9
  1962.     CMP    M
  1963.     RC            ; Done here if carry flag set
  1964.     LHLD    XTNLA9
  1965.     MVI    H,0
  1966.     LXI    B,XTNLAB
  1967.     DAD    B
  1968.     MOV    C,M
  1969.     CALL    CHROUT
  1970.     LXI    H,XTNLA9
  1971.     INR    M
  1972.     JNZ    A0B9C        ; Loop until done
  1973.     RET            ; Else done here
  1974. ;.....
  1975. ;
  1976. ;
  1977. A0BBC:    POP    H        ; Get return address from the stack
  1978.     XTHL            ; Restore return addr, get passed value in <HL>
  1979.     MVI    D,1
  1980.     XRA    A
  1981.     PUSH    PSW
  1982.     INX    SP
  1983. ;
  1984. A0BC4:    DCR    E
  1985.     JZ    A0BD5
  1986.     INR    D
  1987.     CALL    A0BE1
  1988.     ADI    '0'
  1989.     PUSH    PSW
  1990.     INX    SP
  1991.     MOV    A,L
  1992.     ORA    H
  1993.     JNZ    A0BC4        ; Loop until done
  1994. ;
  1995. A0BD5:    MOV    E,D
  1996.     DCR    E
  1997. ;
  1998. A0BD7:    DCX    SP
  1999.     POP    PSW
  2000.     STAX    B
  2001.     INX    B
  2002.     DCR    D
  2003.     JNZ    A0BD7
  2004.     MOV    A,E
  2005.     RET
  2006. ;
  2007. A0BE1:    PUSH    B
  2008.     LXI    B,0100AH
  2009.     XRA    A
  2010. ;
  2011. A0BE6:    DAD    H
  2012.     RAL
  2013.     CMP    C
  2014.     JC    A0BEE
  2015.     SUB    C
  2016.     INX    H
  2017. ;
  2018. A0BEE:    DCR    B
  2019.     JNZ    A0BE6
  2020.     POP    B
  2021.     RET
  2022. ;.....
  2023. ;
  2024. ;
  2025. ; This module to "STEAL" the directory output from the BDOS by changing
  2026. ; the BDOS jump address at 0006H to jump to this module, leave a byte
  2027. ; intended for the console in memory, and then continue its journey with
  2028. ; the console output byte unaltered.
  2029. ;
  2030. SNITCH:    PUSH    H        ; Save the pointer
  2031.     LXI    H,GETIT        ; Point to beginning of getit routine
  2032.     SHLD    BDOS+1        ; Set the BDOS pointer to "GETIT" module
  2033.     LXI    H,SBUFFR    ; Set pointer to save buffer
  2034.     MVI    M,CR        ; Insert a carriage return at beginning
  2035.     INX    H        ; Bump pointer
  2036.     MVI    M,'Z'-40H    ; End of file marker
  2037.     SHLD    NXTLOC        ; Store the updated pointer
  2038.     POP    H        ; Restore the pointer
  2039.     RET
  2040. ;.....
  2041. ;
  2042. ;
  2043. NXTLOC:    DB    0,60H        ; Page for buffer location
  2044. HLSTG1:    DB    0,0        ; Storage for <HL> when it arrives with BDOS call
  2045. HLSTG2:    DB    0,0        ; Stacktop stored here so we can push the psw to stack
  2046. ;
  2047. ;
  2048. ; We arrive here with output character in <E>.    "GETIT" will get the
  2049. ; character and store it for the save.    We store <HL> in local memory,
  2050. ; pop <HL> to get the top of the stack in <HL>, store that and then push
  2051. ; the PSW in case the flags need to be saved.  We reverse the procedure
  2052. ; on the way out thus preserving things the way they were.  This method
  2053. ; takes time and space but leaves the stack undisturbed for the direct-
  2054. ; ory program.
  2055. ;
  2056. GETIT:    SHLD    HLSTG1        ; Save register <HL>
  2057.     POP    H        ; Get stack top in <HL>
  2058.     SHLD    HLSTG2        ; Save stack top here
  2059.     PUSH    PSW        ; Save accumulator and flags on stack
  2060.     MOV    A,C        ; Get the function call in <A>
  2061. ;
  2062. CKFNC:    CPI    2        ; Console output call?
  2063.     JNZ    NOPE        ; Not correct function so do not save <E>
  2064.     LHLD    NXTLOC        ; Get next buffer location
  2065.     MOV    M,E        ; Save the byte
  2066.     INX    H        ; Bump pointer
  2067.     SHLD    NXTLOC        ; Save the incremented pointer for next pass
  2068. NOPE:    POP    PSW        ; Restore the accumulator
  2069.     LHLD    HLSTG2        ; Get the old stack top in <HL>
  2070.     PUSH    H        ; And put it back on the stack
  2071.     LHLD    HLSTG1        ; Restore <HL>
  2072. ;
  2073. HERE:    JMP    BDOS        ; Now jump to the BDOS via the old vector
  2074.                 ; This jump has the vector from 006H inserted
  2075.                 ; Under program control
  2076. ;.....
  2077. ;
  2078. ;
  2079. ; Put things in order, then do the exit routine
  2080. ;
  2081. EXITJ:    LHLD    HERE+1        ; Get true BDOS vector back in <HL>
  2082.     SHLD    BDOS+1        ; And make it like it was
  2083.     LHLD    NXTLOC        ; Get last written address in <HL>
  2084.     MVI    M,01AH        ; End of file indicator
  2085.     LDA    FFLAG        ; Saving to disk?
  2086.     ORA    A
  2087.     JNZ    SAVDIR        ; If so, save the directory output
  2088. ;
  2089. EXITJ1:    JMP    BK2CCP        ; This jump instruction gets changed by "PTRON"
  2090.                 ;   if printer is selected
  2091. ;.....
  2092. ;
  2093. ;
  2094. ; Insert printer restoration code in DUNMSG as needed
  2095. ;
  2096. BK2CCP:    LHLD    HERE+1        ; Get proper BDOS address in <HL>
  2097.     SHLD    BDOS+1        ; Make it so
  2098.     LHLD    STACK        ; Get the original stack return again
  2099.     SPHL            ; Set stack pointer to old stack
  2100.     RET            ; And back to CCP without a warm reboot
  2101. ;.....
  2102. ;
  2103. ;
  2104. DONEPR:     IF    PNTRSP
  2105.     LXI    B,PTROFM    ; Point to end message
  2106.     CALL    LSTOUT        ; Send the message
  2107.      ENDIF            ; PNTRSP
  2108. ;
  2109.     JMP    BK2CCP        ; Return to CCP without a warm reboot
  2110. ;
  2111. LSTOUT:    LDAX    B        ; Get character
  2112.     ORA    A        ; Test it
  2113.     RZ            ; Done if zero
  2114.     PUSH    B
  2115.     MOV    E,A        ; Character in <E> for output
  2116.     MVI    C,WRLST        ; List device call
  2117. ;
  2118. LSTOT1:    CALL    BDOS        ; Send the character to list device
  2119.     POP    B        ; Recover pointer
  2120.     INX    B        ; Point to next character
  2121.     JMP    LSTOUT        ; Loop until string sent
  2122. ;.....
  2123. ;
  2124. ;
  2125. ;=======================================================================
  2126. ;
  2127. ; Save routine used in new directory program to save the output to a
  2128. ; a file called  (name inserted at "NUNAME") when "F" is toggled.
  2129. ;
  2130. ; Fill the last record with ^Z (1AH), and send all the data to a disk
  2131. ; file named in the file control block
  2132. ;
  2133. SAVDIR:    LHLD    NXTLOC        ; Get last storage address in <HL>
  2134. ;
  2135. NOTYET:    MVI    M,'Z'-40H    ; Fill with CTL-Z EOF markers
  2136.     INX    H        ; Bump memory pointer
  2137.     MOV    A,L        ; Get low order byte in <A>
  2138.     ORA    A        ; Are we done yet?
  2139.     JNZ    NOTYET        ; No, do it again
  2140. ;
  2141.     INX    H        ; H = # of 256 byte blocks (including offset)
  2142.     LXI    D,SBUFFR    ; Get buffer address (MSB) in <D>
  2143.     MOV    A,H        ; Get last block (MSB) address in <A>
  2144.     SUB    D        ; <A> = # of 256 byte blocks
  2145.     ADD    A        ; <A> = # of 128 byte blocks
  2146.     STA    SAVENN        ; # of 128 byte blocks to save to disk file
  2147.     LXI    H,NUNAME    ; Point to our internal file control block
  2148.     LXI    D,DFCB        ; The CP/M default file control block
  2149.     MVI    B,32        ; Thirty-two bytes to move
  2150. ;
  2151. SETNOT:    MOV    A,M
  2152.     STAX    D
  2153.     INX    H
  2154.     INX    D
  2155.     DCR    B
  2156.     JNZ    SETNOT
  2157. ;
  2158.     MVI    C,CURDSK    ; Get current disk number
  2159.     CALL    BDOS        ; Number returns in 'A'
  2160.     PUSH    PSW        ; Save for set drive function
  2161. ;
  2162. ;
  2163. ; Note =====>>> If save on current drive is desired, change the next
  2164. ;        byte to 0AFH, exclusive OR <A> with <A>.
  2165. ;
  2166. CURRENT:NOP            ;*This is the one to change, saves disk
  2167.                 ;   file to drive directory is from
  2168.     INR    A        ; Bump it up one for fcb to select drive
  2169.                 ; Since FCB wants 1=A, 2=B, etc.
  2170.     STA    DFCB        ; Store it there for later
  2171.     STA    NUNAME        ; Store it there too
  2172.     POP    PSW        ; Get current disk number back
  2173.     MOV    E,A        ; Put current disk in e for disk select
  2174.     MVI    C,SELDSK    ; Disk selection code
  2175.     CALL    BDOS        ; Select current disk as active disk
  2176.     MVI    C,DELETE    ; Delete file function call
  2177.     LXI    D,DFCB        ; We will erase NUNAME.EXT if present now
  2178.     CALL    BDOS        ; Erase old file if present in directory
  2179.     MVI    C,MAKEF        ; Make file function
  2180.     LXI    D,DFCB        ; Point to the name again
  2181.     CALL    BDOS        ; Return with error code in <A>
  2182.     CPI    0FFH        ; Error?
  2183.     JZ    ERROR        ; Send error message
  2184.     LXI    D,SBUFFR    ; Beginning of data left by directory program
  2185. ;
  2186. SETDMA:    PUSH    D        ; Save the pointer
  2187.     MVI    C,STDMA        ; Set DMA address function
  2188.     CALL    BDOS        ; Set DMA
  2189.     MVI    C,WRSEQ        ; Write sequential function
  2190.     LXI    D,NUNAME    ; Point to filename in FCB
  2191.     CALL    BDOS        ; Write a 128 byte block
  2192.     ORA    A        ; Check for successful write
  2193.     JNZ    ERROR        ; Zero returned if all ok
  2194.     LDA    SAVENN        ; Get number of remaining blocks
  2195.     DCR    A        ; Reduce it and check for zero remaining
  2196.     JZ    CLOSE        ; Close the file if zero
  2197.     STA    SAVENN        ; Save it for the next pass
  2198.     POP    H        ; Get old DMA pointer back, this time in <HL>
  2199.     LXI    D,080H        ; Raise it 128 bytes here....
  2200.     DAD    D        ; By adding to old value now in <HL>
  2201.     XCHG            ; And exchanging to get new DMA address in <DE>
  2202.     JMP    SETDMA        ; Loop until done
  2203. ;.....
  2204. ;
  2205. ;
  2206. ERROR:    LXI    B,ERRMSG    ; Point to error message
  2207.     CALL    SNDMSG        ; Send the bad news
  2208.     JMP    EXIT        ; Quit here
  2209. ;.....
  2210. ;
  2211. ;
  2212. CLOSE:    LXI    D,NUNAME    ; Point to name of file again
  2213.     MVI    C,CLOSEF    ; Close file function
  2214.     CALL    BDOS        ; Returns 0FFH on error
  2215.     CPI    0FFH        ; Check for proper close
  2216.     JZ    ERROR        ; Send error message and quit
  2217.  
  2218. EXIT:    JMP    EXITJ1        ; Return to calling module
  2219. ;.....
  2220. ;
  2221. ;
  2222. SAVENN:    DB    0        ; This number will be changed during
  2223.                 ; Execution to save the correct file size.
  2224. ;.....
  2225. ;
  2226. ;
  2227. NOSTOP:    LDA    NOSTPF        ; Printer flag set?
  2228.     ORA    A
  2229.     RNZ            ; If yes, disregard this request
  2230.     LHLD    0FFFFH        ; Maximum number of lines
  2231.     SHLD    HEIGHT        ; Will not stop each screenful
  2232.     RET
  2233. ;.....
  2234. ;
  2235. ;
  2236. SPFLAG:    LDA    PFLAG        ; Get the printer request flag
  2237.     CMA            ; Reverse its sense
  2238.     STA    PFLAG        ; And leave it there for later use
  2239.     STA    NOSTPF
  2240.     RET
  2241. ;
  2242. NOSTPF:    DB    0
  2243. ;.....
  2244. ;
  2245. ;
  2246. STSAVF:    MVI    A,0FFH        ; Set the 'disk save' flag
  2247.     STA    FFLAG        ; Store it for later reference
  2248.     MVI    A,PLINES    ; Store for possible printing later
  2249.     STA    HEIGHT
  2250.     RET
  2251. ;.....
  2252. ;
  2253. ;
  2254. PTRON:    MVI    A,5
  2255.     STA    CKFNC+1        ; Checks for printer ready
  2256.     MVI    A,PLINES    ; Put this number of lines on printer
  2257.     STA    HEIGHT        ; Also change display height to agree
  2258. ;
  2259.      IF    PNTRSP
  2260.     LXI    B,PTRONM    ; Printer setup codes
  2261.     CALL    LSTOUT        ; Send the message
  2262.      ENDIF            ; PNTRSP
  2263. ;
  2264.     LXI    H,DONEPR    ; Get address of DONEPR in <HL>
  2265.     SHLD    EXITJ1+1    ; Hot patch the exit jump address
  2266.     RET
  2267. ;.....
  2268. ;
  2269. ;
  2270. FORMFD:    LXI    B,FORMFEED    ; Point to formfeed string
  2271.     JMP    LSTOUT        ; Send formfeed, auto return
  2272. ;
  2273. FORMFEED:
  2274.     DB    CR,FF,CR,0
  2275. ;.....
  2276. ;
  2277. ;
  2278. ;-----------------------------------------------------------------------
  2279. ;              help message
  2280. ;
  2281. HELP:    LXI    B,HLPMSG
  2282.     CALL    SNDMSG
  2283.     JMP    BK2CCP
  2284. ;
  2285. HLPMSG:    DB    'DIRR extended directory program v5, 01/07/86',CR,LF
  2286.     DB    CR,LF,'  Directory program, accepts '
  2287.     DB    'wildcards, extra commands via $ char:',CR,LF,CR,LF
  2288.     DB    '  B>DIRR ?              help guide',CR,LF
  2289.     DB    '  B>DIRR                all normal files '
  2290.     DB    'in current user area',CR,LF
  2291.     DB    '  B>DIRR $ANV           all on this user '
  2292.     DB    'area plus options A,N,V',CR,LF
  2293.     DB    '  B>DIRR *.ASM $A       all .ASM files plus '
  2294.     DB    'option A',CR,LF,CR,LF,'  Options:',CR,LF,CR,LF
  2295.     DB    '103H  A - files from all user areas, this '
  2296.     DB    'drive (nice with ''E'' below)',CR,LF
  2297.     DB    '104H  C - compressed display, extra '
  2298.     DB    'row, no filesize, aborts extended',CR,LF
  2299.     DB    '105H  E - extended display, includes '
  2300.     DB    'user area and any attributes',CR,LF
  2301.     DB    '106H  F - makes a disk file named ~DIR '
  2302.     DB    'after displaying the request',CR,LF
  2303.     DB    '107H  N - do not stop each screenful, '
  2304.     DB    'else say [more] when full',CR,LF
  2305.     DB    '108H  P - send output to the printer '
  2306.     DB    '(paginates if more than one page)',CR,LF
  2307.     DB    '109H  S - include any system files that '
  2308.     DB    'meet the request',CR,LF
  2309.     DB    '10AH  V - version number and date',CR,LF,CR,LF
  2310.     DB    '  CTL-X, CTL-C, X or K to abort at any time.'
  2311.     DB    CR,LF,CR,LF,0
  2312. ;......
  2313. ;
  2314. ;
  2315. ;-----------------------------------------------------------------------
  2316. ;              message area
  2317. ;
  2318. VERMSG:    DB    'DIRR extended directory program v5, 01/07/86',CR,LF,0
  2319. ERRMSG:    DB    'DISK FULL',0
  2320. HTSPCM:    DB    CR,LF,'[more]',0
  2321. SPCS3M:    DB    '   ',0        ; 3 spaces used in output formatting
  2322. CDELIM:    DB    ' : ',0        ; Row delimiter
  2323. USEDM:    DB    'Used: ',0
  2324. FILESM:    DB    '/',0        ; Follows number of files computation
  2325. KOFMSG:    DB    'k   Free: ',0    ; Displays total space used
  2326. TCAPM:    DB    'k   ',0    ; Follows total space avail. on disk
  2327. ;.....
  2328. ;
  2329. ;
  2330. ;-----------------------------------------------------------------------
  2331. ;
  2332. ;
  2333. ; The following 12 bytes are not directly addressed in the program
  2334. ;
  2335.     DW    0,0,0,0,0,0    ; Do not remove these.
  2336. ;
  2337. XTNL0C:    DW    0
  2338. XTNL0E:    DW    0
  2339. XTNL10:    DW    0
  2340. NDSRCH:    DB    0        ; Contains offset from 080H or 0FFH...
  2341.                 ; At end of search
  2342. INTFCB:    DB    0        ; Contains current drive or "?" for....
  2343.                 ; Wildcard search if "U" flag set true
  2344.     DB    0,0,0,0        ; Internal file control block bytes 2
  2345.     DB    0,0,0,0        ;   thru 12.  Filled with search parms
  2346.     DB    0,0,0        ;   to be loaded into DFCB for lookup
  2347. XTNL21:    DW    0
  2348. XTNL23:    DW    0
  2349. XTNL25:    DW    0
  2350. XTNL27:    DB    0
  2351. LINECT:    DW    0        ; Current screen line number
  2352. BUFLOC:    DW    0        ; Location of filename in buffer beginning at 080H
  2353. ;
  2354. ;
  2355. ;-----------------------------------------------------------------------
  2356. ;            disk parameters
  2357. ;
  2358. INTDPB:                ; Copy of the search disk parameter block
  2359. ;
  2360. DPBSPT:    DW    0        ; Sectors per track
  2361. DPBBSH:    DB    0        ; Block shift factor
  2362. DPBBLM:    DB    0        ; Block mask (2[bsh-1])
  2363. DPBEXM:    DB    0        ; Extent mask
  2364. ;
  2365. DPBDSM:    DW    0        ; Disk storage maximum
  2366. DPBDRM:    DW    0        ; Directory maximum entries
  2367. DPBAL0:    DB    0        ; Alloc vector 0
  2368. DPBAL1:    DB    0        ; Alloc vector 1
  2369. ;
  2370. DPBCKS:    DW    0        ; Directory check vector
  2371. DPBOFF:    DW    0        ; Number of reserved tracks
  2372. ;
  2373. ;-----------------------------------------------------------------------
  2374. ;
  2375. LSTLOC:    DB    0,0
  2376. STAKAD:    DB    0,0
  2377. ;
  2378. XTNL3F:    DB    0,0
  2379. XTNL41:    DB    0
  2380. XTNL42:    DB    0
  2381. XTNL43:    DB    0
  2382. ;
  2383. XTNL44:    DB    0
  2384. FLGIND:    DB    0,0
  2385. XTNL47:    DB    0,0
  2386. XTNL49:    DB    0,0
  2387. ;
  2388. XTNL4B:    DB    0,0
  2389. XTNL4D:    DB    0,0
  2390. XTNL4F:    DB    0,0
  2391. XTNL51:    DB    0,0
  2392. ;
  2393. XTNL53:    DB    0
  2394. XTNL54:    DB    0,0
  2395. XTNL56:    DW    0,0,0,0,0,0,0,0,0,0,0
  2396. XTNL6C:    DB    0,0
  2397. ;
  2398. XTNL6E:    DW    0,0,0,0,0,0,0,0,0,0,0
  2399. XTNL84:    DB    0,0
  2400. XTNL86:    DB    0,0
  2401. XTNL88:    DB    0,0
  2402. ;
  2403. XTNL8A:    DB    0
  2404. XTNL8B:    DB    0
  2405. XTNL8C:    DB    0
  2406. XTNL8D:    DB    0,0
  2407. ;
  2408. XTNL8F:    DB    0,0
  2409. XTNL91:    DB    0,0
  2410. XTNL93:    DB    0,0
  2411. XTNL95:    DB    0,0
  2412. ;
  2413. ROWCNT:    DB    0        ; Row number counter
  2414. XTNL98:    DB    0,0
  2415. ALLOCV:    DB    0,0
  2416. XTNL9C:    DB    0,0
  2417. XTNL9E:    DB    0,0
  2418. ;
  2419. XTNLA0:    DB    0,0
  2420. XTNLA2:    DB    0,0
  2421. XTNLA4:    DB    0
  2422. XTNLA5:    DB    0
  2423. ;
  2424. XTNLA6:    DB    0,0
  2425. XTNLA8:    DB    0
  2426. XTNLA9:    DB    0
  2427. XTNLAA:    DB    0
  2428. ;
  2429. XTNLAB:    DW    0,0,0,0,0,0,0    ; 21 bytes total
  2430.     DB    0,0,0,0,0,0,0
  2431. ;.....
  2432. ;
  2433. ;
  2434. ; The file control block must be filled with the information shown at
  2435. ; "NUNAME".  Thirty-two (32) bytes are required, the first byte is the
  2436. ; drive specification and the next eleven (11) are the filename and ex-
  2437. ; tention.  Do not use the '.' between filename and extent.  The rest of
  2438. ; the bytes are set to '0' and MUST be in place.
  2439. ;
  2440. NUNAME:    DB    0        ; Drive number (0 = default drive)
  2441.     DB    '~DIR       '    ; *****   name of new file    *****
  2442.     DB    0,0,0,0,0,0    ; *****  leave space in FCB   *****
  2443.     DB    0,0,0,0,0,0    ; *****   do not alter this   *****
  2444.     DB    0,0,0,0,0,0
  2445.     DB    0,0
  2446.     DB    0,0,0,0        ; Four byte buffer zone for good measure
  2447.     DS    40        ; Reserved for the stack area
  2448. ;
  2449. STACK:    DS    2
  2450. ;
  2451.     END
  2452.