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 / DIRATR12.LBR / DIRATR12.MZC / DIRATR12.MAC
Text File  |  2000-06-30  |  7KB  |  424 lines

  1. ;Program:    DIRATR.COM
  2. ;Purpose:    Directory display showing file Attributes a la NSWEEP
  3. ;Author:    Rob Friefeld
  4. ;Date:        25 Nov 1987
  5. ;Comment:    Runs under Z33 at 8000h
  6. ;        Attributes shown in standout video
  7. ;
  8. ;History:    v1.2 - 17 Apr 1988 - Al Heynneman
  9. ;        added support for dim terminals
  10. ;        added calls to clear the screen
  11. ;        print header at top of each new screen
  12. ;
  13. ;        v1.1 - 27 Mar 1988 - Al Heynneman
  14. ;        cleaned up code for m80 (wouldn't assemble with ZAS)
  15. ;        changed 'add b' to 'add a,b'
  16. ;        added 'jp start' that was missing for non-ZCPR33 mode
  17. ;        setup for ZCPR30 mode
  18. ;
  19. vers    equ    12
  20.  
  21. true    equ    -1
  22. false    equ    0
  23.  
  24. zcpr33    equ    false    ; If true, use type 3 header
  25.  
  26. ;
  27. ; Set to true if you wish to have the set attributes displayed in normal
  28. ; video, and the rest in dim video, on a normal/dim type terminal.
  29. ;
  30.  
  31. dim    equ    true
  32.  
  33.  
  34. ; If you have a Wyse, a line is drawn in graphics mode
  35. ; Also, the alternate video sequence is hard-coded.  Take a look even if you
  36. ; aren't using a Wyse.
  37.  
  38. wyse    equ    false
  39.  
  40.     if    zcpr33
  41. progloc    equ    8000h
  42.     else
  43. progloc    equ    100h
  44.     endif
  45.  
  46. stkloc    equ    progloc+1500h
  47.  
  48. ; SLR linker commands
  49. ;    .request    vlib,z3lib,syslib
  50.  
  51.     ext    z3vinit
  52.      if    not wyse
  53.     ext    stndout,stndend
  54.      endif
  55.     ext    cls
  56.     ext    dundr
  57.     ext    condin,crlf,cout,phldc,phlfdc,pafdc
  58.     ext    dfree,fsize,dparams,dirqs
  59.     ext    logud,retud,codend
  60.  
  61. bdos    equ    5
  62. fcb    equ    5ch
  63. fcb2    equ    6ch
  64. ;    ASCII
  65. bell    equ    7
  66. tab    equ    9
  67. lf    equ    0ah
  68. cr    equ    0dh
  69. esc    equ    1bh
  70.  
  71.      if    not zcpr33
  72.     jp    start
  73.     db    'Z3ENV'
  74.     db    1
  75.      else
  76.     jp    start
  77.     db    'Z3ENV'
  78.     db    3
  79.      endif
  80. z3eadr:
  81.     dw    0fe00h
  82.     dw    progloc
  83.  
  84. start:
  85.     ld    (stksav),sp
  86.     ld    sp,stkloc
  87.  
  88.     ld    hl,(z3eadr)
  89.     call    z3vinit        ; set up vid pointers
  90.  
  91.     call    retud        ; get and save current du
  92.     ld    (udsav),bc
  93.  
  94.     ld    hl,0        ; init running kbyte counter
  95.     ld    (total),hl
  96.  
  97.     ld    hl,fcb+1
  98.     ld    a,(hl)
  99.     cp    '/'        ; help
  100.     jp    z,info
  101.     cp    ' '        ; blank file name?
  102.     jr    nz,ud0
  103.  
  104. fcblod:
  105.     ld    b,11        ; Load ambig file ref
  106. fcbl1:    ld    (hl),'?'
  107.     inc    hl
  108.     djnz    fcbl1
  109.  
  110.  
  111. ud0:    ld    a,(fcb)        ; new disk?
  112.     or    a
  113.     jr    z,load        ; yes, log new disk
  114. newud:    ld    b,a        ; log a new du
  115.     dec    b
  116.     ld    a,(fcb+13)
  117.     ld    c,a
  118.     call    logud
  119.  
  120. load:
  121.     call    codend        ; locate name buffer
  122.     call    dparams        ; get disk params
  123.     ld    a,11000000b
  124.     ld    de,fcb
  125.  
  126. sel1:    call    dirqs        ; directory sort
  127.  
  128.  
  129. sel3:    ld    (fcount),bc    ; save file count
  130.     ld    (filcnt),bc    ; and running counter
  131.     ld    a,b        ; check file count
  132.     or    c
  133.     jp    z,footer    ; no files
  134.  
  135. ; Figure out format of display
  136. ; Four columns, alphabetized vertically
  137.  
  138.     xor    a
  139.     srl    b        ; bc / 2
  140.     rr    c
  141.     jr    nc,dir2        ; if not even, a is flag
  142.     dec    a
  143. dir2:    srl    b        ; again
  144.     rr    c
  145.     jr    nc,dir3
  146.     dec    a
  147. dir3:    or    a        ; was there a carry?
  148.     jr    z,dir4        ; no
  149.     inc    bc        ; yes, inc row count
  150. dir4:    ld    (rdisp),bc    ; save row displacement (file # at each column)
  151.     ld    a,4        ; row count x 16 (16 byte filename entry)
  152. dir5:    sla    c
  153.     rl    b
  154.     dec    a
  155.     jr    nz,dir5
  156.     ld    (edisp),bc    ; save entry displacement
  157.  
  158.     ld    bc,1        ; initialize row number
  159.     ld    (rownum),bc
  160.  
  161.     call    cls
  162.     call    print
  163.     db    'DIRATR '
  164.     db    vers/10+'0','.',vers mod 10 +'0'
  165.     db    0
  166.     call    line        ; display a divider
  167.  
  168.     if    dim
  169.     call    stndout
  170.     endif
  171.  
  172. screenful:
  173.     ld    b,4        ; pause when screen full
  174. sloop:    push    bc
  175.  
  176. block:
  177.     ld    b,4        ; print groups of 4 rows sep by crlf
  178. bloop:    push    bc
  179.     call    row        ; process a row
  180.     pop    bc
  181.     djnz    bloop
  182.     call    crlf
  183.  
  184.     pop    bc
  185.     djnz    sloop
  186.  
  187.     if    dim
  188.     call    stndend
  189.     endif
  190.  
  191.     call    print
  192.     db    'More... ',0
  193.     call    condin        ; pause for key strike
  194.     jr    z,$-3
  195.     call    crlf
  196.  
  197.     call    cls
  198.     call    print
  199.     db    'DIRATR '
  200.     db    vers/10+'0','.',vers mod 10 +'0'
  201.     db    0
  202.     call    line        ; display a divider
  203.  
  204.     if    dim
  205.     call    stndout
  206.     endif
  207.  
  208.     jr    screenful    ; next screen
  209.  
  210. ; Print a row of entries
  211. row:
  212.     push    hl        ; save current entry pointer
  213.     ld    bc,(rownum)    ; update row number
  214.     ld    (rowpos),bc
  215.     inc    bc
  216.     ld    (rownum),bc
  217.     ld    b,4        ; 4 entries max per line
  218. rloop:    
  219.     push    bc
  220.     call    entry        ; display an entry in the table
  221.     push    hl
  222.     ld    hl,(rowpos)    ; compute number of next entry
  223.     ld    de,(rdisp)
  224.     add    hl,de
  225.     ld    (rowpos),hl    ; save it
  226.     ex    de,hl        ; is there such an entry #?
  227.     ld    hl,(fcount)
  228.     xor    a
  229.     sbc    hl,de
  230.     pop    hl
  231.     pop    bc
  232.     jr    c,rexit        ; no
  233.     ld    de,(edisp)    ; compute position of next table entry
  234.     add    hl,de
  235.     djnz    rloop
  236.  
  237. rexit:
  238.     pop    hl        ; move pointer to first entry, next row
  239.     ld    de,16
  240.     add    hl,de
  241.     jp    crlf
  242.  
  243.  
  244. entry:
  245.     ld    a,' '        ; format and display entry
  246.     call    cout
  247.     ld    a,4
  248.     cp    b
  249.     jr    z,pentry    ; no fence on last column
  250.     call    print
  251.     db    '| ',0
  252.  
  253. pentry:
  254.     push    hl
  255.     inc    hl
  256.     call    pfn
  257.     pop    hl
  258.     push    hl
  259.     call    fsize
  260.     ld    hl,(total)
  261.     add    hl,de
  262.     ld    (total),hl
  263.     ex    de,hl
  264.     call    phldc
  265.     pop    hl
  266.     ld    bc,(filcnt)
  267.     dec    bc
  268.     ld    (filcnt),bc
  269.     ld    a,b
  270.     or    c
  271.     jp    z,footer    ; exits
  272.     ret
  273.  
  274.  
  275. pfn:    ld    b,8
  276.     call    pfn01
  277.     ld    a,'.'
  278.     call    cout
  279.     ld    b,3
  280. pfn01:    ld    a,(hl)
  281.     and    0ffh
  282.     push    af
  283.  
  284.     if    dim
  285.     call    m,stndend
  286.     else
  287.     call    m,stndout
  288.     endif
  289.  
  290.     pop    af
  291.     call    cout
  292.  
  293.     if    dim
  294.     call    m,stndout
  295.     else
  296.     call    m,stndend
  297.     endif
  298.  
  299.     inc    hl
  300.     djnz    pfn01
  301.     ret
  302.  
  303.  
  304.  
  305.  
  306. ; Make a line across the screen
  307. line:
  308.      if    not wyse
  309.     call    crlf
  310.     push    bc
  311.     ld    b,79
  312.     ld    a,'-'
  313.     call    cout
  314.     djnz    $-3
  315.     pop    bc
  316.     jp    crlf
  317.  
  318.      else
  319. ; Wyse
  320.     call    crlf
  321.     call    print
  322.     db    esc,'H',2,0        ; graphics mode on
  323.     push    bc
  324.     ld    b,79
  325.     ld    a,':'
  326.     call    cout
  327.     djnz    $-3
  328.     pop    bc
  329.     call    print
  330.     db    esc,'H',3,cr,lf,0    ; graphics mode off
  331.     ret
  332.      endif    ; not wyse
  333.  
  334.  
  335.  
  336. footer:
  337.     if     dim
  338.     call    stndend
  339.     endif
  340.  
  341.     call    line
  342.  
  343.     call    retud        ; Print DU
  344.     ld    a,'A'
  345.     add    a,b        ; rah
  346.     call    cout
  347.     ld    a,c
  348.     call    pafdc
  349.     ld    a,':'
  350.     call    cout
  351.     inc    b        ; Print DIR
  352.     call    dundr
  353.     jr    z,ftr1
  354.     inc    hl
  355.     ld    b,8
  356. ftr0:    inc    hl
  357.     ld    a,(hl)
  358. ;    cp    ' '
  359. ;    jr    z,ftr1
  360.     call    cout
  361.     djnz    ftr0    
  362.  
  363. ftr1:    call    print
  364.     db    '    Files: ',0
  365.     ld    hl,(fcount)
  366.     call    phlfdc
  367.     call    print
  368.     db    '    Use: ',0
  369.     ld    hl,(total)
  370.     call    phlfdc
  371.     call    print
  372.     db    ' k     Free: ',0
  373.     call    dfree
  374.     ex    de,hl
  375.     call    phlfdc
  376.     call    print
  377.     db    ' k',0
  378.     call    line
  379.  
  380. exit:
  381.     ld    sp,(stksav)
  382.     ld    bc,(udsav)
  383.     jp    logud
  384.  
  385. info:    
  386.     call    print
  387.     db    'DIRATR '
  388.     db    vers/10+'0','.',vers mod 10 +'0'
  389.     db    0
  390.     jr    exit
  391.  
  392. print:    ex    (sp),hl
  393.     ld    a,(hl)
  394.     inc    hl
  395.     ex    (sp),hl
  396.     or    a
  397.     ret    z
  398.     call    cout
  399.     jr    print
  400.  
  401.      if    wyse
  402. stndout:
  403.     call    print
  404.     db    esc,')',0
  405.     ret
  406. stndend:
  407.     call    print
  408.     db    esc,'(',0
  409.     ret
  410.      endif
  411.  
  412. ; Data seg thrown up above program
  413.  
  414. stksav    equ    stkloc+2
  415. udsav    equ    stkloc+4
  416. edisp    equ    stkloc+6
  417. rdisp    equ    stkloc+8
  418. rownum    equ    stkloc+10
  419. rowpos    equ    stkloc+12
  420. total    equ    stkloc+14
  421. fcount    equ    stkloc+16
  422. filcnt    equ    stkloc+18
  423.     end start
  424.