163,7 → 163,7 |
.end: |
ret |
;----------------------------------------------------------------------------- |
; Address of reading sector in LBA mode |
; Адрес считываемого сектора в режиме LBA |
uglobal |
SectorAddress dd ? |
dev_name: |
171,49 → 171,49 |
endg |
;----------------------------------------------------------------------------- |
;************************************************* |
;* READING THE HARD DISK IDENTIFIER * |
;* Input parameters are passed through the global* |
;* variables: * |
;* ChannelNumber - channel number (1 or 2); * |
;* DiskNumber - disk number on channel (0 or 1) * |
;* Block of identificational data is reading * |
;* to Sector512 array. * |
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала (1 или 2); * |
;* DiskNumber - номер диска на канале (0 или 1). * |
;* Идентификационный блок данных считывается * |
;* в массив Sector512. * |
;************************************************* |
ReadHDD_ID: |
; set up CHS mode |
; Задать режим CHS |
mov [ATAAddressMode], 0 |
; send device identification command |
; Послать команду идентификации устройства |
mov [ATAFeatures], 0 |
mov [ATAHead], 0 |
mov [ATACommand], 0xEC |
call SendCommandToHDD |
cmp [DevErrorCode], 0 ; check the error code |
jne @@End ; finish, saving the error code |
cmp [DevErrorCode], 0 ;проверить код ошибки |
jne @@End ;закончить, сохранив код ошибки |
|
mov dx, [ATABasePortAddr] |
add dx, 7 ; address of state register |
add dx, 7 ;адрес регистра состояни |
mov ecx, 0xffff |
@@WaitCompleet: |
; Check command execution time |
; Проверить время выполнения команды |
dec ecx |
jz @@Error1 ; timeout error |
; Check if ready or not |
jz @@Error1 ;ошибка тайм-аута |
; Проверить готовность |
in al, dx |
test al, 80h ; BSY signal state |
test al, 80h ;состояние сигнала BSY |
jnz @@WaitCompleet |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Error6 |
|
test al, 08h ; DRQ signal state |
test al, 08h ;состояние сигнала DRQ |
jz @@WaitCompleet |
; Receive data block from controller |
; Принять блок данных от контроллера |
mov edi, Sector512 |
mov dx, [ATABasePortAddr]; data register |
mov cx, 256 ; number of word to receive |
rep insw ; receive data block |
mov dx, [ATABasePortAddr];регистр данных |
mov cx, 256 ;число считываемых слов |
rep insw ;принять блок данных |
ret |
; write the error code |
; Записать код ошибки |
@@Error1: |
mov [DevErrorCode], 1 |
ret |
223,111 → 223,111 |
ret |
;----------------------------------------------------------------------------- |
uglobal |
; Standart base addresses of channels 1 or 2 |
; Стандартные базовые адреса каналов 1 и 2 |
StandardATABases dw ?, ? ; 1F0h, 170h |
; Channel number |
; Номер канала |
ChannelNumber db ? |
; Disk number |
; Номер диска |
DiskNumber db ? |
DeviceNumber db ? |
; Base address of ATA controller's port group |
; Базовый адрес группы портов контроллера ATA |
ATABasePortAddr dw ? |
; ATA-command parameters |
ATAFeatures db ? ; features |
ATASectorCount db ? ; count of processing sectors |
ATASectorNumber db ? ; initial sector number |
ATACylinder dw ? ; initial cylinder number |
ATAHead db ? ; initial head number |
ATAAddressMode db ? ; addressing mode (0 - CHS, 1 - LBA) |
ATACommand db ? ; executing command number |
; Error code (0 - no errors, 1 - waiting time limit exceed |
; 2 - incorrect code of addressing mode, |
; 3 - incorrect channel number, 4 - incorrect disk number, |
; 5 - incorrect head number, 6 - command execution error, |
; 7 - time out when choosing channel) |
; Параметры ATA-команды |
ATAFeatures db ? ;особенности |
ATASectorCount db ? ;количество обрабатываемых секторов |
ATASectorNumber db ? ;номер начального сектора |
ATACylinder dw ? ;номер начального цилиндра |
ATAHead db ? ;номер начальной головки |
ATAAddressMode db ? ;режим адресации (0 - CHS, 1 - LBA) |
ATACommand db ? ;код команды, подлежащей выполнению |
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый |
; интервал ожидания, 2 - неверный код режима адресации, |
; 3 - неверный номер канала, 4 - неверный номер диска, |
; 5 - неверный номер головки, 6 - ошибка при выполнении |
; команды, 7 - таймаут при выборе канала) |
DevErrorCode dd ? |
endg |
;----------------------------------------------------------------------------- |
;**************************************************** |
;* SEND COMMAND TO GIVEN DISK * |
;* Input parameters are passed through the global * |
;* variables: * |
;* ChannelNumber - channel number (1 or 2); * |
;* DiskNumber - disk number (0 or 1); * |
;* ATAFeatures - "features"; * |
;* ATASectorCount - sector count; * |
;* ATASectorNumber - initial sector number; * |
;* ATACylinder - initial cylinder number; * |
;* ATAHead - initial head number; * |
;* ATAAddressMode - addressing mode (0-CHS, 1-LBA); * |
;* ATACommand - command code. * |
;* If the function finished successfully: * |
;* in ATABasePortAddr - base address of HDD; * |
;* in DevErrorCode - zero. * |
;* If error has occured then in DevErrorCode will * |
;* be the error code. * |
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала (1 или 2); * |
;* DiskNumber - номер диска (0 или 1); * |
;* ATAFeatures - "особенности"; * |
;* ATASectorCount - количество секторов; * |
;* ATASectorNumber - номер начального сектора; * |
;* ATACylinder - номер начального цилиндра; * |
;* ATAHead - номер начальной головки; * |
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); * |
;* ATACommand - код команды. * |
;* После успешного выполнения функции: * |
;* в ATABasePortAddr - базовый адрес HDD; * |
;* в DevErrorCode - ноль. * |
;* При возникновении ошибки в DevErrorCode будет * |
;* возвращен код ошибки. * |
;**************************************************** |
SendCommandToHDD: |
; Check the addressing mode code |
; Проверить значение кода режима |
cmp [ATAAddressMode], 1 |
ja @@Err2 |
; Check the channel number correctness |
; Проверить корректность номера канала |
movzx ebx, [ChannelNumber] |
dec ebx |
cmp ebx, 1 |
ja @@Err3 |
; Set the base address |
; Установить базовый адрес |
shl ebx, 1 |
mov ax, [ebx+StandardATABases] |
mov [ATABasePortAddr], ax |
; Waiting for HDD ready to receive a command |
; Choose desired disk |
; Ожидание готовности HDD к приему команды |
; Выбрать нужный диск |
mov dx, [ATABasePortAddr] |
add dx, 6 ; address of the heads register |
add dx, 6 ;адрес регистра головок |
mov al, [DiskNumber] |
cmp al, 1 ; check the disk number |
cmp al, 1 ;проверить номера диска |
ja @@Err4 |
|
shl al, 4 |
or al, 10100000b |
out dx, al |
; Waiting for disk ready |
; Ожидать, пока диск не будет готов |
inc dx |
mov ecx, 0xfff |
@@WaitHDReady: |
; Check waiting time |
; Проверить время ожидани |
dec ecx |
jz @@Err1 |
; Read the state register |
; Прочитать регистр состояни |
in al, dx |
; Check the state of BSY signal |
; Проверить состояние сигнала BSY |
test al, 80h |
jnz @@WaitHDReady |
; Check the state of DRQ signal |
; Проверить состояние сигнала DRQ |
test al, 08h |
jnz @@WaitHDReady |
; load command to controller's registers |
; Загрузить команду в регистры контроллера |
cli |
mov dx, [ATABasePortAddr] |
inc dx ; "features" register |
inc dx ;регистр "особенностей" |
mov al, [ATAFeatures] |
out dx, AL |
inc dx ; sector counter |
inc dx ;счетчик секторов |
mov al, [ATASectorCount] |
out dx, AL |
inc dx ; sector number register |
inc dx ;регистр номера сектора |
mov al, [ATASectorNumber] |
out dx, AL |
inc dx ; cylinder number (low byte) |
inc dx ;номер цилиндра (младший байт) |
mov ax, [ATACylinder] |
out dx, AL |
inc dx ; cylinder number (high byte) |
inc dx ;номер цилиндра (старший байт) |
mov al, AH |
out dx, AL |
inc dx ; head number / disk number |
inc dx ;номер головки/номер диска |
mov al, [DiskNumber] |
shl al, 4 |
cmp [ATAHead], 0xF ; check head number |
cmp [ATAHead], 0xF ;проверить номер головки |
ja @@Err5 |
|
or al, [ATAHead] |
336,15 → 336,15 |
shl ah, 6 |
or al, ah |
out dx, al |
; Send command |
; Послать команду |
mov al, [ATACommand] |
inc dx ; command register |
inc dx ;регистр команд |
out dx, al |
sti |
; reset the error sign |
; Сбросить признак ошибки |
mov [DevErrorCode], 0 |
ret |
; write error code |
; Записать код ошибки |
@@Err1: |
mov [DevErrorCode], 7 |
ret |
359,22 → 359,22 |
ret |
@@Err5: |
mov [DevErrorCode], 5 |
; finish work |
; Завершение работы программы |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* READ ATAPI DEVICE IDENTIFIER * |
;* Input parameters are passed through the global* |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* Block of identificational data is reading * |
;* to Sector512 array. * * |
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;* Идентификационный блок данных считывается * |
;* в массив Sector512. * |
;************************************************* |
ReadCD_ID: |
; Set CHS mode |
; Задать режим CHS |
mov [ATAAddressMode], 0 |
; Send command for device identification |
; Послать команду идентификации устройства |
mov [ATAFeatures], 0 |
mov [ATASectorCount], 0 |
mov [ATASectorNumber], 0 |
382,33 → 382,33 |
mov [ATAHead], 0 |
mov [ATACommand], 0xA1 |
call SendCommandToHDD |
cmp [DevErrorCode], 0 ; check the error code |
jne @@End_1 ; finish, saving the error code |
; Wait for HDD data ready |
cmp [DevErrorCode], 0;проверить код ошибки |
jne @@End_1 ;закончить, сохранив код ошибки |
; Ожидать готовность данных HDD |
mov dx, [ATABasePortAddr] |
add dx, 7 ; port 1х7h |
add dx, 7 ;порт 1х7h |
mov ecx, 0xffff |
@@WaitCompleet_1: |
; Check time |
; Проверить врем |
dec ecx |
jz @@Error1_1 ; time out error |
; Check readyness |
jz @@Error1_1 ;ошибка тайм-аута |
; Проверить готовность |
in al, dx |
test al, 80h ; BSY signal state |
test al, 80h ;состояние сигнала BSY |
jnz @@WaitCompleet_1 |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Error6_1 |
|
test al, 08h ; DRQ signal state |
test al, 08h ;состояние сигнала DRQ |
jz @@WaitCompleet_1 |
; Receive data block from controller |
; Принять блок данных от контроллера |
mov edi, Sector512 ; offset Sector512 |
mov dx, [ATABasePortAddr] ; port 1x0h |
mov cx, 256 ; words read count |
mov dx, [ATABasePortAddr];порт 1x0h |
mov cx, 256;число считываемых слов |
rep insw |
ret |
; write the error code |
; Записать код ошибки |
@@Error1_1: |
mov [DevErrorCode], 1 |
ret |
418,49 → 418,49 |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* DEVICE RESET * |
;* Input parameters are passed through the global* |
;* variables: * |
;* ChannelNumber - channel number (1 or 2); * |
;* DiskNumber - disk number (0 or 1). * |
;* СБРОС УСТРОЙСТВА * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала (1 или 2); * |
;* DiskNumber - номер диска (0 или 1). * |
;************************************************* |
DeviceReset: |
; Check the channel number correctness |
; Проверить корректность номера канала |
movzx ebx, [ChannelNumber] |
dec ebx |
cmp ebx, 1 |
ja @@Err3_2 |
; Set base address |
; Установить базовый адрес |
shl ebx, 1 |
mov dx, [ebx+StandardATABases] |
mov [ATABasePortAddr], dx |
; Choose desired disk |
add dx, 6 ; address of heads register |
; Выбрать нужный диск |
add dx, 6 ;адрес регистра головок |
mov al, [DiskNumber] |
cmp al, 1 ; check disk number |
cmp al, 1 ;проверить номера диска |
ja @@Err4_2 |
|
shl al, 4 |
or al, 10100000b |
out dx, al |
; Send the "Reset" command |
; Послать команду "Сброс" |
mov al, 0x8 |
inc dx ; command register |
inc dx ;регистр команд |
out dx, al |
mov ecx, 0x80000 |
@@WaitHDReady_1: |
; Check waiting time |
; Проверить время ожидани |
dec ecx |
je @@Err1_2 ; time out error |
; read the state register |
je @@Err1_2 ;ошибка тайм-аута |
; Прочитать регистр состояни |
in al, dx |
; Check the state of BSY signal |
; Проверить состояние сигнала BSY |
test al, 80h |
jnz @@WaitHDReady_1 |
; reset the error sign |
; Сбросить признак ошибки |
mov [DevErrorCode], 0 |
ret |
; error processing |
; Обработка ошибок |
@@Err1_2: |
mov [DevErrorCode], 1 |
ret |
469,7 → 469,7 |
ret |
@@Err4_2: |
mov [DevErrorCode], 4 |
; write error code |
; Записать код ошибки |
ret |
;----------------------------------------------------------------------------- |
EndFindHDD: |