home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol203 / ffynde.a86 < prev    next >
Text File  |  1984-12-19  |  24KB  |  1,271 lines

  1.  
  2. ;    ----------------------------------------------------------
  3. ;    FFYNDE.A86 is a variant of FYNDE.A86 in which a family of
  4. ;    files can be searched for many different keywords, which
  5. ;    are taken one at a time from an auxiliary file. Indices or
  6. ;    cross-reference listings are readily prepared by using it,
  7. ;    supposing that a previous pass has isolated the indexing
  8. ;    items and placed them in the auxiliary file. XREF.CNV can
  9. ;    be used for the initial pass.
  10. ;
  11. ;    Beware:
  12. ;        spaces count as part of patterns, especialy the
  13. ;        first ones: <file.ext  patt> has ONE space. So
  14. ;        does <file.ext patt >.
  15. ;
  16. ;        {?} requires at least ONE character.
  17. ;
  18. ;            FFYNDE.A86  Copyright (C) 1984
  19. ;            Universidad Autonoma de Puebla
  20. ;
  21. ;    [Harold V. McIntosh, 1 August 1984]
  22. ;    ----------------------------------------------------------
  23.  
  24. bdos    equ    224            ;BDOS interrupt
  25.  
  26. HT    equ    09H            ;horizontal tab
  27. LF    equ    0AH            ;line feed
  28. CR    equ    0DH            ;carriage return
  29. KZ    equ    1AH            ;^Z
  30.  
  31. ;    Delimiters for the command line
  32.  
  33. LSQ    equ    '['            ;begin alternative list
  34. RSQ    equ    ']'            ;end alternative list
  35. LBR    equ    '{'            ;begin iterated expression
  36. RBR    equ    '}'            ;end iterated expression
  37. ORR    equ    '!'            ;separate alternatives
  38.  
  39. ;    Representatives of characters or classes.
  40.  
  41. TAB    equ    '_'            ;substitute for tab
  42. QUE    equ    '?'            ;represent any byte
  43. ALF    equ    '@'            ;represent any alphanumeric
  44.  
  45. ;    CP/M and other locations and parameters
  46.  
  47. csiz    equ    0080H            ;CP/M's record size
  48. ksiz    equ    26            ;sector capacity of IN buffer
  49. isiz    equ    ksiz*128
  50. hsiz    equ    257            ;max characters in Huffman code
  51.  
  52. ;    -------------
  53.     org    005CH            ;CP/M's file control block
  54. cfcb    rb    0
  55.     org    0080H            ;CP/M's record buffer
  56. cbuf    rb    0
  57.     org    100H
  58. ;    -------------
  59.  
  60. begn:    mov    stak,sp
  61.     cmp    cfcb+1,' '        ;file name
  62.     jnz    ntut
  63.     mov    bx,(offset M1)        ;tutorial
  64. ferm:    call    mssg            ;message to console
  65. exit:    mov    sp,stak
  66.     mov    dl,00
  67.     mov    cl,00
  68.     int    BDOS
  69.  
  70. ntut:    mov    bx,(offset M2)        ;signon message
  71.     call    mssg            ;message to console
  72.  
  73.     mov    cx,12
  74.     mov    si,(offset cfcb)    ;CP/M's file control block
  75.     mov    bx,(offset sfam)    ;search family
  76.     call    miuc            ;block move
  77.  
  78.     mov    cx,12
  79.     mov    si,(offset cfcb+16)    ;CP/M's file control block
  80.     mov    bx,(offset kfil)    ;keyword FCB
  81.     call    miuc            ;block move
  82.     mov    cx,(offset 0015H)    ;21 0's
  83.     call    fiuc            ;block fill
  84.  
  85.     mov    bx,(offset kfil+9)    ;keyword FCB
  86.     cmp    (byte ptr[bx]),' '
  87.     jnz    kext
  88.     mov    (byte ptr[bx]),'S'
  89.     inc    bx
  90.     mov    (byte ptr[bx]),'Y'
  91.     inc    bx
  92.     mov    (byte ptr[bx]),'M'
  93.  
  94. kext:    mov    cx,9
  95.     mov    si,(offset cfcb+16)    ;CP/M's file control block
  96.     mov    bx,(offset xfil)    ;.XRF FCB
  97.     call    miuc            ;block move
  98.     mov    (byte ptr[bx]),'X'
  99.     inc    bx
  100.     mov    (byte ptr[bx]),'R'
  101.     inc    bx
  102.     mov    (byte ptr[bx]),'F'
  103.     inc    bx
  104.     mov    cx,(offset 0015)    ;21 0's
  105.     call    fiuc            ;block fill
  106.  
  107.     mov    bx,(offset cbuf)    ;CP/M's record buffer
  108.     mov    dl,(byte ptr[bx])
  109.     mov    dh,0
  110.     inc    dx
  111.     xchg    bx,dx
  112.     add    bx,dx
  113.     mov    (byte ptr[bx]),0
  114.     xchg    bx,dx
  115.  
  116. ;    Skip any initial spaces.
  117.  
  118. ispa:    inc    bx
  119.     mov    al,[bx]
  120.     or    al,al
  121.     jnz    G1
  122.     jmp    X029C            ;message 'bad pattern'
  123. G1:    cmp    al,' '
  124.     jz    ispa
  125.  
  126. ;    Skip over file name.
  127.  
  128. sfil:    inc    bx
  129.     mov    al,[bx]
  130.     or    al,al
  131.     jnz    G3
  132.     jmp    X029C            ;message 'bad pattern'
  133. G3:    cmp    al,' '
  134.     jnz    sfil
  135.  
  136. ;    skip over blanks
  137.  
  138. sblk:    inc    bx
  139.     mov    al,[bx]
  140.     or    al,al
  141.     jnz    G5
  142.     jmp    X029C            ;message 'bad pattern'
  143. G5:    cmp    al,' '
  144.     jz    sblk
  145.  
  146. ;    skip keyfile name
  147.  
  148. skey:    inc    bx
  149.     mov    al,[bx]
  150.     or    al,al
  151.     jz    hedr            ;no header desired
  152.     cmp    al,' '
  153.     jnz    skey
  154.     inc    bx            ;pass over last space
  155.  
  156. ;    Read header description.
  157.  
  158. hedr:    call    bala            ;check balance of [], {}.
  159.     call    nula            ;check for null alternatives
  160.     mov    si,(offset patt)    ;command line pattern
  161.     call    muve            ;copy & semicompile cmd line
  162.  
  163. ;    Open keyword file.
  164.  
  165.     mov    cl,15            ;(0F) open file
  166.     mov    dx,(offset kfil)    ;keyword FCB
  167.     int    bdos            ; - B D O S -
  168.     inc    al
  169.     jnz    okey
  170.     mov    bx,(offset nkey)    ;'cannot open keyword file'
  171.     jmp    ferm            ;final (error) message
  172.  
  173. ;    Create crossreference file.
  174.  
  175. okey:    mov    cl,17            ;(11) search for file
  176.     mov    dx,(offset xfil)    ;.XRF FCB
  177.     int    bdos            ; - B D O S -
  178.     inc    al
  179.     jz    cxrf
  180.     mov    bx,(offset yexi)    ;'file already exists'
  181.     jmp    ferm            ;final (error) message
  182.  
  183. cxrf:    mov    cl,22            ;(16) create file
  184.     mov    dx,(offset xfil)    ;.XRF FCB
  185.     int    bdos            ; - B D O S -
  186.     inc    al
  187.     jnz    gogo
  188.     mov    bx,(offset nxrf)    ;'can''t open file'
  189.     jmp    ferm            ;final (error) message
  190.  
  191. gogo:    mov    bx,(offset M2)        ;signon message
  192.     call    xref
  193.  
  194.     mov    cx,4
  195.     mov    si,(offset lzer)    ;zero line for counter
  196.     mov    bx,(offset ktot)    ;keyword total
  197.     call    miuc            ;block move
  198.  
  199.     mov    xctr,(offset csiz)    ;CP/M's record size
  200.     mov    xptr,(offset xbuf)    ;crossreference buffer
  201.     mov    kctr,0000        ;keyword counter
  202.     mov    lapo,0000        ;label pointer
  203.     mov    bx,(offset patt)    ;command line pattern
  204.     cmp    (byte ptr[bx]),00
  205.     jz    golu
  206.     mov    lapo,bx            ;label pointer
  207.  
  208. golu:    mov    si,(offset kwrd)    ;keyword pattern
  209.     mov    bx,(offset keyr)    ;raw keyword
  210.     call    meuv            ;read & semicompile keyword
  211.     cmp    al,01AH
  212.     jz    golv
  213.     xor    al,al
  214.     mov    [si],al
  215.     mov    [bx],al
  216.     mov    enth,al            ;search-again counter
  217.     mov    bx,(offset kwdi)    ;'keyword is'
  218.     call    xref            ;message to .XRF file
  219.     call    mssg            ;message to console
  220.     mov    bx,(offset crlf)
  221.     call    xref            ;message to .XRF file
  222.     call    mssg            ;message to console
  223.     call    ongo
  224.     mov    bx,(offset ktot+3)    ;total # keywords
  225.     call    inco            ;increment counter
  226.     jmp    golu
  227.  
  228. golv:    mov    bx,(offset ktot)    ;'keyword totals'
  229.     call    xref            ;message to .XRF file
  230.     call    mssg            ;message to console
  231.     call    zxrf
  232.     jmp    exit
  233.  
  234. ongo:    mov    cx,4
  235.     mov    si,(offset lzer)    ;zero line for counter
  236.     mov    bx,(offset dtot)    ;total throughout disk
  237.     call    miuc            ;block move
  238.  
  239. ;    Scan the directory for file names.
  240.  
  241. scan:    mov    cl,26            ;(1A) set DMA address
  242.     mov    dx,(offset cbuf)    ;CP/M's record buffer
  243.     int    bdos            ; - B D O S -
  244.  
  245.     mov    bx,(offset cfcb+12)
  246.     mov    (byte ptr[bx]),00
  247.  
  248.     mov    cl,17            ;(11) search once
  249.     mov    dx,(offset sfam)    ;search family
  250.     int    bdos            ; - B D O S -
  251.  
  252.     mov    bx,(offset enth)    ;search-again counter
  253.     inc    (byte ptr[bx])
  254.     mov    cl,(byte ptr[bx])
  255. fnth:    inc    al
  256.     jz    done            ;we're all done
  257.     dec    cl
  258.     jz    this
  259.     push    cx
  260.     mov    cl,18            ;(12) search again
  261.     mov    dx,(offset sfam)    ;search family
  262.     int    bdos            ; - B D O S -
  263.     pop    cx
  264.     jmp    fnth
  265.  
  266. ;    We're all done.
  267.  
  268. done:    mov    bx,(offset dtot)    ;total throughout disk
  269.     call    xref            ;message to .XRF file
  270.     jmp    mssg            ;message to console
  271.  
  272. ;    A prospective file has been located
  273.  
  274. this:    dec    al
  275.     and    al,03
  276.     mov    ah,32
  277.     mul    ah
  278.     add    ax,(offset cbuf+1)
  279.     mov    cx,12
  280.     mov    si,ax
  281.     mov    bx,(offset cfcb+1)    ;CP/M's file control block
  282.     call    miuc            ;block move
  283.  
  284.     mov    bx,(offset cfcb+9)    ;CP/M's file control block
  285.     call    dcom            ;disregard .COM files
  286.     jz    jsca
  287.     mov    bx,(offset cfcb+9)    ;CP/M's file control block
  288.     call    dcmd            ;disregard .CMD files
  289.     jz    jsca
  290.     mov    bx,(offset cfcb+9)    ;CP/M's file control block
  291.     call    dsys            ;disregard .SYS files
  292.     jz    jsca
  293.     mov    bx,(offset cfcb+9)    ;CP/M's file control block
  294.     call    dxrf            ;disregard .XRF files
  295.     jnz    ofcs
  296. jsca:    jmp    scan
  297.  
  298. ;    Open the file, check for squeezing.
  299.  
  300. ofcs:    mov    cl,15            ;(0F) open file
  301.     mov    dx,(offset cfcb)    ;CP/M's FCB
  302.     int    bdos            ; - B D O S -
  303.     inc    al
  304.     jnz    G20
  305.     jmp    exit            ;quit [without message]
  306. G20:    xor    al,al
  307.     mov    cfcb+32,al        ;block pointer
  308.     mov    dens,al            ;z/nz=un/squeezed
  309.     mov    mult,al            ;repeat factor
  310.     mov    ictr,0000        ;input counter
  311.  
  312.     mov    bx,(offset cfcb+10)    ;CP/M's file control block
  313.     cmp    (byte ptr[bx]),'Q'
  314.     jz    cota
  315.     jmp    nsqz
  316.  
  317. cota:    call    rwor            ;fetch one word
  318.     cmp    bx,0FF76H
  319.     jz    rchk
  320.     jmp    nsqz
  321.  
  322. rchk:    call    rwor            ;fetch one word
  323.     mov    dens,0FFH        ;z/nz=un/squeezed
  324.  
  325. ;    unsqueezed file name
  326.  
  327.     mov    cx,(offset 200CH)    ;twelve spaces
  328.     mov    bx,(offset uzfn)    ;unsqueezed file's name
  329.     call    fiuc            ;block fill
  330.  
  331.     mov    cx,8
  332.     mov    si,(offset uzfn)    ;unsqueezed file's name
  333. luup:    call    gbyt            ;fetch one byte
  334.     or    al,al
  335.     jz    luut
  336.     cmp    al,'.'
  337.     jz    luuw
  338.     mov    [si],al
  339.     inc    si
  340.     loop    luup
  341. luuz:    call    gbyt
  342.     or    al,al
  343.     jz    luut
  344.     cmp    al,'.'
  345.     jnz    luuz
  346. luuw:    mov    cx,3
  347.     mov    si,(offset uzfn+8)
  348.     mov    [si],al
  349.     inc    si
  350. luur:    call    gbyt
  351.     or    al,al
  352.     jz    luut
  353.     mov    [si],al
  354.     inc    si
  355.     loop    luur
  356. luus:    call    gbyt
  357.     or    al,al
  358.     jnz    luus
  359.  
  360. luut:    mov    bx,(offset uzfn+9)    ;unsqueezed FCB
  361.     call    dcom            ;disregard .COM files
  362.     jz    jscn
  363.     mov    bx,(offset uzfn+9)    ;unsqueezed FCB
  364.     call    dcmd            ;disregard .CMD files
  365.     jz    jscn
  366.     mov    bx,(offset cfcb+9)    ;CP/M's file control block
  367.     call    dsys            ;disregard .SYS files
  368.     jz    jscn
  369.     mov    bx,(offset cfcb+9)    ;unsqueezed FCB
  370.     call    dxrf            ;disregard .XRF files
  371.     jnz    ldic
  372. jscn:    jmp    scan
  373.  
  374. ;    load code directory
  375.  
  376. ldic:    call    rwor            ;fetch word
  377.     cmp    bx,(offset hsiz+1)
  378.     jnc    ldii
  379.     mov    bx,(offset M8)        ;'code table won't fit'
  380.     call    mssg            ;message to console
  381.     jmp    scan
  382.  
  383. ldii:    add    bx,bx
  384.     add    bx,bx
  385.     mov    cx,bx
  386.     mov    si,(offset code)    ;code table
  387. ldij:    call    gbyt            ;fetch one byte
  388.     mov    [si],al
  389.     inc    si
  390.     loop    ldij
  391.  
  392.     mov    roco,1            ;rotation count
  393.  
  394. nsqz:    mov    cx,4
  395.     mov    si,(offset lzer)    ;zero line for counter
  396.     mov    bx,(offset lnum)    ;'line number'
  397.     call    miuc            ;block move
  398.  
  399.     mov    cx,4
  400.     mov    si,(offset lzer)    ;zero line for counter
  401.     mov    bx,(offset ftot)    ;'file total'
  402.     call    miuc            ;block move
  403.  
  404.     mov    cx,8
  405.     mov    si,(offset cfcb+1)    ;file name
  406.     mov    bx,(offset fnam)    ;'file name'
  407.     call    miuc            ;block move
  408.  
  409.     mov    cx,3
  410.     mov    si,(offset 0065H)    ;extension
  411.     mov    bx,(offset fext)    ;'file extension'
  412.     call    miuc            ;block move
  413.  
  414.     mov    bx,(offset fhed)    ;'header ----> FILE'
  415.     call    xref            ;message to .XRF file
  416.     call    mssg            ;message to console
  417.     mov    al,dens
  418.     or    al,al
  419.     jz    sixs
  420.     mov    bx,(offset hesq)    ;'[original]'
  421.     call    xref            ;message to .XRF file
  422.     call    mssg            ;message to console
  423.  
  424. sixs:    mov    cx,(offset 2006H)    ;six spaces
  425.     mov    bx,(offset llbl)
  426.     call    fiuc            ;block fill
  427.  
  428. X01C8:    mov    bx,(offset lnum+3)    ;line number
  429.     call    inco            ;increment counter
  430.     mov    bx,(offset lbuf)    ;line buffer
  431.     mov    ch,0FFH
  432. X01E0:    inc    ch
  433.     js    X01FD
  434.     push    cx
  435.     push    bx
  436.     call    inch            ;char from big bffr to line bffr
  437.     pop    bx
  438.     pop    cx
  439.     mov    [bx],al
  440.     inc    bx
  441.     cmp    al,KZ
  442.     jnz    X01E8
  443.     mov    bx,(offset ftot)
  444.     call    xref            ;message to .XRF file
  445.     call    mssg            ;message to console
  446.     jmp    scan
  447.  
  448. X01E8:    cmp    al,LF
  449.     jnz    X01E0
  450.     jmp    X0202
  451.  
  452. X01FD:    mov    (byte ptr[bx]),CR
  453.     inc    bx
  454.     mov    (byte ptr[bx]),LF
  455.     inc    bx
  456.  
  457. ;    Check console for termination request. If one
  458. ;    is present, clear it out before leaving.
  459.  
  460. X0202:    mov    (byte ptr[bx]),00    ;guarantee right hand fence
  461.  
  462.     mov    cl,11            ;(0B) console status
  463.     int    bdos            ; - B D O S -
  464.     or    al,al
  465.     jz    culi
  466.  
  467.     mov    cl,1            ;(01) read console
  468.     int    bdos            ; - B D O S -
  469.     cmp    al,03H            ;^C
  470.     jnz    skpf
  471.  
  472.     mov    cl,19            ;(13) delete file
  473.     mov    dx,(offset xfil)    ;.XRF FCB
  474.     int    bdos            ; - B D O S -
  475.     mov    bx,(offset M4)        ;"search terminated"
  476.     jmp    ferm            ;final (error) message
  477.  
  478. skpf:    mov    bx,(offset M5)        ;"remainder of file skipped"
  479.     call    xref            ;message to .XRF file
  480.     call    mssg            ;message to console
  481.     jmp    scan
  482.  
  483. ;    Scan the current line.
  484. ;    First see if it is labelled.
  485.  
  486. culi:    mov    si,lapo            ;label pointer
  487.     or    si,si
  488.     jz    X0217            ;no label requested
  489.     mov    bx,(offset lbuf)
  490.     call    chek
  491.     jnz    X0217            ;label not found
  492.     push    bx
  493.  
  494.     mov    cx,(offset 2006H)    ;six spaces
  495.     mov    bx,(offset llbl)
  496.     call    fiuc            ;block fill
  497.  
  498.     pop    bx
  499.     mov    si,(offset llbl+5)
  500.     mov    cx,6
  501. didl:    dec    bx
  502.     mov    al,[bx]
  503.     cmp    al,HT            ;ignore tabs in text
  504.     jz    didl
  505.     cmp    al,' '            ;quit at head of line
  506.     jc    dido
  507.     mov    [si],al
  508.     dec    si
  509.     loop    didl
  510.  
  511. dido:    mov    cx,4
  512.     mov    si,(offset lzer)    ;zero line for counter
  513.     mov    bx,(offset lnum)    ;line number
  514.     call    miuc            ;block move
  515.  
  516. ;    Now look for the pattern
  517.  
  518. X0217:    mov    bx,(offset lbuf)    ;line buffer
  519. X021A:    mov    si,(offset kwrd)    ;keyword pattern
  520.     push    bx
  521.     call    chek
  522.     pop    bx
  523.     jz    X0263
  524.     cmp    (byte ptr[bx]),CR
  525.     jnz    ginc
  526.     jmp    X01C8            ;increment l.c. at X026A
  527. ginc:    inc    bx
  528.     jmp    X021A
  529.  
  530. ;    Pattern matches, so type label & line containing it
  531.  
  532. X0263:    mov    bx,(offset llbl)    ;line label
  533.     call    xref            ;message to .XRF file
  534.     call    mssg            ;message to console
  535.     mov    bx,(offset lbuf)    ;line buffer
  536.     call    xref            ;message to .XRF file
  537.     call    mssg            ;message to console
  538.     mov    bx,(offset ftot+3)
  539.     call    inco            ;increment counter
  540.     mov    bx,(offset dtot+3)    ;total throughout disk
  541.     call    inco            ;increment counter
  542.     jmp    X01C8            ;increment l.c. at X026A
  543.  
  544. ;    Increment ASCII counter at (HL-3).
  545.  
  546. inco:    or    (byte ptr[bx]),30H
  547.     inc    (byte ptr[bx])
  548.     cmp    (byte ptr[bx]),':'
  549.     jnz    incr
  550.     mov    (byte ptr[bx]),'0'
  551.     dec    bx
  552.     jmp    inco            ;increment counter
  553. incr:    ret
  554.  
  555. ;    Memory to console
  556.  
  557. mssg:    mov    dl,(byte ptr[bx])
  558.     inc    bx
  559.     push    bx
  560.     mov    cl,2            ;(02) write console
  561.     int    bdos            ; - B D O S -
  562.     pop    bx
  563.     cmp    (byte ptr[bx]),00
  564.     jnz    mssg            ;message to console
  565.     ret
  566.  
  567. X029C:    mov    bx,(offset M3)        ;"bad pattern"
  568.     call    ferm            ;final (error) message
  569.  
  570. ;    decode next character
  571.  
  572. dnch:    mov    bx,(offset code)    ;code table
  573. dncr:    call    rbit
  574.     jnc    dncs
  575.     inc    bx
  576.     inc    bx
  577. dncs:    mov    ax,[bx]
  578.     cmp    ax,0FEFFH
  579.     jz    dnct
  580.     or    ax,ax
  581.     jns    dncu
  582.     not    al
  583.     stc
  584.     cmc
  585.     ret
  586.  
  587. dnct:    stc
  588.     ret
  589.  
  590. ;    Calculate <code>+4*<offset>.
  591.  
  592. dncu:    mov    bx,(offset code)    ;code table
  593.     add    ax,ax
  594.     add    ax,ax
  595.     add    bx,ax
  596.     jmp    dncr
  597.  
  598. ;    read one bit at a time
  599.  
  600. rbit:    push    bx
  601.     dec    roco            ;rotation count
  602.     jnz    rbiu
  603.     mov    roco,8
  604.     call    gbyt            ;fetch one byte
  605.     mov    roby,al            ;rotating byte
  606. rbiu:    rcr    roby,1            ;rotating byte
  607.     pop    bx
  608.     ret
  609.  
  610. ;    read one word
  611.  
  612. rwor:    call    gbyt            ;fetch one byte
  613.     push    ax
  614.     call    gbyt            ;fetch one byte
  615.     pop    bx
  616.     mov    bh,al
  617.     ret
  618.  
  619. ;    Fetch the next byte. The input buffer will be refreshed if it
  620. ;    is necessary. For normal files, one byte will be extracted from
  621. ;    the input buffer; for squeezed files, one byte will be decoded
  622. ;    from the incoming bit stream and subtracted from the checksum.
  623.  
  624. inch:    cmp    dens,00            ;z/nz = un/squeezed
  625.     jz    gbyt            ;fetch one byte
  626.     cmp    mult,00            ;repeat factor
  627.     jz    gusq
  628.     dec    mult            ;repeat factor
  629.     mov    al,lach            ;last character read
  630.     ret
  631.  
  632. gusq:    call    dnch
  633.     jnc    guss
  634.     mov    al,1AH
  635.     ret
  636.  
  637. guss:    cmp    al,090H
  638.     jz    gusu
  639.     mov    lach,al            ;last character read
  640.     ret
  641.  
  642. gusu:    call    dnch
  643.     or    al,al
  644.     jnz    gusv
  645.     mov    al,090H
  646.     ret
  647.  
  648. gusv:    dec    al
  649.     dec    al
  650.     mov    mult,al            ;repeat factor
  651.     mov    al,lach            ;last character read
  652.     ret
  653.  
  654. ;    unsqueezed (normal) text
  655.  
  656. gbyt:    cmp    ictr,0000        ;input counter
  657.     jnz    gbyu
  658.     call    indi            ;disk to IN area
  659. gbyu:    dec    ictr            ;input counter
  660.     mov    bx,iptr            ;input pointer
  661.     mov    al,[bx]
  662.     inc    iptr            ;input pointer
  663.     ret
  664.  
  665. indi:    mov    al,ksiz
  666.     mov    ictr,(offset isiz)    ;input counter
  667.     mov    iptr,(offset ibuf)    ;input buffer
  668.     mov    dx,iptr            ;input pointer
  669. indd:    push    dx
  670.     push    ax
  671.  
  672.     mov    cl,26            ;(1A) set DMA address
  673.     int    bdos            ; - B D O S -
  674.  
  675.     mov    dx,(offset cfcb)    ;CP/M's file control block
  676.     mov    cl,20            ;(14) read one record
  677.     int    bdos            ; - B D O S -
  678.  
  679.     or    al,al
  680.     jnz    inee
  681.     pop    ax
  682.     pop    dx
  683.     dec    al
  684.     jz    inss
  685.     add    dx,(offset csiz)    ;CP/M's record size
  686.     jmp    indd
  687.  
  688. inee:    pop    ax
  689.     pop    dx
  690.     mov    (byte ptr[bx]),01AH
  691. inss:    ret
  692.  
  693. ;    Fetch next keyword byte.
  694.  
  695. gkey:    push    bx
  696.     cmp    kctr,0000        ;keyword counter
  697.     jnz    gkez
  698.     call    kndi            ;disk to IN area
  699. gkez:    dec    kctr            ;keyword counter
  700.     mov    bx,kptr            ;input pointer
  701.     mov    al,[bx]
  702.     inc    kptr            ;input pointer
  703.     pop    bx
  704.     ret
  705.  
  706. kndi:    mov    kctr,(offset csiz)    ;CP/M's record size
  707.     mov    bx,(offset kbuf)    ;input buffer
  708.     mov    kptr,bx            ;input pointer
  709.     mov    (byte ptr[bx]),KZ
  710.     push    bx
  711.     push    dx
  712.     push    cx
  713.     xchg    bx,dx
  714.     mov    cl,26            ;(1A) set DMA address
  715.     int    bdos            ; - B D O S -
  716.     mov    dx,(offset kfil)    ;keyword FCB
  717.     mov    cl,20            ;(14) read one record
  718.     int    bdos            ; - B D O S -
  719.     pop    cx
  720.     pop    dx
  721.     pop    bx
  722.     or    al,al
  723.     ret
  724.  
  725. ;    Send line to .XRF buffer.
  726.  
  727. xref:    push    bx
  728. xreg:    mov    al,[bx]
  729.     or    al,al
  730.     jz    xreh
  731.     inc    bx
  732.     push    bx
  733.     call    wxrf
  734.     pop    bx
  735.     jmp    xreg            ;message to .XRF file
  736. xreh:    pop    bx
  737.     ret
  738.  
  739. ;    Write next crossreference byte.
  740.  
  741. wxrf:    cmp    xctr,0000        ;crossreference counter
  742.     jnz    wxrg
  743.     push    ax
  744.     call    xndi            ;disk to IN area
  745.     pop    ax
  746. wxrg:    dec    xctr            ;crossreference counter
  747.     mov    bx,xptr            ;crossreference pointer
  748.     mov    [bx],al
  749.     inc    xptr            ;crossreference pointer
  750.     ret
  751.  
  752. xndi:    mov    xctr,(offset csiz)    ;CP/M's record size
  753.     mov    dx,(offset xbuf)    ;crossreference buffer
  754.     mov    xptr,dx
  755.     mov    cl,26            ;(1A) set DMA address
  756.     int    bdos            ; - B D O S -
  757.     mov    dx,(offset xfil)    ;.XRF FCB
  758.     mov    cl,21            ;(15) write one record
  759.     int    bdos            ; - B D O S -
  760.     cmp    al,00
  761.     mov    bx,(offset xwre)    ;'can''t write'
  762.     jz G67 ! jmp ferm ! G67:    ;final (error) message
  763.     ret
  764.  
  765. ;    Close crossreference file.
  766.  
  767. zxrf:    mov    bx,xctr
  768.     xchg    bx,dx
  769.     mov    al,dl
  770.     or    al,dh
  771.     jz    clos
  772.     mov    bx,xptr            ;crossreference pointer
  773. zxrg:    mov    (byte ptr[bx]),01AH    ;^Z
  774.     inc    bx
  775.     dec    dx
  776.     mov    al,dl
  777.     or    al,dh
  778.     jnz    zxrg
  779.     call    xndi
  780.  
  781. clos:    mov    cl,16            ;(10) close file
  782.     mov    dx,(offset xfil)    ;.XRF FCB
  783.     int    bdos            ; - B D O S -
  784.     inc    al
  785.     jnz    G71
  786.     mov    bx,(offset cclo)    ;'can''t close'
  787.     jmp    ferm            ;final (error) message
  788.  
  789. ;    Disregard .COM files
  790.  
  791. dcom:    mov    al,[bx]
  792.     cmp    al,'C'
  793.     jnz    G71
  794.     inc    bx
  795.     mov    al,[bx]
  796.     cmp    al,'O'
  797.     jnz    G71
  798.     inc    bx
  799.     mov    al,[bx]
  800.     cmp    al,'M'
  801.     jnz    G71
  802.     mov    bx,(offset M6)        ;".COM file disregarded"
  803.     call    mssg            ;message to console
  804.     xor    al,al
  805. G71:    ret
  806.  
  807. ;    Disregard .CMD files
  808.  
  809. dcmd:    mov    al,[bx]
  810.     cmp    al,'C'
  811.     jnz    G74
  812.     inc    bx
  813.     mov    al,[bx]
  814.     cmp    al,'M'
  815.     jnz    G74
  816.     inc    bx
  817.     mov    al,[bx]
  818.     cmp    al,'D'
  819.     jnz    G74
  820.     mov    bx,(offset M7)        ;".CMD file disregarded"
  821.     call    mssg            ;message to console
  822.     xor    al,al
  823. G74:    ret
  824.  
  825. ;    Disregard .XRF files
  826.  
  827. dxrf:    mov    al,[bx]
  828.     cmp    al,'X'
  829.     jnz    G77
  830.     inc    bx
  831.     mov    al,[bx]
  832.     cmp    al,'R'
  833.     JNZ    G77
  834.     inc    bx
  835.     mov    al,[bx]
  836.     cmp    al,'F'
  837.     jnz    G77
  838.     mov    bx,(offset M9)        ;".XRF file disregarded"
  839.     call    mssg            ;message to console
  840.     xor    al,al
  841. G77:    ret
  842.  
  843. ;    Disregard .SYS files
  844.  
  845. dsys:    mov    al,[bx]
  846.     cmp    al,'S'
  847.     jnz    G78
  848.     inc    bx
  849.     mov    al,[bx]
  850.     cmp    al,'Y'
  851.     jnz    G78
  852.     inc    bx
  853.     mov    al,[bx]
  854.     cmp    al,'S'
  855.     jnz    G78
  856.     mov    bx,(offset MA)        ;".SYS file disregarded"
  857.     call    mssg            ;message to console
  858.     xor    al,al
  859. G78:    ret
  860.  
  861. ;    Advance to next alternative
  862.  
  863. nexx:    mov    bx,[bx]
  864. next:    mov    al,[bx]
  865.     or    al,al
  866.     jz    G80
  867.     inc    bx
  868.     call    enda
  869.     jz    G80
  870.     call    begb
  871.     jnz    next
  872. G80:    ret
  873.  
  874. ;    Block fill with C B's starting at (HL).
  875.  
  876. fiuc:    mov    (byte ptr[bx]),ch
  877.     inc    bx
  878.     dec    cl
  879.     jnz    fiuc            ;block fill
  880.     ret
  881.  
  882. ;    Block move of cx bytes from [si] to [bx].
  883.  
  884. miuc:    mov    al,[si]
  885.     mov    [bx],al
  886.     inc    si
  887.     inc    bx
  888.     loop    miuc
  889.     ret
  890.  
  891. ;    Read and semicompile the keyword.
  892. ;        si store semicompiled pattern
  893. ;        bx store raw pattern
  894. ;        quit for CR or ^Z
  895.  
  896. meuv:    call    gkey
  897.     cmp    al,CR
  898.     jnz    G85
  899.     jmp    gkey            ;remove following LF
  900. G85:    cmp    al,01AH            ;^Z
  901.     jnz    G86
  902.     ret                ;end of file
  903. G86:    mov    [bx],al
  904.     inc    bx
  905.     cmp    al,TAB
  906.     jnz    mvnt
  907.     mov    al,HT
  908. mvnt:    mov    [si],al
  909.     inc    si
  910.     cmp    al,RBR
  911.     jz    mvrb
  912.     cmp    al,RSQ
  913.     jz    mvrb
  914.     cmp    al,LBR
  915.     jz    mvlb
  916.     cmp    al,LSQ
  917.     jz    mvlb
  918.     jmp    meuv
  919.  
  920. mvrb:    mov    ax,bx
  921.     pop    bx
  922.     mov    [bx],si
  923.     mov    bx,ax
  924.     jmp    meuv
  925.  
  926. mvlb:    push    si
  927.     inc    si
  928.     inc    si
  929.     jmp    meuv
  930.  
  931. ;    Move and semi-compile the command line.
  932. ;        bx points to the command line
  933. ;        si points to the pattern buffer
  934. ;        copy until a zero byte is found
  935.  
  936. muve:    mov    al,[bx]
  937.     cmp    al,TAB
  938.     jnz    munt
  939.     mov    al,HT
  940. munt:    mov    [si],al
  941.     inc    bx
  942.     inc    si
  943.     cmp    al,RBR
  944.     jz    murb
  945.     cmp    al,RSQ
  946.     jz    murb
  947.     cmp    al,LBR
  948.     jz    mulb
  949.     cmp    al,LSQ
  950.     jz    mulb
  951. must:    or    al,al
  952.     jnz    muve
  953.     ret
  954.  
  955. murb:    mov    ax,bx
  956.     pop    bx
  957.     mov    [bx],si
  958.     mov    bx,ax
  959.     jmp    must
  960.  
  961. mulb:    push    si
  962.     inc    si
  963.     inc    si
  964.     jmp    must
  965.  
  966. ;    Check balance of []'s and {}'s.
  967.  
  968. bala:    push    bx
  969.     push    cx
  970.     mov    cx,(offset 0101H)
  971. balb:    mov    al,[bx]
  972.     inc    bx
  973.     cmp    al,LSQ
  974.     jnz    balc
  975.     inc    ch
  976.     jmp    balb
  977. balc:    cmp    al,RSQ
  978.     jnz    bald
  979.     dec    ch
  980.     jz    balx
  981.     jmp    balb
  982. bald:    cmp    al,LBR
  983.     jnz    bale
  984.     inc    cl
  985.     jmp    balb
  986. bale:    cmp    al,RBR
  987.     jnz    balf
  988.     dec    cl
  989.     jz    balx
  990.     jmp    balb
  991. balf:    or    al,al
  992.     jnz    balb
  993.     mov    al,cl
  994.     cmp    al,01
  995.     jnz    balx
  996.     mov    al,ch
  997.     cmp    al,01
  998.     pop    cx
  999.     pop    bx
  1000.     jnz G106 ! ret ! G106:
  1001. balx:    mov    bx,(offset M3)        ;"bad pattern"
  1002.     jmp    ferm            ;final (error) message
  1003.  
  1004. ;    Check for termination of alternative.
  1005.  
  1006. enda:    cmp    al,ORR
  1007.     jz    G107
  1008. endb:    cmp    al,RSQ
  1009.     jz    G107
  1010.     cmp    al,RBR
  1011.     jz    G107
  1012.     or    al,al
  1013. G107:    ret
  1014.  
  1015. ;    Check for beginning of alternative.
  1016.  
  1017. bega:    cmp    al,ORR
  1018.     jz    G110
  1019. begb:    cmp    al,LSQ
  1020.     jz    G110
  1021.     cmp    al,LBR
  1022. G110:    ret
  1023.  
  1024. ;    Check for null alternative.
  1025.  
  1026. nula:    push    bx
  1027.     call    nulb
  1028.     pop    bx
  1029. nulr:    ret
  1030.  
  1031. nulb:    mov    al,[bx]
  1032.     inc    bx
  1033.     or    al,al
  1034.     jz    nulr
  1035.     call    bega
  1036.     jnz    nulb
  1037.     mov    al,[bx]
  1038.     call    enda
  1039.     jnz    nulb
  1040.     jmp    balx
  1041.  
  1042. ;    Check for given expression.
  1043.  
  1044. chek:    mov    ah,[bx]
  1045.     mov    al,[si]
  1046.     inc    si
  1047.     call    enda
  1048.     jz    chre
  1049.     cmp    ah,CR
  1050.     jz    chno
  1051.     cmp    al,LBR
  1052.     jnz    G116
  1053.     jmp    chlb
  1054. G116:    cmp    al,LSQ
  1055.     jz    chsq
  1056.     inc    bx
  1057.     cmp    al,QUE
  1058.     jz    chek
  1059.     cmp    al,ALF
  1060.     jz    chal
  1061.     cmp    al,ah
  1062.     jz    chek
  1063.     cmp    ah,'a'
  1064.     jc    chno
  1065.     cmp    ah,'{'
  1066.     jnc    chno
  1067.     and    ah,05FH
  1068.     cmp    al,ah
  1069.     jz    chek
  1070. chno:    or    al,0FFH
  1071. chre:    ret
  1072.  
  1073. ;    Check alphanumeric.
  1074.  
  1075. chal:    cmp    ah,'0'
  1076.     jc    chno
  1077.     cmp    ah,':'
  1078.     jc    chek
  1079.     cmp    ah,'A'
  1080.     jc    chno
  1081.     cmp    ah,'['
  1082.     jc    chek
  1083.     cmp    ah,'a'
  1084.     jc    chno
  1085.     cmp    ah,'{'
  1086.     jc    chek
  1087.     jmp    chno
  1088.  
  1089. ;    Check list of alternatives.
  1090.  
  1091. chsq:    push    sqxx
  1092.     push    sqaa
  1093.     push    sqzz
  1094.     mov    sqxx,bx
  1095.     mov    bx,[si]
  1096.     inc    si
  1097.     inc    si
  1098.     mov    sqaa,si
  1099.     mov    sqzz,bx
  1100. chaa:    mov    bx,sqxx
  1101.     call    chek
  1102.     jz    chff
  1103. chbb:    mov    bx,sqaa            ;fail so find next alternative
  1104. chcc:    call    next
  1105.     cmp    al,RSQ
  1106.     jz    chdd            ;no more alternatives, so fail
  1107.     cmp    al,ORR
  1108.     jnz    chcc
  1109.     mov    sqaa,bx
  1110.     mov    si,bx
  1111.     jmp    chaa            ;try next alternative
  1112. chdd:    mov    bx,sqxx
  1113.     or    al,0FFH
  1114. chee:    pop    sqzz
  1115.     pop    sqaa
  1116.     pop    sqxx
  1117.     ret
  1118.  
  1119. chff:    mov    si,sqzz            ;good alternative, try rest
  1120.     call    chek
  1121.     jz    chee
  1122.     jmp    chbb
  1123.  
  1124. ;    Check iterative pattern.
  1125.  
  1126. chlb:    push    text
  1127.     push    texx
  1128.     push    rest
  1129.     push    rept
  1130.     push    repp
  1131.     mov    text,bx
  1132.     mov    texx,bx
  1133.     xchg    bx,si
  1134.     mov    si,[bx]
  1135.     inc    bx
  1136.     inc    bx
  1137.     mov    rept,bx
  1138.     mov    repp,bx
  1139.     mov    rest,si
  1140. chlc:    mov    si,rest
  1141.     mov    bx,text
  1142.     call    chek            ;check rest
  1143.     jz    chzz
  1144. chii:    mov    si,rept            ;rest failed
  1145.     mov    bx,text            ;keep same text
  1146.     call    chek            ;try out the repeater
  1147.     jnz    choo
  1148.     mov    text,bx            ;repeater worked, record progress
  1149.     mov    bx,repp            ;start alternatives over again
  1150.     mov    rept,bx
  1151.     jmp    chlc
  1152. choo:    mov    bx,rept            ;repeater failed, try next
  1153. chxx:    call    next
  1154.     cmp    al,RBR
  1155.     jz    chyy            ;this was the last, quit
  1156.     cmp    al,ORR
  1157.     jnz    chxx
  1158.     mov    rept,bx
  1159.     jmp    chii
  1160. chyy:    mov    bx,texx
  1161.     or    al,00            ;emphasize the RBR
  1162. chzz:    pop    repp
  1163.     pop    rept
  1164.     pop    rest
  1165.     pop    texx
  1166.     pop    text
  1167.     ret
  1168.  
  1169. M1    db    'The command line',CR,LF,CR,LF
  1170.     db    '     FFYNDE [D:]FILE.EXT [E:]KEY.SYM LABEL',CR,LF,CR,LF
  1171.     db    'will search through all instances of FILE.EXT (which',CR,LF
  1172.     db    'may be an ambiguous reference) on disk D for lines',CR,LF
  1173.     db    'containing keywords taken from KEY.SYM (whose disk may',CR,LF
  1174.     db    'be specified). Any of these keywords may be regular',CR,LF
  1175.     db    'expressions. Then the whole family of files will be',CR,LF
  1176.     db    'searched for each line in KEY, whose default extension',CR,LF
  1177.     db    'is SYM. Results will be shown on the console and placed',CR,LF
  1178.     db    'in [E:]KEY.XRF. LABEL, a regular expression too, is a',CR,LF
  1179.     db    'reference for relative line numbers; if it is omitted',CR,LF
  1180.     db    'lines will be numbered serially in each file. Regular',CR,LF
  1181.     db    'expressions are formed as follows:',CR,LF
  1182.     db    '     [p1!p2!...!pn]  alternative strings',CR,LF
  1183.     db    '     {p1!p2!...!pn}  repeated alternatives',CR,LF
  1184.     db    '     ? any single character',CR,LF
  1185.     db    '     @ for any alphanumeric: a-z, A-Z, 0-9',CR,LF
  1186.     db    '     _ in place of horizontal tab',CR,LF
  1187.     db    'Squeezed files will be searched as well as unsqueezed',CR,LF
  1188.     db    'ones. Use ^C to quit, any other key skips rest of file.',CR,LF
  1189.     db    00
  1190.  
  1191. M2    db    'FFYNDE.CMD 08/01/84 ICUAP',CR,LF,00
  1192.  
  1193. M3    db    '-- Bad Command Line --',00
  1194.  
  1195. M4    db    CR,LF,'-- Search Terminated --',00
  1196.  
  1197. M5    db    ' -- Remainder of File Skipped --',CR,LF,00
  1198.  
  1199. M6    db    '.COM file disregarded.',CR,LF,00
  1200.  
  1201. M7    db    '.CMD file disregarded.',CR,LF,00
  1202.  
  1203. M8    db    ' -- Code Table Won''t Fit --',CR,LF,00
  1204.  
  1205. M9    db    '.XRF file disregarded.',CR,LF,00
  1206.  
  1207. MA    db    '.SYS file disregarded.',CR,LF,00
  1208.  
  1209. nkey    db    ' -- Can''t Open Keyword File --',CR,LF,00
  1210.  
  1211. yexi    db    ' -- Crossreference File Already Exists --',CR,LF,00
  1212.  
  1213. nxrf    db    ' -- Can''t Open Crossreference File --',CR,LF,00
  1214.  
  1215. xwre    db    ' -- Write Error in Crossreference File --',CR,LF,00
  1216.  
  1217. cclo    db    ' -- Can''t Close Crossreference File --',CR,LF,00
  1218.  
  1219. enth    rb    1            ;search-again counter
  1220. sfam    db    'DFilenameEXT',00
  1221.     rb    20
  1222.  
  1223. sqxx    rw    1
  1224. sqaa    rw    1
  1225. sqzz    rw    1
  1226. text    rw    1
  1227. texx    rw    1
  1228. rest    rw    1
  1229. rept    rw    1
  1230. repp    rw    1
  1231. lapo    rw    1            ;label pointer
  1232. kwdi    db    'Keyword is:  '
  1233. keyr    rb    64            ;raw keyword
  1234. hesq    db    '[original] : '
  1235. uzfn    db    'original.xxx'        ;unsqueezed file's name
  1236. crlf    db    CR,LF,00
  1237. fhed    db    '~~~~~~> File '
  1238. fnam    db    'xxxxxxxx.'        ;filename
  1239. fext    db    'xxx',CR,LF,00        ;file extension
  1240. llbl    db    '      +'
  1241. lnum    db    '         ',00        ;line number
  1242. lzer    db    '   0'            ;zero line for counter
  1243. ftot    db    '      lines found',CR,LF,00
  1244. dtot    db    '      instances in the entire disk',CR,LF,00
  1245. ktot    db    '      keywords processed',CR,LF,00
  1246.     db    00            ;fence for line buffer
  1247. lbuf    rb    85H            ;line buffer
  1248. dens    rb    1            ;z/nz = un/squeezed
  1249. roby    rb    1            ;rotating byte
  1250. roco    rb    1            ;rotation count
  1251. mult    rb    1            ;repeat factor
  1252. lach    rb    1            ;last character read
  1253. ictr    rw    1            ;input counter
  1254. iptr    rw    1            ;input pointer
  1255. ibuf    rb    isiz            ;input buffer
  1256. kfil    rb    33            ;keyword FCB
  1257. kctr    rw    1            ;keyword counter
  1258. kptr    rw    1            ;keyword pointer
  1259. kbuf    rb    csiz            ;keyword buffer
  1260. xfil    rb    33            ;.XRF FCB
  1261. xctr    rw    1            ;crossreference counter
  1262. xptr    rw    1            ;crossreference pointer
  1263. xbuf    rb    csiz            ;crossreference buffer
  1264. patt    rb    256            ;command line pattern
  1265. kwrd    rb    256            ;keyword pattern
  1266. code    rb    4*hsiz            ;Huffman code table
  1267. stak    rw    1            ;initialize stack pointer
  1268. fini    rb    0
  1269.  
  1270.     end
  1271.