]>
wirehaze git hosting - BOS.git/blob - kernel/fat12/fat12.asm
1 ;----------------------------------------------------------;
2 ; BOS kernel Christoffer Bubach, 2012-2015. ;
3 ;----------------------------------------------------------;
7 ;----------------------------------------------------------;
9 ;---------------------------------------------;
10 ; FAT12 main info structure ;
11 ;---------------------------------------------;
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
23 times 16 * sizeof
.dir_entry
db 0 ; 512b dir entry buffer
24 .fat_buffer: times 512 db 0 ; 512b FAT cluster info buffer
26 times 32 * sizeof
.filehandle
db 0 ; for now, max opened files is 32
29 virtual at 0 ; could use "at esi" instead
34 ;---------------------------------------------;
35 ; FAT12 bootsector structure ;
36 ;---------------------------------------------;
37 struc bootsector
; 512 bytes
40 .oem db 0,0,0,0,0,0,0,0
43 .reserved_sect dw 0 ; reserved sectors, 1 for bootsector.
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
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 "
60 .boot_signature db 0,0 ; 0x55,0xAA
65 sizeof
.bootsector
= $-$$
68 ;---------------------------------------------;
69 ; FAT12 directory entry structure ;
70 ;---------------------------------------------;
73 .filename db 0,0,0,0,0,0,0,0
75 .attributes db 0 ; 0x10 = dir for example.
76 .reserved db 0,0,0,0,0,0,0,0,0,0
85 sizeof
.dir_entry
= $-$$
88 ;---------------------------------------------;
89 ; FAT12 directory entry for LFN ;
90 ;---------------------------------------------;
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.
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.
105 sizeof
.lfn_entry
= $-$$
108 ;---------------------------------------------;
109 ; FAT12 file-handle structure ;
110 ;---------------------------------------------;
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
127 filehandle filehandle
128 sizeof
.filehandle
= $-$$
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.
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
146 ;------------------------------------------;
147 ; Directory entry attribute masks ;
148 ;------------------------------------------;
152 mask_volume_label
= 0x08
153 mask_subdirectory
= 0x10
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
166 fd0 fat12
; define fd0 data.. tmp example.
168 ; TODO, alloc memory for struct and keep pointer only.
171 ;mov edi, drive+fat12into.boot
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+)
193 ;--------------------------------------------------------------;
194 ; init_fat12 - detect if drive fs is fat12 and init ;
195 ;--------------------------------------------------------------;
197 ; in: reg = pointer to VFS drive info ;
199 ; out: reg = pointer to struct(s) if FAT12 found ;
201 ;--------------------------------------------------------------;
206 ;-----------------------------;
207 ; calculate root location ;
208 ;-----------------------------;
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
217 ;mov ax, [si+fat12.boot.sectorssize]
219 ; a bit more code here
223 ;--------------------------------------------------------------;
224 ; calc_lfn_chksum - get long file name checksum ;
225 ;--------------------------------------------------------------;
227 ; in: esi = pointer to 11 byte 8.3 filename ;
229 ; out: ax = checksum ;
231 ;--------------------------------------------------------------;
237 xor ax, ax ; return value start with null
240 movzx cx, byte [esi] ; add next char to sum
243 shr ax, 1 ; shift sum right by 1
244 inc esi ; prepare for next character
251 ;--------------------------------------------------------------;
252 ; get_dir_entry - get a directory entry or amount ;
253 ;--------------------------------------------------------------;
255 ; in: esi = pointer to prev dir entry or 0 for root ;
256 ; cx = entry no. to extract or 0 for none ;
258 ; out: cx = number of entries or unchanged if set ;
259 ; edi = pointer to dir entry or unchanged if cx=0 ;
260 ;--------------------------------------------------------------;
265 ;--------------------------------------------------------------;
266 ; get_fat_entry - get a fat entry/cluster number ;
267 ;--------------------------------------------------------------;
269 ; in: cx = fat entry/cluster number ;
271 ; out: cx = next fat entry/cluster no. or 0 if none ;
272 ;--------------------------------------------------------------;
277 ;--------------------------------------------------------------;
278 ; get_cluster - get a cluster ;
279 ;--------------------------------------------------------------;
281 ; in: cx = fat entry/cluster number ;
283 ; out: edi = pointer to cluster or zero if none ;
284 ;--------------------------------------------------------------;