Subversion Repositories Kolibri OS

Rev

Rev 5 | Rev 48 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5 Rev 19
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                      ;;
2
;;                                                                      ;;
3
;; RAMDISK functions                                                    ;;
3
;; RAMDISK functions                                                    ;;
4
;; (C) 2004 Ville Turjanmaa, License: GPL                               ;;
4
;; (C) 2004 Ville Turjanmaa, License: GPL                               ;;
5
;; Addings by M.Lisovin                                                 ;;
5
;; Addings by M.Lisovin                                                 ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
; calculate fat chain
8
; calculate fat chain
9
 
9
 
10
calculatefatchain:
10
calculatefatchain:
11
 
11
 
12
   pushad
12
   pushad
13
 
13
 
14
   mov  esi,0x100000+512
14
   mov  esi,0x100000+512
15
   mov  edi,0x280000
15
   mov  edi,0x280000
16
 
16
 
17
 fcnew:
17
 fcnew:
18
   mov  eax,dword [esi]
18
   mov  eax,dword [esi]
19
   mov  ebx,dword [esi+4]
19
   mov  ebx,dword [esi+4]
20
   mov  ecx,dword [esi+8]
20
   mov  ecx,dword [esi+8]
21
   mov  edx,ecx
21
   mov  edx,ecx
22
   shr  edx,4   ;8 ok
22
   shr  edx,4   ;8 ok
23
   shr  dx,4    ;7 ok
23
   shr  dx,4    ;7 ok
24
   xor  ch,ch
24
   xor  ch,ch
25
   shld ecx,ebx,20 ;6 ok
25
   shld ecx,ebx,20 ;6 ok
26
   shr  cx,4     ;5 ok
26
   shr  cx,4     ;5 ok
27
   shld ebx,eax,12
27
   shld ebx,eax,12
28
   and  ebx,0x0fffffff  ;4 ok
28
   and  ebx,0x0fffffff  ;4 ok
29
   shr  bx,4    ;3 ok
29
   shr  bx,4    ;3 ok
30
   shl  eax,4
30
   shl  eax,4
31
   and  eax,0x0fffffff  ;2 ok
31
   and  eax,0x0fffffff  ;2 ok
32
   shr  ax,4  ;1 ok
32
   shr  ax,4  ;1 ok
33
   mov dword [edi],eax
33
   mov dword [edi],eax
34
   add  edi,4
34
   add  edi,4
35
   mov dword [edi],ebx
35
   mov dword [edi],ebx
36
   add  edi,4
36
   add  edi,4
37
   mov dword [edi],ecx
37
   mov dword [edi],ecx
38
   add  edi,4
38
   add  edi,4
39
   mov dword [edi],edx
39
   mov dword [edi],edx
40
   add  edi,4   
40
   add  edi,4   
41
   add  esi,12
41
   add  esi,12
42
 
42
 
43
   cmp  edi,0x280000+2856*2   ;2849 clusters
43
   cmp  edi,0x280000+2856*2   ;2849 clusters
44
   jnz  fcnew
44
   jnz  fcnew
45
 
45
 
46
   popad
46
   popad
47
   ret
47
   ret
48
 
48
 
49
 
49
 
50
restorefatchain:   ; restore fat chain
50
restorefatchain:   ; restore fat chain
51
 
51
 
52
   pushad
52
   pushad
53
 
53
 
54
   mov  esi,0x280000
54
   mov  esi,0x280000
55
   mov  edi,0x100000+512
55
   mov  edi,0x100000+512
56
 
56
 
57
  fcnew2:
57
  fcnew2:
58
   mov  eax,dword [esi]
58
   mov  eax,dword [esi]
59
   mov  ebx,dword [esi+4]
59
   mov  ebx,dword [esi+4]
60
   shl  ax,4
60
   shl  ax,4
61
   shl  eax,4
61
   shl  eax,4
62
   shl  bx,4
62
   shl  bx,4
63
   shr  ebx,4
63
   shr  ebx,4
64
   shrd eax,ebx,8
64
   shrd eax,ebx,8
65
   shr  ebx,8
65
   shr  ebx,8
66
   mov dword [edi],eax
66
   mov dword [edi],eax
67
   add  edi,4
67
   add  edi,4
68
   mov word [edi],bx
68
   mov word [edi],bx
69
   add  edi,2
69
   add  edi,2
70
   add  esi,8
70
   add  esi,8
71
 
71
 
72
   cmp  edi,0x100000+512+4278     ;4274 bytes - all used FAT
72
   cmp  edi,0x100000+512+4278     ;4274 bytes - all used FAT
73
   jb   fcnew2
73
   jb   fcnew2
74
 
74
 
75
   mov  esi,0x100000+512           ; duplicate fat chain
75
   mov  esi,0x100000+512           ; duplicate fat chain
76
   mov  edi,0x100000+512+0x1200
76
   mov  edi,0x100000+512+0x1200
77
   mov  ecx,1069        ;4274/4
77
   mov  ecx,1069        ;4274/4
78
   cld
78
   cld
79
   rep  movsd
79
   rep  movsd
80
 
80
 
81
   popad
81
   popad
82
   ret
82
   ret
83
 
83
 
84
 
84
 
85
ramdisk_free_space:
85
ramdisk_free_space:
86
;---------------------------------------------
86
;---------------------------------------------
87
;
87
;
88
; returns free space in edi
88
; returns free space in edi
89
; rewr.by Mihasik
89
; rewr.by Mihasik
90
;---------------------------------------------
90
;---------------------------------------------
91
 
91
 
92
        push   eax ebx ecx
92
        push   eax ebx ecx
93
 
93
 
94
        mov  edi,0x280000 ;start of FAT
94
        mov  edi,0x280000 ;start of FAT
95
        xor  ax,ax    ;Free cluster=0x0000 in FAT
95
        xor  ax,ax    ;Free cluster=0x0000 in FAT
96
        xor  ebx,ebx  ;counter
96
        xor  ebx,ebx  ;counter
97
        mov  ecx,2849 ;2849 clusters
97
        mov  ecx,2849 ;2849 clusters
98
        cld
98
        cld
99
    rdfs1:
99
    rdfs1:
100
        repne scasw
100
        repne scasw
101
        jnz  rdfs2    ;if last cluster not 0
101
        jnz  rdfs2    ;if last cluster not 0
102
        inc  ebx
102
        inc  ebx
103
        jcxz rdfs2    ;if last cluster=0
103
        jcxz rdfs2    ;if last cluster=0
104
        jmp  rdfs1    ;if not last
104
        jmp  rdfs1    ;if not last
105
    rdfs2:
105
    rdfs2:
106
        shl  ebx,9    ;free clusters*512
106
        shl  ebx,9    ;free clusters*512
107
        mov  edi,ebx
107
        mov  edi,ebx
108
        
108
        
109
        pop    ecx ebx eax
109
        pop    ecx ebx eax
110
        ret
110
        ret
111
 
111
 
112
 
112
 
113
expand_filename:
113
expand_filename:
114
;---------------------------------------------
114
;---------------------------------------------
115
;
115
;
116
; exapand filename with '.' to 11 character
116
; exapand filename with '.' to 11 character
117
; eax - pointer to filename
117
; eax - pointer to filename
118
;---------------------------------------------
118
;---------------------------------------------
119
 
119
 
120
        push esi edi ebx
120
        push esi edi ebx
121
 
121
 
122
        mov  edi,esp                  ; check for '.' in the name
122
        mov  edi,esp                  ; check for '.' in the name
123
        add  edi,12+8
123
        add  edi,12+8
124
 
124
 
125
        mov  esi,eax
125
        mov  esi,eax
126
 
126
 
127
        mov  eax,edi
127
        mov  eax,edi
128
        mov  [eax+0],dword '    '
128
        mov  [eax+0],dword '    '
129
        mov  [eax+4],dword '    '
129
        mov  [eax+4],dword '    '
130
        mov  [eax+8],dword '    '
130
        mov  [eax+8],dword '    '
131
 
131
 
132
      flr1:
132
      flr1:
133
 
133
 
134
        cmp  [esi],byte '.'
134
        cmp  [esi],byte '.'
135
        jne  flr2
135
        jne  flr2
136
        mov  edi,eax
136
        mov  edi,eax
137
        add  edi,7
137
        add  edi,7
138
        jmp  flr3
138
        jmp  flr3
139
 
139
 
140
      flr2:
140
      flr2:
141
 
141
 
142
        mov  bl,[esi]
142
        mov  bl,[esi]
143
        mov  [edi],bl
143
        mov  [edi],bl
144
 
144
 
145
      flr3:
145
      flr3:
146
 
146
 
147
        inc  esi
147
        inc  esi
148
        inc  edi
148
        inc  edi
149
 
149
 
150
        mov  ebx,eax
150
        mov  ebx,eax
151
        add  ebx,11
151
        add  ebx,11
152
 
152
 
153
        cmp  edi,ebx
153
        cmp  edi,ebx
154
        jbe  flr1
154
        jbe  flr1
155
 
155
 
156
        pop  ebx edi esi
156
        pop  ebx edi esi
157
        ret
157
        ret
158
 
158
 
159
fileread:
159
fileread:
160
;----------------------------------------------------------------
160
;----------------------------------------------------------------
161
;
161
;
162
;  fileread - sys floppy
162
;  fileread - sys floppy
163
;
163
;
164
;  eax  points to filename 11 chars
164
;  eax  points to filename 11 chars
165
;  ebx  first wanted block       ; 1+ ; if 0 then set to 1
165
;  ebx  first wanted block       ; 1+ ; if 0 then set to 1
166
;  ecx  number of blocks to read ; 1+ ; if 0 then set to 1
166
;  ecx  number of blocks to read ; 1+ ; if 0 then set to 1
167
;  edx  mem location to return data
167
;  edx  mem location to return data
168
;  esi  length of filename 12*X 0=root
168
;  esi  length of filename 12*X 0=root
169
;
169
;
170
;  ret ebx = size or 0xffffffff file not found
170
;  ret ebx = size or 0xffffffff file not found
171
;      eax = 0 ok read or other = errormsg
171
;      eax = 0 ok read or other = errormsg
172
;
172
;
173
;--------------------------------------------------------------
173
;--------------------------------------------------------------
174
        test   ebx,ebx ;if ebx=0 - set to 1
174
        test   ebx,ebx ;if ebx=0 - set to 1
175
        jnz    frfl5
175
        jnz    frfl5
176
        inc    ebx
176
        inc    ebx
177
      frfl5:
177
      frfl5:
178
        test   ecx,ecx ;if ecx=0 - set to 1
178
        test   ecx,ecx ;if ecx=0 - set to 1
179
        jnz    frfl6
179
        jnz    frfl6
180
        inc    ecx
180
        inc    ecx
181
      frfl6:
181
      frfl6:
182
        test   esi,esi          ; return ramdisk root
182
        test   esi,esi          ; return ramdisk root
183
        jnz    fr_noroot        ;if not root
183
        jnz    fr_noroot        ;if not root
184
        cmp    ebx,14           ;14 clusters=root dir
184
        cmp    ebx,14           ;14 clusters=root dir
185
        ja     oorr
185
        ja     oorr
186
        cmp    ecx,14
186
        cmp    ecx,14
187
        ja     oorr
187
        ja     oorr
188
        jmp    fr_do
188
        jmp    fr_do
189
      oorr:
189
      oorr:
190
        mov    eax,5            ;out of root range (fnf)
190
        mov    eax,5            ;out of root range (fnf)
191
        xor    ebx,ebx
191
        xor    ebx,ebx
192
        dec    ebx              ;0xffffffff
192
        dec    ebx              ;0xffffffff
193
        ret
193
        ret
194
 
194
 
195
      fr_do:                    ;reading rootdir
195
      fr_do:                    ;reading rootdir
196
        mov    edi,edx
196
        mov    edi,edx
197
        dec    ebx
197
        dec    ebx
198
        push   edx
198
        push   edx
199
        mov    edx,ecx     
199
        mov    edx,ecx     
200
        add    edx,ebx
200
        add    edx,ebx
201
        cmp    edx,15     ;ebx+ecx=14+1
201
        cmp    edx,15     ;ebx+ecx=14+1
202
        pushf
202
        pushf
203
        jbe    fr_do1
203
        jbe    fr_do1
204
        sub    edx,14
204
        sub    edx,14
205
        sub    ecx,edx
205
        sub    ecx,edx
206
      fr_do1:
206
      fr_do1:
207
        shl    ebx,9
207
        shl    ebx,9
208
        mov    esi,0x100000+512*19
208
        mov    esi,0x100000+512*19
209
        add    esi,ebx
209
        add    esi,ebx
210
        shl    ecx,7
210
        shl    ecx,7
211
        cld
211
        cld
212
        rep    movsd
212
        rep    movsd
213
        popf
213
        popf
214
        pop    edx
214
        pop    edx
215
        jae    fr_do2
215
        jae    fr_do2
216
        xor    eax,eax ; ok read
216
        xor    eax,eax ; ok read
217
        xor    ebx,ebx
217
        xor    ebx,ebx
218
        ret
218
        ret
219
      fr_do2:        ;if last cluster
219
      fr_do2:        ;if last cluster
220
        mov    eax,6  ;end of file
220
        mov    eax,6  ;end of file
221
        xor    ebx,ebx
221
        xor    ebx,ebx
222
        ret
222
        ret
223
 
223
 
224
     fr_noroot:
224
     fr_noroot:
225
 
225
 
226
        sub    esp,32
226
        sub    esp,32
227
        call   expand_filename
227
        call   expand_filename
228
 
228
 
229
        dec    ebx
229
        dec    ebx
230
 
230
 
231
        push   eax
231
        push   eax
232
 
232
 
233
        push   eax ebx ecx edx esi edi
233
        push   eax ebx ecx edx esi edi
234
        call   rd_findfile
234
        call   rd_findfile
235
        je     fifound
235
        je     fifound
236
        add    esp,32+28   ;if file not found
236
        add    esp,32+28   ;if file not found
237
        ret
237
        ret
238
 
238
 
239
     fifound:
239
     fifound:
240
 
240
 
241
        mov    ebx,[edi-11+28]          ;file size
241
        mov    ebx,[edi-11+28]          ;file size
242
        mov    [esp+20],ebx
242
        mov    [esp+20],ebx
243
        mov    [esp+24],ebx
243
        mov    [esp+24],ebx
244
        add    edi,0xf
244
        add    edi,0xf
245
        movzx  eax,word [edi]
245
        movzx  eax,word [edi]
246
        mov    edi,eax                  ;edi=cluster
246
        mov    edi,eax                  ;edi=cluster
247
 
247
 
248
      frnew:
248
      frnew:
249
 
249
 
250
        add    eax,31                   ;bootsector+2*fat+filenames
250
        add    eax,31                   ;bootsector+2*fat+filenames
251
        shl    eax,9                    ;*512
251
        shl    eax,9                    ;*512
252
        add    eax,0x100000             ;image base
252
        add    eax,0x100000             ;image base
253
        mov    ebx,[esp+8]
253
        mov    ebx,[esp+8]
254
        mov    ecx,512                  ;[esp+4]
254
        mov    ecx,512                  ;[esp+4]
255
 
255
 
256
        cmp    [esp+16],dword 0         ; wanted cluster ?
256
        cmp    [esp+16],dword 0         ; wanted cluster ?
257
        jne    frfl7
257
        jne    frfl7
258
        call   memmove
258
        call   memmove
259
        add    [esp+8],dword 512
259
        add    [esp+8],dword 512
260
        dec    dword [esp+12]           ; last wanted cluster ?
260
        dec    dword [esp+12]           ; last wanted cluster ?
261
        cmp    [esp+12],dword 0
261
        cmp    [esp+12],dword 0
262
        je     frnoread
262
        je     frnoread
263
        jmp    frfl8
263
        jmp    frfl8
264
      frfl7:
264
      frfl7:
265
        dec    dword [esp+16]
265
        dec    dword [esp+16]
266
      frfl8:
266
      frfl8:
267
        shl    edi,1                    ;find next cluster from FAT
267
        shl    edi,1                    ;find next cluster from FAT
268
        add    edi,0x280000
268
        add    edi,0x280000
269
        movzx  eax,word [edi]
269
        movzx  eax,word [edi]
270
        mov    edi,eax
270
        mov    edi,eax
271
        cmp    edi,4095                 ;eof  - cluster
271
        cmp    edi,4095                 ;eof  - cluster
272
        jz     frnoread2
272
        jz     frnoread2
273
 
273
 
274
        cmp    [esp+24],dword 512       ;eof  - size
274
        cmp    [esp+24],dword 512       ;eof  - size
275
        jb     frnoread
275
        jb     frnoread
276
        sub    [esp+24],dword 512
276
        sub    [esp+24],dword 512
277
 
277
 
278
        jmp    frnew
278
        jmp    frnew
279
 
279
 
280
      frnoread2:
280
      frnoread2:
281
 
281
 
282
        cmp    [esp+16],dword 0         ; eof without read ?
282
        cmp    [esp+16],dword 0         ; eof without read ?
283
        je     frnoread
283
        je     frnoread
284
 
284
 
285
        pop    edi esi edx ecx
285
        pop    edi esi edx ecx
286
        add    esp,4
286
        add    esp,4
287
        pop    ebx     ; ebx <- eax : size of file
287
        pop    ebx     ; ebx <- eax : size of file
288
        add    esp,36
288
        add    esp,36
289
        mov    eax,6   ; end of file
289
        mov    eax,6   ; end of file
290
        ret
290
        ret
291
 
291
 
292
      frnoread:
292
      frnoread:
293
 
293
 
294
        pop    edi esi edx ecx
294
        pop    edi esi edx ecx
295
        add    esp,4
295
        add    esp,4
296
        pop    ebx     ; ebx <- eax : size of file
296
        pop    ebx     ; ebx <- eax : size of file
297
        add    esp,36
297
        add    esp,36
298
        xor    eax,eax  ;read ok
298
        xor    eax,eax  ;read ok
299
        ret
299
        ret
300
 
300
 
301
filedelete:
301
filedelete:
302
;--------------------------------------------
302
;--------------------------------------------
303
;
303
;
304
; filedelete - sys floppy
304
; filedelete - sys floppy
305
; in:
305
; in:
306
; eax -  pointer to filename 11 chars
306
; eax -  pointer to filename 11 chars
307
;
307
;
308
; out:
308
; out:
309
; eax - 0 = successful, 5 = file not found
309
; eax - 0 = successful, 5 = file not found
310
;
310
;
311
;--------------------------------------------
311
;--------------------------------------------
312
 
312
 
313
        sub    esp,32
313
        sub    esp,32
314
        call   expand_filename
314
        call   expand_filename
315
 
315
 
316
        push   eax ebx ecx edx esi edi
316
        push   eax ebx ecx edx esi edi
317
        
317
        
318
        call   rd_findfile
318
        call   rd_findfile
319
        je     fifoundd
319
        je     fifoundd
320
        pop    edi esi edx ecx ebx eax ;file not found
320
        pop    edi esi edx ecx ebx eax ;file not found
321
        add    esp,32
321
        add    esp,32
322
        mov    eax,5
322
        mov    eax,5
323
        ret
323
        ret
324
 
324
 
325
     fifoundd:
325
     fifoundd:
326
 
326
 
327
        mov    [edi-11],byte 0xE5       ;mark filename deleted
327
        mov    [edi-11],byte 0xE5       ;mark filename deleted
328
        add    edi,0xf
328
        add    edi,0xf
329
        movzx  eax,word [edi]
329
        movzx  eax,word [edi]
330
        mov    edi,eax                  ;edi = cluster
330
        mov    edi,eax                  ;edi = cluster
331
 
331
 
332
      frnewd:
332
      frnewd:
333
 
333
 
334
        shl    edi,1                    ;find next cluster from FAT
334
        shl    edi,1                    ;find next cluster from FAT
335
        add    edi,0x280000
335
        add    edi,0x280000
336
        movzx  eax,word [edi]
336
        movzx  eax,word [edi]
337
        mov    [edi],word 0x0           ;clear fat chain cluster
337
        mov    [edi],word 0x0           ;clear fat chain cluster
338
        mov    edi,eax
338
        mov    edi,eax
339
        cmp    edi,dword 0xff8          ;last cluster ?
339
        cmp    edi,dword 0xff8          ;last cluster ?
340
        jb     frnewd
340
        jb     frnewd
341
 
341
 
342
        pop    edi esi edx ecx ebx eax
342
        pop    edi esi edx ecx ebx eax
343
        add    esp,32
343
        add    esp,32
344
        xor    eax,eax       ; file found
344
        xor    eax,eax       ; file found
345
        ret
345
        ret
346
 
346
 
347
      
347
      
348
 
348
 
349
filesave:
349
filesave:
350
;----------------------------------------------------------
350
;----------------------------------------------------------
351
;
351
;
352
; filesave - sys floppy
352
; filesave - sys floppy
353
;
353
;
354
; eax points to filename 11 chars
354
; eax points to filename 11 chars
355
;
355
;
356
;        eax      ; pointer to file name
356
;        eax      ; pointer to file name
357
;        ebx      ; buffer
357
;        ebx      ; buffer
358
;        ecx      ; count to write in bytes
358
;        ecx      ; count to write in bytes
359
;        edx      ; 0 create new , 1 append
359
;        edx      ; 0 create new , 1 append
360
;
360
;
361
;-----------------------------------------------------------
361
;-----------------------------------------------------------
362
 
362
 
363
        sub  esp,32
363
        sub  esp,32
364
        call expand_filename
364
        call expand_filename
365
        test edx,edx
365
        test edx,edx
366
        jnz  fsdel
366
        jnz  fsdel
367
        pusha
367
        pusha
368
        call filedelete
368
        call filedelete
369
        popa
369
        popa
370
 
370
 
371
      fsdel:
371
      fsdel:
372
 
372
 
373
        call   ramdisk_free_space
373
        call   ramdisk_free_space
374
        cmp    ecx,edi
374
        cmp    ecx,edi
375
        jbe    rd_do_save
375
        jbe    rd_do_save
376
        add    esp,32
376
        add    esp,32
377
        mov    eax,8    ;disk full
377
        mov    eax,8    ;disk full
378
        ret
378
        ret
379
 
379
 
380
      rd_do_save:
380
      rd_do_save:
381
 
381
 
382
        push   eax ebx ecx edx esi edi
382
        push   eax ebx ecx edx esi edi
383
 
383
 
384
        mov    edi,0x100000+512*18+512  ;Point at directory
384
        mov    edi,0x100000+512*18+512  ;Point at directory
385
        mov    edx,224 +1
385
        mov    edx,224 +1
386
        ; find an empty spot for filename in the root dir
386
        ; find an empty spot for filename in the root dir
387
     l20ds:
387
     l20ds:
388
        dec    edx
388
        dec    edx
389
        test   edx,edx
389
        test   edx,edx
390
        jz     frnoreadds
390
        jz     frnoreadds
391
     l21ds:
391
     l21ds:
392
        cmp    [edi],byte 0xE5
392
        cmp    [edi],byte 0xE5
393
        jz     fifoundds
393
        jz     fifoundds
394
        cmp    [edi],byte 0x0
394
        cmp    [edi],byte 0x0
395
        jz     fifoundds
395
        jz     fifoundds
396
        add    edi,32                   ; Advance to next entry
396
        add    edi,32                   ; Advance to next entry
397
        jmp    l20ds
397
        jmp    l20ds
398
     fifoundds:
398
     fifoundds:
399
 
399
 
400
        push   edi                      ; move the filename to root dir
400
        push   edi                      ; move the filename to root dir
401
        mov    esi,[esp+4+20]
401
        mov    esi,[esp+4+20]
402
        mov    ecx,11
402
        mov    ecx,11
403
        cld
403
        cld
404
        rep    movsb
404
        rep    movsb
405
        pop    edi
405
        pop    edi
406
        mov    edx,edi
406
        mov    edx,edi
407
        add    edx,11+0xf               ; edx <- cluster save position
407
        add    edx,11+0xf               ; edx <- cluster save position
408
        mov    ebx,[esp+12]             ; save file size
408
        mov    ebx,[esp+12]             ; save file size
409
        mov    [edi+28],ebx
409
        mov    [edi+28],ebx
410
        mov    [edi+11],byte 0x20       ; attribute
410
        mov    [edi+11],byte 0x20       ; attribute
411
; Ivan Poddubny 11/12/2003:
411
; Ivan Poddubny 11/12/2003:
412
call get_date_for_file   ; from FAT32.INC
412
call get_date_for_file   ; from FAT32.INC
413
mov [edi+24],ax          ; date
413
mov [edi+24],ax          ; date
414
call get_time_for_file   ; from FAT32.INC
414
call get_time_for_file   ; from FAT32.INC
415
mov [edi+22],ax          ; time
415
mov [edi+22],ax          ; time
416
; End
416
; End
417
        mov    edi,0x280000            ;pointer to first cluster
417
        mov    edi,0x280000            ;pointer to first cluster
418
        mov    ecx,2849
418
        mov    ecx,2849
419
        cld
419
        cld
420
      frnewds:
420
      frnewds:
421
        xor    ax,ax
421
        xor    ax,ax
422
        repne  scasw
422
        repne  scasw
423
        mov    ebx,2848
423
        mov    ebx,2848
424
        sub    ebx,ecx
424
        sub    ebx,ecx
425
        mov    [edx],bx                 ; save next cluster pos. to prev cl.
425
        mov    [edx],bx                 ; save next cluster pos. to prev cl.
426
        mov    edx,edi                  ; next save pos abs mem add
426
        mov    edx,edi                  ; next save pos abs mem add
427
        dec    edx
427
        dec    edx
428
        dec    edx
428
        dec    edx
429
        call   fdc_filesave
429
        call   fdc_filesave
430
        pusha                           ; move save to floppy cluster
430
        pusha                           ; move save to floppy cluster
431
        add    ebx,31
431
        add    ebx,31
432
        shl    ebx,9
432
        shl    ebx,9
433
        add    ebx,0x100000
433
        add    ebx,0x100000
434
        mov    eax,[esp+32+16]
434
        mov    eax,[esp+32+16]
435
        mov    ecx,512
435
        mov    ecx,512
436
        call   memmove
436
        call   memmove
437
        popa
437
        popa
438
 
438
 
439
        mov    eax,[esp+12]
439
        mov    eax,[esp+12]
440
        cmp    eax,512
440
        cmp    eax,512
441
        jb     flnsa
441
        jb     flnsa
442
        sub    eax,512
442
        sub    eax,512
443
        mov    [esp+12],eax
443
        mov    [esp+12],eax
444
        mov    eax,[esp+16]
444
        mov    eax,[esp+16]
445
        add    eax,512
445
        add    eax,512
446
        mov    [esp+16],eax
446
        mov    [esp+16],eax
447
        jmp    frnewds
447
        jmp    frnewds
448
 
448
 
449
     flnsa:
449
     flnsa:
450
        dec    edi
450
        dec    edi
451
        dec    edi
451
        dec    edi
452
        mov    [edi],word 4095          ; mark end of file - last cluster
452
        mov    [edi],word 4095          ; mark end of file - last cluster
453
 
453
 
454
      frnoreadds:
454
      frnoreadds:
455
 
455
 
456
        pop    edi esi edx ecx ebx eax
456
        pop    edi esi edx ecx ebx eax
457
        add    esp,32
457
        add    esp,32
458
 
458
 
459
        pusha
459
;        pusha
460
        cli
460
;        cli
461
        call   fdc_commitfile
461
;        call   fdc_commitfile
462
        sti
462
;        sti
463
        popa
463
;        popa
464
 
464
 
465
        xor    eax,eax ;ok write
465
        xor    eax,eax ;ok write
466
        ret
466
        ret
467
 
467
 
468
   rd_findfile:
468
   rd_findfile:
469
   ;by Mihasik
469
   ;by Mihasik
470
   ;IN: eax - pointer to filename OUT: filestring+11 in edi or notZero in flags and fnf in eax,ebx
470
   ;IN: eax - pointer to filename OUT: filestring+11 in edi or notZero in flags and fnf in eax,ebx
471
 
471
 
472
        mov    edi,0x100000+512*18+512  ;Point at directory
472
        mov    edi,0x100000+512*18+512  ;Point at directory
473
        cld
473
        cld
474
    rd_newsearch:
474
    rd_newsearch:
475
        mov    esi,eax
475
        mov    esi,eax
476
        mov    ecx,11
476
        mov    ecx,11
477
        rep    cmpsb
477
        rep    cmpsb
478
        je     rd_ff
478
        je     rd_ff
479
        add    cl,21
479
        add    cl,21
480
        add    edi,ecx
480
        add    edi,ecx
481
        cmp    edi,0x100000+512*33
481
        cmp    edi,0x100000+512*33
482
        jb     rd_newsearch
482
        jb     rd_newsearch
483
        mov    eax,5      ;if file not found - eax=5
483
        mov    eax,5      ;if file not found - eax=5
484
        xor    ebx,ebx
484
        xor    ebx,ebx
485
        dec    ebx    ;ebx=0xffffffff and zf=0    
485
        dec    ebx    ;ebx=0xffffffff and zf=0    
486
     rd_ff:
486
     rd_ff:
487
        ret            
487
        ret            
488
 
488
 
489
  rd_getfileinfo:
489
  rd_getfileinfo:
490
     ;get date, time, size or attributes of file
490
     ;get date, time, size or attributes of file
491
     ;IN: eax - pointer to file, ebx - type of function: 12-get filesize, 13-get fileattr, 14-get filedate
491
     ;IN: eax - pointer to file, ebx - type of function: 12-get filesize, 13-get fileattr, 14-get filedate
492
     ;ecx - filelengh 0=root
492
     ;ecx - filelengh 0=root
493
     ;OUT: eax=0 - Ok or 5 - file not found ebx - date/time, size or attributes 
493
     ;OUT: eax=0 - Ok or 5 - file not found ebx - date/time, size or attributes 
494
        test   ecx,ecx
494
        test   ecx,ecx
495
        jnz    no_getfinfo_root
495
        jnz    no_getfinfo_root
496
        mov    eax,5      ;if root - fnf
496
        mov    eax,5      ;if root - fnf
497
        xor    ebx,ebx
497
        xor    ebx,ebx
498
        dec    ebx
498
        dec    ebx
499
        ret
499
        ret
500
    no_getfinfo_root:     ;if not root
500
    no_getfinfo_root:     ;if not root
501
        sub    esp,32
501
        sub    esp,32
502
        call   expand_filename
502
        call   expand_filename
503
        call   rd_findfile
503
        call   rd_findfile
504
        je     fifoundi
504
        je     fifoundi
505
        add    esp,32      ;if file not found
505
        add    esp,32      ;if file not found
506
        ret
506
        ret
507
    fifoundi:    
507
    fifoundi:    
508
        cmp    ebx,13
508
        cmp    ebx,13
509
        jne    no_rd_attr
509
        jne    no_rd_attr
510
        movzx ebx,byte [edi]    ;get attributes
510
        movzx ebx,byte [edi]    ;get attributes
511
        jmp    rd_getfileinfo_end 
511
        jmp    rd_getfileinfo_end 
512
     no_rd_attr:
512
     no_rd_attr:
513
        cmp    ebx,14
513
        cmp    ebx,14
514
        jne    no_rd_date
514
        jne    no_rd_date
515
        mov    ebx,dword [edi+11] ;get date/time
515
        mov    ebx,dword [edi+11] ;get date/time
516
        jmp    rd_getfileinfo_end
516
        jmp    rd_getfileinfo_end
517
     no_rd_date:
517
     no_rd_date:
518
        mov    ebx,dword [edi+17] ;get size
518
        mov    ebx,dword [edi+17] ;get size
519
     rd_getfileinfo_end:
519
     rd_getfileinfo_end:
520
        xor    eax,eax
520
        xor    eax,eax
521
        add    esp,32
521
        add    esp,32
522
        ret
522
        ret