forked from KolibriOS/kolibrios
CD drivers update from mario
git-svn-id: svn://kolibrios.org@538 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
662b56fa7d
commit
7f9f16c0ff
@ -22,7 +22,7 @@ MaxRetr equ 3
|
|||||||
; Предельное время ожидания готовности к приему команды
|
; Предельное время ожидания готовности к приему команды
|
||||||
; (в тиках)
|
; (в тиках)
|
||||||
BSYWaitTime equ 1000 ;2
|
BSYWaitTime equ 1000 ;2
|
||||||
|
NoTickWaitTime equ 0xfffff
|
||||||
;*************************************************
|
;*************************************************
|
||||||
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА *
|
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА *
|
||||||
;* Считываются данные пользователя, информация *
|
;* Считываются данные пользователя, информация *
|
||||||
@ -68,7 +68,7 @@ ReadCD:
|
|||||||
;* Многократное повторение чтения при сбоях *
|
;* Многократное повторение чтения при сбоях *
|
||||||
;********************************************
|
;********************************************
|
||||||
ReadCDWRetr:
|
ReadCDWRetr:
|
||||||
pusha
|
pushad
|
||||||
; Цикл, пока команда не выполнена успешно или не
|
; Цикл, пока команда не выполнена успешно или не
|
||||||
; исчерпано количество попыток
|
; исчерпано количество попыток
|
||||||
mov ECX,MaxRetr
|
mov ECX,MaxRetr
|
||||||
@ -77,6 +77,15 @@ ReadCDWRetr:
|
|||||||
call ReadCD
|
call ReadCD
|
||||||
cmp [DevErrorCode],0
|
cmp [DevErrorCode],0
|
||||||
je @@End_4
|
je @@End_4
|
||||||
|
cmp [timer_ticks_enable],0
|
||||||
|
jne @f
|
||||||
|
mov eax,NoTickWaitTime
|
||||||
|
.wait:
|
||||||
|
dec eax
|
||||||
|
cmp eax,0
|
||||||
|
je @@NextRetr
|
||||||
|
jmp .wait
|
||||||
|
@@:
|
||||||
; Задержка на 2,5 секунды
|
; Задержка на 2,5 секунды
|
||||||
mov EAX,[timer_ticks]
|
mov EAX,[timer_ticks]
|
||||||
add EAX,250 ;50
|
add EAX,250 ;50
|
||||||
@ -85,12 +94,8 @@ ReadCDWRetr:
|
|||||||
cmp EAX,[timer_ticks]
|
cmp EAX,[timer_ticks]
|
||||||
ja @@Wait
|
ja @@Wait
|
||||||
loop @@NextRetr
|
loop @@NextRetr
|
||||||
; call test_mario79
|
|
||||||
; Ñîîáùåíèå îá îøèáêå
|
|
||||||
; mov SI,offset ErrS
|
|
||||||
; call FatalError
|
|
||||||
@@End_4:
|
@@End_4:
|
||||||
popa
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@ -143,7 +148,6 @@ SendPacketDatCommand:
|
|||||||
mov [ATAHead],0
|
mov [ATAHead],0
|
||||||
mov [ATACommand],0A0h
|
mov [ATACommand],0A0h
|
||||||
call SendCommandToHDD_1
|
call SendCommandToHDD_1
|
||||||
; call test_mario79
|
|
||||||
cmp [DevErrorCode],0 ;проверить код ошибки
|
cmp [DevErrorCode],0 ;проверить код ошибки
|
||||||
jne @@End_8 ;закончить, сохранив код ошибки
|
jne @@End_8 ;закончить, сохранив код ошибки
|
||||||
|
|
||||||
@ -151,7 +155,15 @@ SendPacketDatCommand:
|
|||||||
; пакетной команды
|
; пакетной команды
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,7 ;порт 1х7h
|
add DX,7 ;порт 1х7h
|
||||||
|
mov ecx,NoTickWaitTime
|
||||||
@@WaitDevice0:
|
@@WaitDevice0:
|
||||||
|
cmp [timer_ticks_enable],0
|
||||||
|
jne @f
|
||||||
|
dec ecx
|
||||||
|
cmp ecx,0
|
||||||
|
je @@Err1_1
|
||||||
|
jmp .test
|
||||||
|
@@:
|
||||||
call change_task
|
call change_task
|
||||||
; Проверить время выполнения команды
|
; Проверить время выполнения команды
|
||||||
mov EAX,[timer_ticks]
|
mov EAX,[timer_ticks]
|
||||||
@ -159,13 +171,14 @@ SendPacketDatCommand:
|
|||||||
cmp EAX,BSYWaitTime
|
cmp EAX,BSYWaitTime
|
||||||
ja @@Err1_1 ;ошибка тайм-аута
|
ja @@Err1_1 ;ошибка тайм-аута
|
||||||
; Проверить готовность
|
; Проверить готовность
|
||||||
|
.test:
|
||||||
in AL,DX
|
in AL,DX
|
||||||
test AL,80h ;состояние сигнала BSY
|
test AL,80h ;состояние сигнала BSY
|
||||||
jnz @@WaitDevice0
|
jnz @@WaitDevice0
|
||||||
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
|
||||||
jnz @@Err6
|
|
||||||
test AL,08h ;состояние сигнала DRQ
|
test AL,08h ;состояние сигнала DRQ
|
||||||
jz @@WaitDevice0
|
jz @@WaitDevice0
|
||||||
|
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
||||||
|
jnz @@Err6
|
||||||
; Послать пакетную команду
|
; Послать пакетную команду
|
||||||
cli
|
cli
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
@ -185,7 +198,15 @@ SendPacketDatCommand:
|
|||||||
; Ожидание готовности данных
|
; Ожидание готовности данных
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,7 ;порт 1х7h
|
add DX,7 ;порт 1х7h
|
||||||
|
mov ecx,NoTickWaitTime
|
||||||
@@WaitDevice1:
|
@@WaitDevice1:
|
||||||
|
cmp [timer_ticks_enable],0
|
||||||
|
jne @f
|
||||||
|
dec ecx
|
||||||
|
cmp ecx,0
|
||||||
|
je @@Err1_1
|
||||||
|
jmp .test_1
|
||||||
|
@@:
|
||||||
call change_task
|
call change_task
|
||||||
; Проверить время выполнения команды
|
; Проверить время выполнения команды
|
||||||
mov EAX,[timer_ticks]
|
mov EAX,[timer_ticks]
|
||||||
@ -193,23 +214,25 @@ SendPacketDatCommand:
|
|||||||
cmp EAX,MaxCDWaitTime
|
cmp EAX,MaxCDWaitTime
|
||||||
ja @@Err1_1 ;ошибка тайм-аута
|
ja @@Err1_1 ;ошибка тайм-аута
|
||||||
; Проверить готовность
|
; Проверить готовность
|
||||||
|
.test_1:
|
||||||
in AL,DX
|
in AL,DX
|
||||||
test AL,80h ;состояние сигнала BSY
|
test AL,80h ;состояние сигнала BSY
|
||||||
jnz @@WaitDevice1
|
jnz @@WaitDevice1
|
||||||
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
|
||||||
jnz @@Err6_temp
|
|
||||||
test AL,08h ;состояние сигнала DRQ
|
test AL,08h ;состояние сигнала DRQ
|
||||||
jz @@WaitDevice1
|
jz @@WaitDevice1
|
||||||
cli
|
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
||||||
|
jnz @@Err6_temp
|
||||||
; Принять блок данных от контроллера
|
; Принять блок данных от контроллера
|
||||||
mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf
|
mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf
|
||||||
; Загрузить адрес регистра данных контроллера
|
; Загрузить адрес регистра данных контроллера
|
||||||
mov DX,[ATABasePortAddr] ;порт 1x0h
|
mov DX,[ATABasePortAddr] ;порт 1x0h
|
||||||
; Загрузить в счетчик размер блока в байтах
|
; Загрузить в счетчик размер блока в байтах
|
||||||
|
xor ecx,ecx
|
||||||
mov CX,[CDBlockSize]
|
mov CX,[CDBlockSize]
|
||||||
; Вычислить размер блока в 16-разрядных словах
|
; Вычислить размер блока в 16-разрядных словах
|
||||||
shr CX,1 ;разделить размер блока на 2
|
shr CX,1 ;разделить размер блока на 2
|
||||||
; Принять блок данных
|
; Принять блок данных
|
||||||
|
cli
|
||||||
cld
|
cld
|
||||||
rep insw
|
rep insw
|
||||||
sti
|
sti
|
||||||
@ -368,20 +391,25 @@ SendCommandToHDD_1:
|
|||||||
out DX,AL
|
out DX,AL
|
||||||
; Ожидать, пока диск не будет готов
|
; Ожидать, пока диск не будет готов
|
||||||
inc DX
|
inc DX
|
||||||
; mov ecx,0xfff
|
|
||||||
mov eax,[timer_ticks]
|
mov eax,[timer_ticks]
|
||||||
mov [TickCounter_1],eax
|
mov [TickCounter_1],eax
|
||||||
|
mov ecx,NoTickWaitTime
|
||||||
@@WaitHDReady_2:
|
@@WaitHDReady_2:
|
||||||
|
cmp [timer_ticks_enable],0
|
||||||
|
jne @f
|
||||||
|
dec ecx
|
||||||
|
cmp ecx,0
|
||||||
|
je @@Err1_4
|
||||||
|
jmp .test
|
||||||
|
@@:
|
||||||
call change_task
|
call change_task
|
||||||
; Проверить время ожидания
|
; Проверить время ожидания
|
||||||
; dec ecx
|
|
||||||
; cmp ecx,0
|
|
||||||
; je @@Err1
|
|
||||||
mov eax,[timer_ticks]
|
mov eax,[timer_ticks]
|
||||||
sub eax,[TickCounter_1]
|
sub eax,[TickCounter_1]
|
||||||
cmp eax,BSYWaitTime ;300 ;ожидать 3 сек.
|
cmp eax,BSYWaitTime ;300 ;ожидать 3 сек.
|
||||||
ja @@Err1_4 ;ошибка тайм-аута
|
ja @@Err1_4 ;ошибка тайм-аута
|
||||||
; Прочитать регистр состояния
|
; Прочитать регистр состояния
|
||||||
|
.test:
|
||||||
in AL,DX
|
in AL,DX
|
||||||
; Проверить состояние сигнала BSY
|
; Проверить состояние сигнала BSY
|
||||||
test AL,80h
|
test AL,80h
|
||||||
@ -389,6 +417,7 @@ SendCommandToHDD_1:
|
|||||||
; Проверить состояние сигнала DRQ
|
; Проверить состояние сигнала DRQ
|
||||||
test AL,08h
|
test AL,08h
|
||||||
jnz @@WaitHDReady_2
|
jnz @@WaitHDReady_2
|
||||||
|
|
||||||
; Загрузить команду в регистры контроллера
|
; Загрузить команду в регистры контроллера
|
||||||
cli
|
cli
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
@ -443,7 +472,7 @@ SendCommandToHDD_1:
|
|||||||
mov [DevErrorCode],5
|
mov [DevErrorCode],5
|
||||||
; Завершение работы программы
|
; Завершение работы программы
|
||||||
@@End_10:
|
@@End_10:
|
||||||
sti
|
; sti
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -337,6 +337,7 @@ wraw_bacground_select rb 1
|
|||||||
|
|
||||||
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled
|
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled
|
||||||
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
|
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
|
||||||
|
timer_ticks_enable rb 1 ; for cd driver
|
||||||
|
|
||||||
IncludeUGlobals
|
IncludeUGlobals
|
||||||
|
|
||||||
|
@ -857,6 +857,7 @@ first_app_found:
|
|||||||
; mov [dma_hdd],1
|
; mov [dma_hdd],1
|
||||||
cmp [IDEContrRegsBaseAddr], 0
|
cmp [IDEContrRegsBaseAddr], 0
|
||||||
setnz [dma_hdd]
|
setnz [dma_hdd]
|
||||||
|
mov [timer_ticks_enable],1 ; for cd driver
|
||||||
|
|
||||||
; stdcall init_uart_service, DRV_ENTRY
|
; stdcall init_uart_service, DRV_ENTRY
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user