home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / D15.LBR / D15.MZC / D15.MAC
Text File  |  2000-06-30  |  32KB  |  1,963 lines

  1. ; NEW-D.MAC  --  Version 1.5  --  October 6, 1989
  2. ;
  3. VERS    equ    15        ; current version
  4. SubVERS    equ    ' '        ; modification level
  5. ;
  6. ; The original version of this file was the result of a disassembly
  7. ; of NEW-D.COM using DASM 1.6 by Richard Conn and Joe Wright.
  8. ;
  9. ; The original binary version of NEW-D.COM is copyright (c) 1984 by
  10. ; Source Maverick.  According to that copyright, you may use NEW-D.COM
  11. ; for your own purposes other than selling it.  You may distribute
  12. ; it as you wish, as long as you do not charge for the program.
  13. ; NEW-D.COM may be distributed on a disk with other programs, for
  14. ; which there is a copy charge only associated with the disk.  The
  15. ; copy charge may not exceed US $2.00 in 1984 dollars, however.  The
  16. ; author assumes no liability whatsoever with respect to another
  17. ; party's usage of NEW-D.COM, your acceptance of this statement being
  18. ; a prerequisite to said party's use of the program.
  19. ;
  20. ; The changes made since the original version are numerous and are not
  21. ; copyright, but they would be of little use by themselves.
  22. ;
  23. ; For usage information, see accompanying documentation file, or type
  24. ; "D //" on the command line.
  25. ;
  26. ; This has long been my favorite directory program, even without DU
  27. ; support.  Originally it required a "[Gnn]" option (like CP/M Plus's
  28. ; PIP option) to see other user areas.  For a long time I used an
  29. ; ARUNZ alias to get DU support.  I finally decided to disassemble and
  30. ; modify the program.  In the process it turned into a major project
  31. ; to make the code more efficient and add enhancements.
  32. ;
  33. ; This file may be assembled using SLRMAC.  DRI's MAC and Microsoft's
  34. ; M80 will probably also work, if you have Z80.LIB.
  35. ;
  36. ;    Gene Pizzetta
  37. ;    481 Revere St.
  38. ;    Revere, MA 02151
  39. ;
  40. ;    Voice:  (617) 284-0891
  41. ;    Newton Center Z-Node:  (617) 965-7259
  42. ;    Lilliput Z-Node:  (312) 649-1730
  43. ;
  44. ; Version 1.0 -- Hank Blake -- 1984
  45. ;    For CP/M 2 and 3.  Source code not released.
  46. ;
  47. ; Version 1.1 -- Gene Pizzetta -- June 25, 1989
  48. ;    For ZCPR3.  Source code derived from disassembly of original
  49. ;    COM file.  Added DU and DIR support under ZCPR3.  Added "//"
  50. ;    help screen.  Option delimiter changed from "[" to "/".  "G"
  51. ;    (specific user area) option eliminated.  Several other
  52. ;    cosmetic changes.
  53. ;
  54. ; Version 1.2 -- Gene Pizzetta -- July 29, 1989
  55. ;    Now searches for filenames containing slashes, but not filenames
  56. ;    beginning with a slash unless it is preceded by a DU specification
  57. ;    (actually, a single colon will do).  Added R option to reset disk
  58. ;    system.  Renamed old R option to O option (to include only read-only
  59. ;    files).  Added TCAP support for dim or reverse video; no installation
  60. ;    required.
  61. ;
  62. ; Version 1.3 -- Gene Pizzetta -- August 21, 1989
  63. ;    No longer sends initial formfeed to printer; instead sends formfeed
  64. ;    after every 62 lines and a final formfeed after printing directory,
  65. ;    unless "N" option is used.  Changed "Ext" to "Typ" in display.  Now
  66. ;    prints ZCPR3 named directory following DU specification, if the
  67. ;    DSKLBL label below is set to FALSE, otherwise looks for CP/M Plus
  68. ;    disk label.
  69. ;
  70. ; Version 1.4 -- Gene Pizzetta -- September 8, 1989
  71. ;    Horizontal lines in dim video.  Added equate for reverse video
  72. ;    version.  Revamped command line parser:  slash (/) no longer
  73. ;    required before options, if option list is second token on the
  74. ;    command line; and if a filetype is given, but not a filename,
  75. ;    the filename is automatically wildcarded.
  76. ;
  77. ; Version 1.5 -- Gene Pizzetta -- October 6, 1989
  78. ;    Corrected problem with file mask, DU, and option selection that
  79. ;    only occurred under Backgrounder ii.  Now reads environment to
  80. ;    determine the number of lines on the screen, number of screen
  81. ;    columns, and number of lines on printer page.  Now re-entrant for
  82. ;    use with the "GO" command.
  83. ;
  84. Bdos    equ    05h
  85. MemTop    equ    06h        ; top of memory vector
  86. CpmFcb    equ    05Ch        ; default file control block
  87. FcbNam    equ    CpmFcb+1    ; filename in FCB
  88. FcbTyp    equ    CpmFcb+9    ; filetype in FCB
  89. FcbUsr    equ    CpmFcb+13    ; user number set in FCB by ZCPR3
  90. DmaBuf    equ    080h        ; command tail and default DMA buffer
  91. L100A    EQU    100AH        ; 4106
  92. Z3Env    equ    0000h        ; default SYSENV address
  93. ;
  94. ; BDOS functions ...
  95. ;
  96. ConOut    equ    2
  97. LstOut    equ    5
  98. ConRaw    equ    6
  99. PrtStr    equ    9
  100. GetVer    equ    12
  101. RstDsk    equ    13
  102. SelDsk    equ    14
  103. FSrchF    equ    17
  104. FSrchN    equ    18
  105. CurDsk    equ    25
  106. AllocV    equ    27
  107. GetRO    equ    29
  108. GetDpb    equ    31
  109. GetUsr    equ    32
  110. FreeSp    equ    46        ; CP/M Plus only
  111. ;
  112. lf    equ    0Ah
  113. ff    equ    0Ch
  114. cr    equ    0Dh
  115. esc    equ    1Bh
  116. ;
  117. False    equ    0
  118. True    equ    Not False
  119. ;
  120. ; If the following equate is set TRUE, then D will display CP/M Plus
  121. ; disk label, instead of ZCPR3 named directory
  122. ;
  123. DskLbl    equ    False
  124. ;
  125. RevVid    equ    False        ; set True if using reverse video highlighting
  126. ;
  127.     MACLIB    Z80
  128. ;
  129.     org    0100h
  130. ;
  131.     jmp    Start        ; jump to start of program
  132. ;
  133.     db    'Z3ENV'        ; ZCPR3 ID (not yet used)
  134.     db    1        ; external environment descriptor
  135. Z3EAdr:    dw    Z3Env        ; environment address
  136. ;
  137. ; Start of program . . .
  138. ;
  139. Start:    pop    h        ; get return address from stack
  140.     shld    CpmRet        ; ..and save it
  141.     sspd    CpmStk        ; save old stack pointer
  142.     lxi    sp,CpmStk    ; ..and point to new stack
  143. ;
  144.     xra    a        ; initialize some data
  145.     lxi    h,OpAFlg
  146.     mvi    b,64
  147. IniLp:    mov    m,a
  148.     inx    h
  149.     djnz    IniLp
  150.     sta    HorSiz
  151. ;
  152.     lda    FcbUsr        ; get user number from ZCPR FCB
  153.     sta    User        ; ..and store it
  154.     mvi    c,GetVer    ; get current CP/M version
  155.     call    Bdos
  156.     mvi    a,0F0h
  157.     ana    l
  158.     sui    20h
  159.     sta    CpmVer        ; store current version
  160. ;
  161.     mvi    a,4        ; default to 4 column display
  162.     sta    MaxCol
  163.     lhld    Z3EAdr        ; get environment address
  164.     lxi    d,31h        ; offset to CRT columns
  165.     dad    d        ; add to HL
  166.     mov    a,m        ; get columns
  167.     cpi    78
  168.     jrnc    GetLn2        ; (use default)
  169.     cpi    58
  170.     jrnc    GetLn1
  171.     mvi    a,2
  172.     sta    MaxCol
  173.     jr    GetLn2
  174. GetLn1:    mvi    a,3        ; use 3 columns instead
  175.     sta    MaxCol
  176. GetLn2:    inx    h        ; now point to CRT lines
  177.     mov    a,m        ; get number lines
  178.     dcr    a        ; minus 1
  179.     sta    LinCnt        ; ..and store it
  180.     sta    CrtRow
  181.     lxi    d,6        ; offset to PRT lines (38h)
  182.     dad    d
  183.     mov    a,m        ; get number of lines
  184.     sui    4        ; subtract 4
  185.     sta    LstCnt
  186. ;
  187.     call    GetOpt        ; get user options and set flags
  188.     lda    CpmFcb        ; was a drive given?
  189.     ora    a
  190.     jnz    GotDrv        ; (yes)
  191.     mvi    c,CurDsk    ; no, get current drive (A=0)
  192.     call    Bdos
  193.     inr    a        ; increment it (A=1)
  194.     sta    CpmFcb        ; ..and store it
  195. ;
  196. GotDrv:    lhld    Z3EAdr        ; get environment address
  197.     lxi    d,97h        ; offset to TCAP term table
  198.     dad    d        ; add to HL
  199.     mvi    b,3        ; set B for 3 iterations
  200. TermLp:    mov    a,m        ; get character
  201.     inx    h        ; ..and increment pointer
  202.     ora    a        ; is it nul?
  203.     jnz    TermLp        ; (no, try again)
  204.     dcr    b        ; yes, so decrement counter
  205.     mov    a,b
  206.     ora    a        ; finished?
  207.     jnz    TermLp        ; (no, try again)
  208.     lxi    d,DimVid
  209. DimLp:    mov    a,m        ; yes, so now we move dim video
  210.     inx    h        ; string to internal storage
  211.     stax    d
  212.     inx    d
  213.     ora    a
  214.     jnz    DimLp
  215.     lxi    d,RegVid
  216. RegLp:    mov    a,m        ; then we move regular video
  217.     inx    h        ; string to internal storage
  218.     stax    d
  219.     inx    d
  220.     ora    a
  221.     jnz    RegLp
  222. ;
  223.     lda    OpRFlg        ; check reset flag
  224.     ora    a        ; ..non-zero?
  225.     cnz    DReset        ; (yes, do it)
  226.     CALL    SetFcb
  227.     CALL    GetFns
  228.     lda    OpCFlg        ; using check option C?
  229.     ora    a        ; (no)
  230.     jz    NoOpC
  231.     LHLD    L0D7D        ; any files?
  232.     MOV    A,L
  233.     ORA    H
  234.     CNZ    PrtDv2
  235.     jmp    NoFile
  236. NoOpC:    LHLD    FilCnt        ; any files?
  237.     MOV    A,H
  238.     ORA    L
  239.     JZ    NoFile        ; (no)
  240.     LDA    OpXFlg        ; do we sort them?
  241.     ORA    A
  242.     JNZ    NoSort        ; (no)
  243.     DCX    H        ; more than 1 file?
  244.     MOV    A,H
  245.     ORA    L
  246.     CNZ    FnSort        ; (yes, sort them)
  247. NoSort:    CALL    L06F7
  248.     CALL    L07A4
  249. NoFile:    CALL    L091D
  250. ;
  251. Exit:    lspd    CpmStk        ; restore old stack pointer
  252.     lhld    CpmRet        ; restore return address
  253.     pchl            ; ..and return to CP/M
  254. ;
  255. ; Subroutines ...
  256. ;
  257. ; GetOpt -- Gets user supplied options and sets various option flags
  258. ;
  259. GetOpt:    lxi    h,DmaBuf+1    ; point to command tail
  260.     lda    DmaBuf        ; anything there?
  261.     ora    a
  262.     rz            ; (no)
  263.     mov    b,a        ; yes, put number of chars in B
  264.     call    EatSpc        ; gobble spaces
  265.     cpi    '/'        ; is it a slash?
  266.     jz    IsSlsh        ; (yes, there's no filename)
  267. FnLp:    inx    h
  268.     dcr    b
  269.     mov    a,m
  270.     ora    a
  271.     rz
  272.     cpi    ' '
  273.     jrnz    FnLp
  274.     call    EatSpc
  275.     ora    a
  276.     rz            ; (no options)
  277.     mov    a,m        ; get first char of second token
  278.     cpi    '/'        ; a slash?
  279.     jrnz    ScnOpt        ; (no, so get options)
  280.     inx    h        ; yes, move past it
  281.     dcr    b
  282.     jr    ScnOpt        ; ..and get options
  283. IsSlsh:    mvi    a,' '        ; no filename, so put space in
  284.     sta    FcbNam        ; ..filename of FCB
  285.     inx    h        ; ..move past slash
  286.     dcr    b        ; ..and fall into option scanning
  287. ;
  288. ScnOpt:    call    ScnTbl
  289.     xchg            ; point back to options
  290.     inx    h
  291.     djnz    ScnOpt        ; loop through options
  292.     lda    OpFFlg        ; F option chosen?
  293.     rar
  294.     jnc    SkipF        ; (no, skip)
  295.     lxi    h,MaxCol    ; yes, increase display columns
  296.     inr    m
  297.     ret
  298. ;
  299. SkipF:    lda    OpUFlg        ; U option chosen?
  300.     rar
  301.     rnc            ; (no)
  302.     lxi    h,MaxCol    ; yes, decrease display columns
  303.     dcr    m
  304.     ret
  305. ;
  306. ScnTbl:    mov    c,m        ; put option in C
  307.     lxi    d,OptTbl    ; point DE to option table
  308. ScnTLp:    ldax    d        ; get table option
  309.     ora    a        ; end of table?
  310.     jz    NoMat        ; (yes, no match)
  311.     inx    d        ; no, keep looking
  312.     cmp    c        ; match?
  313.     jz    TMatch        ; (yes)
  314.     inx    d        ; move pointer to next entry
  315.     inx    d
  316.     jmp    ScnTLp        ; ..and keep looking
  317. ;
  318. NoMat:    xchg
  319.     ret
  320. ;
  321. TMatch:    push    h        ; save option pointer
  322.     ldax    d        ; put address from table into HL
  323.     mov    l,a
  324.     inx    d
  325.     ldax    d
  326.     mov    h,a
  327.     pop    d        ; recover option pointer in DE
  328.     mvi    a,1        ; set option flag by jumping to
  329.     pchl            ; ..table routine and returning
  330. ;
  331. ; Option Jump Table
  332. ;
  333. OptTbl:    db    'A'        ; A = archived files
  334.     dw    OptA
  335.     db    'B'        ; B = include system files
  336.     dw    OptB
  337.     db    'C'        ; C = comprehensive FCB info
  338.     dw    OptC
  339. ;    db    'D'        ; D = display file date (not yet supported)
  340. ;    dw    OptD
  341.     db    'F'        ; F = suppress file size
  342.     dw    OptF
  343.     db    '/'        ; / = help
  344.     dw    OptH
  345.     db    'N'        ; N = suppress initial formfeed to printer
  346.     dw    OptN
  347.     db    'O'        ; O = read-only files only
  348.     dw    OptO
  349.     db    'P'        ; P = send output to printer
  350.     dw    OptP
  351.     db    'R'        ; R = reset disk system
  352.     dw    OptR
  353.     db    'S'        ; S = system files only
  354.     dw    OptS
  355. ;    db    'T'        ; T = sort by filetype (not yet supported)
  356. ;    dw    OptT
  357.     db    'U'        ; U = include all user areas
  358.     dw    OptU
  359.     db    'W'        ; W = read/write files only
  360.     dw    OptW
  361.     db    'X'        ; X = don't sort file listing
  362.     dw    OptX
  363.     db    'Z'        ; Z = non-archived files only
  364.     dw    OptZ
  365.     db    0        ; end of option jump table
  366. ;
  367. ; Option flag setting routines
  368. ;
  369. OptA:    sta    OpAFlg
  370.     ret
  371. OptB:    sta    OpBFlg
  372.     ret
  373. OptC:    sta    OpCFlg
  374.     ret
  375. OptF:    sta    OpFFlg
  376.     ret
  377. OptN:    sta    OpNFlg
  378.     ret
  379. OptO:    sta    OpOFlg
  380.     ret
  381. OptP:    sta    OpPFlg
  382.     ret
  383. OptR:    sta    OpRFlg
  384.     ret
  385. OptS:    sta    OpSFlg
  386.     ret
  387. OptU:    sta    OpUFlg
  388.     ret
  389. OptW:    sta    OpWFlg
  390.     ret
  391. OptX:    sta    OpXFlg
  392.     ret
  393. OptZ:    sta    OpZFlg
  394.     ret
  395. ;
  396. OptH:    lxi    d,MsgHlp    ; display help message
  397.     mvi    c,PrtStr
  398.     call    Bdos
  399.     jmp    Exit        ; ..and return to CP/M
  400. ;
  401. ; DReset -- resets disk system
  402. ;
  403. DReset:    mvi    c,RstDsk
  404.     call    Bdos
  405.     ret
  406. ;
  407. ; EatSpc -- gobbles up spaces.  Expects address of string in HL, length of
  408. ; string in B
  409. ;
  410. EatSpc:    mov    a,m        ; get character
  411.     inx    h        ; increment pointer
  412.     dcr    b        ; decrement counter
  413.     cpi    ' '        ; is it a space?
  414.     jrz    EatSpc        ; (yes, eat it)
  415.     dcx    h        ; no, back up pointer
  416.     inr    b        ; ..and counter, and
  417.     ret            ; ..return with character
  418. ;
  419. ; SetFcb --
  420. ;
  421. SetFcb:    lda    CpmFcb        ; get drive (A=1)
  422.     dcr    a        ; make A=0
  423.     mov    e,a
  424.     mvi    d,0
  425.     mvi    c,SelDsk    ; make it the default drive
  426.     call    Bdos
  427.     lda    FcbNam        ; check for space in first character
  428.     cpi    ' '
  429.     jrnz    NoSpc        ; (no space)
  430.     mvi    a,'?'        ; set filename to ?'s
  431.     lxi    h,FcbNam
  432.     mov    m,a
  433.     lxi    d,FcbNam+1
  434.     lxi    b,7
  435.     ldir
  436.     lda    FcbTyp        ; check for filetype
  437.     cpi    ' '
  438.     jrnz    NoSpc        ; (we've got one)
  439.     lxi    h,FcbNam    ; set filetype to ?'s
  440.     lxi    d,FcbTyp
  441.     lxi    b,3
  442.     ldir
  443. NoSpc:    lda    OpUFlg        ; all users?
  444.     rar
  445.     jnc    NoOpU        ; (no)
  446.     lxi    h,User        ; make user a question mark
  447.     mvi    m,'?'
  448. NoOpU:    LXI    B,11
  449.     LXI    D,FnSav
  450.     LXI    H,FcbNam
  451.     LDIR
  452.     MVI    A,'?'
  453.     LXI    H,CpmFcb
  454.     MOV    M,A
  455.     LXI    D,FcbNam
  456.     LXI    B,12
  457.     LDIR
  458.     lda    CpmVer        ; check version flag
  459.     ora    a
  460.     jz    NoCpm3        ; (not CP/M 3
  461.     lxi    d,CpmFcb    ; initialize DPB for CP/M Plus
  462.     mvi    c,FSrchF
  463.     call    Bdos
  464. NoCpm3:    mvi    C,GetDpb    ; move DPB to storage
  465.     call    Bdos
  466.     lxi    b,15
  467.     lxi    d,DpbSav
  468.     ldir
  469.     LHLD    L0DA8
  470.     INX    H
  471.     INX    H
  472.     DAD    H
  473.     LXI    D,L0E2B
  474.     DAD    D
  475.     SHLD    L0DB0
  476.     LDA    L0DA4
  477.     INR    A
  478.     RRC
  479.     RRC
  480.     RRC
  481.     MOV    L,A
  482.     MVI    H,0
  483.     SHLD    L0D9B
  484.     LHLD    L0DA8
  485.     INX    H
  486.     SHLD    L0D99
  487.     RET
  488. ;
  489. GetFns:    lxi    d,CpmFcb
  490.     mvi    c,FSrchF
  491.     call    Bdos
  492. L0336:    
  493.     ORA    A
  494.     RM
  495.     ADD    A
  496.     ADD    A
  497.     ADD    A
  498.     ADD    A
  499.     ADD    A
  500.     ADI    128
  501.     MOV    L,A
  502.     MVI    H,0
  503.     SHLD    L0D9F
  504.     MOV    A,M
  505.     CPI    229
  506.     JZ    L03DD
  507.     LHLD    L0DB0
  508.     LXI    D,30
  509.     DAD    D
  510.     XCHG
  511.     LHLD    MemTop
  512.     ORA    A
  513.     DSBC    D
  514.     JNC    L0367
  515.     mvi    c,PrtStr    ; say directory is too big
  516.     lxi    d,MsgBig
  517.     call    Bdos
  518.     jmp    Exit        ; ..and return to CP/M
  519. L0367:    
  520.     LXI    D,2064
  521.     DSBC    D
  522.     JNC    L0375
  523.     LXI    H,0
  524.     SHLD    CpmRet
  525. L0375:    
  526.     LHLD    L0D99
  527.     DCX    H
  528.     SHLD    L0D99
  529.     LBCD    L0D9F
  530.     CALL    L04A6
  531.     RAR
  532.     JNC    L03DD
  533.     LDA    OpCFlg
  534.     ORA    A
  535.     CNZ    L03E5
  536.     LXI    B,16
  537.     LHLD    L0D9F
  538.     DAD    B
  539.     MOV    B,H
  540.     MOV    C,L
  541.     CALL    L0536
  542.     PUSH    H
  543.     LXI    B,12
  544.     LHLD    L0DB0
  545.     DAD    B
  546.     POP    B
  547.     MOV    M,C
  548.     INX    H
  549.     MOV    M,B
  550.     LHLD    L0D7B
  551.     DAD    B
  552.     SHLD    L0D7B
  553.     LXI    B,11
  554.     LDED    L0DB0
  555.     LHLD    L0D9F
  556.     INX    H
  557.     LDIR
  558.     LHLD    L0D9F
  559.     MOV    A,M
  560.     STAX    D
  561.     LHLD    FilCnt
  562.     INX    H
  563.     SHLD    FilCnt
  564.     DAD    H
  565.     XCHG
  566.     LXI    H,L0E2B
  567.     DAD    D
  568.     LDED    L0DB0
  569.     MOV    M,E
  570.     INX    H
  571.     MOV    M,D
  572.     LXI    D,14
  573.     LHLD    L0DB0
  574.     DAD    D
  575.     SHLD    L0DB0
  576. L03DD:    
  577.     MVI    C,FSrchN
  578.     CALL    Bdos
  579.     JMP    L0336
  580. L03E5:    
  581.     LDA    L0D78
  582.     ORA    A
  583.     JNZ    L0412
  584.     INR    A
  585.     STA    L0D78
  586.     CALL    L0B2B
  587.     LXI    B,MsgCmp
  588.     MVI    A,39
  589.     CALL    L0AE7
  590.     MVI    B,39
  591.     LDA    L0DA7
  592.     ORA    A
  593.     JZ    L0406
  594.     MVI    B,31
  595. L0406:    
  596.     MOV    A,B
  597.     LXI    H,HorSiz
  598.     ADD    M
  599.     MOV    M,A
  600.     CALL    PrtDvd
  601.     CALL    PagBrk
  602. L0412:    
  603.     LIXD    L0D9F
  604.     ldx    a,12
  605.     ORA    A
  606.     JZ    L042F
  607.     DCR    A
  608.     JNZ    L0436
  609.     LDA    L0DA7
  610.     ORA    A
  611.     JNZ    L0436
  612.     ldx    a,24
  613.     ORA    A
  614.     JZ    L0436
  615. L042F:    
  616.     LHLD    L0D7D
  617.     INX    H
  618.     SHLD    L0D7D
  619. L0436:    
  620.     MVI    B,1
  621.     CALL    L0B8E
  622.     CALL    SpcOut
  623.     MVI    B,11
  624. L0440:    
  625.     PUSH    B
  626.     ldx    a,0
  627.     inxix
  628.     ORA    A
  629.     JP    L0465
  630.     ANI    7FH
  631.     PUSH    PSW
  632.     call    DimOn
  633.     POP    PSW
  634.       call    RvsCse
  635.     CPI    ' '
  636.     JNZ    L045B
  637.     MVI    A,'*'
  638. L045B:    
  639.     MOV    E,A
  640.     call    ChrOut
  641.     call    DimOff
  642.     JMP    L046C
  643. L0465:    
  644.     call    RvsCse
  645.     mov    e,a
  646.     call    ChrOut
  647. L046C:    
  648.     POP    B
  649.     DJNZ    L0440
  650.     CALL    SpcOut
  651.     CALL    SpcOut
  652.     MVI    B,4
  653.     CALL    L0B8E
  654.     CALL    SpcOut
  655.     LDA    L0DA7
  656.     ORA    A
  657.     JNZ    L048C
  658.     MVI    B,16
  659.     CALL    L0B8E
  660.     JMP    L04A2
  661. L048C:    
  662.     MVI    B,8
  663. L048E:    
  664.     PUSH    B
  665.     ldx    a,1
  666.     CALL    L0BA1
  667.     ldx    a,0
  668.     CALL    L0B9B
  669.     inxix
  670.     inxix
  671.     POP    B
  672.     DJNZ    L048E
  673. L04A2:    
  674.     CALL    PagBrk
  675.     RET
  676. L04A6:    
  677.     call    SavLbl        ; check if disk label
  678.     rz            ; (it is, skip it)
  679.     LDA    OpUFlg
  680.     ORA    A
  681.     JZ    L04B9
  682.     LDAX    B
  683.     CPI    16
  684.     JM    L04B9
  685.     XRA    A
  686.     RET
  687. L04B9:    
  688.     LXI    H,User
  689.     MVI    E,12
  690. L04BE:    
  691.     MOV    A,M
  692.     CPI    '?'
  693.     JZ    L04CC
  694.     MOV    D,A
  695.     LDAX    B
  696.     ANI    7FH
  697.     CMP    D
  698.     MVI    A,0
  699.     RNZ
  700. L04CC:    
  701.     INX    B
  702.     INX    H
  703.     DCR    E
  704.     JNZ    L04BE
  705.     DCX    B
  706.     LDA    OpAFlg
  707.     ORA    A
  708.     JZ    L04DF
  709.     MVI    E,0
  710.     JMP    L04E8
  711. L04DF:    
  712.     LDA    OpZFlg
  713.     ORA    A
  714.     JZ    L04EE
  715.     MVI    E,80h
  716. L04E8:    
  717.     LDAX    B
  718.     XRA    E
  719.     RLC
  720.     ANI    1
  721.     RZ
  722. L04EE:    
  723.     DCX    B
  724.     DCX    B
  725.     LDA    OpOFlg
  726.     ORA    A
  727.     JZ    L04FC
  728.     MVI    E,0
  729.     JMP    L0505
  730. L04FC:    
  731.     LDA    OpWFlg
  732.     ORA    A
  733.     JZ    L050B
  734.     MVI    E,80h
  735. L0505:    
  736.     LDAX    B
  737.     XRA    E
  738.     RLC
  739.     ANI    1
  740.     RZ
  741. L050B:    
  742.     LDA    OpBFlg
  743.     ORA    A
  744.     RNZ
  745.     INX    B
  746.     LDA    OpSFlg
  747.     ORA    A
  748.     LDAX    B
  749.     JNZ    L051E
  750.     CMA
  751.     RLC
  752.     ANI    1
  753.     RET
  754. L051E:    
  755.     RLC
  756.     ANI    1
  757.     RET
  758. ;
  759. ; SavLbl -- checks for CP/M 3 disk label (user 32) and saves it if found.
  760. ; Entry: BC -> user and filename
  761. ; Exit: Zero flag set if label found
  762. ;
  763. SavLbl:    ldax    b        ; check user number
  764.     cpi    32        ; is it 32?
  765.     rnz            ; (no, not disk label)
  766.   IF DSKLBL
  767.     sta    LblUsr        ; store it
  768.     inx    b        ; increment pointer
  769.     mov    l,c        ; ..move pointer to HL
  770.     mov    h,b
  771.     lxi    d,LblNam    ; ..and store disk label (11 chars)
  772.     lxi    b,11
  773.     ldir
  774.   ENDIF
  775.     xra    a
  776.     ret
  777. ;
  778. L0536:    
  779.     LXI    H,0
  780.     LDA    L0DA7
  781.     ORA    A
  782.     JNZ    L054E
  783.     MVI    E,16
  784. L0542:    
  785.     LDAX    B
  786.     ORA    A
  787.     JZ    L0548
  788.     INX    H
  789. L0548:    
  790.     INX    B
  791.     DCR    E
  792.     JNZ    L0542
  793.     RET
  794. L054E:    
  795.     MVI    E,8
  796. L0550:    
  797.     LDAX    B
  798.     MOV    D,A
  799.     INX    B
  800.     LDAX    B
  801.     ORA    D
  802.     JZ    L0559
  803.     INX    H
  804. L0559:    
  805.     INX    B
  806.     DCR    E
  807.     JNZ    L0550
  808.     RET
  809. FnSort:    
  810.     LXI    H,L0DBF
  811.     MVI    M,1
  812.     LXI    H,1
  813.     SHLD    L0DC2
  814.     LHLD    FilCnt
  815.     SHLD    L0DDA
  816. L0570:    
  817.     LDA    L0DBF
  818.     ORA    A
  819.     RZ
  820.     DCR    A
  821.     STA    L0DBF
  822.     INR    A
  823.     ADD    A
  824.     MOV    C,A
  825.     MVI    B,0
  826.     LXI    H,L0DC0
  827.     DAD    B
  828.     MOV    E,M
  829.     INX    H
  830.     MOV    D,M
  831.     SDED    L0DB7
  832.     LXI    H,L0DD8
  833.     DAD    B
  834.     MOV    E,M
  835.     INX    H
  836.     MOV    D,M
  837.     SDED    L0DB9
  838. L0594:    
  839.     LHLD    L0DB7
  840.     LDED    L0DB9
  841.     ORA    A
  842.     DSBC    D
  843.     JNC    L0570
  844.     LHLD    L0DB7
  845.     SHLD    L0DB3
  846.     LDED    L0DB9
  847.     SDED    L0DB5
  848.     DAD    D
  849.     MOV    A,L
  850.     ANI    0FEH
  851.     MOV    L,A
  852.     LXI    D,L0E2B
  853.     DAD    D
  854.     MOV    E,M
  855.     INX    H
  856.     MOV    D,M
  857.     SDED    L0DBB
  858. L05BF:    
  859.     LHLD    L0DB5
  860.     LDED    L0DB3
  861.     ORA    A
  862.     DSBC    D
  863.     JC    L0660
  864.     MOV    L,E
  865.     MOV    H,D
  866. L05CE:    
  867.     DAD    H
  868.     LXI    D,L0E2B
  869.     DAD    D
  870.     MOV    C,M
  871.     INX    H
  872.     MOV    B,M
  873.     LDED    L0DBB
  874.     CALL    L0A90
  875.     INR    A
  876.     JNZ    L05EB
  877.     LHLD    L0DB3
  878.     INX    H
  879.     SHLD    L0DB3
  880.     JMP    L05CE
  881. L05EB:    
  882.     LHLD    L0DB5
  883. L05EE:    
  884.     DAD    H
  885.     LXI    D,L0E2B
  886.     DAD    D
  887.     MOV    E,M
  888.     INX    H
  889.     MOV    D,M
  890.     LBCD    L0DBB
  891.     CALL    L0A90
  892.     INR    A
  893.     JNZ    L060B
  894.     LHLD    L0DB5
  895.     DCX    H
  896.     SHLD    L0DB5
  897.     JMP    L05EE
  898. L060B:    
  899.     LHLD    L0DB5
  900.     LDED    L0DB3
  901.     ORA    A
  902.     DSBC    D
  903.     JC    L05BF
  904.     LHLD    L0DB3
  905.     DAD    H
  906.     LXI    D,L0E2B
  907.     DAD    D
  908.     MOV    E,M
  909.     INX    H
  910.     MOV    D,M
  911.     SDED    L0DBD
  912.     LHLD    L0DB5
  913.     DAD    H
  914.     LXI    D,L0E2B
  915.     DAD    D
  916.     PUSH    H
  917.     LHLD    L0DB3
  918.     DAD    H
  919.     LXI    D,L0E2B
  920.     DAD    D
  921.     XTHL
  922.     MOV    C,M
  923.     INX    H
  924.     MOV    B,M
  925.     POP    H
  926.     MOV    M,C
  927.     INX    H
  928.     MOV    M,B
  929.     LHLD    L0DB5
  930.     DAD    H
  931.     LXI    D,L0E2B
  932.     DAD    D
  933.     LDED    L0DBD
  934.     MOV    M,E
  935.     INX    H
  936.     MOV    M,D
  937.     LHLD    L0DB3
  938.     INX    H
  939.     SHLD    L0DB3
  940.     LHLD    L0DB5
  941.     DCX    H
  942.     SHLD    L0DB5
  943.     JMP    L05BF
  944. L0660:    
  945.     LHLD    L0DB5
  946.     LDED    L0DB7
  947.     ORA    A
  948.     DSBC    D
  949.     PUSH    H
  950.     LHLD    L0DB9
  951.     LDED    L0DB3
  952.     ORA    A
  953.     DSBC    D
  954.     XCHG
  955.     POP    H
  956.     ORA    A
  957.     DSBC    D
  958.     JNC    L06BA
  959.     LHLD    L0DB3
  960.     LDED    L0DB9
  961.     ORA    A
  962.     DSBC    D
  963.     JNC    L06B1
  964.     LDA    L0DBF
  965.     INR    A
  966.     STA    L0DBF
  967.     ADD    A
  968.     MOV    C,A
  969.     MVI    B,0
  970.     LXI    H,L0DC0
  971.     DAD    B
  972.     LDED    L0DB3
  973.     MOV    M,E
  974.     INX    H
  975.     MOV    M,D
  976.     LHLD    L0DBF
  977.     MVI    H,0
  978.     LXI    B,L0DD8
  979.     DAD    H
  980.     DAD    B
  981.     LDED    L0DB9
  982.     MOV    M,E
  983.     INX    H
  984.     MOV    M,D
  985. L06B1:    
  986.     LHLD    L0DB5
  987.     SHLD    L0DB9
  988.     JMP    L0594
  989. L06BA:    
  990.     LHLD    L0DB7
  991.     LDED    L0DB5
  992.     ORA    A
  993.     DSBC    D
  994.     JNC    L06EE
  995.     LDA    L0DBF
  996.     INR    A
  997.     STA    L0DBF
  998.     ADD    A
  999.     MOV    C,A
  1000.     MVI    B,0
  1001.     LXI    H,L0DC0
  1002.     DAD    B
  1003.     LDED    L0DB7
  1004.     MOV    M,E
  1005.     INX    H
  1006.     MOV    M,D
  1007.     LHLD    L0DBF
  1008.     MVI    H,0
  1009.     LXI    B,L0DD8
  1010.     DAD    H
  1011.     DAD    B
  1012.     LDED    L0DB5
  1013.     MOV    M,E
  1014.     INX    H
  1015.     MOV    M,D
  1016. L06EE:    
  1017.     LHLD    L0DB3
  1018.     SHLD    L0DB7
  1019.     JMP    L0594
  1020. L06F7:    
  1021.     LXI    H,0
  1022.     SHLD    L0DF0
  1023.     SHLD    L0DF2
  1024. L0700:    
  1025.     LHLD    L0DF2
  1026.     LDED    FilCnt
  1027.     ORA    A
  1028.     DSBC    D
  1029.     JC    L0714
  1030.     LHLD    L0DF0
  1031.     SHLD    L0D7D
  1032.     RET
  1033. L0714:    
  1034.     LHLD    L0DF2
  1035.     INX    H
  1036.     SHLD    L0DF2
  1037.     DAD    H
  1038.     LXI    D,L0E2B
  1039.     DAD    D
  1040.     PUSH    H
  1041.     LHLD    L0DF0
  1042.     INX    H
  1043.     SHLD    L0DF0
  1044.     DAD    H
  1045.     LXI    D,L0E2B
  1046.     DAD    D
  1047.     XTHL
  1048.     MOV    C,M
  1049.     INX    H
  1050.     MOV    B,M
  1051.     POP    H
  1052.     MOV    M,C
  1053.     INX    H
  1054.     MOV    M,B
  1055. L0735:    
  1056.     LHLD    L0DF2
  1057.     LDED    FilCnt
  1058.     ORA    A
  1059.     DSBC    D
  1060.     SBB    A
  1061.     PUSH    PSW
  1062.     LHLD    L0DF0
  1063.     DAD    H
  1064.     LXI    D,L0E2B
  1065.     DAD    D
  1066.     PUSH    H
  1067.     LHLD    L0DF2
  1068.     LXI    B,2
  1069.     DAD    H
  1070.     DAD    B
  1071.     LXI    D,L0E2B
  1072.     DAD    D
  1073.     MOV    E,M
  1074.     INX    H
  1075.     MOV    D,M
  1076.     POP    H
  1077.     MOV    C,M
  1078.     INX    H
  1079.     MOV    B,M
  1080.     CALL    L0A90
  1081.     SUI    0
  1082.     SUI    1
  1083.     SBB    A
  1084.     POP    B
  1085.     ANA    B
  1086.     RAR
  1087.     JNC    L0700
  1088.     LHLD    L0DF2
  1089.     INX    H
  1090.     SHLD    L0DF2
  1091.     DAD    H
  1092.     LXI    D,L0E2B
  1093.     DAD    D
  1094.     MOV    E,M
  1095.     INX    H
  1096.     MOV    D,M
  1097.     XCHG
  1098.     LXI    B,12
  1099.     DAD    B
  1100.     MOV    E,M
  1101.     INX    H
  1102.     MOV    D,M
  1103.     SDED    L0DF4
  1104.     LHLD    L0DF0
  1105.     DAD    H
  1106.     LXI    D,L0E2B
  1107.     DAD    D
  1108.     MOV    E,M
  1109.     INX    H
  1110.     MOV    D,M
  1111.     XCHG
  1112.     DAD    B
  1113.     PUSH    H
  1114.     MOV    E,M
  1115.     INX    H
  1116.     MOV    D,M
  1117.     LHLD    L0DF4
  1118.     DAD    D
  1119.     MOV    C,L
  1120.     MOV    B,H
  1121.     POP    H
  1122.     MOV    M,C
  1123.     INX    H
  1124.     MOV    M,B
  1125.     JMP    L0735
  1126. L07A4:    
  1127.     CALL    L0B2B
  1128.     LHLD    L0D7D
  1129.     MOV    A,H
  1130.     ORA    H
  1131.     JNZ    L07C2
  1132.     MOV    A,L
  1133.     RRC
  1134.     RRC
  1135.     RRC
  1136.     ANI    31
  1137.     INR    A
  1138.     MOV    B,A
  1139.     LDA    MaxCol
  1140.     CMP    B
  1141.     JM    L07C2
  1142.     mov    a,b
  1143.     sta    MaxCol
  1144. L07C2:    
  1145.     lda    MaxCol
  1146.     sta    L0DFA
  1147.     jmp    L07D3
  1148. L07CB:    
  1149.     LXI    B,MsgDlm
  1150.     MVI    A,3
  1151.     CALL    L0AE7
  1152. L07D3:    LXI    B,MsgNam
  1153.     MVI    A,11
  1154.     CALL    L0AE7
  1155.     LDA    OpFFlg
  1156.     RAR
  1157.     JC    L07F9
  1158.     LXI    B,MsgByt
  1159.     MVI    A,6
  1160.     CALL    L0AE7
  1161.     LDA    OpUFlg
  1162.     RAR
  1163.     JNC    L07F9
  1164.     LXI    B,MsgUsr
  1165.     MVI    A,3
  1166.     CALL    L0AE7
  1167. L07F9:    
  1168.     LXI    H,L0DFA
  1169.     DCR    M
  1170.     JNZ    L07CB
  1171.     CALL    PrtDvd
  1172.     LDED    L0D7D
  1173.     LBCD    MaxCol
  1174.     MVI    B,0
  1175.     CALL    L0AAA
  1176.     MOV    A,L
  1177.     ORA    H
  1178.     JZ    L0816
  1179.     INX    D
  1180. L0816:    
  1181.     SDED    L0D9D
  1182.     LXI    H,0
  1183.     SHLD    L0DF6
  1184. L0820:    
  1185.     CALL    PagBrk
  1186.     LXI    H,0
  1187.     SHLD    L0DF8
  1188.     XRA    A
  1189.     STA    L0DFA
  1190. L082D:    
  1191.     LXI    B,MsgDlm
  1192.     LDA    L0DFA
  1193.     ORA    A
  1194.     CNZ    PrtNul
  1195.     LDED    L0DF8
  1196.     LHLD    L0DF6
  1197.     DAD    D
  1198.     INX    H
  1199.     XCHG
  1200.     LHLD    L0D7D
  1201.     ORA    A
  1202.     DSBC    D
  1203.     XCHG
  1204.     CNC    L0875
  1205.     LDED    L0D9D
  1206.     LHLD    L0DF8
  1207.     DAD    D
  1208.     SHLD    L0DF8
  1209.     LXI    H,L0DFA
  1210.     INR    M
  1211.     LDA    MaxCol
  1212.     CMP    M
  1213.     JNZ    L082D
  1214.     LHLD    L0DF6
  1215.     INX    H
  1216.     SHLD    L0DF6
  1217.     LDED    L0D9D
  1218.     ORA    A
  1219.     DSBC    D
  1220.     JC    L0820
  1221.     JMP    PrtDvd
  1222. L0875:    
  1223.     DAD    H
  1224.     LXI    D,L0E2B
  1225.     DAD    D
  1226.     MOV    E,M
  1227.     INX    H
  1228.     MOV    D,M
  1229.     SDED    L0DB0
  1230.     LXI    H,9
  1231.     DAD    D
  1232.     MOV    A,M
  1233.     STA    L0DB2
  1234.     ORA    A
  1235.     CM    DimOn
  1236.     LHLD    L0DB0
  1237.     MVI    B,11
  1238. L0892:    
  1239.     MOV    A,M
  1240.     ANI    7FH
  1241.     CALL    RvsCse
  1242.     MOV    E,A
  1243.     PUSH    B
  1244.     PUSH    H
  1245.     CALL    ChrOut
  1246.     POP    H
  1247.     POP    B
  1248.     INX    H
  1249.     DJNZ    L0892
  1250.     LDA    OpFFlg
  1251.     RAR
  1252.     JC    L08F4
  1253.     LXI    B,12
  1254.     LHLD    L0DB0
  1255.     DAD    B
  1256.     MOV    E,M
  1257.     INX    H
  1258.     MOV    D,M
  1259.     LBCD    L0D9B
  1260.     CALL    L0AC4
  1261.     MVI    A,5
  1262.     CALL    L0BB9
  1263.     LXI    B,8
  1264.     LHLD    L0DB0
  1265.     DAD    B
  1266.     MVI    E,6BH        ; 107
  1267.     MOV    A,M
  1268.     ORA    A
  1269.     JP    L08D0
  1270.     MVI    E,72H        ; 114
  1271. L08D0:    
  1272.     INX    H
  1273.     INX    H
  1274.     MOV    A,M
  1275.     ORA    A
  1276.     JP    L08DB
  1277.     MOV    A,E
  1278.     SUI    ' '
  1279.     MOV    E,A
  1280. L08DB:    
  1281.     CALL    ChrOut
  1282.     LDA    OpUFlg
  1283.     RAR
  1284.     JNC    L08F4
  1285.     LXI    B,11
  1286.     LHLD    L0DB0
  1287.     DAD    B
  1288.     MOV    L,M
  1289.     MVI    H,0
  1290.     MVI    A,3
  1291.     CALL    L0BB9
  1292. L08F4:    
  1293.     LDA    L0DB2
  1294.     ORA    A
  1295.     JM    DimOff
  1296.     RET
  1297. ;
  1298. ; RvsCse -- reverses case of alpha character
  1299. ; Entry: A=char
  1300. ; Exit: A=char
  1301. ;
  1302. RvsCse:    cpi    ' '        ; is it control char?
  1303.     jm    IsCtrl        ; (yes)
  1304.     cpi    7Fh        ; or DEL?
  1305.     jz    IsCtrl        ; (yes)
  1306.     cpi    'A'        ; number of symbol
  1307.     rm            ; (yes, skip it)
  1308.     cpi    '['        ; is it uppercase?
  1309.     jp    NotUpp        ; (no)
  1310.     adi    32        ; change uppercase to lowercase
  1311.     ret
  1312. NotUpp:    cpi    'a'        ; less than 'a'
  1313.     rm            ; (yes, skip it)
  1314.     cpi    '{'        ; is it lowercase?
  1315.     rp            ; (no, skip it)
  1316.     sui    32        ; change lowercase to uppercase
  1317.     ret
  1318. IsCtrl:    mvi    a,'?'        ; change control char to '?' 
  1319.     ret
  1320. ;
  1321. L091D:    
  1322.     LHLD    L0DA6
  1323.     INX    H
  1324.     LDED    L0DAA
  1325.     MVI    B,16
  1326.     ORA    A
  1327. L0928:    
  1328.     RALR    E
  1329.     RALR    D
  1330.     JNC    L0930
  1331.     DCX    H
  1332. L0930:    
  1333.     DJNZ    L0928
  1334.     SHLD    L0DFC
  1335.     CALL    PagBrk
  1336.     LHLD    L0D7D
  1337.     MVI    A,1
  1338.     CALL    L0BB9
  1339.     LXI    B,MsgFil
  1340.     LHLD    L0D7D
  1341.     DCX    H
  1342.     MOV    A,L
  1343.     ORA    H
  1344.     JNZ    L0955
  1345.     STA    MsgFi2
  1346.     CALL    PrtNul
  1347.     LXI    B,MsgFi3
  1348. L0955:    
  1349.     CALL    PrtNul
  1350.     LDED    L0D7B
  1351.     LBCD    L0D9B
  1352.     CALL    L0AC4
  1353.     MVI    A,1
  1354.     CALL    L0BB9
  1355.     LXI    B,MsgK
  1356.     CALL    PrtNul
  1357.     LDED    L0DFC
  1358.     LBCD    L0D9B
  1359.     CALL    L0AC4
  1360.     MVI    A,1
  1361.     CALL    L0BB9
  1362.     LXI    B,MsgCap
  1363.     CALL    PrtNul
  1364.     MVI    C,CurDsk
  1365.     CALL    Bdos
  1366.     PUSH    PSW
  1367.     MVI    C,GetRO
  1368.     CALL    Bdos
  1369.     POP    B
  1370.     INR    B
  1371. L0991:    
  1372.     DJNZ    L0996
  1373.     JMP    L099C
  1374. L0996:    
  1375.     RARR    H
  1376.     RARR    L
  1377.     jr    L0991
  1378. L099C:    
  1379.     MOV    A,L
  1380.     ANI    1
  1381.     JZ    L09AE
  1382.     CALL    DimOn
  1383.     LXI    B,MsgRO
  1384.     CALL    PrtNul
  1385.     CALL    DimOff
  1386. L09AE:    
  1387.     CALL    PagBrk
  1388.     LHLD    L0D99
  1389.     MVI    A,1
  1390.     CALL    L0BB9
  1391.     LXI    B,MsgDir
  1392.     LHLD    L0D99
  1393.     DCX    H
  1394.     MOV    A,L
  1395.     ORA    H
  1396.     JNZ    L09D3
  1397.     STA    MsgDi3
  1398.     MVI    A,'y'
  1399.     STA    MsgDi2
  1400.     CALL    PrtNul
  1401.     LXI    B,MsgDi4
  1402. L09D3:    
  1403.     CALL    PrtNul
  1404.     CALL    PrtNul
  1405.     LDA    CpmVer
  1406.     ORA    A
  1407.     CNZ    FrSp3
  1408.     CZ    L0A5F
  1409.     MVI    A,1
  1410.     CALL    L0BB9
  1411.     lxi    b,MsgRem    ; print space remaining message
  1412.     call    PrtNul
  1413.     lxi    d,0
  1414.     mvi    c,CurDsk    ; get drive
  1415.     call    Bdos
  1416.   IF NOT DSKLBL
  1417.     push    psw        ; save current drive
  1418.   ENDIF
  1419. ; for uppercase drive letter change next line to
  1420. ;    adi    65
  1421.     adi    97        ; make it printable
  1422.     mov    e,a        ; ..and print it
  1423.     call    ChrOut
  1424.     lda    User        ; get user
  1425.     cpi    '?'        ; don't print it, if it's all users
  1426.     jz    AllUsr
  1427.     MOV    L,A
  1428.     MVI    H,0
  1429.     MVI    A,1
  1430.     CALL    L0BB9
  1431. AllUsr:    mvi    e,':'        ; print colon
  1432.     call    ChrOut
  1433.   IF DSKLBL
  1434.     lda    LblUsr        ; check for CP/M 3 disk label
  1435.     ora    a
  1436.     jz    NoLbl        ; (nope)
  1437.     lxi    h,LblNam    ; there is, so print it (11 chars)
  1438.     mvi    b,11
  1439.   ELSE
  1440.     pop    psw        ; get back current drive
  1441.     mov    b,a        ; put it in B
  1442.     lda    User        ; get user
  1443.     mov    c,a        ; put it in C
  1444.     call    GetNdr        ; get named directory
  1445.     jz    NoLbl        ; (none, skip it)
  1446.     mvi    b,8        ; got it, so print it (8 chars)
  1447.   ENDIF
  1448. PrtLbl:    mov    a,m        ; get character
  1449. ; comment out next line for uppercase named directory or disk label
  1450.     call    RvsCse        ; reverse case
  1451.     push    h        ; save pointer and counter
  1452.     push    b
  1453.     mov    e,a        ; move char to E and print it
  1454.     call    ChrOut
  1455.     pop    b
  1456.     pop    h
  1457.     inx    h        ; increment pointer
  1458.     djnz    PrtLbl        ; ..and loop
  1459. NoLbl:    lda    OpPFlg        ; check print flag
  1460.     ora    a
  1461.     rz
  1462.     call    PagBrk        ; (yes, send CR/LF)
  1463.     lda    OpNFlg        ; option N?
  1464.     ora    a
  1465.     rnz            ; (yes, skip formfeed)
  1466.     mvi    e,ff        ; send formfeed to list device
  1467.     call    PrtOut
  1468. PrtLb2:    ret
  1469.   IF NOT DSKLBL
  1470. ;
  1471. ; GetNdr -- gets named directory
  1472. ; Entry: B=disk, C=user
  1473. ; Exit: HL=address of directory name; Z flag set if not found
  1474. ;
  1475. GetNdr:    inr    b        ; make A=1, etc.
  1476.     lhld    Z3EAdr        ; get environment address
  1477.     lxi    d,15h        ; add named directory offset
  1478.     dad    d
  1479.     mov    e,m        ; get address into DE
  1480.     inx    h
  1481.     mov    d,m
  1482.     inx    h
  1483.     mov    a,m        ; get size in A
  1484.     xchg            ; address in HL
  1485.     ora    a
  1486.     jrnz    IsNdr        ; (got it)
  1487. NoNdr:    xra    a        ; named directory not found
  1488.     ret
  1489. IsNdr:    mov    a,m        ; get drive
  1490.     ora    a        ; 0=end of directory
  1491.     jrz    NoNdr        ; (not found)
  1492.     cmp    b        ; check drive
  1493.     jrnz    SkpNdr        ; (no match)
  1494.     inx    h
  1495.     mov    a,m        ; get user
  1496.     dcx    h        ; point back to drive
  1497.     cmp    c        ; check user
  1498.     jrnz    SkpNdr        ; (no match)
  1499.     inx    h
  1500.     inx    h
  1501.     xra    a
  1502.     dcr    a
  1503.     ret
  1504. ;
  1505. SkpNdr:    push    b        ; save BC
  1506.     lxi    b,18        ; point to next entry
  1507.     dad    b
  1508.     pop    b        ; restore BC
  1509.     jr    IsNdr
  1510.   ENDIF
  1511. ;
  1512. ; FrSp3 -- calls BDOS Function 46 under CP/M 3 to get disk free space
  1513. ;
  1514. FrSp3:    mvi    c,CurDsk
  1515.     call    Bdos
  1516.     mov    e,a
  1517.     mvi    c,FreeSp
  1518.     call    Bdos
  1519.     LHLD    DmaBuf
  1520.     LDED    DmaBuf+2
  1521.     RARR    E
  1522.     RARR    H
  1523.     RARR    L
  1524.     RARR    E
  1525.     RARR    H
  1526.     RARR    L
  1527.     RARR    E
  1528.     RARR    H
  1529.     RARR    L
  1530.     ORI    1
  1531.     RET
  1532. L0A5F:    
  1533.     MVI    C,AllocV
  1534.     CALL    Bdos
  1535.     PUSH    H
  1536.     popix
  1537.     LHLD    L0DA6
  1538.     INX    H
  1539.     MOV    E,L
  1540.     MOV    D,H
  1541.     JMP    L0A7E
  1542. L0A70:    
  1543.     DCX    H
  1544.     MOV    A,L
  1545.     ORA    H
  1546.     JZ    L0A88
  1547.     RLCR    C
  1548.     JNC    L0A7C
  1549.     DCX    D
  1550. L0A7C:    
  1551.     DJNZ    L0A70
  1552. L0A7E:    
  1553.     MVI    B,8
  1554.     ldx    c,0
  1555.     inxix
  1556.     JMP    L0A70
  1557. L0A88:    
  1558.     LBCD    L0D9B
  1559.     CALL    L0AC4
  1560.     RET
  1561. L0A90:    
  1562.     MVI    L,12
  1563. L0A92:    
  1564.     LDAX    D
  1565.     ANI    7FH
  1566.     MOV    H,A
  1567.     LDAX    B
  1568.     ANI    7FH
  1569.     SUB    H
  1570.     JNZ    L0AA4
  1571.     INX    D
  1572.     INX    B
  1573.     DCR    L
  1574.     JNZ    L0A92
  1575.     RET
  1576. L0AA4:    
  1577.     MVI    A,0FFH
  1578.     RC
  1579.     MVI    A,1
  1580.     RET
  1581. L0AAA:    
  1582.     LXI    H,0
  1583.     MVI    A,16
  1584. L0AAF:    
  1585.     PUSH    PSW
  1586.     XRA    A
  1587.     XCHG
  1588.     DAD    H
  1589.     XCHG
  1590.     DADC    H
  1591.     DSBC    B
  1592.     INX    D
  1593.     JNC    L0ABE
  1594.     DAD    B
  1595.     DCX    D
  1596. L0ABE:    
  1597.     POP    PSW
  1598.     DCR    A
  1599.     JNZ    L0AAF
  1600.     RET
  1601. L0AC4:    
  1602.     LXI    H,0
  1603.     MVI    A,16
  1604. L0AC9:    
  1605.     DAD    H
  1606.     XCHG
  1607.     DAD    H
  1608.     XCHG
  1609.     JNC    L0AD1
  1610.     DAD    B
  1611. L0AD1:    
  1612.     DCR    A
  1613.     JNZ    L0AC9
  1614.     RET
  1615. ;
  1616. ; PrtDvd -- print '=' screen divider
  1617. ;
  1618. PrtDvd:    call    PagBrk
  1619. PrtDv2:
  1620.   IF NOT RevVid
  1621.     call    DimOn
  1622.   ENDIF
  1623.     lda    HorSiz
  1624.     mov    b,a
  1625. PrtDLp:    push    b
  1626.     mvi    e,'='
  1627.     call    ChrOut
  1628.     pop    b
  1629.     djnz    PrtDLp
  1630.   IF NOT RevVid
  1631.     call    DimOff
  1632.   ENDIF
  1633.     ret
  1634. L0AE7:    
  1635.     LXI    H,HorSiz
  1636.     ADD    M
  1637.     MOV    M,A
  1638. ;
  1639. ; PrtNul -- prints NUL-terminated string on console
  1640. ; Entry: BC points to string
  1641. ;
  1642. PrtNul:    ldax    b        ; get character
  1643.     ora    a        ; is it NUL?
  1644.     rz            ; (yes, we're through)
  1645.     push    b
  1646.     mov    e,a
  1647.     call    ChrOut
  1648.     pop    b
  1649.     inx    b
  1650.     jmp    PrtNul
  1651. ;
  1652. ; PagBrk -- sends CR/LF to console and keeps track of number of lines for
  1653. ; page break.  Page break is skipped if print option
  1654. ;
  1655. PagBrk:    mvi    e,cr
  1656.     call    ChrOut
  1657.     mvi    e,lf
  1658.     call    ChrOut
  1659.     lda    OpPFlg        ; print option?
  1660.     ora    a
  1661.     jrnz    LstBrk        ; (yes, check list page break)
  1662.     lxi    h,LinCnt    ; point to line count
  1663.     dcr    m        ; decrement it
  1664.     rnz            ; (more to go)
  1665.     lda    CrtRow        ; get CRT lines
  1666.     mov    m,a        ; reset page count
  1667.     lxi    b,MsgMor
  1668.     call    PrtNul
  1669. PagBr2:    mvi    c,ConRaw    ; wait for console response
  1670.     mvi    e,0FFh
  1671.     call    Bdos
  1672.     ora    a
  1673.     jz    PagBr2        ; (none yet)
  1674.     cpi    3        ; control-C?
  1675.     jz    Exit        ; (yes, return to CP/M)
  1676.     lxi    b,MsgEra    ; erase page break message
  1677.     jmp    PrtNul        ; ..and return to caller
  1678. ;
  1679. ; LstBrk -- keeps track of printer lines and sends formfeed if page is
  1680. ; filled.
  1681. ;
  1682. LstBrk:    lda    OpNFlg        ; check formfeed flag
  1683.     ora    a
  1684.     rnz            ; (no formfeed)
  1685.     lxi    h,LstCnt    ; check line count
  1686.     dcr    m
  1687.     rnz            ; (no formfeed yet)
  1688.     mvi    m,62        ; restore line count
  1689.     mvi    e,ff
  1690.     jmp    PrtOut
  1691. ;
  1692. L0B2B:    
  1693.     lda    OpPFlg        ; option P?
  1694.     ora    a
  1695.     jz    SkpMsk        ; (no, skip option P masking)
  1696.     CALL    OpPOff
  1697.     lxi    b,MsgCR        ; send CR to console
  1698.     call    PrtNul
  1699.     JMP    OpPOn
  1700. SkpMsk:    lxi    b,MsgCR
  1701.     jmp    PrtNul
  1702. ;
  1703. ; SpcOut -- outputs space char to console and, if printer flag, to list device
  1704. ;
  1705. SpcOut:    mvi    e,' '        ; space char in E, fall through to ChrOut
  1706. ;
  1707. ; ChrOut -- outputs char in E to console and, if print flag, to list device
  1708. ;
  1709. ChrOut:    mvi    c,ConOut
  1710.     push    d
  1711.     call    Bdos
  1712.     pop    d
  1713.     lda    OpPFlg        ; check print flag
  1714.     ora    a
  1715.     rz
  1716.     rm
  1717. ;
  1718. ; PrtOut -- outputs char in E to list device
  1719. ;
  1720. PrtOut:    mvi    c,LstOut
  1721.     jmp    Bdos        ; jump to BDOS, return to caller
  1722. ;
  1723. DimOn:    call    OpPOff
  1724.     lxi    b,DimVid
  1725.     call    PrtNul
  1726.     jmp    OpPOn
  1727. ;
  1728. DimOff:    call    OpPOff
  1729.     lxi    b,RegVid
  1730.     call    PrtNul
  1731.     jmp    OpPOn
  1732. ;
  1733. OpPOff:    lda    OpPFlg
  1734.     ori    80h
  1735.     sta    OpPFlg
  1736.     ret
  1737. ;
  1738. OpPOn:    lda    OpPFlg
  1739.     ani    7Fh
  1740.     sta    OpPFlg
  1741.     ret
  1742. L0B8E:    
  1743.     PUSH    B
  1744.     ldx    a,0
  1745.     inxix
  1746.     CALL    L0B9B
  1747.     POP    B
  1748.     DJNZ    L0B8E
  1749.     RET
  1750. L0B9B:    
  1751.     CALL    L0BA1
  1752.     JMP    SpcOut
  1753. L0BA1:    
  1754.     PUSH    PSW
  1755.     RLC
  1756.     RLC
  1757.     RLC
  1758.     RLC
  1759.     CALL    L0BAA
  1760.     POP    PSW
  1761. L0BAA:    
  1762.     ANI    0FH
  1763.     ADI    '0'
  1764.     CPI    ':'
  1765.     JM    L0BB5
  1766.     ADI    7
  1767. L0BB5:    
  1768.     MOV    E,A
  1769.     JMP    ChrOut
  1770. L0BB9:    
  1771.     STA    L0DFE
  1772.     CALL    L0BFF
  1773.     STA    L0E00
  1774.     INR    A
  1775.     STA    L0DFF
  1776. L0BC6:    
  1777.     LDA    L0DFE
  1778.     LXI    H,L0DFF
  1779.     CMP    M
  1780.     JC    L0BDC
  1781.     MVI    E,' '
  1782.     CALL    ChrOut
  1783.     LXI    H,L0DFF
  1784.     INR    M
  1785.     JMP    L0BC6
  1786. L0BDC:    
  1787.     LXI    H,L0DFF
  1788.     MVI    M,0
  1789. L0BE1:    
  1790.     LDA    L0E00
  1791.     DCR    A
  1792.     LXI    H,L0DFF
  1793.     CMP    M
  1794.     RC
  1795.     LHLD    L0DFF
  1796.     MVI    H,0
  1797.     LXI    B,L0E01
  1798.     DAD    B
  1799.     MOV    E,M
  1800.     CALL    ChrOut
  1801.     LXI    H,L0DFF
  1802.     INR    M
  1803.     JNZ    L0BE1
  1804.     RET
  1805. L0BFF:    
  1806.     XRA    A
  1807.     PUSH    PSW
  1808.     INX    SP
  1809.     LXI    D,262
  1810. L0C05:    
  1811.     DCR    E
  1812.     JZ    L0C16
  1813.     INR    D
  1814.     CALL    L0C25
  1815.     ADI    '0'
  1816.     PUSH    PSW
  1817.     INX    SP
  1818.     MOV    A,L
  1819.     ORA    H
  1820.     JNZ    L0C05
  1821. L0C16:    
  1822.     MOV    E,D
  1823.     DCR    E
  1824.     LXI    B,L0E01
  1825. L0C1B:    
  1826.     DCX    SP
  1827.     POP    PSW
  1828.     STAX    B
  1829.     INX    B
  1830.     DCR    D
  1831.     JNZ    L0C1B
  1832.     MOV    A,E
  1833.     RET
  1834. L0C25:    
  1835.     LXI    B,L100A        ; 4106
  1836.     XRA    A
  1837. L0C29:    
  1838.     DAD    H
  1839.     RAL
  1840.     CMP    C
  1841.     JC    L0C31
  1842.     SUB    C
  1843.     INX    H
  1844. L0C31:    
  1845.     DJNZ    L0C29
  1846.     RET
  1847. ;
  1848. ; messages ...
  1849. ;
  1850. MsgCR:    db    cr,0
  1851. MsgMor:    db    '[More]',0
  1852. MsgEra:    db    cr,'      ',cr,0
  1853. MsgNam:    db    'Name    Typ',0
  1854. MsgByt:    db    ' Bytes',0
  1855. MsgUsr:    db    ' U#',0
  1856. MsgDlm:    db    ' | ',0
  1857. ;
  1858. MsgFil:    db    ' File'
  1859. MsgFi2:    db    's'
  1860. MsgFi3:    db    ', occupying ',0
  1861. ;
  1862. MsgK:    db    'k of ',0
  1863. MsgCap:    db    'k total capacity',0
  1864. MsgRO:    db    ' -- Disk is Read Only --',0
  1865. ;
  1866. MsgDir:    db    ' directory entr'
  1867. MsgDi2:    db    'i'
  1868. MsgDi3:    db    'es'
  1869. MsgDi4:    db    ' and ',0
  1870. ;
  1871. MsgRem:    db    'k bytes remain on ',0
  1872. ;
  1873. MsgCmp:    db    'Us  Fn      Ft   Ex S1 S2 RC  Group #''s',0
  1874. ;
  1875. MsgBig:    db    cr,lf,'Sorry, directory too big.',cr,lf,'$'
  1876. ;
  1877. MsgHlp:    db    cr,'NEW D    Version '
  1878.     db    VERS/10+'0','.',VERS mod 10+'0',SubVERS,cr,lf
  1879.     db    'Usage:',cr,lf
  1880.     db    '    D {dir:}{{afn}.aft} {{/}options}',cr,lf
  1881.     db    'Options:',cr,lf
  1882.     db    ' A  archived files only        R  reset disk system',cr,lf
  1883.     db    ' B  include system files       S  system files only',cr,lf
  1884.     db    ' C  include FCB information    U  include all user areas',cr,lf
  1885.     db    ' F  suppress file size         W  read/write files only',cr,lf
  1886.     db    ' N  no formfeeds               X  do not sort',cr,lf
  1887.     db    ' O  read-only files only       Z  non-archived files only',cr,lf
  1888.     db    ' P  output to printer$'
  1889. ;
  1890. ; data ...
  1891. ;
  1892. OpAFlg:    db    0
  1893. OpBFlg:    db    0
  1894. OpCFlg:    db    0
  1895. OpFFlg:    db    0
  1896. OpNFlg:    db    0
  1897. OpOFlg:    db    0
  1898. OpPFlg:    db    0
  1899. OpRFlg:    db    0
  1900. OpSFlg:    db    0
  1901. OpUFlg:    db    0
  1902. OpWFlg:    db    0
  1903. OpXFlg:    db    0
  1904. OpZFlg:    db    0
  1905. CpmVer:    db    0
  1906. L0D78:    db    0
  1907. MaxCol:    db    0        ; maximum number of directory display columns
  1908. CrtRow:    db    0
  1909. LinCnt:    db    0        ; number of screen lines (minus 1)
  1910. LstCnt:    db    0        ; number of printer lines (minus 4)
  1911. L0D7B:    db    0,0
  1912. L0D7D:    db    0,0
  1913. FilCnt:    db    0,0
  1914. User:    db    0
  1915. FnSav:    ds    11        ; filename
  1916. LblUsr:    ds    1        ; 0=disk label not found, 32=label found
  1917. LblNam:    ds    11        ; CP/M Plus disk label
  1918. L0D99:    ds    2
  1919. L0D9B:    ds    2
  1920. L0D9D:    ds    2
  1921. L0D9F:    ds    2
  1922. DpbSav:    ds    3
  1923. L0DA4:    ds    2
  1924. L0DA6:    ds    1
  1925. L0DA7:    ds    1
  1926. ;
  1927. ; uninitialized data
  1928. ;
  1929. L0DA8:    ds    2
  1930. L0DAA:    ds    6
  1931. L0DB0:    ds    2
  1932. L0DB2:    ds    1
  1933. L0DB3:    ds    2
  1934. L0DB5:    ds    2
  1935. L0DB7:    ds    2
  1936. L0DB9:    ds    2
  1937. L0DBB:    ds    2
  1938. L0DBD:    ds    2
  1939. L0DBF:    ds    1
  1940. L0DC0:    ds    2
  1941. L0DC2:    ds    22
  1942. L0DD8:    ds    2
  1943. L0DDA:    ds    22
  1944. L0DF0:    ds    2
  1945. L0DF2:    ds    2
  1946. L0DF4:    ds    2
  1947. L0DF6:    ds    2
  1948. L0DF8:    ds    2
  1949. L0DFA:    ds    1
  1950. HorSiz:    ds    0        ; size of horizontal dashed line
  1951. L0DFC:    ds    2
  1952. L0DFE:    ds    1
  1953. L0DFF:    ds    1
  1954. L0E00:    ds    1
  1955. DimVid:    ds    8        ; dim video string
  1956. RegVid:    ds    8        ; normal video string
  1957. L0E01:    ds    38
  1958. CpmStk:    ds    2
  1959. CpmRet:    ds    2
  1960. L0E2B:    ds    3
  1961. ;
  1962.     end
  1963.