Subversion Repositories Kolibri OS

Rev

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