Subversion Repositories Kolibri OS

Rev

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