Subversion Repositories Kolibri OS

Rev

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