forked from KolibriOS/kolibrios
Processing event: press real button - eject tray ATAPI device.
git-svn-id: svn://kolibrios.org@618 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6b39363987
commit
d01af144cb
@ -11,12 +11,8 @@ $Revision$
|
|||||||
;**********************************************************
|
;**********************************************************
|
||||||
; Непосредственная работа с устройством СD (ATAPI)
|
; Непосредственная работа с устройством СD (ATAPI)
|
||||||
;**********************************************************
|
;**********************************************************
|
||||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷
|
||||||
; Адаптация и доработка Mario79
|
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79
|
||||||
|
|
||||||
; Процедура для полного считывания всех
|
|
||||||
; данных из сектора компакт-диска
|
|
||||||
; Автор текста программы Кулаков Владимир Геннадьевич.
|
|
||||||
|
|
||||||
; Максимальное количество повторений операции чтения
|
; Максимальное количество повторений операции чтения
|
||||||
MaxRetr equ 10
|
MaxRetr equ 10
|
||||||
@ -80,13 +76,6 @@ ReadCDWRetr:
|
|||||||
add esi,8
|
add esi,8
|
||||||
mov edi,1
|
mov edi,1
|
||||||
.hdreadcache:
|
.hdreadcache:
|
||||||
; push esi
|
|
||||||
; mov esi,[esi]
|
|
||||||
; call test_mario79
|
|
||||||
; mov esi,eax
|
|
||||||
; call test_mario79
|
|
||||||
; pop esi
|
|
||||||
|
|
||||||
; cmp dword [esi+4],0 ; empty
|
; cmp dword [esi+4],0 ; empty
|
||||||
; je .nohdcache
|
; je .nohdcache
|
||||||
cmp [esi],eax ; correct sector
|
cmp [esi],eax ; correct sector
|
||||||
@ -111,11 +100,6 @@ ReadCDWRetr:
|
|||||||
mov [CDDataBuf_pointer],ebx
|
mov [CDDataBuf_pointer],ebx
|
||||||
call cd_calculate_cache_1
|
call cd_calculate_cache_1
|
||||||
lea esi,[edi*8+esi]
|
lea esi,[edi*8+esi]
|
||||||
; push esi
|
|
||||||
; call test_mario79
|
|
||||||
; mov esi,eax
|
|
||||||
; call test_mario79
|
|
||||||
; pop esi
|
|
||||||
mov [esi],eax ; sector number
|
mov [esi],eax ; sector number
|
||||||
; mov dword [esi+4],1 ; hd read - mark as same as in hd
|
; mov dword [esi+4],1 ; hd read - mark as same as in hd
|
||||||
.yeshdcache:
|
.yeshdcache:
|
||||||
@ -172,8 +156,6 @@ ReadCDWRetr_1:
|
|||||||
|
|
||||||
; Универсальные процедуры, обеспечивающие выполнение
|
; Универсальные процедуры, обеспечивающие выполнение
|
||||||
; пакетных команд в режиме PIO
|
; пакетных команд в режиме PIO
|
||||||
;
|
|
||||||
; Автор текста программы Кулаков Владимир Геннадьевич.
|
|
||||||
|
|
||||||
; Максимально допустимое время ожидания реакции
|
; Максимально допустимое время ожидания реакции
|
||||||
; устройства на пакетную команду (в тиках)
|
; устройства на пакетную команду (в тиках)
|
||||||
@ -384,6 +366,8 @@ SendPacketNoDatCommand:
|
|||||||
mov AX,word [PacketCommand+10]
|
mov AX,word [PacketCommand+10]
|
||||||
out DX,AX
|
out DX,AX
|
||||||
; sti
|
; sti
|
||||||
|
cmp [ignore_CD_eject_wait],1
|
||||||
|
je @@End_9
|
||||||
; Ожидание подтверждения приема команды
|
; Ожидание подтверждения приема команды
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,7 ;порт 1х7h
|
add DX,7 ;порт 1х7h
|
||||||
@ -599,6 +583,10 @@ prevent_medium_removal:
|
|||||||
mov [PacketCommand+4],byte 11b
|
mov [PacketCommand+4],byte 11b
|
||||||
; Подать команду
|
; Подать команду
|
||||||
call SendPacketNoDatCommand
|
call SendPacketNoDatCommand
|
||||||
|
mov eax,ATAPI_IDE0_lock
|
||||||
|
add eax,[cdpos]
|
||||||
|
dec eax
|
||||||
|
mov [eax],byte 1
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -608,7 +596,7 @@ prevent_medium_removal:
|
|||||||
;* перменные: *
|
;* перменные: *
|
||||||
;* ChannelNumber - номер канала; *
|
;* ChannelNumber - номер канала; *
|
||||||
;* DiskNumber - номер диска на канале. *
|
;* DiskNumber - номер диска на канале. *
|
||||||
;*************************************************
|
;*************************************************
|
||||||
allow_medium_removal:
|
allow_medium_removal:
|
||||||
pusha
|
pusha
|
||||||
; Очистить буфер пакетной команды
|
; Очистить буфер пакетной команды
|
||||||
@ -619,6 +607,10 @@ allow_medium_removal:
|
|||||||
mov [PacketCommand+4],byte 00b
|
mov [PacketCommand+4],byte 00b
|
||||||
; Подать команду
|
; Подать команду
|
||||||
call SendPacketNoDatCommand
|
call SendPacketNoDatCommand
|
||||||
|
mov eax,ATAPI_IDE0_lock
|
||||||
|
add eax,[cdpos]
|
||||||
|
dec eax
|
||||||
|
mov [eax],byte 0
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -664,6 +656,183 @@ EjectMedium:
|
|||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;* Ïðîâåðèòü ñîáûòèå íàæàòèÿ êíîïêè èçâëå÷åíèÿ *
|
||||||
|
;* äèñêà *
|
||||||
|
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
|
||||||
|
;* ïåðåìåííûå: *
|
||||||
|
;* ChannelNumber - íîìåð êàíàëà; *
|
||||||
|
;* DiskNumber - íîìåð äèñêà íà êàíàëå. *
|
||||||
|
;*************************************************
|
||||||
|
check_ATAPI_device_event:
|
||||||
|
pusha
|
||||||
|
mov eax,[timer_ticks]
|
||||||
|
sub eax,[timer_ATAPI_check]
|
||||||
|
cmp eax,100
|
||||||
|
jb .end_1
|
||||||
|
mov al,[DRIVE_DATA+1]
|
||||||
|
and al,11b
|
||||||
|
cmp al,10b
|
||||||
|
jz .ide3
|
||||||
|
.ide2_1:
|
||||||
|
mov al,[DRIVE_DATA+1]
|
||||||
|
and al,1100b
|
||||||
|
cmp al,1000b
|
||||||
|
jz .ide2
|
||||||
|
.ide1_1:
|
||||||
|
mov al,[DRIVE_DATA+1]
|
||||||
|
and al,110000b
|
||||||
|
cmp al,100000b
|
||||||
|
jz .ide1
|
||||||
|
.ide0_1:
|
||||||
|
mov al,[DRIVE_DATA+1]
|
||||||
|
and al,11000000b
|
||||||
|
cmp al,10000000b
|
||||||
|
jz .ide0
|
||||||
|
.end:
|
||||||
|
|
||||||
|
sti
|
||||||
|
mov eax,[timer_ticks]
|
||||||
|
mov [timer_ATAPI_check],eax
|
||||||
|
.end_1:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
.ide3:
|
||||||
|
cli
|
||||||
|
cmp [ATAPI_IDE3_lock],1
|
||||||
|
jne .ide2_1
|
||||||
|
cmp [IDE_Channel_2],0
|
||||||
|
jne .ide1_1
|
||||||
|
cmp [cd_status],0
|
||||||
|
jne .end
|
||||||
|
mov [IDE_Channel_2],1
|
||||||
|
call reserve_ok2
|
||||||
|
mov [ChannelNumber],2
|
||||||
|
mov [DiskNumber],1
|
||||||
|
mov [cdpos],4
|
||||||
|
call GetEvent_StatusNotification
|
||||||
|
cmp [CDDataBuf+4],byte 1
|
||||||
|
je .eject_ide3
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide2_1
|
||||||
|
.eject_ide3:
|
||||||
|
call .eject
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide2_1
|
||||||
|
|
||||||
|
.ide2:
|
||||||
|
cli
|
||||||
|
cmp [ATAPI_IDE2_lock],1
|
||||||
|
jne .ide1_1
|
||||||
|
cmp [IDE_Channel_2],0
|
||||||
|
jne .ide1_1
|
||||||
|
cmp [cd_status],0
|
||||||
|
jne .end
|
||||||
|
mov [IDE_Channel_2],1
|
||||||
|
call reserve_ok2
|
||||||
|
mov [ChannelNumber],2
|
||||||
|
mov [DiskNumber],0
|
||||||
|
mov [cdpos],3
|
||||||
|
call GetEvent_StatusNotification
|
||||||
|
cmp [CDDataBuf+4],byte 1
|
||||||
|
je .eject_ide2
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide1_1
|
||||||
|
.eject_ide2:
|
||||||
|
call .eject
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide1_1
|
||||||
|
|
||||||
|
.ide1:
|
||||||
|
cli
|
||||||
|
cmp [ATAPI_IDE1_lock],1
|
||||||
|
jne .ide0_1
|
||||||
|
cmp [IDE_Channel_1],0
|
||||||
|
jne .end
|
||||||
|
cmp [cd_status],0
|
||||||
|
jne .end
|
||||||
|
mov [IDE_Channel_1],1
|
||||||
|
call reserve_ok2
|
||||||
|
mov [ChannelNumber],1
|
||||||
|
mov [DiskNumber],1
|
||||||
|
mov [cdpos],2
|
||||||
|
call GetEvent_StatusNotification
|
||||||
|
cmp [CDDataBuf+4],byte 1
|
||||||
|
je .eject_ide1
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide0_1
|
||||||
|
.eject_ide1:
|
||||||
|
call .eject
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .ide0_1
|
||||||
|
|
||||||
|
.ide0:
|
||||||
|
cli
|
||||||
|
cmp [ATAPI_IDE0_lock],1
|
||||||
|
jne .end
|
||||||
|
cmp [IDE_Channel_1],0
|
||||||
|
jne .end
|
||||||
|
cmp [cd_status],0
|
||||||
|
jne .end
|
||||||
|
mov [IDE_Channel_1],1
|
||||||
|
call reserve_ok2
|
||||||
|
mov [ChannelNumber],1
|
||||||
|
mov [DiskNumber],0
|
||||||
|
mov [cdpos],1
|
||||||
|
call GetEvent_StatusNotification
|
||||||
|
cmp [CDDataBuf+4],byte 1
|
||||||
|
je .eject_ide0
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .end
|
||||||
|
.eject_ide0:
|
||||||
|
call .eject
|
||||||
|
call syscall_cdaudio.free
|
||||||
|
jmp .end
|
||||||
|
|
||||||
|
.eject:
|
||||||
|
call clear_CD_cache
|
||||||
|
call allow_medium_removal
|
||||||
|
mov [ignore_CD_eject_wait],1
|
||||||
|
call EjectMedium
|
||||||
|
mov [ignore_CD_eject_wait],0
|
||||||
|
ret
|
||||||
|
|
||||||
|
timer_ATAPI_check dd 0
|
||||||
|
ATAPI_IDE0_lock db 0
|
||||||
|
ATAPI_IDE1_lock db 0
|
||||||
|
ATAPI_IDE2_lock db 0
|
||||||
|
ATAPI_IDE3_lock db 0
|
||||||
|
ignore_CD_eject_wait db 0
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;* Ïîëó÷èòü ñîîáùåíèå î ñîáûòèè èëè ñîñòîÿíèè *
|
||||||
|
;* óñòðîéñòâà *
|
||||||
|
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
|
||||||
|
;* ïåðåìåííûå: *
|
||||||
|
;* ChannelNumber - íîìåð êàíàëà; *
|
||||||
|
;* DiskNumber - íîìåð äèñêà íà êàíàëå. *
|
||||||
|
;*************************************************
|
||||||
|
GetEvent_StatusNotification:
|
||||||
|
pusha
|
||||||
|
mov [CDDataBuf_pointer],CDDataBuf
|
||||||
|
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
|
||||||
|
call clear_packet_buffer
|
||||||
|
; Çàäàòü êîä êîìàíäû
|
||||||
|
mov [PacketCommand],word 4Ah
|
||||||
|
mov [PacketCommand+1],byte 00000001b
|
||||||
|
; Çàäàòü çàïðîñ êëàññà ñîîáùåíèé
|
||||||
|
mov [PacketCommand+4],byte 00010000b
|
||||||
|
; Çàäàòü çàïðîñ êëàññà ñîîáùåíèé
|
||||||
|
mov [PacketCommand+7],byte 8
|
||||||
|
mov [PacketCommand+8],byte 0
|
||||||
|
; Ïîäàòü êîìàíäó
|
||||||
|
; mov [timer_ticks_enable],0
|
||||||
|
call SendPacketDatCommand
|
||||||
|
; mov [timer_ticks_enable],1
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
;*************************************************
|
;*************************************************
|
||||||
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
|
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
|
||||||
;* Входные параметры передаются через глобальные *
|
;* Входные параметры передаются через глобальные *
|
||||||
@ -671,18 +840,18 @@ EjectMedium:
|
|||||||
;* ChannelNumber - номер канала; *
|
;* ChannelNumber - номер канала; *
|
||||||
;* DiskNumber - номер диска на канале. *
|
;* DiskNumber - номер диска на канале. *
|
||||||
;*************************************************
|
;*************************************************
|
||||||
ReadCapacity:
|
;ReadCapacity:
|
||||||
pusha
|
; pusha
|
||||||
; Очистить буфер пакетной команды
|
;; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
|
||||||
call clear_packet_buffer
|
; call clear_packet_buffer
|
||||||
; Задать размер буфера в байтах
|
;; Çàäàòü ðàçìåð áóôåðà â áàéòàõ
|
||||||
mov [CDBlockSize],8
|
; mov [CDBlockSize],8
|
||||||
; Сформировать команду READ CAPACITY
|
;; Ñôîðìèðîâàòü êîìàíäó READ CAPACITY
|
||||||
mov [PacketCommand],word 25h
|
; mov [PacketCommand],word 25h
|
||||||
; Подать команду
|
;; Ïîäàòü êîìàíäó
|
||||||
call SendPacketDatCommand
|
; call SendPacketDatCommand
|
||||||
popa
|
; popa
|
||||||
ret
|
; ret
|
||||||
|
|
||||||
clear_packet_buffer:
|
clear_packet_buffer:
|
||||||
; Очистить буфер пакетной команды
|
; Очистить буфер пакетной команды
|
||||||
|
@ -935,6 +935,7 @@ osloop:
|
|||||||
call stack_handler
|
call stack_handler
|
||||||
call checkidle
|
call checkidle
|
||||||
call check_fdd_motor_status
|
call check_fdd_motor_status
|
||||||
|
call check_ATAPI_device_event
|
||||||
jmp osloop
|
jmp osloop
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; ;
|
; ;
|
||||||
|
Loading…
Reference in New Issue
Block a user