CD drivers update from mario

git-svn-id: svn://kolibrios.org@538 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
SPraid (simba) 2007-06-08 14:17:17 +00:00
parent 662b56fa7d
commit 7f9f16c0ff
3 changed files with 49 additions and 18 deletions

View File

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

View File

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

View File

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