home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / turbodsg / typel.mac < prev    next >
Text File  |  1994-07-13  |  15KB  |  699 lines

  1. .comment \
  2.  
  3.                  TYPEL.MAC v3.5
  4.  
  5.              (c) 1984 ESKAY Software Services
  6.                7120 Skillman #2104
  7.                 Dallas, TX  75231
  8.  
  9.  
  10. NOTE:
  11. =====
  12.     If you feel the urge to "improve" this program,
  13.     PLEASE, call the SENECA RCPM first to see if there
  14.     is a later version. THEN send me your update.
  15.  
  16.  Created from the LDIR code in LDIR12, LTYPE17, SYSLIB routines, and,
  17.  of course, thanks to Dave Rand for the USQ baseline code.
  18.  
  19.  Revision history:
  20.  
  21.  08/19/84    Rewrote USQB, added prompted mode
  22.  07/21/84    Allowed type of $SYS files, adapted for SYSLIB3
  23.  07/07/84    Fixed bug introduced in 3.2
  24.  05/23/84    Fixed problem with end-of-file detection
  25.  05/06/84    Added $L argument option
  26.  04/14/84    General cleanup, added $N argument option
  27.  02/15/84    Fixed problem in lbr member filename scanner
  28.  02/13/84    Single file mode skipped logging - could only
  29.         type files in default drive/user.
  30.  02/12/84    MAJOR REVISION AND NAME CHANGE v2.00
  31.         Program now called TYPEL. It is now able to type
  32.         (almost) any single file. See doc for more info
  33.  01/25/84    Added display of original file name if squeezed.
  34.  01/20/84    Made M80/L80 compatible, changed drive/user code
  35.         to allow use in restricted area if already logged.
  36.         Added page mode.
  37.  01/06/84    Rewrote part of LTYPE to allow reconfig without
  38.         reassembly, other minor mods. SFK
  39.  12/09/83    Fixed ^C bug (problem with CONDIN when remote active)
  40.         also fixed problem with 0-length files.    SFK
  41.  12/09/83    Added code to save/restore default drive/user    SFK.
  42.  11/29/83    Made ^C and ^S checks more frequent to fix a problem
  43.         which sometimes caused it to ignore ^C. SFK
  44.  11/24/83    Strips bit 7, made MAXLIN a DB at 101H
  45.  11/20/83    Initially written.
  46.  
  47.  For further info and reassembly instructions read the DOC file!
  48. \
  49. .8080
  50. ;
  51.     EXTRN    BBLINE    ;SYSLIB line input
  52.     EXTRN    CCOUT    ;SYSLIB character out (convert ctl chars)
  53.     EXTRN    CLOUT    ;SYSLIB list char out
  54.     EXTRN    COMPB    ;SYSLIB compare .DE-.HL
  55.     EXTRN    CIN    ;SYSLIB character in
  56.     EXTRN    DIVHD    ;SYSLIB HL DIV DE
  57.     EXTRN    F$OPEN    ;SYSLIB open file
  58.     EXTRN    F$READ    ;SYSLIB file read
  59.     EXTRN    BDOS    ;SYSLIB BDOS call
  60.     EXTRN    FNAME    ;SYSLIB file name parser
  61.     EXTRN    PUTUD    ;SYSLIB save current DU
  62.     EXTRN    GETUD    ;SYSLIB restore default DU
  63.     EXTRN    LOGUD    ;SYSLIB log drive/user
  64.     EXTRN    PRINT    ;SYSLIB print routine
  65.     EXTRN    PSTR    ;SYSLIB print <HL>
  66.     EXTRN    R$READ    ;SYSLIB random read
  67.     EXTRN    RETUD    ;SYSLIB return drive/user
  68. ;
  69.     EXTRN    USQ    ;Baseline USQ code
  70.     EXTRN    UINIT    ;USQ init code
  71.     PUBLIC    FCB
  72.     PUBLIC    BUFF    ;start of buffer
  73.     PUBLIC    TOPRAM    ;end of buffer location
  74.     PUBLIC    EREXT    ;error intercept from USQ
  75.     PUBLIC    TABLE    ;1032 bytes
  76.     PUBLIC    BUFULL    ;buffer full (print) routine
  77. ;
  78. .request usqb,syslib        ;take the workload off the user
  79. ;
  80. cr    equ    0dh
  81. lf    equ    0ah
  82. argch    equ    '$'        ;option delimiter
  83. ;
  84. bufsz    equ    1        ;buffer size in K bytes
  85. dbuf    equ    80h        ;default buffer
  86. dfcb    equ    5ch        ;default fcb
  87. ;
  88. begin:    jmp    skipc
  89. maxdrv:    db    1+'B'-40H    ;highest accessible drive + 1 (A=2)
  90. maxusr:    db    1+30        ;highest accessible user + 1
  91. maxlin:    db    80        ;number of lines to print max (0=all)
  92. maxlps:    db    23        ;max lines per screen -1 (0= no page)
  93. lsten:    db    0        ;zero=list disable, nz=list enable
  94. sysen:    db    0        ;zero=no sys files, nz=sys files ok
  95. ;
  96. ; refuse to type these file types
  97. ; (note that type check is done after USQ so no need to
  98. ; check for .CQM etc)
  99. ;
  100. notyp:    db    'COM'        
  101.     db    'OBJ'        ;renamed COM
  102.     db    'LBR'        ;library
  103.     db    'OV?'        ;OVR,OVL,OV1,OV2 etc
  104.     db    'ARC'        ;archive file
  105. ;    db    'DIR'        ;archive directory
  106.     db    'BAD'        ;locked out bad spot
  107. ;    db    'SYS'        ;system file
  108.     db    '??#'        ;specially marked file (USERS.TX# etc)
  109. ;    db    'LOG'        ;log file
  110.     db    'INT'        ;intermediate file (CBASIC etc)
  111.     db    'REL'        ;relocatable object file
  112.     db    '?RL'        ;PRL, CRL, IRL
  113. ;    db    'CMD'        ;hard to say... (dbase ok, cp/m86 no-go)
  114.     db    'EXE'        ;executable MSDOS file, renamed COMs
  115.     db    0        ;end of table
  116.     ds    9*3        ;room for 9 more types
  117. ;
  118. skipc:    lxi    sp,stack    ;set up local stack
  119.     call    print
  120.     db    'TYPEL v3.49 (c) ESKAY 10-07-84',cr,lf,0
  121.     lxi    h,dbuf        ;point to buffer
  122.     mov    b,m        ;char count to b
  123.     inr    b
  124. arglp:    dcr    b
  125.     jz    sk1
  126.     inx    h
  127.     mov    a,m
  128.     cpi    argch        ;check for option delimiter
  129.     jnz    arglp
  130.     dcx    h
  131.     mov    a,m
  132.     inx    h
  133.     cpi    ' '        ;option must come after a blank
  134.     jnz    arglp
  135.     dcx    h
  136.     mvi    m,0        ;remove option
  137.     inx    h
  138.     inx    h        ;point to arg
  139.     mov    a,m
  140.     cpi    'N'        ;N=nopage
  141.     mvi    m,0
  142.     jz    na
  143.     cpi    'L'
  144.     jnz    exarg
  145.     sta    lout
  146. na:    xra    a
  147.     sta    maxlps        ;non paging
  148. exarg:    lda    lsten
  149.     ora    a
  150.     jnz    sk1
  151.     sta    lout
  152. sk1:    call    putud        ;save default DU
  153.     lxi    d,bufsz*1024    ;compute...
  154.     lxi    h,buff        ;...buffer size
  155.     dad    d        ;for disk read
  156.     mov    a,h
  157.     sta    topram
  158.     call    retud        ;get current drive/user
  159.     mov    a,c
  160.     ora    a
  161.     jz    no00
  162.     mov    h,b
  163.     mov    l,c
  164.     shld    userno        ;save current DU
  165.     lda    dfcb+1        ;check if no file name specified
  166.     cpi    ' '
  167.     jnz    single
  168. loop:    call    print
  169.     db    cr,lf,'* ',0
  170.     mvi    a,1
  171.     sta    singfl
  172.     call    bbline
  173.     call    print
  174.     db    cr,lf,lf,0
  175.     ora    a
  176.     jz    finish
  177.     lxi    sp,stack
  178.     jmp    nextfl
  179. ;
  180. stlin:    lda    maxlin        ;max number of lines displayed
  181.     sta    maxls
  182.     sta    maxls1
  183.     lda    maxlps
  184.     ora    a
  185.     jz    mls
  186.     dcr    a        ;first page is one less than normal
  187. mls:    sta    lps
  188.     ret
  189. ;
  190. single:    lxi    h,dbuf+2    ;point to argument
  191. nextfl:    lxi    d,fcb
  192.     call    stlin
  193.     call    fname        ;parse file name
  194.     jz    what        ;not a valid file name
  195.     mov    a,m        ;get delimiter
  196.     sta    fflag        ;set flag LBR/non-LBR
  197.     push    h        ;save command line ptr
  198.     inx    b        ;check if current DU:
  199.     mov    a,b
  200.     ora    c
  201.     dcx    b        ;restore DU: value
  202.     jz    currdu        ;skip this if current
  203.     call    print
  204.     db    cr,lf,lf
  205.     db    'Can only display current drive/user!',cr,lf,lf,0
  206.     rst    0
  207.  
  208.     mov    a,b        ;get specified drive
  209.     dcr    b        ;get into range 0..f
  210.     cpi    0ffh        ;ff means current drive
  211.     lxi    h,maxdrv
  212.     jnz    newdsk        ;skip if different
  213.     lda    driveno
  214.     mov    b,a
  215.     jmp    curdsk
  216. ;
  217. newdsk:    cmp    m
  218.     jnc    illdu        ;yes - complain
  219. curdsk:    mov    a,c        ;get specified user area
  220.     cpi    '?'        ;all user areas???
  221.     jz    illdu        ;yes - complain
  222.     cpi    0ffh        ;current user area?
  223.     jnz    newusr
  224.     lda    userno
  225.     mov    c,a
  226.     jmp    curusr
  227. ;
  228. newusr:    inx    h        ;illegal user specified?
  229.     cmp    m
  230.     jnc    illdu        ;yes - complain
  231. curusr:    call    logud        ;log into specified DU:
  232. currdu:    lda    fflag        ;get flag
  233.     cpi    ' '        ;LBR member request?
  234.     pop    h        ;get cmd line ptr back
  235.     jnz    nolbf        ;nope, must be singlefile
  236.     inx    h        ;get next char
  237.     lxi    d,memfcb    ;point to member fcb
  238.     call    fname        ;parse member name
  239.     lxi    h,fcb+1
  240.     call    ckamb        ;check ambiguity
  241.     lxi    h,memfcb+1
  242.     call    ckamb
  243.     lxi    h,FCB+9        ;default to .LBR
  244.     mvi    m,'L'
  245.     inx    h
  246.     mvi    m,'B'
  247.     inx    h
  248.     mvi    m,'R'
  249.     lxi    d,fcb
  250.     call    f$open        ;attempt to open file
  251.     jnz    nofile        ;not a LBR file
  252.     xra    a
  253.     sta    dirs        ;set directory check size to 0
  254.     lda    sysen        ;if $SYS suppress
  255.     ora    a        ;then...
  256.     cz    sysck        ;check for $sys bit
  257.     xra    a
  258.     sta    lin        ;set line count to 0
  259.     lxi    h,memfcb+9    ;point to member type
  260.     call    typck        ;check valid type
  261.     call    f$read        ;read directory into default buffer
  262.     jnz    rderr
  263.     lxi    h,dbuf        ;point to dbuf
  264.     lxi    d,dirname    ;point to 8 blanks
  265.     call    cpfn        ;compare
  266.     jnz    nolbr        ;not equal
  267.     lxi    d,14
  268.     dad    d
  269.     mov    a,m
  270.     sta    dirsiz        ;directory size
  271.     xra    a
  272.     sta    memfcb
  273.     jmp    c00        ;skip into directory check
  274. ;
  275. dirlp:    lxi    d,fcb
  276.     call    f$read
  277.     jnz    rderr
  278. c00:    lxi    b,20h
  279.     lxi    h,dbuf
  280.     lxi    d,memfcb
  281.     call    cpfn
  282.     jz    found
  283.     dad    b
  284.     call    cpfn
  285.     jz    found
  286.     dad    b
  287.     call    cpfn
  288.     jz    found
  289.     dad    b
  290.     call    cpfn
  291.     jz    found
  292.     lda    dirs
  293.     inr    a
  294.     sta    dirs
  295.     mov    b,a
  296.     lda    dirsiz
  297.     cmp    b
  298.     jnz    dirlp
  299.     call    print
  300.     db    cr,lf
  301.     db    'Member file not found in LBR directory',cr,lf,0
  302.     jmp    erext
  303. ;
  304. ; Found the member file name in the LDIR
  305. ;
  306. found:    lxi    d,12
  307.     dad    d
  308.     push    h        ;save pointer for now,
  309.     inx    h        ;point to size
  310.     inx    h
  311.     mov    a,m        ;get low byte
  312.     inx    h
  313.     ora    m        ;if a=0 then file is 0k
  314.     jz    nullen        ;go complain
  315.     pop    h        ;get pointer back
  316.     mov    a,m        ;get file address
  317.     inx    h
  318.     mov    h,m
  319.     mov    l,a
  320. ;
  321. ; enter here from non-LBR routine with HL=0000
  322. ;
  323. dotyp:    lxi    d,fcb        ;get fcb...
  324.     call    r$read        ;...and read random
  325.     jnz    rderr
  326.     lxi    b,dbuf        ;point to buffer
  327.     ldax    b        ;get first byte
  328.     cpi    76h        ;if not 76H (=not squeezed)...
  329.     jnz    plain        ;...then process as text
  330.     inx    b        ;point to and...
  331.     ldax    b        ;...get next byte
  332.     cpi    0ffh        ;if FF then squeezed..
  333.     jnz    plain        ;...else plain text (?)
  334.     call    uinit
  335.     lxi    h,dbuf+4    ;point to original name
  336.     call    chktp        ;check it's type
  337.     mvi    a,'('        ;print the original name...
  338.     call    ccout        ;...in parentheses
  339.     lxi    h,dbuf+4
  340.     call    pstr
  341.     call    print
  342.     db    ')',cr,lf,0
  343.     call    usq        ;now unsqueeze and print
  344.     jmp    goteof
  345. ;
  346. ; This routine fills the buffer then calls the print routine
  347. ;
  348. plain:    lxi    d,fcb
  349.     lxi    b,dbuf        ;default buffer
  350. fnext:    lxi    h,buff
  351. rdlp:    call    f$read        ;changed to properly detect eof...
  352.     jnz    goteof        ;...in unsqueezed single files
  353. mlp:    ldax    b
  354.     mov    m,a
  355.     inx    h
  356.     inr    c
  357.     jnz    mlp
  358.     mvi    c,80h
  359.     lda    topram
  360.     cmp    h
  361.     jnz    rdlp
  362.     call    bufull        ;print buffer contents
  363.     jmp    fnext
  364. ;
  365. goteof:    call    bufull
  366.     jmp    erext
  367. ;
  368. ; This is the print buffer routine (BUFULL)
  369. ;
  370. bufull:    push    h
  371.     push    d
  372.     push    b
  373.     push    psw
  374.     lxi    h,buff
  375. buflp:    mov    a,m
  376.     cpi    1ah
  377.     jz    erext
  378.     cpi    'I'-40h
  379.     jz    proctab
  380.     ani    7fh        ;strip high bits
  381.     call    putchr
  382.     cpi    lf
  383.     jz    eoln
  384.     call    condin        ;get keybd char if available
  385.     jz    goon        ;none there, go on
  386.     cpi    'C'-40h        ;if ^C...
  387.     jz    erext        ;...then finished
  388.     cpi    'S'-40h        ;if not ^S...
  389.     jnz    goon        ;...then go on, else...
  390.     call    cin        ;...wait for keypress
  391.     cpi    'C'-40h
  392.     jz    erext
  393.     jmp    goon
  394. ;
  395. ; This is NOT the SYSLIB routine by same name...
  396. ;
  397. condin:    push    h
  398.     push    d
  399.     push    b
  400.     mvi    c,6
  401.     mvi    e,0ffh
  402.     call    bdos
  403.     ora    a
  404.     pop    b
  405.     pop    d
  406.     pop    h
  407.     ret
  408. ;
  409. eoln:    mvi    a,0ffh        ;reset tab counter
  410.     sta    tab
  411.     lda    maxlps        ;get max lines per screen
  412.     ora    a
  413.     jz    nopag        ;skip if no page mode
  414.     lda    lps
  415.     dcr    a
  416.     sta    lps
  417.     jnz    nopag
  418.     call    print
  419.     db    '[more]',cr,0
  420.     call    cin
  421.     cpi    'C'-40h
  422.     jz    erext
  423.     call    print
  424.     db    '      ',cr,0
  425.     lda    maxlps
  426.     sta    lps
  427. nopag:    mvi    a,0        ;filled by program
  428. maxls    equ    $-1        ;if maxln=0...
  429.     ora    a
  430.     jz    goon        ;..then skip line counter
  431.     lda    lin        ;else increment...
  432.     inr    a
  433.     sta    lin        ;...the line counter
  434.     cpi    0        ;see if maxlin reached
  435. maxls1    equ    $-1
  436.     jnz    goon        ;no, continue
  437.     call    print        ;else abort with message
  438.     db    cr,lf
  439.     db    'TYPEL aborted  - maximum number of lines exceeded.',cr,lf
  440.     db    'Please use XMODEM to transfer file to your system.'
  441.     db    cr,lf,lf,0
  442.     jmp    erext
  443. ;
  444. proctab:lda    tab        ;get current tab value
  445.     mov    b,a        ;save current
  446.     ani    0f8h        ;round down to last full 8
  447.     adi    8        ;make next tab stop
  448. tablp:    call    spout        ;put space
  449.     inr    b        ;continue spaces to..
  450.     cmp    b        ;...next tab stop
  451.     jnz    tablp
  452.     sta    tab        ;save next tab stop
  453.     jmp    go1
  454. ;
  455. ; Print a space
  456. ;
  457. spout:    push    psw
  458.     mvi    a,' '
  459.     call    putchr
  460.     pop    psw
  461.     ret
  462. ;
  463. goon:    lda    tab        ;increment...
  464.     inr    a
  465.     sta    tab        ;...tab counter
  466. go1:    inx    h        ;increment buffer pointer
  467.     lda    topram        ;get top of ram
  468.     cmp    h        ;if not yet reached...
  469.     jnz    buflp        ;...then get next char
  470.     pop    psw        ;else return to caller...
  471.     pop    b        ;...to get more
  472.     pop    d
  473.     pop    h
  474.     ret
  475. ;
  476. ; process non-LBR file
  477. ;
  478. nolbf:    lxi    h,fcb+1
  479.     call    ckamb
  480.     lxi    h,fcb+9        ;point to type
  481.     call    typck        ;check valid type
  482.     lxi    d,fcb
  483.     call    f$open        ;open the file
  484.     jnz    nofile        ;not found...
  485.     lda    sysen
  486.     ora    a
  487.     cz    sysck        ;$sys file?
  488.     call    f$read        ;read first sector
  489.     lxi    h,0
  490.     jz    dotyp        ;type it now...
  491.     call    print
  492.     db    cr,lf
  493.     db    'Unable to type - empty file?',cr,lf,0
  494.     jmp    erext
  495. ;
  496. ; check type of squeezed file (HL=original fn)
  497. ;
  498. chktp:    push    b
  499.     mvi    b,9        ;9 char max
  500. chkt1:    mov    a,m
  501.     inx    h
  502.     cpi    '.'        ;end of fn?
  503.     jz    typck1
  504.     dcr    b
  505.     jnz    chkt1
  506.     pop    b
  507.     ret
  508. ;
  509. ; check file type at <HL> against table
  510. ; PSW, HL munched, ret only if ok
  511. ;
  512. typck:    push    b
  513. typck1:    push    d
  514.     push    h
  515.     lxi    d,notyp        ;point to no-type table
  516. tck1:    pop    h
  517.     push    h
  518.     mvi    b,3        ;3 chars to compare
  519. tck2:    ldax    d
  520.     ora    a        ;if end of table...
  521.     jz    typok        ;...then return
  522.     cpi    '?'        ;ambiguous?
  523.     jz    tck3        ;yes, skip
  524.     cmp    m        ;if no match...
  525.     jnz    tck4        ;...then skip to next table entry
  526.     inx    h
  527.     inx    d
  528.     dcr    b
  529.     jnz    tck2        ;loop until all 3 match
  530.     pop    h
  531.     pop    d
  532.     pop    b
  533.     jmp    tckno        ;not ok to type
  534. ;
  535. ; skip next character in table and filetype
  536. ;
  537. tck3:    inx    h
  538.     inx    d
  539.     dcr    b
  540.     jnz    tck2
  541.     jmp    tck1
  542. ;
  543. ; skip to next table entry
  544. ;
  545. tck4:    inx    d
  546.     dcr    b
  547.     jnz    tck4
  548.     jmp    tck1
  549. ;
  550. ; restore registers and return (ok to type)
  551. ;
  552. typok:    pop    h
  553.     pop    d
  554.     pop    b
  555.     ret
  556. ;
  557. ; complain and abort (type found in table)
  558. ;
  559. tckno:    call    print
  560.     db    cr,lf
  561.     db    'Can''t type a .',0
  562.     mvi    b,3
  563. tcl:    mov    a,m
  564.     inx    h
  565.     call    ccout
  566.     dcr    b
  567.     jnz    tcl
  568.     call    print
  569.     db    ' file!',cr,lf,0
  570.     jmp    erext
  571. ;
  572. ; check if DE+10 has bit 7 set ($SYS file)
  573. ;
  574. sysck:    push    h        ;save HL
  575.     lxi    h,10
  576.     dad    d
  577.     mov    a,m
  578.     pop    h
  579.     ani    80h
  580.     rz
  581.     jmp    nofile        ;pretend not there
  582. ;
  583. ; Here are the messages
  584. ;
  585. illdu:    call    print
  586.     db    cr,lf
  587.     db    'Drive/user out of bounds',cr,lf,0
  588.     jmp    erext
  589. ;
  590. nofile:    call    print
  591.     db    cr,lf
  592.     db    'No such file on disk',cr,lf,0
  593.     jmp    erext
  594. ;
  595. cpfn:    push    h
  596.     push    d
  597.     push    b
  598.     mvi    b,12    ;12 characters
  599.     call    compb
  600.     pop    b
  601.     pop    d
  602.     pop    h
  603.     ret
  604. ;
  605. ckamb:    mvi    a,'?'        ;see if there is any...
  606.     mvi    e,11        ;...ambiguity in the file spec
  607. ckamlp:    cmp    m
  608.     jz    noamb        ;complain if ambiguous fn
  609.     inx    h
  610.     dcr    e
  611.     jnz    ckamlp
  612.     ret
  613. ;
  614. putchr:    push    b
  615.     mov    b,a
  616.     lda    lout
  617.     ora    a
  618.     mov    a,b
  619.     jnz    cot
  620.     call    ccout
  621.     pop    b
  622.     ret
  623. ;
  624. cot:    call    clout
  625.     pop    b
  626.     ret
  627. ;
  628. nolbr:    call    print
  629.     db    cr,lf
  630.     db    'LBR directory may be damaged - aborting',cr,lf,0
  631.     jmp    erext
  632. ;
  633. nomem:    call    print
  634.     db    cr,lf
  635.     db    'No member file name specified.',cr,lf,0
  636.     jmp    what
  637. ;
  638. nullen:    call    print
  639.     db    cr,lf
  640.     db    'Member file is 0k - cannot type.',cr,lf,0
  641.     jmp    erext
  642. ;
  643. rderr:    call    print
  644.     db    cr,lf
  645.     db    'Cannot read file',cr,lf,0
  646.     jmp    erext
  647. ;
  648. no00:    call    print
  649.     db    cr,lf,lf,7
  650.     db    'ERROR - cannot use in users 0 and 31!',cr,lf,0
  651.     rst    0
  652. ;
  653. noamb:    call    print
  654.     db    cr,lf
  655.     db    'No ambiguous file names allowed',cr,lf,0
  656. what:    call    print
  657.     db    cr,lf
  658.     db    'TYPEL v3.5 universal single-file lister',cr,lf
  659.     db    'Usage:',cr,lf
  660.     db    9,'TYPEL [du:]fn[.ft] [fn.ft]',cr,lf
  661.     db    'Examples:',cr,lf
  662.     db    9,'TYPEL MDM722 MDM722.IQF     types member file in LBR',cr,lf
  663.     db    9,'TYPEL TEST.AQM              types normal file',cr,lf
  664.     db    9,'TYPEL F4:TEST.BQS           accepts ZCPR drive/user',cr,lf
  665.     db    9,'TYPEL FOO.ASM $N            $N option=not paging',cr,lf
  666.     db    9,'TYPEL BAR.ZOT $L            $L option=LST: device',cr,lf
  667.     db    'If 1 argument is supplied, single file is typed.',cr,lf
  668.     db    'If 2 arguments, TYPEL assumes first arg is type LBR',cr,lf
  669.     db    'and attempts to type LBR member.',cr,lf
  670.     db    9,'Typing TYPEL without argument starts interactive mode.'
  671.     db    cr,lf,'You can enter individual filenames or RETURN to stop.'
  672.     db    cr,lf,lf,0
  673. erext:    call    getud        ;restore default DU
  674.     lda    singfl
  675.     ora    a
  676.     jnz    loop
  677. finish:    rst    0
  678. ;
  679. singfl:    db    0        ;0=single files, 1=prompted
  680. lout:    db    0        ;flag for list out
  681. fflag:    db    0        ;flag for LBR/non-LBR
  682. topram:    db    0        ;hi byte of buffer end
  683. dirs:    db    0        ;# of dir sectors processed
  684. dirsiz:    db    0        ;# of total dir sectors
  685. tab:    db    0        ;current line tab
  686. lin:    db    0        ;line count
  687. lps:    db    0        ;line count for page mode
  688. userno:    db    0        ;current user #
  689. driveno:db    0        ;current drive
  690. fcb:    ds    36        ;out fcb
  691. memfcb:    ds    12
  692.     ds    50        ;25 level stack
  693. stack:    dw    0        ;save CP/M stack pointer here
  694. dirname:db    0,'           '
  695. buff    equ    2000h        ;start buffer
  696. table    equ    buff-1048    ;usq table
  697.     end
  698.  option=LST: device',cr,lf
  699.     db    'If 1 argument is supplied, single file is typ