Rev 171 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | ha | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; FAT32.INC ;; |
||
4 | ;; ;; |
||
131 | diamond | 5 | ;; FAT16/32 functions for KolibriOS ;; |
1 | ha | 6 | ;; ;; |
7 | ;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;; |
||
8 | ;; ;; |
||
9 | ;; See file COPYING for details ;; |
||
171 | diamond | 10 | ;; 08.10.2006 LFN delete file/folder - diamond ;; |
139 | diamond | 11 | ;; 20.08.2006 LFN set file size (truncate/extend) - diamond ;; |
131 | diamond | 12 | ;; 17.08.2006 LFN write/append to file - diamond ;; |
91 | diamond | 13 | ;; 23.06.2006 LFN start application - diamond ;; |
86 | diamond | 14 | ;; 15.06.2006 LFN get/set file/folder info - diamond ;; |
83 | diamond | 15 | ;; 27.05.2006 LFN create/rewrite file - diamond ;; |
75 | diamond | 16 | ;; 04.05.2006 LFN read folder - diamond ;; |
74 | mario79 | 17 | ;; 29.04.2006 Elimination of hangup after the ;; |
18 | ;; expiration hd_wait_timeout - Mario79 ;; |
||
75 | diamond | 19 | ;; 23.04.2006 LFN read file - diamond ;; |
65 | mario79 | 20 | ;; 28.01.2006 find all Fat16/32 partition in all input point ;; |
21 | ;; to MBR, see file part_set.inc - Mario79 ;; |
||
1 | ha | 22 | ;; 15.01.2005 get file size/attr/date, file_append - ATV ;; |
23 | ;; 04.12.2004 skip volume label, file delete bug fixed - ATV ;; |
||
24 | ;; 29.11.2004 get_free_FAT changed, append dir bug fixed - ATV ;; |
||
25 | ;; 23.11.2004 don't allow overwrite dir with file - ATV ;; |
||
26 | ;; 18.11.2004 get_disk_info and more error codes - ATV ;; |
||
27 | ;; 17.11.2004 set_FAT/get_FAT and disk cache rewritten - ATV ;; |
||
28 | ;; 10.11.2004 removedir clear whole directory structure - ATV ;; |
||
29 | ;; 08.11.2004 rename - ATV ;; |
||
30 | ;; 30.10.2004 file_read return also dirsize in bytes - ATV ;; |
||
31 | ;; 20.10.2004 Makedir/Removedir - ATV ;; |
||
32 | ;; 14.10.2004 Partition chain/Fat16 - ATV (thanks drh3xx) ;; |
||
33 | ;; 06.9.2004 Fix free space by Mario79 added - MH ;; |
||
34 | ;; 24.5.2004 Write back buffer for File_write -VT ;; |
||
35 | ;; 20.5.2004 File_read function to work with syscall 58 - VT ;; |
||
36 | ;; 30.3.2004 Error parameters at function return - VT ;; |
||
37 | ;; 01.5.2002 Bugfix in device write - VT ;; |
||
38 | ;; 20.5.2002 Hd status check - VT ;; |
||
39 | ;; 29.6.2002 Improved fat32 verification - VT ;; |
||
40 | ;; ;; |
||
41 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
42 | |||
43 | cache_max equ 1919 ; max. is 1919*512+0x610000=0x6ffe00 |
||
44 | |||
52 | mikedld | 45 | ERROR_SUCCESS = 0 |
46 | ERROR_DISK_BASE = 1 |
||
47 | ERROR_UNSUPPORTED_FS = 2 |
||
48 | ERROR_UNKNOWN_FS = 3 |
||
49 | ERROR_PARTITION = 4 |
||
50 | ERROR_FILE_NOT_FOUND = 5 |
||
51 | ERROR_END_OF_FILE = 6 |
||
52 | ERROR_MEMORY_POINTER = 7 |
||
53 | ERROR_DISK_FULL = 8 |
||
54 | ERROR_FAT_TABLE = 9 |
||
55 | ERROR_ACCESS_DENIED = 10 |
||
1 | ha | 56 | |
57 | PUSHAD_EAX equ [esp+28] |
||
58 | PUSHAD_ECX equ [esp+24] |
||
59 | PUSHAD_EDX equ [esp+20] |
||
60 | PUSHAD_EBX equ [esp+16] |
||
61 | PUSHAD_EBP equ [esp+8] |
||
62 | PUSHAD_ESI equ [esp+4] |
||
63 | PUSHAD_EDI equ [esp+0] |
||
64 | |||
171 | diamond | 65 | uglobal |
66 | align 4 |
||
1 | ha | 67 | cluster dd 0 ; used by file_write,makedir,append |
68 | partition_count dd 0 ; partitions found by set_FAT32_variables |
||
69 | longname_sec1 dd 0 ; used by analyze_directory to save 2 previous |
||
70 | longname_sec2 dd 0 ; directory sectors for delete long filename |
||
71 | |||
72 | hd_error dd 0 ; set by wait_for_sector_buffer |
||
73 | hd_setup dd 0 |
||
74 | hd_wait_timeout dd 0 |
||
75 | |||
76 | cluster_tmp dd 0 ; used by analyze_directory |
||
77 | ; and analyze_directory_to_write |
||
78 | |||
79 | file_size dd 0 ; used by file_read |
||
80 | |||
81 | sector_tmp dd 0 ; used by rename,append,file_write |
||
82 | entry_pos dd 0 ; used by rename,append,file_write |
||
83 | |||
84 | old_filesize dd 0 ; used by append |
||
85 | new_filepos dd 0 ; used by append |
||
86 | bytes2write dd 0 ; used by append |
||
87 | |||
88 | cache_search_start dd 0 ; used by find_empty_slot |
||
171 | diamond | 89 | endg |
1 | ha | 90 | |
171 | diamond | 91 | iglobal |
1 | ha | 92 | fat_in_cache dd -1 |
171 | diamond | 93 | endg |
1 | ha | 94 | |
95 | uglobal |
||
171 | diamond | 96 | align 4 |
97 | fat_cache: times 512 db 0 |
||
1 | ha | 98 | Sector512: ; label for dev_hdcd.inc |
99 | buffer: times 512 db 0 |
||
100 | deltree_buffer: times 512 db 0 |
||
133 | diamond | 101 | fsinfo_buffer: times 512 db 0 |
1 | ha | 102 | endg |
103 | |||
104 | iglobal |
||
105 | NewDirEntry1 db ". ",0x10 |
||
106 | times 20 db 0 |
||
107 | NewDirEntry2 db ".. ",0x10 |
||
108 | times 20 db 0 |
||
109 | endg |
||
110 | |||
111 | uglobal |
||
112 | dir_entry: times 32 db 0 |
||
113 | |||
114 | startpath: times 255 db 0 |
||
115 | |||
116 | fat16_root db 0 ; flag for fat16 rootdir |
||
117 | fat_change db 0 ; 1=fat has changed |
||
118 | |||
119 | endg |
||
120 | |||
121 | reserve_hd1: |
||
122 | |||
123 | cli |
||
124 | cmp [hd1_status],0 |
||
125 | je reserve_ok1 |
||
126 | |||
127 | sti |
||
128 | call change_task |
||
129 | jmp reserve_hd1 |
||
130 | |||
131 | reserve_ok1: |
||
132 | |||
133 | push eax |
||
134 | mov eax,[0x3000] |
||
135 | shl eax,5 |
||
115 | poddubny | 136 | mov eax,[eax+0x3000+TASKDATA.pid] |
1 | ha | 137 | mov [hd1_status],eax |
138 | pop eax |
||
139 | sti |
||
140 | ret |
||
95 | mario79 | 141 | ;******************************************** |
142 | reserve_hd_channel: |
||
143 | cmp [hdbase], 0x1F0 |
||
144 | jne .IDE_Channel_2 |
||
145 | .IDE_Channel_1: |
||
146 | cli |
||
147 | cmp [IDE_Channel_1],0 |
||
148 | je .reserve_ok_1 |
||
149 | sti |
||
150 | call change_task |
||
151 | jmp .IDE_Channel_1 |
||
152 | .IDE_Channel_2: |
||
153 | cli |
||
154 | cmp [IDE_Channel_2],0 |
||
155 | je .reserve_ok_2 |
||
156 | sti |
||
157 | call change_task |
||
158 | jmp .IDE_Channel_1 |
||
159 | .reserve_ok_1: |
||
160 | mov [IDE_Channel_1],1 |
||
161 | ret |
||
162 | .reserve_ok_2: |
||
163 | mov [IDE_Channel_2],1 |
||
164 | ret |
||
165 | |||
166 | free_hd_channel: |
||
167 | cmp [hdbase], 0x1F0 |
||
168 | jne .IDE_Channel_2 |
||
169 | .IDE_Channel_1: |
||
170 | mov [IDE_Channel_1],0 |
||
171 | ret |
||
172 | .IDE_Channel_2: |
||
173 | mov [IDE_Channel_2],0 |
||
174 | ret |
||
175 | ;******************************************** |
||
1 | ha | 176 | problem_partition db 0 ; used for partitions search |
177 | |||
65 | mario79 | 178 | include 'part_set.inc' |
1 | ha | 179 | |
180 | set_FAT: |
||
181 | ;-------------------------------- |
||
182 | ; input : EAX = cluster |
||
183 | ; EDX = value to save |
||
184 | ; output : EDX = old value |
||
185 | ;-------------------------------- |
||
186 | push eax ebx esi |
||
187 | |||
188 | cmp eax,2 |
||
189 | jb sfc_error |
||
190 | cmp eax,[LAST_CLUSTER] |
||
191 | ja sfc_error |
||
256 | diamond | 192 | cmp [fs_type],16 |
1 | ha | 193 | je sfc_1 |
194 | add eax,eax |
||
195 | sfc_1: |
||
196 | add eax,eax |
||
197 | mov esi,511 |
||
198 | and esi,eax ; esi = position in fat sector |
||
199 | shr eax,9 ; eax = fat sector |
||
200 | add eax,[FAT_START] |
||
201 | mov ebx,fat_cache |
||
202 | |||
203 | cmp eax,[fat_in_cache] ; is fat sector already in memory? |
||
204 | je sfc_in_cache ; yes |
||
205 | |||
206 | cmp [fat_change],0 ; is fat changed? |
||
207 | je sfc_no_change ; no |
||
208 | call write_fat_sector ; yes. write it into disk |
||
74 | mario79 | 209 | cmp [hd_error],0 |
210 | jne sfc_error |
||
1 | ha | 211 | |
212 | sfc_no_change: |
||
213 | mov [fat_in_cache],eax ; save fat sector |
||
214 | call hd_read |
||
74 | mario79 | 215 | cmp [hd_error],0 |
216 | jne sfc_error |
||
217 | |||
1 | ha | 218 | |
219 | sfc_in_cache: |
||
256 | diamond | 220 | cmp [fs_type],16 |
1 | ha | 221 | jne sfc_test32 |
222 | |||
223 | sfc_set16: |
||
224 | xchg [ebx+esi],dx ; save new value and get old value |
||
225 | jmp sfc_write |
||
226 | |||
227 | sfc_test32: |
||
228 | mov eax,[fatMASK] |
||
229 | |||
230 | sfc_set32: |
||
231 | and edx,eax |
||
232 | xor eax,-1 ; mask for high bits |
||
233 | and eax,[ebx+esi] ; get high 4 bits |
||
234 | or eax,edx |
||
235 | mov edx,[ebx+esi] ; get old value |
||
236 | mov [ebx+esi],eax ; save n |