diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 97fdf198a..05cc696bf 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1462,6 +1462,34 @@ dd 533 * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. +====================================================================== +========== Функция 24, подфункция 4 - извлечь лоток привода диска. ============ +====================================================================== +Параметры: + * eax = 24 - номер функции + * ebx = 4 - номер подфункции + * ecx = номер CD/DVD-диска (от 0=Primary Master до 3=Secondary Slave) +Возвращаемое значение: + * Ничего не возвращается. +Замечания: + * Функция поддерживается только для ATAPI устройств (CD и DVD). + * При извлечении лотка производится разблокировка ручного управления механизмом лотка. + * При извлечении лотка код производит очистку кэша соответствующего устройства. + * Примером использования функции является приложение CD_tray. + +====================================================================== +========== Функция 24, подфункция 5 - загрузить лоток привода диска. =========== +====================================================================== +Параметры: + * eax = 24 - номер функции + * ebx = 5 - номер подфункции + * ecx = номер CD/DVD-диска (от 0=Primary Master до 3=Secondary Slave) +Возвращаемое значение: + * Ничего не возвращается. +Замечания: + * Функция поддерживается только для ATAPI устройств (CD и DVD) + * Примером использования функции является приложение CD_tray. + ====================================================================== ============== Функция 25 - установить громкость SBPro. ============== ====================================================================== @@ -4129,7 +4157,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); При первом обращении подфункций 0,1,5,7 к устройствам ATAPI (CD и DVD) производится блокировка ручного управления механизмом лотка. Это связано с алгоритмом кэширования данных полученных от привода. Разблокировка -производится обращением подфункцией 10 к соответствующему устройству. +производится обращением функции 24.4 к соответствующему устройству. ====================================================================== = Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. = @@ -4489,66 +4517,6 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * Родительская папка должна уже существовать. * Если папка уже существует, функция завершится успешно (eax=0). -====================================================================== -========== Функция 70, подфункция 10 - извлечь лоток привода диска. ============ -====================================================================== -Параметры: - * eax = 70 - номер функции - * ebx = указатель на информационную структуру -Формат информационной структуры: - * +0: dword: 10 = номер подфункции - * +4: dword: 0 (зарезервировано) - * +8: dword: 0 (зарезервировано) - * +12 = +0xC: dword: 0 (зарезервировано) - * +16 = +0x10: dword: 0 (зарезервировано) - * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в - общем описании - или - * +20 = +0x14: db 0 - * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки -Возвращаемое значение: - * Ничего не возвращается. -Замечания: - * Функция поддерживается только для ATAPI устройств (CD и DVD). - * При извлечении лотка производится разблокировка ручного управления механизмом лотка. - * При извлечении лотка код производит очистку кэша соответствующего устройства. - * Путь вводится в стандартном для 70 функции виде. Для работоспособности можно - ограничиться путями вида: - db '/cd0/1/',0 - db '/cd1/1/',0 - db '/cd2/1/',0 - db '/cd3/1/',0 - * Примером использования функции является приложение CD_tray. - -====================================================================== -========== Функция 70, подфункция 11 - загрузить лоток привода диска. =========== -====================================================================== -Параметры: - * eax = 70 - номер функции - * ebx = указатель на информационную структуру -Формат информационной структуры: - * +0: dword: 11 = номер подфункции - * +4: dword: 0 (зарезервировано) - * +8: dword: 0 (зарезервировано) - * +12 = +0xC: dword: 0 (зарезервировано) - * +16 = +0x10: dword: 0 (зарезервировано) - * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в - общем описании - или - * +20 = +0x14: db 0 - * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки -Возвращаемое значение: - * Ничего не возвращается. -Замечания: - * Функция поддерживается только для ATAPI устройств (CD и DVD) - * Путь вводится в стандартном для 70 функции виде. Для работоспособности можно - ограничиться путями вида: - db '/cd0/1/',0 - db '/cd1/1/',0 - db '/cd2/1/',0 - db '/cd3/1/',0 - * Примером использования функции является приложение CD_tray. - ====================================================================== === Функция 71, подфункция 1 - установить заголовок окна программы. == ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 9f33e0e7c..a13543eac 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1445,6 +1445,34 @@ Remarks: * Previously CD base port must be defined by call to subfunction 3 of function 21. +====================================================================== +================ Function 24, subfunction 4 - eject tray of disk drive. ============== +====================================================================== +Parameters: + * eax = 24 - function number + * ebx = 4 - subfunction number + * ecx = position of CD/DVD-drive (from 0=Primary Master to 3=Secondary Slave) +Returned value: + * Nothing comes back. +Remarks: + * The function is supported only for ATAPI devices (CD and DVD). + * At extract of a tray is made deblocking of handle mechanism of a tray. + * At extract of a tray the code makes clearing the cache of the appropriate device. + * An example of usage of the function is the application CD_tray. + +====================================================================== +============== Function 24, subfunction 5 - load tray of disk drive. ================= +====================================================================== +Parameters: + * eax = 24 - function number + * ebx = 5 - subfunction number + * ecx = position of CD/DVD-drive (from 0=Primary Master to 3=Secondary Slave) +Returned value: + * Nothing comes back. +Remarks: + * The function is supported only for ATAPI devices (CD and DVD). + * An example of usage of the function is the application CD_tray. + ====================================================================== =================== Function 25 - set SBPro volume. ================== ====================================================================== @@ -4077,7 +4105,7 @@ For CD-drives due to hardware limitations only subfunctions with code 2. At the first call subfunctions 0,1,5,7 to devices ATAPI (CD and DVD) the locking of handle mechanism of a tray is made. It is connected to algorithm of caching -given obtained from a drive. Deblocking is made by call subfunction 10 +given obtained from a drive. Deblocking is made by call function 24.4 to the appropriate device. ====================================================================== @@ -4433,64 +4461,6 @@ Remarks: * The parent folder must already exist. * If target folder already exists, function returns success (eax=0). -====================================================================== -================ Function 70, subfunction 10 - eject tray of disk drive. ============== -====================================================================== -Parameters: - * eax = 70 - function number - * ebx = pointer to the information structure -Format of the information structure: - * +0: dword: 10 = subfunction number - * +4: dword: 0 (reserved) - * +8: dword: 0 (reserved) - * +12 = +0xC: dword: 0 (reserved) - * +16 = +0x10: dword: 0 (reserved) - * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are - given in the general description - or - * +20 = +0x14: db 0 - * +21 = +0x15: dd pointer to ASCIIZ-string with folder name -Returned value: - * Nothing comes back. -Remarks: - * The function is supported only for ATAPI devices (CD and DVD). - * At extract of a tray is made deblocking of handle mechanism of a tray. - * At extract of a tray the code makes clearing the cache of the appropriate device. - * The path is standard for 70 functions. For serviceability it is possible to be limited to paths: - db '/cd0/1/',0 - db '/cd1/1/',0 - db '/cd2/1/',0 - db '/cd3/1/',0 - * An example of usage of the function is the application CD_tray. - -====================================================================== -============== Function 70, subfunction 11 - load tray of disk drive. ================= -====================================================================== -Parameters: - * eax = 70 - function number - * ebx = pointer to the information structure -Format of the information structure: - * +0: dword: 11 = subfunction number - * +4: dword: 0 (reserved) - * +8: dword: 0 (reserved) - * +12 = +0xC: dword: 0 (reserved) - * +16 = +0x10: dword: 0 (reserved) - * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are - given in the general description - or - * +20 = +0x14: db 0 - * +21 = +0x15: dd pointer to ASCIIZ-string with folder name -Returned value: - * Nothing comes back. -Remarks: - * The function is supported only for ATAPI devices (CD and DVD). - * The path is standard for 70 functions. For serviceability it is possible to be limited to paths: - db '/cd0/1/',0 - db '/cd1/1/',0 - db '/cd2/1/',0 - db '/cd3/1/',0 - * An example of usage of the function is the application CD_tray. - ====================================================================== ========== Function 71, subfunction 1 - set window caption. ========== ====================================================================== diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index 56e3a328c..523c7c5ee 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -388,8 +388,6 @@ fs_RamdiskServices: dd 0 dd fs_RamdiskDelete dd fs_RamdiskCreateFolder - dd fs_NotImplemented - dd fs_NotImplemented fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4 fs_OnFloppy: @@ -421,8 +419,6 @@ fs_FloppyServices: dd 0 dd fs_FloppyDelete dd fs_FloppyCreateFolder - dd fs_NotImplemented - dd fs_NotImplemented fs_NumFloppyServices = ($ - fs_FloppyServices)/4 fs_OnHd0: @@ -496,8 +492,6 @@ fs_HdServices: dd 0 dd fs_HdDelete dd fs_HdCreateFolder - dd fs_NotImplemented - dd fs_NotImplemented fs_NumHdServices = ($ - fs_HdServices)/4 ;******************************************************* @@ -579,8 +573,6 @@ fs_CdServices: dd 0 dd fs_NotImplemented dd fs_NotImplemented - dd fs_EjectDeviceTray - dd fs_LoadDeviceTray fs_NumCdServices = ($ - fs_CdServices)/4 ;******************************************************* diff --git a/kernel/trunk/fs/iso9660.inc b/kernel/trunk/fs/iso9660.inc index 4ec4dc209..96d12de53 100644 --- a/kernel/trunk/fs/iso9660.inc +++ b/kernel/trunk/fs/iso9660.inc @@ -489,17 +489,6 @@ fs_CdGetFileInfo: pop edi xor eax, eax ret -;---------------------------------------------------------------- -fs_EjectDeviceTray: - call clear_CD_cache - call allow_medium_removal - call EjectMedium - ret -;---------------------------------------------------------------- -fs_LoadDeviceTray: - call LoadMedium - ret -;---------------------------------------------------------------- cd_find_lfn: mov [cd_appl_data],0 diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index b5608699e..e1aaadf81 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -4957,10 +4957,48 @@ align 4 syscall_cdaudio: ; CD + cmp eax, 4 + jb .audio + jz .eject + cmp eax, 5 + jnz .ret +.load: + call .reserve + call LoadMedium + call .free + ret +.eject: + call .reserve + call clear_CD_cache + call allow_medium_removal + call EjectMedium + call .free + ret +.audio: call sys_cd_audio mov [esp+36],eax +.ret: ret +.reserve: + call reserve_cd + mov eax, ebx + shr eax, 1 + and eax, 1 + inc eax + mov [ChannelNumber], eax + mov eax, ebx + and eax, 1 + mov [DiskNumber], eax + call reserve_cd_channel + inc ebx + mov [cdpos], ebx + ret +.free: + call free_cd_channel + and [cd_status], 0 + ret + align 4 syscall_delramdiskfile: ; DelRamdiskFile diff --git a/programs/system/cd_tray/CD_tray.ASM b/programs/system/cd_tray/CD_tray.ASM index 0e700e7bb..724cb4708 100644 --- a/programs/system/cd_tray/CD_tray.ASM +++ b/programs/system/cd_tray/CD_tray.ASM @@ -55,49 +55,20 @@ still: button: mcall 17 ; 17 - яюыєўшЄ№ шфхэЄшЇшърЄюЁ эрцрЄющ ъэюяъш - cmp ah,2 - jne b3 - mov dword [load_tray.name],cd0 - jmp b5.1 - b3: - cmp ah,3 - jne b4 - mov dword [load_tray.name],cd1 - jmp b5.1 - b4: - cmp ah,4 - jne b5 - mov dword [load_tray.name],cd2 - jmp b5.1 - b5: - cmp ah,5 - jne b6 - mov dword [load_tray.name],cd3 - .1: - mcall 70, load_tray - jmp red +; ъэюяъш 2,3,4,5 - load tray CD0/CD1/CD2/CD3 + movzx ecx, ah + sub ecx, 2 + cmp ecx, 3 + ja b6 + mcall 24,5 + jmp red b6: - cmp ah,6 - jne b7 - mov dword [eject_tray.name],cd0 - jmp b9.1 - b7: - cmp ah,7 - jne b8 - mov dword [eject_tray.name],cd1 - jmp b9.1 - b8: - cmp ah,8 - jne b9 - mov dword [eject_tray.name],cd2 - jmp b9.1 - b9: - cmp ah,9 - jne b1 - mov dword [eject_tray.name],cd3 - .1: - mcall 70, eject_tray - jmp red +; ъэюяъш 6,7,8,9 - eject tray CD0/CD1/CD2/CD3 + sub ecx, 4 + cmp ecx, 3 + ja b1 + mcall 24,4 + jmp red b1: cmp ah, 1 ; хёыш ═┼ эрцрЄр ъэюяър ё эюьхЁюь 1, jne still ; тхЁэєЄ№ё  @@ -160,27 +131,6 @@ header db ' ATAPI Device Tray Control',0 text3 db 'eject eject eject eject',0 text2 db 'load load load load',0 text1 db '/cd0/ /cd1/ /cd2/ /cd3/',0 -cd0: db '/cd0/1/',0 -cd1: db '/cd1/1/',0 -cd2: db '/cd2/1/',0 -cd3: db '/cd3/1/',0 ;--------------------------------------------------------------------- -load_tray: - .subfunction dd 11 - .rezerv dd 0 - .rezerv1 dd 0 - .rezerv2 dd 0 - .rezerv3 dd 0 - db 0 - .name: dd cd0 - -eject_tray: - .subfunction dd 10 - .rezerv dd 0 - .rezerv1 dd 0 - .rezerv2 dd 0 - .rezerv3 dd 0 - db 0 - .name: dd cd0 I_END: ; ьхЄър ъюэЎр яЁюуЁрьь√