9,7 → 9,7 |
|
;----------------------------------------------------------------------------- |
;********************************************************** |
; Direct work with CD (ATAPI) device |
; Direct work with СD (ATAPI) device |
;********************************************************** |
; Author of a part of the source code - Kulakov Vladimir Gennadievich |
; Adaptation, revision and development - Mario79, <Lrz> |
22,8 → 22,8 |
NoTickWaitTime = 0xfffff |
CDBlockSize = 2048 |
;******************************************** |
;* READING SECTOR WITH REPEATS * |
;* Repeated reads on failures * |
;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ * |
;* Многократное повторение чтения при сбоях * |
;******************************************** |
ReadCDWRetr: |
;----------------------------------------------------------- |
86,31 → 86,33 |
;----------------------------------------------------------------------------- |
ReadCDWRetr_1: |
pushad |
; Loop until the command is successful or the number of attempts is over |
; Цикл, пока команда не выполнена успешно или не |
; исчерпано количество попыток |
mov ecx, MaxRetr |
;-------------------------------------- |
align 4 |
@@NextRetr: |
; Send a command |
; Подать команду |
;************************************************* |
;* FULL READ OF COMPACT DISK SECTOR * |
;* User data, subchannel * |
;* information and control information are read * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disc number on channel; * |
;* CDSectorAddress - address of reading sector. * |
;* The data is read into the CDDataBuf array. * |
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА * |
;* Считываются данные пользователя, информация * |
;* субканала и контрольная информация * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале; * |
;* CDSectorAddress - адрес считываемого сектора. * |
;* Данные считывается в массив CDDataBuf. * |
;************************************************* |
;ReadCD: |
push ecx |
; Flush the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Generate a packet command to read a data sector |
; Set the command code Read CD |
; Сформировать пакетную команду для считывания |
; сектора данных |
; Задать код команды Read CD |
mov [PacketCommand], byte 0x28 ;0xBE |
; Set the sector address |
; Задать адрес сектора |
mov ax, word [CDSectorAddress+2] |
xchg al, ah |
mov word [PacketCommand+2], ax |
117,9 → 119,9 |
mov ax, word [CDSectorAddress] |
xchg al, ah |
mov word [PacketCommand+4], ax |
; Set the number of sectors to read |
; Задать количество считываемых секторов |
mov [PacketCommand+8], byte 1 |
; Send a command |
; Подать команду |
call SendPacketDatCommand |
pop ecx |
|
152,54 → 154,57 |
popad |
ret |
;----------------------------------------------------------------------------- |
; General purpose procedures to execute packet commands in PIO Mode |
; Maximum allowable waiting time for the device to respond to a packet command (in ticks) |
; Универсальные процедуры, обеспечивающие выполнение |
; пакетных команд в режиме PIO |
; Максимально допустимое время ожидания реакции |
; устройства на пакетную команду (в тиках) |
;----------------------------------------------------------------------------- |
MaxCDWaitTime = 1000 ;200 ;10 seconds |
MaxCDWaitTime = 1000 ;200 ;10 секунд |
uglobal |
; Memory area for generating a packet command |
; Область памяти для формирования пакетной команды |
PacketCommand: |
rb 12 ;DB 12 DUP (?) |
; address of reading data sector |
; Адрес считываемого сектора данных |
CDSectorAddress: dd ? |
; Start time of the next disk operation |
; Время начала очередной операции с диском |
TickCounter_1 dd 0 |
; Time to start waiting for device readiness |
; Время начала ожидания готовности устройства |
WURStartTime dd 0 |
; pointer to buffer to read data into |
; указатель буфера для считывания |
CDDataBuf_pointer dd 0 |
endg |
;----------------------------------------------------------------------------- |
;**************************************************** |
;* SEND TO ATAPI DEVICE PACKET COMMAND, * |
;* THAT MEANS TRASMIT ONE DATA SECTOR OF SIZE * |
;* 2048 BYTE FROM DEVICE TO HOST * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* PacketCommand - 12-byte command packet; * |
;* CDBlockSize - size of receiving data block. * |
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ * |
;* РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале; * |
;* PacketCommand - 12-байтный командный пакет; * |
;* CDBlockSize - размер принимаемого блока данных. * |
; return eax DevErrorCode |
;**************************************************** |
SendPacketDatCommand: |
xor eax, eax |
; Set CHS mode |
; Задать режим CHS |
mov byte [ATAAddressMode], al |
; Send ATA command to send packet command |
; Послать ATA-команду передачи пакетной команды |
mov byte [ATAFeatures], al |
mov byte [ATASectorCount], al |
mov byte [ATASectorNumber], al |
; Load the size of the sending block |
; Загрузить размер передаваемого блока |
mov [ATAHead], al |
mov [ATACylinder], CDBlockSize |
mov [ATACommand], 0xA0 |
call SendCommandToHDD_1 |
test eax, eax |
jnz @@End_8 ; finish, saving the error code |
; Waiting for the drive to be ready to receive a packet command |
jnz @@End_8 ;закончить, сохранив код ошибки |
; Ожидание готовности дисковода к приему |
; пакетной команды |
mov dx, [ATABasePortAddr] |
add dx, 7 ; port 1x7h |
add dx, 7 ;порт 1х7h |
mov ecx, NoTickWaitTime |
;-------------------------------------- |
align 4 |
215,25 → 220,25 |
align 4 |
@@: |
call change_task |
; Check command execution time |
; Проверить время выполнения команды |
mov eax, [timer_ticks] |
sub eax, [TickCounter_1] |
cmp eax, BSYWaitTime |
ja @@Err1_1 ; time out error |
; Check readiness |
ja @@Err1_1 ;ошибка тайм-аута |
; Проверить готовность |
;-------------------------------------- |
align 4 |
.test: |
in al, dx |
test al, 0x80 ; BSY signal state |
test al, 0x80 ;состояние сигнала BSY |
jnz @@WaitDevice0 |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Err6 |
|
test al, 0x8 ; DRQ signal state |
test al, 0x8 ;состояние сигнала DRQ |
jz @@WaitDevice0 |
; Send a packet command |
; Послать пакетную команду |
cli |
mov dx, [ATABasePortAddr] |
mov ax, [PacketCommand] |
249,9 → 254,9 |
mov ax, [PacketCommand+10] |
out dx, ax |
sti |
; Waiting for data to be ready |
; Ожидание готовности данных |
mov dx, [ATABasePortAddr] |
add dx, 7 ; port 1x7h |
add dx, 7 ;порт 1х7h |
mov ecx, NoTickWaitTime |
;-------------------------------------- |
align 4 |
267,45 → 272,45 |
align 4 |
@@: |
call change_task |
; Check command execution time |
; Проверить время выполнения команды |
mov eax, [timer_ticks] |
sub eax, [TickCounter_1] |
cmp eax, MaxCDWaitTime |
ja @@Err1_1 ; time out error |
; Check readiness |
ja @@Err1_1 ;ошибка тайм-аута |
; Проверить готовность |
;-------------------------------------- |
align 4 |
.test_1: |
in al, dx |
test al, 0x80 ; BSY signal state |
test al, 0x80 ;состояние сигнала BSY |
jnz @@WaitDevice1 |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Err6_temp |
|
test al, 0x8 ; DRQ signal state |
test al, 0x8 ;состояние сигнала DRQ |
jz @@WaitDevice1 |
; Receive data block from controller |
; Принять блок данных от контроллера |
mov edi, [CDDataBuf_pointer] |
; Load controller's data register address |
; Загрузить адрес регистра данных контроллера |
mov dx, [ATABasePortAddr] |
; Load the block size in bytes into the counter |
; Загрузить в счетчик размер блока в байтах |
xor ecx, ecx |
mov cx, CDBlockSize |
; Calculate block size in 16-bit words |
shr cx, 1 ; divide block size by 2 |
; Receive data block |
; Вычислить размер блока в 16-разрядных словах |
shr cx, 1 ;разделить размер блока на 2 |
; Принять блок данных |
cli |
cld |
rep insw |
sti |
;-------------------------------------- |
; Successful completion of data receive |
; Успешное завершение приема данных |
@@End_8: |
xor eax, eax |
ret |
;-------------------------------------- |
; Write error code |
; Записать код ошибки |
@@Err1_1: |
xor eax, eax |
inc eax |
320,20 → 325,20 |
ret |
;----------------------------------------------------------------------------- |
;*********************************************** |
;* SEND TO ATAPI DEVICE PACKET COMMAND, * |
;* THAT DOESNT MEAN TRANSMIT DATA * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* PacketCommand - 12-byte command packet. * |
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ * |
;* Входные параметры передаются через * |
;* глобальные перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале; * |
;* PacketCommand - 12-байтный командный пакет. * |
;*********************************************** |
SendPacketNoDatCommand: |
pushad |
xor eax, eax |
; Set CHS mode |
; Задать режим CHS |
mov byte [ATAAddressMode], al |
; Send ATA command to send packet command |
; Послать ATA-команду передачи пакетной команды |
mov byte [ATAFeatures], al |
mov byte [ATASectorCount], al |
mov byte [ATASectorNumber], al |
342,30 → 347,31 |
mov [ATACommand], 0xA0 |
call SendCommandToHDD_1 |
test eax, eax |
jnz @@End_9 ; finish, saving the error code |
; Waiting for the drive to be ready to receive a packet command |
jnz @@End_9 ;закончить, сохранив код ошибки |
; Ожидание готовности дисковода к приему |
; пакетной команды |
mov dx, [ATABasePortAddr] |
add dx, 7 ; port 1x7h |
add dx, 7 ;порт 1х7h |
;-------------------------------------- |
align 4 |
@@WaitDevice0_1: |
call change_task |
; Check waiting time |
; Проверить время ожидания |
mov eax, [timer_ticks] |
sub eax, [TickCounter_1] |
cmp eax, BSYWaitTime |
ja @@Err1_3 ; time out error |
; Check readiness |
ja @@Err1_3 ;ошибка тайм-аута |
; Проверить готовность |
in al, dx |
test al, 0x80 ; BSY signal state |
test al, 0x80 ;состояние сигнала BSY |
jnz @@WaitDevice0_1 |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Err6_1 |
|
test al, 0x8 ; DRQ signal state |
test al, 0x8 ;состояние сигнала DRQ |
jz @@WaitDevice0_1 |
; Send packet command |
; Послать пакетную команду |
; cli |
mov dx, [ATABasePortAddr] |
mov ax, word [PacketCommand] |
383,27 → 389,27 |
; sti |
cmp [ignore_CD_eject_wait], 1 |
je @@clear_DEC |
; Waiting for confirmation of command receive |
; Ожидание подтверждения приема команды |
mov dx, [ATABasePortAddr] |
add dx, 7 ; port 1x7h |
add dx, 7 ;порт 1х7h |
;-------------------------------------- |
align 4 |
@@WaitDevice1_1: |
call change_task |
; Check command execution time |
; Проверить время выполнения команды |
mov eax, [timer_ticks] |
sub eax, [TickCounter_1] |
cmp eax, MaxCDWaitTime |
ja @@Err1_3 ; time out error |
; Wait for device release |
ja @@Err1_3 ;ошибка тайм-аута |
; Ожидать освобождения устройства |
in al, dx |
test al, 0x80 ; BSY signal state |
test al, 0x80 ;состояние сигнала BSY |
jnz @@WaitDevice1_1 |
|
test al, 1 ; ERR signal state |
test al, 1 ;состояние сигнала ERR |
jnz @@Err6_1 |
|
test al, 0x40 ; DRDY signal state |
test al, 0x40 ;состояние сигнала DRDY |
jz @@WaitDevice1_1 |
;-------------------------------------- |
@@clear_DEC: |
411,7 → 417,7 |
popad |
ret |
;-------------------------------------- |
; Write error code |
; Записать код ошибки |
@@Err1_3: |
xor eax, eax |
inc eax |
426,34 → 432,34 |
ret |
;----------------------------------------------------------------------------- |
;**************************************************** |
;* 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 будет * |
;* возвращен код ошибки в eax * |
;**************************************************** |
SendCommandToHDD_1: |
; Check the addressing mode code |
; Проверить значение кода режима |
cmp [ATAAddressMode], 1 |
ja @@Err2_4 |
; Check the channel number correctness |
; Проверить корректность номера канала |
movzx ebx, [ChannelNumber] |
dec ebx |
cmp ebx, 1 |
ja @@Err3_4 |
; Set the base address |
; Установить базовый адрес |
shl ebx, 2 |
mov eax, [cdpos] |
dec eax |
463,18 → 469,18 |
add eax, ebx |
mov ax, [eax+IDE_DATA.BAR0_val] |
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_4 |
|
shl al, 4 |
or al, 10100000b |
out dx, al |
; Waiting for disk ready |
; Ожидать, пока диск не будет готов |
inc dx |
mov eax, [timer_ticks] |
mov [TickCounter_1], eax |
493,43 → 499,43 |
align 4 |
@@: |
call change_task |
; Check waiting time |
; Проверить время ожидания |
mov eax, [timer_ticks] |
sub eax, [TickCounter_1] |
cmp eax, BSYWaitTime ;300 ; wait for 3 seconds |
ja @@Err1_4 ; time out error |
cmp eax, BSYWaitTime ;300 ;ожидать 3 сек. |
ja @@Err1_4 ;ошибка тайм-аута |
;-------------------------------------- |
align 4 |
.test: |
in al, dx ; Read the state register |
; Check the state of BSY signal |
in al, dx ; Прочитать регистр состояния |
; Проверить состояние сигнала BSY |
test al, 0x80 |
jnz @@WaitHDReady_2 |
; Check the state of DRQ signal |
; Проверить состояние сигнала DRQ |
test al, 0x8 |
jnz @@WaitHDReady_2 |
; 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_4 |
|
or al, [ATAHead] |
538,9 → 544,9 |
shl ah, 6 |
or al, ah |
out dx, al |
; Send command |
; Послать команду |
mov al, [ATACommand] |
inc dx ; command register |
inc dx ;регистр команд |
out dx, al |
sti |
;-------------------------------------- |
548,7 → 554,7 |
xor eax, eax |
ret |
;-------------------------------------- |
; Write error code |
; Записать код ошибки |
@@Err1_4: |
xor eax, eax |
inc eax |
571,27 → 577,27 |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* WAIT FOR THE DEVICE IS READY FOR WORK * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
WaitUnitReady: |
pusha |
; Remember the peration start time |
; Запомнить время начала операции |
mov eax, [timer_ticks] |
mov [WURStartTime], eax |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Generate TEST UNIT READY command |
; Сформировать команду TEST UNIT READY |
mov [PacketCommand], word 0 |
; waiting loop for device readiness |
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА |
mov ecx, NoTickWaitTime |
;-------------------------------------- |
align 4 |
@@SendCommand: |
; Send readiness check command |
; Подать команду проверки готовности |
call SendPacketNoDatCommand |
cmp [timer_ticks_enable], 0 |
jne @f |
607,10 → 613,10 |
align 4 |
@@: |
call change_task |
; Check the error code |
; Проверить код ошибки |
cmp [DevErrorCode], 0 |
je @@End_11 |
; Check waiting time |
; Проверить время ожидания готовности |
mov eax, [timer_ticks] |
sub eax, [WURStartTime] |
cmp eax, MaxCDWaitTime |
617,7 → 623,7 |
jb @@SendCommand |
;-------------------------------------- |
.Error: |
; time out error |
; Ошибка тайм-аута |
mov [DevErrorCode], 1 |
;-------------------------------------- |
@@End_11: |
625,21 → 631,21 |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* FORBID DISK CHANGE * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* ЗАПРЕТИТЬ СМЕНУ ДИСКА * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
prevent_medium_removal: |
pusha |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Set command code |
; Задать код команды |
mov [PacketCommand], byte 0x1E |
; Set "Forbid" code |
; Задать код запрета |
mov [PacketCommand+4], byte 11b |
; Send command |
; Подать команду |
call SendPacketNoDatCommand |
mov eax, ATAPI_IDE0_lock |
add eax, [cdpos] |
649,21 → 655,21 |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* ALLOW DISK CHANGE * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* РАЗРЕШИТЬ СМЕНУ ДИСКА * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
allow_medium_removal: |
pusha |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Set command code |
; Задать код команды |
mov [PacketCommand], byte 0x1E |
; unset "Forbid" code |
; Задать код запрета |
mov [PacketCommand+4], byte 0 |
; Send command |
; Подать команду |
call SendPacketNoDatCommand |
mov eax, ATAPI_IDE0_lock |
add eax, [cdpos] |
673,54 → 679,54 |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* LOAD DISK TO THE DRIVE * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
LoadMedium: |
pusha |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Generate START/STOP UNIT command |
; Set command code |
; Сформировать команду START/STOP UNIT |
; Задать код команды |
mov [PacketCommand], word 0x1B |
; Set disk loading operation |
; Задать операцию загрузки носителя |
mov [PacketCommand+4], word 00000011b |
; Send command |
; Подать команду |
call SendPacketNoDatCommand |
popa |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* REMOVE THE DISK FROM THE DRIVE * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА * |
;* Входные параметры передаются через глобальные * |
;* перменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
EjectMedium: |
pusha |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Generate START/STOP UNIT command |
; Set command code |
; Сформировать команду START/STOP UNIT |
; Задать код команды |
mov [PacketCommand], word 0x1B |
; Set the operation to eject disk |
; Задать операцию извлечения носителя |
mov [PacketCommand+4], word 00000010b |
; Send command |
; Подать команду |
call SendPacketNoDatCommand |
popa |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
;* Check the event of pressing the eject button * |
;* * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel. * |
;* Проверить событие нажатия кнопки извлечения * |
;* диска * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
proc check_ATAPI_device_event_has_work? |
mov eax, [timer_ticks] |
1140,77 → 1146,78 |
endg |
;----------------------------------------------------------------------------- |
;************************************************* |
;* Get an event or device status message * |
;* * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel * |
;* Получить сообщение о событии или состоянии * |
;* устройства * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
GetEvent_StatusNotification: |
pusha |
mov [CDDataBuf_pointer], CDDataBuf |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Set command code |
; Задать код команды |
mov [PacketCommand], byte 4Ah |
mov [PacketCommand+1], byte 00000001b |
; Set message class request |
; Задать запрос класса сообщений |
mov [PacketCommand+4], byte 00010000b |
; Size of allocated area |
; Размер выделенной области |
mov [PacketCommand+7], byte 8h |
mov [PacketCommand+8], byte 0h |
; Send command |
; Подать команду |
call SendPacketDatCommand |
popa |
ret |
;----------------------------------------------------------------------------- |
;************************************************* |
; Read information from TOC (Table of contents) * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel * |
; прочитать информацию из TOC |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
Read_TOC: |
pusha |
mov [CDDataBuf_pointer], CDDataBuf |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
call clear_packet_buffer |
; Generate a packet command to read a data sector |
; Сформировать пакетную команду для считывания |
; сектора данных |
mov [PacketCommand], byte 0x43 |
; Set format |
; Задать формат |
mov [PacketCommand+2], byte 1 |
; Size of allocated area |
; Размер выделенной области |
mov [PacketCommand+7], byte 0xFF |
mov [PacketCommand+8], byte 0h |
; Send a command |
; Подать команду |
call SendPacketDatCommand |
popa |
ret |
;----------------------------------------------------------------------------- |
;***************************************************** |
;* DETERMINE THE TOTAL NUMBER OF SECTORS ON THE DISK * |
;* Input parameters are passed through global * |
;* variables: * |
;* ChannelNumber - channel number; * |
;* DiskNumber - disk number on channel * |
;***************************************************** |
;************************************************* |
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ * |
;* Входные параметры передаются через глобальные * |
;* переменные: * |
;* ChannelNumber - номер канала; * |
;* DiskNumber - номер диска на канале. * |
;************************************************* |
;ReadCapacity: |
; pusha |
;; Clear the packet command buffer |
;; Очистить буфер пакетной команды |
; call clear_packet_buffer |
;; Set the buffer size in bytes |
;; Задать размер буфера в байтах |
; mov [CDBlockSize],8 |
;; Generate READ CAPACITY command |
;; Сформировать команду READ CAPACITY |
; mov [PacketCommand],word 25h |
;; Send command |
;; Подать команду |
; call SendPacketDatCommand |
; popa |
; ret |
;----------------------------------------------------------------------------- |
clear_packet_buffer: |
; Clear the packet command buffer |
; Очистить буфер пакетной команды |
and [PacketCommand], dword 0 |
and [PacketCommand+4], dword 0 |
and [PacketCommand+8], dword 0 |