2010-10-01 11:21:55 +02:00
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
;; ;;
|
2012-03-15 13:41:29 +01:00
|
|
|
|
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;; Distributed under terms of the GNU General Public License ;;
|
|
|
|
|
;; ;;
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
|
|
$Revision$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;******************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; поиск приводов HDD и CD
|
|
|
|
|
; автор исходного текста Кулаков Владимир Геннадьевич.
|
|
|
|
|
; адаптация и доработка Mario79
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;******************************************************
|
|
|
|
|
|
|
|
|
|
;****************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
;* ПОИСК HDD и CD *
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;****************************************************
|
2014-12-01 04:51:07 +01:00
|
|
|
|
cmp [ecx+IDE_DATA.ProgrammingInterface], 0
|
2013-09-14 20:55:13 +02:00
|
|
|
|
je EndFindHDD
|
|
|
|
|
|
2010-10-01 11:21:55 +02:00
|
|
|
|
FindHDD:
|
2014-12-01 04:51:07 +01:00
|
|
|
|
push ecx
|
|
|
|
|
|
|
|
|
|
xor ebx, ebx
|
|
|
|
|
inc ebx
|
|
|
|
|
|
|
|
|
|
cmp ecx, IDE_controller_2
|
|
|
|
|
jne @f
|
|
|
|
|
|
|
|
|
|
add bl, 5
|
|
|
|
|
jmp .find
|
|
|
|
|
@@:
|
|
|
|
|
cmp ecx, IDE_controller_3
|
|
|
|
|
jne .find
|
|
|
|
|
|
|
|
|
|
add bl, 10
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.find:
|
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [ChannelNumber], 1
|
|
|
|
|
mov [DiskNumber], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
call FindHDD_2
|
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DiskNumber], 1
|
2014-12-01 04:51:07 +01:00
|
|
|
|
call FindHDD_2
|
|
|
|
|
|
2010-10-01 11:21:55 +02:00
|
|
|
|
inc [ChannelNumber]
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DiskNumber], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
call FindHDD_2
|
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DiskNumber], 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call FindHDD_1
|
|
|
|
|
|
2014-12-01 04:51:07 +01:00
|
|
|
|
pop ecx
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jmp EndFindHDD
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
|
FindHDD_2:
|
|
|
|
|
call FindHDD_1
|
|
|
|
|
shl byte [ebx+DRIVE_DATA], 2
|
|
|
|
|
ret
|
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
FindHDD_1:
|
2013-06-28 10:02:49 +02:00
|
|
|
|
DEBUGF 1, "K : Channel %d ",[ChannelNumber]:2
|
|
|
|
|
DEBUGF 1, "Disk %d\n",[DiskNumber]:1
|
2014-12-01 04:51:07 +01:00
|
|
|
|
push ebx ecx
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call ReadHDD_ID
|
2014-12-01 04:51:07 +01:00
|
|
|
|
pop ecx ebx
|
|
|
|
|
cmp [DevErrorCode], 7
|
|
|
|
|
je .end
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [DevErrorCode], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
jne .FindCD
|
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [Sector512+6], word 16
|
2014-12-01 04:51:07 +01:00
|
|
|
|
ja .FindCD
|
|
|
|
|
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [Sector512+12], word 255
|
2014-12-01 04:51:07 +01:00
|
|
|
|
ja .FindCD
|
|
|
|
|
|
|
|
|
|
inc byte [ebx+DRIVE_DATA]
|
|
|
|
|
jmp .Print_Device_Name
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.FindCD:
|
|
|
|
|
push ebx ecx
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call DeviceReset
|
2014-12-01 04:51:07 +01:00
|
|
|
|
pop ecx ebx
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [DevErrorCode], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
jne .end
|
|
|
|
|
|
|
|
|
|
push ebx ecx
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call ReadCD_ID
|
2014-12-01 04:51:07 +01:00
|
|
|
|
pop ecx ebx
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [DevErrorCode], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
jne .end
|
|
|
|
|
|
|
|
|
|
add [ebx+DRIVE_DATA], byte 2
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.Print_Device_Name:
|
2013-06-28 10:02:49 +02:00
|
|
|
|
pushad
|
|
|
|
|
pushfd
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
xor ebx, ebx
|
|
|
|
|
mov bx, [ChannelNumber]
|
|
|
|
|
dec ebx
|
|
|
|
|
shl ebx, 1
|
|
|
|
|
add bl, [DiskNumber]
|
|
|
|
|
shl ebx, 1
|
|
|
|
|
|
|
|
|
|
call calculate_IDE_device_values_storage
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.copy_dev_name:
|
2013-06-28 10:02:49 +02:00
|
|
|
|
mov esi, Sector512+27*2
|
|
|
|
|
mov edi, dev_name
|
|
|
|
|
mov ecx, 20
|
|
|
|
|
cld
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;--------------------------------------
|
2013-06-28 10:02:49 +02:00
|
|
|
|
@@:
|
|
|
|
|
lodsw
|
|
|
|
|
xchg ah, al
|
|
|
|
|
stosw
|
|
|
|
|
loop @b
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
2013-06-28 10:02:49 +02:00
|
|
|
|
DEBUGF 1, "K : Dev: %s \n", dev_name
|
2013-09-14 20:55:13 +02:00
|
|
|
|
|
|
|
|
|
xor eax, eax
|
|
|
|
|
mov ax, [Sector512+64*2]
|
2014-12-01 04:51:07 +01:00
|
|
|
|
DEBUGF 1, "K : PIO possible modes %x\n", al
|
|
|
|
|
|
|
|
|
|
mov ax, [Sector512+51*2]
|
|
|
|
|
mov al, ah
|
|
|
|
|
call convert_Sector512_value
|
|
|
|
|
DEBUGF 1, "K : PIO set mode %x\n", ah
|
|
|
|
|
|
2013-09-14 20:55:13 +02:00
|
|
|
|
mov ax, [Sector512+63*2]
|
2014-12-01 04:51:07 +01:00
|
|
|
|
DEBUGF 1, "K : Multiword DMA possible modes %x\n", al
|
|
|
|
|
|
|
|
|
|
mov al, ah
|
|
|
|
|
call convert_Sector512_value
|
|
|
|
|
DEBUGF 1, "K : Multiword DMA set mode %x\n", ah
|
|
|
|
|
|
2013-09-14 20:55:13 +02:00
|
|
|
|
mov ax, [Sector512+88*2]
|
2014-12-01 04:51:07 +01:00
|
|
|
|
DEBUGF 1, "K : Ultra DMA possible modes %x\n", al
|
|
|
|
|
|
|
|
|
|
mov [ebx+IDE_DEVICE.UDMA_possible_modes], al
|
|
|
|
|
|
|
|
|
|
mov al, ah
|
|
|
|
|
call convert_Sector512_value
|
|
|
|
|
DEBUGF 1, "K : Ultra DMA set mode %x\n", ah
|
|
|
|
|
|
|
|
|
|
mov [ebx+IDE_DEVICE.UDMA_set_mode], ah
|
|
|
|
|
|
|
|
|
|
popfd
|
|
|
|
|
popad
|
|
|
|
|
ret
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.end:
|
|
|
|
|
DEBUGF 1, "K : Device not found\n"
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
|
calculate_IDE_device_values_storage:
|
|
|
|
|
cmp ecx, IDE_controller_1
|
|
|
|
|
jne @f
|
2010-10-01 11:21:55 +02:00
|
|
|
|
|
2014-12-01 04:51:07 +01:00
|
|
|
|
add ebx, IDE_device_1
|
|
|
|
|
jmp .exit
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
@@:
|
|
|
|
|
cmp ecx, IDE_controller_2
|
|
|
|
|
jne @f
|
|
|
|
|
|
|
|
|
|
add ebx, IDE_device_2
|
|
|
|
|
jmp .exit
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
@@:
|
|
|
|
|
add ebx, IDE_device_3
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.exit:
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
|
convert_Sector512_value:
|
|
|
|
|
mov ecx, 8
|
|
|
|
|
xor ah, ah
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
@@:
|
|
|
|
|
test al, 1b
|
|
|
|
|
jnz .end
|
|
|
|
|
|
|
|
|
|
shr al, 1
|
|
|
|
|
inc ah
|
|
|
|
|
loop @b
|
2010-10-01 11:21:55 +02:00
|
|
|
|
|
2014-12-01 04:51:07 +01:00
|
|
|
|
xor ah, ah
|
|
|
|
|
;--------------------------------------
|
|
|
|
|
.end:
|
|
|
|
|
ret
|
|
|
|
|
;-----------------------------------------------------------------------------
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Адрес считываемого сектора в режиме LBA
|
2010-10-01 11:21:55 +02:00
|
|
|
|
uglobal
|
2014-12-01 04:51:07 +01:00
|
|
|
|
SectorAddress dd ?
|
2013-06-28 10:02:49 +02:00
|
|
|
|
dev_name:
|
|
|
|
|
rb 41
|
2010-10-01 11:21:55 +02:00
|
|
|
|
endg
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
|
|
|
|
|
;* Входные параметры передаются через глобальные *
|
|
|
|
|
;* переменные: *
|
|
|
|
|
;* ChannelNumber - номер канала (1 или 2); *
|
|
|
|
|
;* DiskNumber - номер диска на канале (0 или 1). *
|
|
|
|
|
;* Идентификационный блок данных считывается *
|
|
|
|
|
;* в массив Sector512. *
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
|
|
|
|
ReadHDD_ID:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Задать режим CHS
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [ATAAddressMode], 0
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Послать команду идентификации устройства
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [ATAFeatures], 0
|
|
|
|
|
mov [ATAHead], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov [ATACommand], 0xEC
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call SendCommandToHDD
|
2014-12-01 04:51:07 +01:00
|
|
|
|
cmp [DevErrorCode], 0 ;проверить код ошибки
|
2013-05-28 21:09:31 +02:00
|
|
|
|
jne @@End ;закончить, сохранив код ошибки
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
mov dx, [ATABasePortAddr]
|
|
|
|
|
add dx, 7 ;адрес регистра состояни
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov ecx, 0xffff
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@WaitCompleet:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить время выполнения команды
|
2012-03-08 09:33:38 +01:00
|
|
|
|
dec ecx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
jz @@Error1 ;ошибка тайм-аута
|
|
|
|
|
; Проверить готовность
|
2014-12-01 04:51:07 +01:00
|
|
|
|
in al, dx
|
|
|
|
|
test al, 80h ;состояние сигнала BSY
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@WaitCompleet
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
test al, 1 ;состояние сигнала ERR
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@Error6
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
test al, 08h ;состояние сигнала DRQ
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jz @@WaitCompleet
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Принять блок данных от контроллера
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov edi, Sector512
|
|
|
|
|
mov dx, [ATABasePortAddr];регистр данных
|
|
|
|
|
mov cx, 256 ;число считываемых слов
|
2013-05-28 21:09:31 +02:00
|
|
|
|
rep insw ;принять блок данных
|
2012-03-08 09:33:38 +01:00
|
|
|
|
ret
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Записать код ошибки
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@Error1:
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 1
|
|
|
|
|
ret
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@Error6:
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 6
|
|
|
|
|
@@End:
|
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
uglobal
|
2014-12-01 04:51:07 +01:00
|
|
|
|
; Стандартные базовые адреса каналов 1 и 2
|
|
|
|
|
StandardATABases dw ?, ? ; 1F0h, 170h
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Номер канала
|
2014-12-01 04:51:07 +01:00
|
|
|
|
ChannelNumber dw ?
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Номер диска
|
2014-12-01 04:51:07 +01:00
|
|
|
|
DiskNumber db ?
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Базовый адрес группы портов контроллера ATA
|
2014-12-01 04:51:07 +01:00
|
|
|
|
ATABasePortAddr dw ?
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Параметры ATA-команды
|
2014-12-01 04:51:07 +01:00
|
|
|
|
ATAFeatures db ? ;особенности
|
|
|
|
|
ATASectorCount db ? ;количество обрабатываемых секторов
|
|
|
|
|
ATASectorNumber db ? ;номер начального сектора
|
|
|
|
|
ATACylinder dw ? ;номер начального цилиндра
|
|
|
|
|
ATAHead db ? ;номер начальной головки
|
|
|
|
|
ATAAddressMode db ? ;режим адресации (0 - CHS, 1 - LBA)
|
|
|
|
|
ATACommand db ? ;код команды, подлежащей выполнению
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
|
|
|
|
|
; интервал ожидания, 2 - неверный код режима адресации,
|
|
|
|
|
; 3 - неверный номер канала, 4 - неверный номер диска,
|
|
|
|
|
; 5 - неверный номер головки, 6 - ошибка при выполнении
|
2014-12-01 04:51:07 +01:00
|
|
|
|
; команды, 7 - таймаут при выборе канала)
|
2010-10-01 11:21:55 +02:00
|
|
|
|
DevErrorCode dd ?
|
|
|
|
|
endg
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;****************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
|
|
|
|
|
;* Входные параметры передаются через глобальные *
|
|
|
|
|
;* переменные: *
|
|
|
|
|
;* ChannelNumber - номер канала (1 или 2); *
|
|
|
|
|
;* DiskNumber - номер диска (0 или 1); *
|
|
|
|
|
;* ATAFeatures - "особенности"; *
|
|
|
|
|
;* ATASectorCount - количество секторов; *
|
|
|
|
|
;* ATASectorNumber - номер начального сектора; *
|
|
|
|
|
;* ATACylinder - номер начального цилиндра; *
|
|
|
|
|
;* ATAHead - номер начальной головки; *
|
|
|
|
|
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
|
|
|
|
|
;* ATACommand - код команды. *
|
|
|
|
|
;* После успешного выполнения функции: *
|
|
|
|
|
;* в ATABasePortAddr - базовый адрес HDD; *
|
|
|
|
|
;* в DevErrorCode - ноль. *
|
|
|
|
|
;* При возникновении ошибки в DevErrorCode будет *
|
|
|
|
|
;* возвращен код ошибки. *
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;****************************************************
|
|
|
|
|
SendCommandToHDD:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить значение кода режима
|
2012-03-08 09:33:38 +01:00
|
|
|
|
cmp [ATAAddressMode], 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err2
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить корректность номера канала
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov bx, [ChannelNumber]
|
|
|
|
|
cmp bx, 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jb @@Err3
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
cmp bx, 2
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err3
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Установить базовый адрес
|
2014-12-01 04:51:07 +01:00
|
|
|
|
dec bx
|
|
|
|
|
shl bx, 1
|
2012-03-08 09:33:38 +01:00
|
|
|
|
movzx ebx, bx
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov ax, [ebx+StandardATABases]
|
|
|
|
|
mov [ATABasePortAddr], ax
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Ожидание готовности HDD к приему команды
|
|
|
|
|
; Выбрать нужный диск
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov dx, [ATABasePortAddr]
|
|
|
|
|
add dx, 6 ;адрес регистра головок
|
|
|
|
|
mov al, [DiskNumber]
|
|
|
|
|
cmp al, 1 ;проверить номера диска
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err4
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
shl al, 4
|
|
|
|
|
or al, 10100000b
|
|
|
|
|
out dx, al
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Ожидать, пока диск не будет готов
|
2014-12-01 04:51:07 +01:00
|
|
|
|
inc dx
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov ecx, 0xfff
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@WaitHDReady:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить время ожидани
|
2012-03-08 09:33:38 +01:00
|
|
|
|
dec ecx
|
|
|
|
|
jz @@Err1
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Прочитать регистр состояни
|
2014-12-01 04:51:07 +01:00
|
|
|
|
in al, dx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить состояние сигнала BSY
|
2014-12-01 04:51:07 +01:00
|
|
|
|
test al, 80h
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@WaitHDReady
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить состояние сигнала DRQ
|
2014-12-01 04:51:07 +01:00
|
|
|
|
test al, 08h
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@WaitHDReady
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Загрузить команду в регистры контроллера
|
2010-10-01 11:21:55 +02:00
|
|
|
|
cli
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov dx, [ATABasePortAddr]
|
|
|
|
|
inc dx ;регистр "особенностей"
|
|
|
|
|
mov al, [ATAFeatures]
|
|
|
|
|
out dx, AL
|
|
|
|
|
inc dx ;счетчик секторов
|
|
|
|
|
mov al, [ATASectorCount]
|
|
|
|
|
out dx, AL
|
|
|
|
|
inc dx ;регистр номера сектора
|
|
|
|
|
mov al, [ATASectorNumber]
|
|
|
|
|
out dx, AL
|
|
|
|
|
inc dx ;номер цилиндра (младший байт)
|
|
|
|
|
mov ax, [ATACylinder]
|
|
|
|
|
out dx, AL
|
|
|
|
|
inc dx ;номер цилиндра (старший байт)
|
|
|
|
|
mov al, AH
|
|
|
|
|
out dx, AL
|
|
|
|
|
inc dx ;номер головки/номер диска
|
|
|
|
|
mov al, [DiskNumber]
|
|
|
|
|
shl al, 4
|
|
|
|
|
cmp [ATAHead], 0xF ;проверить номер головки
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err5
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
or al, [ATAHead]
|
|
|
|
|
or al, 10100000b
|
|
|
|
|
mov ah, [ATAAddressMode]
|
|
|
|
|
shl ah, 6
|
|
|
|
|
or al, ah
|
|
|
|
|
out dx, al
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Послать команду
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov al, [ATACommand]
|
|
|
|
|
inc dx ;регистр команд
|
|
|
|
|
out dx, al
|
2010-10-01 11:21:55 +02:00
|
|
|
|
sti
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Сбросить признак ошибки
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 0
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Записать код ошибки
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err1:
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov [DevErrorCode], 7
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err2:
|
|
|
|
|
mov [DevErrorCode], 2
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err3:
|
|
|
|
|
mov [DevErrorCode], 3
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err4:
|
|
|
|
|
mov [DevErrorCode], 4
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err5:
|
|
|
|
|
mov [DevErrorCode], 5
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Завершение работы программы
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
|
|
|
|
|
;* Входные параметры передаются через глобальные *
|
|
|
|
|
;* перменные: *
|
|
|
|
|
;* ChannelNumber - номер канала; *
|
|
|
|
|
;* DiskNumber - номер диска на канале. *
|
|
|
|
|
;* Идентификационный блок данных считывается *
|
|
|
|
|
;* в массив Sector512. *
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
|
|
|
|
ReadCD_ID:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Задать режим CHS
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [ATAAddressMode], 0
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Послать команду идентификации устройства
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [ATAFeatures], 0
|
|
|
|
|
mov [ATASectorCount], 0
|
|
|
|
|
mov [ATASectorNumber], 0
|
|
|
|
|
mov [ATACylinder], 0
|
|
|
|
|
mov [ATAHead], 0
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov [ATACommand], 0xA1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
call SendCommandToHDD
|
2013-05-28 21:09:31 +02:00
|
|
|
|
cmp [DevErrorCode], 0;проверить код ошибки
|
|
|
|
|
jne @@End_1 ;закончить, сохранив код ошибки
|
|
|
|
|
; Ожидать готовность данных HDD
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov dx, [ATABasePortAddr]
|
|
|
|
|
add dx, 7 ;порт 1х7h
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov ecx, 0xffff
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@WaitCompleet_1:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить врем
|
2012-03-08 09:33:38 +01:00
|
|
|
|
dec ecx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
jz @@Error1_1 ;ошибка тайм-аута
|
|
|
|
|
; Проверить готовность
|
2014-12-01 04:51:07 +01:00
|
|
|
|
in al, dx
|
|
|
|
|
test al, 80h ;состояние сигнала BSY
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@WaitCompleet_1
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
test al, 1 ;состояние сигнала ERR
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@Error6_1
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
test al, 08h ;состояние сигнала DRQ
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jz @@WaitCompleet_1
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Принять блок данных от контроллера
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov edi, Sector512 ;offset Sector512
|
|
|
|
|
mov dx, [ATABasePortAddr];порт 1x0h
|
|
|
|
|
mov cx, 256;число считываемых слов
|
2012-03-08 09:33:38 +01:00
|
|
|
|
rep insw
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Записать код ошибки
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@Error1_1:
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
|
|
|
|
@@Error6_1:
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 6
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@End_1:
|
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
2013-05-28 21:09:31 +02:00
|
|
|
|
;* СБРОС УСТРОЙСТВА *
|
|
|
|
|
;* Входные параметры передаются через глобальные *
|
|
|
|
|
;* переменные: *
|
|
|
|
|
;* ChannelNumber - номер канала (1 или 2); *
|
|
|
|
|
;* DiskNumber - номер диска (0 или 1). *
|
2010-10-01 11:21:55 +02:00
|
|
|
|
;*************************************************
|
|
|
|
|
DeviceReset:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить корректность номера канала
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov bx, [ChannelNumber]
|
|
|
|
|
cmp bx, 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jb @@Err3_2
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
cmp bx, 2
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err3_2
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Установить базовый адрес
|
2014-12-01 04:51:07 +01:00
|
|
|
|
dec bx
|
|
|
|
|
shl bx, 1
|
2012-03-08 09:33:38 +01:00
|
|
|
|
movzx ebx, bx
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov dx, [ebx+StandardATABases]
|
|
|
|
|
mov [ATABasePortAddr], dx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Выбрать нужный диск
|
2014-12-01 04:51:07 +01:00
|
|
|
|
add dx, 6 ;адрес регистра головок
|
|
|
|
|
mov al, [DiskNumber]
|
|
|
|
|
cmp al, 1 ;проверить номера диска
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ja @@Err4_2
|
2014-12-01 04:51:07 +01:00
|
|
|
|
|
|
|
|
|
shl al, 4
|
|
|
|
|
or al, 10100000b
|
|
|
|
|
out dx, al
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Послать команду "Сброс"
|
2014-12-01 04:51:07 +01:00
|
|
|
|
mov al, 0x8
|
|
|
|
|
inc dx ;регистр команд
|
|
|
|
|
out dx, al
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov ecx, 0x80000
|
2010-10-01 11:21:55 +02:00
|
|
|
|
@@WaitHDReady_1:
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить время ожидани
|
2010-10-01 11:21:55 +02:00
|
|
|
|
dec ecx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
je @@Err1_2 ;ошибка тайм-аута
|
|
|
|
|
; Прочитать регистр состояни
|
2014-12-01 04:51:07 +01:00
|
|
|
|
in al, dx
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Проверить состояние сигнала BSY
|
2014-12-01 04:51:07 +01:00
|
|
|
|
test al, 80h
|
2010-10-01 11:21:55 +02:00
|
|
|
|
jnz @@WaitHDReady_1
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Сбросить признак ошибки
|
2012-03-08 09:33:38 +01:00
|
|
|
|
mov [DevErrorCode], 0
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Обработка ошибок
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err1_2:
|
|
|
|
|
mov [DevErrorCode], 1
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err3_2:
|
|
|
|
|
mov [DevErrorCode], 3
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2012-03-08 09:33:38 +01:00
|
|
|
|
@@Err4_2:
|
|
|
|
|
mov [DevErrorCode], 4
|
2013-05-28 21:09:31 +02:00
|
|
|
|
; Записать код ошибки
|
2010-10-01 11:21:55 +02:00
|
|
|
|
ret
|
2014-12-01 04:51:07 +01:00
|
|
|
|
;-----------------------------------------------------------------------------
|
2010-10-01 11:21:55 +02:00
|
|
|
|
EndFindHDD:
|