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 / ZSYS / SIMTEL20 / ZCPR3 / XD.MAC < prev    next >
Text File  |  2000-06-30  |  18KB  |  856 lines

  1. ;
  2. ;  PROGRAM:  XD III
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  VERSION:  1.2
  5. ;  DATE:  8 Apr 84
  6. ;  PREVIOUS VERSIONS:  1.1 (14 Jan 84), 1.0 (19 Nov 83)
  7. ;  DERIVATION:  XDIR III, Version 1.6 (19 Nov 83)
  8. ;
  9. vers    equ    12
  10. z3env    SET    0f400h
  11.  
  12. ;
  13. ;  XD III -- Simple Extended Disk Directory Program
  14. ;        ZCPR3 Only
  15. ;
  16. ;    XD III produces a formatted, alphabetized listing of the contents
  17. ; of the disk directory of the implied (current logged-in) or specified disk.
  18. ;
  19. ;    XD III is invoked by a command line of the following form --
  20. ;
  21. ;        XD dir:filename.typ ooo...
  22. ; or
  23. ;
  24. ;        XD /oooo...
  25. ;
  26. ; where:
  27. ;    dir is an optional directory name or a disk/user specification (du)
  28. ;    if dir is omitted, XD III defaults to the current disk/user
  29. ;    filename.typ is an ambiguous file name and type (* and ? may be used)
  30. ;    o are option letters as follows:
  31. ;        Aa - Set the attributes of the files to be displayed;
  32. ;            a=S for System Files, a=N for Non-System Files
  33. ;            a=A for All Files (System and Non-System)
  34. ;        Oo - Set Output Parameters;
  35. ;            o=A to Toggle File Attributes, o=F to Form Feed at end
  36. ;            o=G to Toggle Grouping, o=H to Toggle Hor/Vert
  37. ;        P  - Print display as well as show it on the screen
  38. ;        PF - Same as POF
  39. ; Options may be combined as desired; note that AA is the same as AS and AN,
  40. ; but AS by itself negates AN and vice-versa, with AN taking precident
  41. ;
  42.  
  43.  
  44. ;
  45. ;  CP/M Equates
  46. ;
  47. base    equ    0
  48. wboot    equ    base
  49. bdose    equ    base+5
  50. fcb    equ    base+5ch
  51. buff    equ    base+80h
  52. cr    equ    0dh
  53. ff    equ    0ch
  54. lf    equ    0ah
  55. esize    equ    16    ; size of directory entries
  56. optch    equ    '/'    ; option char
  57. maxent    equ    60    ; maximum number of entries/screen
  58.  
  59. ;
  60. ;  External Routines
  61. ;
  62.     ext    bdos    ; BDOS
  63.     ext    z3init    ; init ZCPR3 environment descriptor ptr
  64.     ext    z3log    ; log into ZCPR3 DU/DIR
  65.     ext    dirqs    ; quick directory load with sizes
  66.     ext    dfree    ; free space computer
  67.     ext    dparam    ; disk parameter extractor
  68.     ext    fsize    ; compute file size
  69.     ext    retud    ; get current user and disk
  70.     ext    print    ; print routines
  71.     ext    pstr
  72.     ext    lcrlf    ; CRLF to printer
  73.     ext    caps    ; capitalize char
  74.     ext    cin    ; console in char
  75.     ext    lout    ; print char
  76.     ext    cout    ; console out char
  77.     ext    crlf    ; new line
  78.     ext    fillb    ; memory fill
  79.     ext    moveb    ; memory move
  80.     ext    codend    ; beginning of buffer area
  81.     ext    sctlfl,sout,scrlf,sprint,spstr,shldc,sadc    ; S-output
  82.     ext    dutdir    ; DU to DIR form
  83.  
  84. ;
  85. ; Environment Definition
  86. ;
  87.     if    z3env ne 0
  88. ;
  89. ; External ZCPR3 Environment Descriptor
  90. ;
  91.     jmp    start
  92.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  93.     db    1    ;External Environment Descriptor
  94. z3eadr:
  95.     dw    z3env
  96. start:
  97.     lhld    z3eadr    ;pt to ZCPR3 environment
  98. ;
  99.     else
  100. ;
  101. ; Internal ZCPR3 Environment Descriptor
  102. ;
  103.     MACLIB    Z3BASE.LIB
  104.     MACLIB    SYSENV.LIB
  105. z3eadr:
  106.     jmp    start
  107.     SYSENV
  108. start:
  109.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  110.     endif
  111.  
  112. ;
  113. ; Start of Program -- Initialize ZCPR3 Environment
  114. ;
  115.     call    z3init    ;initialize the ZCPR3 Env
  116. ;
  117. ;  Branch to Start of Program
  118. ;
  119.     jmp    start0
  120.  
  121. ;
  122. ;  Other Buffers (Set by GENINS)
  123. ;
  124. igrp:    db    0ffh    ; Group by file type and name
  125. ifmt:    db    0    ; vertical format
  126. iatt:    db    10000000b    ; Non-System files only
  127. irs:    db    0ffh    ; enable attribute display (0=no)
  128. iff:    db    0    ; enable form feed at end (0=no)
  129.  
  130. ;
  131. ;  Command Line Option Table
  132. ;
  133. optab:
  134.     db    'A'    ; Attribute Selection
  135.     dw    opta
  136.     db    'O'    ; Output Control
  137.     dw    opto
  138.     db    'P'    ; Print Control
  139.     dw    optp
  140.     db    0
  141.  
  142. ;
  143. ;  **** Start of XD III ****
  144. ;
  145. start0:
  146.  
  147. ;  Save stack ptr for return later
  148.     lxi    h,0    ; get stack
  149.     dad    sp
  150.     shld    stack    ; save stack ptr for return
  151.     call    codend    ; determine free space (CODEND also pts to Command
  152.             ;   Line Save Area)
  153.     lxi    d,100h    ; block size to save
  154.     dad    d
  155.     dad    d    ; allow for 256-byte stack
  156.     shld    buffer    ; start of free buffer area
  157.     sphl        ; set stack ptr
  158.  
  159. ;  Save command line in CMDLNE buffer
  160.     call    codend    ; pt to command line buffer
  161.     xchg        ; ... in DE
  162.     lxi    h,buff+1    ; copy input line into command line buffer
  163. start1:
  164.     mov    a,m    ; get byte
  165.     stax    d    ; put byte
  166.     inx    h    ; pt to next
  167.     inx    d
  168.     ora    a    ; end of line?
  169.     jnz    start1
  170.  
  171. ;  log into DU or DIR
  172.     lxi    d,fcb    ; extract file name into fcb, and get user and disk
  173.     call    z3log    ; ZCPR3 command line interpretation
  174.  
  175. ;  Get and save current user number
  176. noext:
  177.     call    retud    ; get current user and disk
  178.     mov    a,c    ; get user into A
  179.     sta    aflg    ; current user number
  180.  
  181. ;  Set flag values
  182.     lda    irs    ; get RS display option
  183.     sta    rsflg    ; set RS display option
  184.     lda    iff    ; get form feed option
  185.     sta    ffflg    ; set form feed option
  186.     lda    igrp    ; set grouping (file name/type or type/name)
  187.     sta    gflg
  188.     lda    ifmt    ; set listing format (vertical or horizontal, 0=vert)
  189.     sta    hflg
  190.     lda    iatt    ; set file attributes
  191.     mov    c,a    ; save in c
  192.     lda    aflg    ; get current user number
  193.     ora    c    ; mask in file attributes
  194.     sta    aflg    ; save flag
  195.     xra    a    ; A=0
  196.     sta    pflg    ; set no printer output
  197.     inr    a    ; A=1 for console only
  198.     sta    sctlfl    ; set switched output flag
  199.  
  200. ;  Assume wild file name
  201.     lxi    h,fcb+1    ; store '?' chars
  202.     mvi    b,11    ; 11 chars
  203.     mov    a,m    ; check for entry specified
  204.     cpi    ' '    ; test for space (means no entry)
  205.     mvi    a,'?'    ; prep for '?' fill
  206.     cz    fillb
  207.     mov    a,m    ; check for option caught
  208.     cpi    optch    ; test for option flag
  209.     mvi    a,'?'    ; prep for '?' fill
  210.     cz    fillb
  211.  
  212. ;  Scan command line for options
  213.     call    codend    ; pt to first char
  214.     call    sblank    ; skip over blanks
  215.     ora    a    ; end of line?
  216.     jz    xdir    ; begin main processing
  217.     inx    h    ; prep for invalid option
  218.     cpi    optch    ; option?
  219.     jz    opt    ; process options
  220.     dcx    h    ; ok to process for dir:filename.typ form
  221. ;
  222. ;  Skip over characters of file name
  223. ;
  224. skipo1:
  225.     mov    a,m    ; get char
  226.     inx    h    ; pt to next
  227.     cpi    ' '
  228.     jz    skipo2
  229.     ora    a
  230.     jnz    skipo1
  231.     jmp    xdir    ; run XDIR if no options follow
  232. ;
  233. ;  Scan complete -- look for possible following option char
  234. ;
  235. skipo2:
  236.     call    sblank    ; skip over blanks
  237.     mov    a,m    ; option char follows?
  238.     cpi    optch
  239.     jnz    opt
  240.     inx    h    ; skip over option char
  241. ;
  242. ;  Look for options -- main loop; HL pts to next char
  243. ;
  244. opt:
  245.     mov    a,m    ; get option char
  246.     inx    h    ; pt to next
  247.     ora    a    ; end of line?
  248.     jz    xdir    ; begin main processing
  249.     cpi    ' '    ; skip over spaces
  250.     jz    opt
  251.     cpi    optch    ; option char?
  252.     jz    opterr    ; loop back if so
  253.     lxi    d,optab    ; pt to option table
  254.     mov    b,a    ; option char in b
  255. ;
  256. ;  Scan option table
  257. ;
  258. opt1:
  259.     ldax    d    ; get option table char
  260.     ora    a    ; end of table?
  261.     jz    opterr    ; invalid option error
  262.     cmp    b    ; compare to passed option
  263.     jz    opt2    ; process if match
  264.     inx    d    ; skip address
  265.     inx    d
  266.     inx    d    ; pt to next opt char
  267.     jmp    opt1
  268. ;
  269. ;  Process option found
  270. ;
  271. opt2:
  272.     inx    d    ; pt to low-order address
  273.     ldax    d    ; get it
  274.     mov    c,a    ; low in C
  275.     inx    d    ; pt to high-order address
  276.     ldax    d    ; get it
  277.     mov    b,a    ; high in B
  278.     push    b    ; BC on stack
  279.     ret        ; Process option routine
  280. ;
  281. ;  Option A -- File Attributes
  282. ;
  283. opta:
  284.     mov    a,m    ; get next option letter
  285.     cpi    'N'    ; Non-System files?
  286.     jz    optan
  287.     cpi    'S'    ; System files?
  288.     jz    optas
  289.     cpi    'A'    ; All files?
  290.     jnz    opterr    ; error if not
  291. ;
  292. ;  Option AA -- All Files
  293. ;
  294. optaa:
  295.     mvi    c,11000000b    ; System and Non-system
  296. optaret:
  297.     lda    aflg    ; get flag
  298.     ani    3fh    ; leave in user selection
  299.     ora    c    ; mask in sys/non-sys
  300.     sta    aflg    ; restore flag
  301.     inx    h    ; pt to next
  302.     jmp    opt
  303. ;
  304. ;  Option AS -- System Files
  305. ;
  306. optas:
  307.     mvi    c,01000000b    ; System Only
  308.     jmp    optaret
  309. ;
  310. ;  Option AN -- Non-System Files
  311. ;
  312. optan:
  313.     mvi    c,10000000b    ; Non-system Only
  314.     jmp    optaret
  315. ;
  316. ;  Option P -- enable it; Printer output
  317. ;
  318. optp:
  319.     mvi    a,0ffh    ; ON
  320.     sta    pflg
  321.     sta    sctlfl    ; set S-output control
  322.     mov    a,m    ; get possible 2nd letter
  323.     cpi    'F'    ; set form feed if F
  324.     jnz    opt    ; process as next option letter if not F
  325.     inx    h    ; pt to next
  326.     jmp    optof
  327. ;
  328. ;  Option O -- control Output parameters
  329. ;
  330. opto:
  331.     mov    a,m    ; get 2nd letter
  332.     inx    h    ; pt to next
  333.     cpi    'A'    ; attributes?
  334.     jz    optoa
  335.     cpi    'F'    ; form feed?
  336.     jz    optof
  337.     cpi    'G'    ; grouping?
  338.     jz    optog
  339.     cpi    'H'    ; horizontal/vertical?
  340.     jz    optoh
  341.     dcx    h    ; adjust back
  342.     jmp    opterr
  343. ;
  344. ;  Toggle File Attributes Flag
  345. ;
  346. optoa:
  347.     lda    rsflg    ; flip flag
  348.     cma
  349.     sta    rsflg
  350.     jmp    opt
  351. ;
  352. ;  Toggle Form Feed Flag
  353. ;
  354. optof:
  355.     lda    ffflg    ; flip flag
  356.     cma
  357.     sta    ffflg
  358.     jmp    opt
  359. ;
  360. ;  Toggle Grouping
  361. ;
  362. optog:
  363.     lda    gflg    ; flip flag
  364.     cma
  365.     sta    gflg    ; 0=file name and type
  366.     jmp    opt
  367. ;
  368. ;  Toggle Horizontal/Vertical Listing
  369. ;
  370. optoh:
  371.     lda    hflg    ; flip flag
  372.     cma
  373.     sta    hflg    ; 0=vertical
  374.     jmp    opt
  375. ;
  376. ;  Option error message
  377. ;
  378. opterr:
  379.     mvi    a,1    ; set console only
  380.     sta    sctlfl    ; set output control flag
  381.     call    banner    ; print banner
  382.     call    print
  383.     db    cr,lf,'Syntax:'
  384.     db    cr,lf,'    XD dir:filename.typ ooo...'
  385.     db    cr,lf,'or    XD /oooo...'
  386.     db    cr,lf,'Option letters are:'
  387.     db    cr,lf,'    Aa - Set and Display of file attributes'
  388.     db    cr,lf,'      a=S for System, a=N for Non-System'
  389.     db    cr,lf,'      a=A for All Files (System and Non-System)'
  390.     db    cr,lf,'    Oo - Toggle Output Control Options'
  391.     db    cr,lf,'      o=A for File Attributes, o=F for Form Feed'
  392.     db    cr,lf,'      o=G for Grouping, o=H for Horiz/Vert Format'
  393.     db    cr,lf,'    P  - Send display to printer'
  394.     db    cr,lf,'    PF - Same as POF'
  395.     db    0
  396.  
  397. ;  Return to CP/M
  398. return:
  399.     lhld    stack    ; get old stack ptr
  400.     sphl
  401.     ret        ; return to CP/M
  402.  
  403. ;  Memory Overflow Error
  404. memerr:
  405.     call    sprint
  406.     db    'TPA Error',0
  407.     jmp    return
  408.  
  409. ;  Print banner of XD III
  410. banner:
  411.     call    sprint
  412.     db    'XD III  Version '
  413.     db    vers/10+'0','.',(vers mod 10)+'0',0
  414.     ret
  415.  
  416. ;
  417. ;  Begin XD III processing
  418. ;
  419. xdir:
  420.     lxi    d,fcb    ; pt to FCB
  421.     xra    a
  422.     stax    d    ; select current disk
  423.  
  424. ;  Check for Print Option and Print New Line if so
  425. xdirst:
  426.     lda    pflg    ; printer output?
  427.     ora    a    ; 0ffH=yes
  428.     cnz    lcrlf    ; new line
  429.  
  430. ;  Get Files from Disk
  431.     push    d    ; save ptr to FCB
  432.     call    dparam    ; get disk parameters for DFREE
  433.     call    dfree    ; compute amount of free space on disk
  434.     xchg        ; amount in hl
  435.     shld    freesiz    ; save free space count
  436.     pop    d    ; get regs
  437.     lhld    buffer    ; pt to free space
  438.     lda    gflg    ; get grouping flag
  439.     ani    20h    ; mask for sort bit (0=name/type)
  440.     mov    c,a
  441.     lda    aflg    ; get attributes flag
  442.     ora    c    ; mask in grouping bit
  443.     call    dirqs    ; quick directory load with file sizes
  444.     jz    memerr    ; memory overflow error?
  445.     shld    firstf    ; save ptr to first file
  446.     mov    h,b    ; HL=file count
  447.     mov    l,c
  448.     shld    fcount    ; save file count
  449.     shld    countf    ; save file down count
  450.     lxi    h,0    ; set file size counter
  451.     shld    totsiz    ; save counter
  452.     lda    pflg    ; set temp flag
  453.     sta    pflgt
  454.  
  455. ;
  456. ;  Main Directory Print Routine -- This routine displays the directory to
  457. ;  the console, printer, or disk as desired
  458. ;
  459. ;  Print header lines and one screen of entries
  460. xdir2:
  461.     lda    pflg    ; save printer output flag
  462.     sta    pflgs
  463.     lda    pflgt    ; use temp flag
  464.     sta    pflg
  465.     xra    a    ; A=0
  466.     sta    pflgt    ; clear temp flag
  467.  
  468. ;  Print: Main Banner
  469.     call    banner    ; print banner
  470.  
  471. ;  Check for any files
  472.     lhld    countf    ; get file down count
  473.     mov    a,h    ; any files?
  474.     ora    l
  475.     jnz    xdir6
  476.     call    sprint    ; print everywhere
  477.     db    cr,lf,'No files selected',0
  478.     jmp    xdir10
  479.  
  480. ;
  481. ;  This is the main looping entry point for each screen display
  482. ;
  483. xdir6:
  484. ;
  485. ;  This is the header which is printed if the files in only one user area are
  486. ;    displayed
  487. ;
  488.     call    scrlf    ; specific user selected
  489.     call    hdr2
  490.     lda    rsflg
  491.     ora    a    ; Z=no
  492.     cnz    sp0
  493.     call    sp2
  494.     call    hdr2
  495.     lda    rsflg
  496.     ora    a    ; Z=no
  497.     cnz    sp0
  498.     call    sp2
  499.     call    hdr2
  500.     lda    rsflg
  501.     ora    a
  502.     cnz    sp0
  503.     call    scrlf
  504.     call    hdr1
  505.     lda    rsflg
  506.     ora    a
  507.     cnz    sp1
  508.     call    sp2
  509.     call    hdr1
  510.     lda    rsflg
  511.     ora    a
  512.     cnz    sp1
  513.     call    sp2
  514.     call    hdr1
  515.     lda    rsflg
  516.     ora    a
  517.     cnz    sp1
  518.     jmp    xdir6b
  519. sp0:
  520.     call    sprint
  521.     db    ' RS',0
  522.     ret
  523. sp1:
  524.     call    sprint
  525.     db    ' --',0
  526.     ret
  527. sp2:
  528.     call    sprint
  529.     db    '  ',0
  530.     ret
  531. hdr1:
  532.     call    sprint
  533.     db    '-------- --- ------',0
  534.     ret
  535. hdr2:
  536.     call    sprint
  537.     db    'Filename.Typ Size K',0
  538.     ret
  539.  
  540. ;
  541. ;  Prepare Columnar Output
  542. ;
  543. xdir6b:
  544.     lda    pflgs    ; restore print flag
  545.     sta    pflg
  546.     lhld    countf    ; get file count down
  547.     lxi    d,maxent    ; assume maxent entries to print
  548.     mov    a,h    ; within range?
  549.     ora    a    ; outside of range if not
  550.     jnz    xdir7    ; subtract entries to print from total entries
  551.     mov    a,l    ; within range?
  552.     cpi    maxent    ; less than maxent entries left?
  553.     jnc    xdir7    ; subtract entries to print from total entries
  554.     mov    d,h    ; DE=HL=number of entries to print
  555.     mov    e,l
  556. xdir7:
  557.     mov    a,l    ; subtract entries to print (DE) from total (HL)
  558.     sub    e
  559.     mov    l,a
  560.     mov    a,h
  561.     sbb    d
  562.     mov    h,a    ; HL=result
  563.     shld    countf    ; save new down count
  564.     mov    b,h    ; BC=count
  565.     mov    c,l
  566.     lhld    firstf    ; pt to first file
  567. ;
  568. ;  At this point, BC=number of remaining entries, DE=number of entries to
  569. ;    print, and HL pts to first entry to print
  570. ;
  571.     shld    ptr1    ; save ptr to 1st entry
  572.     lda    hflg    ; horizontal listing?
  573.     ora    a    ; 0ffh = yes
  574.     jnz    xdir7c    ; don't worry about columns if horizontal
  575.     push    d    ; save count
  576.     call    divde3    ; divide DE by 3, result*esize in BC, remainder in A
  577.     lxi    d,esize    ; DE=ESIZE (size of entry)
  578.     dad    b    ; add BC as a minimum
  579.     ora    a    ; any remainder?
  580.     jz    xdir7a    ; skip if none
  581.     dad    d    ; add in ESIZE for additional length of 1st col
  582. xdir7a:
  583.     shld    ptr2    ; save ptr to col 2
  584.     dad    b    ; add BC as a minimum
  585.     cpi    2    ; if remainder 2, add ESIZE for additional
  586.     jc    xdir7b
  587.     dad    d    ; add in ESIZE
  588. xdir7b:
  589.     shld    ptr3    ; save ptr to col 3
  590.     pop    d    ; get count in de
  591. ;
  592. ;  Main entry print routine
  593. ;
  594. xdir7c:
  595.     mvi    d,1    ; set 3's counter
  596. xdir8:
  597.     lhld    ptr1    ; pt to first entry
  598.     call    prentry    ; print entry
  599.     shld    ptr1    ; put ptr
  600.     lda    hflg    ; horizontal?
  601.     ora    a    ; 0ffh = yes
  602.     jnz    xdir9
  603.     dcr    e    ; count down
  604.     jz    xdir10
  605.     lhld    ptr2    ; get ptr
  606.     call    prentsp    ; print entry with 2 leading spaces
  607.     shld    ptr2    ; put ptr
  608.     dcr    e    ; count down
  609.     jz    xdir10
  610.     lhld    ptr3    ; get ptr
  611.     call    prentsp    ; print entry with 2 leading spaces
  612.     shld    ptr3    ; put ptr
  613. xdir9:
  614.     dcr    e    ; count down
  615.     jnz    xdir8    ; continue if not zero
  616.     shld    firstf    ; save ptr to first of next set of entries to print
  617.     lhld    countf    ; get count of remaining entries
  618. ;
  619. ;  At this point, HL=number of entries left
  620. ;
  621.     mov    a,h    ; anything left?
  622.     ora    l
  623.     jz    xdir10
  624.     lda    pflg    ; printer output?
  625.     ora    a    ; 0=no
  626.     jnz    xdir6
  627.     call    print    ; screen break
  628.     db    cr,lf,' --> Screen Break -- Strike any char <-- ',0
  629.     call    cin    ; get response
  630.     cpi    3    ; abort?
  631.     jz    return
  632.     jmp    xdir6    ; new screen display
  633. ;
  634. ;  Print end statistics and exit
  635. ;
  636. xdir10:
  637. ;
  638. ;  Print DU
  639. ;
  640.     call    sprint    ; print everywhere
  641.     db    cr,lf,'     ',0
  642.     call    retud    ; get current disk
  643.     mov    a,b    ; ... in A
  644.     adi    'A'    ; convert to ASCII
  645.     call    sout    ; print everywhere
  646.     mov    a,c    ; user in A
  647.     call    sadc    ; get number
  648.     call    sprint
  649.     db    ': ',0
  650.     call    dutdir    ; convert to DIR form
  651.     jz    xdir11
  652. ;
  653. ;  Print DIR Name
  654. ;
  655.     mvi    b,8    ; output name
  656. dirout:
  657.     mov    a,m    ; get char
  658.     cpi    ' '    ; don't print spaces
  659.     cnz    sout
  660.     inx    h    ; pt to next
  661.     dcr    b    ; count down
  662.     jnz    dirout
  663.  
  664. ;
  665. ;  Print Selected File Statistics
  666. ;
  667. xdir11:
  668.     call    sprint
  669.     db    ' --',0
  670.     lhld    fcount    ; print file count
  671.     call    shldc    ; print it everywhere
  672.     call    sprint
  673.     db    ' Files Using ',0
  674.     lhld    totsiz    ; get total of file sizes
  675.     call    shldc    ; print it everywhere
  676.     call    sprint
  677.     db    'K',0
  678.  
  679. ;
  680. ;  Print Space Remaining on Disk
  681. ;    Entry Point if No Files Found
  682. ;
  683.     call    sprint
  684.     db    ' (',0
  685.     lhld    freesiz    ; get amount of free space
  686.     call    shldc    ; print it everywhere
  687.     call    sprint
  688.     db    'K Left)',0
  689.     lda    pflg    ; new line if printer output
  690.     ora    a
  691.     jz    return
  692.     call    scrlf    ; new line for printer
  693.     lda    pflg    ; print output
  694.     mov    b,a
  695.     lda    ffflg    ; form feed
  696.     ana    b    ; if print and form feed ... NZ is set
  697.     mvi    a,ff    ; form feed char
  698.     cnz    lout    ; form feed to printer
  699.     jmp    return
  700.  
  701. ;
  702. ;  General Utility Routines
  703. ;
  704.  
  705. ;
  706. ;  Print disk entry for normal directory display functions
  707. ;
  708. prentsp:
  709.     call    sp2    ; print entry with 2 leading spaces
  710. prentry:
  711.     dcr    d    ; count <CRLF> counter
  712.     jnz    prent1
  713.     mvi    d,3    ; reset count
  714.     call    scrlf
  715. prent1:
  716.     shld    entptr    ; save entry ptr
  717.     inx    h    ; pt to first char of file name
  718.     mvi    b,8    ; print 8 chars
  719.     call    prch
  720.     mvi    a,'.'    ; print dot
  721.     call    sout
  722.     push    h    ; save RS ptr
  723.     mvi    b,3    ; print 3 chars
  724.     call    prch
  725.     push    d    ; save de
  726.     lhld    entptr    ; pt to entry
  727.     call    sp2    ; skip 2 spaces
  728.     call    fsize    ; compute file size
  729.     lhld    totsiz    ; get total file size counter
  730.     dad    d    ; add in new file
  731.     shld    totsiz    ; save new total file size counter
  732.     xchg        ; get file size into HL
  733.     call    shldc    ; print HL value
  734.     pop    d    ; get de
  735.     pop    h    ; pt to RS
  736.     lda    rsflg    ; print RS fields?
  737.     ora    a    ; Z=no
  738.     jz    pren2a
  739.     mvi    a,' '    ; print 1 space
  740.     call    sout
  741.     mvi    b,'R'    ; letter
  742.     call    prletx    ; print R if bit set
  743.     inx    h
  744.     mvi    b,'S'    ; letter
  745.     call    prletx    ; print S if bit set
  746.     dcx    h    ; ... for following inx h
  747. pren2a:
  748.     inx    h    ; point correctly
  749. prent3:
  750.     lxi    b,6    ; pt to next entry
  751.     dad    b
  752.     ret
  753. ;
  754. ;  Print B chars pted to by HL
  755. ;
  756. prch:
  757.     mov    a,m    ; get char
  758.     inx    h    ; pt to next
  759.     ani    7fh    ; mask out msb
  760.     cpi    ' '    ; within range?
  761.     jnc    prch1    ; print special char if not valid char
  762.     mvi    a,'?'    ; print ? if not valid char
  763. prch1:
  764.     call    sout    ; print it
  765.     dcr    b    ; count down
  766.     jnz    prch
  767.     ret
  768. ;
  769. ;  Extended Print Routines
  770. ;
  771. prletx:
  772.     mov    a,m    ; get byte
  773.     ani    80h    ; look at msb
  774.     jz    prlets
  775.     mov    a,b    ; get letter
  776.     jmp    sout
  777. prlets:
  778.     mvi    a,' '    ; print <sp>
  779.     jmp    sout
  780. ;
  781. ;  Divide DE by 3; return with BC=result*esize, a=remainder
  782. ;
  783. divde3:
  784.     push    d    ; save de, hl
  785.     push    h
  786.     mvi    d,0    ; make sure D=0
  787.     mov    a,e    ; value in A
  788. divd31:
  789.     sui    3    ; subtract 3
  790.     jc    divd32
  791.     jz    divd33
  792.     inr    d    ; add 1 to result
  793.     jmp    divd31
  794. divd32:
  795.     adi    3    ; add back in
  796.     jmp    divd34
  797. divd33:
  798.     inr    d    ; add 1 for even division
  799. divd34:
  800.     sta    rem    ; save remainder
  801.     lxi    b,esize
  802.     lxi    h,0
  803. divd35:
  804.     mov    a,d    ; done?
  805.     ora    a    ; 0=yes
  806.     jz    divd36
  807.     dcr    d
  808.     dad    b    ; add in another ESIZE
  809.     jmp    divd35
  810. divd36:
  811.     mov    b,h    ; BC is result
  812.     mov    c,l
  813.     lda    rem    ; A is remainder
  814.     pop    h    ; restore regs
  815.     pop    d
  816.     ret
  817. ;
  818. ;  Skip blanks
  819. ;
  820. sblank:
  821.     mov    a,m    ; pt to char
  822.     cpi    ' '    ; blank?
  823.     rnz
  824.     inx    h    ; pt to next
  825.     jmp    sblank
  826.  
  827. ;
  828. ;  Buffers
  829. ;
  830. aflg:    ds    1    ; attibute flag
  831. gflg:    ds    1    ; 0=group by name/type
  832. hflg:    ds    1    ; 0=vertical list
  833. pflg:    ds    1    ; printer output on flag
  834. crcnt:    ds    1    ; entry counter
  835. fmark:    ds    1    ; first file marker
  836. pflgt:    ds    1
  837. pflgs:    ds    1
  838. rsflg:    ds    1    ; RS Display Flag
  839. ffflg:    ds    1    ; form feed flag
  840. rem:    ds    1    ; remainder buffer
  841. firstf:    ds    2    ; ptr to first file of group to print
  842. fcount:    ds    2    ; count of files
  843. countf:    ds    2    ; down count of files
  844. freesiz:
  845.     ds    2    ; amount of free space on disk
  846. totsiz:
  847.     ds    2    ; total size of all files
  848. ptr1:    ds    2    ; col output ptrs
  849. ptr2:    ds    2
  850. ptr3:    ds    2
  851. entptr:    ds    2    ; current entry ptr
  852. buffer:    ds    2    ; pointer to free area
  853. stack:    ds    2    ; stack ptr
  854.  
  855.     end
  856.