]> wirehaze git hosting - BOS.git/blob - kernel/fat12/fat12.asm

wirehaze git hosting

Completed FAT12 structures, added some for VFS.
[BOS.git] / kernel / fat12 / fat12.asm
1 ;----------------------------------------------------------;
2 ; BOS kernel Christoffer Bubach, 2012-2015. ;
3 ;----------------------------------------------------------;
4 ; ;
5 ; FAT12 driver. ;
6 ; ;
7 ;----------------------------------------------------------;
8
9 ;---------------------------------------------;
10 ; FAT12 main info structure ;
11 ;---------------------------------------------;
12 struc fat12
13 {
14 .disk_number db 0 ; which VFS disk number
15 .root_dir dw 0 ; position of rootdir
16 .fat_1 dd 0 ; position of fat1
17 .fat_2 dd 0 ; position of fat2
18 .data_area dw 0 ; position of dataarea
19 .disk_size dd 0 ; total storage size
20 .free_space dd 0 ; free space available
21 .boot: times sizeof.bootsector db 0 ; copy of FAT12 bootsector
22 .dir_entries:
23 times 16 * sizeof.dir_entry db 0 ; 512b dir entry buffer
24 .fat_buffer: times 512 db 0 ; 512b FAT cluster info buffer
25 .filehandles:
26 times 32 * sizeof.filehandle db 0 ; for now, max opened files is 32
27 }
28
29 virtual at 0 ; could use "at esi" instead
30 fat12 fat12
31 sizeof.fat12 = $-$$
32 end virtual
33
34 ;---------------------------------------------;
35 ; FAT12 bootsector structure ;
36 ;---------------------------------------------;
37 struc bootsector ; 512 bytes
38 {
39 .jumper db 0,0,0
40 .oem db 0,0,0,0,0,0,0,0
41 .sectorsize dw 0
42 .sect_per_clust db 0
43 .reserved_sect dw 0 ; reserved sectors, 1 for bootsector.
44 .fats_per_drive db 0
45 .root_entries dw 0
46 .small_sectors dw 0 ; total sectors on small disk
47 .media_describtor db 0 ; 240 / 0xF0 = 1.44MB, 3.5"
48 .sectors_per_fat dw 0 ; 9 on 1.44MB, 3,5"
49 .sect_per_track dw 0 ; 18 on 1.44MB, 3,5"
50 .heads dw 0 ; 2 on 1.44MB, 3,5"
51 .hidden_sectors dd 0 ; sectors before bootsector
52 .large_sectors dd 0 ; total sectors if large disk
53 .drive_no db 0
54 .reserved_field db 0
55 .bpb_signature db 0 ; 41=3 more (win NT req.), 0=end.
56 .disk_id dd 0 ; random ident number on format.
57 .volume_label db 0,0,0,0,0,0,0,0,0,0,0
58 .filesystem db 0,0,0,0,0,0,0,0 ; "FAT12 " or "FAT16 "
59 .code: times 448 db 0
60 .boot_signature db 0,0 ; 0x55,0xAA
61 }
62
63 virtual at 0
64 bootsector bootsector
65 sizeof.bootsector = $-$$
66 end virtual
67
68 ;---------------------------------------------;
69 ; FAT12 directory entry structure ;
70 ;---------------------------------------------;
71 struc dir_entry
72 {
73 .filename db 0,0,0,0,0,0,0,0
74 .extension db 0,0,0
75 .attributes db 0 ; 0x10 = dir for example.
76 .reserved db 0,0,0,0,0,0,0,0,0,0
77 .changed_time dw 0
78 .changed_date dw 0
79 .start_cluster dw 0
80 .filesize dd 0
81 }
82
83 virtual at 0
84 dir_entry dir_entry
85 sizeof.dir_entry = $-$$
86 end virtual
87
88 ;---------------------------------------------;
89 ; FAT12 directory entry for LFN ;
90 ;---------------------------------------------;
91 struc lfn_entry
92 {
93 .order db 0 ; LFN entry in sequence, never 0x00 or 0xE5.
94 .namefirst dw 0,0,0,0,0 ; 5 first unicode (2byte) chars
95 .attribute db 0 ; 0x0F for Long File Name identification.
96 .reserved db 0
97 .checksum db 0 ; 8.3 name checksum
98 .namemiddle dw 0,0,0,0,0,0 ; middle 6 unicode (2byte) chars
99 .zero_cluster dw 0 ; always zero on LNF entries
100 .namelast dw 0,0 ; last 2 unicode (2byte) characters.
101 }
102
103 virtual at 0
104 lfn_entry lfn_entry
105 sizeof.lfn_entry = $-$$
106 end virtual
107
108 ;---------------------------------------------;
109 ; FAT12 file-handle structure ;
110 ;---------------------------------------------;
111 struc filehandle
112 {
113 .handles db 0 ; reference count or or zero for unused
114 .mode db 0 ; open mode. 0=read, 1=write, 2=r/w.
115 .lfn_entry dw 0 ; file LFN directory entry position
116 .direntry dw 0 ; file directory entry position
117 .cluster dw 0 ; file first cluster
118 .attribute db 0 ; file attributes
119 .filetime dw 0 ; last modified time
120 .filedate dw 0 ; last modified date
121 .filesize dd 0 ; filesize
122 .position dd 0 ; R/W position in file
123 .clusterpos dw 0 ; cluster number of last cluster read
124 }
125
126 virtual at 0
127 filehandle filehandle
128 sizeof.filehandle = $-$$
129 end virtual
130
131 ;------------------------------------------;
132 ; FAT cluster constants used ;
133 ;------------------------------------------;
134 cluster_free = 0x000 ; up for grabs.
135 cluster_reserved = 0xFF0 ; 0xFF0-0xFF6. 0xFF7=bad.
136 cluster_last = 0xFF8 ; 0xFF8-0xFFF last cluster.
137
138 ;------------------------------------------;
139 ; Directory entry first char constants ;
140 ;------------------------------------------;
141 entry_free = 0xE5 ; up for grabs.
142 entry_last = 0x00 ; this and remaining is free
143 entry_japan_kludge = 0x0E ; should be outputed as 0xE5.
144 entry_dot = 0x2E ; ASCII dot, check for "." or ".." dirs
145
146 ;------------------------------------------;
147 ; Directory entry attribute masks ;
148 ;------------------------------------------;
149 mask_readonly = 0x01
150 mask_hidden = 0x02
151 mask_system = 0x04
152 mask_volume_label = 0x08
153 mask_subdirectory = 0x10
154 mask_archive = 0x20
155
156 ;------------------------------------------;
157 ; Long File Name entry constants ;
158 ;------------------------------------------;
159 lfn_last_entry_mask = 0x40 ; LFN sequence-order mask for last
160 attribute_lfn = 0x0F ; attrb. byte value for LFN dir entry
161
162
163
164
165
166 fd0 fat12 ; define fd0 data.. tmp example.
167
168 ; TODO, alloc memory for struct and keep pointer only.
169 ; ---------------
170 ;drive dd 0
171 ;mov edi, drive+fat12into.boot
172
173 ;--------------------------------------
174 ; possible interface to copy/follow,
175 ; add getFilename/path function?
176 ;--------------------------------------
177 ; INT 21,3C Create file using handle
178 ; INT 21,3D Open file using handle
179 ; INT 21,3E Close file using handle
180 ; INT 21,3F Read file or device using handle
181 ; INT 21,40 Write file or device using handle
182 ; INT 21,41 Delete file
183 ; INT 21,42 Move file pointer using handle
184 ; INT 21,43 Change file mode
185 ; INT 21,45 Duplicate file handle
186 ; INT 21,46 Force duplicate file handle
187 ; INT 21,56 Rename file
188 ; INT 21,57 Get/set file date and time using handle
189 ; INT 21,5A Create temporary file (3.x+)
190 ; INT 21,5B Create new file (3.x+)
191 ; INT 21,67 Set handle count (DOS 3.3+)
192
193 ;--------------------------------------------------------------;
194 ; init_fat12 - detect if drive fs is fat12 and init ;
195 ;--------------------------------------------------------------;
196 ; ;
197 ; in: reg = pointer to VFS drive info ;
198 ; ;
199 ; out: reg = pointer to struct(s) if FAT12 found ;
200 ; ;
201 ;--------------------------------------------------------------;
202 init_fat12:
203 push eax
204 ;...
205
206 ;-----------------------------;
207 ; calculate root location ;
208 ;-----------------------------;
209 xor eax, eax
210 mov al, byte [fd0.boot.fats_per_drive]
211 mul word [fd0.boot.sectors_per_fat]
212 add ax, word [fd0.boot.reserved_sect]
213 mov [fd0.root_dir], ax
214
215 ; working with
216 ;mov si, [drive]
217 ;mov ax, [si+fat12.boot.sectorssize]
218
219 ; a bit more code here
220 pop eax
221 ret
222
223 ;--------------------------------------------------------------;
224 ; calc_lfn_chksum - get long file name checksum ;
225 ;--------------------------------------------------------------;
226 ; ;
227 ; in: esi = pointer to 11 byte 8.3 filename ;
228 ; ;
229 ; out: ax = checksum ;
230 ; ;
231 ;--------------------------------------------------------------;
232 calc_lfn_chksum:
233 push cx
234 push esi
235
236 mov cx, 11
237 xor ax, ax ; return value start with null
238 .l1:
239 push cx
240 movzx cx, byte [esi] ; add next char to sum
241 add ax, cx
242 pop cx
243 shr ax, 1 ; shift sum right by 1
244 inc esi ; prepare for next character
245 loop .l1
246
247 pop esi
248 pop cx
249 ret
250
251 ;--------------------------------------------------------------;
252 ; get_dir_entry - get a directory entry or amount ;
253 ;--------------------------------------------------------------;
254 ; ;
255 ; in: esi = pointer to prev dir entry or 0 for root ;
256 ; cx = entry no. to extract or 0 for none ;
257 ; ;
258 ; out: cx = number of entries or unchanged if set ;
259 ; edi = pointer to dir entry or unchanged if cx=0 ;
260 ;--------------------------------------------------------------;
261 get_dir_entry:
262 ;......
263 ret
264
265 ;--------------------------------------------------------------;
266 ; get_fat_entry - get a fat entry/cluster number ;
267 ;--------------------------------------------------------------;
268 ; ;
269 ; in: cx = fat entry/cluster number ;
270 ; ;
271 ; out: cx = next fat entry/cluster no. or 0 if none ;
272 ;--------------------------------------------------------------;
273 get_fat_entry:
274 ;...
275 ret
276
277 ;--------------------------------------------------------------;
278 ; get_cluster - get a cluster ;
279 ;--------------------------------------------------------------;
280 ; ;
281 ; in: cx = fat entry/cluster number ;
282 ; ;
283 ; out: edi = pointer to cluster or zero if none ;
284 ;--------------------------------------------------------------;
285 get_cluster:
286 ;...
287 ret