]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/MAPPER/QFSINFO.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / MAPPER / QFSINFO.ASM
1 page 80,132
2
3 title CP/DOS DosQFsInfo mapper
4
5 buffer segment word public 'buffer'
6
7 clsdr40 dw ?
8 avlcls40 dw ?
9 secalc40 dw ?
10 bytsec40 dw ?
11
12 buffer ends
13
14 dosxxx segment byte public 'dos'
15 assume cs:dosxxx,ds:nothing,es:nothing,ss:nothing
16 ;
17 ; ************************************************************************* *
18 ; *
19 ; * MODULE: DosQFsInfo
20 ; *
21 ; * FILE NAME: DOS040.ASM
22 ; *
23 ; * FUNCTION: This module will return the information for a file
24 ; * system device.
25 ; *
26 ; * CALLING SEQUENCE:
27 ; *
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
32 ; * Call DosQFsInfo
33 ; *
34 ; *
35 ; * RETURN SEQUENCE:
36 ; *
37 ; * IF ERROR (AX not = 0)
38 ; *
39 ; * AX = Error Code:
40 ; *
41 ; * o Invalid parameter
42 ; *
43 ; *
44 ; * MODULES CALLED: DOS int 21H function 19H
45 ; * DOS int 25H
46 ; *
47 ; *
48 ; *************************************************************************
49
50 public DosQFsInfo
51 .sall
52 .xlist
53 include macros.inc
54 include error.inc
55 .list
56
57 str struc
58 old_bp dw ?
59 return dd ?
60 FSIBS40 dw ? ; info buffer size
61 FSIB40 dd ? ; info buffer
62 ILL40 dw ? ; info level
63 DRNUM40 dw ? ; driver number
64 str ends
65
66 DosQFsInfo proc far
67 Enter Dosqfsinfo ; push registers
68
69 mov dx,[bp].drnum40 ; load drive number
70 mov ah,036h
71 int 21h ; get disk space
72
73 cmp ax,0ffffh ; check if valid drive number
74 jne valdr40 ; jump if drive is ok
75
76 mov ax,error_invalid_parameter ; esle set error code
77 jmp erret40 ; error return
78
79 valdr40:;
80 push ax
81 mov ax,buffer ; set the data segment and save
82 push ax ; space information in the data area
83 pop ds
84 assume ds:buffer
85 mov avlcls40,bx ; save available cluster
86 mov clsdr40,dx ; save clusters per drive
87 mov bytsec40,cx ; save bytes per sector
88 pop ax ;
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
93
94 mov ax,error_invalid_parameter ; else invalid parameter
95 jmp erret40 ; error return
96
97 getinfo40:;
98 mov ax,[bp].fsibs40 ; get info buffer size address
99 cmp ax,18 ; check if valid
100 jge bufok40 ; jump if valid
101
102 mov ax,error_buffer_overflow ; move buffer not big enough
103 jmp erret40 ; error return
104
105 bufok40:;
106 les di,[bp].fsib40 ; get FSI buffer pointer
107 sub ax,ax ; return
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
111 sub ax,ax ;
112 mov es:[di]+2,ax ; set high order # of sectors in alloc to 0
113 mov ax,secalc40 ;
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
118 sub ax,ax ;
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
122 sub ax,ax ;
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
127
128 erret40:;
129 mexit ; pop registers
130 ret size str - 6 ; return
131
132 DosQFsInfo endp
133
134 dosxxx ends
135
136 end