home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / sdl30.asm < prev    next >
Assembly Source File  |  1985-02-20  |  23KB  |  959 lines

  1. page    80,132
  2. title    SDL 3.0 - Sorted Directory List
  3. sdl    segment
  4. sdlp    proc    far
  5.     assume    cs:sdl,ds:sdl,es:sdl
  6. ;
  7. ; SORTED DIRECTORY LIST 3.0
  8. ;
  9. ; SDL [d:][path][filename[.ext]][/options]
  10. ;
  11. ; Options:  General
  12. ;         E    erase screen
  13. ;         P    pause when screen full
  14. ;         W    4 column format (2 if width 40)
  15. ;        Sort options (sort on filename.ext is the default)
  16. ;         N    do not sort entries
  17. ;         S    sort by file size
  18. ;         D    sort by date and time
  19. ;         X    sort by file type (ext)
  20. ;        Sub-directories
  21. ;         T    list sub-directory names
  22. ;         F    use with T to list file names by directory
  23. ;         I    use with TF to indent file lists (not supported on
  24. ;            width 40 screens)
  25. ;         A    use with T to list all file names together
  26. ;
  27. ; Default:  *.* sorted by name.ext, 2 cols wide (1 on width 40 screen), no
  28. ;        screen erase or pause at end of page, using current directory.
  29. ;
  30. ; Notes:
  31. ;   1. Path specifications:
  32. ;      a. paths must end with \.
  33. ;      b. specifying a leading \ starts the path search at the root directory.
  34. ;      No leading \ will start the path at the current directory.
  35. ;      c. not specifying a path starts the operation at the current directory.
  36. ;   2. The space used by sub-directories is not accounted for.
  37. ;   3. Directory listings do not include the '.' or '..' entries.
  38. ;   4. The specified filename.ext may include ? and/or *.
  39. ;
  40. ; Output formats:  Width 80 - 2 or 4 columns   (option TFI - 1 or 2 columns)
  41. ;           Width 40 - 1 or 2 columns
  42. ;
  43. ; Filename in listing may be preceeded by one of the following char.:
  44. ;        r - read-only file
  45. ;        h - hidden file
  46. ;        s - system file
  47. ;        \ - sub-directory name
  48. ;   If a file has more than 1 attribute, only the last is shown.
  49. ;
  50. ; Written by W. C. Bodycomb
  51. ;        Version 1.0 - original version, runs under DOS 1.0 and 1.1
  52. ;        Version 2.0 - support for DOS 2.0, runs under DOS 1.0, 1.1, 2.0
  53. ;        Version 3.0 - support for paths and sub-directories, runs under
  54. ;              DOS 2.0.
  55. ;
  56.     org    100h        ;set up for COM
  57. subp    proc    near
  58. ;
  59. ; get current or specified drive
  60. ;
  61. bgn:    call    clear        ;clear ctrs
  62.     cld            ;set direction
  63.     mov    si,offset init    ;init.
  64.     mov    di,offset dxfcb ;  the
  65.     mov    cx,19        ;    dummy
  66.     repz movsb        ;      FCB
  67.     mov    ah,19h        ;get
  68.     int    21h        ;  current
  69.     add    al,65        ;    disk
  70.     mov    si,offset path    ;      and
  71.     mov    [si],al     ;     save
  72.     mov    di,80h        ;get
  73.     mov    ch,0        ;  lth of
  74.     mov    cl,[di]     ;    of param
  75.     jcxz    vol1        ;br if no parms
  76.     inc    di        ;start of parms
  77.     mov    al,' '          ;scan off
  78.     repe scasb        ;  blanks
  79.     je    vol1        ;br if no parm
  80.     dec    di        ;adj
  81.     inc    cx        ;  values
  82.     cmp    cx,2        ;long enough
  83.     jb    vol1        ;br no
  84.     cmp    byte ptr [di]+1,':' ;is drive specified
  85.     jne    vol1        ;br no
  86.     mov    al,[di]     ;save
  87.     and    al,0dfh     ;  drive
  88.     mov    [si],al     ;    letter
  89.     inc    di        ;incr
  90.     inc    di        ;  adr
  91.     dec    cx        ;decr
  92.     dec    cx        ;  count
  93. ;
  94. ; get volume label
  95. ;
  96. vol1:    push    di        ;save
  97.     push    cx        ;  regs
  98.     mov    dx,offset da    ;set
  99.     mov    ah,1ah        ;  dta
  100.     int    21h        ;    adr
  101.     mov    al,[si]     ;put drive
  102.     mov    tia+9,al    ;  in header
  103.     sub    al,64        ;set
  104.     mov    dfcb,al     ;  drive
  105.     mov    di,offset svvol ;save area
  106.     mov    ah,11h        ;set get first
  107.     mov    dx,offset dxfcb ;look for
  108.     int    21h        ;  vol label
  109.     or    al,al        ;any vol label
  110.     jnz    fpth        ;br no
  111.     mov    si,offset da+8    ;label adr
  112.     mov    cx,11        ;save
  113.     repz movsb        ;  label
  114. ;
  115. ; save specified path
  116. ;
  117. fpth:    mov    byte ptr [di],' ' ;mark end
  118.     pop    cx        ;restore
  119.     pop    di        ;  regs
  120.     jcxz    eopt        ;br if no path/fnm
  121.     mov    dx,cx        ;save count
  122.     mov    bp,di        ;  and adr
  123.     add    di,cx        ;start
  124.     dec    di        ;  at
  125.     std            ;    end
  126.     mov    al,'\'          ;find end
  127.     repne scasb        ;  of path
  128.     cld            ;set direction
  129.     jne    fopt        ;br-not found
  130.     inc    cx        ;adj count
  131.     mov    si,bp        ;copy start adr
  132.     sub    dx,cx        ;save non-path lth
  133.     mov    di,offset path+2 ;move
  134.     repz movsb        ;  path
  135.     mov    fspca,di    ;save path end adr
  136.     mov    bp,si        ;set new start adr
  137. ;
  138. ; get options
  139. ;
  140. fopt:    mov    di,bp        ;get start adr
  141.     mov    cx,dx        ;  and lth
  142.     jcxz    eopt        ;br-no options or filename
  143.     mov    al,'/'          ;find
  144.     repne scasb        ;  options
  145.     jne    gfspc        ;br-no options
  146.     dec    di        ;adj
  147.     inc    cx        ;  values
  148.     mov    si,di        ;copy adr
  149.     push    di        ;  and save
  150.     sub    dx,cx        ;save filespec size
  151. opt:    cmp    byte ptr [si],'/' ;is it /
  152.     je    opt3        ;keep looking
  153.     mov    al,byte ptr [si] ;get char
  154.     and    al,0dfh     ;force upper case
  155.     mov    di,offset swn    ;set adr
  156.     mov    bx,400h     ;  and flag
  157. opt1:    scasb            ;option found
  158.     je    opt2        ;br yes
  159.     shr    bx,1        ;check next
  160.     jnz    opt1        ;  option
  161.     jz    opt3        ;not valid option
  162. opt2:    or    word ptr sw,bx    ;set option
  163. opt3:    inc    si        ;check
  164.     loop    opt        ;  all char
  165.     pop    di        ;restore reg
  166. ;
  167. ; get specified filespec
  168. ;
  169. gfspc:    mov    byte ptr [di],' ' ;set delimiter
  170.     mov    cx,dx        ;get count
  171.     mov    si,bp        ;  and adr
  172.     jcxz    eopt        ;br-no filespec
  173.     cmp    byte ptr [si],' ' ;any filespec
  174.     je    eopt        ;br no
  175.     mov    di,offset dfcb    ;let DOS
  176.     mov    ax,2900h    ;  parse
  177.     int    21h        ;    filespec
  178. ;
  179. ; initialize options
  180. ;
  181. eopt:    mov    di,fspca    ;move dir.
  182.     call    mvfs        ;  filespec
  183.     test    sw1,4        ;T option
  184.     jnz    eopt1        ;br yes
  185.     and    sw1,0fch    ;clear A and F
  186. eopt1:    test    sw1,1        ;A option
  187.     jz    eopt2        ;br no
  188.     and    sw1,0fdh    ;clear F option
  189.     mov    cx,19        ;set count
  190.     mov    si,offset dirm    ;change
  191.     mov    di,offset h2+25 ;  hdrs
  192.     repz movsb        ;    to dir#
  193. eopt2:    test    sw,8        ;wide
  194.     jz    eopt3        ;br no
  195.     mov    coln,4        ;set cols to 4
  196.     mov    si,offset h3    ;hdr adr
  197.     mov    di,offset h2+15 ;change
  198.     mov    cx,5        ;  bytes to
  199.     repz movsb        ;    sector
  200. eopt3:    push    ds        ;save data segment
  201.     mov    ax,40h        ;point to
  202.     mov    ds,ax        ;  data area
  203.     mov    ax,ds:4ah    ;get screen cols
  204.     pop    ds        ;restore data segment
  205.     cmp    ax,80        ;80 col
  206.     je    eopt4        ;br yes
  207.     or    sw1,128     ;set 40 col
  208.     shr    coln,1        ;cols
  209.     jnz    fa        ;  /2
  210. eopt4:    test    sw1,2        ;option F
  211.     jz    fa        ;br no
  212.     test    sw,1        ;I option
  213.     jz    fa        ;br no
  214.     shr    coln,1        ;cols/2
  215.     mov    colp,40     ;set offset
  216. ;
  217. ; get FAT info
  218. ;
  219. fa:    mov    dl,path     ;get
  220.     sub    dl,64        ;  drive no
  221.     mov    ah,36h        ;get DOS 2
  222.     int    21h        ;  fat info
  223.     cmp    ax,0ffffh    ;br if
  224.     jne    fa1        ;  drive ok
  225.     int    20h        ;give up
  226. fa1:    mov    bpsc,cx     ;save bytes/sec
  227.     mov    ah,0        ;clear high byte
  228.     mov    scpf,ax     ;save sec/fat
  229.     xchg    cx,dx        ;find bytes per
  230.     mul    dx        ;  alloc. unit
  231.     mul    bx        ;free bytes
  232.     mov    free,ax     ;save low
  233.     mov    free+2,dx    ;  and high
  234. ;
  235. ; clear screen
  236. ;
  237. clr:    test    sw,128        ;screen clear
  238.     jz    sdlh        ;br no
  239.     sub    cx,cx        ;col 0, row 0
  240.     mov    dx,184fh    ;last row, col
  241.     test    sw1,128     ;80 cols
  242.     jz    clr1        ;br yes
  243.     mov    dx,1827h    ;set 40 col
  244. clr1:    mov    bh,7        ;color
  245.     mov    ax,600h     ;scroll
  246.     int    10h        ;  screen
  247.     sub    dx,dx        ;set
  248.     mov    ah,2        ;  cursor
  249.     mov    bh,0        ;    to
  250.     int    10h        ;      0
  251. ;
  252. ; print SDL header
  253. ;
  254. sdlh:    mov    dx,offset h1    ;print
  255.     call    prt        ;  header
  256.     mov    si,offset svvol ;label adr
  257. sdlh1:    lodsb            ;get char
  258.     cmp    al,' '          ;end of label
  259.     je    sdlh2        ;br yes
  260.     mov    dl,al        ;print
  261.     call    prtc        ;  char
  262.     jmp    sdlh1        ;next char
  263. sdlh2:    mov    ah,2ah        ;get
  264.     int    21h        ;  date
  265.     mov    si,offset mth    ;field start
  266.     mov    al,dh        ;convert
  267.     call    x2        ;  month
  268.     mov    al,dl        ;convert
  269.     call    x2        ;  day
  270.     mov    ax,cx        ;adjust
  271.     sub    ax,1900     ;  year
  272.     call    x2        ;convert year
  273.     mov    ah,2ch        ;get
  274.     int    21h        ;  time
  275.     mov    si,offset ti    ;field start
  276.     mov    al,ch        ;convert
  277.     call    x2        ;  hour
  278.     mov    al,cl        ;convert
  279.     call    x2        ;  minutes
  280.     mov    dx,offset h1evl ;print
  281.     call    prt        ;  hdr
  282.     test    sw1,128     ;width 40
  283.     jz    sdlh3        ;br no
  284.     call    ckpg        ;print cr
  285. sdlh3:    mov    dx,offset h1a    ;print
  286.     call    prt        ;  hdr
  287.     mov    si,free     ;convert
  288.     mov    di,free+2    ;  free
  289.     call    w0        ;    bytes
  290.     mov    dx,offset h1b    ;print
  291.     call    prt        ;  hdr
  292.     mov    ax,free     ;convert
  293.     mov    dx,free+2    ;  free
  294.     call    v0        ;    sectors
  295.     call    v3        ;      and print
  296.     mov    dx,offset h1c    ;print
  297.     call    prt        ;  hdr
  298.     call    ckpg        ;print cr
  299.     call    ckpg        ;print cr
  300.     mov    mtha+8,'$'      ;set end of field
  301.     mov    tia+5,'$'       ;set end of field
  302.     test    sw1,4        ;T option
  303.     jnz    tinit        ;br yes
  304. ;
  305. ; list one directory
  306. ;
  307.     call    dir        ;get directory
  308.     call    sr        ;process entries
  309.     jmp    return        ;all done
  310. ;
  311. ; initialize for sub-directories
  312. ;
  313. tinit:    mov    di,fspca    ;get fspec adr
  314.     mov    si,offset path+2 ;path adr
  315.     cmp    byte ptr [si],'\' ;start at root
  316.     je    tinit1        ;br yes
  317.     mov    dx,offset cdir    ;print
  318.     call    prt        ;  current
  319.     cmp    si,di        ;any path
  320.     je    tinit3        ;br no
  321. tinit1: mov    dl,byte ptr [si] ;get path byte
  322.     cmp    dl,61h        ;force
  323.     jb    tinit2        ;  upper
  324.     sub    dl,20h        ;    case
  325. tinit2: call    prtc        ;print
  326.     inc    si        ;  name
  327.     cmp    si,di        ;end of path
  328.     jb    tinit1        ;br no
  329. tinit3: test    sw1,1        ;option A
  330.     jz    tinit4        ;br no
  331.     push    di        ;save reg
  332.     xor    si,si        ;print
  333.     call    v3        ;  dir no
  334.     pop    di        ;restore reg
  335. tinit4: call    ckpg        ;print cr
  336.     jmp    tre7        ;get 1st dir
  337. ;
  338. ; list sub-directories
  339. ;
  340. tre:    test    byte ptr [si]+15,16 ;sub-dir
  341.     jnz    tre2        ;br yes
  342. tre1:    add    si,26        ;next entry
  343.     cmp    si,[di]+10    ;end of dir
  344.     jb    tre        ;br no
  345.     cmp    word ptr [di]+6,0 ;any previous dir.
  346.     je    tred        ;br no
  347.     mov    di,[di]+6    ;prev dir.
  348.     mov    prvt,di     ;save adr
  349.     mov    si,[di]+8    ;curr. entry
  350.     sub    col,2        ;decr col
  351.     jnz    tre1        ;step to next
  352. tre2:    mov    cx,[di]+4    ;space
  353. tre3:    call    prtb        ;  to
  354.     loop    tre3        ;    col
  355.     mov    [di]+8,si    ;save curr entry
  356.     inc    dirn        ;incr dir no
  357.     inc    si        ;step to
  358.     inc    si        ;  filename
  359.     mov    cx,12        ;print
  360.     mov    di,[di]+2    ;  sub
  361. tre4:    lodsb            ;    dir
  362.     cmp    al,' '          ;blank
  363.     je    tre5        ;br yes
  364.     stosb            ;move char
  365.     mov    dl,al        ;print
  366.     call    prtc        ;  char
  367. tre5:    loop    tre4        ;next char
  368.     test    sw1,1        ;A option
  369.     jz    tre6        ;br no
  370.     mov    si,dirn     ;print
  371.     push    di        ;  out
  372.     call    v3        ;    dir
  373.     pop    di        ;      no.
  374. tre6:    call    ckpg        ;print cr
  375.     mov    byte ptr [di],'\' ;end
  376.     inc    di        ;  path
  377.     mov    fspca,di    ;save adr
  378. tre7:    call    mvfs        ;move fspec
  379.     add    col,2        ;incr col
  380.     call    dir        ;get directory
  381.     test    sw1,2        ;F option
  382.     jz    tre        ;br no
  383.     push    si        ;save
  384.     push    di        ;  regs
  385.     call    sr        ;process entries
  386.     pop    di        ;restore
  387.     pop    si        ;  regs
  388.     jmp    tre        ;process table
  389. tred:    test    sw1,1        ;A option
  390.     jz    return        ;br no
  391.     mov    di,offset tb    ;table start
  392.     call    sr        ;process entries
  393. return: call    ckpg1        ;allow for DOS cr
  394.     int    20h        ;all done
  395. ;
  396. ; get directory entries and build table
  397. ;
  398. dir:    mov    di,nx        ;get
  399.     push    di        ;  start
  400.     add    di,26        ;save
  401.     mov    nx,di        ;  end
  402.     pop    di        ;restore
  403.     push    di        ;  start
  404.     inc    di        ;+
  405.     inc    di        ;  2
  406.     mov    si,offset fspca ;set up
  407.     mov    cx,3        ;  fspec adr, col
  408.     repz movsw        ;    and prev table
  409.     pop    di        ;restore
  410.     push    di        ;  start
  411.     mov    byte ptr [di]+15,8 ;mark control
  412.     mov    prvt,di     ;save as prev
  413.     mov    [di]+8,di    ; and curr sub-dir
  414.     mov    ah,4eh        ;get 1st
  415. dir1:    mov    cx,16h        ;get
  416.     mov    dx,offset path    ;  directory
  417.     int    21h        ;    entry
  418.     or    al,al        ;br if entry
  419.     jz    dir2        ;  found
  420.     mov    ax,nx        ;save
  421.     pop    si        ;  tbl
  422.     mov    [si]+10,ax    ;    end
  423.     mov    di,si        ;copy table adr
  424.     ret            ;return
  425. dir2:    cmp    byte ptr dan,'.' ;path
  426.     je    dir6        ;br yes
  427.     mov    bx,nx        ;set next
  428.     lea    di,[bx+2]    ;  entry adr
  429.     push    di        ;save reg
  430.     push    di        ;  twice
  431.     mov    si,offset blnk    ;blanks
  432.     mov    cx,13        ;blank$
  433.     repz movsb        ;  fname
  434.     pop    di        ;restore reg
  435.     mov    si,offset dan    ;returned fn adr
  436. dir3:    cmp    byte ptr [si],0 ;end of name
  437.     je    dir5        ;br yes
  438.     cmp    byte ptr [si],'.' ;separator
  439.     jne    dir4        ;br no
  440.     lea    di,[bx+2]    ;position
  441.     add    di,8        ;  file type
  442. dir4:    movsb            ;move char
  443.     jmp    dir3        ;repeat
  444. dir5:    pop    di        ;restore reg
  445.     add    di,13        ;re-position
  446.     mov    si,offset daa    ;save
  447.     movsb            ;  attribute
  448.     movsw            ;save time
  449.     movsw            ;  and date
  450.     movsw            ;move file
  451.     movsw            ;  size
  452.     mov    si,offset dirn    ;move
  453.     movsw            ;  dir. no
  454.     inc    word ptr ct    ;incr file count
  455.     mov    nx,di        ;incr table adr
  456.     cmp    di,sp        ;more
  457.     jb    dir6        ;  room
  458.     mov    dx,offset max    ;print
  459.     call    prt        ;  msg
  460.     int    20h        ;give up
  461. dir6:    mov    ah,4fh        ;get next
  462.     jmp    dir1        ;  directory entry
  463. ;
  464. ; insertion sort
  465. ;
  466. sr:    cmp    di,nx        ;more entries
  467.     jb    sr1        ;br yes
  468.     jmp    dcl        ;set up columns
  469. sr1:    test    byte ptr [di]+15,8 ;control entry
  470.     jnz    sr2        ;br yes
  471.     mov    bp,di        ;save reg
  472.     lea    si,[di+2]    ;compare
  473.     mov    di,offset fspc    ;  dir
  474.     mov    cx,8        ;    entry
  475.     call    cknm        ;check
  476.     jcxz    sr3        ;  filename
  477. sr2:    jmp    snx        ;skip entry
  478. sr3:    inc    si        ;step over .
  479.     mov    cx,3        ;check
  480.     call    cknm        ;  ext
  481.     jcxz    sr4        ;br ok
  482.     jmp    snx        ;skip entry
  483. sr4:    mov    di,bp        ;restore reg
  484.     mov    si,offset t1    ;start of chain
  485. sr5:    mov    bx,si        ;get next
  486.     mov    si,[bx]     ;  chain entry
  487.     or    si,si        ;br if end
  488.     jz    sch        ;  of chain
  489.     test    sw,4        ;no sorting
  490.     jnz    sr5        ;br yes
  491.     mov    ax,si        ;save
  492.     mov    dx,di        ;  adrs
  493.     mov    bp,22        ;size offset
  494.     test    sw,64        ;sort size
  495.     jnz    sz        ;br yes
  496.     mov    bp,18        ;date offset
  497.     test    sw,32        ;sort date
  498.     jnz    sz        ;br yes
  499.     test    sw,16        ;sort type
  500.     jnz    sx        ;br yes
  501. sn:    mov    bp,2        ;compare
  502.     mov    cx,8        ;  file
  503.     call    ssn        ;    names
  504.     jb    sr5        ;try again
  505.     ja    sch        ;chain in entry
  506.     test    sw,16        ;type sort
  507.     jnz    sr5        ;br yes
  508.     call    ssx        ;compare file types
  509.     jbe    sr5        ;try again
  510.     jg    sch        ;chain in entry
  511. sx:    call    ssx        ;compare
  512.     jmp    sz1        ;  file type
  513. sz:    add    si,bp        ;compare
  514.     add    di,bp        ;  the
  515.     mov    cx,2        ;    size
  516.     std            ;      or
  517.     repz cmpsw        ;     date
  518.     cld            ;restore direction
  519.     mov    di,dx        ;restore
  520.     mov    si,ax        ;  regs
  521. sz1:    jb    sr5        ;try again
  522.     je    sn        ;check name
  523. sch:    mov    [di],si     ;chain in
  524.     mov    [bx],di     ;  entry
  525. snx:    add    di,26        ;check next
  526.     jmp    sr        ;  entry
  527. ;
  528. ; sort file name or type sub-rout.
  529. ;
  530. ssx:    mov    bp,11        ;type offset
  531.     mov    cx,3        ;  and lth
  532. ssn:    add    si,bp        ;sort
  533.     add    di,bp        ;  file name
  534.     repz cmpsb        ;    or type
  535.     mov    di,dx        ;restore
  536.     mov    si,ax        ;  regs
  537.     ret            ;return
  538. ;
  539. ; set up columns
  540. ;
  541. dcl:    mov    ax,ct        ;# of files
  542.     cmp    ax,0        ;any entries
  543.     je    dcl4        ;br no
  544.     cmp    coln,1        ;only 1 col
  545.     je    hr        ;br yes
  546.     cmp    ax,2        ;0 or 1
  547.     jb    hr        ;br yes
  548.     xor    dx,dx        ;clear reg
  549.     div    coln        ;/# of cols
  550.     mov    fcrm,dx     ;save remainder
  551.     mov    bp,1        ;set col ctr
  552.     mov    si,offset t1    ;1st chain
  553. dcl1:    mov    bx,si        ;copy adr
  554.     call    dcl2        ;get 1 col entries
  555.     dec    si        ;next col
  556.     dec    si        ;  adr
  557.     mov    [si],dx     ;save start of next chain
  558.     inc    bp        ;incr col ctr
  559.     cmp    bp,coln     ;done
  560.     jb    dcl1        ;br no
  561.     jge    hr        ;print header
  562. dcl2:    mov    cx,ax        ;copy count
  563.     cmp    bp,fcrm     ;need 1 more
  564.     ja    dcl3        ;br no
  565.     inc    cx        ;add 1 more
  566. dcl3:    mov    bx,[bx]     ;count out
  567.     loop    dcl3        ;  entries for col
  568.     mov    dx,[bx]     ;start of next chain
  569.     mov    [bx],cx     ;end this chain
  570. dcl4:    ret            ;return
  571. ;
  572. ; print file headers
  573. ;
  574. hr:    call    fsp        ;option F spacing
  575.     mov    cx,coln     ;# of cols
  576.     jmp    hr2        ;skip blank
  577. hr1:    call    prtb        ;blank
  578. hr2:    mov    dx,offset h2    ;hdr adr
  579.     call    prt        ;print hdr
  580.     loop    hr1        ;do all cols
  581.     call    ckpg        ;print cr
  582. ;
  583. ; process table entries
  584. ;
  585. pr:    mov    bp,coln     ;# of cols
  586.     mov    si,offset t1    ;1st col adr
  587.     cmp    word ptr [si],0 ;end of entries
  588.     je    trlr        ;br yes
  589. pr1:    call    fsp        ;option F
  590.     jcxz    pr3        ;  spacing
  591. pr2:    call    prtb        ;blank
  592. pr3:    mov    bx,[si]     ;next in chain
  593.     or    bx,bx        ;end of chain
  594.     jz    pr4        ;br yes
  595.     mov    ax,[bx]     ;save next
  596.     mov    [si],ax     ;  in chain
  597.     push    si        ;save reg
  598.     call    pf        ;process entry
  599.     pop    si        ;restore reg
  600.     dec    si        ;next
  601.     dec    si        ;  col
  602.     dec    bp        ;decr
  603.     jnz    pr2        ;do next chain
  604. pr4:    call    ckpg        ;print cr
  605.     jmp    pr        ;repeat to end of 1st chain
  606. ;
  607. ; print no. of files
  608. ;
  609. trlr:    call    fsp        ;option F
  610.     mov    si,ct        ;convert file
  611.     call    v3        ;  count
  612.     mov    dx,offset h1d    ;print
  613.     call    prt        ;  hdr
  614.     mov    si,dused    ;convert
  615.     mov    di,dused+2    ;  used
  616.     call    w0        ;    bytes
  617.     mov    dx,offset h1b    ;print
  618.     call    prt        ;  hdr
  619.     mov    si,sused    ;convert
  620.     call    v3        ;    sectors
  621.     call    clear        ;clear ctrs
  622.     mov    dx,offset h1c    ;print
  623.     call    prt        ;  hdr
  624.     jmp    ckpg        ;print cr
  625. ;
  626. ; print file entry
  627. ;
  628. pf:    mov    cx,4        ;set count
  629.     mov    dl,' '          ;blank
  630.     mov    di,offset atr    ;attr table
  631. pf1:    mov    al,byte ptr [di] ;test
  632.     inc    di        ;  for
  633.     test    byte ptr [bx+15],al ;attr
  634.     jz    pf2        ;br no
  635.     mov    dl,byte ptr [di] ;get
  636. pf2:    inc    di        ;  attr
  637.     loop    pf1        ;try again
  638.     call    prtc        ;print attr
  639.     lea    di,[bx+2]    ;file name adr
  640.     mov    cx,12        ;print
  641. pfn:    mov    dl,byte ptr [di] ; file
  642.     call    prtc        ;    name
  643.     inc    di        ;      and
  644.     loop    pfn        ;     ext
  645.     clc            ;clear carry
  646.     mov    ax,[bx+20]    ;sum
  647.     add    dused,ax    ;  up
  648.     mov    dx,[bx+22]    ;    file
  649.     adc    dused+2,dx    ;      sizes
  650.     call    v0        ;get sectors
  651.     add    sused,si    ;add to sum
  652.     test    sw,8        ;wide
  653.     jz    pf5        ;br no
  654.     test    sw1,1        ;option A
  655.     jz    pf3        ;br no
  656.     mov    si,[bx+24]    ;print
  657.     call    v3        ;  dir#
  658.     jmp    prtb        ;blank
  659. pf3:    test    byte ptr [bx+15],16 ;sub-dir
  660.     jz    pf4        ;br no
  661.     mov    dx,offset b8+2    ;print
  662.     jmp    prt        ;  blanks
  663. pf4:    call    v3        ;convert sectors
  664.     jmp    prtb        ;blank
  665. pf5:    test    byte ptr [bx+15],16 ;sub-dir
  666.     jz    pf6        ;br no
  667.     mov    dx,offset b8    ;print
  668.     call    prt        ;  blanks
  669.     jmp    pf7        ;skip size
  670. pf6:    push    bx        ;save reg
  671.     mov    si,[bx+20]    ;convert
  672.     mov    di,[bx+22]    ;  file
  673.     call    w0        ;    size
  674.     pop    bx        ;restore reg
  675. pf7:    call    prt2b        ;2 blank
  676.     mov    ax,[bx+18]    ;convert
  677.     call    x0        ;  date
  678.     call    prtb        ;blank
  679.     test    sw1,1        ;option A
  680.     jz    pf8        ;br no
  681.     mov    si,[bx+24]    ;print
  682.     call    v3        ;  dir#
  683.     jmp    prt2b        ;2 blanks
  684. pf8:    mov    ax,[bx+16]    ;convert
  685.     call    y0        ;  time
  686.     jmp    prt2b        ;2 blank
  687. ;
  688. ; convert bytes to sectors
  689. ;
  690. v0:    div    bpsc        ;bytes/sector
  691.     or    dx,dx        ;any remainder
  692.     jz    v1        ;br no
  693.     inc    ax        ;add 1 sector
  694. v1:    xor    dx,dx        ;clear reg
  695.     div    scpf        ;/ by sec/fat
  696.     or    dx,dx        ;any remainder
  697.     jz    v2        ;br no
  698.     inc    ax        ;add 1 fat
  699. v2:    mul    scpf        ;find no. of sectors
  700.     mov    si,ax        ;copy value
  701.     ret            ;return
  702. v3:    xor    di,di        ;clear reg
  703.     call    sum        ;convert to BCD
  704.     mov    cx,1410h    ;left zero supp. for 4 digits
  705.     mov    dl,al        ;convert
  706.     call    w3        ;  one digit
  707.     mov    ax,bx        ;convert
  708.     jmp    w1        ;  4 digits
  709. ;
  710. ; convert file size
  711. ;
  712. w0:    call    sum        ;convert to BCD
  713.     mov    cx,1710h    ;left zero supp. for 7 digits
  714.     call    w1        ;convert 4
  715.     mov    ax,bx        ;last 4
  716. w1:    push    ax        ;save reg
  717.     mov    dl,ah        ;convert
  718.     call    w2        ;  left 2
  719.     pop    dx        ;convert right 2
  720. w2:    mov    dh,dl        ;save right digit
  721.     shr    dl,1        ;shift
  722.     shr    dl,1        ;  over
  723.     shr    dl,1        ;    left
  724.     shr    dl,1        ;      digit
  725.     call    w3        ;print digit
  726.     mov    dl,dh        ;convert right digit
  727. w3:    and    dl,0fh        ;isolate digit
  728.     jz    w4        ;br if 0
  729.     mov    cl,0        ;kill zero suppress
  730. w4:    dec    ch        ;zero
  731.     and    cl,ch        ;  suppress
  732.     or    dl,'0'          ;convert to
  733.     sub    dl,cl        ;  digit
  734.     jnz    prtc        ;    or blank
  735. prt2b:    call    prtb        ;print 2 blanks
  736. prtb:    mov    dl,' '          ;print blank
  737. prtc:    mov    ah,2        ;print
  738.     int    21h        ;  char
  739.     ret            ;return
  740. ;
  741. ; convert to 8 BCD digits
  742. ;
  743. sum:    xor    ax,ax        ;clear
  744.     mov    bx,ax        ;  regs
  745.     mov    cx,32        ;set dble word shift
  746. sum1:    shl    si,1        ;shift
  747.     rcl    di,1        ;  dble word
  748.     xchg    bx,ax        ;double
  749.     call    sum2        ;  all
  750.     xchg    bx,ax        ;    and add
  751.     call    sum2        ;      in
  752.     loop    sum1        ;     bit
  753.     ret            ;return
  754. sum2:    adc    al,al        ;double
  755.     daa            ;  each
  756.     xchg    al,ah        ;    digit
  757.     adc    al,al        ;      in
  758.     daa            ;     word
  759.     xchg    al,ah        ;       accumulator
  760.     ret            ;return
  761. ;
  762. ; convert time
  763. ;
  764. y0:    mov    dx,offset b8+3    ;blanks
  765.     or    ax,ax        ;any time
  766.     jz    prt        ;br no
  767.     mov    si,offset tia    ;field start
  768.     push    ax        ;save time
  769.     and    ax,0f800h    ;isolate
  770.     mov    cl,11        ;  hours
  771.     call    x1        ;convert hours
  772.     pop    ax        ;restore time
  773.     and    ax,7e0h     ;isolate
  774.     mov    cl,5        ;  minutes
  775.     call    x1        ;convert minutes
  776.     mov    dx,offset tia    ;print
  777.     jmp    prt        ;  time
  778. ;
  779. ; convert date
  780. ;
  781. x0:    mov    dx,offset b8    ;blanks
  782.     or    ax,ax        ;is date 0
  783.     jz    prt        ;br yes
  784.     mov    si,offset mth    ;field start
  785.     push    ax        ;save date
  786.     and    ax,1e0h     ;isolate
  787.     mov    cl,5        ;  month
  788.     call    x1        ;convert
  789.     pop    ax        ;get and
  790.     push    ax        ;  save date
  791.     and    ax,1fh        ;convert
  792.     call    x2        ;  day
  793.     pop    ax        ;restore date
  794.     and    ax,0fe00h    ;isolate and
  795.     mov    cl,9        ;  position
  796.     shr    ax,cl        ;    year
  797.     add    ax,80        ;add 80
  798.     call    x2        ;convert year
  799.     mov    dx,offset mth    ;print
  800.     jmp    prt        ;  date
  801. x1:    shr    ax,cl        ;position
  802. x2:    aam            ;convert
  803.     or    ax,'00'         ;  2 digits
  804.     xchg    al,ah        ;add to
  805.     mov    [si],ax     ;  field
  806.     add    si,3        ;next field
  807.     ret            ;return
  808. ;
  809. ; check for end of page
  810. ;
  811. ckpg:    call    prtcr        ;print cr
  812. ckpg1:    test    sw,2        ;pause option
  813.     jz    fsp2        ;br no
  814.     dec    lct        ;decr line count
  815.     jnz    fsp2        ;br if not end of page
  816.     mov    lct,24        ;reset line count
  817.     mov    dx,offset wait    ;print
  818.     call    prt        ;  pause
  819.     mov    al,8        ;wait
  820.     mov    ah,0ch        ;  for
  821.     int    21h        ;    key
  822. prtcr:    mov    dx,offset cr    ;print cr
  823. prt:    mov    ah,9        ;print
  824.     int    21h        ;  routine
  825.     ret            ;return
  826. ;
  827. ; space for option F
  828. ;
  829. fsp:    mov    cx,colp     ;offset
  830.     jcxz    fsp2        ;  cols
  831. fsp1:    call    prtb        ;    for
  832.     loop    fsp1        ;      option
  833. fsp2:    ret            ;     F
  834. ;
  835. ; move directory file spec
  836. ;
  837. mvfs:    push    cx        ;save
  838.     push    si        ;  regs
  839.     mov    cx,4        ;move
  840.     mov    si,offset dfspc ;  file
  841.     repz movsb        ;    spec
  842.     pop    si        ;restore
  843.     pop    cx        ;  regs
  844.     ret            ;return
  845. ;
  846. ; match directory entry against specified filespec
  847. ;
  848. cknm:    cmp    byte ptr [di],'?' ;any char
  849.     je    cknm1        ;br yes
  850.     cmpsb            ;char match
  851.     je    cknm2        ;br yes
  852.     dec    word ptr ct    ;decr count
  853.     mov    di,bp        ;restore reg
  854.     ret            ;return
  855. cknm1:    cmpsb            ;step pointers
  856. cknm2:    loop    cknm        ;check next char
  857.     ret            ;return
  858. ;
  859. ; clear counters
  860. ;
  861. clear:    mov    cx,8        ;clear
  862.     mov    di,offset ct    ;  all
  863.     xor    ax,ax        ;    the
  864.     repz    stosw        ;      counters
  865.     ret            ;return
  866. ;
  867. ; work area
  868. ;
  869. nx    dw    tb        ;adr of table
  870. coln    dw    2        ;# of cols
  871. lct    dw    24        ;line count
  872. sw    db    0        ;options
  873. ;                   128-erase screen
  874. ;                    64-sort by size
  875. ;                    32-sort by date
  876. ;                    16-sort by file ext
  877. ;                     8-4 col. format
  878. ;                     4-no sort
  879. ;                     2-pause at page end
  880. ;                     1-indent
  881. sw1    db    0        ;options
  882. ;                   128-width 40 screen
  883. ;                    64-not used
  884. ;                    32-not used
  885. ;                    16-not used
  886. ;                     8-not used
  887. ;                     4-option T
  888. ;                     2-option F
  889. ;                     1-option A
  890. swn    db    'TFAESDXWNPI'   ;option letters
  891. blnk    db    '    '          ;blanks
  892. b8    db    '        $'
  893. wait    db    'more...$'
  894. max    db    'Max Stor$'
  895. h1    db    'SDL-3.0 $'
  896. h1evl    db    ' '
  897. mth    label    word
  898. mtha    db    '00/00/00 '
  899. ti    label    word
  900. tia    db    '00:00 Dr @$'
  901. h1a    db    '  Free Space: $'
  902. h1b    db    ' Bytes $'
  903. h1c    db    ' Sec.$'
  904. cr    db    13,10,'$'
  905. h1d    db    ' Files, $'
  906. h2    db    ' Filename.Ext   Bytes    Last Update   $'
  907. h3    db    'Sec.$'
  908. cdir    db    '<curr>$'
  909. dirm    db    'Date    Dir#  $Dir#'
  910. atr    db    1,'r',2,'h',4,'s',16,'\'
  911. init    db    0ffh,5 dup(0),8 ;dummy extended fcb
  912.     db    ' '             ;dummy fcb
  913.     db    11 dup('?')     ;default filespec
  914. dfspc    db    '*.*',0         ;read dir. filespec
  915. fspca    dw    path+2        ;fspec adr in path
  916. col    dw    1        ;col offset
  917. prvt    dw    0        ;prev tbl adr
  918. dirn    dw    0        ;dir no.
  919. colp    dw    0        ;opt F col spacing
  920. path    db    ' :\*.*',0      ;drive and root/filespec
  921. ; use equates to decrease the size of the COM module
  922. xpath    equ    $        ;64-path
  923. da    equ    $+64        ;21-DTA, DOS use
  924. daa    equ    da+21        ;1-file attributes
  925. das    equ    daa+1        ;8-file time, date, and size
  926. dan    equ    das+8        ;13-file name
  927. free    equ    dan+13        ;4-free space
  928. fcrm    equ    free+4        ;2-rem.-files/cols
  929. bpsc    equ    fcrm+2        ;2-bytes/sec
  930. scpf    equ    bpsc+2        ;2-sectors/fat
  931. ct    equ    scpf+2        ;2-file count
  932. dused    equ    ct+2        ;4-bytes used by files in dir.
  933. sused    equ    dused+4     ;2-sec used by files in dir.
  934. t4    equ    sused+2     ;6-4th, 3rd, 2nd chain
  935. t1    equ    t4+6        ;2-1st chain
  936. svvol    equ    t1+2        ;12-label save area
  937. dxfcb    equ    svvol+12    ;7-dummy extended fcb
  938. dfcb    equ    dxfcb+7     ;1-dummy fcb
  939. fspc    equ    dfcb+1        ;36-default filespec
  940. tb    equ    fspc+36     ;start of table
  941. ;   control: 2-not used   normal: 2-chain adr
  942. ;offset +2   2-fspec adr      12-filename.ext
  943. ;     4   2-column offset
  944. ;     6   2-prev. tbl adr
  945. ;     8   2-curr sub-dir adr
  946. ;    10   2-table end adr
  947. ;    12   2-not used
  948. ;    14   1-not used       1-end of filename ($)
  949. ;    15   1-attribute/switch   1-attribute/switch
  950. ;           8-control entry        8-control entry
  951. ;    16   2-not used       2-time
  952. ;    18   2-not used       2-date
  953. ;    20   4-not used       4-file size
  954. ;    24   2-not used       2-dir # (TA option)
  955. subp    endp
  956. sdlp    endp
  957. sdl    ends
  958.     end    bgn
  959.