Rev 154 | Rev 379 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 154 | Rev 364 | ||
---|---|---|---|
1 | uglobal |
1 | uglobal |
2 | cd_current_pointer_of_input dd 0 |
2 | cd_current_pointer_of_input dd 0 |
3 | cd_current_pointer_of_input_2 dd 0 |
3 | cd_current_pointer_of_input_2 dd 0 |
4 | cd_mem_location dd 0 |
4 | cd_mem_location dd 0 |
5 | cd_counter_block dd 0 |
5 | cd_counter_block dd 0 |
6 | IDE_Channel_1 db 0 |
6 | IDE_Channel_1 db 0 |
7 | IDE_Channel_2 db 0 |
7 | IDE_Channel_2 db 0 |
8 | endg |
8 | endg |
9 | 9 | ||
10 | CDDataBuf equ 0x7000 |
10 | CDDataBuf equ 0x7000 |
11 | 11 | ||
12 | reserve_cd: |
12 | reserve_cd: |
13 | 13 | ||
14 | cli |
14 | cli |
15 | cmp [cd_status],0 |
15 | cmp [cd_status],0 |
16 | je reserve_ok2 |
16 | je reserve_ok2 |
17 | 17 | ||
18 | sti |
18 | sti |
19 | call change_task |
19 | call change_task |
20 | jmp reserve_cd |
20 | jmp reserve_cd |
21 | 21 | ||
22 | reserve_ok2: |
22 | reserve_ok2: |
23 | 23 | ||
24 | push eax |
24 | push eax |
25 | mov eax,[0x3000] |
25 | mov eax,[0x3000] |
26 | shl eax,5 |
26 | shl eax,5 |
27 | mov eax,[eax+0x3000+TASKDATA.pid] |
27 | mov eax,[eax+0x3000+TASKDATA.pid] |
28 | mov [cd_status],eax |
28 | mov [cd_status],eax |
29 | pop eax |
29 | pop eax |
30 | sti |
30 | sti |
31 | ret |
31 | ret |
32 | 32 | ||
33 | reserve_cd_channel: |
33 | reserve_cd_channel: |
34 | cmp [ChannelNumber],1 |
34 | cmp [ChannelNumber],1 |
35 | jne .IDE_Channel_2 |
35 | jne .IDE_Channel_2 |
36 | .IDE_Channel_1: |
36 | .IDE_Channel_1: |
37 | cli |
37 | cli |
38 | cmp [IDE_Channel_1],0 |
38 | cmp [IDE_Channel_1],0 |
39 | je .reserve_ok_1 |
39 | je .reserve_ok_1 |
40 | sti |
40 | sti |
41 | call change_task |
41 | call change_task |
42 | jmp .IDE_Channel_1 |
42 | jmp .IDE_Channel_1 |
43 | .IDE_Channel_2: |
43 | .IDE_Channel_2: |
44 | cli |
44 | cli |
45 | cmp [IDE_Channel_2],0 |
45 | cmp [IDE_Channel_2],0 |
46 | je .reserve_ok_2 |
46 | je .reserve_ok_2 |
47 | sti |
47 | sti |
48 | call change_task |
48 | call change_task |
49 | jmp .IDE_Channel_1 |
49 | jmp .IDE_Channel_1 |
50 | .reserve_ok_1: |
50 | .reserve_ok_1: |
51 | mov [IDE_Channel_1],1 |
51 | mov [IDE_Channel_1],1 |
52 | ret |
52 | ret |
53 | .reserve_ok_2: |
53 | .reserve_ok_2: |
54 | mov [IDE_Channel_2],1 |
54 | mov [IDE_Channel_2],1 |
55 | ret |
55 | ret |
56 | 56 | ||
57 | free_cd_channel: |
57 | free_cd_channel: |
58 | cmp [ChannelNumber],1 |
58 | cmp [ChannelNumber],1 |
59 | jne .IDE_Channel_2 |
59 | jne .IDE_Channel_2 |
60 | .IDE_Channel_1: |
60 | .IDE_Channel_1: |
61 | mov [IDE_Channel_1],0 |
61 | mov [IDE_Channel_1],0 |
62 | ret |
62 | ret |
63 | .IDE_Channel_2: |
63 | .IDE_Channel_2: |
64 | mov [IDE_Channel_2],0 |
64 | mov [IDE_Channel_2],0 |
65 | ret |
65 | ret |
66 | 66 | ||
- | 67 | uglobal |
|
67 | cd_status dd 0 |
68 | cd_status dd 0 |
- | 69 | endg |
|
68 | 70 | ||
69 | ;---------------------------------------------------------------- |
71 | ;---------------------------------------------------------------- |
70 | ; |
72 | ; |
71 | ; fs_CdRead - LFN variant for reading CD disk |
73 | ; fs_CdRead - LFN variant for reading CD disk |
72 | ; |
74 | ; |
73 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
75 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
74 | ; ebx pointer to 64-bit number = first wanted byte, 0+ |
76 | ; ebx pointer to 64-bit number = first wanted byte, 0+ |
75 | ; may be ebx=0 - start from first byte |
77 | ; may be ebx=0 - start from first byte |
76 | ; ecx number of bytes to read, 0+ |
78 | ; ecx number of bytes to read, 0+ |
77 | ; edx mem location to return data |
79 | ; edx mem location to return data |
78 | ; |
80 | ; |
79 | ; ret ebx = bytes read or 0xffffffff file not found |
81 | ; ret ebx = bytes read or 0xffffffff file not found |
80 | ; eax = 0 ok read or other = errormsg |
82 | ; eax = 0 ok read or other = errormsg |
81 | ; |
83 | ; |
82 | ;-------------------------------------------------------------- |
84 | ;-------------------------------------------------------------- |
83 | fs_CdRead: |
85 | fs_CdRead: |
84 | push edi |
86 | push edi |
85 | cmp byte [esi], 0 |
87 | cmp byte [esi], 0 |
86 | jnz @f |
88 | jnz @f |
87 | .noaccess: |
89 | .noaccess: |
88 | pop edi |
90 | pop edi |
89 | .noaccess_2: |
91 | .noaccess_2: |
90 | or ebx, -1 |
92 | or ebx, -1 |
91 | mov eax, ERROR_ACCESS_DENIED |
93 | mov eax, ERROR_ACCESS_DENIED |
92 | ret |
94 | ret |
93 | 95 | ||
94 | .noaccess_3: |
96 | .noaccess_3: |
95 | pop eax edx ecx edi |
97 | pop eax edx ecx edi |
96 | jmp .noaccess_2 |
98 | jmp .noaccess_2 |
97 | 99 | ||
98 | @@: |
100 | @@: |
99 | call cd_find_lfn |
101 | call cd_find_lfn |
100 | jnc .found |
102 | jnc .found |
101 | pop edi |
103 | pop edi |
102 | cmp [DevErrorCode],0 |
104 | cmp [DevErrorCode],0 |
103 | jne .noaccess_2 |
105 | jne .noaccess_2 |
104 | or ebx, -1 |
106 | or ebx, -1 |
105 | mov eax, ERROR_FILE_NOT_FOUND |
107 | mov eax, ERROR_FILE_NOT_FOUND |
106 | ret |
108 | ret |
107 | 109 | ||
108 | .found: |
110 | .found: |
109 | mov edi,[cd_current_pointer_of_input] |
111 | mov edi,[cd_current_pointer_of_input] |
110 | test byte [edi+25],10b ; do not allow read directories |
112 | test byte [edi+25],10b ; do not allow read directories |
111 | jnz .noaccess |
113 | jnz .noaccess |
112 | test ebx, ebx |
114 | test ebx, ebx |
113 | jz .l1 |
115 | jz .l1 |
114 | cmp dword [ebx+4], 0 |
116 | cmp dword [ebx+4], 0 |
115 | jz @f |
117 | jz @f |
116 | xor ebx, ebx |
118 | xor ebx, ebx |
117 | .reteof: |
119 | .reteof: |
118 | mov eax, 6 ; end of file |
120 | mov eax, 6 ; end of file |
119 | pop edi |
121 | pop edi |
120 | ret |
122 | ret |
121 | @@: |
123 | @@: |
122 | mov ebx, [ebx] |
124 | mov ebx, [ebx] |
123 | .l1: |
125 | .l1: |
124 | push ecx edx |
126 | push ecx edx |
125 | push 0 |
127 | push 0 |
126 | mov eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè |
128 | mov eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè |
127 | sub eax, ebx |
129 | sub eax, ebx |
128 | jb .eof |
130 | jb .eof |
129 | cmp eax, ecx |
131 | cmp eax, ecx |
130 | jae @f |
132 | jae @f |
131 | mov ecx, eax |
133 | mov ecx, eax |
132 | mov byte [esp], 6 |
134 | mov byte [esp], 6 |
133 | @@: |
135 | @@: |
134 | mov eax,[edi+2] |
136 | mov eax,[edi+2] |
135 | mov [CDSectorAddress],eax |
137 | mov [CDSectorAddress],eax |
136 | ; now eax=cluster, ebx=position, ecx=count, edx=buffer for data |
138 | ; now eax=cluster, ebx=position, ecx=count, edx=buffer for data |
137 | .new_sector: |
139 | .new_sector: |
138 | test ecx, ecx |
140 | test ecx, ecx |
139 | jz .done |
141 | jz .done |
140 | sub ebx, 2048 |
142 | sub ebx, 2048 |
141 | jae .next |
143 | jae .next |
142 | add ebx, 2048 |
144 | add ebx, 2048 |
143 | jnz .incomplete_sector |
145 | jnz .incomplete_sector |
144 | cmp ecx, 2048 |
146 | cmp ecx, 2048 |
145 | jb .incomplete_sector |
147 | jb .incomplete_sector |
146 | ; we may read and memmove complete sector |
148 | ; we may read and memmove complete sector |
147 | mov [CDDataBuf_pointer],edx |
149 | mov [CDDataBuf_pointer],edx |
148 | call ReadCDWRetr ; ÷èòàåì ñåêòîð ôàéëà |
150 | call ReadCDWRetr ; ÷èòàåì ñåêòîð ôàéëà |
149 | cmp [DevErrorCode],0 |
151 | cmp [DevErrorCode],0 |
150 | jne .noaccess_3 |
152 | jne .noaccess_3 |
151 | add edx, 2048 |
153 | add edx, 2048 |
152 | sub ecx, 2048 |
154 | sub ecx, 2048 |
153 | .next: |
155 | .next: |
154 | inc dword [CDSectorAddress] |
156 | inc dword [CDSectorAddress] |
155 | jmp .new_sector |
157 | jmp .new_sector |
156 | .incomplete_sector: |
158 | .incomplete_sector: |
157 | ; we must read and memmove incomplete sector |
159 | ; we must read and memmove incomplete sector |
158 | mov [CDDataBuf_pointer],CDDataBuf |
160 | mov [CDDataBuf_pointer],CDDataBuf |
159 | call ReadCDWRetr ; ÷èòàåì ñåêòîð ôàéëà |
161 | call ReadCDWRetr ; ÷èòàåì ñåêòîð ôàéëà |
160 | cmp [DevErrorCode],0 |
162 | cmp [DevErrorCode],0 |
161 | jne .noaccess_3 |
163 | jne .noaccess_3 |
162 | push ecx |
164 | push ecx |
163 | add ecx, ebx |
165 | add ecx, ebx |
164 | cmp ecx, 2048 |
166 | cmp ecx, 2048 |
165 | jbe @f |
167 | jbe @f |
166 | mov ecx, 2048 |
168 | mov ecx, 2048 |
167 | @@: |
169 | @@: |
168 | sub ecx, ebx |
170 | sub ecx, ebx |
169 | push edi esi ecx |
171 | push edi esi ecx |
170 | mov edi,edx |
172 | mov edi,edx |
171 | lea esi, [CDDataBuf + ebx] |
173 | lea esi, [CDDataBuf + ebx] |
172 | cld |
174 | cld |
173 | rep movsb |
175 | rep movsb |
174 | pop ecx esi edi |
176 | pop ecx esi edi |
175 | add edx, ecx |
177 | add edx, ecx |
176 | sub [esp], ecx |
178 | sub [esp], ecx |
177 | pop ecx |
179 | pop ecx |
178 | xor ebx, ebx |
180 | xor ebx, ebx |
179 | jmp .next |
181 | jmp .next |
180 | 182 | ||
181 | .done: |
183 | .done: |
182 | mov ebx, edx |
184 | mov ebx, edx |
183 | pop eax edx ecx edi |
185 | pop eax edx ecx edi |
184 | sub ebx, edx |
186 | sub ebx, edx |
185 | ret |
187 | ret |
186 | .eof: |
188 | .eof: |
187 | mov ebx, edx |
189 | mov ebx, edx |
188 | pop eax edx ecx |
190 | pop eax edx ecx |
189 | sub ebx, edx |
191 | sub ebx, edx |
190 | jmp .reteof |
192 | jmp .reteof |
191 | 193 | ||
192 | ;---------------------------------------------------------------- |
194 | ;---------------------------------------------------------------- |
193 | ; |
195 | ; |
194 | ; fs_CdReadFolder - LFN variant for reading CD disk folder |
196 | ; fs_CdReadFolder - LFN variant for reading CD disk folder |
195 | ; |
197 | ; |
196 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
198 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
197 | ; ebx pointer to structure 32-bit number = first wanted block, 0+ |
199 | ; ebx pointer to structure 32-bit number = first wanted block, 0+ |
198 | ; & flags (bitfields) |
200 | ; & flags (bitfields) |
199 | ; flags: bit 0: 0=ANSI names, 1=UNICODE names |
201 | ; flags: bit 0: 0=ANSI names, 1=UNICODE names |
200 | ; ecx number of blocks to read, 0+ |
202 | ; ecx number of blocks to read, 0+ |
201 | ; edx mem location to return data |
203 | ; edx mem location to return data |
202 | ; |
204 | ; |
203 | ; ret ebx = blocks read or 0xffffffff folder not found |
205 | ; ret ebx = blocks read or 0xffffffff folder not found |
204 | ; eax = 0 ok read or other = errormsg |
206 | ; eax = 0 ok read or other = errormsg |
205 | ; |
207 | ; |
206 | ;-------------------------------------------------------------- |
208 | ;-------------------------------------------------------------- |
207 | fs_CdReadFolder: |
209 | fs_CdReadFolder: |
208 | push edi |
210 | push edi |
209 | call cd_find_lfn |
211 | call cd_find_lfn |
210 | jnc .found |
212 | jnc .found |
211 | pop edi |
213 | pop edi |
212 | cmp [DevErrorCode],0 |
214 | cmp [DevErrorCode], 0 |
213 | jne .noaccess_1 |
215 | jne .noaccess_1 |
214 | or ebx, -1 |
216 | or ebx, -1 |
215 | mov eax, ERROR_FILE_NOT_FOUND |
217 | mov eax, ERROR_FILE_NOT_FOUND |
216 | ret |
218 | ret |
217 | .found: |
219 | .found: |
218 | mov edi,[cd_current_pointer_of_input] |
220 | mov edi, [cd_current_pointer_of_input] |
219 | test byte [edi+25],10b ; do not allow read directories |
221 | test byte [edi+25], 10b ; do not allow read directories |
220 | jnz .found_dir |
222 | jnz .found_dir |
221 | pop edi |
223 | pop edi |
222 | .noaccess_1: |
224 | .noaccess_1: |
223 | or ebx, -1 |
225 | or ebx, -1 |
224 | mov eax, ERROR_ACCESS_DENIED |
226 | mov eax, ERROR_ACCESS_DENIED |
225 | ret |
227 | ret |
226 | .found_dir: |
228 | .found_dir: |
227 | mov eax,[edi+2] ; eax=cluster |
229 | mov eax, [edi+2] ; eax=cluster |
228 | mov [CDSectorAddress],eax |
230 | mov [CDSectorAddress], eax |
229 | mov eax,[edi+10] ; ðàçìåð äèðåêòðîðèè |
231 | mov eax, [edi+10] ; ðàçìåð äèðåêòðîðèè |
230 | .doit: |
232 | .doit: |
231 | ; init header |
233 | ; init header |
232 | push eax ecx |
234 | push eax ecx |
233 | mov edi, edx |
235 | mov edi, edx |
234 | mov ecx, 32/4 |
236 | mov ecx, 32/4 |
235 | xor eax, eax |
237 | xor eax, eax |
236 | rep stosd |
238 | rep stosd |
237 | pop ecx eax |
239 | pop ecx eax |
238 | mov byte [edx], 1 ; version |
240 | mov byte [edx], 1 ; version |
239 | mov [cd_mem_location],edx |
241 | mov [cd_mem_location], edx |
240 | add [cd_mem_location],32 |
242 | add [cd_mem_location], 32 |
241 | ; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ |
243 | ; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ |
242 | ;.mainloop: |
244 | ;.mainloop: |
243 | mov [cd_counter_block],dword 0 |
245 | mov [cd_counter_block], dword 0 |
244 | dec dword [CDSectorAddress] |
246 | dec dword [CDSectorAddress] |
245 | push ecx |
247 | push ecx |
246 | .read_to_buffer: |
248 | .read_to_buffer: |
247 | inc dword [CDSectorAddress] |
249 | inc dword [CDSectorAddress] |
248 | mov [CDDataBuf_pointer],CDDataBuf |
250 | mov [CDDataBuf_pointer], CDDataBuf |
249 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
251 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
250 | cmp [DevErrorCode],0 |
252 | cmp [DevErrorCode], 0 |
251 | jne .noaccess_1 |
253 | jne .noaccess_1 |
252 | call .get_names_from_buffer |
254 | call .get_names_from_buffer |
253 | sub eax,2048 |
255 | sub eax,2048 |
254 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
256 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
255 | cmp eax,0 |
257 | ja .read_to_buffer |
256 | ja .read_to_buffer |
- | |
257 | mov edi,[cd_counter_block] |
258 | mov edi, [cd_counter_block] |
258 | mov [edx+8],edi |
259 | mov [edx+8], edi |
259 | mov edi,[ebx] |
260 | mov edi, [ebx] |
260 | sub [edx+4],edi |
261 | sub [edx+4], edi |
261 | pop ecx edi |
262 | xor eax, eax |
- | 263 | dec ecx |
|
- | 264 | js @f |
|
- | 265 | mov al, ERROR_END_OF_FILE |
|
- | 266 | @@: |
|
- | 267 | pop ecx edi |
|
262 | mov ebx, [edx+4] |
268 | mov ebx, [edx+4] |
263 | mov eax,ERROR_SUCCESS |
269 | ret |
264 | ret |
- | |
265 | 270 | ||
266 | .get_names_from_buffer: |
271 | .get_names_from_buffer: |
267 | mov [cd_current_pointer_of_input_2],CDDataBuf |
272 | mov [cd_current_pointer_of_input_2],CDDataBuf |
268 | push eax esi edi edx |
273 | push eax esi edi edx |
269 | .get_names_from_buffer_1: |
274 | .get_names_from_buffer_1: |
270 | call cd_get_name |
275 | call cd_get_name |
271 | jc .end_buffer |
276 | jc .end_buffer |
272 | inc dword [cd_counter_block] |
277 | inc dword [cd_counter_block] |
273 | mov eax,[cd_counter_block] |
278 | mov eax,[cd_counter_block] |
274 | cmp [ebx],eax |
279 | cmp [ebx],eax |
275 | jae .get_names_from_buffer_1 |
280 | jae .get_names_from_buffer_1 |
276 | test ecx, ecx |
281 | test ecx, ecx |
277 | jz .get_names_from_buffer_1 |
282 | jz .get_names_from_buffer_1 |
278 | mov edi,[cd_counter_block] |
283 | mov edi,[cd_counter_block] |
279 | mov [edx+4],edi |
284 | mov [edx+4],edi |
280 | dec ecx |
285 | dec ecx |
281 | mov esi,ebp |
286 | mov esi,ebp |
282 | mov edi,[cd_mem_location] |
287 | mov edi,[cd_mem_location] |
283 | add edi,40 |
288 | add edi,40 |
284 | test dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE |
289 | test dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE |
285 | jnz .unicode |
290 | jnz .unicode |
286 | ; jmp .unicode |
291 | ; jmp .unicode |
287 | .ansi: |
292 | .ansi: |
288 | cmp [cd_counter_block],2 |
293 | cmp [cd_counter_block],2 |
289 | jbe .ansi_parent_directory |
294 | jbe .ansi_parent_directory |
290 | cld |
295 | cld |
291 | lodsw |
296 | lodsw |
292 | xchg ah,al |
297 | xchg ah,al |
293 | call uni2ansi_char |
298 | call uni2ansi_char |
294 | cld |
299 | cld |
295 | stosb |
300 | stosb |
296 | ; ïðîâåðêà êîíöà ôàéëà |
301 | ; ïðîâåðêà êîíöà ôàéëà |
297 | mov ax,[esi] |
302 | mov ax,[esi] |
298 | cmp ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
303 | cmp ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
299 | je .cd_get_parameters_of_file_1 |
304 | je .cd_get_parameters_of_file_1 |
300 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
305 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
301 | movzx eax,byte [ebp-33] |
306 | movzx eax,byte [ebp-33] |
302 | add eax,ebp |
307 | add eax,ebp |
303 | sub eax,34 |
308 | sub eax,34 |
304 | cmp esi,eax |
309 | cmp esi,eax |
305 | je .cd_get_parameters_of_file_1 |
310 | je .cd_get_parameters_of_file_1 |
306 | ; ïðîâåðêà êîíöà ïàïêè |
311 | ; ïðîâåðêà êîíöà ïàïêè |
307 | movzx eax,byte [ebp-1] |
312 | movzx eax,byte [ebp-1] |
308 | add eax,ebp |
313 | add eax,ebp |
309 | cmp esi,eax |
314 | cmp esi,eax |
310 | jb .ansi |
315 | jb .ansi |
311 | .cd_get_parameters_of_file_1: |
316 | .cd_get_parameters_of_file_1: |
312 | mov [edi],byte 0 |
317 | mov [edi],byte 0 |
313 | call cd_get_parameters_of_file |
318 | call cd_get_parameters_of_file |
314 | add [cd_mem_location],304 |
319 | add [cd_mem_location],304 |
315 | jmp .get_names_from_buffer_1 |
320 | jmp .get_names_from_buffer_1 |
316 | 321 | ||
317 | .ansi_parent_directory: |
322 | .ansi_parent_directory: |
318 | cmp [cd_counter_block],2 |
323 | cmp [cd_counter_block],2 |
319 | je @f |
324 | je @f |
320 | mov [edi],byte '.' |
325 | mov [edi],byte '.' |
321 | inc edi |
326 | inc edi |
322 | jmp .cd_get_parameters_of_file_1 |
327 | jmp .cd_get_parameters_of_file_1 |
323 | @@: |
328 | @@: |
324 | mov [edi],word '..' |
329 | mov [edi],word '..' |
325 | add edi,2 |
330 | add edi,2 |
326 | jmp .cd_get_parameters_of_file_1 |
331 | jmp .cd_get_parameters_of_file_1 |
327 | 332 | ||
328 | .unicode: |
333 | .unicode: |
329 | cmp [cd_counter_block],2 |
334 | cmp [cd_counter_block],2 |
330 | jbe .unicode_parent_directory |
335 | jbe .unicode_parent_directory |
331 | cld |
336 | cld |
332 | movsw |
337 | movsw |
333 | ; ïðîâåðêà êîíöà ôàéëà |
338 | ; ïðîâåðêà êîíöà ôàéëà |
334 | mov ax,[esi] |
339 | mov ax,[esi] |
335 | cmp ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
340 | cmp ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
336 | je .cd_get_parameters_of_file_2 |
341 | je .cd_get_parameters_of_file_2 |
337 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
342 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
338 | movzx eax,byte [ebp-33] |
343 | movzx eax,byte [ebp-33] |
339 | add eax,ebp |
344 | add eax,ebp |
340 | sub eax,34 |
345 | sub eax,34 |
341 | cmp esi,eax |
346 | cmp esi,eax |
342 | je .cd_get_parameters_of_file_2 |
347 | je .cd_get_parameters_of_file_2 |
343 | ; ïðîâåðêà êîíöà ïàïêè |
348 | ; ïðîâåðêà êîíöà ïàïêè |
344 | movzx eax,byte [ebp-1] |
349 | movzx eax,byte [ebp-1] |
345 | add eax,ebp |
350 | add eax,ebp |
346 | cmp esi,eax |
351 | cmp esi,eax |
347 | jb .unicode |
352 | jb .unicode |
348 | .cd_get_parameters_of_file_2: |
353 | .cd_get_parameters_of_file_2: |
349 | mov [edi],word 0 |
354 | mov [edi],word 0 |
350 | call cd_get_parameters_of_file |
355 | call cd_get_parameters_of_file |
351 | add [cd_mem_location],560 |
356 | add [cd_mem_location],560 |
352 | jmp .get_names_from_buffer_1 |
357 | jmp .get_names_from_buffer_1 |
353 | 358 | ||
354 | .unicode_parent_directory: |
359 | .unicode_parent_directory: |
355 | cmp [cd_counter_block],2 |
360 | cmp [cd_counter_block],2 |
356 | je @f |
361 | je @f |
357 | mov [edi],word 2E00h ; '.' |
362 | mov [edi],word 2E00h ; '.' |
358 | add edi,2 |
363 | add edi,2 |
359 | jmp .cd_get_parameters_of_file_2 |
364 | jmp .cd_get_parameters_of_file_2 |
360 | @@: |
365 | @@: |
361 | mov [edi],dword 2E002E00h ; '..' |
366 | mov [edi],dword 2E002E00h ; '..' |
362 | add edi,4 |
367 | add edi,4 |
363 | jmp .cd_get_parameters_of_file_2 |
368 | jmp .cd_get_parameters_of_file_2 |
364 | 369 | ||
365 | .end_buffer: |
370 | .end_buffer: |
366 | pop edx edi esi eax |
371 | pop edx edi esi eax |
367 | ret |
372 | ret |
368 | 373 | ||
369 | cd_get_parameters_of_file: |
374 | cd_get_parameters_of_file: |
370 | mov edi,[cd_mem_location] |
375 | mov edi,[cd_mem_location] |
371 | cd_get_parameters_of_file_1: |
376 | cd_get_parameters_of_file_1: |
372 | ; ïîëó÷àåì àòðèáóòû ôàéëà |
377 | ; ïîëó÷àåì àòðèáóòû ôàéëà |
373 | xor eax,eax |
378 | xor eax,eax |
374 | ; ôàéë íå àðõèâèðîâàëñÿ |
379 | ; ôàéë íå àðõèâèðîâàëñÿ |
375 | inc al |
380 | inc al |
376 | shl eax,1 |
381 | shl eax,1 |
377 | ; ýòî êàòàëîã? |
382 | ; ýòî êàòàëîã? |
378 | test [ebp-8],byte 2 |
383 | test [ebp-8],byte 2 |
379 | jz .file |
384 | jz .file |
380 | inc al |
385 | inc al |
381 | .file: |
386 | .file: |
382 | ; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò |
387 | ; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò |
383 | ; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì |
388 | ; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì |
384 | shl eax,3 |
389 | shl eax,3 |
385 | ; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå) |
390 | ; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå) |
386 | test [ebp-8],byte 1 |
391 | test [ebp-8],byte 1 |
387 | jz .hidden |
392 | jz .hidden |
388 | inc al |
393 | inc al |
389 | .hidden: |
394 | .hidden: |
390 | shl eax,1 |
395 | shl eax,1 |
391 | ; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD |
396 | ; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD |
392 | inc al |
397 | inc al |
393 | mov [edi],eax |
398 | mov [edi],eax |
394 | ; ïîëó÷àåì âðåìÿ äëÿ ôàéëà |
399 | ; ïîëó÷àåì âðåìÿ äëÿ ôàéëà |
395 | ;÷àñ |
400 | ;÷àñ |
396 | movzx eax,byte [ebp-12] |
401 | movzx eax,byte [ebp-12] |
397 | shl eax,8 |
402 | shl eax,8 |
398 | ;ìèíóòà |
403 | ;ìèíóòà |
399 | mov al,[ebp-11] |
404 | mov al,[ebp-11] |
400 | shl eax,8 |
405 | shl eax,8 |
401 | ;ñåêóíäà |
406 | ;ñåêóíäà |
402 | mov al,[ebp-10] |
407 | mov al,[ebp-10] |
403 | ;âðåìÿ ñîçäàíèÿ ôàéëà |
408 | ;âðåìÿ ñîçäàíèÿ ôàéëà |
404 | mov [edi+8],eax |
409 | mov [edi+8],eax |
405 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
410 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
406 | mov [edi+16],eax |
411 | mov [edi+16],eax |
407 | ;âðåìÿ ïîñëåäíåé çàïèñè |
412 | ;âðåìÿ ïîñëåäíåé çàïèñè |
408 | mov [edi+24],eax |
413 | mov [edi+24],eax |
409 | ; ïîëó÷àåì äàòó äëÿ ôàéëà |
414 | ; ïîëó÷àåì äàòó äëÿ ôàéëà |
410 | ;ãîä |
415 | ;ãîä |
411 | movzx eax,byte [ebp-15] |
416 | movzx eax,byte [ebp-15] |
412 | add eax,1900 |
417 | add eax,1900 |
413 | shl eax,8 |
418 | shl eax,8 |
414 | ;ìåñÿö |
419 | ;ìåñÿö |
415 | mov al,[ebp-14] |
420 | mov al,[ebp-14] |
416 | shl eax,8 |
421 | shl eax,8 |
417 | ;äåíü |
422 | ;äåíü |
418 | mov al,[ebp-13] |
423 | mov al,[ebp-13] |
419 | ;äàòà ñîçäàíèÿ ôàéëà |
424 | ;äàòà ñîçäàíèÿ ôàéëà |
420 | mov [edi+12],eax |
425 | mov [edi+12],eax |
421 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
426 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
422 | mov [edi+20],eax |
427 | mov [edi+20],eax |
423 | ;âðåìÿ ïîñëåäíåé çàïèñè |
428 | ;âðåìÿ ïîñëåäíåé çàïèñè |
424 | mov [edi+28],eax |
429 | mov [edi+28],eax |
425 | ; ïîëó÷àåì òèï äàííûõ èìåíè |
430 | ; ïîëó÷àåì òèï äàííûõ èìåíè |
426 | xor eax,eax |
431 | xor eax,eax |
427 | test dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE |
432 | test dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE |
428 | jnz .unicode_1 |
433 | jnz .unicode_1 |
429 | mov [edi+4],eax |
434 | mov [edi+4],eax |
430 | jmp @f |
435 | jmp @f |
431 | .unicode_1: |
436 | .unicode_1: |
432 | inc eax |
437 | inc eax |
433 | mov [edi+4],eax |
438 | mov [edi+4],eax |
434 | @@: |
439 | @@: |
435 | ; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ |
440 | ; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ |
436 | xor eax,eax |
441 | xor eax,eax |
437 | mov [edi+32+4],eax |
442 | mov [edi+32+4],eax |
438 | mov eax,[ebp-23] |
443 | mov eax,[ebp-23] |
439 | mov [edi+32],eax |
444 | mov [edi+32],eax |
440 | ret |
445 | ret |
441 | 446 | ||
442 | ;---------------------------------------------------------------- |
447 | ;---------------------------------------------------------------- |
443 | ; |
448 | ; |
444 | ; fs_CdGetFileInfo - LFN variant for CD |
449 | ; fs_CdGetFileInfo - LFN variant for CD |
445 | ; get file/directory attributes structure |
450 | ; get file/directory attributes structure |
446 | ; |
451 | ; |
447 | ;---------------------------------------------------------------- |
452 | ;---------------------------------------------------------------- |
448 | fs_CdGetFileInfo: |
453 | fs_CdGetFileInfo: |
449 | cmp byte [esi], 0 |
454 | cmp byte [esi], 0 |
450 | jnz @f |
455 | jnz @f |
451 | mov eax, 2 |
456 | mov eax, 2 |
452 | ret |
457 | ret |
453 | @@: |
458 | @@: |
454 | push edi ebp |
459 | push edi ebp |
455 | call cd_find_lfn |
460 | call cd_find_lfn |
456 | pushfd |
461 | pushfd |
457 | cmp [DevErrorCode], 0 |
462 | cmp [DevErrorCode], 0 |
458 | jz @f |
463 | jz @f |
459 | popfd |
464 | popfd |
460 | pop ebp edi |
465 | pop ebp edi |
461 | mov eax, 11 |
466 | mov eax, 11 |
462 | ret |
467 | ret |
463 | @@: |
468 | @@: |
464 | popfd |
469 | popfd |
465 | jnc @f |
470 | jnc @f |
466 | pop ebp edi |
471 | pop ebp edi |
467 | mov eax, ERROR_FILE_NOT_FOUND |
472 | mov eax, ERROR_FILE_NOT_FOUND |
468 | ret |
473 | ret |
469 | @@: |
474 | @@: |
470 | 475 | ||
471 | mov edi, edx |
476 | mov edi, edx |
472 | call cd_get_parameters_of_file_1 |
477 | call cd_get_parameters_of_file_1 |
473 | and dword [edi+4], 0 |
478 | and dword [edi+4], 0 |
474 | pop ebp edi |
479 | pop ebp edi |
475 | xor eax, eax |
480 | xor eax, eax |
476 | ret |
481 | ret |
477 | 482 | ||
478 | ;---------------------------------------------------------------- |
483 | ;---------------------------------------------------------------- |
479 | ; |
484 | ; |
480 | ; fs_CdExecute - LFN variant for executing from CD |
485 | ; fs_CdExecute - LFN variant for executing from CD |
481 | ; |
486 | ; |
482 | ; esi points to hd filename (e.g. 'dir1/name') |
487 | ; esi points to hd filename (e.g. 'dir1/name') |
483 | ; ebp points to full filename (e.g. '/hd0/1/dir1/name') |
488 | ; ebp points to full filename (e.g. '/hd0/1/dir1/name') |
484 | ; dword [ebx] = flags |
489 | ; dword [ebx] = flags |
485 | ; dword [ebx+4] = cmdline |
490 | ; dword [ebx+4] = cmdline |
486 | ; |
491 | ; |
487 | ; ret ebx,edx destroyed |
492 | ; ret ebx,edx destroyed |
488 | ; eax > 0 - PID, < 0 - error |
493 | ; eax > 0 - PID, < 0 - error |
489 | ; |
494 | ; |
490 | ;-------------------------------------------------------------- |
495 | ;-------------------------------------------------------------- |
491 | fs_CdExecute: |
496 | fs_CdExecute: |
492 | mov edx, [ebx] |
497 | mov edx, [ebx] |
493 | mov ebx, [ebx+4] |
498 | mov ebx, [ebx+4] |
494 | test ebx, ebx |
499 | test ebx, ebx |
495 | jz @f |
500 | jz @f |
496 | add ebx, std_application_base_address |
501 | add ebx, std_application_base_address |
497 | @@: |
502 | @@: |
498 | 503 | ||
499 | ;---------------------------------------------------------------- |
504 | ;---------------------------------------------------------------- |
500 | ; |
505 | ; |
501 | ; fs_CdExecute.flags - second entry |
506 | ; fs_CdExecute.flags - second entry |
502 | ; |
507 | ; |
503 | ; esi points to floppy filename (kernel address) |
508 | ; esi points to floppy filename (kernel address) |
504 | ; ebp points to full filename |
509 | ; ebp points to full filename |
505 | ; edx flags |
510 | ; edx flags |
506 | ; ebx cmdline (kernel address) |
511 | ; ebx cmdline (kernel address) |
507 | ; |
512 | ; |
508 | ; ret eax > 0 - PID, < 0 - error |
513 | ; ret eax > 0 - PID, < 0 - error |
509 | ; |
514 | ; |
510 | ;-------------------------------------------------------------- |
515 | ;-------------------------------------------------------------- |
511 | 516 | ||
512 | .flags: |
517 | .flags: |
513 | cmp byte [esi], 0 |
518 | cmp byte [esi], 0 |
514 | jnz @f |
519 | jnz @f |
515 | ; cannot execute root! |
520 | ; cannot execute root! |
516 | mov eax, -ERROR_ACCESS_DENIED |
521 | mov eax, -ERROR_ACCESS_DENIED |
517 | ret |
522 | ret |
518 | @@: |
523 | @@: |
519 | push edi |
524 | push edi |
520 | call cd_find_lfn |
525 | call cd_find_lfn |
521 | jnc .found |
526 | jnc .found |
522 | pop edi |
527 | pop edi |
523 | mov eax, -ERROR_FILE_NOT_FOUND |
528 | mov eax, -ERROR_FILE_NOT_FOUND |
524 | cmp [DevErrorCode], 0 |
529 | cmp [DevErrorCode], 0 |
525 | jz @f |
530 | jz @f |
526 | mov al, -11 |
531 | mov al, -11 |
527 | @@: |
532 | @@: |
528 | ret |
533 | ret |
529 | .found: |
534 | .found: |
530 | mov edi,[cd_current_pointer_of_input] |
535 | mov edi,[cd_current_pointer_of_input] |
531 | mov eax,[edi+2] |
536 | mov eax,[edi+2] |
532 | push 0 |
537 | push 0 |
533 | push eax |
538 | push eax |
534 | push dword [edi+10] ; size |
539 | push dword [edi+10] ; size |
535 | push .DoRead |
540 | push .DoRead |
536 | call fs_execute |
541 | call fs_execute |
537 | add esp, 16 |
542 | add esp, 16 |
538 | pop edi |
543 | pop edi |
539 | ret |
544 | ret |
540 | 545 | ||
541 | .DoRead: |
546 | .DoRead: |
542 | ; read next block |
547 | ; read next block |
543 | ; in: eax->parameters, edi->buffer |
548 | ; in: eax->parameters, edi->buffer |
544 | ; out: eax = error code |
549 | ; out: eax = error code |
545 | pushad |
550 | pushad |
546 | cmp dword [eax], 0 ; file size |
551 | cmp dword [eax], 0 ; file size |
547 | jz .eof |
552 | jz .eof |
548 | cmp [eax+8],dword 0 |
553 | cmp [eax+8],dword 0 |
549 | jne @f |
554 | jne @f |
550 | mov ecx,[eax+4] |
555 | mov ecx,[eax+4] |
551 | inc dword [eax+4] |
556 | inc dword [eax+4] |
552 | mov [CDSectorAddress],ecx |
557 | mov [CDSectorAddress],ecx |
553 | mov [CDDataBuf_pointer],CDDataBuf ;edi |
558 | mov [CDDataBuf_pointer],CDDataBuf ;edi |
554 | call ReadCDWRetr |
559 | call ReadCDWRetr |
555 | cmp [DevErrorCode], 0 |
560 | cmp [DevErrorCode], 0 |
556 | jnz .err |
561 | jnz .err |
557 | @@: |
562 | @@: |
558 | push esi edi ecx |
563 | push esi edi ecx |
559 | mov esi,512 |
564 | mov esi,512 |
560 | imul esi,[eax+8] |
565 | imul esi,[eax+8] |
561 | add esi,CDDataBuf |
566 | add esi,CDDataBuf |
562 | mov ecx,512/4 |
567 | mov ecx,512/4 |
563 | cld |
568 | cld |
564 | rep movsd |
569 | rep movsd |
565 | pop ecx edi esi |
570 | pop ecx edi esi |
566 | 571 | ||
567 | mov eax, [esp+28] |
572 | mov eax, [esp+28] |
568 | mov ecx, [eax] |
573 | mov ecx, [eax] |
569 | sub ecx, 512 |
574 | sub ecx, 512 |
570 | jae @f |
575 | jae @f |
571 | lea edi, [edi+ecx+512] |
576 | lea edi, [edi+ecx+512] |
572 | neg ecx |
577 | neg ecx |
573 | push eax |
578 | push eax |
574 | xor eax, eax |
579 | xor eax, eax |
575 | rep stosb |
580 | rep stosb |
576 | pop eax |
581 | pop eax |
577 | @@: |
582 | @@: |
578 | mov [eax], ecx |
583 | mov [eax], ecx |
579 | mov edx, [eax+8] |
584 | mov edx, [eax+8] |
580 | inc edx |
585 | inc edx |
581 | cmp edx, 4 ; 2048/512=4 |
586 | cmp edx, 4 ; 2048/512=4 |
582 | jb @f |
587 | jb @f |
583 | xor edx, edx |
588 | xor edx, edx |
584 | @@: |
589 | @@: |
585 | mov [eax+8], edx |
590 | mov [eax+8], edx |
586 | popad |
591 | popad |
587 | xor eax, eax |
592 | xor eax, eax |
588 | ret |
593 | ret |
589 | .eof: |
594 | .eof: |
590 | popad |
595 | popad |
591 | mov eax, 6 |
596 | mov eax, 6 |
592 | ret |
597 | ret |
593 | .err: |
598 | .err: |
594 | popad |
599 | popad |
595 | mov eax, 11 |
600 | mov eax, 11 |
596 | ret |
601 | ret |
597 | 602 | ||
598 | cd_find_lfn: |
603 | cd_find_lfn: |
599 | ; in: esi->name |
604 | ; in: esi->name |
600 | ; out: CF=1 - file not found |
605 | ; out: CF=1 - file not found |
601 | ; else CF=0 and [cd_current_pointer_of_input] direntry |
606 | ; else CF=0 and [cd_current_pointer_of_input] direntry |
602 | push eax esi |
607 | push eax esi |
603 | ; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ |
608 | ; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ |
604 | mov [CDSectorAddress],dword 15 |
609 | mov [CDSectorAddress],dword 15 |
605 | .start: |
610 | .start: |
606 | inc dword [CDSectorAddress] |
611 | inc dword [CDSectorAddress] |
607 | mov [CDDataBuf_pointer],CDDataBuf |
612 | mov [CDDataBuf_pointer],CDDataBuf |
608 | call ReadCDWRetr |
613 | call ReadCDWRetr |
609 | cmp [DevErrorCode],0 |
614 | cmp [DevErrorCode],0 |
610 | jne .access_denied |
615 | jne .access_denied |
611 | ; ïðîâåðêà íà âøèâîñòü |
616 | ; ïðîâåðêà íà âøèâîñòü |
612 | cmp [CDDataBuf+1],dword 'CD00' |
617 | cmp [CDDataBuf+1],dword 'CD00' |
613 | jne .access_denied |
618 | jne .access_denied |
614 | cmp [CDDataBuf+5],byte '1' |
619 | cmp [CDDataBuf+5],byte '1' |
615 | jne .access_denied |
620 | jne .access_denied |
616 | ; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ? |
621 | ; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ? |
617 | cmp [CDDataBuf],byte 0xff |
622 | cmp [CDDataBuf],byte 0xff |
618 | je .access_denied |
623 | je .access_denied |
619 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà? |
624 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà? |
620 | cmp [CDDataBuf],byte 0x2 |
625 | cmp [CDDataBuf],byte 0x2 |
621 | jne .start |
626 | jne .start |
622 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà? |
627 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà? |
623 | cmp [CDDataBuf+6],byte 0x1 |
628 | cmp [CDDataBuf+6],byte 0x1 |
624 | jne .start |
629 | jne .start |
625 | ; ïàðàìåòðû root äèðåêòðîðèè |
630 | ; ïàðàìåòðû root äèðåêòðîðèè |
626 | mov eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè |
631 | mov eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè |
627 | mov [CDSectorAddress],eax |
632 | mov [CDSectorAddress],eax |
628 | mov eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè |
633 | mov eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè |
629 | cmp byte [esi], 0 |
634 | cmp byte [esi], 0 |
630 | jnz @f |
635 | jnz @f |
631 | mov [cd_current_pointer_of_input],CDDataBuf+0x9c |
636 | mov [cd_current_pointer_of_input],CDDataBuf+0x9c |
632 | jmp .done |
637 | jmp .done |
633 | @@: |
638 | @@: |
634 | ; íà÷èíàåì ïîèñê |
639 | ; íà÷èíàåì ïîèñê |
635 | .mainloop: |
640 | .mainloop: |
636 | dec dword [CDSectorAddress] |
641 | dec dword [CDSectorAddress] |
637 | .read_to_buffer: |
642 | .read_to_buffer: |
638 | inc dword [CDSectorAddress] |
643 | inc dword [CDSectorAddress] |
639 | mov [CDDataBuf_pointer],CDDataBuf |
644 | mov [CDDataBuf_pointer],CDDataBuf |
640 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
645 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
641 | cmp [DevErrorCode],0 |
646 | cmp [DevErrorCode],0 |
642 | jne .access_denied |
647 | jne .access_denied |
643 | call cd_find_name_in_buffer |
648 | call cd_find_name_in_buffer |
644 | jnc .found |
649 | jnc .found |
645 | sub eax,2048 |
650 | sub eax,2048 |
646 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
651 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
647 | cmp eax,0 |
652 | cmp eax,0 |
648 | ja .read_to_buffer |
653 | ja .read_to_buffer |
649 | ; íåò èñêîìîãî ýëåìåíòà öåïî÷êè |
654 | ; íåò èñêîìîãî ýëåìåíòà öåïî÷êè |
650 | .access_denied: |
655 | .access_denied: |
651 | pop esi eax |
656 | pop esi eax |
652 | stc |
657 | stc |
653 | ret |
658 | ret |
654 | ; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí |
659 | ; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí |
655 | .found: |
660 | .found: |
656 | ; êîíåö ïóòè ôàéëà |
661 | ; êîíåö ïóòè ôàéëà |
657 | cmp byte [esi-1], 0 |
662 | cmp byte [esi-1], 0 |
658 | jz .done |
663 | jz .done |
659 | mov eax,[cd_current_pointer_of_input] |
664 | mov eax,[cd_current_pointer_of_input] |
660 | add eax,2 |
665 | push dword [eax+2] |
661 | mov eax,[eax] |
- | |
662 | mov [CDSectorAddress],eax ; íà÷àëî äèðåêòîðèè |
666 | pop dword [CDSectorAddress] ; íà÷àëî äèðåêòîðèè |
663 | add eax,8 |
667 | mov eax,[eax+2+8] ; ðàçìåð äèðåêòîðèè |
664 | mov eax,[eax] ; ðàçìåð äèðåêòîðèè |
- | |
665 | jmp .mainloop |
668 | jmp .mainloop |
666 | ; óêàçàòåëü ôàéëà íàéäåí |
669 | ; óêàçàòåëü ôàéëà íàéäåí |
667 | .done: |
670 | .done: |
668 | pop esi eax |
671 | pop esi eax |
669 | clc |
672 | clc |
670 | ret |
673 | ret |
671 | 674 | ||
672 | cd_find_name_in_buffer: |
675 | cd_find_name_in_buffer: |
673 | mov [cd_current_pointer_of_input_2],CDDataBuf |
676 | mov [cd_current_pointer_of_input_2],CDDataBuf |
674 | .start: |
677 | .start: |
675 | call cd_get_name |
678 | call cd_get_name |
676 | jc .not_found |
679 | jc .not_found |
677 | call cd_compare_name |
680 | call cd_compare_name |
678 | jc .start |
681 | jc .start |
679 | .found: |
682 | .found: |
680 | clc |
683 | clc |
681 | ret |
684 | ret |
682 | .not_found: |
685 | .not_found: |
683 | stc |
686 | stc |
684 | ret |
687 | ret |
685 | 688 | ||
686 | cd_get_name: |
689 | cd_get_name: |
687 | push eax |
690 | push eax |
688 | mov ebp,[cd_current_pointer_of_input_2] |
691 | mov ebp,[cd_current_pointer_of_input_2] |
689 | mov [cd_current_pointer_of_input],ebp |
692 | mov [cd_current_pointer_of_input],ebp |
690 | mov eax,[ebp] |
693 | mov eax,[ebp] |
691 | cmp eax,0 ; âõîäû çàêîí÷èëèñü? |
694 | cmp eax,0 ; âõîäû çàêîí÷èëèñü? |
692 | je .next_sector |
695 | je .next_sector |
693 | cmp ebp,CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ? |
696 | cmp ebp,CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ? |
694 | jae .next_sector |
697 | jae .next_sector |
695 | movzx eax, byte [ebp] |
698 | movzx eax, byte [ebp] |
696 | add [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà |
699 | add [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà |
697 | add ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè |
700 | add ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè |
698 | pop eax |
701 | pop eax |
699 | clc |
702 | clc |
700 | ret |
703 | ret |
701 | .next_sector: |
704 | .next_sector: |
702 | pop eax |
705 | pop eax |
703 | stc |
706 | stc |
704 | ret |
707 | ret |
705 | 708 | ||
706 | cd_compare_name: |
709 | cd_compare_name: |
707 | ; compares ASCIIZ-names, case-insensitive (cp866 encoding) |
710 | ; compares ASCIIZ-names, case-insensitive (cp866 encoding) |
708 | ; in: esi->name, ebp->name |
711 | ; in: esi->name, ebp->name |
709 | ; out: if names match: ZF=1 and esi->next component of name |
712 | ; out: if names match: ZF=1 and esi->next component of name |
710 | ; else: ZF=0, esi is not changed |
713 | ; else: ZF=0, esi is not changed |
711 | ; destroys eax |
714 | ; destroys eax |
712 | push esi eax edi |
715 | push esi eax edi |
713 | mov edi,ebp |
716 | mov edi,ebp |
714 | .loop: |
717 | .loop: |
715 | cld |
718 | cld |
716 | lodsb |
719 | lodsb |
717 | push ax |
720 | push ax |
718 | call char_todown |
721 | call char_todown |
719 | call ansi2uni_char |
722 | call ansi2uni_char |
720 | xchg ah,al |
723 | xchg ah,al |
721 | cld |
724 | cld |
722 | scasw |
725 | scasw |
723 | pop ax |
726 | pop ax |
724 | je .coincides |
727 | je .coincides |
725 | call char_toupper |
728 | call char_toupper |
726 | call ansi2uni_char |
729 | call ansi2uni_char |
727 | xchg ah,al |
730 | xchg ah,al |
728 | cld |
731 | cld |
729 | sub edi,2 |
732 | sub edi,2 |
730 | scasw |
733 | scasw |
731 | jne .name_not_coincide |
734 | jne .name_not_coincide |
732 | .coincides: |
735 | .coincides: |
733 | cmp [esi],byte '/' ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
736 | cmp [esi],byte '/' ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
734 | je .done |
737 | je .done |
735 | cmp [esi],byte 0 ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
738 | cmp [esi],byte 0 ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
736 | je .done |
739 | je .done |
737 | jmp .loop |
740 | jmp .loop |
738 | .name_not_coincide: |
741 | .name_not_coincide: |
739 | pop edi eax esi |
742 | pop edi eax esi |
740 | stc |
743 | stc |
741 | ret |
744 | ret |
742 | .done: |
745 | .done: |
743 | ; ïðîâåðêà êîíöà ôàéëà |
746 | ; ïðîâåðêà êîíöà ôàéëà |
744 | cmp [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
747 | cmp [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';' |
745 | je .done_1 |
748 | je .done_1 |
746 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
749 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
747 | movzx eax,byte [ebp-33] |
750 | movzx eax,byte [ebp-33] |
748 | add eax,ebp |
751 | add eax,ebp |
749 | sub eax,34 |
752 | sub eax,34 |
750 | cmp edi,eax |
753 | cmp edi,eax |
751 | je .done_1 |
754 | je .done_1 |
752 | ; ïðîâåðêà êîíöà ïàïêè |
755 | ; ïðîâåðêà êîíöà ïàïêè |
753 | movzx eax,byte [ebp-1] |
756 | movzx eax,byte [ebp-1] |
754 | add eax,ebp |
757 | add eax,ebp |
755 | cmp edi,eax |
758 | cmp edi,eax |
756 | jne .name_not_coincide |
759 | jne .name_not_coincide |
757 | .done_1: |
760 | .done_1: |
758 | pop edi eax |
761 | pop edi eax |
759 | add esp,4 |
762 | add esp,4 |
760 | inc esi |
763 | inc esi |
761 | clc |
764 | clc |
762 | ret |
765 | ret |
763 | 766 | ||
764 | char_todown: |
767 | char_todown: |
765 | ; convert character to uppercase, using cp866 encoding |
768 | ; convert character to uppercase, using cp866 encoding |
766 | ; in: al=symbol |
769 | ; in: al=symbol |
767 | ; out: al=converted symbol |
770 | ; out: al=converted symbol |
768 | cmp al, 'A' |
771 | cmp al, 'A' |
769 | jb .ret |
772 | jb .ret |
770 | cmp al, 'Z' |
773 | cmp al, 'Z' |
771 | jbe .az |
774 | jbe .az |
772 | cmp al, '' |
775 | cmp al, '' |
773 | jb .ret |
776 | jb .ret |
774 | cmp al, '' |
777 | cmp al, '' |
775 | jb .rus1 |
778 | jb .rus1 |
776 | cmp al, '' |
779 | cmp al, '' |
777 | ja .ret |
780 | ja .ret |
778 | ; 0x90-0x9F -> 0xE0-0xEF |
781 | ; 0x90-0x9F -> 0xE0-0xEF |
779 | add al, 'à'-'' |
782 | add al, 'à'-'' |
780 | .ret: |
783 | .ret: |
781 | ret |
784 | ret |
782 | .rus1: |
785 | .rus1: |
783 | ; 0x80-0x8F -> 0xA0-0xAF |
786 | ; 0x80-0x8F -> 0xA0-0xAF |
784 | .az: |
787 | .az: |
785 | add al, 0x20 |
788 | add al, 0x20 |
786 | ret |
789 | ret |
787 | 790 | ||
788 | uni2ansi_char: |
791 | uni2ansi_char: |
789 | ; convert UNICODE character in al to ANSI character in ax, using cp866 encoding |
792 | ; convert UNICODE character in al to ANSI character in ax, using cp866 encoding |
790 | ; in: ax=UNICODE character |
793 | ; in: ax=UNICODE character |
791 | ; out: al=converted ANSI character |
794 | ; out: al=converted ANSI character |
792 | cmp ax, 0x80 |
795 | cmp ax, 0x80 |
793 | jb .ascii |
796 | jb .ascii |
794 | cmp ax, 0x401 |
797 | cmp ax, 0x401 |
795 | jz .yo1 |
798 | jz .yo1 |
796 | cmp ax, 0x451 |
799 | cmp ax, 0x451 |
797 | jz .yo2 |
800 | jz .yo2 |
798 | cmp ax, 0x410 |
801 | cmp ax, 0x410 |
799 | jb .unk |
802 | jb .unk |
800 | cmp ax, 0x440 |
803 | cmp ax, 0x440 |
801 | jb .rus1 |
804 | jb .rus1 |
802 | cmp ax, 0x450 |
805 | cmp ax, 0x450 |
803 | jb .rus2 |
806 | jb .rus2 |
804 | .unk: |
807 | .unk: |
805 | mov al, '_' |
808 | mov al, '_' |
806 | jmp .doit |
809 | jmp .doit |
807 | .yo1: |
810 | .yo1: |
808 | mov al, 'ð' |
811 | mov al, 'ð' |
809 | jmp .doit |
812 | jmp .doit |
810 | .yo2: |
813 | .yo2: |
811 | mov al, 'ñ' |
814 | mov al, 'ñ' |
812 | jmp .doit |
815 | jmp .doit |
813 | .rus1: |
816 | .rus1: |
814 | ; 0x410-0x43F -> 0x80-0xAF |
817 | ; 0x410-0x43F -> 0x80-0xAF |
815 | add al, 0x70 |
818 | add al, 0x70 |
816 | jmp .doit |
819 | jmp .doit |
817 | .rus2: |
820 | .rus2: |
818 | ; 0x440-0x44F -> 0xE0-0xEF |
821 | ; 0x440-0x44F -> 0xE0-0xEF |
819 | add al, 0xA0 |
822 | add al, 0xA0 |
820 | .ascii: |
823 | .ascii: |
821 | .doit: |
824 | .doit: |
822 | ret>> |
825 | ret>> |