Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8054 → Rev 8053

/kernel/trunk/blkdev/cd_drv.inc
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