home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / ZSUS / ZSUS009.LBR / LDIRB16.LBR / LDIRB16.ZZ0 / LDIRB16.Z80
Text File  |  1990-06-30  |  38KB  |  1,193 lines

  1. ;************************************************************************
  2. ;*                                    *
  3. ;*                 LDIR-B                 *
  4. ;*               v1.00  17 Oct 1987                *
  5. ;*                                    *
  6. ;************************************************************************
  7. ;
  8. ; +-----------------------------------------------------------------------+
  9. ; | ==> This is the exact source code used to create LDIR-B v1.0. The COM |
  10. ; |    file, as well as appropriate documentation, can be found in      |
  11. ; |    LDIR-B.LBR.  The source is to be included in future releases      |
  12. ; |    of LDIR-B.LBR.                              |
  13. ; +-----------------------------------------------------------------------+
  14. ;
  15. ; Placed into the public domain by Steven G. Greenberg.
  16. ; Responsible updates encouraged, please document below.
  17. ;
  18. ;----------------------------------------------------------------------------
  19. ;              Update History
  20. ;----------------------------------------------------------------------------
  21. ;............................................................................
  22. ;
  23. ; v1.60  July 1, 1990  Howard Goldstein
  24. ;
  25. ; Fixed problems associated with zero-lengthh member files.  The program was
  26. ; attempting to read the first record of each member file.  Not too cool if
  27. ; the member file is empty!
  28. ; Modified to display original file name on squeezed as well as crunched
  29. ; files.
  30. ; Corrected usage message.
  31. ; Removed all old commented-out code; shortened code in a few places.
  32. ; Modified the code that reads the LBR directory into memory to exclude each
  33. ; member's CRC.  This gets us down to 19 bytes per entry again.
  34. ;
  35. ;............................................................................
  36. ;
  37. ; v1.50  September 19, 1989  Sean N. Sullivan
  38. ;
  39. ; Really simple fix to add capability to recognize files compressed by 
  40. ; CRLZH.  Also if file is not compressed (i.e., neither squeezed, crunched, 
  41. ; nor crlzhed), the LDIR listing says that it is "Stored".  A minor change 
  42. ; to the help display so it looks a little more like a ZCPR3 help display.  
  43. ; Plus a minor change to the listing heading (HEDING:).
  44. ;
  45. ;............................................................................
  46. ;
  47. ; v1.40  July 1, 1988  Michal Carson
  48. ;
  49. ; Added display of datestamps for the library itself.  Corrected one bug
  50. ; with interpretation of crunched-file datestamp headers; 0ffh was not
  51. ; being converted back into 00h.  This caused trash to be displayed in
  52. ; the guise of a datestamp, specifically "FF ore] FF".  Look familiar?
  53. ; No?  Oh, well.  Re-arranged pfname routine to downcase letters of a
  54. ; filename which have high bits set; these should not be appearing in
  55. ; libraries and if they do appear, we certainly want to be aware of them.
  56. ; Extchr has been replace by crflag which will contain 0ffh if the file
  57. ; is crunched; this serves the same purpose as storing the middle letter
  58. ; of the file extension in extchr.  Changed method of determining a file's
  59. ; compression; the first sector of each file is now read and the first
  60. ; two bytes examined for crunched or squeezed headers.  This will add very
  61. ; little to the execution time given that crunching is very common now
  62. ; and we would read a sector of any crunched file anyway.  Uncommented 
  63. ; code to do warm boot on exit according to byte at 111h; not zero 
  64. ; (0ffh) exits with warm boot.
  65. ;
  66. ;............................................................................
  67. ;
  68. ; v1.30  May 28, 1988  Michal Carson
  69. ;
  70. ; Added support for Modification date.  Changes to display--eliminated
  71. ; CRC to make room; my apologies to anyone for whom the CRC display
  72. ; held great significance.  LINLEN lost two more characters (now 19).
  73. ; Version 1.20 was not available; I have seen only a com file.
  74. ;
  75. ;............................................................................
  76. ;
  77. ; v1.10  November 5, 1987  Bruce Morgen
  78. ;
  79. ; Added minimalist ZCPR3 support.  If the program is installed via
  80. ; Z3INS or Z-RIP (or auto-installed at run-time by ZCPR 3.3+ or by
  81. ; BGii 1.13+), LDIR-B will get the wheel byte address and CRT length
  82. ; from the ZCPR3 environment and will log into the user area parsed
  83. ; into DFCB+13 by the CPR.  This revision necessarily moves the
  84. ; configuration bytes up by eight bytes; it also uses the extra byte
  85. ; at "SPARE:" as the MSB of the wheel byte address and no longer
  86. ; assumes that the wheel byte is on page 0 (commercial ZCPR3
  87. ; implementations tend to follow the "Echelon Standard" memory map,
  88. ; established by Joe Wright, which puts the wheel byte up at FDFFh).
  89. ; LDIR-B now displays filesizes in records as well as kbytes.  The
  90. ; record count is more easily related to the file transfer progress
  91. ; displays of IMP and MEX, and with the DECOUT routine already
  92. ; available, why not?  Reduced "LINLEN" to 21 and revised "HEDING:"
  93. ; format to accomodate the record count inclusion.  LDIR-B now accepts
  94. ; the second token on the incoming command line as an optional
  95. ; wildcard filespec for selecting the library member files to be
  96. ; shown.  If present, this selection is displayed following the
  97. ; library's name in the "( --> filename.typ)" format.  The rather
  98. ; silly 1023-member restriction is also removed through the simple
  99. ; expedient of using a 16-bit value at "DIRLEN:" and adding a little
  100. ; extra code to handle the bigger numbers.  Fixed bug handling LBRs
  101. ; with no member files, same code handles a no-match situation with
  102. ; the user-supplied wildcard.
  103. ;
  104. ;............................................................................
  105. ;
  106. ; v1.00  18 Oct 87  Steven Greenberg
  107. ;
  108. ; For additional  system security, will ignore LBR files with SYS
  109. ; attribute set if wheel byte is zero.    The wheel byte location is
  110. ; defined by the byte at 105H and defaults to 3EH.
  111. ; (prevents snooping around sys COM files on systems using a COMMAND.LBR)
  112. ;
  113. ; Checks for console characters- aborts on ^K,K,k ^X,X,x or ^C,C,c,
  114. ; pauses  on ^S.  Added line counter which issues  "[more]"  prompt
  115. ; after  22 lines (byte at 104H).  Typing a space at any time  sets
  116. ; line counter to one for "line by line" advance.
  117. ;
  118. ; LUXX77A  revised to LUX77B by Irv Hoff now includes and  automat-
  119. ; ically supports this program.
  120. ;
  121. ;............................................................................
  122. ;
  123. ; v0.91  08 Oct 87  Steven Greenberg
  124. ;
  125. ; Beta release.
  126. ;
  127. ;============================================================================
  128. ;
  129. ;    .Z80
  130. ;    ASEG
  131.     ORG    100H
  132. ;
  133. ;
  134. LINLEN    EQU    19        ; Max # of "comment" characters
  135. ;
  136. ; --- ASCII equates ---
  137. ;
  138. CTRLC    EQU    03H        ; ^C
  139. LF    EQU    0AH        ; Linefeed
  140. CR    EQU    0DH        ; Carriage return
  141. ;
  142. ; --- CP/M address equates ---
  143. ;
  144. DFCB    EQU    5CH        ; Default file control block #1
  145. FCB2    EQU    6CH        ; Default file control block #2
  146. DDMA    EQU    80H        ; Default dma address
  147. BDOS    EQU    0005H        ; Bdos entrypoint
  148. ;
  149. ; --- BDOS function equates ---
  150. ;
  151. CONIN    EQU    1        ; Console input (single char)
  152. CONOUT    EQU    2        ; Output single char to console
  153. PRTSTR    EQU    9        ; Print string to console
  154. CONST    EQU    11        ; Get console status
  155. OPEN    EQU    15        ; Open file
  156. CLOSE    EQU    16        ; Close file
  157. READ    EQU    20        ; Read file (sequential)
  158. SETDMA    EQU    26        ; Set dma address
  159. GSUSER    EQU    32        ; Get/set user code
  160. RDRND    EQU    33        ; Read random
  161.  
  162. ;----------------------------------------------------------------------------
  163. ;
  164. ENTRY:    JP    START
  165.     DB    'Z3ENV',1
  166. Z3EADR:    DW    00        ; Set by CPR or the Z3INS utility if Z3
  167. ;
  168. WBFLAG:    DB    0        ; Warm boot flag. Non-zero if warm boot req'd.
  169. NLN:    DB    22        ; #of lines before [more] prompt. Usually 22.
  170. WHLLOC:    DB    3EH        ; Wheel byte location. ("3EH" = 003EH).
  171. SPARE:    DB    0        ; Spare. (now used - b/m)
  172. ;
  173. ;
  174. START:    LD    (OLDSTK),SP    ; Save system stack pointer
  175.     LD    SP,STACK    ; Set to local area
  176.     LD    HL,(Z3EADR)    ; Get possible Z3 environment pointer
  177.     LD    A,L
  178.     OR    H
  179.     JR    Z,NOTZ3        ; If (Z3EADR) = 0000H, assume non-Z3
  180.     LD    A,(DFCB+1)
  181.     CP    '/'
  182.     JP    Z,GIVUSG
  183.     LD    A,(DFCB+13)    ; Otherwise, get CCP-parsed user #
  184.     LD    E,A        ; Log in via BDOS function #32
  185.     LD    C,GSUSER
  186.     CALL    BDOSAV        ; HL is preserved at BDOSAV
  187.     LD    DE,29H        ; Offset to wheel address in DE
  188.     ADD    HL,DE        ; Add it to environment address
  189.     LD    E,(HL)        ; LSB in E
  190.     INC    HL        ; Bump pointer
  191.     LD    D,(HL)        ; MSB in D
  192.     LD    (WHLLOC),DE    ; Poke into LDIR-B
  193.     LD    DE,6        ; Offset to CRT selection
  194.     ADD    HL,DE        ; Add it in
  195.     LD    E,3        ; D=0, so DE=0003h
  196.     LD    A,(HL)        ; Get selected CRT # in A
  197.     OR    A        ; Test for zero
  198.     JR    Z,CRT0        ; If CRT #0, just 3 bumps
  199.     ADD    HL,DE        ; Otherwise 6 bumps
  200. CRT0:    ADD    HL,DE
  201.     LD    A,(HL)        ; Get "usable" CRT lines
  202.     LD    (NLN),A        ; Poke into LDIR-B
  203.  
  204. NOTZ3:    LD    A,(DFCB+1)    ; Any argument supplied?
  205.     CP    ' '
  206.     JP    Z,GIVUSG    ; If not, give usage
  207. ;
  208.     LD    A,(BDOS+2)    ; Subtract 2k+ (for CCP) from available TPA
  209.     SUB    11        ; - and save for later check
  210.     LD    (OVFTPA),A
  211.     LD    A,(NLN)        ; Init screen line counter (decrements to 0)
  212.     LD    (LINCTR),A
  213.     LD    HL,'RB'        ; Last 2 letters of "LBR" (backwords)
  214.     LD    (DFCB+10),HL    ; Put at fcb+10, +11
  215.     LD    A,'L'        ; Similarly
  216.     LD    (DFCB+9),A    ; Now we have a forced "LBR" extension.
  217.     LD    HL,FCB2+1    ; Put possible user wildcard
  218.     LD    DE,WLDFCB    ; filespec into a safe buffer
  219.     LD    BC,11
  220.     LDIR
  221.     LD    DE,DFCB+12    ; Make sure fcb is clr except filename & drive
  222.     LD    B,24        ; # of zeroes for the rest
  223.     XOR    A        ; A zero, obviously
  224. ;
  225. ZLP2:    LD    (DE),A        ; Put those in
  226.     INC    DE
  227.     DJNZ    ZLP2
  228. ;
  229.     LD    HL,0        ; Init "#of files" counter to zero
  230.     LD    (NFILES),HL
  231.     LD    DE,DFCB        ; Open the library file
  232.     LD    C,OPEN
  233.     CALL    BDOSAV
  234.     INC    A
  235.     JP    Z,NOSUCH    ; Br to error message if no such file
  236. ;
  237.     LD    A,(DFCB+10)    ; Check if file has SYS attribute
  238.     AND    80H
  239.     JR    Z,NONSYS    ; If not, it's OK
  240.     LD    HL,(WHLLOC)    ; Else we must check if wheel byte is set
  241.     LD    A,(HL)        ; Get the wheel byte itself
  242.     OR    A
  243.     JP    Z,NOSUCH    ; If zero, pretend the file does not exist
  244. ;
  245. NONSYS:    LD    C,SETDMA    ; Make sure the default DMA is 80H
  246.     LD    DE,DDMA
  247.     CALL    BDOSAV
  248.     CALL    CRLF        ; Type a CR/LF sequence to the screen
  249.     LD    DE,LBRNAM    ; Followed by "Library File ="
  250.     CALL    MESAGE
  251.     LD    HL,DFCB+1    ; Point to the LBR's filename
  252.     CALL    PFNAME        ; Routine types the specified filename
  253.     LD    A,(WLDFCB)    ; Has user specified a wildcard?
  254.     SUB    ' '
  255.     JR    Z,NOWILD    ; If not, finished with display
  256.     CALL    BLANK3        ; Otherwise print three blanks
  257.     LD    DE,FNMSG    ; Point at "( --> "
  258.     CALL    MESAGE        ; Print it
  259.     LD    HL,WLDFCB    ; Point at wildcard
  260.     CALL    PFNAME        ; Type it out as filename.typ
  261.     LD    A,')'        ; Close parens
  262.     CALL    TYPE
  263.     CALL    CRLF
  264. NOWILD:
  265.     CALL    READ1        ; Read the library's 1st record
  266.     LD    HL,DDMA        ; Point to first byte
  267.     LD    A,(HL)        ; Validity check- the dirctory entry for the
  268.             ; - directory itself must be "active" (zero)
  269. ;
  270. ; We would normally check for eleven blank characters next (the filename area
  271. ; of the directory entry for the directory itself. We will skip this validity
  272. ; check, however, because some MS-DOS library programs actually insert the
  273. ; library's name here. Skipping the check insures compatibility.
  274. ;
  275.     LD    HL,DDMA+12    ; More validity checking:
  276.     OR    (HL)        ; The library's "index" must be zero
  277.     INC    HL        ; If index(lo) >0, lbr is corrupt
  278.     OR    (HL)
  279.     JP    NZ,CORUPT    ; Likewise for index(hi)
  280.     LD    (crflag),A    ; Zero out this flag for next routine
  281.  
  282.     INC    HL
  283.     LD    A,(HL)        ; Get length of directory(lo)
  284.     INC    HL
  285.     LD    H,(HL)        ; Get length of directory(hi)
  286.     LD    L,A        ; Full directory length in HL
  287.     OR    H
  288.     JP    Z,CORUPT    ; 0-length LBR directory is corrupt
  289.     LD    (DIRLEN),HL    ; It's big enough, store it
  290.  
  291. ; Satisfied that the file is in fact a library, we extract the bytes
  292. ; which should contain its creation and last modification dates and
  293. ; display these for the user's edification.
  294.  
  295.     LD    DE,NOMSG    ; Breathing room
  296.     CALL    MESAGE
  297.     LD    HL,(DDMA+18)    ; Get creation date of lbr file
  298.     CALL    DATE        ; Print a date if it's good
  299.     JR    C,TRYMOD    ; No creation date try last mod
  300.     LD    DE,CREMSG    ; Extchr cleared--will not look for stamp
  301.     CALL    MESAGE        ; 'Cre '
  302.     CALL    SHODATE        ; Display the result of "date"
  303. TRYMOD:
  304.     LD    HL,(DDMA+20)    ; Get last mod date of lbr file
  305.     CALL    DATE
  306.     JR    C,NOMOD        ; No mod date
  307.     LD    DE,MODMSG    ; 'Mod '
  308.     CALL    MESAGE
  309.     CALL    SHODATE
  310. NOMOD:
  311.     CALL    CRLF        ; Now do a new line
  312.  
  313. ;
  314. ; Program operation: We will read the entire lbr directory into memory in one
  315. ; shot, avoiding having to go back to it later as we are reading the first
  316. ; record of various member files (should minimize head movement and maximize
  317. ; speed).  Only the 19 bytes of interest out of the 32 will be saved for each
  318. ; entry, however, and entries flagged as deleted or non-existant will be
  319. ; skipped.
  320. ;
  321.     LD    DE,DIRBUF    ; Dir data will be packed to mem starting here
  322.     JR    SKIP1        ; Jump into loop (only 3 entries first record)
  323. ;
  324. ;............................................................................
  325. ;
  326. MAINLP:    LD    HL,DDMA+00    ; 1st entry per record
  327.     CALL    ACTIVQ        ; Active?
  328.     CALL    Z,PRCENT    ; Routine copies 19 of this entry into "DIRBUF"
  329. ;
  330. SKIP1:    LD    HL,DDMA+20H    ; As above, 3 more times / sector
  331.     CALL    ACTIVQ        ; Active?
  332.     CALL    Z,PRCENT
  333.     LD    HL,DDMA+40H
  334.     CALL    ACTIVQ        ; Active?
  335.     CALL    Z,PRCENT
  336.     LD    HL,DDMA+60H
  337.     CALL    ACTIVQ        ; Active?
  338.     CALL    Z,PRCENT
  339.     LD    HL,(DIRLEN)
  340.     DEC    HL
  341.     LD    A,L
  342.     OR    H
  343.     JR    Z,DUNDIR    ; If done reading in directory, go process
  344.     LD    (DIRLEN),HL    ; Else store length remaining
  345.     CALL    READ1        ; and read another record into DDMA
  346.     JR    MAINLP        ; Loop, w/o resetting DE
  347. ;
  348. ;----------------------------------------------------------------------------
  349. ;
  350. ; Routine to move 19 key bytes from one entry into sequential mem in "dirbuf"
  351. ; HL points to the lbr directory entry in queston, DE continues to increment
  352. ; through "dirbuf" for all entries.  CRC is skipped.
  353. ;
  354. PRCENT:    INC    HL        ; Skip flag byte. We already know its "active"
  355.     LD    BC,15        ; # of bytes to be moved
  356.     LDIR            ; (DE is incrementing through DIRBUF)
  357.     inc    hl        ; skip CRC
  358.     INC    HL
  359.     LD    C,4
  360.     LDIR            ; Move date fields
  361.     LD    HL,(NFILES)    ; Ok to clobber HL now (not DE!)
  362.     INC    HL        ; Increment the "# of files" counter
  363.     LD    (NFILES),HL
  364.     LD    A,(OVFTPA)    ; Be extra cautious and make sure "DE" never
  365.     SUB    D        ; - approaches the end of the TPA.
  366.     JP    C,CORUPT    ; If it does, the consider the LBR corrupt
  367.     RET            ; (actually a TPA that small is "corrupt")
  368.  
  369. ;----------------------------------------------------------------------------
  370. ;
  371. ; Now we are done reading the directory information, and it is time to start
  372. ; processing, starting from the beginning of "dirbuf"
  373. ;
  374. DUNDIR:    LD    HL,(NFILES)    ; Test for no matching members!
  375.     LD    A,L
  376.     OR    H
  377.     JR    NZ,DODIR
  378.     LD    DE,EMPMSG    ; Point at msg
  379.     CALL    MESAGE        ; Show it
  380.     JP    RETCCP        ; Go home
  381. ;
  382. DODIR:    LD    DE,HEDING    ; Type main heading
  383.     CALL    MESAGE
  384.     LD    HL,DIRBUF    ; Back to beg of packed data to be processed
  385.  
  386. ;............................................................................
  387. ;
  388. NAMLP:    LD    A,(LINCTR)    ; Top of main loop, one loop per entry
  389.     DEC    A
  390.     LD    (LINCTR),A    ; Keep track of lines per console screen
  391.     CALL    CKABRT        ; Check for ^C, etc. Also pauses if linctr=0
  392.     LD    A,CR        ; In case "CKABRT" echoed extraneous chars,
  393.     CALL    TYPE        ; - an extra CR so we'll write over them
  394.     CALL    PFNAME        ; Type a filename (increase HL by 11)
  395.     CALL    BLANK2        ; Type 2 blanks
  396.     LD    E,(HL)        ; Get the entry's "index" for later reference
  397.     INC    HL
  398.     LD    D,(HL)
  399.     INC    HL
  400.     LD    (INDEX),DE    ; Put 2 byte index value there for now
  401.     LD    E,(HL)        ; Get the member's file size in sectors
  402.     INC    HL
  403.     LD    D,(HL)
  404.     INC    HL
  405.     LD    A,E        ; Test for zero-length file
  406.     OR    D
  407.     LD    (ZERFLG),A    ; Save as a flag for later
  408. ;
  409. ; The member's file size can be processed immediately, since according to
  410. ; the format it's the next thing we want to type to the screen anyway.
  411. ; The code below will take the length in records (now in DE), divide it by
  412. ; eight, convert that to BCD, and then print the remainder as the fractional
  413. ; part of the size in "k".
  414. ;
  415.     PUSH    HL        ; Save pointer and size in recs
  416.     PUSH    DE
  417.     EX    DE,HL        ; Recs to HL
  418.     CALL    DECOUT        ; Print w/leading blanks
  419.     LD    A,'r'        ; Type an "r"
  420.     CALL    TYPE
  421.     POP    DE        ; Restore pointer and size
  422.     POP    HL
  423.     XOR    A        ; We'll accumulate the fractional part in here
  424.     LD    B,3        ; Set leop counter
  425.  
  426. dvloop:    SRL    D        ; } Divide by 8, shifting remainder into A
  427.     RR    E        ; }
  428.     RRA            ; }
  429.     djnz    dvloop
  430.     RRA
  431.     RRA            ; A now has the remainder times 8.
  432.     PUSH    AF        ; Save that while we type the full number of k.
  433.     PUSH    HL        ; Save our pointer too.
  434.     EX    DE,HL
  435.     CALL    DECOUT        ; Converts the # in HL to BCD and types it.
  436.     POP    HL
  437.     POP    AF        ; Get everything back
  438.     LD    DE,CDATVAL    ; Point to cre date storage
  439.     LD    BC,4
  440.     LDIR            ; Move cre and mod dates
  441.     LD    (HLSAVE),HL    ; Save our pointer again
  442.     LD    H,0        ; Meanwhile, our "fraction" is still in A
  443.     LD    L,A        ; Use the value to select appropriate text
  444.     LD    DE,FRACTS    ; - from the 8-byte wide table "fracts"
  445.     ADD    HL,DE
  446.     EX    DE,HL
  447.     CALL    MESAGE        ; And output that to the console
  448. ;
  449. ; We read the first record of the file into the default dma and examine it
  450. ; to determine compression format.  This is very slightly slower than
  451. ; checking the extension first and only reading the record if the middle
  452. ; letter indicates a crunched file; it is a great deal more accurate.
  453.  
  454.     XOR    A
  455.     LD    (CRFLAG),A    ; clear flag
  456.     LD    (SQFLAG),A
  457.     LD    (DDMA),A    ; Clear 1st byte of dma buffer (nothing read)
  458.     LD    A,(ZERFLG)    ; Zero-length file?
  459.     OR    A
  460.     CALL    NZ,RDHDR    ; Read the first record of the file if not
  461.     LD    HL,DDMA        ; Pt to first character of record
  462.     LD    A,76H        ; Z80 halt instruction
  463.     CPI            ; Is it there?
  464.     LD    DE,TYPE0    ; Ptr to "Stored" message
  465.     JR    NZ,CORECT    ; No, so we don't know the compression
  466.  
  467.     LD    A,(HL)        ; Get the second character of the file
  468.     LD    (SQFLAG),A    ; save as a flag
  469.     LD    DE,TYPE1    ; "Squeezed"
  470.     INC    A        ; Indicated by 76h 0ffh series
  471.     JR    Z,CORECT
  472.  
  473.     LD    DE,TYPE2    ; "Crunched"
  474.     LD    (CRFLAG),A    ; save as a flag
  475.     INC    A        ; Indicated by 76h 0feh series
  476.     JR    Z,CORECT
  477.  
  478.     LD    DE,TYPE3    ; "Cr-lzh"
  479.     LD    (CRFLAG),A    ; save as a flag
  480.     INC    A        ; Indicated by 76h 0feh series
  481.     JR    Z,CORECT
  482.  
  483.     LD    DE,TYPE0    ; In case we fall through, "Stored"
  484. ;
  485. CORECT:    CALL    MESAGE        ; Whatever it is, type it.
  486.     CALL    BLANK2        ; Type 2 blanks
  487. ;
  488. ; The "DATE" routine will, if possible, define "DAY", "MONTH", and "YEAR".
  489. ; MONTH will be pointer to a string, while the other two will contain actual
  490. ; BCD values.  Returns w/ carry set if no date can be determined.
  491. ;
  492.     XOR    A
  493.     LD    (OFFSET),A    ; Offset to cre date is zero
  494.     LD    HL,(CDATVAL)    ; Pointer to cre date
  495.     CALL    DATE        ; Perf date conversion, as described
  496.     JR    C,NODATE    ; If no date, go type "---"
  497.     CALL    SHODATE        ; Display date
  498.     LD    A,10
  499.     LD    (OFFSET),A    ; Offset to mod date is ten
  500.     LD    HL,(MDATVAL)    ; Pointer to mod date
  501.     CALL    DATE        ; Repeat for mod date
  502.     JR    C,NODATE1    ; Just print one "---" entry
  503.     CALL    SHODATE
  504.     JR    DOCMT        ; Go do comment field
  505.  
  506. SHODATE:
  507.     LD    A,(DAY)        ; First get the day of the month
  508.     CALL    HEXO        ; Type that
  509.     CALL    BLANK1        ; Followed by one space
  510.     LD    DE,(MONTH)    ; Get pointer to month string
  511.     CALL    MESAGE        ; And type the month
  512.     CALL    BLANK1        ; Another space
  513.     LD    A,(YEAR)    ; Finally the year, BCD again
  514.     CALL    HEXO        ; Type that
  515.     CALL    BLANK2        ; 2 spaces
  516.     RET
  517. ;
  518. NODATE:    LD    DE,DATLES    ; Special "---" string for dateless files
  519.     CALL    MESAGE
  520. NODATE1:
  521.     LD    DE,DATLES
  522.     CALL    MESAGE
  523. ;
  524. DOCMT:
  525.     LD    A,(SQFLAG)    ; Re-analyze extension
  526.     INC    A        ; 0ffh if squeezed
  527.     JR    Z,NOBRCK    ; Print original name if squeezed
  528.     ld    a,(crflag)
  529.     INC    A        ; 0ffh if crunched
  530.     JR    NZ,DUNLIN    ; If not, we are done. Go to next LBR member.
  531. ;
  532. ;............................................................................
  533. ;
  534. ; If the file is crunched, we will attempt to fill in the "comments" column.
  535. ; The first priority is to look for text contained between "[" and "]" in
  536. ; the crunched file header. Failing that, we will simply display an arrow
  537. ; followed by the original filename as extracted from the file header.
  538. ;
  539.     LD    B,7FH        ; Search for "[" or zero, whichever comes 1st
  540.     LD    HL,DDMA
  541. ;
  542. SRCHLP:    LD    A,(HL)
  543.     INC    HL
  544.     OR    A
  545.     JR    Z,NOBRCK    ; Zero means done
  546.     CP    '['
  547.     JR    Z,FNDBRK    ; If we found it
  548.     DJNZ    SRCHLP        ; (limit search to the one record we read)
  549. ;
  550. NOBRCK:    CALL    MAKEUP        ; No comment found, so invent one, as described
  551.     JR    DUNLIN        ; Thats's all, go on to next LBR entry
  552. ;
  553. ;............................................................................
  554. ;
  555. ; A "comment" has been found so we will display it. The comment text is nearly
  556. ; always in full upper case, because it was originally entered as part of a
  557. ; command line and converted to U/C by the CCP. We will fake it by making
  558. ; the first char U/C and the rest L/C to make it look good.
  559. ;
  560. FNDBRK:    LD    B,LINLEN    ; # of characters allowed for the comment
  561.     LD    C,0FFH        ; (used to flag the first loop)
  562. ;
  563. COMLP:    LD    A,(HL)        ; Get a char
  564.     INC    HL
  565.     OR    A        ; If zero we are done
  566.     JR    Z,DUNLIN
  567.     CP    ']'        ; Likewise a "]" character
  568.     JR    Z,DUNLIN
  569.     INC    C
  570.     CALL    NZ,LCASE    ; Convert to lower case if not first loop
  571.     CALL    TYPE
  572.     DJNZ    COMLP        ; Continue, but not past max #of chars allowed
  573. ;
  574. ;..............................................................................
  575. ;
  576. DUNLIN:    CALL    CRLF        ; Done with whole line; move to next LBR member
  577.     LD    HL,(NFILES)    ; Decr the #of files count to see if we're done
  578.     DEC    HL
  579.     LD    (NFILES),HL
  580.     LD    A,H
  581.     OR    L
  582.     LD    HL,(HLSAVE)    ; Before looping, restore HL (now pointing to
  583.     JP    NZ,NAMLP    ; - next packed directory entry in "dirbuf")
  584.     JR    RETCCP
  585. ;
  586. ;============================================================================
  587. ;               Subroutines
  588. ;============================================================================
  589. ;
  590. ;____________________________________________________________________________
  591. ;
  592. ; Read in the 1st 128 bytes of a member file. The file's index is in "index"
  593. ;
  594. RDHDR:    LD    HL,(INDEX)    ; Get index of file
  595.     LD    (DFCB+33),HL    ; Put it in the rr field at fcb+33,34
  596.     XOR    A
  597.     LD    (DFCB+35),A    ; Make sure this is zero
  598.     LD    C,RDRND        ; Prepare for random read
  599.     LD    DE,DFCB
  600.     CALL    BDOSAV        ; Read first sector of the file to the ddma
  601.     OR    A
  602.     JR    NZ,CORUPT    ; (if read operation failed)
  603.     RET
  604. ;
  605. ;____________________________________________________________________________
  606. ;
  607. READ1:    PUSH    DE        ; Seq. read next sector to DDMA. Kills BC.
  608.     LD    DE,DFCB
  609.     LD    C,READ
  610.     CALL    BDOSAV
  611.     OR    A
  612.     JR    NZ,CORUPT    ; If unexpected EOF error
  613.     POP    DE
  614.     RET
  615. ;
  616. ;____________________________________________________________________________
  617. ;
  618. NOSUCH:    LD    DE,NSMSG    ; Type "File not found" and exit
  619.     CALL    MESAGE
  620.     JR    RETCCP
  621. ;
  622. ;____________________________________________________________________________
  623. ;
  624. CORUPT:    LD    DE,CORMSG    ; Type "library file corrupt", and exit
  625.     CALL    MESAGE
  626.     JR    RETCCP
  627. ;
  628. ;____________________________________________________________________________
  629. ;
  630. GIVUSG:    LD    DE,USAGE    ; Give usage instructions and exit
  631.     CALL    MESAGE
  632.     LD    HL,(Z3EADR)    ; Running under Z-System?
  633.     ld    a,h
  634.     or    l
  635.     LD    DE,USAG1    ; Get second part of message
  636.     JR    NZ,GIVUS1    ; Print as-is if Z-System
  637.     INC    DE        ; Else skip over 'u'
  638.  
  639. GIVUS1:
  640.     CALL    MESAGE
  641.                 ; fall through
  642. ;
  643. ;............................................................................
  644. ;
  645. ; Terminate. Return to CCP, or do a warm boot if byte at 111H was patched.
  646. ;
  647. RETCCP: LD    A,(WBFLAG)
  648.     OR    A
  649.     JP    NZ,0000H    ; Do a warm boot if so dictated by flag
  650.  
  651.     LD    SP,(OLDSTK)    ; Else a return to CCP
  652.     RET
  653. ;
  654. ;____________________________________________________________________________
  655. ;
  656. ; Print a file's real [uncrunched] filename in lieu of a comment in the
  657. ; comments column. Only done if no "[..]" comment could be found or if file
  658. ; is squeezed.
  659. ;
  660. MAKEUP:    LD    DE,FNMSG    ; "( --> "
  661.     CALL    MESAGE
  662.     LD    HL,DDMA+2    ; Filename area
  663.     LD    A,(SQFLAG)    ; Check for squeezed file
  664.     INC    A
  665.     JR    NZ,MAKUP1    ; Skip this if crunched
  666.     INC    HL        ; Name field offset two bytes farther
  667.     INC    HL        ; ..in squeezed files
  668.  
  669. MAKUP1:
  670.     LD    B,12        ; Necessary?
  671. ;
  672. MAKELP:    LD    A,(HL)
  673.     INC    HL
  674.     CP    10H        ; Usually 00 terminates; stop at any of 16
  675.     JR    C,DUNAME    ; - obviously non-ascii bytes for future
  676.     CALL    TYPE        ; - expansion of system dependent info arae.
  677.     DJNZ    MAKELP        ; (also could stop 3 bytes past ".")
  678. ;
  679. DUNAME:    LD    A,')'        ; Follow with closing parenthesis
  680.     CALL    TYPE
  681.     RET
  682. ;
  683. ;____________________________________________________________________________
  684. ;
  685. BLANK3:    LD    A,' '        ; Type 3 blanks to the console
  686.     CALL    TYPE
  687. ;
  688. BLANK2:    LD    A,' '        ; Likewise 2 bytes
  689.     CALL    TYPE
  690. ;
  691. BLANK1:    LD    A,' '        ; A single oarty
  692.     CALL    TYPE
  693.     RET
  694. ;
  695. ;____________________________________________________________________________
  696. ;
  697. CRLF:    LD    A,CR        ; Type a CR/LF sequence to the console
  698.     CALL    TYPE
  699.     LD    A,LF
  700.                 ; fall through
  701. ;
  702. ;............................................................................
  703. ;
  704. TYPE:    PUSH    AF        ; Type the char in A; save all registers
  705.     PUSH    BC
  706.     PUSH    DE
  707.     LD    E,A
  708.     LD    C,CONOUT
  709.     CALL    BDOSAV
  710.     POP    DE
  711.     POP    BC
  712.     POP    AF
  713.     RET
  714. ;
  715. ;____________________________________________________________________________
  716. ;
  717. LCASE:    CP    41H        ; Down-case the character in "A"
  718.     RET    C        ; "@" and below should be left alone
  719.     CP    5BH        ; "[" and above should be left alone
  720.     RET    NC
  721.     ADD    A,20H        ; Else down-case it
  722.     RET
  723. ;
  724. ;____________________________________________________________________________
  725. ;
  726. MESAGE:    PUSH    BC        ; Type string pointed to by DE ("$" terminated)
  727.     LD    C,PRTSTR
  728.     CALL    BDOSAV
  729.     POP    BC
  730.     RET
  731. ;
  732. ;____________________________________________________________________________
  733. ;
  734. BDOSAV:    PUSH    BC        ; Call bdos; save all regs (except A)
  735.     PUSH    DE
  736.     PUSH    HL
  737.     CALL    BDOS
  738.     POP    HL
  739.     POP    DE
  740.     POP    BC
  741.     RET
  742. ;
  743. ;____________________________________________________________________________
  744. ;
  745. ; Monitor "linctr"; if zero pause and wait for another char to continue, then
  746. ; then reset "LINCRT" to the "nln" value (unless the "continue character was
  747. ; a space, in which case reset "LINCTR" to "1").  Check console input status,
  748. ; get a character if necessary.  Abort if it is one of the 6 abort characters.
  749. ; Space sets "LINCTR" to "1" at any time.  Pause on ^S, waiting for another
  750. ; character (and process it as above [except another ^S]).  That should about
  751. ; cover it.
  752. ;
  753. CKABRT:    PUSH    AF        ; Save all regs
  754.     PUSH    BC
  755.     PUSH    DE
  756.     LD    A,(LINCTR)    ; # of lines on current screen so far
  757.     OR    A
  758.     JR    NZ,NLNZ        ; Br if not zero yet
  759.     LD    A,(NLN)        ; Reset the line counter in advance
  760.     LD    (LINCTR),A
  761.     LD    DE,MORPRM    ; "[more]" prompt
  762.     CALL    MESAGE
  763. ;
  764. WA4CH:    LD    C,CONST        ; Loop till we get any character
  765.     CALL    BDOSAV
  766.     OR    A
  767.     JR    Z,WA4CH
  768.     LD    C,CONIN        ; Get the character
  769.     CALL    BDOSAV
  770.     JR    GOT1B        ; Continue. Process the char also, but not ^S.
  771. ;
  772. ;............................................................................
  773. ;
  774. NLNZ:    LD    C,CONST        ; Normally, just check console status.
  775.     CALL    BDOSAV
  776.     OR    A
  777.     JR    NZ,GOT1
  778. ;
  779. RETABT:    POP    DE        ; Always return from this subr from here
  780.     POP    BC
  781.     POP    AF
  782.     RET
  783. ;
  784. ;..............................................................................
  785. ;
  786. GOT1:    LD    C,CONIN        ; Get the pending console character
  787.     CALL    BDOSAV
  788.     CP    'S'-40H        ; ^S pauses
  789.     JR    Z,WA4CH
  790. ;
  791. GOT1B:    CP    ' '        ; Space sets the line counter to one
  792.     JR    Z,SET1
  793. ;
  794.     AND    1FH        ; ^C, ^K, ^X, C, K, X, etc all abort
  795.     CP    'C'-40H
  796.     JR    Z,ABRT
  797.     CP    'K'-40H
  798.     JR    Z,ABRT
  799.     CP    'X'-40H
  800.     JR    NZ,RETABT    ; Ignore other keys
  801. ;
  802. ABRT:    JP    RETCCP        ; Fix stack and exit direct
  803. ;                ; -----------------------
  804. SET1:    LD    A,1        ; Set line counter to '1'
  805.     LD    (LINCTR),A
  806.     JR    RETABT
  807. ;
  808. ;____________________________________________________________________________
  809. ;
  810. PFNAME:    LD    B,8        ; Print filename spec'd by HL. Inject the "."
  811.     CALL    FNLP
  812.  
  813.     LD    A,'.'        ; Inject a "."
  814.     CALL    TYPE
  815.     LD    B,3        ; Fall through for extension
  816.  
  817. FNLP:    LD    A,(HL)        ; Types 8 filename chars
  818.     INC    HL        ; 3 filetype chars
  819.     RLA
  820.     JR    C,$+5        ; Check for high bit set
  821.     RRA
  822.     JR    FNLP1        ; Not set, print as is
  823.  
  824.     RRA
  825.     AND    07FH
  826.     OR    020H        ; Print lowercase for char+80h
  827.     CP    020H
  828.     JR    NZ,FNLP1
  829.     LD    A,'_'        ; Print underline for space+80h
  830.  
  831. FNLP1:
  832.     CALL    TYPE
  833.     DJNZ    FNLP
  834.     RET
  835. ;
  836. ;
  837. ;____________________________________________________________________________
  838. ;
  839. ; Convert a binary number to four chars ASCII & type them, right justified.
  840. ;
  841. DECOUT:    CALL    DIV10        ; Divide orig # (in hl), by 10
  842.     LD    A,L        ; Get remainder from l, (0-9)
  843.     PUSH    AF        ; Save in reverse order retrieval later
  844.     EX    DE,HL        ; Old dividend becomes new divisor
  845.     CALL    DIV10        ; Repeat 3 more times
  846.     LD    A,L
  847.     PUSH    AF
  848.     EX    DE,HL
  849.     CALL    DIV10
  850.     LD    A,L
  851.     PUSH    AF
  852.     EX    DE,HL
  853.     CALL    DIV10
  854.     LD    A,L
  855.     PUSH    AF
  856.     EX    DE,HL
  857.     LD    B,3        ; Becomes loop counter
  858.     LD    C,0EFH        ; Mask to convert zeroes to blanks
  859. ;
  860. DECLP:    POP    AF        ; Type the 4 digits, with leading 0 suppression
  861.     OR    A        ; Is it zero?
  862.     JR    Z,LVMASK    ; Lv mask set if so
  863.     LD    C,0FFH        ; Else cancel masking (of zeroes to blanks)
  864. ;
  865. LVMASK:    ADD    A,'0'        ; Convert to ASCII
  866.     AND    C        ; Possibly blank a zero
  867.     CALL    TYPE        ; Output the character
  868.     DJNZ    DECLP        ; Do the first 3 digits
  869. ;
  870.     POP    AF        ; Last digit is easy. Never blank it.
  871.     ADD    A,'0'        ; Convert to ACSII
  872.     CALL    TYPE        ; Type it and return
  873.     RET
  874. ;
  875. ;____________________________________________________________________________
  876. ;
  877. DIV10:    EX    DE,HL        ; Divide 16 bit value in HL by 10
  878.     LD    HL,0        ; Zero the low byte
  879.     LD    BC,-10        ; We can skip the negation code
  880.     LD    A,11H        ; Iterations, 17 req. to get all the de bits
  881.     JR    UM1
  882. UM0:    ADC    HL,HL
  883. ;
  884. UM1:    ADD    HL,BC        ; Divide HLDE by -BC
  885.     JR    C,UM2        ; If it fits
  886.     SBC    HL,BC        ; Else restore it
  887.     OR    A        ; Make sure carry is 0
  888. ;
  889. UM2:    RL    E        ; Result bit to DE
  890.     RL    D
  891.     DEC    A
  892.     JR    NZ,UM0        ; Continue
  893.     RET
  894. ;
  895. ;............................................................................
  896. ;
  897. HEXO:    PUSH    AF        ; Output the byte in A as hex (2 ascii chars)
  898.     SRL    A
  899.     SRL    A
  900.     SRL    A
  901.     SRL    A        ; Get ms nyb
  902.     CALL    NYBOUT        ; Output that
  903.     POP    AF        ; Orig byte again
  904.     AND    0FH        ; Ls nym
  905. ;
  906. NYBOUT:    OR    30H        ; Embedded subr to output 1 nybble starts here
  907.     CP    3AH        ; See if dec --> ascii conv exceeds "9"
  908.     JR    C,SKIP7        ; Ok if not
  909.     ADD    A,7        ; Else add offset to to get to "A"
  910. ;
  911. SKIP7:    CALL    TYPE        ; Type the ascii char
  912.     RET
  913. ;
  914. ;============================================================================
  915. ;
  916. ; Convert the 2 byte date value in HL, in DRI format, to something
  917. ; usable; values returned as "date", "month", and "year"
  918. ;
  919. DATE:    ;LD    HL,(DATVAL)    ; # of days since Dec 31, 1977
  920.     LD    A,H
  921.     OR    L        ; Zero is indicative of an undated entry
  922.     JR    Z,CHKDS        ; If so, go try to get a date some other way
  923. ;
  924.     LD    A,78H        ; Init to BCD 1978
  925.     LD    DE,365        ; Amount to subtract per year (except leap)
  926.     LD    B,28        ; #of days in Feb for current year
  927. ;
  928. YRLP:    AND    A        ; Clear carry
  929.     SBC    HL,DE        ; Subtract 1 year
  930.     JR    Z,GOTYR
  931.     JR    C,GOTYR        ; If carry, we've gone too far
  932.     ADD    A,1        ; Else incr year by one (BCD)
  933.     DAA
  934.     AND    A
  935.     SBC    HL,DE        ; Repeat for the following [non-leap] year
  936.     JR    Z,GOTYR
  937.     JR    C,GOTYR
  938.     ADD    A,1
  939.     DAA
  940.     INC    B        ; The following year IS a leap year
  941.     INC    DE        ; So use 366 for DE and flag B with a "29"
  942.     AND    A
  943.     SBC    HL,DE
  944.     JR    Z,GOTYR
  945.     JR    C,GOTYR
  946.     ADD    A,1
  947.     DAA
  948.     DEC    DE        ; Put year and #of Feb days back to normal
  949.     DEC    B
  950.     AND    A
  951.     SBC    HL,DE        ; Repeat for one more [non-leap] year
  952.     JR    Z,GOTYR
  953.     JR    C,GOTYR
  954.     ADD    A,1
  955.     DAA
  956.     JR    YRLP        ; And loop
  957. ;
  958. ;............................................................................
  959. ;
  960. GOTYR:    ADD    HL,DE        ; Reverse the last subtraction with current val
  961.     LD    (YEAR),A    ; The correct year value, BCD
  962.     LD    A,B        ; And save current Feb val for future ref
  963.     LD    (FEB),A
  964.     LD    BC,MONTBL    ; Table of #of days/month
  965. ;
  966. MNTHLP:    LD    A,(BC)        ; Get #of days
  967.     LD    E,A        ; Put it in DE
  968.     LD    D,0
  969.     AND    A
  970.     SBC    HL,DE        ; Subtract
  971.     JR    Z,GOTMON
  972.     JR    C,GOTMON    ; If carry, we've gone too far again
  973.     INC    BC        ; Else move ahead to the next month
  974.     INC    BC
  975.     INC    BC
  976.     INC    BC
  977.     INC    BC        ; (1 byte for #of days, 4 bytes for abrev.)
  978.     LD    A,C
  979.     CP    LOW(ENDTBL)    ; (table is <256 bytes, so this is OK)
  980.     JR    NZ,MNTHLP
  981. ;
  982.     LD    DE,INTERR    ; *** this shouldn't happen? ***
  983.     CALL    MESAGE        ; (algorithm error; for debugging only)
  984.     JP    RETCCP
  985. ;
  986. GOTMON:    ADD    HL,DE        ; Once again, add back in
  987.     INC    BC        ; Meanwhile, keep pointer to month text
  988.     LD    (MONTH),BC
  989.     LD    A,L        ; The remainder should be the day#
  990.     CP    0AH        ; Final BCD conversion
  991.     JR    C,OKD
  992.     ADD    A,6
  993.     CP    1AH
  994.     JR    C,OKD
  995.     ADD    A,6
  996.     CP    2AH
  997.     JR    C,OKD
  998.     ADD    A,6
  999.  
  1000. OKD:    LD    (DAY),A
  1001.     AND    A        ; Return with clear carry
  1002.     RET            ; And that's it!
  1003. ;
  1004. ;............................................................................
  1005. ;
  1006. ; Failing to find an LBR date, program will support the system specific format
  1007. ; of the CR23D program which embeds a date in the header of the crunched file
  1008. ; (Recognized by "01" after filename before "00" terminating header area)
  1009. ;
  1010. CHKDS:    LD    A,(CRFLAG)    ; If it wasn't crunched, don't even bother
  1011.     INC    A        ; 0ffh if crunched
  1012.     JR    Z,OKSOFR
  1013. ;
  1014. NOTD:    SCF            ; Else just set carry (means no date info)
  1015.     RET            ; And return
  1016. ;
  1017. OKSOFR:    LD    HL,DDMA+2    ; Loop to look for DateStamped file
  1018.     LD    A,1        ; Value to look for
  1019.     LD    B,13        ; Loop counter
  1020.  
  1021. LOOP01:    CP    (HL)        ; Check byte
  1022.     INC    HL
  1023.     JR    Z,GOTIT        ; Found the charicteristic "01"!
  1024.     JR    NC,NOTD        ; No carry implies we hit the zero
  1025.     DJNZ    LOOP01        ; Else keep checking
  1026.     JR    NOTD        ; Ran out, give up
  1027. ;
  1028. GOTIT:    PUSH    DE
  1029.     LD    DE,(OFFSET)    ; Offset to the date param we want
  1030.     ADD    HL,DE        ; Maybe advance, maybe not
  1031.     POP    DE
  1032.  
  1033.     LD    A,(HL)        ; Should already be pointing  to year
  1034.     INC    A        ; 00h in datestamp is converted to 0ffh
  1035.     JR    Z,$+3        ; in header to avoid terminating header
  1036.     DEC    A        ; convert 0ffh back to 00h
  1037.     LD    (YEAR),A    ; Already in BCD!
  1038.  
  1039.     INC    HL        ; Let's skip to day before month
  1040.     INC    HL
  1041.     LD    A,(HL)
  1042.     INC    A        ; Datestamped files may still have no
  1043.     JR    Z,$+3        ; dates in them (i.e., 00 00 00)
  1044.     DEC    A
  1045.     LD    (DAY),A        ; (Because that one's easy)
  1046.  
  1047.     DEC    HL        ; Now back to the month
  1048.     LD    A,(HL)
  1049.     INC    A
  1050.     JR    Z,$+3
  1051.     DEC    A
  1052.     CP    0AH        ; Leave 00-09 the way they are
  1053.     JR    C,LVMON
  1054.     SUB    6        ; (BCD to binary conversion)
  1055. ;
  1056. LVMON:    LD    B,A
  1057.     ADD    A,A        ; 2x val
  1058.     ADD    A,A        ; 4x val
  1059.     ADD    A,B        ; 5x val
  1060.     ADD    A,LOW(MONTBL-4)    ; +1 offsets to chars, -5 since Jan is 1 not 0
  1061.     LD    L,A
  1062.     LD    H,HIGH(MONTBL-4)
  1063.     JR    NC,NCM        ; Don't forget about a possible carry
  1064.     INC    H
  1065. ;
  1066. NCM:    LD    (MONTH),HL    ; Pointer to month text
  1067.     AND    A        ; Clr carry
  1068.     LD    DE,MONTBL    ; Ptr to months table
  1069.     SBC    HL,DE        ; Carry indicates 00h for month (no date)
  1070.     RET
  1071. ;
  1072. ;============================================================================
  1073. ;
  1074. ; Check a library directory entry before reading it into DIRBUF.  Returns Z
  1075. ; if the entry is OK, NZ if it is to be skipped (wildcard matcher adapted
  1076. ; from LDIRZ by Rick Conn).
  1077. ;
  1078. ACTIVQ:
  1079.     LD    A,(HL)        ; Must be an active member
  1080.     OR    A
  1081.     RET    NZ        ; Otherwise return NZ
  1082. ;
  1083.     PUSH    DE        ; Save incoming DE
  1084.     LD    DE,WLDFCB    ; Point to user's wildcard
  1085.     LD    A,(DE)
  1086.     SUB    ' '        ; Is it blank?
  1087.     JR    Z,JUSTDE    ; Then just return Z
  1088. ;
  1089.     PUSH    HL        ; Now save incoming HL
  1090.     INC    HL        ; Bump to member filename
  1091.     LD    B,11        ; Check 11 bytes
  1092. GETENT1:
  1093.     LD    A,(DE)        ; Check for match with wildcards
  1094.     LD    C,(HL)        ; Get target char
  1095.     INC    HL        ; Pt to next
  1096.     INC    DE
  1097.     CP    '?'        ; Wild match?
  1098.     JR    Z,GETENT2
  1099.     CP    C        ; Match?
  1100.     JR    NZ,GETE0    ; Skip if not, return NZ
  1101. GETENT2:
  1102.     DJNZ    GETENT1        ; Count down until Z
  1103. GETE0:
  1104.     POP    HL
  1105. JUSTDE:
  1106.     POP    DE
  1107.     RET
  1108.  
  1109. ;............................................................................
  1110. ;
  1111. MONTBL:    DB    31,'Jan$'
  1112. FEB:    DB    28,'Feb$'    ; This loc is written to with a "29" sometimes
  1113.     DB    31,'Mar$'
  1114.     DB    30,'Apr$'
  1115.     DB    31,'May$'
  1116.     DB    30,'Jun$'
  1117.     DB    31,'Jul$'
  1118.     DB    31,'Aug$'
  1119.     DB    30,'Sep$'
  1120.     DB    31,'Oct$'
  1121.     DB    30,'Nov$'
  1122.     DB    31,'Dec$'
  1123. ;
  1124. ENDTBL    EQU    $
  1125. ;
  1126. ;............................................................................
  1127. ;
  1128. LBRNAM:    DB    'Library File = $'
  1129. INTERR:    DB    CR,LF,'+ PGM ERR +',CR,LF,'$'
  1130. NSMSG:    DB    CR,LF,'+++ Library file not found +++',CR,LF,'$'
  1131. CORMSG:    DB    CR,LF,'+++ Library file is corrupt +++',CR,LF,'$'
  1132. EMPMSG:    DB    CR,LF,'+++ No (matching) members found +++',CR,LF,'$'
  1133. DATLES:    DB    '-- --- --  $'
  1134. MORPRM:    DB    '[more]$'
  1135. NOMSG:    DB    '               $'
  1136. CREMSG:    DB    'Cre $'
  1137. MODMSG:    DB    'Mod $'
  1138. ;
  1139. FRACTS:    DB    '.00k $  '    ; 0k
  1140.     DB    '.12k $  '    ; 1/8k
  1141.     DB    '.25k $  '    ; 1/4k
  1142.     DB    '.37k $  '    ; 3/8k
  1143.     DB    '.50k $  '    ; 1/2k
  1144.     DB    '.62k $  '    ; 5/8k
  1145.     DB    '.75k $  '    ; 3/4k
  1146.     DB    '.87k $  '    ; 7/8k
  1147.  
  1148. TYPE0:    DB    ' Stored $'    ; [Method = "none"]
  1149. TYPE1:    DB    'Squeezed$'
  1150. TYPE2:    DB    'Crunched$'
  1151. TYPE3:    DB    ' Cr-lzh $'
  1152. FNMSG:    DB    '(--> $'    ; Precedes uncompressed filename display
  1153. ;
  1154. ;............................................................................
  1155. ;
  1156. USAGE:    DB    CR,LF,'LDIR, v1.60   SGG   01 Jul 90',CR,LF
  1157. ;
  1158.     DB    'Syntax:',CR,LF,'  LDIR [d$'
  1159. USAG1:    DB    'u:]lbrname [afn.typ]',CR,LF,LF,'$'
  1160. ;
  1161. HEDING:
  1162.  DB    CR,LF
  1163.  DB    '   Name           Length     Method   Cre Date   Mod Date       Comments',CR,LF
  1164.  DB    '============   ====-======= ========  =========  =========  =================',CR,LF,'$'
  1165.  
  1166. CDATVAL:
  1167.     DS    2        ; Date in DRI format (# of days
  1168. MDATVAL:            ; ..since 31 Dec 1977)
  1169.     DS    2
  1170. OFFSET:    DS    2        ; Offset to date param in crunched files
  1171. YEAR:    DS    1        ; Year in BCD
  1172. MONTH:    DS    2        ; Pointer to "$" terminated month string
  1173. DAY:    DS    1        ; Day of month, BCD
  1174.  
  1175. OLDSTK:    DS    2        ; Save system stack here
  1176. DIRLEN:    DS    2        ; Directory length, #of records
  1177. INDEX:    DS    2        ; An RA index value to a beg of a menber file
  1178. CRFLAG:    DS    1        ; 0ffh if crunched, other values undefined
  1179. SQFLAG:    DS    1        ; 0ffh if squeezed, other values undefined
  1180. ZERFLG:    DS    1        ; 0 if zero-length member file
  1181. NFILES:    DS    2        ; Overall loop counter for program operation
  1182. HLSAVE:    DS    2        ; Temp storage for HL
  1183. OVFTPA:    DS    1        ; To monitor program case it tries to go nuts
  1184. LINCTR:    DS    1        ; Line counter for "[more]" prompt
  1185. WLDFCB:    DS    11        ; Safe storage for FCB2 filenametyp
  1186. ;
  1187.     DS    80H        ; Stack area for program's use
  1188. ;
  1189. STACK    EQU    $        ; TOS
  1190. ;
  1191. DIRBUF    EQU    $        ; Buffer begins here
  1192.     END
  1193.