	TITLE	COFREE	- Diskette Contents List - Get Free Space
	SUBTTL	Version	1.0 - June 1983
	PAGE	81,132
;
CODE	SEGMENT	PARA PUBLIC 'CODE'
	ASSUME	CS:CODE,DS:CODE
;
	EXTRN	VERS:BYTE,FREE:BYTE
X10000	DW	10000			;Conversion constants
X1000	DW	1000,100,10
;
	PUBLIC	GETFRE
GETFRE	PROC	NEAR
	TEST	VERS,1
	JZ	VERS1
	XOR	DL,DL			;Set for default drive
	MOV	AH,36H
	INT	21H			;v2.0 -	get free space
	MUL	BX
	MUL	CX			;AX,DX contains	bytes free
	JMP	VCOM			;Enter common code
VERS1:	PUSH	DS
	MOV	AH,1BH
	INT	21H			;v1.x -	get FAT
	XOR	AH,AH
	XCHG	CX,DX			;CX has	number of units
	MUL	DX			;Bytes/allocation unit
	PUSH	AX			;Save
	XOR	AX,AX
	MOV	SI,2			;First FAT entry
FAT2:	MOV	DI,SI
	SHR	DI,1
	ADD	DI,SI			;Compute 1 1/2 bytes
	MOV	DI,WORD	PTR [BX+DI]	;Load FAT entry
	TEST	SI,1			;See if	odd or even
	JZ	FAT3
	SHR	DI,1
	SHR	DI,1
	SHR	DI,1			;Adjust	for 12 bits
	SHR	DI,1
FAT3:	AND	DI,0FFFH		;Three nibbles
	JNZ	FAT4			;In use, so don't count
	INC	AX
FAT4:	INC	SI			;Step to next entry
	LOOP	FAT2			;Loop through FAT
	POP	CX			;Restore bytes/allocation unit
	MUL	CX			;Compute total free bytes
	POP	DS			;Restore program seg reg
VCOM:	MOV	DI,OFFSET FREE		;Point to output area
	CALL	CONVRT			;Convert size to ASCII
	RET
GETFRE	ENDP
;
	PUBLIC	CONVRT
CONVRT	PROC	NEAR			;Converts 6 digits, zero surpressed
	PUSH	DI			;Save pointer for later	use
	DIV	X10000			;Result	range 0-99
	AAM
	OR	AX,'00'			;Make ASCII
	XCHG	AH,AL
	STOSW				;Place in image
	MOV	CX,3			;Convert last four digits
	MOV	SI,OFFSET X1000
DIVLP:	MOV	AX,DX			;Remainder becomes dividend
	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,5			;Now zero surpress 5 digits
	POP	DI
	MOV	AL,' '
SUPLP:	CMP	BYTE PTR [DI],'0'
	JNZ	DNECVT			;Conversion complete
	STOSB				;Replace leading zero with blank
	LOOP	SUPLP
DNECVT:	RET
CONVRT	ENDP
;
CODE	ENDS
;
	END
