Rev 109 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 109 | Rev 135 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | file_handler: |
1 | file_handler: |
2 | .position=0 |
2 | .operation=0 |
3 | .size=4 |
3 | .position=4 |
4 | .bufer_block=8 |
4 | .reserved=8 |
5 | .operation=12 |
- | |
6 | .first_block=16 |
- | |
7 | .n_blocks=20 |
5 | .n_bytes=12 |
8 | .bufer=24 |
6 | .bufer=16 |
9 | .work_area=28 |
- | |
10 | .name=32 |
7 | .name=20 |
11 | .st_size=32+128 |
8 | .st_size=20+1024 |
Line 12... | Line 9... | ||
12 | 9 | ||
13 | open: ;esi=name_string |
10 | open: ;esi=name_string |
14 | ;retorna eax |
11 | ;retorna eax |
15 | pushad |
- | |
16 | push dword [work_area] |
- | |
17 | mov ecx,512 ;bufer |
- | |
18 | call malloc |
- | |
19 | push edi |
12 | pushad |
20 | mov ecx,file_handler.st_size |
13 | mov ecx,file_handler.st_size |
21 | call mallocz |
- | |
22 | pop dword[edi+file_handler.bufer] |
- | |
23 | pop dword[edi+file_handler.work_area] |
14 | call mallocz |
- | 15 | mov [esp+28],edi |
|
24 | mov [esp+28],edi |
16 | push edi |
25 | mov ecx,100 |
17 | mov ecx,1024 |
26 | add edi,file_handler.name |
18 | add edi,file_handler.name |
27 | call movedata |
19 | call movedata |
28 | mov edi,[esp+28] |
- | |
29 | mov byte[edi+file_handler.n_blocks],1 |
20 | pop edi |
30 | mov eax,58 |
21 | ; test if file exists |
- | 22 | lea ebx,[edi+file_handler.operation] |
|
- | 23 | mov byte[ebx],5 |
|
31 | lea ebx,[edi+file_handler.operation] |
24 | mov dword[ebx+16],fileattr |
32 | push edi |
25 | mov eax,70 |
33 | int 0x40 |
26 | int 0x40 |
- | 27 | cmp eax,2 |
|
34 | pop edi |
28 | jz .virtual |
35 | test eax,eax |
29 | test eax,eax |
36 | jnz close.b |
- | |
- | 30 | jnz close.b |
|
37 | mov [edi+file_handler.size],ebx |
31 | @@: |
38 | clc |
32 | clc |
39 | popad |
33 | popad |
- | 34 | ret |
|
- | 35 | .virtual: |
|
- | 36 | mov byte [fileattr], 0x10 |
|
Line 40... | Line 37... | ||
40 | ret |
37 | jmp @b |
41 | 38 | ||
42 | close: |
39 | close: |
43 | pushad |
40 | pushad |
44 | .b: |
- | |
45 | mov eax,[esp+28] |
- | |
46 | mov edi,[eax+file_handler.bufer] |
- | |
47 | call free |
41 | .b: |
48 | mov edi,eax |
42 | mov edi,[esp+28] |
49 | call free |
43 | call free |
50 | popad |
44 | popad |
Line 51... | Line 45... | ||
51 | xor eax,eax |
45 | xor eax,eax |
52 | ret |
46 | ret |
53 | 47 | ||
54 | - | ||
55 | read: ;(f,bufer,nbytes) eax,edi,ecx ncr |
- | |
56 | ;retorna bytes leidos en ecx |
- | |
57 | pushad |
- | |
58 | mov edx,[eax+file_handler.size] |
- | |
59 | sub edx,[eax+file_handler.position] |
- | |
60 | cmp edx,ecx |
- | |
61 | jnc .nb_ok |
- | |
62 | mov ecx,edx |
- | |
63 | mov [esp+24],edx |
- | |
64 | .nb_ok: |
- | |
65 | jecxz .final |
- | |
66 | mov byte[eax+file_handler.operation],0 |
- | |
67 | test dword[eax+file_handler.position],511 |
- | |
68 | jz .l1 |
- | |
69 | call .bufer |
- | |
70 | .l1: |
- | |
71 | mov edx,ecx |
- | |
72 | shr edx,9 |
- | |
73 | jz .l2 |
- | |
74 | mov [eax+file_handler.n_blocks],edx |
- | |
75 | mov edx,[eax+file_handler.position] |
- | |
76 | shr edx,9 |
- | |
77 | mov [eax+file_handler.first_block],edx |
- | |
78 | xchg edi,[eax+file_handler.bufer] |
- | |
79 | pushad |
- | |
80 | lea ebx,[eax+file_handler.operation] |
- | |
81 | mov eax,58 |
- | |
82 | int 40h |
- | |
83 | cmp eax,0ffffff00h |
- | |
84 | jnc .error |
- | |
85 | popad |
- | |
86 | xchg edi,[eax+file_handler.bufer] |
- | |
87 | mov edx,ecx |
- | |
88 | and edx,0fffffe00h |
- | |
89 | add [eax+file_handler.position],edx |
- | |
90 | add edi,edx |
- | |
91 | .l2: |
- | |
92 | and ecx,511 |
- | |
93 | jz .final |
- | |
94 | call .bufer |
- | |
95 | .final: |
- | |
96 | popad |
- | |
97 | ret |
- | |
98 | - | ||
99 | .bufer: |
- | |
100 | pushad |
- | |
101 | mov ebx,[eax+file_handler.position] |
- | |
102 | shr ebx,9 |
- | |
103 | cmp ebx,[eax+file_handler.bufer_block] |
- | |
104 | je .l3 |
48 | |
- | 49 | read: ;(f,bufer,nbytes) eax,edi,ecx ncr |
|
- | 50 | ;retorna bytes leidos en ecx |
|
- | 51 | pushad |
|
105 | mov [eax+file_handler.first_block],ebx |
52 | lea ebx, [eax+file_handler.operation] |
106 | mov [eax+file_handler.bufer_block],ebx |
53 | mov byte [ebx], 0 |
107 | mov dword[eax+file_handler.n_blocks],1 |
54 | mov [ebx+12], ecx |
108 | lea ebx,[eax+file_handler.operation] |
55 | mov [ebx+16], edi |
109 | mov eax,58 |
- | |
110 | int 40h |
56 | mov eax, 70 |
111 | cmp eax,0ffffff00h |
- | |
112 | jnc .error |
- | |
113 | .l3: |
- | |
114 | mov eax,[esp+28] |
- | |
115 | mov edx,[eax+file_handler.position] |
- | |
116 | mov esi,[eax+file_handler.bufer] |
- | |
117 | and edx,511 |
- | |
118 | add esi,edx |
- | |
119 | neg edx |
- | |
120 | add edx,512 |
- | |
121 | cmp ecx,edx |
57 | int 0x40 |
122 | jc .l4 |
58 | cmp ebx, -1 |
123 | mov ecx,edx |
- | |
124 | .l4: |
- | |
125 | add [eax+file_handler.position],ecx |
- | |
126 | sub [esp+24],ecx |
- | |
127 | pop edi |
- | |
128 | call movedata |
- | |
129 | push edi |
- | |
130 | popad |
59 | sbb ebx, -1 |
131 | ret |
- | |
132 | .error: |
- | |
133 | popad |
60 | mov eax, [esp+28] |
Line 134... | Line -... | ||
134 | popad |
- | |
135 | xor ecx,ecx |
61 | add [eax+file_handler.position], ebx |
136 | stc |
62 | mov [esp+24], ebx |
137 | ret |
63 | popad |
138 | 64 | ret |
|
139 | 65 |