home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / assemutl.zip / DISKDIRL.ASM < prev    next >
Assembly Source File  |  1984-07-31  |  18KB  |  455 lines

  1.           title DISKDIRL  -  DISKette DIRectory List    Ver 1.0
  2.           page  85,132
  3. ;
  4. code      segment
  5.           assume   cs:code,ds:code
  6. ;
  7.           org   100h
  8. begin:    jmp   starther
  9. ;
  10. version   db    0                  ;DOS Version flag
  11. defdrv    db    0                  ;Default drive address at entry
  12. numdrv    db    0                  ;Number of drives in the system
  13. drivemsg  db    13,10,'Enter drive to be listed  (Esc to end): $'
  14. errmsg1   db    13,10,'Invalid drive letter$'
  15. setprt    db    27,'0',27,'C',44,15,0  ;Set 1/8" 132 ch 44 ln condensed
  16. restprt   db    27,64,0            ;Restore printer to power up status
  17. restr     db    12,0               ;Printer "restore" forms command
  18. titlelen  equ   44                 ;Length of user inputed title line
  19. titlemsg  db    13,10,'Enter 44 char title: $'
  20. titlebuf  db    titlelen+1,0       ;Input buffer for user title
  21.           db    titlelen+1 dup (?)
  22. title1    db    6  dup (' ')       ;First title line
  23. titlelne  db    49 dup (' ')       ;Where user supplied title input goes
  24.           db    'Free: '
  25. freespc   db    10 dup (' ')       ;Formatted free space in title line
  26. month     db    '  /'              ;Date fields in title line
  27. day       db    '  /'
  28. year      db    '  ',0             ;End of title
  29. f10000    dw    10000              ;Conversion constants
  30. f1000     dw    1000,100,10
  31. extfcb    db    0ffh,5 dup (0),16h ;Extended FCB for read all entries
  32.           db    0,11 dup('?'),24 dup (?)
  33. stacknum  dw    0                  ;Count of entries in stack
  34. entryprt  db    0                  ;Number of entries printed
  35. lnecnt    db    0                  ;Line count of current entry
  36. work      db    7 dup (0),' ',0    ;Work buffer for file size
  37. leftbdr   db    '| ',0             ;Left border
  38. rightbdr  db    ' |'               ;*  Right border (includes CRLF)
  39. crlf      db    13,10,0            ;*  Carriage return + line feed
  40.           page
  41. starther  proc  near
  42.           mov   dx,offset setprt
  43.           call  prtstrng           ;Set printer with required options
  44.           mov   ah,30h
  45.           int   21h                ;Check DOS Version
  46.           or    al,al
  47.           jz    notver2            ;Version 1.x
  48.           dec   al                 ;Version 2.x
  49. notver2:  mov   version,al         ;Save DOS version flag
  50.           mov   ah,19h
  51.           int   21h                ;Get default drive
  52.           mov   defdrv,al          ;Save it
  53.           mov   dl,al
  54.           mov   ah,0eh
  55.           int   21h                ;Get number of drives
  56.           mov   numdrv,al          ;Save it
  57. ;
  58. ;         Start of main loop
  59. ;
  60. mainloop: mov   dx,offset drivemsg
  61.           mov   ah,9
  62.           int   21h                ;Prompt for drive for directory read
  63.           mov   ah,1
  64.           int   21h                ;Get user response
  65.           cmp   al,1bh             ;Check for exit (Esc char)
  66.           je    finished           ;We're done, so end program
  67.           or    al,' '             ;Force lower case
  68.           sub   al,'a'-1           ;Compute drive number (A = 0)
  69.           jnc   drvok              ;Check for valid drive
  70. msgerror: mov   dx,offset errmsg1  ;Invalid drive message
  71.           mov   ah,9
  72.           int   21h                ;Put out error message
  73.           jmp   mainloop
  74. finished: mov   dl,12
  75.           mov   ah,2
  76.           int   21h                ;Force page restore
  77.           mov   dl,defdrv          ;Load default drive at entry
  78.           mov   ah,0eh
  79.           int   21h                ;Restore default drive
  80.           test  entryprt,1         ;Were any entries printed ?
  81.           jz    norest             ;Skip if not
  82.           mov   dx,offset crlf
  83.           call  prtstrng           ;Restore page
  84. norest:   mov   dx,offset restprt
  85.           call  prtstrng           ;Reset printer
  86.           int   20h                ;Exit program
  87. drvok:    cmp   al,numdrv          ;Check for installed drive
  88.           ja    msgerror           ;Drive not installed
  89.           dec   al
  90.           mov   dl,al
  91.           mov   ah,0eh
  92.           int   21h                ;Make selected drive default
  93. ;
  94. ;         Get Title routine
  95. ;
  96.           mov   di,offset title1
  97.           mov   cx,55              ;Length to clear
  98.           mov   al,' '
  99.           rep   stosb              ;Clear title line
  100.           mov   dx,offset titlemsg
  101.           mov   ah,9
  102.           int   21h                ;Prompt for title
  103.           mov   dx,offset titlebuf
  104.           mov   ah,0ah
  105.           int   21h                ;Get title from user
  106.           mov   cl,titlebuf+1      ;Load length
  107.           xor   ch,ch
  108.           mov   si,offset titlebuf+2
  109.           mov   di,offset titlelne
  110.           rep   movsb              ;Move user title to title line
  111.           mov   ah,2ah
  112.           int   21h                ;Get today's date
  113.           sub   cx,1900            ;Convert to two digit year
  114.           mov   di,offset year
  115.           mov   al,cl
  116.           call  decimal            ;Fill in month/day/year on title line
  117.           mov   di,offset month
  118.           mov   al,dh
  119.           call  decimal
  120.           mov   di,offset day
  121.           mov   al,dl
  122.           call  decimal
  123. ;
  124. ;         Get Free Space routine
  125. ;
  126.           test  version,1          ;DOS version 2.x will supply that
  127.           jz    vers1x
  128.           xor   dl,dl              ;Set for default drive
  129.           mov   ah,36h
  130.           int   21h                ;Ver 2.x - get free space from DOS
  131.           mul   bx
  132.           mul   cx                 ;AX,DX contains bytes free
  133.           jmp   vers1x4            ;Enter common code
  134. vers1x:   push  ds
  135.           mov   ah,1bh
  136.           int   21h                ;Ver 1.x - get FAT
  137.           xor   ah,ah
  138.           xchg  cx,dx              ;CX has number of units
  139.           mul   dx                 ;Bytes/allocation unit
  140.           push  ax                 ;Save
  141.           xor   ax,ax
  142.           mov   si,2               ;First FAT entry
  143. vers1x1:  mov   di,si
  144.           shr   di,1
  145.           add   di,si              ;Compute 1 1/2 bytes
  146.           mov   di,word ptr [bx+di]  ;Load FAT entry
  147.           test  si,1               ;See if odd or even
  148.           jz    vers1x2
  149.           push  cx
  150.           mov   cl,4
  151.           shr   di,cl              ;Adjust for 12 bits
  152.           pop   cx
  153. vers1x2:  and   di,0fffh           ;Three nibbles
  154.           jnz   vers1x3            ;In use, so don't count
  155.           inc   ax
  156. vers1x3:  inc   si                 ;Step to next entry
  157.           loop  vers1x1            ;Loop through FAT
  158.           pop   cx                 ;Restore bytes/allocation unit
  159.           mul   cx                 ;Compute total free bytes
  160.           pop   ds                 ;Restore program seg reg
  161. vers1x4:  mov   di,offset freespc  ;Point to output area
  162.           call  convert            ;Convert size to ASCII
  163. ;
  164. ;         Load Directory Entries routine
  165. ;
  166.           mov   di,offset ptrtbl
  167.           xor   ax,ax
  168.           mov   cx,121
  169.           rep   stosw              ;Clear pointer table
  170.           mov   bx,offset ptrtbl   ;BX points to start of pointer list
  171.           mov   di,offset entries  ;DI points to start of entry stack
  172.           xor   cx,cx
  173.           mov   dx,offset extfcb
  174.           mov   ah,11h
  175. nxdirent: int   21h                ;Get next entry
  176.           or    al,al
  177.           jnz   sortdir
  178.           call  saventry           ;Stack entry
  179.           inc   cx                 ;Count entry
  180.           mov   dx,offset extfcb
  181.           mov   ah,12h
  182.           jmp   nxdirent
  183. ;
  184. ;         Sort Directory Entries routine
  185. ;
  186. sortdir:  mov   stacknum,cx        ;Save entry count
  187.           dec   cx
  188.           mov   si,offset ptrtbl   ;Point to first stack entry ptr
  189. sortdir1: mov   di,si
  190.           add   di,2               ;Set to "next" pointer
  191.           mov   dx,cx
  192.           push  cx
  193. sortdir2: push  si                 ;This compare forces short strings
  194.           push  di                 ;     low since they end with nuls
  195.           mov   cx,12              ;Max compare allowed
  196.           mov   si,word ptr [si]   ;Point to entry
  197.           mov   di,word ptr [di]   ;Point to other entry
  198.           rep   cmpsb              ;Compare strings
  199.           pop   di
  200.           pop   si
  201.           jbe   sortdir3           ;Ascending sequence, so no change
  202.           mov   ax,word ptr [si]
  203.           xchg  ax,word ptr [di]
  204.           mov   word ptr [si],ax   ;Exchange pointers
  205. sortdir3: add   di,2
  206.           dec   dl
  207.           jnz   sortdir2           ;Bubble through inner loop
  208.           pop   cx
  209.           add   si,2
  210.           loop  sortdir1           ;Bubble through outer loop
  211. ;
  212. ;         Have Listing Produced routine
  213. ;
  214.           inc   entryprt           ;Count numbers of prints
  215.           mov   ax,stacknum        ;Load entry count
  216.           add   ax,2               ;Round up before divide
  217.           mov   dh,3               ;Divide by num of entrys per line
  218.           div   dh
  219.           cbw
  220.           push  ax                 ;Entries per column count
  221.           mov   cx,33              ;Set body default line count
  222.           cmp   ax,cx              ;See if number of lines to print
  223.           jl    prtent2            ;    is greater than the default
  224.           mov   cx,ax
  225. prtent2:  mov   lnecnt,cl          ;Set new body line count
  226.           call  prtbordr           ;Do upper border
  227.           call  blanklne           ;Do a blank line
  228.           call  prtlbdr            ;Do left margin
  229.           mov   dx,offset title1
  230.           call  prtstrng           ;Output the title line
  231.           mov   cx,6               ;Add 6 extra blanks after date
  232.           call  prtblks
  233.           call  prtrbdr            ;Do right margin
  234.           call  blanklne           ;Another blank line
  235.           pop   cx
  236.           mov   bp,cx
  237.           shl   bp,1               ;BP has offset/col in ptr list
  238.           mov   si,offset ptrtbl   ;Point to start of ptr list
  239. prtent3:  call  prtlbdr            ;Do a left margin
  240.           mov   dl,3               ;Set inner loop count to columns
  241.           xor   bx,bx              ;Clear column offset reg
  242. prtent4:  call  prtentry           ;Print stack entry
  243.           add   bx,bp              ;Step to next column entry
  244.           dec   dl
  245.           jnz   prtent4            ;End of inner loop
  246.           call  prtrbdr            ;Do a right margin
  247.           add   si,2               ;Step to next ptr
  248.           dec   lnecnt             ;Decrement body line count
  249.           loop  prtent3            ;End of outer loop
  250.           mov   cl,lnecnt          ;Load remaining body lines
  251.           xor   ch,ch
  252.           jcxz  prtent6            ;All used
  253. prtent5:  call  blanklne           ;Fill out body lines
  254.           loop  prtent5
  255. prtent6:  call  prtbordr           ;Do bottom border
  256.           mov   dx,offset restr
  257.           call  prtstrng           ;Restore page
  258.           jmp   mainloop
  259. starther  endp
  260.           page
  261. decimal   proc  near               ;Converts AL to two decimal digits
  262.           aam                      ;Store it at SI
  263.           or    ax,'00'
  264.           xchg  al,ah
  265.           stosw                    ;Save in image
  266.           ret
  267. decimal   endp
  268. ;
  269. convert   proc  near               ;Convert 6 digits, zero surpressed
  270.           push  di                 ;Save pointer for later use
  271.           div   f10000             ;Result range 0-99
  272.           aam
  273.           or    ax,'00'            ;Make ASCII
  274.           xchg  ah,al
  275.           stosw                    ;Place in image
  276.           mov   cx,3               ;Convert last four digits
  277.           mov   si,offset f1000
  278. divloop:  mov   ax,dx              ;Remainder becomes dividend
  279.           xor   dx,dx
  280.           div   word ptr [si]      ;Power of 10 divide
  281.           or    al,'0'             ;Result range 0-9
  282.           stosb
  283.           add   si,2
  284.           loop  divloop
  285.           or    dl,'0'             ;Last digit in remainder
  286.           mov   al,dl
  287.           stosb
  288.           mov   cx,5               ;Now zero surpress 5 digits
  289.           pop   di
  290.           mov   al,' '
  291. padloop:  cmp   byte ptr [di],'0'
  292.           jnz   cnvtret            ;Conversion complete
  293.           stosb                    ;Replace leading zero with blank
  294.           loop  padloop
  295. cnvtret:  ret
  296. convert   endp
  297. ;
  298. saventry  proc  near
  299.           push  cx
  300.           mov   word ptr [bx],di   ;Save pointer to start of entry
  301.           add   bx,2               ;Step pointer table reg
  302.           push  di                 ;Save DI for now
  303.           mov   di,81h+7+8         ;Point pass end of DTA - file name
  304.           mov   cx,8
  305. savcmpfn: dec   di
  306.           cmp   byte ptr [di],' '  ;Look for last non-blank in name
  307.           loope savcmpfn
  308.           add   cx,1               ;Compensate for LOOPE
  309.           mov   si,81h+7           ;Point to beginning DTA - file name
  310.           pop   di
  311.           rep   movsb              ;Copy DTA - file name to 'entries:'
  312.           mov   si,89h+7           ;Point to DTA type field
  313.           cmp   byte ptr [si],' '
  314.           jz    savend             ;No file type
  315.           mov   byte ptr [di],'.'
  316.           inc   di
  317.           mov   cx,3
  318.           rep   movsb              ;Move type field to stack
  319. savend:   mov   byte ptr [di],0    ;Mark end of string
  320.           inc   di
  321.           mov   si,9dh+7           ;Point to size of file
  322.           mov   cx,4
  323.           rep   movsb              ;And save in stack
  324.           mov   si,99h+7           ;Point to last update date
  325.           movsw                    ;Save it in the stack
  326.           pop   cx
  327.           ret
  328. saventry  endp
  329. ;
  330. prtstrng  proc  near               ;This sub prints the string pointed
  331.           push  dx                 ;     to by the DX reg on entry.
  332.           push  si                 ;     The string is terminated by
  333.           mov   si,dx              ;     a nul byte.
  334.           mov   ah,5
  335. prtsloop: mov   dl,byte ptr [si]
  336.           or    dl,dl
  337.           jz    prtsend
  338.           int   21h
  339.           inc   si
  340.           jmp   prtsloop
  341. prtsend:  pop   si
  342.           pop   dx
  343.           ret
  344. prtstrng  endp
  345. ;
  346. prtentry  proc  near               ;Print one stack entry
  347.           push  bx
  348.           push  cx
  349.           push  dx
  350.           mov   cx,12
  351.           mov   di,word ptr [si+bx]  ;DI points to stack entry
  352.           or    di,di
  353.           jz    prtenty4
  354.           mov   ah,5
  355. prtenty1: mov   dl,byte ptr [di]   ;Print to the end of the name/type
  356.           or    dl,dl              ;    entry blanking remainder of 12
  357.           jz    prtenty5           ;    character field
  358.           int   21h
  359.           inc   di
  360.           loop  prtenty1
  361. prtenty2: inc   di
  362.           mov   ax,word ptr[di]    ;Load file size
  363.           mov   dx,word ptr[di+2]
  364.           mov   bx,word ptr[di+4]  ;Load file last update date
  365.           push  si
  366.           mov   di,offset work
  367.           call  convert            ;Convert size to ASCII decimal
  368.           pop   si
  369.           mov   dx,offset work
  370.           call  prtstrng           ;One blank between fields
  371.           mov   ax,bx              ;Save last update date data
  372.           mov   cl,1+8             ;Shift year in bottom part of reg
  373.           shr   ax,cl
  374.           add   ax,80              ;Format in year-1980, correct for it
  375.           mov   di,offset year
  376.           call  decimal            ;Make year printable
  377.           mov   ax,bx              ;Now do month
  378.           mov   cl,5
  379.           shr   ax,cl
  380.           and   ax,000fh           ;Reg now has month in it
  381.           mov   di,offset month
  382.           call  decimal
  383.           mov   ax,bx              ;Finally do day
  384.           and   ax,001fh
  385.           mov   di,offset day
  386.           call  decimal
  387.           mov   dx,offset month-1  ;Use date starting with a blank
  388.           call  prtstrng           ;Go print it
  389. prtenty3: pop   dx
  390.           push  dx                 ;Reload entry value
  391.           dec   dl
  392.           jz    prteend            ;If last column, don't space over
  393.           mov   cx,2
  394.           call  prtblks            ;Two blanks between columns
  395. prteend:  pop   dx
  396.           pop   cx
  397.           pop   bx
  398.           ret
  399. prtenty4: mov   cx,27              ;No entry, so blank entire column
  400.           call  prtblks
  401.           jmp   prtenty3
  402. prtenty5: call  prtblks            ;Blanks remainder of name/type field
  403.           jmp   prtenty2
  404. prtentry  endp
  405. ;
  406. blanklne  proc  near
  407.           push  cx
  408.           call  prtlbdr            ;Output a bordered blank line
  409.           mov   cx,85
  410.           call  prtblks            ;Go clear line
  411.           call  prtrbdr            ;Print right margin
  412.           pop   cx
  413.           ret
  414. blanklne  endp
  415. ;
  416. prtbordr  proc  near
  417.           mov   cx,89
  418.           mov   dl,'-'
  419.           call  prtblk1            ;Output a top or bottom border
  420.           mov   dx,offset crlf
  421.           call  prtstrng
  422.           ret
  423. prtbordr  endp
  424. ;
  425. prtlbdr   proc  near               ;Outputs "|  "
  426.           push  dx
  427.           mov   dx,offset leftbdr
  428.           call  prtstrng
  429.           pop   dx
  430.           ret
  431. prtlbdr   endp
  432. ;
  433. prtrbdr   proc  near               ;Outputs "  |CRLF"
  434.           push  dx
  435.           mov   dx,offset rightbdr
  436.           call  prtstrng
  437.           pop   dx
  438.           ret
  439. prtrbdr   endp
  440. ;
  441. prtblks   proc  near               ;Outputs CX blanks to the printer
  442.           mov   dl,' '
  443. prtblk1:  mov   ah,5               ;Outputs DL char CX times
  444. prtbloop: int   21h
  445.           loop  prtbloop
  446.           ret
  447. prtblks   endp
  448. ;
  449. ptrtbl    dw    0                  ;Pointer list
  450. entries   equ   ptrtbl+121*2       ;Start of entry stack
  451. ;
  452. code      ends
  453. ;
  454.           end   begin
  455.