Subversion Repositories Kolibri OS

Rev

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

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