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 / UTILS / DIRUTL / ALLDIR11.LBR / ALLDIR.MQC / ALLDIR.MAC
Text File  |  2000-06-30  |  8KB  |  334 lines

  1. ; ALLDIR by ESKAY v1.10        09/21/85
  2. ;
  3. ; A directory program that displays all files on all disks
  4. ; sorted by name and user area.
  5. ;
  6. ; syntax:
  7. ; ALLDIR        ; displays on screen
  8. ; ALLDIR -L        ; displays on screen and printer
  9. ; ALLDIR -FFOO.BAR    ; displays on screen and writes file "FOO.BAR"
  10. ;
  11. ; NOTE:
  12. ; Thanks to Richard Norman for bug fix and suggestions.
  13. ; version 1.10 now adds the following feature in addition to the
  14. ; bug fix:
  15. ; A special version of ALLDIR can be generated by changing the byte
  16. ; at 0101H to non-zero. If zero, operation is as usual. if nonzero,
  17. ; ALLDIR will only display files on the current drive.
  18. ; Also, the file SORT.REL has been added to the LBR file. To reassemble:
  19. ; 0A}M80 =ALLDIR
  20. ; 0A}LINK ALLDIR,SORT,SYSLIB[S]
  21. ;    Note that I use Digital Research LINK rather than L80 because of
  22. ;    L80's stupid placement of CSEG and DSEG.  Use L80 at own risk!
  23. ;
  24. .z80            ; use zilog mnemonics
  25. ;
  26. ; declaration section
  27. ; (externals dynamically declared)
  28. ;
  29. cr    equ    0dh    ; RETURN
  30. lf    equ    0ah    ; LINEFEED
  31. ;
  32. dbuf    equ    80h    ; default dma buffer
  33. ;
  34.     cseg        ; code section
  35. ;
  36. start:    ld    a,0            ; change to LD A,1 for singledrive
  37. sglflg    equ    $-1
  38.     ld    sp,stack        ; set up stack pointer
  39.     call    print##
  40.     cr,lf,lf
  41.     'ALLDIR v1.10 by ESKAY',cr,lf,lf
  42.     'Reading directory on drive  ',0
  43.     xor    a            ; set up drive
  44.     ld    (drive),a
  45.     call    codend##        ; get buffer
  46.     ld    (bufptr),hl        ; save as buffer ptr
  47.     ld    (lodrv),hl        ;   and as drive buffer ptr
  48.     ld    hl,(5)            ; get end of tpa
  49.     ld    l,0            ; make even boundary
  50.     ld    (bufend),hl        ; store as end of buffer
  51.     ld    hl,0
  52.     ld    (count),hl        ; zero count
  53.     ld    c,24            ; get login vector
  54.     call    bdos##
  55.     ld    (ready),hl
  56.     ld    a,(sglflg)        ; check if single drive version
  57.     or    a
  58.     jr    z,loop            ; no, behave normally
  59.     ld    c,25            ;   else get drive
  60.     call    bdos##
  61.     jr    loopx
  62. ;
  63. ; loop here until all drives are checked
  64. ;
  65. loop:    ld    a,(sglflg)        ; check if single
  66.     or    a
  67.     jp    nz,sortit        ; done if single drive
  68.     ld    a,(drive)        ; get drive
  69. loopx:    ld    e,a
  70.     inc    a
  71.     ld    (drive),a        ; get ready for next drive
  72.     cp    16            ; is this one P:?
  73.     jp    z,sortit        ; yes, done reading
  74.     push    af
  75.     ld    hl,(ready)        ; get ready vector
  76.     or    a            ; reset carry
  77.     ld    a,h
  78.     rra
  79.     ld    h,a
  80.     ld    a,l
  81.     rra
  82.     ld    l,a
  83.     ld    (ready),hl
  84.     jp    c,..rdy            ; continue if ready...
  85.     pop    af            ;   else clean up stack
  86.     jp    loop            ;     and check next drive
  87. ;
  88. ..rdy:    pop    af
  89.     call    print
  90.     8,0
  91.     ld    e,a            ; drive+1 in e
  92.     dec    e
  93.     add    a,40h            ; make ascii drive letter
  94.     call    cout##
  95.     ld    c,14            ; select disk
  96.     call    bdos##
  97.     ld    hl,(bufptr)
  98.     ld    (lodrv),hl
  99.     ld    c,17            ; search for first
  100.     ld    de,fcb            ; select fcb
  101.     ld    a,'?'            ; bug fix: thanks to Richard Norman
  102.     ld    (de),a            ;  "   "
  103.     call    bdos##            ; get first entry
  104.     call    movefn            ; move fn if only one and not deleted
  105. ..rdlp:    call    print
  106.     ':',8,0
  107.     ld    c,18            ; search for next
  108.     ld    de,fcb
  109.     call    bdos##
  110.     cp    0ffh            ; end of directory?
  111.     jp    z,loop
  112.     call    movefn            ; move if ok
  113.     call    print
  114.     ' ',8,0
  115.     call    condin##        ; check for abort
  116.     cp    3
  117.     jp    nz,..rdlp
  118.     jp    exit
  119. ;
  120. ; come here to sort the whole mess
  121. ;
  122. sortit:    call    print##
  123.     cr,lf
  124.     'Sorting file names...',0
  125.     ld    hl,(count)    ; get number of files...
  126.     ld    b,h        ; .. into bc
  127.     ld    c,l
  128.     ld    de,13        ; 13 bytes per entry
  129.     call    codend##    ; buffer start
  130.     call    sort##        ; do it now
  131.     call    print##
  132.     cr,lf,cr,lf
  133.     '                        Total files displayed: ',0
  134.     ld    hl,(count)
  135.     call    phlfdc##
  136.     call    print
  137.     cr,lf,cr,lf,0
  138.     call    codend##
  139.     ld    (bufptr),hl
  140.     ld    a,21        ; first screen has only 21 lines of filenames
  141.     jp    ..1st
  142. ;
  143. ; now print the buffer, a file at a time like " 5A:ALLDIR  .COM"
  144. ;
  145. ploop:    ld    a,24
  146. ..1st:    ld    (lps),a
  147. ploop1:    ld    a,4        ; 4 file names per line
  148.     ld    (npl),a        ; set up variable
  149.     call    crlf##        ; start a new line
  150. ploop2:    ld    hl,(bufptr)    ; get pointer to next filename
  151.     ld    d,h        ; put into de also
  152.     ld    e,l
  153.     ld    bc,11        ; offset to user area
  154.     add    hl,bc        ; hl now points to user
  155.     ld    a,(hl)        ; get user
  156.     ld    c,'0'-1        ; convert to decimal ascii
  157. ..cvrt:    inc    c
  158.     sub    10
  159.     jp    nc,..cvrt
  160.     add    a,'0'+10    ; a=units, c=tens
  161.     push    af        ; save units
  162.     ld    a,c        ; get tens
  163.     cp    '0'        ; if (leading) zero...
  164.     jp    nz,..nz        ;   then skip...
  165.     ld    a,' '        ;     else blank
  166. ..nz:    call    cout##
  167.     pop    af        ; get tens
  168.     call    cout##
  169.     inc    hl
  170.     ld    a,(hl)        ; get drive
  171.     add    a,'@'
  172.     call    cout##
  173.     ld    a,':'
  174.     call    cout##
  175.     call    pfn1##        ; print file name
  176.     ld    hl,(bufptr)    ; get pointer
  177.     ld    de,13        ; point to next name
  178.     add    hl,de
  179.     ld    (bufptr),hl    ; save pointer
  180.     ld    hl,(count)    ; get count
  181.     dec    hl        ; count down
  182.     ld    (count),hl
  183.     ld    a,h
  184.     or    l        ;   to zero
  185.     jp    z,exit        ; done if zero!
  186.     ld    a,(npl)        ; get name count
  187.     dec    a
  188.     ld    (npl),a
  189.     jp    z,..nwl
  190.     call    print##        ; print fence
  191.     ' | ',0
  192.     jp    ploop2
  193. ;
  194. ..nwl:    ld    a,(lps)        ; get line count
  195.     dec    a
  196.     ld    (lps),a
  197.     jp    nz,ploop1
  198.     call    cin##
  199.     cp    3
  200.     jp    nz,ploop
  201. ;
  202. ; all finished
  203. ;
  204. exit:    call    crlf##
  205.     rst    0
  206. ;
  207. ; subroutine section
  208. ;
  209. ; move filename into buffer
  210. ; a=dbuf-relative location. the filename is only moved if
  211. ; it does not already exist in the buffer
  212. ;
  213. movefn:    ld    hl,dbuf        ; hl points to buffer
  214.     ld    de,32        ; offset
  215.     inc    a        ; make a=1..4
  216. ..cof:    dec    a
  217.     jp    z,..gof        ; go offset in hl if 0
  218.     add    hl,de
  219.     jp    ..cof
  220. ;
  221. ..gof:    ld    a,(hl)        ; get user area byte
  222.     cp    0e5h        ; if erased
  223.     ret    z        ;   then return immediately
  224.     inc    hl
  225.     push    hl        ; save dbuf pointer
  226. ;
  227. ; now make entry table compatible, ie UD:FN.EXT
  228. ;
  229.     push    af        ; save user area
  230.     ld    b,11        ; 11 chars
  231. ..norl:    ld    a,(hl)        ; get byte
  232.     and    7fh        ; strip parity
  233.     ld    (hl),a        ; put it back
  234.     inc    hl        ; point to next byte
  235.     dec    b        ; count down
  236.     jp    nz,..norl    ;   and loop until all 11 chars done
  237.     pop    af        ; get user back
  238.     ld    (hl),a        ; save user after name
  239.     inc    hl
  240.     ld    a,(drive)    ; get drive (A=1..P=16)
  241.     ld    (hl),a        ; save after user
  242.     call    codend##    ; get buffer start
  243.     ld    d,h
  244.     ld    e,l        ;   into de
  245.     pop    hl
  246. ;
  247. ; the following code checks for duplicates and returns immediately
  248. ; if a duplicate filename is found
  249. ;
  250. ckdup:    push    hl        ; save dbuf ptr
  251.     ld    hl,(lodrv)    ; get base for this drive
  252.     ld    b,h
  253.     ld    c,l        ;   into bc
  254.     ld    hl,(bufptr)    ; get buffer pointer
  255.     ld    d,h
  256.     ld    e,l        ;   into de
  257.     pop    hl        ; get dbuf ptr
  258.     push    hl        ;   and save it again
  259. ..cdlp:    ld    a,b        ; check if end of buffer reached
  260.     cp    d
  261.     jp    nz,..neb    ;   no
  262.     ld    a,c
  263.     cp    e
  264.     jp    z,..ndup    ;     yes, done checking
  265. ..neb:    push    de        ; save end pointer
  266.     push    hl        ; save dbuf ptr
  267.     ld    de,13        ; 13 bytes to compare
  268. ..nebl:    ld    a,(bc)        ; get byte
  269.     cp    (hl)        ; see if same
  270.     jp    nz,..neeq    ;   no, advance ptrs
  271.     inc    bc
  272.     inc    hl
  273.     dec    e
  274.     jp    nz,..nebl    ; loop until all checked
  275.     pop    hl
  276.     pop    de
  277.     pop    hl
  278.     ret            ; found a dupe
  279. ;
  280. ..neeq:    push    bc
  281.     pop    hl
  282.     add    hl,de
  283.     push    hl
  284.     pop    bc
  285.     pop    hl
  286.     pop    de
  287.     jp    ..cdlp
  288. ;
  289. ..ndup:    ld    hl,(bufptr)    ; get current buffer pointer
  290.     ld    d,h
  291.     ld    e,l        ;   into de
  292.     pop    hl        ; get dbuf ptr back
  293.     ld    b,13        ; 13 bytes to move
  294. ..movl:    ld    a,(hl)
  295.     ld    (de),a
  296.     inc    hl
  297.     inc    de
  298.     dec    b
  299.     jp    nz,..movl
  300.     ex    de,hl
  301.     ld    (bufptr),hl    ; save buffer pointer
  302.     ld    hl,(count)    ; get count
  303.     inc    hl        ;   bump it
  304.     ld    (count),hl    ;     and save it
  305.     ld    hl,(bufptr)
  306.     ld    d,h
  307.     ld    e,0
  308.     ld    hl,(bufend)
  309.     ld    a,h
  310.     cp    d
  311.     ret    nz        ; dun
  312.     call    print##
  313.     cr,lf,lf,7
  314.     'ERROR: memory full, processing buffer...',cr,lf,0
  315.     pop    hl        ; clean stack
  316.     jp    sortit
  317. ;
  318. ; data storage and stack section
  319. ;
  320. bufptr:    dw    0        ; buffer pointer
  321. lodrv:    dw    0        ; low drive buffer pointer
  322. bufend:    dw    0        ; end of buffer space
  323. count:    dw    0        ; total file count
  324. ready:    dw    0        ; drive ready vector
  325. drive:    db    0        ; next drive
  326. npl:    db    0        ; names per line counter
  327. lps:    db    0        ; lines per screen counter
  328. ;
  329. fcb:    db    '?'        ; that is enough
  330.     ds    80        ; 40 level stack
  331. stack    equ    $
  332.     end
  333. pop    hl
  334.     add    hl,d