home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix CD 2.0
/
Phoenix_CD.cdr
/
11a
/
cover20.zip
/
COFREE.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-01-21
|
3KB
|
130 lines
PAGE ,132
TITLE COFREE - Diskette contents list - Get Free Space
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 EXTND:BYTE, ATRB:BYTE
EXTRN VERS:BYTE, FREE:BYTE
EXTRN VOLUME:BYTE
X10000 DW 10000 ; Conversion constants
X1000 DW 1000,100,10
;
PUBLIC GETFRE
GETFRE PROC NEAR
TEST VERS,1
JZ VERS1 ; Jump if DOS 1.x
MOV AL,' '
MOV CX,11
MOV DI,OFFSET VOLUME
REP STOSB ; Clear volume label area
MOV DX,OFFSET EXTND
MOV ATRB,08H ; Set to search for volume label
MOV AH,11H
INT 21H
CMP AL,0FFH
JE SHORT SPACE ; No volume, just fetch space
MOV SI,88H ; Volume label in DTA
MOV DI,OFFSET VOLUME
MOV CX,11
REP MOVSB ; Move to label field
SPACE: XOR DL,DL ; Set for default drive
MOV AH,36H
INT 21H ; DOS 2.0 - get free space
MUL BX
MUL CX ; AX, DX contain bytes free
JMP VCOM ; Enter common code
;
VERS1: PUSH DS
MOV AH,1BH
INT 21H ; DOS 1.x - get FAT
XOR AH,AH
XCHG CX,DX ; CX has number of items in FAT
MUL DX ; Bytes / allocation unit
PUSH AX ; Save
XOR AX,AX ; Counter for free units
MOV SI,2 ; First FAT entry
FAT2: MOV DI,SI
SHR DI,1
ADD DI,SI ; Multiply by 1 1/2
MOV DI,WORD PTR [BX+DI] ; Load FAT entry
TEST SI,1
JZ FAT3 ; Even entry
SHR DI,1
SHR DI,1 ; Odd, 12 bits on left, shift right
SHR DI,1
SHR DI,1
FAT3: AND DI,0FFFH ; Isolate three nibbles
JNZ FAT4 ; In use, don't count
INC AX
FAT4: INC SI ; Step to next entry
LOOP FAT2
POP CX ; Recall bytes / allocation unit
MUL CX ; Compute total free bytes
POP DS ; Restore program seg reg
VCOM: MOV DI,OFFSET FREE
CALL CONVRT ; Size to ASCII, put to output (DI)
RET
GETFRE ENDP
;
PUBLIC CONVRT
CONVRT PROC NEAR ; Converts 8 digits, zero suppressed
PUSH DI
DIV X10000 ; Result 0-99
PUSH DX ; Save remainder
XOR DX,DX
DIV X1000+2 ; Result up to 4 digits
AAM
OR AX,'00' ; Make ASCII
XCHG AH,AL
STOSW ; Place into title image
MOV AX,DX ; Interim remainder to process
AAM
OR AX,'00'
XCHG AH,AL
STOSW
MOV CX,3 ; Three powers of 10 to go
MOV SI,OFFSET X1000
POP DX ; Remainder from stack
DIVLP: MOV AX,DX
XOR DX,DX
DIV WORD PTR [SI] ; Power of 10 divide
OR AL,'0' ; Result range 0-9
STOSB
ADD SI,2
LOOP DIVLP
OR DL,'0' ; Last digit in remainder
MOV AL,DL
STOSB
MOV CX,7 ; Zero suppress 7 digits
POP DI
MOV AL,' '
SUPLP: CMP BYTE PTR [DI],'0'
JNZ DNECVT ; Conversion complete
STOSB
LOOP SUPLP
DNECVT: RET
CONVRT ENDP
;
CODE ENDS
;
END
Ü