home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix CD 2.0
/
Phoenix_CD.cdr
/
11a
/
cover20.zip
/
COPRNT.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-01-21
|
7KB
|
297 lines
PAGE ,132
TITLE COPRNT - Diskette contents list - Print Cover Sheet
COMMENT * Version 1.0 - June 1983
(PER Dr. Dobbs Journal, January, 1984, #87)
(Dan Daetwyler "Sorted Diskette Directory for
the IBM PC")
Version 2.0 Bruce F. Cameron
Cincinnati OH
February 25, 1985
Counts hidden files
Grouped sort (i.e. all COM files first etc.)
Includes Volume Label and Directory (if not root)
Lists Subdirectory names
Free space up to 100M (hard disk) *
;
;
PAGE 82
;
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE, DS:CODE
;
EXTRN PNTR:WORD, STKCNT:WORD, TITLX:BYTE, HIDNFL:BYTE
EXTRN VOLUME:BYTE, VERS:BYTE, ATRB:BYTE
;
EXTRN CONVRT:NEAR, DECMAL:NEAR, SCAN:NEAR, SORT:NEAR
;
PUBLIC PSX, RESTR
RECURF DB 0 ; Recursion flag
PSX DB 0 ; Pass counter
RESTR DB 12,0 ; Printer 'restore' forms
DBUF DB 9 DUP (0) ; Work buffer for file size
HIDF DB 'Hidden files ',0
VOL DB 'Volume ',0
PATH DB 64 DUP (' '),0 ; PATH buffer
PATHMS DB 'Directory: ',0
DIR DB ' <DIR> ',0
DBLK DB ' ',0 ; Double blank between columns
LFTB DB '| ',0 ; Left border
RGTB DB ' |' ; Right border (include CR/LF)
CRLF DB 13,10,0
BCNT DB 0 ; Body line counter
;
PUBLIC PRINT
PRINT PROC NEAR
TEST RECURF,1
JNZ PAS21
INC PSX ; Count number of prints
MOV BCNT,33 ; Set body line counter
PAS21: MOV AX,STKCNT ; Load entry count
MOV DH,4
DIV DH ; Divide by number of columns
OR AH,AH
JZ SETCNT ; Evenly divisible
INC AL ; Ragged edge
CBW
SETCNT: PUSH AX ; Entries per column count
TEST RECURF,1
JNZ PAS22
CALL DOBRDR ; Do upper border
CALL DOBLNE ; and a blank line
CALL DOLFTM ; Do left margin
MOV DX,OFFSET TITLX
CALL DOPRT ; Output the title line
MOV CX,4
CALL CLER ; Add 4 spaces
CALL DORGTM ; Do right margin
TEST VERS,1
JZ NDOS2 ; Jump if not DOS 2.x
CALL PRVLD
NDOS2: CALL DOBLNE ; another blank line
PAS22 EQU NDOS2
POP CX
JCXZ NONE ; No items, continue
MOV BP,CX
SHL BP,1 ; Offset per column in pointer list
MOV SI,OFFSET PNTR ; Point to start of pointer list
OTLP: CALL DOLFTM ; Do a left margin
MOV DL,4 ; Set inner loop count to column #
XOR BX,BX ; Clear column offset reg
INLP: CALL PRTENT ; Print stack entry
ADD BX,BP ; Step to next column entry
DEC DL
JNZ INLP ; End of inner loop
CALL DORGTM ; Do a right margin
ADD SI,2 ; Step to next pointer
DEC BCNT ; Decrement body line count
LOOP OTLP ; End of outer loop
;
;
NONE: TEST RECURF,1
JZ PAS23
MOV RECURF,0 ; Reset flag
RET ; Return from inner call
;
;
PAS23: MOV RECURF,1 ; Set flag, recursive call
DEC BCNT ; for the extra blank line
MOV ATRB,010H ; Set for subdirectory search
CALL SCAN
CALL SORT
CALL PRINT ; Print directories
;
;
XOR AL,AL
OR AL,HIDNFL ; Check for any hidden files
JZ BLNK ; No
CALL PRHID ; Print hidden files count,
SUB BCNT,2 ; uses two lines
BLNK: MOV CL,BCNT ; Load remaining body lines
XOR CH,CH
JCXZ NOFILL ; All used
FILL: CALL DOBLNE ; Fill out body lines
LOOP FILL
NOFILL: CALL DOBRDR ; Do bottom border
MOV DX,OFFSET RESTR
CALL DOPRT ; Restore page
RET
PRINT ENDP
;
PUBLIC DOPRT
DOPRT PROC NEAR ; This subroutine prints string
PUSH DX ; (pointer in DX on entry).
PUSH SI ; String terminated by a null byte
MOV SI,DX
MOV AH,5 ; Print line function
DPLP: MOV DL,BYTE PTR [SI]
OR DL,DL
JZ PRTEND
INT 21H
INC SI
JMP DPLP
PRTEND: POP SI
POP DX
RET
DOPRT ENDP
;
PRTENT PROC NEAR ; Print one stack entry
PUSH CX
PUSH DX
MOV CX,12
MOV DI,WORD PTR [SI+BX] ; DI points to stack entry
OR DI,DI ; If entry is zero, blank space
JZ BLNK1
INC DI ; Step over reorder character
MOV AH,5
PELP: MOV DL,BYTE PTR [DI] ; Print to the end of the
OR DL,DL ; name/type entry
JZ BLNK2 ; blank rest of 12 chars
INT 21H
INC DI
LOOP PELP
BACK: TEST RECURF,1
JZ PAS24 ; To get file size
MOV DX,OFFSET DIR
JMP SHORT PAS25 ; Just print <DIR>
PAS24: MOV CX,1
CALL CLER ; Insert 1 space
INC DI
MOV AX,WORD PTR [DI] ; Load file size
MOV DX,WORD PTR [DI+2]
PUSH SI
MOV DI,OFFSET DBUF
CALL CONVRT ; Size to ASCII
POP SI
MOV DX,OFFSET DBUF+2 ; Print 7 characters
PAS25: CALL DOPRT ; Print [size / label]
GONE: POP DX
PUSH DX ; Reload entry value
DEC DL
JZ PUNT ; If last column don't space over
MOV DX,OFFSET DBLK
CALL DOPRT ; Print 2 blanks between cols
PUNT: POP DX
POP CX
RET
BLNK1: MOV CX,19 ; No entry, blank entire column
CALL CLER
JMP GONE
BLNK2: CALL CLER ; Blank remainder of field
JMP BACK
PRTENT ENDP
;
PRHID PROC NEAR
CALL DOBLNE ; Blank line
CALL DOLFTM ; Left margin
MOV CX,20 ; Twenty blanks
CALL CLER
MOV DX,OFFSET HIDF
CALL DOPRT ; Text
MOV AL,HIDNFL
MOV DI,OFFSET HIDNFL
MOV DX,DI ; Set address for print (below)
CALL DECMAL ; Number of files to ASCII
CMP HIDNFL,'0'
JNE TWOCH
MOV HIDNFL,' ' ; Zero suppress
TWOCH: CALL DOPRT
MOV CX,46
CALL CLER ; Fill with blanks
CALL DORGTM ; Right margin
RET
PRHID ENDP
;
PRVLD PROC NEAR
PUSH SI
MOV AL,VOLUME
CMP AL,' '
JE NOVOL ; No volume label
CALL DOLFTM
MOV CX,10
CALL CLER ; Offset printing
MOV DX,OFFSET VOL
CALL DOPRT
MOV DX,OFFSET VOLUME
CALL DOPRT ; Print volume label
MOV CX,53
CALL CLER ; Fill with blanks
CALL DORGTM
SUB BCNT,1 ; Decrement line count
NOVOL: MOV AH,047H
MOV SI,OFFSET PATH
MOV DL,0 ; Default drive
INT 21H ; Fetch path, current directory
MOV DL,BYTE PTR [SI]
OR DL,DL ; Zero if root directory
JZ ENDVL ; don't print
CALL DOLFTM
MOV CX,4
CALL CLER ; Offset
MOV DX,OFFSET PATHMS
CALL DOPRT
MOV AH,5 ; Print character function
MOV CX,67
MOV SI,OFFSET PATH
PTH: MOV DL,BYTE PTR [SI] ; Fetch character
OR DL,DL
JZ BLNK3 ; End of PATH string
INT 21H
INC SI
LOOP PTH
BLNK3: CALL CLER ; Blanks to end of line
CALL DORGTM
SUB BCNT,1
ENDVL: POP SI
RET
PRVLD ENDP
;
DOBLNE PROC NEAR
PUSH CX
CALL DOLFTM ; Output a bordered blank line
MOV CX,82
CALL CLER
CALL DORGTM
POP CX
RET
DOBLNE ENDP
;
DOBRDR PROC NEAR
MOV CX,88
MOV DL,'-'
CALL DLFIL ; Output a top or bottom border
MOV DX,OFFSET CRLF
CALL DOPRT
RET
DOBRDR ENDP
;
DOLFTM PROC NEAR ; Output "| "
PUSH DX
MOV DX,OFFSET LFTB
CALL DOPRT
POP DX
RET
DOLFTM ENDP
;
DORGTM PROC NEAR ; Output " |"
PUSH DX
MOV DX,OFFSET RGTB
CALL DOPRT
POP DX
RET
DORGTM ENDP
;
CLER PROC NEAR ; Output CX blanks
MOV DL,' '
DLFIL: MOV AH,5 ; Output DL character CX times
CLRLP: INT 21H
LOOP CLRLP
RET
CLER ENDP
;
CODE ENDS
;
END