diff --git a/kernel/trunk/blkdev/cd_drv.inc b/kernel/trunk/blkdev/cd_drv.inc index dce1e3e669..5516e0b5ab 100644 --- a/kernel/trunk/blkdev/cd_drv.inc +++ b/kernel/trunk/blkdev/cd_drv.inc @@ -20,6 +20,7 @@ MaxRetr equ 10 ; (в тиках) BSYWaitTime equ 1000 ;2 NoTickWaitTime equ 0xfffff + ;************************************************* ;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА * ;* Считываются данные пользователя, информация * @@ -131,7 +132,7 @@ ReadCDWRetr_1: cmp [DevErrorCode],0 je @@End_4 - or ecx,ecx ;{SPraid.simba} (for cd load) + or ecx,ecx ;{SPraid.simba} (for cd load) jz @@End_4 dec ecx @@ -145,12 +146,12 @@ ReadCDWRetr_1: jmp .wait @@: ; Задержка на 2,5 секунды -; mov EAX,[timer_ticks] -; add EAX,50 ;250 +; mov EAX,[timer_ticks] +; add EAX,50 ;250 ;@@Wait: -; call change_task -; cmp EAX,[timer_ticks] -; ja @@Wait +; call change_task +; cmp EAX,[timer_ticks] +; ja @@Wait loop @@NextRetr @@End_4: popad @@ -847,6 +848,31 @@ GetEvent_StatusNotification: popa ret +;************************************************* +; прочитать информацию из TOC +;* Входные параметры передаются через глобальные * +;* переменные: * +;* ChannelNumber - номер канала; * +;* DiskNumber - номер диска на канале. * +;************************************************* +Read_TOC: + pusha + mov [CDDataBuf_pointer],CDDataBuf +; Очистить буфер пакетной команды + call clear_packet_buffer +; Сформировать пакетную команду для считывания +; сектора данных + mov [PacketCommand],byte 0x43 + ; Задать формат + mov [PacketCommand+2],byte 1 +; Размер выделенной области + mov [PacketCommand+7],byte 0xFF + mov [PacketCommand+8],byte 0h +; Подать команду + call SendPacketDatCommand + popa + ret + ;************************************************* ;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ * ;* Входные параметры передаются через глобальные * diff --git a/kernel/trunk/fs/iso9660.inc b/kernel/trunk/fs/iso9660.inc index d419608aa8..06d3ebf866 100644 --- a/kernel/trunk/fs/iso9660.inc +++ b/kernel/trunk/fs/iso9660.inc @@ -494,25 +494,46 @@ fs_CdGetFileInfo: ;---------------------------------------------------------------- cd_find_lfn: - mov [cd_appl_data],0 + mov [cd_appl_data],0 ; in: esi+ebp -> name ; out: CF=1 - file not found -; else CF=0 and [cd_current_pointer_of_input] direntry +; else CF=0 and [cd_current_pointer_of_input] direntry push eax esi ; 16 сектор начало набора дескрипторов томов - mov [CDSectorAddress],dword 15 - mov [CDDataBuf_pointer],CDDataBuf - - call WaitUnitReady - cmp [DevErrorCode],0 - jne .access_denied - - call prevent_medium_removal + + call WaitUnitReady + cmp [DevErrorCode],0 + jne .access_denied + + call prevent_medium_removal +; тестовое чтение + mov [CDSectorAddress],dword 16 + call ReadCDWRetr ;_1 + cmp [DevErrorCode],0 + jne .access_denied + +; вычисление последней сессии + call WaitUnitReady + cmp [DevErrorCode],0 + jne .access_denied + call Read_TOC + mov ah,[CDDataBuf+4+4] + mov al,[CDDataBuf+4+5] + shl eax,16 + mov ah,[CDDataBuf+4+6] + mov al,[CDDataBuf+4+7] + add eax,15 + mov [CDSectorAddress],eax +; mov [CDSectorAddress],dword 15 + mov [CDDataBuf_pointer],CDDataBuf + .start: inc dword [CDSectorAddress] - call ReadCDWRetr ;_1 - cmp [DevErrorCode],0 - jne .access_denied + call ReadCDWRetr ;_1 + cmp [DevErrorCode],0 + jne .access_denied + +.start_check: ; проверка на вшивость cmp [CDDataBuf+1],dword 'CD00' jne .access_denied @@ -527,6 +548,7 @@ cd_find_lfn: ; сектор является дополнительным дескриптором тома? cmp [CDDataBuf+6],byte 0x1 jne .start + ; параметры root директрории mov eax,[CDDataBuf+0x9c+2] ; начало root директрории mov [CDSectorAddress],eax