Rev 2465 | Rev 3908 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2465 | Rev 3555 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 2465 $ |
8 | $Revision: 3555 $ |
9 | 9 | ||
10 | 10 | ||
Line 135... | Line 135... | ||
135 | @@: |
135 | @@: |
136 | mov ebx, [ebx] |
136 | mov ebx, [ebx] |
137 | .l1: |
137 | .l1: |
138 | push ecx edx |
138 | push ecx edx |
139 | push 0 |
139 | push 0 |
140 | mov eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè |
140 | mov eax, [edi+10] ; реальный размер файловой секции |
141 | sub eax, ebx |
141 | sub eax, ebx |
142 | jb .eof |
142 | jb .eof |
143 | cmp eax, ecx |
143 | cmp eax, ecx |
144 | jae @f |
144 | jae @f |
145 | mov ecx, eax |
145 | mov ecx, eax |
Line 157... | Line 157... | ||
157 | jnz .incomplete_sector |
157 | jnz .incomplete_sector |
158 | cmp ecx, 2048 |
158 | cmp ecx, 2048 |
159 | jb .incomplete_sector |
159 | jb .incomplete_sector |
160 | ; we may read and memmove complete sector |
160 | ; we may read and memmove complete sector |
161 | mov [CDDataBuf_pointer], edx |
161 | mov [CDDataBuf_pointer], edx |
162 | call ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà |
162 | call ReadCDWRetr; читаем сектор файла |
163 | cmp [DevErrorCode], 0 |
163 | cmp [DevErrorCode], 0 |
164 | jne .noaccess_3 |
164 | jne .noaccess_3 |
165 | add edx, 2048 |
165 | add edx, 2048 |
166 | sub ecx, 2048 |
166 | sub ecx, 2048 |
167 | .next: |
167 | .next: |
168 | inc dword [CDSectorAddress] |
168 | inc dword [CDSectorAddress] |
169 | jmp .new_sector |
169 | jmp .new_sector |
170 | .incomplete_sector: |
170 | .incomplete_sector: |
171 | ; we must read and memmove incomplete sector |
171 | ; we must read and memmove incomplete sector |
172 | mov [CDDataBuf_pointer], CDDataBuf |
172 | mov [CDDataBuf_pointer], CDDataBuf |
173 | call ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà |
173 | call ReadCDWRetr; читаем сектор файла |
174 | cmp [DevErrorCode], 0 |
174 | cmp [DevErrorCode], 0 |
175 | jne .noaccess_3 |
175 | jne .noaccess_3 |
176 | push ecx |
176 | push ecx |
177 | add ecx, ebx |
177 | add ecx, ebx |
178 | cmp ecx, 2048 |
178 | cmp ecx, 2048 |
Line 238... | Line 238... | ||
238 | mov eax, ERROR_ACCESS_DENIED |
238 | mov eax, ERROR_ACCESS_DENIED |
239 | ret |
239 | ret |
240 | .found_dir: |
240 | .found_dir: |
241 | mov eax, [edi+2] ; eax=cluster |
241 | mov eax, [edi+2] ; eax=cluster |
242 | mov [CDSectorAddress], eax |
242 | mov [CDSectorAddress], eax |
243 | mov eax, [edi+10] ; ðàçìåð äèðåêòðîðèè |
243 | mov eax, [edi+10] ; размер директрории |
244 | .doit: |
244 | .doit: |
245 | ; init header |
245 | ; init header |
246 | push eax ecx |
246 | push eax ecx |
247 | mov edi, edx |
247 | mov edi, edx |
248 | mov ecx, 32/4 |
248 | mov ecx, 32/4 |
Line 250... | Line 250... | ||
250 | rep stosd |
250 | rep stosd |
251 | pop ecx eax |
251 | pop ecx eax |
252 | mov byte [edx], 1 ; version |
252 | mov byte [edx], 1 ; version |
253 | mov [cd_mem_location], edx |
253 | mov [cd_mem_location], edx |
254 | add [cd_mem_location], 32 |
254 | add [cd_mem_location], 32 |
255 | ; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ |
255 | ; начинаем переброску БДВК в УСВК |
256 | ;.mainloop: |
256 | ;.mainloop: |
257 | mov [cd_counter_block], dword 0 |
257 | mov [cd_counter_block], dword 0 |
258 | dec dword [CDSectorAddress] |
258 | dec dword [CDSectorAddress] |
259 | push ecx |
259 | push ecx |
260 | .read_to_buffer: |
260 | .read_to_buffer: |
261 | inc dword [CDSectorAddress] |
261 | inc dword [CDSectorAddress] |
262 | mov [CDDataBuf_pointer], CDDataBuf |
262 | mov [CDDataBuf_pointer], CDDataBuf |
263 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
263 | call ReadCDWRetr ; читаем сектор директории |
264 | cmp [DevErrorCode], 0 |
264 | cmp [DevErrorCode], 0 |
265 | jne .noaccess_1 |
265 | jne .noaccess_1 |
266 | call .get_names_from_buffer |
266 | call .get_names_from_buffer |
267 | sub eax, 2048 |
267 | sub eax, 2048 |
268 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
268 | ; директория закончилась? |
269 | ja .read_to_buffer |
269 | ja .read_to_buffer |
270 | mov edi, [cd_counter_block] |
270 | mov edi, [cd_counter_block] |
271 | mov [edx+8], edi |
271 | mov [edx+8], edi |
272 | mov edi, [ebx] |
272 | mov edi, [ebx] |
273 | sub [edx+4], edi |
273 | sub [edx+4], edi |
Line 308... | Line 308... | ||
308 | lodsw |
308 | lodsw |
309 | xchg ah, al |
309 | xchg ah, al |
310 | call uni2ansi_char |
310 | call uni2ansi_char |
311 | cld |
311 | cld |
312 | stosb |
312 | stosb |
313 | ; ïðîâåðêà êîíöà ôàéëà |
313 | ; проверка конца файла |
314 | mov ax, [esi] |
314 | mov ax, [esi] |
315 | cmp ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
315 | cmp ax, word 3B00h; сепаратор конца файла ';' |
316 | je .cd_get_parameters_of_file_1 |
316 | je .cd_get_parameters_of_file_1 |
317 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
317 | ; проверка для файлов не заканчивающихся сепаратором |
318 | movzx eax, byte [ebp-33] |
318 | movzx eax, byte [ebp-33] |
319 | add eax, ebp |
319 | add eax, ebp |
320 | sub eax, 34 |
320 | sub eax, 34 |
321 | cmp esi, eax |
321 | cmp esi, eax |
322 | je .cd_get_parameters_of_file_1 |
322 | je .cd_get_parameters_of_file_1 |
323 | ; ïðîâåðêà êîíöà ïàïêè |
323 | ; проверка конца папки |
324 | movzx eax, byte [ebp-1] |
324 | movzx eax, byte [ebp-1] |
325 | add eax, ebp |
325 | add eax, ebp |
326 | cmp esi, eax |
326 | cmp esi, eax |
327 | jb .ansi |
327 | jb .ansi |
328 | .cd_get_parameters_of_file_1: |
328 | .cd_get_parameters_of_file_1: |
Line 345... | Line 345... | ||
345 | .unicode: |
345 | .unicode: |
346 | cmp [cd_counter_block], 2 |
346 | cmp [cd_counter_block], 2 |
347 | jbe .unicode_parent_directory |
347 | jbe .unicode_parent_directory |
348 | cld |
348 | cld |
349 | movsw |
349 | movsw |
350 | ; ïðîâåðêà êîíöà ôàéëà |
350 | ; проверка конца файла |
351 | mov ax, [esi] |
351 | mov ax, [esi] |
352 | cmp ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
352 | cmp ax, word 3B00h; сепаратор конца файла ';' |
353 | je .cd_get_parameters_of_file_2 |
353 | je .cd_get_parameters_of_file_2 |
354 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
354 | ; проверка для файлов не заканчивающихся сепаратором |
355 | movzx eax, byte [ebp-33] |
355 | movzx eax, byte [ebp-33] |
356 | add eax, ebp |
356 | add eax, ebp |
357 | sub eax, 34 |
357 | sub eax, 34 |
358 | cmp esi, eax |
358 | cmp esi, eax |
359 | je .cd_get_parameters_of_file_2 |
359 | je .cd_get_parameters_of_file_2 |
360 | ; ïðîâåðêà êîíöà ïàïêè |
360 | ; проверка конца папки |
361 | movzx eax, byte [ebp-1] |
361 | movzx eax, byte [ebp-1] |
362 | add eax, ebp |
362 | add eax, ebp |
363 | cmp esi, eax |
363 | cmp esi, eax |
364 | jb .unicode |
364 | jb .unicode |
365 | .cd_get_parameters_of_file_2: |
365 | .cd_get_parameters_of_file_2: |
Line 384... | Line 384... | ||
384 | ret |
384 | ret |
Line 385... | Line 385... | ||
385 | 385 | ||
386 | cd_get_parameters_of_file: |
386 | cd_get_parameters_of_file: |
387 | mov edi, [cd_mem_location] |
387 | mov edi, [cd_mem_location] |
388 | cd_get_parameters_of_file_1: |
388 | cd_get_parameters_of_file_1: |
389 | ; ïîëó÷àåì àòðèáóòû ôàéëà |
389 | ; получаем атрибуты файла |
390 | xor eax, eax |
390 | xor eax, eax |
391 | ; ôàéë íå àðõèâèðîâàëñÿ |
391 | ; файл не архивировался |
392 | inc eax |
392 | inc eax |
393 | shl eax, 1 |
393 | shl eax, 1 |
394 | ; ýòî êàòàëîã? |
394 | ; это каталог? |
395 | test [ebp-8], byte 2 |
395 | test [ebp-8], byte 2 |
396 | jz .file |
396 | jz .file |
397 | inc eax |
397 | inc eax |
398 | .file: |
398 | .file: |
399 | ; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò |
399 | ; метка тома не как в FAT, в этом виде отсутсвует |
400 | ; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì |
400 | ; файл не является системным |
401 | shl eax, 3 |
401 | shl eax, 3 |
402 | ; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå) |
402 | ; файл является скрытым? (атрибут существование) |
403 | test [ebp-8], byte 1 |
403 | test [ebp-8], byte 1 |
404 | jz .hidden |
404 | jz .hidden |
405 | inc eax |
405 | inc eax |
406 | .hidden: |
406 | .hidden: |
407 | shl eax, 1 |
407 | shl eax, 1 |
408 | ; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD |
408 | ; файл всегда только для чтения, так как это CD |
409 | inc eax |
409 | inc eax |
410 | mov [edi], eax |
410 | mov [edi], eax |
411 | ; ïîëó÷àåì âðåìÿ äëÿ ôàéëà |
411 | ; получаем время для файла |
412 | ;÷àñ |
412 | ;час |
413 | movzx eax, byte [ebp-12] |
413 | movzx eax, byte [ebp-12] |
414 | shl eax, 8 |
414 | shl eax, 8 |
415 | ;ìèíóòà |
415 | ;минута |
416 | mov al, [ebp-11] |
416 | mov al, [ebp-11] |
417 | shl eax, 8 |
417 | shl eax, 8 |
418 | ;ñåêóíäà |
418 | ;секунда |
419 | mov al, [ebp-10] |
419 | mov al, [ebp-10] |
420 | ;âðåìÿ ñîçäàíèÿ ôàéëà |
420 | ;время создания файла |
421 | mov [edi+8], eax |
421 | mov [edi+8], eax |
422 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
422 | ;время последнего доступа |
423 | mov [edi+16], eax |
423 | mov [edi+16], eax |
424 | ;âðåìÿ ïîñëåäíåé çàïèñè |
424 | ;время последней записи |
425 | mov [edi+24], eax |
425 | mov [edi+24], eax |
426 | ; ïîëó÷àåì äàòó äëÿ ôàéëà |
426 | ; получаем дату для файла |
427 | ;ãîä |
427 | ;год |
428 | movzx eax, byte [ebp-15] |
428 | movzx eax, byte [ebp-15] |
429 | add eax, 1900 |
429 | add eax, 1900 |
430 | shl eax, 8 |
430 | shl eax, 8 |
431 | ;ìåñÿö |
431 | ;месяц |
432 | mov al, [ebp-14] |
432 | mov al, [ebp-14] |
433 | shl eax, 8 |
433 | shl eax, 8 |
434 | ;äåíü |
434 | ;день |
435 | mov al, [ebp-13] |
435 | mov al, [ebp-13] |
436 | ;äàòà ñîçäàíèÿ ôàéëà |
436 | ;дата создания файла |
437 | mov [edi+12], eax |
437 | mov [edi+12], eax |
438 | ;âðåìÿ ïîñëåäíåãî äîñòóïà |
438 | ;время последнего доступа |
439 | mov [edi+20], eax |
439 | mov [edi+20], eax |
440 | ;âðåìÿ ïîñëåäíåé çàïèñè |
440 | ;время последней записи |
441 | mov [edi+28], eax |
441 | mov [edi+28], eax |
442 | ; ïîëó÷àåì òèï äàííûõ èìåíè |
442 | ; получаем тип данных имени |
443 | xor eax, eax |
443 | xor eax, eax |
444 | test dword [ebx+4], 1; 0=ANSI, 1=UNICODE |
444 | test dword [ebx+4], 1; 0=ANSI, 1=UNICODE |
445 | jnz .unicode_1 |
445 | jnz .unicode_1 |
446 | mov [edi+4], eax |
446 | mov [edi+4], eax |
447 | jmp @f |
447 | jmp @f |
448 | .unicode_1: |
448 | .unicode_1: |
449 | inc eax |
449 | inc eax |
450 | mov [edi+4], eax |
450 | mov [edi+4], eax |
451 | @@: |
451 | @@: |
452 | ; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ |
452 | ; получаем размер файла в байтах |
453 | xor eax, eax |
453 | xor eax, eax |
454 | mov [edi+32+4], eax |
454 | mov [edi+32+4], eax |
455 | mov eax, [ebp-23] |
455 | mov eax, [ebp-23] |
456 | mov [edi+32], eax |
456 | mov [edi+32], eax |
Line 501... | Line 501... | ||
501 | mov [cd_appl_data], 0 |
501 | mov [cd_appl_data], 0 |
502 | ; in: esi+ebp -> name |
502 | ; in: esi+ebp -> name |
503 | ; out: CF=1 - file not found |
503 | ; out: CF=1 - file not found |
504 | ; else CF=0 and [cd_current_pointer_of_input] direntry |
504 | ; else CF=0 and [cd_current_pointer_of_input] direntry |
505 | push eax esi |
505 | push eax esi |
506 | ; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ |
506 | ; 16 сектор начало набора дескрипторов томов |
Line 507... | Line 507... | ||
507 | 507 | ||
508 | call WaitUnitReady |
508 | call WaitUnitReady |
509 | cmp [DevErrorCode], 0 |
509 | cmp [DevErrorCode], 0 |
Line 510... | Line 510... | ||
510 | jne .access_denied |
510 | jne .access_denied |
511 | 511 | ||
512 | call prevent_medium_removal |
512 | call prevent_medium_removal |
513 | ; òåñòîâîå ÷òåíèå |
513 | ; тестовое чтение |
514 | mov [CDSectorAddress], dword 16 |
514 | mov [CDSectorAddress], dword 16 |
515 | mov [CDDataBuf_pointer], CDDataBuf |
515 | mov [CDDataBuf_pointer], CDDataBuf |
516 | call ReadCDWRetr;_1 |
516 | call ReadCDWRetr;_1 |
Line 517... | Line 517... | ||
517 | cmp [DevErrorCode], 0 |
517 | cmp [DevErrorCode], 0 |
518 | jne .access_denied |
518 | jne .access_denied |
519 | 519 | ||
520 | ; âû÷èñëåíèå ïîñëåäíåé ñåññèè |
520 | ; вычисление последней сессии |
521 | call WaitUnitReady |
521 | call WaitUnitReady |
522 | cmp [DevErrorCode], 0 |
522 | cmp [DevErrorCode], 0 |
Line 537... | Line 537... | ||
537 | call ReadCDWRetr;_1 |
537 | call ReadCDWRetr;_1 |
538 | cmp [DevErrorCode], 0 |
538 | cmp [DevErrorCode], 0 |
539 | jne .access_denied |
539 | jne .access_denied |
Line 540... | Line 540... | ||
540 | 540 | ||
541 | .start_check: |
541 | .start_check: |
542 | ; ïðîâåðêà íà âøèâîñòü |
542 | ; проверка на вшивость |
543 | cmp [CDDataBuf+1], dword 'CD00' |
543 | cmp [CDDataBuf+1], dword 'CD00' |
544 | jne .access_denied |
544 | jne .access_denied |
545 | cmp [CDDataBuf+5], byte '1' |
545 | cmp [CDDataBuf+5], byte '1' |
546 | jne .access_denied |
546 | jne .access_denied |
547 | ; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ? |
547 | ; сектор является терминатором набор дескрипторов томов? |
548 | cmp [CDDataBuf], byte 0xff |
548 | cmp [CDDataBuf], byte 0xff |
549 | je .access_denied |
549 | je .access_denied |
550 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà? |
550 | ; сектор является дополнительным и улучшенным дескриптором тома? |
551 | cmp [CDDataBuf], byte 0x2 |
551 | cmp [CDDataBuf], byte 0x2 |
552 | jne .start |
552 | jne .start |
553 | ; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà? |
553 | ; сектор является дополнительным дескриптором тома? |
554 | cmp [CDDataBuf+6], byte 0x1 |
554 | cmp [CDDataBuf+6], byte 0x1 |
Line 555... | Line 555... | ||
555 | jne .start |
555 | jne .start |
556 | 556 | ||
557 | ; ïàðàìåòðû root äèðåêòðîðèè |
557 | ; параметры root директрории |
558 | mov eax, [CDDataBuf+0x9c+2]; íà÷àëî root äèðåêòðîðèè |
558 | mov eax, [CDDataBuf+0x9c+2]; начало root директрории |
559 | mov [CDSectorAddress], eax |
559 | mov [CDSectorAddress], eax |
560 | mov eax, [CDDataBuf+0x9c+10]; ðàçìåð root äèðåêòðîðèè |
560 | mov eax, [CDDataBuf+0x9c+10]; размер root директрории |
561 | cmp byte [esi], 0 |
561 | cmp byte [esi], 0 |
562 | jnz @f |
562 | jnz @f |
563 | mov [cd_current_pointer_of_input], CDDataBuf+0x9c |
563 | mov [cd_current_pointer_of_input], CDDataBuf+0x9c |
564 | jmp .done |
564 | jmp .done |
565 | @@: |
565 | @@: |
566 | ; íà÷èíàåì ïîèñê |
566 | ; начинаем поиск |
567 | .mainloop: |
567 | .mainloop: |
568 | dec dword [CDSectorAddress] |
568 | dec dword [CDSectorAddress] |
569 | .read_to_buffer: |
569 | .read_to_buffer: |
570 | inc dword [CDSectorAddress] |
570 | inc dword [CDSectorAddress] |
571 | mov [CDDataBuf_pointer], CDDataBuf |
571 | mov [CDDataBuf_pointer], CDDataBuf |
572 | call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
572 | call ReadCDWRetr ; читаем сектор директории |
573 | cmp [DevErrorCode], 0 |
573 | cmp [DevErrorCode], 0 |
574 | jne .access_denied |
574 | jne .access_denied |
575 | push ebp |
575 | push ebp |
576 | call cd_find_name_in_buffer |
576 | call cd_find_name_in_buffer |
577 | pop ebp |
577 | pop ebp |
578 | jnc .found |
578 | jnc .found |
579 | sub eax, 2048 |
579 | sub eax, 2048 |
580 | ; äèðåêòîðèÿ çàêîí÷èëàñü? |
580 | ; директория закончилась? |
581 | cmp eax, 0 |
581 | cmp eax, 0 |
582 | ja .read_to_buffer |
582 | ja .read_to_buffer |
583 | ; íåò èñêîìîãî ýëåìåíòà öåïî÷êè |
583 | ; нет искомого элемента цепочки |
584 | .access_denied: |
584 | .access_denied: |
585 | pop esi eax |
585 | pop esi eax |
586 | mov [cd_appl_data], 1 |
586 | mov [cd_appl_data], 1 |
587 | stc |
587 | stc |
588 | ret |
588 | ret |
589 | ; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí |
589 | ; искомый элемент цепочки найден |
590 | .found: |
590 | .found: |
591 | ; êîíåö ïóòè ôàéëà |
591 | ; конец пути файла |
592 | cmp byte [esi-1], 0 |
592 | cmp byte [esi-1], 0 |
593 | jz .done |
593 | jz .done |
594 | .nested: |
594 | .nested: |
595 | mov eax, [cd_current_pointer_of_input] |
595 | mov eax, [cd_current_pointer_of_input] |
596 | push dword [eax+2] |
596 | push dword [eax+2] |
597 | pop dword [CDSectorAddress] ; íà÷àëî äèðåêòîðèè |
597 | pop dword [CDSectorAddress] ; начало директории |
598 | mov eax, [eax+2+8]; ðàçìåð äèðåêòîðèè |
598 | mov eax, [eax+2+8]; размер директории |
599 | jmp .mainloop |
599 | jmp .mainloop |
600 | ; óêàçàòåëü ôàéëà íàéäåí |
600 | ; указатель файла найден |
601 | .done: |
601 | .done: |
602 | test ebp, ebp |
602 | test ebp, ebp |
603 | jz @f |
603 | jz @f |
Line 627... | Line 627... | ||
627 | cd_get_name: |
627 | cd_get_name: |
628 | push eax |
628 | push eax |
629 | mov ebp, [cd_current_pointer_of_input_2] |
629 | mov ebp, [cd_current_pointer_of_input_2] |
630 | mov [cd_current_pointer_of_input], ebp |
630 | mov [cd_current_pointer_of_input], ebp |
631 | mov eax, [ebp] |
631 | mov eax, [ebp] |
632 | test eax, eax ; âõîäû çàêîí÷èëèñü? |
632 | test eax, eax ; входы закончились? |
633 | jz .next_sector |
633 | jz .next_sector |
634 | cmp ebp, CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ? |
634 | cmp ebp, CDDataBuf+2048 ; буфер закончился? |
635 | jae .next_sector |
635 | jae .next_sector |
636 | movzx eax, byte [ebp] |
636 | movzx eax, byte [ebp] |
637 | add [cd_current_pointer_of_input_2], eax; ñëåäóþùèé âõîä êàòàëîãà |
637 | add [cd_current_pointer_of_input_2], eax; следующий вход каталога |
638 | add ebp, 33; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè |
638 | add ebp, 33; указатель установлен на начало имени |
639 | pop eax |
639 | pop eax |
640 | clc |
640 | clc |
641 | ret |
641 | ret |
642 | .next_sector: |
642 | .next_sector: |
643 | pop eax |
643 | pop eax |
Line 667... | Line 667... | ||
667 | xchg ah, al |
667 | xchg ah, al |
668 | sub edi, 2 |
668 | sub edi, 2 |
669 | scasw |
669 | scasw |
670 | jne .name_not_coincide |
670 | jne .name_not_coincide |
671 | .coincides: |
671 | .coincides: |
672 | cmp [esi], byte '/'; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
672 | cmp [esi], byte '/'; разделитель пути, конец имени текущего элемента |
673 | je .done |
673 | je .done |
674 | cmp [esi], byte 0; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
674 | cmp [esi], byte 0; разделитель пути, конец имени текущего элемента |
675 | je .done |
675 | je .done |
676 | jmp .loop |
676 | jmp .loop |
677 | .name_not_coincide: |
677 | .name_not_coincide: |
678 | pop edi eax esi |
678 | pop edi eax esi |
679 | stc |
679 | stc |
680 | ret |
680 | ret |
681 | .done: |
681 | .done: |
682 | ; ïðîâåðêà êîíöà ôàéëà |
682 | ; проверка конца файла |
683 | cmp [edi], word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
683 | cmp [edi], word 3B00h; сепаратор конца файла ';' |
684 | je .done_1 |
684 | je .done_1 |
685 | ; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
685 | ; проверка для файлов не заканчивающихся сепаратором |
686 | movzx eax, byte [ebp-33] |
686 | movzx eax, byte [ebp-33] |
687 | add eax, ebp |
687 | add eax, ebp |
688 | sub eax, 34 |
688 | sub eax, 34 |
689 | cmp edi, eax |
689 | cmp edi, eax |
690 | je .done_1 |
690 | je .done_1 |
691 | ; ïðîâåðêà êîíöà ïàïêè |
691 | ; проверка конца папки |
692 | movzx eax, byte [ebp-1] |
692 | movzx eax, byte [ebp-1] |
693 | add eax, ebp |
693 | add eax, ebp |
694 | cmp edi, eax |
694 | cmp edi, eax |
695 | jne .name_not_coincide |
695 | jne .name_not_coincide |
696 | .done_1: |
696 | .done_1: |
Line 706... | Line 706... | ||
706 | ; out: al=converted symbol |
706 | ; out: al=converted symbol |
707 | cmp al, 'A' |
707 | cmp al, 'A' |
708 | jb .ret |
708 | jb .ret |
709 | cmp al, 'Z' |
709 | cmp al, 'Z' |
710 | jbe .az |
710 | jbe .az |
711 | cmp al, '' |
711 | cmp al, 0x80 ; 'А' |
712 | jb .ret |
712 | jb .ret |
713 | cmp al, '' |
713 | cmp al, 0x90 ; 'Р' |
714 | jb .rus1 |
714 | jb .rus1 |
715 | cmp al, '' |
715 | cmp al, 0x9F ; 'Я' |
716 | ja .ret |
716 | ja .ret |
717 | ; 0x90-0x9F -> 0xE0-0xEF |
717 | ; 0x90-0x9F -> 0xE0-0xEF |
718 | add al, 'à'-'' |
718 | add al, 0xE0-0x90 |
719 | .ret: |
719 | .ret: |
720 | ret |
720 | ret |
721 | .rus1: |
721 | .rus1: |
722 | ; 0x80-0x8F -> 0xA0-0xAF |
722 | ; 0x80-0x8F -> 0xA0-0xAF |
723 | .az: |
723 | .az: |
Line 742... | Line 742... | ||
742 | jb .rus2 |
742 | jb .rus2 |
743 | .unk: |
743 | .unk: |
744 | mov al, '_' |
744 | mov al, '_' |
745 | jmp .doit |
745 | jmp .doit |
746 | .yo1: |
746 | .yo1: |
747 | mov al, 'ð' |
747 | mov al, 0xF0 ; 'Ё' in cp866 |
748 | jmp .doit |
748 | jmp .doit |
749 | .yo2: |
749 | .yo2: |
750 | mov al, 'ñ' |
750 | mov al, 0xF1 ; 'ё' in cp866 |
751 | jmp .doit |
751 | jmp .doit |
752 | .rus1: |
752 | .rus1: |
753 | ; 0x410-0x43F -> 0x80-0xAF |
753 | ; 0x410-0x43F -> 0x80-0xAF |
754 | add al, 0x70 |
754 | add al, 0x70 |
755 | jmp .doit |
755 | jmp .doit |