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 / UTILITYS / FIND.ARC / FIND.ASM next >
Assembly Source File  |  1990-07-21  |  20KB  |  1,199 lines

  1.  
  2.     TITLE    'FIND+ 2.0'
  3. ;
  4. ;            FYNDE.ASM   Copyright (C) 1982
  5. ;            Universidad Autonoma de Puebla
  6. ;
  7. ;    The original of FIND wasn't copyright and neither is
  8. ;    my work on it here. Bill Bolton
  9. ;
  10. ;    -----------------------------------------------------
  11. ;
  12. ;    Reassembly of FIND.COM, which was originally extracted
  13. ;    from the CBBS(R) package available from Ward Christensen
  14. ;    and Randy Suess. However, considerable rearrangement has
  15. ;    taken place, most notably the following:
  16. ;
  17. ;    *    <no file name> results in a screen of information
  18. ;    *    the search pattern may be a regular expression
  19. ;    *    label+line number as an alternative to line number
  20. ;    *    instance count reported, both per file and globally
  21. ;    *    files listed in a table in the data section at the end
  22. ;         are automatically excluded
  23. ;    *    squeezed files do not deter the search
  24. ;
  25. ;    To achieve compatibility with MicroShell the vertical bar
  26. ;    may be replaced by exclamation point; all syntactic elements
  27. ;    are defined by EQU's and may be redefined. LABEL|PATTERN
  28. ;    is checked for balanced parentheses and non-null arguments
  29. ;    to forestall the most common failure modes. Had MicroShell
  30. ;    not been available, an option to direct the output to some
  31. ;    disk file would probably have been included.
  32. ;
  33. ;    **** N.B.  Exclamation point is not acceptable to CP/M+ ****
  34. ;
  35. ;VERSION LIST, in reverse order for easy on line scanning
  36. ;
  37. ;23/Oct/84 Added exclusion table code to check for file types
  38. ;       not to serach. Fixed bug when searching large files,
  39. ;       often started on non-zero exetent, which mightly
  40. ;       confused the file unsqueezing mechanism. Now once a
  41. ;       suitable file is found to search the extent is forced
  42. ;       to zero to start. Added conditional code for RCPM
  43. ;       use to test for SYS and F2 attributes along the lines
  44. ;       of FIND+. Lifted usage message from FIND+, added version
  45. ;       number to signon message. Version 2.0
  46. ;       Bill Bolton, Software Tools RCPM, Brisbane, Australia
  47. ;
  48. ;04/Jul/84 No false matches with nul lines. Harold V. Mcintosh
  49. ;
  50. ;01/Jul/84 Scan squeezed files. Harold V. McIntosh
  51. ;
  52. ;20/Dec/82 Originally written. Harold V. McIntosh
  53. ;
  54. ;    ----------------------------------------------------------
  55.  
  56.  
  57. TRUE    equ    0FFH
  58. FALSE    equ    0
  59. ;
  60. VERS    equ    20        ;version number
  61. ;
  62. HT    equ    09H        ;horizontal tab
  63. LF    equ    0AH        ;line feed
  64. CR    equ    0DH        ;carriage return
  65. KZ    equ    1AH        ;^Z
  66. MASK    equ    7FH        ;ASCII mask
  67.  
  68. ;    Delimiters for the command line
  69.  
  70. LSQ    equ    '['        ;begin alternative list
  71. RSQ    equ    ']'        ;end alternative list
  72. LBR    equ    '{'        ;begin iterated expression
  73. RBR    equ    '}'        ;end iterated expression
  74. ORR    equ    '|'        ;separate alternatives
  75.  
  76. ;    Representatives of characters or classes.
  77.  
  78. TAB    equ    '_'        ;substitute for tab
  79. QUE    equ    '?'        ;represent any byte
  80. ALF    equ    '@'        ;represent any alphanumeric
  81.  
  82. ;    CP/M and other locations and parameters
  83.  
  84. cfcb    equ    005CH        ;CP/M's file control block
  85. cblk    equ    007CH        ;CP/M's block counter
  86. csiz    equ    0080H        ;CP/M's record size
  87. cbuf    equ    0080H        ;CP/M's record buffer
  88. ksiz    equ    255        ;sector capacity of IN buffer
  89. isiz    equ    ksiz*128    ;buffer 2 file extents in memory
  90. hsiz    equ    256        ;max characters in Huffman code
  91. ;
  92. RCPM    equ    FALSE        ;true for RCPM use
  93. ;
  94. ;    ------------
  95.     org    100H
  96. ;    ------------
  97.  
  98. X0100:
  99.     lxi    sp,stak
  100.     lda    cfcb+1        ;file name
  101.     cpi    ' '
  102.     jnz    X0143
  103.     lxi    h,usage
  104. ferm:
  105.     call    mssg        ;message to console
  106.     jmp    0000
  107.  
  108. X0143:
  109.     lxi    h,signon
  110.     call    mssg        ;message to console
  111.     mvi    c,12
  112.     lxi    d,cfcb        ;CP/M's file control block
  113.     lxi    h,file
  114.     call    miuc        ;block move
  115.     xra    a
  116.     sta    enth
  117.     lxi    h,cbuf        ;CP/M's record buffer
  118.     mov    e,m
  119.     mov    c,e
  120.     mov    d,a
  121.     xchg
  122.     inx    d
  123.     dad    d
  124.     mov    m,a
  125.     xchg
  126. X0152:
  127.     inx    h
  128.     dcr    c
  129.     mov    a,m
  130.     ora    a
  131.     jz    X029C
  132.     cpi    ' '
  133.     jnz    X0152
  134.     inx    h
  135.     call    bala        ;check balance of [], {}.
  136.     call    nula        ;check for null alternatives
  137.     lxi    d,patt        ;command line pattern
  138.     call    muve
  139.     mvi    c,4
  140.     lxi    d,lzer
  141.     lxi    h,dtot
  142.     call    miuc        ;block move
  143.     lxi    h,0000
  144.     shld    lapo
  145.     lxi    h,patt        ;command line pattern
  146.     shld    papo
  147.     call    next
  148.     ora    a
  149.     jz    scan
  150.     shld    papo
  151.     lxi    h,patt
  152.     shld    lapo
  153.  
  154. ;    Scan the directory for file names.
  155.  
  156. scan:
  157.     mvi    c,26        ;(1A) set DMA address
  158.     lxi    d,cbuf        ;CP/M's record buffer
  159.     call    0005        ; - B D O S -
  160.     mvi    c,17        ;(11) search once
  161.     lxi    d,file
  162.     call    0005        ; - B D O S -
  163.     lxi    h,enth
  164.     inr    m
  165.     mov    c,m
  166. fnth:
  167.     inr    a
  168.     jz    done        ;we're all done
  169.     dcr    c
  170.     jz    this
  171.     push    b
  172.     mvi    c,18        ;(12) search again
  173.     lxi    d,file
  174.     call    0005        ; - B D O S -
  175.     pop    b
  176.     jmp    fnth
  177.  
  178. ;    We're all done.
  179.  
  180. done:
  181.     lxi    h,dtot
  182.     jmp    ferm        ;final (error) message
  183.  
  184. ;    A prospective file has been located
  185.  
  186. this:
  187.     dcr    a
  188.     ani    03
  189.     add    a
  190.     add    a
  191.     add    a
  192.     add    a
  193.     add    a
  194.     adi    81H
  195.     mov    e,a
  196.     mvi    d,00
  197.     mvi    c,11
  198.     lxi    h,cfcb+1    ;CP/M's file control block
  199.     call    miuc        ;block move
  200.     lxi    h,cfcb+12
  201.     xra    a
  202.     mov    m,a        ;make sure we start on extent 0
  203.  
  204.     if    rcpm        ;your favourite catalogue file type
  205.  
  206.     lda    cfcb+9
  207.     ani    mask
  208.     cpi    'C'        ;file type of CAT/CQT always OK
  209.     jnz    tagtest        ; on Tesseract RCPM+
  210.     lda    cfcb+10
  211.     ani    mask
  212.     cpi    'A'
  213.     cnz    Qcheck        ;maybe squeezed
  214.     jnz    tagtest
  215.     lda    cfcb+11
  216.     ani    mask
  217.     cpi    'T'
  218.     jz    ok    
  219. tagtest:
  220.     lda    cfcb+2
  221.     ani    80h        ;TAG2 attribute set?
  222.     jnz    scan        ;yes
  223.     lda    cfcb+10        ;no
  224.     ani    80h        ;SYS attribute set?
  225.     jnz    scan        ;yes
  226.  
  227.     endif    ;rcpm
  228.  
  229.     call    ignore        ;disregard files in table
  230.     jz    scan
  231.  
  232. ;    Open the file, check for squeezing.
  233.  
  234. ok:
  235.     mvi    c,15        ;(0F) open file
  236.     lxi    d,cfcb        ;CP/M's FCB
  237.     call    0005        ; - B I O S -
  238.     inr    a
  239.     jz    0000        ;quit [without message]
  240.     xra    a
  241.     sta    cblk        ;block pointer
  242.     sta    dens        ;z/nz=un/squeezed
  243.     sta    mult        ;repeat factor
  244.     lxi    h,0000
  245.     shld    ictr        ;input counter
  246.  
  247.     lxi    h,cfcb+10    ;CP/M's file control block
  248.     mov    a,m
  249.     cpi    'Q'
  250.     jnz    nsqz
  251.     call    gbyt        ;fetch one byte
  252.     cpi    076H
  253.     jnz    nsqz
  254.     call    gbyt        ;fetch one byte
  255.     cpi    0FFH
  256.     jnz    nsqz
  257.     lxi    h,dens        ;z/nz=un/squeezed
  258.     mvi    m,0FFH
  259.     call    rwor        ;fetch word
  260.  
  261. ;    unsqueezed file name
  262.  
  263.     lxi    b,200CH        ;twelve spaces
  264.     lxi    h,uzfn        ;unsqueezed file's name
  265.     call    fiuc        ;block fill
  266.  
  267.     mvi    b,8
  268.     lxi    d,uzfn        ;unsqueezed file's name
  269. luup:
  270.     call    gbyt        ;fetch one byte
  271.     ora    a
  272.     jz    ldic
  273.     cpi    '.'
  274.     jz    luuw
  275.     stax    d
  276.     inx    d
  277.     dcr    b
  278.     jnz    luup
  279. luuz:
  280.     call    gbyt
  281.     ora    a
  282.     jz    ldic
  283.     cpi    '.'
  284.     jnz    luuz
  285. luuw:
  286.     mvi    b,3
  287.     lxi    d,uzfn+8
  288.     stax    d
  289.     inx    d
  290. luur:
  291.     call    gbyt
  292.     ora    a
  293.     jz    ldic
  294.     stax    d
  295.     inx    d
  296.     dcr    b
  297.     jnz    luur
  298. luus:
  299.     call    gbyt
  300.     ora    a
  301.     jnz    luus
  302.  
  303. ;    load code directory
  304.  
  305. ldic:
  306.     call    rwor        ;fetch word
  307.     lxi    b,hsiz
  308.     mov    a,c
  309.     sub    l
  310.     mov    a,b
  311.     sbb    h
  312.     jnc    ldii
  313.     lxi    h,M8        ;'code table won't fit'
  314.     call    mssg
  315.     jmp    scan
  316.  
  317. ldii:
  318.     dad    h
  319.     dad    h
  320.     mov    c,l
  321.     mov    b,h
  322.     lxi    d,code        ;code table
  323. ldij:
  324.     call    gbyt        ;fetch one byte
  325.     stax    d
  326.     inx    d
  327.     dcx    b
  328.     mov    a,c
  329.     ora    b
  330.     jnz    ldij
  331.  
  332.     lxi    h,roco        ;rotation count
  333.     mvi    m,1
  334.  
  335. nsqz:
  336.     mvi    c,4
  337.     lxi    d,lzer
  338.     lxi    h,lnum        ;'line number'
  339.     call    miuc        ;block move
  340.  
  341.     mvi    c,4
  342.     lxi    d,lzer
  343.     lxi    h,ftot        ;'file total'
  344.     call    miuc        ;block move
  345.  
  346.     mvi    c,8
  347.     lxi    d,cfcb+1    ;file name
  348.     lxi    h,fnam        ;'file name'
  349.     call    miuc        ;block move
  350.  
  351.     mvi    c,3
  352.     lxi    d,0065H        ;extension
  353.     lxi    h,fext        ;'file extension'
  354.     call    miuc        ;block move
  355.  
  356.     lxi    h,fhed
  357.     call    mssg        ;message to console
  358.     lda    dens
  359.     ora    a
  360.     jz    sixs
  361.     lxi    h,hesq        ;'[original]'
  362.     call    mssg
  363.  
  364. sixs:
  365. ;    lxi    b,2006H        ;six spaces
  366. ;    lxi    h,llbl
  367. ;    call    fiuc        ;block fill
  368.  
  369. X01C8:
  370.     lxi    h,lnum+3    ;increment l.c.
  371.     call    inco        ;increment line counter
  372.     lxi    h,lbuf        ;line buffer
  373.     mvi    b,0FFH
  374. X01E0:
  375.     inr    b
  376.     jm    X01FD
  377.     push    b
  378.     push    h
  379.     call    inch        ;char from big bffr to line bffr
  380.     pop    h
  381.     pop    b
  382.     mov    m,a
  383.     inx    h
  384.     cpi    KZ
  385.     jnz    X01E8
  386.     lxi    h,ftot
  387.     call    mssg        ;message to console
  388.     jmp    scan
  389. X01E8:
  390.     cpi    LF
  391.     jnz    X01E0
  392.     jmp    X0202
  393.  
  394. X01FD:
  395.     mvi    m,CR
  396.     inx    h
  397.     mvi    m,LF
  398.     inx    h
  399.  
  400. ;    Check console for termination request. If one
  401. ;    is present, clear it out before leaving.
  402.  
  403. X0202:
  404.     mvi    m,00        ;guarantee right hand fence
  405.     mvi    c,11        ;(0B) console status
  406.     call    0005        ; - B I O S -
  407.     ora    a
  408.     jz    culi
  409.     mvi    c,1        ;(01) read console
  410.     call    0005        ; - B D O S -
  411.     cpi    03H        ;^C
  412.     jnz    skpf
  413.     lxi    h,M4        ;"search terminated"
  414.     jmp    ferm        ;final (error) message
  415.  
  416. skpf:
  417.     lxi    h,M5        ;"remainder of file skipped"
  418.     call    mssg        ;message to console
  419.     jmp    scan
  420.  
  421. ;    Scan the current line.
  422. ;    First see if it is labelled.
  423.  
  424. culi:
  425.     lhld    lapo
  426.     mov    a,h
  427.     ora    l
  428.     jz    X0217        ;no label requested
  429.     xchg
  430.     lxi    h,lbuf
  431.     call    chek
  432.     jnz    X0217        ;label not found
  433.     push    h
  434.     lxi    b,2006H        ;six spaces
  435.     lxi    h,llbl
  436.     call    fiuc        ;block fill
  437.     pop    h
  438.     lxi    d,llbl+5
  439.     mvi    c,6
  440. didl:
  441.     dcx    h
  442.     mov    a,m
  443.     cpi    HT        ;ignore tabs in text
  444.     jz    didl
  445.     cpi    ' '        ;quit at head of line
  446.     jc    dido
  447.     stax    d
  448.     dcx    d
  449.     dcr    c
  450.     jnz    didl
  451. dido:
  452.     mvi    c,4
  453.     lxi    d,lzer
  454.     lxi    h,lnum
  455.     call    miuc        ;block move
  456.  
  457. ;    Now look for the pattern
  458.  
  459. X0217:
  460.     lxi    h,lbuf        ;line buffer
  461. X021A:
  462.     xchg
  463.     lhld    papo        ;pattern pointer
  464.     xchg
  465.     push    h
  466.     call    chek
  467.     pop    h
  468.     jz    X0263
  469.     mov    a,m
  470.     cpi    CR
  471.     jz    X01C8        ;increment l.c. at X026A
  472.     inx    h
  473.     jmp    X021A
  474.  
  475. ;    Pattern matches, so type label & line containing it
  476.  
  477. X0263:
  478. ;    lxi    h,llbl        ;line label
  479. ;    call    mssg        ;message to console
  480.     lxi    h,lbuf        ;line buffer
  481.     call    mssg        ;message to console
  482.     lxi    h,ftot+3
  483.     call    inco
  484.     lxi    h,dtot+3
  485.     call    inco
  486.     jmp    X01C8        ;increment l.c. at X026A
  487.  
  488. ;    Increment ASCII counter at (HL-3).
  489.  
  490. inco:
  491.     mov    a,m
  492.     ori    30H
  493.     inr    a
  494.     mov    m,a
  495.     cpi    ':'
  496.     rnz
  497.     mvi    m,'0'
  498.     dcx    h
  499.     jmp    inco
  500.  
  501. ;    Memory to console
  502.  
  503. mssg:
  504.     mov    e,m
  505.     inx    h
  506.     push    h
  507.     mvi    c,2        ;(02) write console
  508.     call    0005        ; - B I O S -
  509.     pop    h
  510.     mov    a,m
  511.     ora    a
  512.     jnz    mssg        ;message to console
  513.     ret
  514.  
  515. X029C:
  516.     lxi    h,M3        ;"bad pattern"
  517.     call    ferm        ;final (error) message
  518.  
  519. ;    decode next character
  520.  
  521. dnch:
  522.     lxi    h,code        ;code table
  523. dncr:
  524.     call    rbit
  525.     jnc    dncs
  526.     inx    h
  527.     inx    h
  528. dncs:
  529.     mov    e,m
  530.     inx    h
  531.     mov    d,m
  532.     mov    a,d
  533.     cpi    0FEH
  534.     jz    dnct
  535.     ora    a
  536.     jp    dncu
  537.     mov    a,e
  538.     cma
  539.     stc
  540.     cmc
  541.     ret
  542.  
  543. dnct:
  544.     stc
  545.     ret
  546.  
  547. ;    Calculate <code>+4*<offset>.
  548.  
  549. dncu:
  550.     lxi    h,code        ;code table
  551.     dad    d
  552.     dad    d
  553.     dad    d
  554.     dad    d
  555.     jmp    dncr
  556.  
  557. ;    read one bit at a time
  558.  
  559. rbit:
  560.     push    h
  561.     lxi    h,roco        ;rotation count
  562.     dcr    m
  563.     jnz    rbiu
  564.     mvi    m,8
  565.     call    gbyt        ;fetch one byte
  566.     sta    roby        ;rotating byte
  567. rbiu:
  568.     lda    roby        ;rotating byte
  569.     rar
  570.     sta    roby        ;rotating byte
  571.     pop    h
  572.     ret
  573.  
  574. ;    read one word
  575.  
  576. rwor:
  577.     call    gbyt        ;fetch one byte
  578.     push    psw
  579.     call    gbyt        ;fetch one byte
  580.     pop    h
  581.     mov    l,h
  582.     mov    h,a
  583.     ret
  584.  
  585. ;    Fetch the next byte. The input buffer will be refreshed if it
  586. ;    is necessary. For normal files, one byte will be extracted from
  587. ;    the input buffer; for squeezed files, one byte will be decoded
  588. ;    from the incoming bit stream and subtracted from the checksum.
  589.  
  590. inch:
  591.     lda    dens        ;z/nz = un/squeezed
  592.     ora    a
  593.     jz    gbyt        ;fetch one byte
  594.     lda    mult        ;repeat factor
  595.     ora    a
  596.     jz    gusq
  597.     dcr    a
  598.     sta    mult        ;repeat factor
  599.     lda    lach        ;last character read
  600.     ret
  601.  
  602. gusq:
  603.     call    dnch
  604.     jnc    guss
  605.     mvi    a,1AH
  606.     ret
  607.  
  608. guss:
  609.     cpi    090H
  610.     jz    gusu
  611.     sta    lach        ;last character read
  612.     ret
  613.  
  614. gusu:
  615.     call    dnch
  616.     ora    a
  617.     jnz    gusv
  618.     mvi    a,090H
  619.     ret
  620.  
  621. gusv:
  622.     dcr    a
  623.     dcr    a
  624.     sta    mult        ;repeat factor
  625.     lda    lach        ;last character read
  626.     ret
  627.  
  628. ;    unsqueezed (normal) text
  629.  
  630. gbyt:
  631.     lhld    ictr        ;input counter
  632.     mov    a,h
  633.     ora    l
  634.     cz    indi        ;disk to IN area
  635.     lhld    ictr        ;input counter
  636.     dcx    h
  637.     shld    ictr        ;input counter
  638.     lhld    iptr        ;input pointer
  639.     mov    a,m
  640.     inx    h
  641.     shld    iptr        ;input pointer
  642.     ret
  643.  
  644. indi:
  645.     mvi    b,ksiz
  646.     lxi    h,isiz
  647.     shld    ictr        ;input counter
  648.     lxi    h,ibuf        ;input buffer
  649.     shld    iptr        ;input pointer
  650. indd:
  651.     mvi    m,KZ
  652.     push    h
  653.     push    b
  654.     xchg
  655.     mvi    c,26        ;(1A) set DMA address
  656.     call    0005        ; - B D O S -
  657.     lxi    d,cfcb        ;CP/M's file control block
  658.     mvi    c,20        ;(14) read one record
  659.     call    0005        ; - B D O S -
  660.     pop    b
  661.     pop    h
  662.     ora    a
  663.     rnz
  664.     dcr    b
  665.     rz
  666.     lxi    d,csiz        ;CP/M's record size
  667.     dad    d
  668.     jmp    indd
  669.  
  670. ;    Disregard certain files
  671.  
  672. ignore:
  673.     mvi    c,(table$end - table$start)/3
  674.     lxi    h,table$start-3
  675.     shld    store
  676. loop:
  677.     lhld    store        ;get pointer
  678.     lxi    d,3        ;bump to next entry
  679.     dad    d
  680.     shld    store
  681.     lxi    d,cfcb+9    ;point to start of file type
  682.     call    match        ;matched?
  683.     rz            ;yes
  684.     dcr    c        ;no, finished count?
  685.     jnz    loop        ;no
  686.     mvi    a,1        ;yes
  687.     ora    a        ;return non-zero
  688.     ret
  689.  
  690. match:
  691.     ldax    d
  692.     ani    mask
  693.     cmp    m        ;first character match?
  694.     rnz            ;no
  695.     inx    h
  696.     inx    d
  697.     ldax    d
  698.     ani    mask
  699.     cmp    m        ;second character match?
  700.     cnz    Qcheck        ;squeezed version of file type?
  701.     rnz            ;no
  702.     inx    h
  703.     inx    d
  704.     ldax    d
  705.     ani    mask
  706.     cmp    m        ;third character match?
  707.     ret
  708.     
  709. Qcheck
  710.     cpi    'Q'
  711.     ret
  712.  
  713. ;    Advance to next alternative
  714.  
  715. nexx:
  716.     mov    e,m
  717.     inx    h
  718.     mov    d,m
  719.     xchg
  720. next:
  721.     mov    a,m
  722.     ora    a
  723.     rz
  724.     inx    h
  725.     call    enda
  726.     rz
  727.     call    begb
  728.     jz    nexx
  729.     jmp    next
  730.  
  731. ;    Block fill with C B's starting at (HL).
  732.  
  733. fiuc:
  734.     mov    m,b
  735.     inx    h
  736.     dcr    c
  737.     jnz    fiuc        ;block fill
  738.     ret
  739.  
  740. ;    Block move of C bytes from (DE) to (HL).
  741.  
  742. miuc:
  743.     ldax    d
  744.     mov    m,a
  745.     inx    d
  746.     inx    h
  747.     dcr    c
  748.     jnz    miuc        ;block move
  749.     ret
  750.  
  751. ;    Move and semi-compile the command line.
  752.  
  753. muve:
  754.     mov    a,m
  755.     cpi    TAB
  756.     jnz    munt
  757.     mvi    a,HT
  758. munt:
  759.     stax    d
  760.     inx    h
  761.     inx    d
  762.     cpi    RBR
  763.     jz    murb
  764.     cpi    RSQ
  765.     jz    murb
  766.     cpi    LBR
  767.     jz    mulb
  768.     cpi    LSQ
  769.     jz    mulb
  770. must:
  771.     dcr    c
  772.     jnz    muve
  773.     ret
  774.  
  775. murb:
  776.     xthl
  777.     mov    m,e
  778.     inx    h
  779.     mov    m,d
  780.     pop    h
  781.     jmp    must
  782.  
  783. mulb:
  784.     push    d
  785.     inx    d
  786.     inx    d
  787.     jmp    must
  788.  
  789. ;    Check balance of []'s and {}'s.
  790.  
  791. bala:
  792.     push    h
  793.     push    b
  794.     lxi    b,0101H
  795. balb:
  796.     mov    a,m
  797.     inx    h
  798.     cpi    LSQ
  799.     jnz    balc
  800.     inr    b
  801.     jmp    balb
  802. balc:
  803.     cpi    RSQ
  804.     jnz    bald
  805.     dcr    b
  806.     jz    balx
  807.     jmp    balb
  808. bald:
  809.     cpi    LBR
  810.     jnz    bale
  811.     inr    c
  812.     jmp    balb
  813. bale:
  814.     cpi    RBR
  815.     jnz    balf
  816.     dcr    c
  817.     jz    balx
  818.     jmp    balb
  819. balf:
  820.     ora    a
  821.     jnz    balb
  822.     mov    a,c
  823.     cpi    01
  824.     jnz    balx
  825.     mov    a,b
  826.     cpi    01
  827.     pop    b
  828.     pop    h
  829.     rz
  830. balx:
  831.     lxi    h,M3        ;"bad pattern"
  832.     jmp    ferm        ;final (error) message
  833.  
  834. ;    Check for termination of alternative.
  835.  
  836. enda:
  837.     cpi    ORR
  838.     rz
  839. endb:
  840.     cpi    RSQ
  841.     rz
  842.     cpi    RBR
  843.     rz
  844.     ora    a
  845.     ret
  846.  
  847. ;    Check for beginning of alternative.
  848.  
  849. bega:
  850.     cpi    ORR
  851.     rz
  852. begb:
  853.     cpi    LSQ
  854.     rz
  855.     cpi    LBR
  856.     ret
  857.  
  858. ;    Check for null alternative.
  859.  
  860. nula:
  861.     push    h
  862.     call    nulb
  863.     pop    h
  864.     ret
  865. nulb:
  866.     mov    a,m
  867.     inx    h
  868.     ora    a
  869.     rz
  870.     call    bega
  871.     jnz    nulb
  872.     mov    a,m
  873.     call    enda
  874.     jnz    nulb
  875.     jmp    balx
  876.  
  877. ;    Check for given expression.
  878.  
  879. chek:
  880.     ldax    d
  881.     inx    d
  882.     call    enda
  883.     rz
  884.     mov    b,a
  885.     mov    a,m
  886.     cpi    CR
  887.     jz    chno
  888.     mov    a,b
  889.     cpi    LBR
  890.     jz    chlb
  891.     cpi    LSQ
  892.     jz    chsq
  893.     mov    c,m
  894.     inx    h
  895.     cpi    QUE
  896.     jz    chek
  897.     cpi    ALF
  898.     jz    chal
  899.     cmp    c
  900.     jz    chek
  901.     mov    b,a
  902.     mov    a,c
  903.     cpi    'a'
  904.     jc    chno
  905.     cpi    '{'
  906.     jnc    chno
  907.     ani    05FH
  908.     cmp    b
  909.     jz    chek
  910. chno:
  911.     ori    0FFH
  912.     ret
  913.  
  914. ;    Check alphanumeric.
  915.  
  916. chal:
  917.     mov    a,c
  918.     cpi    '0'
  919.     jc    chno
  920.     cpi    ':'
  921.     jc    chek
  922.     cpi    'A'
  923.     jc    chno
  924.     cpi    '['
  925.     jc    chek
  926.     cpi    'a'
  927.     jc    chno
  928.     cpi    '{'
  929.     jc    chek
  930.     jmp    chno
  931.  
  932. ;    Check list of alternatives.
  933.  
  934. chsq:
  935.     mov    c,l
  936.     mov    b,h
  937.     lhld    sqxx
  938.     push    h
  939.     lhld    sqaa
  940.     push    h
  941.     lhld    sqzz
  942.     push    h
  943.     mov    l,c
  944.     mov    h,b
  945.     shld    sqxx
  946.     xchg
  947.     mov    e,m
  948.     inx    h
  949.     mov    d,m
  950.     inx    h
  951.     shld    sqaa
  952.     xchg
  953.     shld    sqzz
  954. chaa:
  955.     lhld    sqxx
  956.     call    chek
  957.     jz    chff
  958. chbb:
  959.     lhld    sqaa        ;fail so find next alternative
  960. chcc:
  961.     call    next
  962.     cpi    RSQ
  963.     jz    chdd        ;no more alternatives, so fail
  964.     cpi    ORR
  965.     jnz    chcc
  966.     shld    sqaa
  967.     xchg
  968.     jmp    chaa        ;try next alternative
  969. chdd:
  970.     lhld    sqxx
  971.     ori    0FFH
  972. chee:
  973.     mov    c,l
  974.     mov    b,h
  975.     pop    h
  976.     shld    sqzz
  977.     pop    h
  978.     shld    sqaa
  979.     pop    h
  980.     shld    sqxx
  981.     mov    l,c
  982.     mov    h,b
  983.     ret
  984. chff:
  985.     xchg            ;good alternative, try rest
  986.     lhld    sqzz
  987.     xchg
  988.     call    chek
  989.     jz    chee
  990.     jmp    chbb
  991.  
  992. ;    Check iterative pattern.
  993.  
  994. chlb:
  995.     mov    c,l
  996.     mov    b,h
  997.     lhld    text
  998.     push    h
  999.     lhld    texx
  1000.     push    h
  1001.     lhld    rest
  1002.     push    h
  1003.     lhld    repeat
  1004.     push    h
  1005.     lhld    repp
  1006.     push    h
  1007.     mov    l,c
  1008.     mov    h,b
  1009.     shld    text
  1010.     shld    texx
  1011.     xchg
  1012.     mov    e,m
  1013.     inx    h
  1014.     mov    d,m
  1015.     inx    h
  1016.     shld    repeat
  1017.     shld    repp
  1018.     xchg
  1019.     shld    rest
  1020. chlc:
  1021.     lhld    rest
  1022.     xchg
  1023.     lhld    text
  1024.     call    chek        ;check rest
  1025.     jz    chzz
  1026. chii:
  1027.     lhld    repeat        ;rest failed
  1028.     xchg
  1029.     lhld    text        ;keep same text
  1030.     call    chek        ;try out the rer
  1031.     jnz    choo
  1032.     shld    text        ;repeater worked, record progress
  1033.     lhld    repp        ;start alternatives over again
  1034.     shld    repeat
  1035.     jmp    chlc
  1036. choo:
  1037.     lhld    repeat        ;rer failed, try next
  1038. chxx:
  1039.     call    next
  1040.     cpi    RBR
  1041.     jz    chyy        ;this was the last, quit
  1042.     cpi    ORR
  1043.     jnz    chxx
  1044.     shld    repeat
  1045.     jmp    chii
  1046. chyy:
  1047.     lhld    texx
  1048.     ori    00        ;emphasize the RBR
  1049. chzz:
  1050.     mov    c,l
  1051.     mov    b,h
  1052.     pop    h
  1053.     shld    repp
  1054.     pop    h
  1055.     shld    repeat
  1056.     pop    h
  1057.     shld    rest
  1058.     pop    h
  1059.     shld    texx
  1060.     pop    h
  1061.     shld    text
  1062.     mov    l,c
  1063.     mov    h,b
  1064.     ret
  1065.  
  1066. ;    Data area
  1067.  
  1068.     if    rcpm
  1069.  
  1070. usage    db    CR,LF,CR,LF
  1071.     db    'Usage:',CR,LF
  1072.     db    HT,'FIND filename.typ string[|string]'
  1073.     db    CR,LF,CR,LF
  1074.     db    'Where:',CR,LF
  1075.     db    HT,'filename.typ =',HT,'any CATALOG name, (* and ? allowed).'
  1076.     db    CR,LF
  1077.     db    HT,HT,HT,'CATALOG names are...'
  1078.     db    CR,LF,LF
  1079.     db    HT,HT,HT,'SIGM.CQT, CUG.CQT, CPMUG.CQT, TESSER.CQT'
  1080.     db    CR,LF
  1081.     db    CR,LF
  1082.     db    HT,'string',HT,'     =',HT,'any string of characters'
  1083.     db    CR,LF
  1084.     db    HT,HT,HT,'(* and ? not allowed).'
  1085.     db    CR,LF,LF
  1086.     db    HT,'|',HT,'     =',HT,'optional OR connector for multiple strings'
  1087.     db    CR,LF
  1088.     db    HT,HT,HT,'i.e. FIND CUG.CQT DOC|TXT'
  1089.     db    CR,LF,CR,LF
  1090.     db    'Type HELP for a full description of FIND'
  1091.     db    CR,LF,0
  1092.     endif    ;rcpm
  1093.  
  1094.     if    not rcpm
  1095.  
  1096. usage    db 'FIND expects two parameters on the command line.',cr,lf
  1097.     db 'The first determines the file(s) you want to search, the',cr,lf
  1098.     db 'and the second specifies what you want to locate in them.',cr,lf
  1099.     db '     FIND D:FILE.EXT PATTERN',CR,LF
  1100.     db 'will search through all instances of "FILE.EXT" (ambiguous',cr,lf
  1101.     db 'file names are allowed) on disk D: to find lines containing',cr,lf
  1102.     db '"PATTERN".  A pattern may be a single string which can',cr,lf
  1103.     db 'contain the following meta-characters:',cr,lf
  1104.     db '   ? matches any single character',CR,LF
  1105.     db '   @ matches any alphanumeric: a-z, A-Z, 0-9',CR,LF
  1106.     db '   _ matches a horizontal tab',CR,LF
  1107.     db 'A string enclosed in {braces} matches 0 or more instances',cr,lf
  1108.     db 'of the string in a pattern.  For example, cp{?}m matches',cr,lf
  1109.     db 'CP/M and CPM.  To search for multiple patterns enclose them',cr,lf
  1110.     db 'in [brackets] and separate them with | characters',cr,lf
  1111.     db 'Squeezed files will be searched as well as unsqueezed ones.',cr,lf
  1112.     db 'Use ^C to quit, any other key skips to the next file.',CR,LF
  1113.     db    00
  1114.  
  1115.     endif    ;not rcpm
  1116.  
  1117. signon    db    CR,LF
  1118.     db    'FIND+ Version '
  1119.     db    VERS/10 + '0','.',VERS MOD 10 + '0'
  1120.     db    CR,LF,0
  1121.  
  1122. M3    db    '-- Bad Pattern --',00
  1123.  
  1124. M4    db    CR,LF,'-- Search Terminated --',00
  1125.  
  1126. M5    db    ' -- Remainder of File Skipped --',CR,LF,00
  1127.  
  1128. M8    db    ' -- Code Table Won''t Fit --',CR,LF,00
  1129.  
  1130. enth    ds    1
  1131. file    db    'DFilenameEXT',00
  1132.     ds    19
  1133.  
  1134. sqxx    ds    2
  1135. sqaa    ds    2
  1136. sqzz    ds    2
  1137. text    ds    2
  1138. texx    ds    2
  1139. rest    ds    2
  1140. repeat    ds    2
  1141. repp    ds    2
  1142.  
  1143.     ds    100        ;stack area
  1144. stak    ds    2        ;initialize stack pointer
  1145. lapo    ds    2        ;label pointer
  1146. papo    ds    2        ;pattern pointer
  1147. store    ds    2        ;name pointer
  1148. hesq    db    '[original]  '
  1149. uzfn    db    'original.xxx'    ;unsqueezed file's name
  1150.     db    CR,LF,00
  1151. fhed    db    CR,LF
  1152.     db    '----> File  '
  1153. fnam    db    'xxxxxxxx.'    ;filename
  1154. fext    db    'xxx',CR,LF,00    ;file extension
  1155. llbl    db    '      +'
  1156. lnum    db    '         ',00
  1157. lzer    db    '   0'
  1158. ftot    db    CR,LF
  1159.     db    '      matching lines found in this file.',CR,LF,00
  1160. dtot    db    '      matching lines in all the files searched.',CR,LF,00
  1161. ;
  1162. ;    Table of file types to exclude for searching
  1163. ;
  1164. table$start:
  1165.     db    'COM'        ;CP/M command file
  1166.     db    'OBJ'        ;CP/M command file
  1167.     db    'LBR'        ;LU/LAR library file
  1168.     db    'CMD'        ;CP/M-86 command file
  1169.     db    'REL'        ;Relocatable file
  1170.     db    'C0M'        ;MSDOS command file
  1171.     db    'EXE'        ;MSDOS command file
  1172.     db    'OVR'        ;Overlay file
  1173.     db    'OVL'        ;Overlay file
  1174.     db    'CRL'        ;BDS C relocatable file
  1175.     db    'IRL'        ;Libarary file
  1176.     db    'ABS'        ;JHB special
  1177.     db    'SPR'        ;CP/M+ system file
  1178.     db    'SYS'        ;    ditto
  1179.     db    'PRL'        ;    ditto
  1180.     db    'RSX'        ;    ditto
  1181. table$end:
  1182.  
  1183.     db    00        ;fence for line buffer
  1184. lbuf    ds    85H        ;line buffer
  1185. dens    ds    1        ;z/nz = un/squeezed
  1186. roby    ds    1        ;rotating byte
  1187. roco    ds    1        ;rotation count
  1188. mult    ds    1        ;r factor
  1189. lach    ds    1        ;last character read
  1190. ictr    ds    2        ;input counter
  1191. iptr    ds    2        ;input pointer
  1192. ibuf    ds    isiz        ;input buffer
  1193. patt    ds    256        ;command line pattern
  1194. code    ds    4*csiz        ;Huffman code table
  1195. fini    ds    0
  1196.  
  1197.     end
  1198.  
  1199.