Support of last session for ISO9660.

git-svn-id: svn://kolibrios.org@758 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2008-02-25 23:34:27 +00:00
parent e461a53e3d
commit 6094221d05
2 changed files with 67 additions and 19 deletions

View File

@ -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
;*************************************************
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
;* Входные параметры передаются через глобальные *

View File

@ -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