home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol165 / stute.asm < prev    next >
Assembly Source File  |  1984-07-08  |  14KB  |  928 lines

  1.  
  2.  
  3. ;    ----------------------------------------------------------
  4. ;    Reassembly of FIND.COM, which was originally extracted
  5. ;    from the CBBS(R) package available from Ward Christensen
  6. ;    and Randy Suess. However, considerable rearrangement has
  7. ;    taken place, most notably the following:
  8. ;     -  <no file name> results in a screen of information
  9. ;     -  the search pattern may be a regular expression
  10. ;     -  instance count reported, both per file and globally
  11. ;    To achieve compatibility with MicroShell the vertical bar
  12. ;    was replaced by exclamation point; all syntactic elements
  13. ;    are defined by EQU's and may be redefined. LABEL!PATTERN
  14. ;    is checked for balanced parentheses and non-null arguments
  15. ;    to forestall the most common failure modes. Had MicroShell
  16. ;    not been available, an option to direct the output to some
  17. ;    disk file would probably have been included. STUTE.ASM
  18. ;    differs from FIND in that the patterns found are replaced
  19. ;    by a constant rather than just being located.
  20. ;
  21. ;            STUTE.ASM   Copyright (C) 1983
  22. ;            Universidad Autonoma de Puebla
  23. ;
  24. ;    [Harold V. McIntosh, 28 February 1983]
  25. ;    ----------------------------------------------------------
  26.  
  27. HT    equ    09H    ;horizontal tab
  28. LF    equ    0AH    ;line feed
  29. CR    equ    0DH    ;carriage return
  30. KZ    equ    1AH    ;^Z
  31.  
  32. ;    Delimiters for the command line
  33.  
  34. LSQ    equ    '['    ;begin alternative list
  35. RSQ    equ    ']'    ;end alternative list
  36. LBR    equ    '{'    ;begin iterated expression
  37. RBR    equ    '}'    ;end iterated expression
  38. ORR    equ    '!'    ;separate alternatives
  39.  
  40. ;    Representatives of characters or classes.
  41.  
  42. TAB    equ    '_'    ;substitute for tab
  43. QUE    equ    '?'    ;represent any byte
  44. ALF    equ    '@'    ;represent any alphanumeric
  45.  
  46. ;    CPM locations and parameters
  47.  
  48. cfcb    equ    005CH    ;CP/M's file control block
  49. cblk    equ    007CH    ;CP/M's block counter
  50. csiz    equ    0080H    ;CP/M's record size
  51. cbuf    equ    0080H    ;CP/M's record buffer
  52. ksiz    equ    26    ;sector capacity of IN buffer
  53. isiz    equ    ksiz*128
  54. osiz    equ    128
  55.  
  56. ;    -------------
  57.     org    0100H
  58. ;    -------------
  59.  
  60. begn:    lxi    h,0000
  61.     dad    sp
  62.     shld    stak
  63.     lxi    sp,stak
  64.     lda    cfcb+1    ;file name
  65.     cpi    ' '
  66.     jnz    X0143
  67.     lxi    h,tuto    ;tutorial message
  68.     call    mssg
  69.     jmp    gbye
  70.  
  71. X0143:    lxi    h,logo    ;identification line
  72.     call    mssg
  73.     mvi    c,12
  74.     lxi    d,cfcb    ;CP/M's FCB
  75.     lxi    h,file    ;generic filename
  76.     call    miuc
  77.     lda    file    ;generic filename
  78.     sta    kfil    ;backup file (.BAK)
  79.     sta    ifil    ;input file  (.EXT)
  80.     sta    ofil    ;output file (.$$$)
  81.     sta    ufil    ;active output (.$$$)
  82.     xra    a
  83.     sta    enth
  84.     lxi    h,cbuf    ;CP/M's record buffer
  85.     mov    e,m
  86.     mov    c,e
  87.     mov    d,a
  88.     xchg
  89.     inx    d
  90.     dad    d
  91.     mov    m,a
  92.     xchg
  93. X0152:    inx    h
  94.     dcr    c
  95.     mov    a,m
  96.     ora    a
  97.     jz    X029C
  98.     cpi    ' '
  99.     jnz    X0152
  100.     inx    h
  101.     call    bala        ;check balance of [], {}.
  102.     call    nula        ;check for null alternatives
  103.     lxi    d,patt        ;command line pattern
  104.     call    muve
  105.     xchg
  106.     dcx    h
  107.     shld    sund
  108.     mvi    c,4
  109.     lxi    d,lzer
  110.     lxi    h,dtot
  111.     call    miuc
  112.     lxi    h,patt        ;command line pattern
  113.     shld    papo
  114.     call    next
  115.     shld    supo        ;substitute pointer
  116.  
  117. ;    Scan the directory for file names.
  118.  
  119. prep:    xra    a
  120.     inr    a
  121.     sta    dctr    ;directory counter
  122.     lxi    h,diry    ;directory extract
  123.     shld    dptr    ;directory pointer
  124.     push    h
  125.     mvi    c,26    ;(1A) set DMA address
  126.     lxi    d,cbuf    ;CP/M's record buffer
  127.     call    0005    ; - B D O S -
  128.  
  129.     mvi    c,17    ;(11) search once
  130.     lxi    d,file    ;generic filename
  131.     call    0005    ; - B D O S -
  132.  
  133. fnth:    pop    h
  134.     inr    a
  135.     jz    scan    ;all relevant files located
  136.     push    h
  137.     dcr    a
  138.     ani    03
  139.     add    a
  140.     add    a
  141.     add    a
  142.     add    a
  143.     add    a
  144.     adi    81H
  145.     mov    e,a
  146.     mvi    d,00
  147.     lxi    h,8
  148.     dad    d
  149.     push    h
  150.     mov    a,m
  151.     cpi    'B'
  152.     jnz    nbak
  153.     inx    h
  154.     mov    a,m
  155.     cpi    'A'
  156.     jnz    nbak
  157.     inx    h
  158.     mov    a,m
  159.     cpi    'K'
  160.     pop    h
  161.     jz    omit
  162.     jmp    nbac
  163. nbak:    pop    h
  164. nbac:    mvi    a,'$'
  165.     cmp    m
  166.     jnz    ndol
  167.     inx    h
  168.     cmp    m
  169.     jnz    ndol
  170.     inx    h
  171.     cmp    m
  172.     jz    omit
  173. ndol:    mvi    c,12
  174.     pop    h
  175.     call    miuc
  176.     push    h
  177.     lxi    h,dctr    ;directory counter
  178.     inr    m
  179.  
  180. omit:    mvi    c,18    ;(12) search again
  181.     lxi    d,file    ;generic filename
  182.     call    0005    ; - B D O S -
  183.  
  184.     jmp    fnth
  185.  
  186. ;    We're all done.
  187.  
  188. done:    lxi    h,dtot
  189.     call    mssg
  190. gbye:    lhld    stak
  191.     sphl
  192.     ret
  193.  
  194. ;    A prospective file has been located
  195.  
  196. scan:    lxi    h,dctr
  197.     dcr    m
  198.     jz    done
  199.     lhld    dptr
  200.     xchg
  201.     lxi    h,12
  202.     dad    d
  203.     shld    dptr
  204.     push    d
  205.  
  206.     mvi    c,8
  207.     pop    d
  208.     push    d
  209.     lxi    h,kfil+1    ;backup file (.BAK)
  210.     call    miuc
  211.  
  212.     mvi    c,11
  213.     pop    d
  214.     push    d
  215.     lxi    h,ifil+1    ;input file  (.EXT)
  216.     call    miuc
  217.  
  218.     mvi    c,8
  219.     pop    d
  220.     push    d
  221.     lxi    h,ofil+1    ;output file (.$$$)
  222.     call    miuc
  223.  
  224.     mvi    c,8
  225.     pop    d
  226.     push    d
  227.     lxi    h,ufil+1    ;active output (.$$$)
  228.     call    miuc
  229.  
  230.     mvi    c,12
  231.     pop    d
  232.     lxi    h,cfcb+1    ;CP/M's file control block
  233.     call    miuc
  234.  
  235.     mvi    c,19        ;(13) delete file
  236.     lxi    d,kfil        ;backup file (.BAK)
  237.     call    0005        ; - B D O S -
  238.  
  239.     mvi    c,19        ;(13) delete file
  240.     lxi    d,ofil        ;output file (.$$$)
  241.     call    0005        ; - B D O S -
  242.  
  243.     mvi    c,22        ;(16) create file
  244.     lxi    d,ufil        ;active output (.$$$)
  245.     call    0005        ; - B D O S -
  246.     mvi    a,00
  247.     sta    urec
  248.  
  249.     mvi    c,15        ;(0F) open file
  250.     lxi    d,cfcb        ;CP/M's FCB
  251.     call    0005        ; - B D O S -
  252.     inr    a
  253.     jz    gbye        ;quit [without message]
  254.     xra    a
  255.     sta    cblk        ;block pointer
  256.  
  257.     mvi    c,4
  258.     lxi    d,lzer
  259.     lxi    h,lnum        ;'line number'
  260.     call    miuc
  261.     mvi    c,4
  262.     lxi    d,lzer
  263.     lxi    h,ftot        ;'file total'
  264.     call    miuc
  265.     mvi    c,8
  266.     lxi    d,cfcb+1    ;file name
  267.     lxi    h,fnam        ;'file name'
  268.     call    miuc
  269.     mvi    c,3
  270.     lxi    d,0065H        ;extension
  271.     lxi    h,fext        ;'file extension'
  272.     call    miuc
  273.     lxi    h,fhed
  274.     call    mssg        ;message to console
  275.     lxi    b,2006H        ;six spaces
  276.     lxi    h,llbl
  277.     call    fiuc        ;fill until count
  278.  
  279. X01C2:    lxi    h,0000
  280.     shld    ictr
  281.     lxi    h,0080H
  282.     shld    octr
  283.     lxi    h,ubuf
  284.     shld    optr
  285. X01C8:    lxi    h,lnum+3    ;increment l.c.
  286.     call    inco        ;increment line counter
  287.     lxi    h,lbuf        ;line buffer
  288.     mvi    b,0FFH
  289. X01E0:    inr    b
  290.     jm    X01FD
  291.     push    b
  292.     push    h
  293.     call    inch        ;char from big bffr to line bffr
  294.     pop    h
  295.     pop    b
  296.     mov    m,a
  297.     inx    h
  298.     cpi    KZ
  299.     jnz    X01E8
  300.     lxi    h,ftot
  301.     call    mssg
  302.  
  303. ;    Close out last, incomplete record.
  304.  
  305. lare:    lhld    octr
  306.     mov    a,h
  307.     ora    l
  308.     jz    clof
  309.     mvi    a,1AH
  310.     call    ouch
  311.     jmp    lare
  312.  
  313. clof:    mvi    c,21        ;(15) write one record
  314.     lxi    d,ufil    ;active output (.$$$)
  315.     call    0005        ; - B D O S -
  316.  
  317.     mvi    c,16        ;(10) close file
  318.     lxi    d,ufil    ;active output (.$$$)
  319.     call    0005        ; - B D O S -
  320.  
  321.     mvi    c,23        ;(17) rename file
  322.     lxi    d,ifil        ;input file  (.EXT)
  323.     call    0005        ; - B D O S -
  324.  
  325.     mvi    c,23        ;(17) rename file
  326.     lxi    d,ofil        ;output file (.$$$)
  327.     call    0005        ; - B D O S -
  328.  
  329.     jmp    scan
  330.  
  331. X01E8:    cpi    LF
  332.     jnz    X01E0
  333.     jmp    X0202
  334.  
  335. X01FD:    mvi    m,CR
  336.     inx    h
  337.     mvi    m,LF
  338.     inx    h
  339.  
  340. ;    Check console for termination request. If one
  341. ;    is present, clear it out before leaving.
  342.  
  343.  
  344. X0202:    mvi    m,00        ;guarantee right hand fence
  345.     mvi    c,11        ;(0B) console status
  346.     call    0005        ; - B D O S -
  347.     ora    a
  348.     jz    culi
  349.     mvi    c,1        ;(01) read console
  350.     call    0005        ; - B D O S -
  351.     lxi    h,M4        ;"search terminated"
  352.     call    mssg
  353.     jmp    gbye
  354.  
  355. ;    Scan the current line.
  356.  
  357. culi:    lxi    h,lbuf        ;line buffer
  358.     shld    alfa
  359.     shld    beta
  360. X021A:    lhld    papo        ;substitute pointer
  361.     xchg
  362.     lhld    beta
  363.     mov    a,m
  364.     cpi    CR
  365.     jz    nuli
  366.     call    chek
  367.     jnz    fail
  368.     push    d
  369.     push    h
  370.     lxi    h,llbl
  371.     call    mssg
  372.     lxi    h,lbuf
  373.     call    mssg
  374.     lxi    h,ftot+3
  375.     call    inco
  376.     lxi    h,dtot+3
  377.     call    inco
  378.     lhld    beta
  379.     xchg
  380.     lhld    alfa
  381.     call    ouli
  382.     lhld    sund
  383.     xchg
  384.     lhld    supo
  385.     call    ouli
  386.     pop    h
  387.     shld    alfa
  388.     dcx    h
  389.     shld    beta
  390.     pop    d
  391. fail:    lhld    beta
  392.     inx    h
  393.     shld    beta
  394.     jmp    X021A
  395.  
  396. nuli:    lhld    beta
  397.     inx    h
  398.     inx    h
  399.     xchg
  400.     lhld    alfa
  401.     call    ouli
  402.     jmp    X01C8        ;increment l.c. at X026A
  403.  
  404. ;    Increment ASCII counter at (HL-3).
  405.  
  406. inco:    mov    a,m
  407.     ori    30H
  408.     inr    a
  409.     mov    m,a
  410.     cpi    ':'
  411.     rnz
  412.     mvi    m,'0'
  413.     dcx    h
  414.     jmp    inco
  415.  
  416. ;    Memory to console
  417.  
  418. mssg:    mov    e,m
  419.     inx    h
  420.     push    h
  421.     mvi    c,2    ;(02) write console
  422.     call    0005    ; - B D O S -
  423.     pop    h
  424.     mov    a,m
  425.     ora    a
  426.     jnz    mssg
  427.     ret
  428.  
  429. X029C:    lxi    h,M3    ;"bad pattern"
  430.     call    mssg
  431.     jmp    gbye
  432.  
  433. inch:    lhld    ictr
  434.     mov    a,h
  435.     ora    l
  436.     cz    indi    ;disk to IN area
  437.     lhld    ictr
  438.     dcx    h
  439.     shld    ictr
  440.     lhld    iptr
  441.     mov    a,m
  442.     cpi    KZ
  443.     rz
  444.     inx    h
  445.     shld    iptr
  446.     ret
  447.  
  448. indi:    mvi    b,ksiz
  449.     lxi    h,isiz
  450.     shld    ictr
  451.     lxi    h,ibuf
  452.     shld    iptr
  453. indd:    mvi    m,KZ
  454.     push    h
  455.     push    b
  456.     xchg
  457.     mvi    c,26    ;(1A) set DMA address
  458.     call    0005    ; - B D O S -
  459.     lxi    d,cfcb    ;CP/M's file control block
  460.     mvi    c,20    ;(14) read one record
  461.     call    0005    ; - B D O S -
  462.     pop    b
  463.     pop    h
  464.     ora    a
  465.     rnz
  466.     dcr    b
  467.     rz
  468.     lxi    d,csiz    ;CP/M's record size
  469.     dad    d
  470.     jmp    indd
  471.  
  472. ;    Send a "line" [(HL) to (DE)] to out file
  473.  
  474. ouli:    mov    a,e
  475.     sub    l
  476.     mov    c,a
  477.     mov    a,d
  478.     sbb    h
  479.     mov    b,a
  480. oulj:    mov    a,b
  481.     ora    c
  482.     rz
  483.     mov    a,m
  484.     call    ouch
  485.     dcx    b
  486.     inx    h
  487.     jmp    oulj
  488.  
  489. ;    Send one character to the output file, conserve BC, HL
  490.  
  491. ouch:    push    b
  492.     push    h
  493.     push    psw
  494.     lhld    octr
  495.     mov    a,h
  496.     ora    l
  497.     cz    oudi        ;OUT area to disk
  498.     lhld    octr
  499.     dcx    h
  500.     shld    octr
  501.     pop    psw
  502.     lhld    optr
  503.     mov    m,a
  504.     inx    h
  505.     shld    optr
  506.     pop    h
  507.     pop    b
  508.     ret
  509.  
  510. oudi:    lxi    h,osiz
  511.     shld    octr
  512.     lxi    h,ubuf
  513.     shld    optr
  514.     xchg
  515.     mvi    c,26    ;(1A) set DMA address
  516.     call    0005    ; - B D O S -
  517.     lxi    d,ufil    ;active output (.$$$)
  518.     mvi    c,21    ;(15) write one record
  519.     call    0005    ; - B D O S -
  520.     ora    a
  521.     ret
  522.  
  523. ;    Advance to next alternative
  524.  
  525. nexx:    mov    e,m
  526.     inx    h
  527.     mov    d,m
  528.     xchg
  529. next:    mov    a,m
  530.     ora    a
  531.     rz
  532.     inx    h
  533.     call    enda
  534.     rz
  535.     call    begb
  536.     jz    nexx
  537.     jmp    next
  538.  
  539. ;    Fill (with B) until count (C).
  540.  
  541. fiuc:    mov    m,b
  542.     inx    h
  543.     dcr    c
  544.     jnz    fiuc
  545.     ret
  546.  
  547. miuc:    ldax    d
  548.     mov    m,a
  549.     inx    d
  550.     inx    h
  551.     dcr    c
  552.     jnz    miuc
  553.     ret
  554.  
  555. ;    Move and semi-compile the command line.
  556.  
  557. muve:    mov    a,m
  558.     cpi    TAB
  559.     jnz    munt
  560.     mvi    a,HT
  561. munt:    stax    d
  562.     inx    h
  563.     inx    d
  564.     cpi    RBR
  565.     jz    murb
  566.     cpi    RSQ
  567.     jz    murb
  568.     cpi    LBR
  569.     jz    mulb
  570.     cpi    LSQ
  571.     jz    mulb
  572. must:    dcr    c
  573.     jnz    muve
  574.     ret
  575.  
  576. murb:    xthl
  577.     mov    m,e
  578.     inx    h
  579.     mov    m,d
  580.     pop    h
  581.     jmp    must
  582.  
  583. mulb:    push    d
  584.     inx    d
  585.     inx    d
  586.     jmp    must
  587.  
  588. ;    Check balance of []'s and {}'s.
  589.  
  590. bala:    push    h
  591.     push    b
  592.     lxi    b,0101H
  593. balb:    mov    a,m
  594.     inx    h
  595.     cpi    LSQ
  596.     jnz    balc
  597.     inr    b
  598.     jmp    balb
  599. balc:    cpi    RSQ
  600.     jnz    bald
  601.     dcr    b
  602.     jz    balx
  603.     jmp    balb
  604. bald:    cpi    LBR
  605.     jnz    bale
  606.     inr    c
  607.     jmp    balb
  608. bale:    cpi    RBR
  609.     jnz    balf
  610.     dcr    c
  611.     jz    balx
  612.     jmp    balb
  613. balf:    ora    a
  614.     jnz    balb
  615.     mov    a,c
  616.     cpi    01
  617.     jnz    balx
  618.     mov    a,b
  619.     cpi    01
  620.     pop    b
  621.     pop    h
  622.     rz
  623. balx:    lxi    h,M3    ;"bad pattern"
  624.     call    mssg
  625.     jmp    gbye    ;PDL unbalanced but doesn't matter
  626.  
  627. ;    Check for termination of alternative.
  628.  
  629. enda:    cpi    ORR
  630.     rz
  631. endb:    cpi    RSQ
  632.     rz
  633.     cpi    RBR
  634.     rz
  635.     ora    a
  636.     ret
  637.  
  638. ;    Check for beginning of alternative.
  639.  
  640. bega:    cpi    ORR
  641.     rz
  642. begb:    cpi    LSQ
  643.     rz
  644.     cpi    LBR
  645.     ret
  646.  
  647. ;    Check for null alternative.
  648.  
  649. nula:    push    h
  650.     call    nulb
  651.     pop    h
  652.     ret
  653. nulb:    mov    a,m
  654.     inx    h
  655.     ora    a
  656.     rz
  657.     call    bega
  658.     jnz    nulb
  659.     mov    a,m
  660.     call    enda
  661.     jnz    nulb
  662.     jmp    balx
  663.  
  664. ;    Check for given expression.
  665.  
  666. chek:    ldax    d
  667.     inx    d
  668.     call    enda
  669.     rz
  670.     mov    b,a
  671.     mov    a,m
  672.     cpi    CR
  673.     jz    chno
  674.     mov    a,b
  675.     cpi    LBR
  676.     jz    chlb
  677.     cpi    LSQ
  678.     jz    chsq
  679.     mov    c,m
  680.     inx    h
  681.     cpi    QUE
  682.     jz    chek
  683.     cpi    ALF
  684.     jz    chal
  685.     cmp    c
  686.     jz    chek
  687.     mov    b,a
  688.     mov    a,c
  689.     cpi    'a'
  690.     jc    chno
  691.     cpi    '{'
  692.     jnc    chno
  693.     ani    05FH
  694.     cmp    b
  695.     jz    chek
  696. chno:    ori    0FFH
  697.     ret
  698.  
  699. ;    Check alphanumeric.
  700.  
  701. chal:    mov    a,c
  702.     cpi    '0'
  703.     jc    chno
  704.     cpi    ':'
  705.     jc    chek
  706.     cpi    'A'
  707.     jc    chno
  708.     cpi    '['
  709.     jc    chek
  710.     cpi    'a'
  711.     jc    chno
  712.     cpi    '{'
  713.     jc    chek
  714.     jmp    chno
  715.  
  716. ;    Check list of alternatives.
  717.  
  718. chsq:    mov    c,l
  719.     mov    b,h
  720.     lhld    sqxx
  721.     push    h
  722.     lhld    sqaa
  723.     push    h
  724.     lhld    sqzz
  725.     push    h
  726.     mov    l,c
  727.     mov    h,b
  728.     shld    sqxx
  729.     xchg
  730.     mov    e,m
  731.     inx    h
  732.     mov    d,m
  733.     inx    h
  734.     shld    sqaa
  735.     xchg
  736.     shld    sqzz
  737. chaa:    lhld    sqxx
  738.     call    chek
  739.     jz    chff
  740. chbb:    lhld    sqaa    ;fail so find next alternative
  741. chcc:    call    next
  742.     cpi    RSQ
  743.     jz    chdd    ;no more alternatives, so fail
  744.     cpi    ORR
  745.     jnz    chcc
  746.     shld    sqaa
  747.     xchg
  748.     jmp    chaa    ;try next alternative
  749. chdd:    lhld    sqxx
  750.     ori    0FFH
  751. chee:    mov    c,l
  752.     mov    b,h
  753.     pop    h
  754.     shld    sqzz
  755.     pop    h
  756.     shld    sqaa
  757.     pop    h
  758.     shld    sqxx
  759.     mov    l,c
  760.     mov    h,b
  761.     ret
  762. chff:    xchg        ;good alternative, try rest
  763.     lhld    sqzz
  764.     xchg
  765.     call    chek
  766.     jz    chee
  767.     jmp    chbb
  768.  
  769. ;    Check iterative pattern.
  770.  
  771. chlb:    mov    c,l
  772.     mov    b,h
  773.     lhld    text
  774.     push    h
  775.     lhld    texx
  776.     push    h
  777.     lhld    rest
  778.     push    h
  779.     lhld    rept
  780.     push    h
  781.     lhld    repp
  782.     push    h
  783.     mov    l,c
  784.     mov    h,b
  785.     shld    text
  786.     shld    texx
  787.     xchg
  788.     mov    e,m
  789.     inx    h
  790.     mov    d,m
  791.     inx    h
  792.     shld    rept
  793.     shld    repp
  794.     xchg
  795.     shld    rest
  796. chlc:    lhld    rest
  797.     xchg
  798.     lhld    text
  799.     call    chek    ;check rest
  800.     jz    chzz
  801. chii:    lhld    rept    ;rest failed
  802.     xchg
  803.     lhld    text    ;keep same text
  804.     call    chek    ;try out the repeater
  805.     jnz    choo
  806.     shld    text    ;repeater worked, record progress
  807.     lhld    repp    ;start alternatives over again
  808.     shld    rept
  809.     jmp    chlc
  810. choo:    lhld    rept    ;repeater failed, try next
  811. chxx:    call    next
  812.     cpi    RBR
  813.     jz    chyy    ;this was the last, quit
  814.     cpi    ORR
  815.     jnz    chxx
  816.     shld    rept
  817.     jmp    chii
  818. chyy:    lhld    texx
  819.     ori    00    ;emphasize the RBR
  820. chzz:    mov    c,l
  821.     mov    b,h
  822.     pop    h
  823.     shld    repp
  824.     pop    h
  825.     shld    rept
  826.     pop    h
  827.     shld    rest
  828.     pop    h
  829.     shld    texx
  830.     pop    h
  831.     shld    text
  832.     mov    l,c
  833.     mov    h,b
  834.     ret
  835.  
  836. tuto:    db    'The command line',CR,LF
  837.     db    '     STUTE D:FILE.EXT PATTERN!SKELETON',CR,LF
  838.     db    'will search through all instances of FILE.EXT',CR,LF
  839.     db    '(which may be an ambiguous reference) on disk D',CR,LF
  840.     db    'to find lines containing PATTERN. Such lines will',CR,LF
  841.     db    'be shown on the console preceded by a line number,',CR,LF
  842.     db    'classified by file. Whenever the regular expression',CR,LF
  843.     db    'PATTERN is found, it will be replaced by the constant',CR,LF
  844.     db    'SKELETON. The PATTERN may contain:',CR,LF
  845.     db    '     [p1!p2!...!pn]  alternative strings',CR,LF
  846.     db    '     {p1!p2!...!pn}  repeated alternatives',CR,LF
  847.     db    '     ? any single character',CR,LF
  848.     db    '     @ for any alphanumeric: a-z, A-Z, 0-9',CR,LF
  849.     db    '     _ in place of horizontal tab',CR,LF
  850.     db    'A general PATTERN must be used with extreme caution',CR,LF
  851.     db    'because the same constant will replace it, whatever',CR,LF
  852.     db    'its form. The PATTERN may not involve more than one',CR,LF
  853.     db    'single line, but more than one instance of the PATTERN',CR,LF
  854.     db    'may occupy the same line.',CR,LF
  855.     db    00
  856.  
  857. logo:    db    'STUTE.COM 28/FEB/83 ICUAP',CR,LF,00
  858.  
  859. M3:    db    '-- Bad Pattern --',00
  860.  
  861. M4:    db    CR,LF,'-- Substitution Terminated --',00
  862.  
  863. ;    The following file control segments are arranged in just
  864. ;    the form shown so that they will be properly paired for
  865. ;    the renaming which has to be done after closing each file.
  866.  
  867. enth:    ds    1
  868. file:    db    'DFilenameEXT',00,00,00,00    ;generic filename
  869.     ds    16
  870. ofil:    db    'DFilename$$$',00,00,00,00    ;output file (.$$$)
  871. ifil:    db    'DFilenameEXT',00,00,00,00    ;input file  (.EXT)
  872. kfil:    db    'DFilenameBAK',00,00,00,00    ;backup file (.BAK)
  873. ufil:    db    'Dfilename$$$',00,00,00,00    ;active output (.$$$)
  874.     ds    16
  875. urec:    ds    1
  876. ubuf:    ds    80H
  877. optr:    ds    2
  878. octr:    ds    2
  879.  
  880. ;    All the relevant files are located and noted before any
  881. ;    substitutions are made, to avoid a newly created file
  882. ;    being placed in the dictionary, being encountered again
  883. ;    later on and then being processed a second time. The worst
  884. ;    case would be to have to use all 64 files (minus one, for
  885. ;    elbow room) in the directory.
  886.  
  887. dctr:    ds    1    ;directory counter
  888. dptr:    ds    2    ;directory pointer
  889. diry:    ds    1024    ;directory of file names, if needed
  890.  
  891. ;    Temporary storage for the regular expression parser.
  892.  
  893. sqxx:    ds    2
  894. sqaa:    ds    2
  895. sqzz:    ds    2
  896. text:    ds    2
  897. texx:    ds    2
  898. rest:    ds    2
  899. rept:    ds    2
  900. repp:    ds    2
  901.  
  902. alfa:    ds    2
  903. beta:    ds    2
  904.  
  905. patt:    ds    256        ;command line pattern
  906.     ds    100        ;stack area
  907. stak:    ds    2        ;initialize stack pointer
  908. papo:    ds    2        ;pattern pointer
  909. supo:    ds    2        ;substitute pointer
  910. sund:    ds    2
  911. fhed:    db    '----> File '
  912. fnam:    db    'xxxxxxxx.'    ;filename
  913. fext:    db    'xxx',CR,LF,00    ;file extension
  914. llbl:    db    '      +'
  915. lnum:    db    '         ',00
  916. lzer:    db    '   0'
  917. ftot:    db    '      lines found',CR,LF,00
  918. dtot:    db    '      instances in the entire disk',CR,LF,00
  919.     db    00        ;fence for line buffer
  920. lbuf:    ds    85H        ;line buffer
  921. ictr:    ds    2
  922. iptr:    ds    2
  923. ibuf:    ds    isiz
  924. fini:    ds    0
  925.  
  926.     end
  927.  
  928.