Rev 19 | Rev 71 | 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 |
||
48 | halyavin | 441 | jbe flnsa |
1 | ha | 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->->-> |