11,13 → 11,9 |
;********************************************************** |
; Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI) |
;********************************************************** |
; Àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
; Àäàïòàöèÿ è äîðàáîòêà Mario79 |
; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷ |
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79 |
|
; Ïðîöåäóðà äëÿ ïîëíîãî ñ÷èòûâàíèÿ âñåõ |
; äàííûõ èç ñåêòîðà êîìïàêò-äèñêà |
; Àâòîð òåêñòà ïðîãðàììû Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
|
; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ |
MaxRetr equ 10 |
; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû |
80,13 → 76,6 |
add esi,8 |
mov edi,1 |
.hdreadcache: |
; push esi |
; mov esi,[esi] |
; call test_mario79 |
; mov esi,eax |
; call test_mario79 |
; pop esi |
|
; cmp dword [esi+4],0 ; empty |
; je .nohdcache |
cmp [esi],eax ; correct sector |
111,11 → 100,6 |
mov [CDDataBuf_pointer],ebx |
call cd_calculate_cache_1 |
lea esi,[edi*8+esi] |
; push esi |
; call test_mario79 |
; mov esi,eax |
; call test_mario79 |
; pop esi |
mov [esi],eax ; sector number |
; mov dword [esi+4],1 ; hd read - mark as same as in hd |
.yeshdcache: |
172,8 → 156,6 |
|
; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå |
; ïàêåòíûõ êîìàíä â ðåæèìå PIO |
; |
; Àâòîð òåêñòà ïðîãðàììû Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
|
; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè |
; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ) |
384,6 → 366,8 |
mov AX,word [PacketCommand+10] |
out DX,AX |
; sti |
cmp [ignore_CD_eject_wait],1 |
je @@End_9 |
; Îæèäàíèå ïîäòâåðæäåíèÿ ïðèåìà êîìàíäû |
mov DX,[ATABasePortAddr] |
add DX,7 ;ïîðò 1õ7h |
599,6 → 583,10 |
mov [PacketCommand+4],byte 11b |
; Ïîäàòü êîìàíäó |
call SendPacketNoDatCommand |
mov eax,ATAPI_IDE0_lock |
add eax,[cdpos] |
dec eax |
mov [eax],byte 1 |
popa |
ret |
|
608,7 → 596,7 |
;* ïåðìåííûå: * |
;* ChannelNumber - íîìåð êàíàëà; * |
;* DiskNumber - íîìåð äèñêà íà êàíàëå. * |
;************************************************* |
;************************************************* |
allow_medium_removal: |
pusha |
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
619,6 → 607,10 |
mov [PacketCommand+4],byte 00b |
; Ïîäàòü êîìàíäó |
call SendPacketNoDatCommand |
mov eax,ATAPI_IDE0_lock |
add eax,[cdpos] |
dec eax |
mov [eax],byte 0 |
popa |
ret |
|
665,25 → 657,202 |
ret |
|
;************************************************* |
;* ÎÏÐÅÄÅËÈÒÜ ÎÁÙÅÅ ÊÎËÈ×ÅÑÒÂÎ ÑÅÊÒÎÐΠÍÀ ÄÈÑÊÅ * |
;* Ïðîâåðèòü ñîáûòèå íàæàòèÿ êíîïêè èçâëå÷åíèÿ * |
;* äèñêà * |
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
;* ïåðåìåííûå: * |
;* ChannelNumber - íîìåð êàíàëà; * |
;* DiskNumber - íîìåð äèñêà íà êàíàëå. * |
;************************************************* |
ReadCapacity: |
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 [CDBlockSize],8 |
; Ñôîðìèðîâàòü êîìàíäó READ CAPACITY |
mov [PacketCommand],word 25h |
; Çàäàòü êîä êîìàíäû |
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 |
|
;************************************************* |
;* ÎÏÐÅÄÅËÈÒÜ ÎÁÙÅÅ ÊÎËÈ×ÅÑÒÂÎ ÑÅÊÒÎÐΠÍÀ ÄÈÑÊÅ * |
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
;* ïåðåìåííûå: * |
;* ChannelNumber - íîìåð êàíàëà; * |
;* DiskNumber - íîìåð äèñêà íà êàíàëå. * |
;************************************************* |
;ReadCapacity: |
; pusha |
;; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
; call clear_packet_buffer |
;; Çàäàòü ðàçìåð áóôåðà â áàéòàõ |
; mov [CDBlockSize],8 |
;; Ñôîðìèðîâàòü êîìàíäó READ CAPACITY |
; mov [PacketCommand],word 25h |
;; Ïîäàòü êîìàíäó |
; call SendPacketDatCommand |
; popa |
; ret |
|
clear_packet_buffer: |
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
mov [PacketCommand],dword 0 |