]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/MAPPER/QFSINFO.ASM
3 title CP
/DOS DosQFsInfo mapper
5 buffer
segment word public 'buffer'
14 dosxxx
segment byte public 'dos'
15 assume
cs:dosxxx
,ds:nothing
,es:nothing
,ss:nothing
17 ; ************************************************************************* *
19 ; * MODULE: DosQFsInfo
21 ; * FILE NAME: DOS040.ASM
23 ; * FUNCTION: This module will return the information for a file
28 ; * PUSH WORD DriveNumber ; Drive Number
29 ; * PUSH OTHER FSInfoLevel ; File system info required
30 ; * PUSH@ OTHER FSInfoBuf ; File system info buffer
31 ; * PUSH WORD FSInfoBufSize ; file system info buffer size
37 ; * IF ERROR (AX not = 0)
41 ; * o Invalid parameter
44 ; * MODULES CALLED: DOS int 21H function 19H
48 ; *************************************************************************
60 FSIBS40 dw ?
; info buffer size
61 FSIB40 dd ?
; info buffer
62 ILL40 dw ?
; info level
63 DRNUM40 dw ?
; driver number
67 Enter Dosqfsinfo
; push registers
69 mov dx,[bp].drnum40
; load drive number
71 int 21h
; get disk space
73 cmp ax,0ffffh ; check if valid drive number
74 jne valdr40
; jump if drive is ok
76 mov ax,error_invalid_parameter
; esle set error code
77 jmp erret40
; error return
81 mov ax,buffer
; set the data segment and save
82 push ax ; space information in the data area
85 mov avlcls40
,bx ; save available cluster
86 mov clsdr40
,dx ; save clusters per drive
87 mov bytsec40
,cx ; save bytes per sector
89 mov secalc40
,ax ; save sectors per allocation unit
90 mov ax,[bp].ill40
; get info level
91 cmp al,01 ; valid level ??
92 je getinfo40
; jump if valid
94 mov ax,error_invalid_parameter
; else invalid parameter
95 jmp erret40
; error return
98 mov ax,[bp].fsibs40
; get info buffer size address
99 cmp ax,18 ; check if valid
100 jge bufok40
; jump if valid
102 mov ax,error_buffer_overflow
; move buffer not big enough
103 jmp erret40
; error return
106 les di,[bp].fsib40
; get FSI buffer pointer
108 mov es:[di],ax ; null
109 mov es:[di]+2,ax ; File system ID
110 add di,4 ; set pointer to number of sectors in alloc
112 mov es:[di]+2,ax ; set high order # of sectors in alloc to 0
114 mov es:[di],ax ; store low order # of sectors in alloc
115 add di,4 ; set pointer to number of allocation units
116 mov ax,clsdr40
; load low order number
117 mov es:[di],ax ; of alloc units
119 mov es:[di]+2,ax ; set high order # of alloc units to 0
120 mov ax,avlcls40
; load low order number
121 mov es:[di]+4,ax ; of avail alloc units
123 mov es:[di]+6,ax ; set high order # of avail alloc to 0
124 mov ax,bytsec40
; get number
125 mov es:[di]+8,ax ; of bytes per sector
126 sub ax,ax ; set good return code
129 mexit
; pop registers
130 ret size
str - 6 ; return