home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 11a / cover20.zip / COPRNT.ASM < prev    next >
Assembly Source File  |  1991-01-21  |  7KB  |  297 lines

  1.     PAGE    ,132
  2.     TITLE    COPRNT  -  Diskette contents list  -  Print Cover Sheet
  3.     COMMENT        * Version 1.0  -  June 1983
  4.             (PER Dr. Dobbs Journal, January, 1984, #87)
  5.             (Dan Daetwyler "Sorted Diskette Directory for
  6.                  the IBM PC")
  7.  
  8.         Version 2.0       Bruce F. Cameron
  9.                   Cincinnati  OH 
  10.  
  11.            February 25, 1985
  12.  
  13.     Counts hidden files
  14.     Grouped sort (i.e. all COM files first etc.)
  15.     Includes Volume Label and Directory (if not root)
  16.     Lists Subdirectory names
  17.     Free space up to 100M (hard disk)  *
  18. ;
  19. ;
  20.     PAGE    82
  21. ;
  22. CODE    SEGMENT    PARA PUBLIC 'CODE'
  23.     ASSUME    CS:CODE, DS:CODE
  24. ;
  25.     EXTRN    PNTR:WORD, STKCNT:WORD, TITLX:BYTE, HIDNFL:BYTE
  26.     EXTRN    VOLUME:BYTE, VERS:BYTE, ATRB:BYTE
  27. ;
  28.     EXTRN    CONVRT:NEAR, DECMAL:NEAR, SCAN:NEAR, SORT:NEAR
  29. ;
  30.     PUBLIC    PSX, RESTR
  31. RECURF    DB    0            ; Recursion flag
  32. PSX    DB    0            ; Pass counter
  33. RESTR    DB    12,0            ; Printer 'restore' forms
  34. DBUF    DB    9 DUP (0)        ; Work buffer for file size
  35. HIDF    DB    'Hidden files  ',0
  36. VOL    DB    'Volume  ',0
  37. PATH    DB    64 DUP (' '),0        ; PATH buffer
  38. PATHMS    DB    'Directory: ',0
  39. DIR    DB    ' <DIR> ',0
  40. DBLK    DB    '  ',0            ; Double blank between columns
  41. LFTB    DB    '|  ',0            ; Left border
  42. RGTB    DB    '  |'            ; Right border (include CR/LF)
  43. CRLF    DB    13,10,0
  44. BCNT    DB    0            ; Body line counter
  45. ;
  46.     PUBLIC    PRINT
  47. PRINT    PROC    NEAR
  48.     TEST    RECURF,1
  49.     JNZ    PAS21
  50.     INC    PSX            ; Count number of prints
  51.     MOV    BCNT,33            ; Set body line counter
  52. PAS21:    MOV    AX,STKCNT        ; Load entry count
  53.     MOV    DH,4
  54.     DIV    DH            ; Divide by number of columns
  55.     OR    AH,AH
  56.     JZ    SETCNT            ; Evenly divisible
  57.     INC    AL            ; Ragged edge
  58.     CBW
  59. SETCNT:    PUSH    AX            ; Entries per column count
  60.     TEST    RECURF,1
  61.     JNZ    PAS22
  62.     CALL    DOBRDR            ; Do upper border
  63.     CALL    DOBLNE            ;   and a blank line
  64.     CALL    DOLFTM            ; Do left margin
  65.     MOV    DX,OFFSET TITLX
  66.     CALL    DOPRT            ; Output the title line
  67.     MOV    CX,4
  68.     CALL    CLER            ; Add 4 spaces
  69.     CALL    DORGTM            ; Do right margin
  70.     TEST    VERS,1
  71.     JZ    NDOS2            ; Jump if not DOS 2.x
  72.     CALL    PRVLD
  73. NDOS2:    CALL    DOBLNE            ;   another blank line
  74. PAS22    EQU    NDOS2
  75.     POP    CX
  76.     JCXZ    NONE            ; No items, continue
  77.     MOV    BP,CX
  78.     SHL    BP,1            ; Offset per column in pointer list
  79.     MOV    SI,OFFSET PNTR        ; Point to start of pointer list
  80. OTLP:    CALL    DOLFTM            ; Do a left margin
  81.     MOV    DL,4            ; Set inner loop count to column #
  82.     XOR    BX,BX            ; Clear column offset reg
  83. INLP:    CALL    PRTENT            ; Print stack entry
  84.     ADD    BX,BP            ; Step to next column entry
  85.     DEC    DL
  86.     JNZ    INLP            ; End of inner loop
  87.     CALL    DORGTM            ; Do a right margin
  88.     ADD    SI,2            ; Step to next pointer
  89.     DEC    BCNT            ; Decrement body line count
  90.     LOOP    OTLP            ; End of outer loop
  91. ;
  92. ;
  93. NONE:    TEST    RECURF,1
  94.     JZ    PAS23
  95.     MOV    RECURF,0        ; Reset flag
  96.     RET                ; Return from inner call
  97. ;
  98. ;
  99. PAS23:    MOV    RECURF,1        ; Set flag, recursive call
  100.     DEC    BCNT            ;   for the extra blank line
  101.     MOV    ATRB,010H        ; Set for subdirectory search
  102.     CALL    SCAN
  103.     CALL    SORT
  104.     CALL    PRINT            ; Print directories
  105. ;
  106. ;
  107.     XOR    AL,AL
  108.     OR    AL,HIDNFL        ; Check for any hidden files
  109.     JZ    BLNK            ; No
  110.     CALL    PRHID            ; Print hidden files count,
  111.     SUB    BCNT,2            ;    uses two lines
  112. BLNK:    MOV    CL,BCNT            ; Load remaining body lines
  113.     XOR    CH,CH
  114.     JCXZ    NOFILL            ; All used
  115. FILL:    CALL    DOBLNE            ; Fill out body lines
  116.     LOOP    FILL
  117. NOFILL:    CALL    DOBRDR            ; Do bottom border
  118.     MOV    DX,OFFSET RESTR
  119.     CALL    DOPRT            ; Restore page
  120.     RET
  121. PRINT    ENDP
  122. ;
  123.     PUBLIC    DOPRT
  124. DOPRT    PROC    NEAR            ; This subroutine prints string
  125.     PUSH    DX            ;  (pointer in DX on entry).
  126.     PUSH    SI            ; String terminated by a null byte
  127.     MOV    SI,DX
  128.     MOV    AH,5            ; Print line function
  129. DPLP:    MOV    DL,BYTE PTR [SI]
  130.     OR    DL,DL
  131.     JZ    PRTEND
  132.     INT    21H
  133.     INC    SI
  134.     JMP    DPLP
  135. PRTEND:    POP    SI
  136.     POP    DX
  137.     RET
  138. DOPRT    ENDP
  139. ;
  140. PRTENT    PROC    NEAR            ; Print one stack entry
  141.     PUSH    CX
  142.     PUSH    DX
  143.     MOV    CX,12
  144.     MOV    DI,WORD PTR [SI+BX]    ; DI points to stack entry
  145.     OR    DI,DI            ; If entry is zero, blank space
  146.     JZ    BLNK1
  147.     INC    DI            ; Step over reorder character
  148.     MOV    AH,5
  149. PELP:    MOV    DL,BYTE PTR [DI]    ; Print to the end of the
  150.     OR    DL,DL            ;   name/type entry
  151.     JZ    BLNK2            ;   blank rest of 12 chars
  152.     INT    21H
  153.     INC    DI
  154.     LOOP    PELP
  155. BACK:    TEST    RECURF,1
  156.     JZ    PAS24            ; To get file size
  157.     MOV    DX,OFFSET DIR
  158.     JMP    SHORT PAS25        ; Just print <DIR>
  159. PAS24:    MOV    CX,1
  160.     CALL    CLER            ; Insert 1 space
  161.     INC    DI
  162.     MOV    AX,WORD PTR [DI]    ; Load file size
  163.     MOV    DX,WORD PTR [DI+2]
  164.     PUSH    SI
  165.     MOV    DI,OFFSET DBUF
  166.     CALL    CONVRT            ; Size to ASCII
  167.     POP    SI
  168.     MOV    DX,OFFSET DBUF+2    ; Print 7 characters
  169. PAS25:    CALL    DOPRT            ; Print [size / label]
  170. GONE:    POP    DX
  171.     PUSH    DX            ; Reload entry value
  172.     DEC    DL
  173.     JZ    PUNT            ; If last column don't space over
  174.     MOV    DX,OFFSET DBLK
  175.     CALL    DOPRT            ; Print 2 blanks between cols
  176. PUNT:    POP    DX
  177.     POP    CX
  178.     RET
  179. BLNK1:    MOV    CX,19            ; No entry, blank entire column
  180.     CALL    CLER
  181.     JMP    GONE
  182. BLNK2:    CALL    CLER            ; Blank remainder of field
  183.     JMP    BACK
  184. PRTENT    ENDP
  185. ;
  186. PRHID    PROC    NEAR
  187.     CALL    DOBLNE            ; Blank line
  188.     CALL    DOLFTM            ; Left margin
  189.     MOV    CX,20            ; Twenty blanks
  190.     CALL    CLER
  191.     MOV    DX,OFFSET HIDF
  192.     CALL    DOPRT            ; Text
  193.     MOV    AL,HIDNFL
  194.     MOV    DI,OFFSET HIDNFL
  195.     MOV    DX,DI            ; Set address for print (below)
  196.     CALL    DECMAL            ; Number of files to ASCII
  197.     CMP    HIDNFL,'0'
  198.     JNE    TWOCH
  199.     MOV    HIDNFL,' '        ; Zero suppress
  200. TWOCH:    CALL    DOPRT
  201.     MOV    CX,46
  202.     CALL    CLER            ; Fill with blanks
  203.     CALL    DORGTM            ; Right margin
  204.     RET
  205. PRHID    ENDP
  206. ;
  207. PRVLD    PROC    NEAR
  208.     PUSH    SI
  209.     MOV    AL,VOLUME
  210.     CMP    AL,' '
  211.     JE    NOVOL            ; No volume label
  212.     CALL    DOLFTM
  213.     MOV    CX,10
  214.     CALL    CLER            ; Offset printing
  215.     MOV    DX,OFFSET VOL
  216.     CALL    DOPRT
  217.     MOV    DX,OFFSET VOLUME
  218.     CALL    DOPRT            ; Print volume label
  219.     MOV    CX,53
  220.     CALL    CLER            ; Fill with blanks
  221.     CALL    DORGTM
  222.     SUB    BCNT,1            ; Decrement line count
  223. NOVOL:    MOV    AH,047H
  224.     MOV    SI,OFFSET PATH
  225.     MOV    DL,0            ; Default drive
  226.     INT    21H            ; Fetch path, current directory
  227.     MOV    DL,BYTE PTR [SI]
  228.     OR    DL,DL            ; Zero if root directory
  229.     JZ    ENDVL            ;    don't print
  230.     CALL    DOLFTM
  231.     MOV    CX,4
  232.     CALL    CLER            ; Offset
  233.     MOV    DX,OFFSET PATHMS
  234.     CALL    DOPRT
  235.     MOV    AH,5            ; Print character function
  236.     MOV    CX,67
  237.     MOV    SI,OFFSET PATH
  238. PTH:    MOV    DL,BYTE PTR [SI]    ; Fetch character
  239.     OR    DL,DL
  240.     JZ    BLNK3            ; End of PATH string
  241.     INT    21H
  242.     INC    SI
  243.     LOOP    PTH
  244. BLNK3:    CALL    CLER            ; Blanks to end of line
  245.     CALL    DORGTM
  246.     SUB    BCNT,1
  247. ENDVL:    POP    SI
  248.     RET
  249. PRVLD    ENDP
  250. ;
  251. DOBLNE    PROC    NEAR
  252.     PUSH    CX
  253.     CALL    DOLFTM            ; Output a bordered blank line
  254.     MOV    CX,82
  255.     CALL    CLER
  256.     CALL    DORGTM
  257.     POP    CX
  258.     RET
  259. DOBLNE    ENDP
  260. ;
  261. DOBRDR    PROC    NEAR
  262.     MOV    CX,88
  263.     MOV    DL,'-'
  264.     CALL    DLFIL            ; Output a top or bottom border
  265.     MOV    DX,OFFSET CRLF
  266.     CALL    DOPRT
  267.     RET
  268. DOBRDR    ENDP
  269. ;
  270. DOLFTM    PROC    NEAR            ; Output "|  "
  271.     PUSH    DX
  272.     MOV    DX,OFFSET LFTB
  273.     CALL    DOPRT
  274.     POP    DX
  275.     RET
  276. DOLFTM    ENDP
  277. ;
  278. DORGTM    PROC    NEAR            ; Output "  |"
  279.     PUSH    DX
  280.     MOV    DX,OFFSET RGTB
  281.     CALL    DOPRT
  282.     POP    DX
  283.     RET
  284. DORGTM    ENDP
  285. ;
  286. CLER    PROC    NEAR            ; Output CX blanks
  287.     MOV    DL,' '
  288. DLFIL:    MOV    AH,5            ; Output DL character CX times
  289. CLRLP:    INT    21H
  290.     LOOP    CLRLP
  291.     RET
  292. CLER    ENDP
  293. ;
  294. CODE    ENDS
  295. ;
  296.     END
  297.