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

wirehaze git hosting

VFS structures in place, minor typos fixed
[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 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 }
26
27 virtual at 0 ; could use "at esi" instead
28 fat12 fat12
29 sizeof.fat12 = $-$$
30 end virtual
31
32 ;---------------------------------------------;
33 ; FAT12 bootsector structure ;
34 ;---------------------------------------------;
35 struc bootsector ; 512 bytes
36 {
37 .jumper db 0,0,0
38 .oem db 0,0,0,0,0,0,0,0
39 .sectorsize dw 0
40 .sect_per_clust db 0
41 .reserved_sect dw 0 ; reserved sectors, 1 for bootsector.
42 .fats_per_drive db 0
43 .root_entries dw 0
44 .small_sectors dw 0 ; total sectors on small disk
45 .media_describtor db 0 ; 240 / 0xF0 = 1.44MB, 3.5"
46 .sectors_per_fat dw 0 ; 9 on 1.44MB, 3,5"
47 .sect_per_track dw 0 ; 18 on 1.44MB, 3,5"
48 .heads dw 0 ; 2 on 1.44MB, 3,5"
49 .hidden_sectors dd 0 ; sectors before bootsector
50 .large_sectors dd 0 ; total sectors if large disk
51 .drive_no db 0
52 .reserved_field db 0
53 .bpb_signature db 0 ; 41=3 more (win NT req.), 0=end.
54 .disk_id dd 0 ; random ident number on format.
55 .volume_label db 0,0,0,0,0,0,0,0,0,0,0
56 .filesystem db 0,0,0,0,0,0,0,0 ; "FAT12 " or "FAT16 "
57 .code: times 448 db 0
58 .boot_signature db 0,0 ; 0x55,0xAA
59 }
60
61 virtual at 0
62 bootsector bootsector
63 sizeof.bootsector = $-$$
64 end virtual
65
66 ;---------------------------------------------;
67 ; FAT12 directory entry structure ;
68 ;---------------------------------------------;
69 struc dir_entry
70 {
71 .filename db 0,0,0,0,0,0,0,0
72 .extension db 0,0,0
73 .attributes db 0 ; 0x10 = dir for example.
74 .reserved db 0,0,0,0,0,0,0,0,0,0
75 .changed_time dw 0
76 .changed_date dw 0
77 .start_cluster dw 0
78 .filesize dd 0
79 }
80
81 virtual at 0
82 dir_entry dir_entry
83 sizeof.dir_entry = $-$$
84 end virtual
85
86 ;---------------------------------------------;
87 ; FAT12 directory entry for LFN ;
88 ;---------------------------------------------;
89 struc lfn_entry
90 {
91 .order db 0 ; LFN entry in sequence, never 0x00 or 0xE5.
92 .namefirst dw 0,0,0,0,0 ; 5 first unicode (2byte) chars
93 .attribute db 0 ; 0x0F for Long File Name identification.
94 .reserved db 0
95 .checksum db 0 ; 8.3 name checksum
96 .namemiddle dw 0,0,0,0,0,0 ; middle 6 unicode (2byte) chars
97 .zero_cluster dw 0 ; always zero on LNF entries
98 .namelast dw 0,0 ; last 2 unicode (2byte) characters.
99 }
100
101 virtual at 0
102 lfn_entry lfn_entry
103 sizeof.lfn_entry = $-$$
104 end virtual
105
106 ;------------------------------------------;
107 ; FAT cluster constants used ;
108 ;------------------------------------------;
109 cluster_free = 0x000 ; up for grabs.
110 cluster_reserved = 0xFF0 ; 0xFF0-0xFF6. 0xFF7=bad.
111 cluster_last = 0xFF8 ; 0xFF8-0xFFF last cluster.
112
113 ;------------------------------------------;
114 ; Directory entry first char constants ;
115 ;------------------------------------------;
116 entry_free = 0xE5 ; up for grabs.
117 entry_last = 0x00 ; this and remaining is free
118 entry_japan_kludge = 0x0E ; should be outputed as 0xE5.
119 entry_dot = 0x2E ; ASCII dot, check for "." or ".." dirs
120
121 ;------------------------------------------;
122 ; Directory entry attribute masks ;
123 ;------------------------------------------;
124 mask_readonly = 0x01
125 mask_hidden = 0x02
126 mask_system = 0x04
127 mask_volume_label = 0x08
128 mask_subdirectory = 0x10
129 mask_archive = 0x20
130
131 ;------------------------------------------;
132 ; Long File Name entry constants ;
133 ;------------------------------------------;
134 lfn_last_entry_mask = 0x40 ; LFN sequence-order mask for last
135 attribute_lfn = 0x0F ; attrb. byte value for LFN dir entry
136
137
138
139
140
141 fd0 fat12 ; define fd0 data.. tmp example.
142
143 ; TODO, alloc memory for struct and keep pointer only.
144 ; ---------------
145 ;drive dd 0
146 ;mov edi, drive+fat12into.boot
147
148 ;--------------------------------------------------------------;
149 ; init_fat12 - detect if drive fs is fat12 and init ;
150 ;--------------------------------------------------------------;
151 ; ;
152 ; in: reg = pointer to VFS drive info ;
153 ; ;
154 ; out: reg = pointer to struct(s) if FAT12 found ;
155 ; ;
156 ;--------------------------------------------------------------;
157 init_fat12:
158 push eax
159 ;...
160
161 ;-----------------------------;
162 ; calculate root location ;
163 ;-----------------------------;
164 xor eax, eax
165 mov al, byte [fd0.boot.fats_per_drive]
166 mul word [fd0.boot.sectors_per_fat]
167 add ax, word [fd0.boot.reserved_sect]
168 mov [fd0.root_dir], ax
169
170 ; working with
171 ;mov si, [drive]
172 ;mov ax, [si+fat12.boot.sectorssize]
173
174 ; a bit more code here
175 pop eax
176 ret
177
178 ;--------------------------------------------------------------;
179 ; calc_lfn_chksum - get long file name checksum ;
180 ;--------------------------------------------------------------;
181 ; ;
182 ; in: esi = pointer to 11 byte 8.3 filename ;
183 ; ;
184 ; out: ax = checksum ;
185 ; ;
186 ;--------------------------------------------------------------;
187 calc_lfn_chksum:
188 push cx
189 push esi
190
191 mov cx, 11
192 xor ax, ax ; return value start with null
193 .l1:
194 push cx
195 movzx cx, byte [esi] ; add next char to sum
196 add ax, cx
197 pop cx
198 shr ax, 1 ; shift sum right by 1
199 inc esi ; prepare for next character
200 loop .l1
201
202 pop esi
203 pop cx
204 ret
205
206 ;--------------------------------------------------------------;
207 ; get_dir_entry - get a directory entry or amount ;
208 ;--------------------------------------------------------------;
209 ; ;
210 ; in: esi = pointer to prev dir entry or 0 for root ;
211 ; cx = entry no. to extract or 0 for none ;
212 ; ;
213 ; out: cx = number of entries or unchanged if set ;
214 ; edi = pointer to dir entry or unchanged if cx=0 ;
215 ;--------------------------------------------------------------;
216 get_dir_entry:
217 ;......
218 ret
219
220 ;--------------------------------------------------------------;
221 ; get_fat_entry - get a fat entry/cluster number ;
222 ;--------------------------------------------------------------;
223 ; ;
224 ; in: cx = fat entry/cluster number ;
225 ; ;
226 ; out: cx = next fat entry/cluster no. or 0 if none ;
227 ;--------------------------------------------------------------;
228 get_fat_entry:
229 ;...
230 ret
231
232 ;--------------------------------------------------------------;
233 ; get_cluster - get a cluster ;
234 ;--------------------------------------------------------------;
235 ; ;
236 ; in: cx = fat entry/cluster number ;
237 ; ;
238 ; out: edi = pointer to cluster or zero if none ;
239 ;--------------------------------------------------------------;
240 get_cluster:
241 ;...
242 ret