forked from KolibriOS/kolibrios
recode all kernel sources to UTF-8; binary still uses single-byte encoding and isn't changed at all
git-svn-id: svn://kolibrios.org@3539 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
+246
-246
@@ -9,21 +9,21 @@ $Revision$
|
||||
|
||||
|
||||
;**********************************************************
|
||||
; Непосредственная работа с устройством СD (ATAPI)
|
||||
; Непосредственная работа с устройством СD (ATAPI)
|
||||
;**********************************************************
|
||||
; Автор части исходного текста Кулаков Владимир Геннадьевич
|
||||
; Адаптация, доработка и разработка Mario79,<Lrz>
|
||||
; Автор части исходного текста Кулаков Владимир Геннадьевич
|
||||
; Адаптация, доработка и разработка Mario79,<Lrz>
|
||||
|
||||
; Максимальное количество повторений операции чтения
|
||||
; Максимальное количество повторений операции чтения
|
||||
MaxRetr equ 10
|
||||
; Предельное время ожидания готовности к приему команды
|
||||
; (в тиках)
|
||||
; Предельное время ожидания готовности к приему команды
|
||||
; (в тиках)
|
||||
BSYWaitTime equ 1000 ;2
|
||||
NoTickWaitTime equ 0xfffff
|
||||
CDBlockSize equ 2048
|
||||
;********************************************
|
||||
;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ *
|
||||
;* Многократное повторение чтения при сбоях *
|
||||
;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ *
|
||||
;* Многократное повторение чтения при сбоях *
|
||||
;********************************************
|
||||
ReadCDWRetr:
|
||||
;-----------------------------------------------------------
|
||||
@@ -85,34 +85,34 @@ ReadCDWRetr:
|
||||
ReadCDWRetr_1:
|
||||
pushad
|
||||
|
||||
; Цикл, пока команда не выполнена успешно или не
|
||||
; исчерпано количество попыток
|
||||
; Цикл, пока команда не выполнена успешно или не
|
||||
; исчерпано количество попыток
|
||||
mov ECX, MaxRetr
|
||||
@@NextRetr:
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
;*************************************************
|
||||
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА *
|
||||
;* Считываются данные пользователя, информация *
|
||||
;* субканала и контрольная информация *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* CDSectorAddress - адрес считываемого сектора. *
|
||||
;* Данные считывается в массив CDDataBuf. *
|
||||
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА *
|
||||
;* Считываются данные пользователя, информация *
|
||||
;* субканала и контрольная информация *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* CDSectorAddress - адрес считываемого сектора. *
|
||||
;* Данные считывается в массив CDDataBuf. *
|
||||
;*************************************************
|
||||
;ReadCD:
|
||||
push ecx
|
||||
; pusha
|
||||
; Задать размер сектора
|
||||
; Задать размер сектора
|
||||
; mov [CDBlockSize],2048 ;2352
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Сформировать пакетную команду для считывания
|
||||
; сектора данных
|
||||
; Задать код команды Read CD
|
||||
; Сформировать пакетную команду для считывания
|
||||
; сектора данных
|
||||
; Задать код команды Read CD
|
||||
mov [PacketCommand], byte 0x28;0xBE
|
||||
; Задать адрес сектора
|
||||
; Задать адрес сектора
|
||||
mov AX, word [CDSectorAddress+2]
|
||||
xchg AL, AH
|
||||
mov word [PacketCommand+2], AX
|
||||
@@ -121,11 +121,11 @@ ReadCDWRetr_1:
|
||||
mov word [PacketCommand+4], AX
|
||||
; mov eax,[CDSectorAddress]
|
||||
; mov [PacketCommand+2],eax
|
||||
; Задать количество считываемых секторов
|
||||
; Задать количество считываемых секторов
|
||||
mov [PacketCommand+8], byte 1
|
||||
; Задать считывание данных в полном объеме
|
||||
; Задать считывание данных в полном объеме
|
||||
; mov [PacketCommand+9],byte 0xF8
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketDatCommand
|
||||
pop ecx
|
||||
; ret
|
||||
@@ -147,7 +147,7 @@ ReadCDWRetr_1:
|
||||
jz @@NextRetr
|
||||
jmp .wait
|
||||
@@:
|
||||
; Задержка на 2,5 секунды
|
||||
; Задержка на 2,5 секунды
|
||||
; mov EAX,[timer_ticks]
|
||||
; add EAX,50 ;250
|
||||
;@@Wait:
|
||||
@@ -161,66 +161,66 @@ ReadCDWRetr_1:
|
||||
ret
|
||||
|
||||
|
||||
; Универсальные процедуры, обеспечивающие выполнение
|
||||
; пакетных команд в режиме PIO
|
||||
; Универсальные процедуры, обеспечивающие выполнение
|
||||
; пакетных команд в режиме PIO
|
||||
|
||||
; Максимально допустимое время ожидания реакции
|
||||
; устройства на пакетную команду (в тиках)
|
||||
; Максимально допустимое время ожидания реакции
|
||||
; устройства на пакетную команду (в тиках)
|
||||
|
||||
MaxCDWaitTime equ 1000 ;200 ;10 секунд
|
||||
MaxCDWaitTime equ 1000 ;200 ;10 секунд
|
||||
uglobal
|
||||
; Область памяти для формирования пакетной команды
|
||||
; Область памяти для формирования пакетной команды
|
||||
PacketCommand:
|
||||
rb 12 ;DB 12 DUP (?)
|
||||
; Область памяти для приема данных от дисковода
|
||||
; Область памяти для приема данных от дисковода
|
||||
;CDDataBuf DB 4096 DUP (0)
|
||||
; Размер принимаемого блока данных в байтах
|
||||
; Размер принимаемого блока данных в байтах
|
||||
;CDBlockSize DW ?
|
||||
; Адрес считываемого сектора данных
|
||||
; Адрес считываемого сектора данных
|
||||
CDSectorAddress:
|
||||
DD ?
|
||||
; Время начала очередной операции с диском
|
||||
; Время начала очередной операции с диском
|
||||
TickCounter_1 DD 0
|
||||
; Время начала ожидания готовности устройства
|
||||
; Время начала ожидания готовности устройства
|
||||
WURStartTime DD 0
|
||||
; указатель буфера для считывания
|
||||
; указатель буфера для считывания
|
||||
CDDataBuf_pointer dd 0
|
||||
endg
|
||||
;****************************************************
|
||||
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
|
||||
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
|
||||
;* РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* PacketCommand - 12-байтный командный пакет; *
|
||||
;* CDBlockSize - размер принимаемого блока данных. *
|
||||
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
|
||||
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
|
||||
;* РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* PacketCommand - 12-байтный командный пакет; *
|
||||
;* CDBlockSize - размер принимаемого блока данных. *
|
||||
; return eax DevErrorCode
|
||||
;****************************************************
|
||||
SendPacketDatCommand:
|
||||
xor eax, eax
|
||||
; mov byte [DevErrorCode],al
|
||||
; Задать режим CHS
|
||||
; Задать режим CHS
|
||||
mov byte [ATAAddressMode], al
|
||||
; Послать ATA-команду передачи пакетной команды
|
||||
; Послать ATA-команду передачи пакетной команды
|
||||
mov byte [ATAFeatures], al
|
||||
mov byte [ATASectorCount], al
|
||||
mov byte [ATASectorNumber], al
|
||||
; Загрузить размер передаваемого блока
|
||||
; Загрузить размер передаваемого блока
|
||||
mov [ATAHead], al
|
||||
; mov AX,[CDBlockSize]
|
||||
mov [ATACylinder], CDBlockSize
|
||||
mov [ATACommand], 0A0h
|
||||
call SendCommandToHDD_1
|
||||
test eax, eax
|
||||
; cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
jnz @@End_8 ;закончить, сохранив код ошибки
|
||||
; cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
jnz @@End_8 ;закончить, сохранив код ошибки
|
||||
|
||||
; Ожидание готовности дисковода к приему
|
||||
; пакетной команды
|
||||
; Ожидание готовности дисковода к приему
|
||||
; пакетной команды
|
||||
mov DX, [ATABasePortAddr]
|
||||
add DX, 7 ;порт 1х7h
|
||||
add DX, 7 ;порт 1х7h
|
||||
mov ecx, NoTickWaitTime
|
||||
@@WaitDevice0:
|
||||
cmp [timer_ticks_enable], 0
|
||||
@@ -231,21 +231,21 @@ SendPacketDatCommand:
|
||||
jmp .test
|
||||
@@:
|
||||
call change_task
|
||||
; Проверить время выполнения команды
|
||||
; Проверить время выполнения команды
|
||||
mov EAX, [timer_ticks]
|
||||
sub EAX, [TickCounter_1]
|
||||
cmp EAX, BSYWaitTime
|
||||
ja @@Err1_1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
ja @@Err1_1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
.test:
|
||||
in AL, DX
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
jnz @@WaitDevice0
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
jnz @@Err6
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
jz @@WaitDevice0
|
||||
; Послать пакетную команду
|
||||
; Послать пакетную команду
|
||||
cli
|
||||
mov DX, [ATABasePortAddr]
|
||||
mov AX, [PacketCommand]
|
||||
@@ -261,9 +261,9 @@ SendPacketDatCommand:
|
||||
mov AX, [PacketCommand+10]
|
||||
out DX, AX
|
||||
sti
|
||||
; Ожидание готовности данных
|
||||
; Ожидание готовности данных
|
||||
mov DX, [ATABasePortAddr]
|
||||
add DX, 7 ;порт 1х7h
|
||||
add DX, 7 ;порт 1х7h
|
||||
mov ecx, NoTickWaitTime
|
||||
@@WaitDevice1:
|
||||
cmp [timer_ticks_enable], 0
|
||||
@@ -274,40 +274,40 @@ SendPacketDatCommand:
|
||||
jmp .test_1
|
||||
@@:
|
||||
call change_task
|
||||
; Проверить время выполнения команды
|
||||
; Проверить время выполнения команды
|
||||
mov EAX, [timer_ticks]
|
||||
sub EAX, [TickCounter_1]
|
||||
cmp EAX, MaxCDWaitTime
|
||||
ja @@Err1_1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
ja @@Err1_1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
.test_1:
|
||||
in AL, DX
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
jnz @@WaitDevice1
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
jnz @@Err6_temp
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
jz @@WaitDevice1
|
||||
; Принять блок данных от контроллера
|
||||
; Принять блок данных от контроллера
|
||||
mov EDI, [CDDataBuf_pointer];0x7000 ;CDDataBuf
|
||||
; Загрузить адрес регистра данных контроллера
|
||||
mov DX, [ATABasePortAddr];порт 1x0h
|
||||
; Загрузить в счетчик размер блока в байтах
|
||||
; Загрузить адрес регистра данных контроллера
|
||||
mov DX, [ATABasePortAddr];порт 1x0h
|
||||
; Загрузить в счетчик размер блока в байтах
|
||||
xor ecx, ecx
|
||||
mov CX, CDBlockSize
|
||||
; Вычислить размер блока в 16-разрядных словах
|
||||
shr CX, 1;разделить размер блока на 2
|
||||
; Принять блок данных
|
||||
; Вычислить размер блока в 16-разрядных словах
|
||||
shr CX, 1;разделить размер блока на 2
|
||||
; Принять блок данных
|
||||
cli
|
||||
cld
|
||||
rep insw
|
||||
sti
|
||||
; Успешное завершение приема данных
|
||||
; Успешное завершение приема данных
|
||||
@@End_8:
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
; Записать код ошибки
|
||||
; Записать код ошибки
|
||||
@@Err1_1:
|
||||
xor eax, eax
|
||||
inc eax
|
||||
@@ -329,21 +329,21 @@ SendPacketDatCommand:
|
||||
|
||||
|
||||
;***********************************************
|
||||
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
|
||||
;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ *
|
||||
;* Входные параметры передаются через *
|
||||
;* глобальные перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* PacketCommand - 12-байтный командный пакет. *
|
||||
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
|
||||
;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ *
|
||||
;* Входные параметры передаются через *
|
||||
;* глобальные перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале; *
|
||||
;* PacketCommand - 12-байтный командный пакет. *
|
||||
;***********************************************
|
||||
SendPacketNoDatCommand:
|
||||
pushad
|
||||
xor eax, eax
|
||||
; mov byte [DevErrorCode],al
|
||||
; Задать режим CHS
|
||||
; Задать режим CHS
|
||||
mov byte [ATAAddressMode], al
|
||||
; Послать ATA-команду передачи пакетной команды
|
||||
; Послать ATA-команду передачи пакетной команды
|
||||
mov byte [ATAFeatures], al
|
||||
mov byte [ATASectorCount], al
|
||||
mov byte [ATASectorNumber], al
|
||||
@@ -351,29 +351,29 @@ SendPacketNoDatCommand:
|
||||
mov byte [ATAHead], al
|
||||
mov [ATACommand], 0A0h
|
||||
call SendCommandToHDD_1
|
||||
; cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
; cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
test eax, eax
|
||||
jnz @@End_9 ;закончить, сохранив код ошибки
|
||||
; Ожидание готовности дисковода к приему
|
||||
; пакетной команды
|
||||
jnz @@End_9 ;закончить, сохранив код ошибки
|
||||
; Ожидание готовности дисковода к приему
|
||||
; пакетной команды
|
||||
mov DX, [ATABasePortAddr]
|
||||
add DX, 7 ;порт 1х7h
|
||||
add DX, 7 ;порт 1х7h
|
||||
@@WaitDevice0_1:
|
||||
call change_task
|
||||
; Проверить время ожидания
|
||||
; Проверить время ожидания
|
||||
mov EAX, [timer_ticks]
|
||||
sub EAX, [TickCounter_1]
|
||||
cmp EAX, BSYWaitTime
|
||||
ja @@Err1_3 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
ja @@Err1_3 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
in AL, DX
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
jnz @@WaitDevice0_1
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
jnz @@Err6_1
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
test AL, 08h ;состояние сигнала DRQ
|
||||
jz @@WaitDevice0_1
|
||||
; Послать пакетную команду
|
||||
; Послать пакетную команду
|
||||
; cli
|
||||
mov DX, [ATABasePortAddr]
|
||||
mov AX, word [PacketCommand]
|
||||
@@ -391,29 +391,29 @@ SendPacketNoDatCommand:
|
||||
; sti
|
||||
cmp [ignore_CD_eject_wait], 1
|
||||
je @@clear_DEC
|
||||
; Ожидание подтверждения приема команды
|
||||
; Ожидание подтверждения приема команды
|
||||
mov DX, [ATABasePortAddr]
|
||||
add DX, 7 ;порт 1х7h
|
||||
add DX, 7 ;порт 1х7h
|
||||
@@WaitDevice1_1:
|
||||
call change_task
|
||||
; Проверить время выполнения команды
|
||||
; Проверить время выполнения команды
|
||||
mov EAX, [timer_ticks]
|
||||
sub EAX, [TickCounter_1]
|
||||
cmp EAX, MaxCDWaitTime
|
||||
ja @@Err1_3 ;ошибка тайм-аута
|
||||
; Ожидать освобождения устройства
|
||||
ja @@Err1_3 ;ошибка тайм-аута
|
||||
; Ожидать освобождения устройства
|
||||
in AL, DX
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
test AL, 80h ;состояние сигнала BSY
|
||||
jnz @@WaitDevice1_1
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
test AL, 1 ;состояние сигнала ERR
|
||||
jnz @@Err6_1
|
||||
test AL, 40h ;состояние сигнала DRDY
|
||||
test AL, 40h ;состояние сигнала DRDY
|
||||
jz @@WaitDevice1_1
|
||||
@@clear_DEC:
|
||||
and [DevErrorCode], 0
|
||||
popad
|
||||
ret
|
||||
; Записать код ошибки
|
||||
; Записать код ошибки
|
||||
@@Err1_3:
|
||||
xor eax, eax
|
||||
inc eax
|
||||
@@ -426,53 +426,53 @@ SendPacketNoDatCommand:
|
||||
ret
|
||||
|
||||
;****************************************************
|
||||
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала (1 или 2); *
|
||||
;* DiskNumber - номер диска (0 или 1); *
|
||||
;* ATAFeatures - "особенности"; *
|
||||
;* ATASectorCount - количество секторов; *
|
||||
;* ATASectorNumber - номер начального сектора; *
|
||||
;* ATACylinder - номер начального цилиндра; *
|
||||
;* ATAHead - номер начальной головки; *
|
||||
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
|
||||
;* ATACommand - код команды. *
|
||||
;* После успешного выполнения функции: *
|
||||
;* в ATABasePortAddr - базовый адрес HDD; *
|
||||
;* в DevErrorCode - ноль. *
|
||||
;* При возникновении ошибки в DevErrorCode будет *
|
||||
;* возвращен код ошибки в eax *
|
||||
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала (1 или 2); *
|
||||
;* DiskNumber - номер диска (0 или 1); *
|
||||
;* ATAFeatures - "особенности"; *
|
||||
;* ATASectorCount - количество секторов; *
|
||||
;* ATASectorNumber - номер начального сектора; *
|
||||
;* ATACylinder - номер начального цилиндра; *
|
||||
;* ATAHead - номер начальной головки; *
|
||||
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
|
||||
;* ATACommand - код команды. *
|
||||
;* После успешного выполнения функции: *
|
||||
;* в ATABasePortAddr - базовый адрес HDD; *
|
||||
;* в DevErrorCode - ноль. *
|
||||
;* При возникновении ошибки в DevErrorCode будет *
|
||||
;* возвращен код ошибки в eax *
|
||||
;****************************************************
|
||||
SendCommandToHDD_1:
|
||||
; pushad
|
||||
; mov [DevErrorCode],0 not need
|
||||
; Проверить значение кода режима
|
||||
; Проверить значение кода режима
|
||||
cmp [ATAAddressMode], 1
|
||||
ja @@Err2_4
|
||||
; Проверить корректность номера канала
|
||||
; Проверить корректность номера канала
|
||||
mov BX, [ChannelNumber]
|
||||
cmp BX, 1
|
||||
jb @@Err3_4
|
||||
cmp BX, 2
|
||||
ja @@Err3_4
|
||||
; Установить базовый адрес
|
||||
; Установить базовый адрес
|
||||
dec BX
|
||||
shl BX, 1
|
||||
movzx ebx, bx
|
||||
mov AX, [ebx+StandardATABases]
|
||||
mov [ATABasePortAddr], AX
|
||||
; Ожидание готовности HDD к приему команды
|
||||
; Выбрать нужный диск
|
||||
; Ожидание готовности HDD к приему команды
|
||||
; Выбрать нужный диск
|
||||
mov DX, [ATABasePortAddr]
|
||||
add DX, 6 ;адрес регистра головок
|
||||
add DX, 6 ;адрес регистра головок
|
||||
mov AL, [DiskNumber]
|
||||
cmp AL, 1 ;проверить номера диска
|
||||
cmp AL, 1 ;проверить номера диска
|
||||
ja @@Err4_4
|
||||
shl AL, 4
|
||||
or AL, 10100000b
|
||||
out DX, AL
|
||||
; Ожидать, пока диск не будет готов
|
||||
; Ожидать, пока диск не будет готов
|
||||
inc DX
|
||||
mov eax, [timer_ticks]
|
||||
mov [TickCounter_1], eax
|
||||
@@ -486,43 +486,43 @@ SendCommandToHDD_1:
|
||||
jmp .test
|
||||
@@:
|
||||
call change_task
|
||||
; Проверить время ожидания
|
||||
; Проверить время ожидания
|
||||
mov eax, [timer_ticks]
|
||||
sub eax, [TickCounter_1]
|
||||
cmp eax, BSYWaitTime;300 ;ожидать 3 сек.
|
||||
ja @@Err1_4 ;ошибка тайм-аута
|
||||
; Прочитать регистр состояния
|
||||
cmp eax, BSYWaitTime;300 ;ожидать 3 сек.
|
||||
ja @@Err1_4 ;ошибка тайм-аута
|
||||
; Прочитать регистр состояния
|
||||
.test:
|
||||
in AL, DX
|
||||
; Проверить состояние сигнала BSY
|
||||
; Проверить состояние сигнала BSY
|
||||
test AL, 80h
|
||||
jnz @@WaitHDReady_2
|
||||
; Проверить состояние сигнала DRQ
|
||||
; Проверить состояние сигнала DRQ
|
||||
test AL, 08h
|
||||
jnz @@WaitHDReady_2
|
||||
|
||||
; Загрузить команду в регистры контроллера
|
||||
; Загрузить команду в регистры контроллера
|
||||
cli
|
||||
mov DX, [ATABasePortAddr]
|
||||
inc DX ;регистр "особенностей"
|
||||
inc DX ;регистр "особенностей"
|
||||
mov AL, [ATAFeatures]
|
||||
out DX, AL
|
||||
inc DX ;счетчик секторов
|
||||
inc DX ;счетчик секторов
|
||||
mov AL, [ATASectorCount]
|
||||
out DX, AL
|
||||
inc DX ;регистр номера сектора
|
||||
inc DX ;регистр номера сектора
|
||||
mov AL, [ATASectorNumber]
|
||||
out DX, AL
|
||||
inc DX ;номер цилиндра (младший байт)
|
||||
inc DX ;номер цилиндра (младший байт)
|
||||
mov AX, [ATACylinder]
|
||||
out DX, AL
|
||||
inc DX ;номер цилиндра (старший байт)
|
||||
inc DX ;номер цилиндра (старший байт)
|
||||
mov AL, AH
|
||||
out DX, AL
|
||||
inc DX ;номер головки/номер диска
|
||||
inc DX ;номер головки/номер диска
|
||||
mov AL, [DiskNumber]
|
||||
shl AL, 4
|
||||
cmp [ATAHead], 0Fh;проверить номер головки
|
||||
cmp [ATAHead], 0Fh;проверить номер головки
|
||||
ja @@Err5_4
|
||||
or AL, [ATAHead]
|
||||
or AL, 10100000b
|
||||
@@ -530,17 +530,17 @@ SendCommandToHDD_1:
|
||||
shl AH, 6
|
||||
or AL, AH
|
||||
out DX, AL
|
||||
; Послать команду
|
||||
; Послать команду
|
||||
mov AL, [ATACommand]
|
||||
inc DX ;регистр команд
|
||||
inc DX ;регистр команд
|
||||
out DX, AL
|
||||
sti
|
||||
; Сбросить признак ошибки
|
||||
; Сбросить признак ошибки
|
||||
; mov [DevErrorCode],0
|
||||
@@End_10:
|
||||
xor eax, eax
|
||||
ret
|
||||
; Записать код ошибки
|
||||
; Записать код ошибки
|
||||
@@Err1_4:
|
||||
xor eax, eax
|
||||
inc eax
|
||||
@@ -561,31 +561,31 @@ SendCommandToHDD_1:
|
||||
@@Err5_4:
|
||||
mov eax, 5
|
||||
; mov [DevErrorCode],5
|
||||
; Завершение работы программы
|
||||
; Завершение работы программы
|
||||
ret
|
||||
; sti
|
||||
; popad
|
||||
|
||||
;*************************************************
|
||||
;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
WaitUnitReady:
|
||||
pusha
|
||||
; Запомнить время начала операции
|
||||
; Запомнить время начала операции
|
||||
mov EAX, [timer_ticks]
|
||||
mov [WURStartTime], EAX
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Сформировать команду TEST UNIT READY
|
||||
; Сформировать команду TEST UNIT READY
|
||||
mov [PacketCommand], word 00h
|
||||
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
|
||||
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
|
||||
mov ecx, NoTickWaitTime
|
||||
@@SendCommand:
|
||||
; Подать команду проверки готовности
|
||||
; Подать команду проверки готовности
|
||||
call SendPacketNoDatCommand
|
||||
cmp [timer_ticks_enable], 0
|
||||
jne @f
|
||||
@@ -597,37 +597,37 @@ WaitUnitReady:
|
||||
jmp @@SendCommand
|
||||
@@:
|
||||
call change_task
|
||||
; Проверить код ошибки
|
||||
; Проверить код ошибки
|
||||
cmp [DevErrorCode], 0
|
||||
je @@End_11
|
||||
; Проверить время ожидания готовности
|
||||
; Проверить время ожидания готовности
|
||||
mov EAX, [timer_ticks]
|
||||
sub EAX, [WURStartTime]
|
||||
cmp EAX, MaxCDWaitTime
|
||||
jb @@SendCommand
|
||||
.Error:
|
||||
; Ошибка тайм-аута
|
||||
; Ошибка тайм-аута
|
||||
mov [DevErrorCode], 1
|
||||
@@End_11:
|
||||
popa
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* ЗАПРЕТИТЬ СМЕНУ ДИСКА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* ЗАПРЕТИТЬ СМЕНУ ДИСКА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
prevent_medium_removal:
|
||||
pusha
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Задать код команды
|
||||
; Задать код команды
|
||||
mov [PacketCommand], byte 0x1E
|
||||
; Задать код запрета
|
||||
; Задать код запрета
|
||||
mov [PacketCommand+4], byte 11b
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketNoDatCommand
|
||||
mov eax, ATAPI_IDE0_lock
|
||||
add eax, [cdpos]
|
||||
@@ -637,21 +637,21 @@ prevent_medium_removal:
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* РАЗРЕШИТЬ СМЕНУ ДИСКА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* РАЗРЕШИТЬ СМЕНУ ДИСКА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
allow_medium_removal:
|
||||
pusha
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Задать код команды
|
||||
; Задать код команды
|
||||
mov [PacketCommand], byte 0x1E
|
||||
; Задать код запрета
|
||||
; Задать код запрета
|
||||
mov [PacketCommand+4], byte 00b
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketNoDatCommand
|
||||
mov eax, ATAPI_IDE0_lock
|
||||
add eax, [cdpos]
|
||||
@@ -661,54 +661,54 @@ allow_medium_removal:
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
LoadMedium:
|
||||
pusha
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Сформировать команду START/STOP UNIT
|
||||
; Задать код команды
|
||||
; Сформировать команду START/STOP UNIT
|
||||
; Задать код команды
|
||||
mov [PacketCommand], word 1Bh
|
||||
; Задать операцию загрузки носителя
|
||||
; Задать операцию загрузки носителя
|
||||
mov [PacketCommand+4], word 00000011b
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketNoDatCommand
|
||||
popa
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
EjectMedium:
|
||||
pusha
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Сформировать команду START/STOP UNIT
|
||||
; Задать код команды
|
||||
; Сформировать команду START/STOP UNIT
|
||||
; Задать код команды
|
||||
mov [PacketCommand], word 1Bh
|
||||
; Задать операцию извлечения носителя
|
||||
; Задать операцию извлечения носителя
|
||||
mov [PacketCommand+4], word 00000010b
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketNoDatCommand
|
||||
popa
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* Проверить событие нажатия кнопки извлечения *
|
||||
;* диска *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* Проверить событие нажатия кнопки извлечения *
|
||||
;* диска *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
proc check_ATAPI_device_event_has_work?
|
||||
mov eax, [timer_ticks]
|
||||
@@ -867,78 +867,78 @@ ATAPI_IDE3_lock db 0
|
||||
ignore_CD_eject_wait db 0
|
||||
endg
|
||||
;*************************************************
|
||||
;* Получить сообщение о событии или состоянии *
|
||||
;* устройства *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* Получить сообщение о событии или состоянии *
|
||||
;* устройства *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
GetEvent_StatusNotification:
|
||||
pusha
|
||||
mov [CDDataBuf_pointer], CDDataBuf
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Задать код команды
|
||||
; Задать код команды
|
||||
mov [PacketCommand], byte 4Ah
|
||||
mov [PacketCommand+1], byte 00000001b
|
||||
; Задать запрос класса сообщений
|
||||
; Задать запрос класса сообщений
|
||||
mov [PacketCommand+4], byte 00010000b
|
||||
; Размер выделенной области
|
||||
; Размер выделенной области
|
||||
mov [PacketCommand+7], byte 8h
|
||||
mov [PacketCommand+8], byte 0h
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketDatCommand
|
||||
popa
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
; прочитать информацию из TOC
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
; прочитать информацию из TOC
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
Read_TOC:
|
||||
pusha
|
||||
mov [CDDataBuf_pointer], CDDataBuf
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
call clear_packet_buffer
|
||||
; Сформировать пакетную команду для считывания
|
||||
; сектора данных
|
||||
; Сформировать пакетную команду для считывания
|
||||
; сектора данных
|
||||
mov [PacketCommand], byte 0x43
|
||||
; Задать формат
|
||||
; Задать формат
|
||||
mov [PacketCommand+2], byte 1
|
||||
; Размер выделенной области
|
||||
; Размер выделенной области
|
||||
mov [PacketCommand+7], byte 0xFF
|
||||
mov [PacketCommand+8], byte 0h
|
||||
; Подать команду
|
||||
; Подать команду
|
||||
call SendPacketDatCommand
|
||||
popa
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;*************************************************
|
||||
;ReadCapacity:
|
||||
; pusha
|
||||
;; Очистить буфер пакетной команды
|
||||
;; Очистить буфер пакетной команды
|
||||
; call clear_packet_buffer
|
||||
;; Задать размер буфера в байтах
|
||||
;; Задать размер буфера в байтах
|
||||
; mov [CDBlockSize],8
|
||||
;; Сформировать команду READ CAPACITY
|
||||
;; Сформировать команду READ CAPACITY
|
||||
; mov [PacketCommand],word 25h
|
||||
;; Подать команду
|
||||
;; Подать команду
|
||||
; call SendPacketDatCommand
|
||||
; popa
|
||||
; ret
|
||||
|
||||
clear_packet_buffer:
|
||||
; Очистить буфер пакетной команды
|
||||
; Очистить буфер пакетной команды
|
||||
and [PacketCommand], dword 0
|
||||
and [PacketCommand+4], dword 0
|
||||
and [PacketCommand+8], dword 0
|
||||
|
||||
@@ -397,7 +397,7 @@ saved_esi_pos = 16+12 ; size of local variables + size of registers before esi
|
||||
mov dword [esi+8], 1 ; same as in hd
|
||||
mov eax, [esi]
|
||||
mov edx, [esi+4] ; edx:eax = sector to write
|
||||
; Îáúåäèíÿåì çàïèñü öåïî÷êè ïîñëåäîâàòåëüíûõ ñåêòîðîâ â îäíî îáðàùåíèå ê äèñêó
|
||||
; Объединяем запись цепочки последовательных секторов в одно обращение к диску
|
||||
cmp ecx, 1
|
||||
jz .nonext
|
||||
cmp dword [esi+12+8], 2
|
||||
|
||||
@@ -37,9 +37,9 @@ save_image:
|
||||
call check_label
|
||||
cmp [FDC_Status], 0
|
||||
jne unnecessary_save_image
|
||||
mov [FDD_Track], 0; Öèëèíäð
|
||||
mov [FDD_Head], 0; Ñòîðîíà
|
||||
mov [FDD_Sector], 1; Ñåêòîð
|
||||
mov [FDD_Track], 0; Цилиндр
|
||||
mov [FDD_Head], 0; Сторона
|
||||
mov [FDD_Sector], 1; Сектор
|
||||
mov esi, RAMDISK
|
||||
call SeekTrack
|
||||
save_image_1:
|
||||
|
||||
+155
-155
@@ -9,12 +9,12 @@ $Revision$
|
||||
|
||||
|
||||
;**********************************************************
|
||||
; Непосредственная работа с контроллером гибкого диска
|
||||
; Непосредственная работа с контроллером гибкого диска
|
||||
;**********************************************************
|
||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; Адаптация и доработка Mario79
|
||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; Адаптация и доработка Mario79
|
||||
|
||||
;give_back_application_data: ; переслать приложению
|
||||
;give_back_application_data: ; переслать приложению
|
||||
; mov edi,[TASK_BASE]
|
||||
; mov edi,[edi+TASKDATA.mem_start]
|
||||
; add edi,ecx
|
||||
@@ -26,7 +26,7 @@ give_back_application_data_1:
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
;take_data_from_application: ; взять из приложени
|
||||
;take_data_from_application: ; взять из приложени
|
||||
; mov esi,[TASK_BASE]
|
||||
; mov esi,[esi+TASKDATA.mem_start]
|
||||
; add esi,ecx
|
||||
@@ -38,37 +38,37 @@ take_data_from_application_1:
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
; Коды завершения операции с контроллером (FDC_Status)
|
||||
FDC_Normal equ 0 ;нормальное завершение
|
||||
FDC_TimeOut equ 1 ;ошибка тайм-аута
|
||||
FDC_DiskNotFound equ 2 ;в дисководе нет диска
|
||||
FDC_TrackNotFound equ 3 ;дорожка не найдена
|
||||
FDC_SectorNotFound equ 4 ;сектор не найден
|
||||
; Коды завершения операции с контроллером (FDC_Status)
|
||||
FDC_Normal equ 0 ;нормальное завершение
|
||||
FDC_TimeOut equ 1 ;ошибка тайм-аута
|
||||
FDC_DiskNotFound equ 2 ;в дисководе нет диска
|
||||
FDC_TrackNotFound equ 3 ;дорожка не найдена
|
||||
FDC_SectorNotFound equ 4 ;сектор не найден
|
||||
|
||||
; Максимальные значения координат сектора (заданные
|
||||
; значения соответствуют параметрам стандартного
|
||||
; трехдюймового гибкого диска объемом 1,44 Мб)
|
||||
; Максимальные значения координат сектора (заданные
|
||||
; значения соответствуют параметрам стандартного
|
||||
; трехдюймового гибкого диска объемом 1,44 Мб)
|
||||
MAX_Track equ 79
|
||||
MAX_Head equ 1
|
||||
MAX_Sector equ 18
|
||||
|
||||
uglobal
|
||||
; Счетчик тиков таймера
|
||||
; Счетчик тиков таймера
|
||||
TickCounter dd ?
|
||||
; Код завершения операции с контроллером НГМД
|
||||
; Код завершения операции с контроллером НГМД
|
||||
FDC_Status DB ?
|
||||
; Флаг прерывания от НГМД
|
||||
; Флаг прерывания от НГМД
|
||||
FDD_IntFlag DB ?
|
||||
; Момент начала последней операции с НГМД
|
||||
; Момент начала последней операции с НГМД
|
||||
FDD_Time DD ?
|
||||
; Номер дисковода
|
||||
; Номер дисковода
|
||||
FDD_Type db 0
|
||||
; Координаты сектора
|
||||
; Координаты сектора
|
||||
FDD_Track DB ?
|
||||
FDD_Head DB ?
|
||||
FDD_Sector DB ?
|
||||
|
||||
; Блок результата операции
|
||||
; Блок результата операции
|
||||
FDC_ST0 DB ?
|
||||
FDC_ST1 DB ?
|
||||
FDC_ST2 DB ?
|
||||
@@ -76,18 +76,18 @@ FDC_C DB ?
|
||||
FDC_H DB ?
|
||||
FDC_R DB ?
|
||||
FDC_N DB ?
|
||||
; Счетчик повторения операции чтени
|
||||
; Счетчик повторения операции чтени
|
||||
ReadRepCounter DB ?
|
||||
; Счетчик повторения операции рекалибровки
|
||||
; Счетчик повторения операции рекалибровки
|
||||
RecalRepCounter DB ?
|
||||
endg
|
||||
; Область памяти для хранения прочитанного сектора
|
||||
; Область памяти для хранения прочитанного сектора
|
||||
;FDD_DataBuffer: times 512 db 0 ;DB 512 DUP (?)
|
||||
fdd_motor_status db 0
|
||||
timer_fdd_motor dd 0
|
||||
|
||||
;*************************************
|
||||
;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
|
||||
;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
|
||||
;*************************************
|
||||
Init_FDC_DMA:
|
||||
pushad
|
||||
@@ -117,29 +117,29 @@ Init_FDC_DMA:
|
||||
ret
|
||||
|
||||
;***********************************
|
||||
;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
|
||||
;* Параметры: *
|
||||
;* AL - выводимый байт. *
|
||||
;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
|
||||
;* Параметры: *
|
||||
;* AL - выводимый байт. *
|
||||
;***********************************
|
||||
FDCDataOutput:
|
||||
; pusha
|
||||
push eax ecx edx
|
||||
mov AH, AL ;запомнить байт в AH
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov AH, AL ;запомнить байт в AH
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov [FDC_Status], FDC_Normal
|
||||
; Проверить готовность контроллера к приему данных
|
||||
mov DX, 3F4h ;(порт состояния FDC)
|
||||
mov ecx, 0x10000 ;установить счетчик тайм-аута
|
||||
; Проверить готовность контроллера к приему данных
|
||||
mov DX, 3F4h ;(порт состояния FDC)
|
||||
mov ecx, 0x10000 ;установить счетчик тайм-аута
|
||||
@@TestRS:
|
||||
in AL, DX ;прочитать регистр RS
|
||||
and AL, 0C0h ;выделить разряды 6 и 7
|
||||
cmp AL, 80h ;проверить разряды 6 и 7
|
||||
in AL, DX ;прочитать регистр RS
|
||||
and AL, 0C0h ;выделить разряды 6 и 7
|
||||
cmp AL, 80h ;проверить разряды 6 и 7
|
||||
je @@OutByteToFDC
|
||||
loop @@TestRS
|
||||
; Ошибка тайм-аута
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status], FDC_TimeOut
|
||||
jmp @@End_5
|
||||
; Вывести байт в порт данных
|
||||
; Вывести байт в порт данных
|
||||
@@OutByteToFDC:
|
||||
inc DX
|
||||
mov AL, AH
|
||||
@@ -150,29 +150,29 @@ FDCDataOutput:
|
||||
ret
|
||||
|
||||
;******************************************
|
||||
;* ПРОЧИТАТЬ БАЙТ ИЗ ПОРТА ДАННЫХ FDC *
|
||||
;* Процедура не имеет входных параметров. *
|
||||
;* Выходные данные: *
|
||||
;* AL - считанный байт. *
|
||||
;* ПРОЧИТАТЬ БАЙТ ИЗ ПОРТА ДАННЫХ FDC *
|
||||
;* Процедура не имеет входных параметров. *
|
||||
;* Выходные данные: *
|
||||
;* AL - считанный байт. *
|
||||
;******************************************
|
||||
FDCDataInput:
|
||||
push ECX
|
||||
push DX
|
||||
; Сбросить переменную состояния контроллера
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov [FDC_Status], FDC_Normal
|
||||
; Проверить готовность контроллера к передаче данных
|
||||
mov DX, 3F4h ;(порт состояния FDC)
|
||||
xor CX, CX ;установить счетчик тайм-аута
|
||||
; Проверить готовность контроллера к передаче данных
|
||||
mov DX, 3F4h ;(порт состояния FDC)
|
||||
xor CX, CX ;установить счетчик тайм-аута
|
||||
@@TestRS_1:
|
||||
in AL, DX ;прочитать регистр RS
|
||||
and AL, 0C0h ;выдлить разряды 6 и 7
|
||||
cmp AL, 0C0h ;проверить разряды 6 и 7
|
||||
in AL, DX ;прочитать регистр RS
|
||||
and AL, 0C0h ;выдлить разряды 6 и 7
|
||||
cmp AL, 0C0h ;проверить разряды 6 и 7
|
||||
je @@GetByteFromFDC
|
||||
loop @@TestRS_1
|
||||
; Ошибка тайм-аута
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status], FDC_TimeOut
|
||||
jmp @@End_6
|
||||
; Ввести байт из порта данных
|
||||
; Ввести байт из порта данных
|
||||
@@GetByteFromFDC:
|
||||
inc DX
|
||||
in AL, DX
|
||||
@@ -182,45 +182,45 @@ FDCDataInput:
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;*********************************************
|
||||
FDCInterrupt:
|
||||
; Установить флаг прерывани
|
||||
; Установить флаг прерывани
|
||||
mov [FDD_IntFlag], 1
|
||||
ret
|
||||
|
||||
|
||||
;******************************************
|
||||
;* УСТАНОВИТЬ НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЙ *
|
||||
;* НГМД *
|
||||
;* УСТАНОВИТЬ НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЙ *
|
||||
;* НГМД *
|
||||
;******************************************
|
||||
SetUserInterrupts:
|
||||
mov [fdc_irq_func], FDCInterrupt
|
||||
ret
|
||||
|
||||
;*******************************************
|
||||
;* ОЖИДАНИЕ ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;* ОЖИДАНИЕ ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;*******************************************
|
||||
WaitFDCInterrupt:
|
||||
pusha
|
||||
; Сбросить байт состояния операции
|
||||
; Сбросить байт состояния операции
|
||||
mov [FDC_Status], FDC_Normal
|
||||
; Сбросить флаг прерывани
|
||||
; Сбросить флаг прерывани
|
||||
mov [FDD_IntFlag], 0
|
||||
; Обнулить счетчик тиков
|
||||
; Обнулить счетчик тиков
|
||||
mov eax, [timer_ticks]
|
||||
mov [TickCounter], eax
|
||||
; Ожидать установки флага прерывания НГМД
|
||||
; Ожидать установки флага прерывания НГМД
|
||||
@@TestRS_2:
|
||||
cmp [FDD_IntFlag], 0
|
||||
jnz @@End_7 ;прерывание произошло
|
||||
jnz @@End_7 ;прерывание произошло
|
||||
call change_task
|
||||
mov eax, [timer_ticks]
|
||||
sub eax, [TickCounter]
|
||||
cmp eax, 50 ;25 ;5 ;ожидать 5 тиков
|
||||
cmp eax, 50 ;25 ;5 ;ожидать 5 тиков
|
||||
jb @@TestRS_2
|
||||
; jl @@TestRS_2
|
||||
; Ошибка тайм-аута
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status], FDC_TimeOut
|
||||
; mov [flp_status],0
|
||||
@@End_7:
|
||||
@@ -228,7 +228,7 @@ WaitFDCInterrupt:
|
||||
ret
|
||||
|
||||
;*********************************
|
||||
;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
|
||||
;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
|
||||
;*********************************
|
||||
FDDMotorON:
|
||||
pusha
|
||||
@@ -237,11 +237,11 @@ FDDMotorON:
|
||||
mov al, [flp_number]
|
||||
cmp [fdd_motor_status], al
|
||||
je fdd_motor_on
|
||||
; Произвести сброс контроллера НГМД
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
; Произвести сброс контроллера НГМД
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
mov AL, 0
|
||||
out DX, AL
|
||||
; Выбрать и включить мотор дисковода
|
||||
; Выбрать и включить мотор дисковода
|
||||
cmp [flp_number], 1
|
||||
jne FDDMotorON_B
|
||||
; call FDDMotorOFF_B
|
||||
@@ -252,10 +252,10 @@ FDDMotorON_B:
|
||||
mov AL, 2Dh ; Floppy B
|
||||
FDDMotorON_1:
|
||||
out DX, AL
|
||||
; Обнулить счетчик тиков
|
||||
; Обнулить счетчик тиков
|
||||
mov eax, [timer_ticks]
|
||||
mov [TickCounter], eax
|
||||
; Ожидать 0,5 с
|
||||
; Ожидать 0,5 с
|
||||
@@dT:
|
||||
call change_task
|
||||
mov eax, [timer_ticks]
|
||||
@@ -274,7 +274,7 @@ fdd_motor_on:
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ *
|
||||
;* СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ *
|
||||
;*****************************************
|
||||
save_timer_fdd_motor:
|
||||
mov eax, [timer_ticks]
|
||||
@@ -282,7 +282,7 @@ save_timer_fdd_motor:
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА *
|
||||
;* ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА *
|
||||
;*****************************************
|
||||
proc check_fdd_motor_status_has_work?
|
||||
cmp [flp_status], 0
|
||||
@@ -318,7 +318,7 @@ end_check_fdd_motor_status:
|
||||
ret
|
||||
|
||||
;**********************************
|
||||
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА *
|
||||
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА *
|
||||
;**********************************
|
||||
FDDMotorOFF:
|
||||
push AX
|
||||
@@ -332,35 +332,35 @@ FDDMotorOFF_1:
|
||||
FDDMotorOFF_2:
|
||||
pop DX
|
||||
pop AX
|
||||
; сброс флагов кеширования в связи с устареванием информации
|
||||
; сброс флагов кеширования в связи с устареванием информации
|
||||
mov [root_read], 0
|
||||
mov [flp_fat], 0
|
||||
ret
|
||||
|
||||
FDDMotorOFF_A:
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
mov AL, 0Ch ; Floppy A
|
||||
out DX, AL
|
||||
ret
|
||||
|
||||
FDDMotorOFF_B:
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
mov DX, 3F2h;порт управления двигателями
|
||||
mov AL, 5h ; Floppy B
|
||||
out DX, AL
|
||||
ret
|
||||
|
||||
;*******************************
|
||||
;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
|
||||
;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
|
||||
;*******************************
|
||||
RecalibrateFDD:
|
||||
pusha
|
||||
call save_timer_fdd_motor
|
||||
; Подать команду "Рекалибровка"
|
||||
; Подать команду "Рекалибровка"
|
||||
mov AL, 07h
|
||||
call FDCDataOutput
|
||||
mov AL, 00h
|
||||
call FDCDataOutput
|
||||
; Ожидать завершения операции
|
||||
; Ожидать завершения операции
|
||||
call WaitFDCInterrupt
|
||||
; cmp [FDC_Status],0
|
||||
; je no_fdc_status_error
|
||||
@@ -371,54 +371,54 @@ RecalibrateFDD:
|
||||
ret
|
||||
|
||||
;*****************************************************
|
||||
;* ПОИСК ДОРОЖКИ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* ПОИСК ДОРОЖКИ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;*****************************************************
|
||||
SeekTrack:
|
||||
pusha
|
||||
call save_timer_fdd_motor
|
||||
; Подать команду "Поиск"
|
||||
; Подать команду "Поиск"
|
||||
mov AL, 0Fh
|
||||
call FDCDataOutput
|
||||
; Передать байт номера головки/накопител
|
||||
; Передать байт номера головки/накопител
|
||||
mov AL, [FDD_Head]
|
||||
shl AL, 2
|
||||
call FDCDataOutput
|
||||
; Передать байт номера дорожки
|
||||
; Передать байт номера дорожки
|
||||
mov AL, [FDD_Track]
|
||||
call FDCDataOutput
|
||||
; Ожидать завершения операции
|
||||
; Ожидать завершения операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status], FDC_Normal
|
||||
jne @@Exit
|
||||
; Сохранить результат поиска
|
||||
; Сохранить результат поиска
|
||||
mov AL, 08h
|
||||
call FDCDataOutput
|
||||
call FDCDataInput
|
||||
mov [FDC_ST0], AL
|
||||
call FDCDataInput
|
||||
mov [FDC_C], AL
|
||||
; Проверить результат поиска
|
||||
; Поиск завершен?
|
||||
; Проверить результат поиска
|
||||
; Поиск завершен?
|
||||
test [FDC_ST0], 100000b
|
||||
je @@Err
|
||||
; Заданный трек найден?
|
||||
; Заданный трек найден?
|
||||
mov AL, [FDC_C]
|
||||
cmp AL, [FDD_Track]
|
||||
jne @@Err
|
||||
; Номер головки совпадает с заданным?
|
||||
; Номер головки совпадает с заданным?
|
||||
mov AL, [FDC_ST0]
|
||||
and AL, 100b
|
||||
shr AL, 2
|
||||
cmp AL, [FDD_Head]
|
||||
jne @@Err
|
||||
; Операция завершена успешно
|
||||
; Операция завершена успешно
|
||||
mov [FDC_Status], FDC_Normal
|
||||
jmp @@Exit
|
||||
@@Err: ; Трек не найден
|
||||
@@Err: ; Трек не найден
|
||||
mov [FDC_Status], FDC_TrackNotFound
|
||||
; mov [flp_status],0
|
||||
@@Exit:
|
||||
@@ -427,27 +427,27 @@ SeekTrack:
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЧТЕНИЕ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;* ЧТЕНИЕ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;*******************************************************
|
||||
ReadSector:
|
||||
pushad
|
||||
call save_timer_fdd_motor
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
mov AX, 0
|
||||
mov DX, 03F7h
|
||||
out DX, AL
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
mov [dmamode], 0x46
|
||||
call Init_FDC_DMA
|
||||
; Подать команду "Чтение данных"
|
||||
mov AL, 0E6h ;чтение в мультитрековом режиме
|
||||
; Подать команду "Чтение данных"
|
||||
mov AL, 0E6h ;чтение в мультитрековом режиме
|
||||
call FDCDataOutput
|
||||
mov AL, [FDD_Head]
|
||||
shl AL, 2
|
||||
@@ -458,19 +458,19 @@ ReadSector:
|
||||
call FDCDataOutput
|
||||
mov AL, [FDD_Sector]
|
||||
call FDCDataOutput
|
||||
mov AL, 2 ;код размера сектора (512 байт)
|
||||
mov AL, 2 ;код размера сектора (512 байт)
|
||||
call FDCDataOutput
|
||||
mov AL, 18 ;+1; 3Fh ;число секторов на дорожке
|
||||
mov AL, 18 ;+1; 3Fh ;число секторов на дорожке
|
||||
call FDCDataOutput
|
||||
mov AL, 1Bh ;значение GPL
|
||||
mov AL, 1Bh ;значение GPL
|
||||
call FDCDataOutput
|
||||
mov AL, 0FFh;значение DTL
|
||||
mov AL, 0FFh;значение DTL
|
||||
call FDCDataOutput
|
||||
; Ожидаем прерывание по завершении операции
|
||||
; Ожидаем прерывание по завершении операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status], FDC_Normal
|
||||
jne @@Exit_1
|
||||
; Считываем статус завершения операции
|
||||
; Считываем статус завершения операции
|
||||
call GetStatusInfo
|
||||
test [FDC_ST0], 11011000b
|
||||
jnz @@Err_1
|
||||
@@ -485,21 +485,21 @@ ReadSector:
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;* ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;*******************************************************
|
||||
ReadSectWithRetr:
|
||||
pusha
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
mov [RecalRepCounter], 0
|
||||
@@TryAgain:
|
||||
; Обнулить счетчик повторения операции чтени
|
||||
; Обнулить счетчик повторения операции чтени
|
||||
mov [ReadRepCounter], 0
|
||||
@@ReadSector_1:
|
||||
call ReadSector
|
||||
@@ -507,11 +507,11 @@ ReadSectWithRetr:
|
||||
je @@Exit_2
|
||||
cmp [FDC_Status], 1
|
||||
je @@Err_3
|
||||
; Троекратное повторение чтени
|
||||
; Троекратное повторение чтени
|
||||
inc [ReadRepCounter]
|
||||
cmp [ReadRepCounter], 3
|
||||
jb @@ReadSector_1
|
||||
; Троекратное повторение рекалибровки
|
||||
; Троекратное повторение рекалибровки
|
||||
call RecalibrateFDD
|
||||
call SeekTrack
|
||||
inc [RecalRepCounter]
|
||||
@@ -527,27 +527,27 @@ ReadSectWithRetr:
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЗАПИСЬ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;* ЗАПИСЬ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;*******************************************************
|
||||
WriteSector:
|
||||
pushad
|
||||
call save_timer_fdd_motor
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
mov AX, 0
|
||||
mov DX, 03F7h
|
||||
out DX, AL
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
mov [dmamode], 0x4A
|
||||
call Init_FDC_DMA
|
||||
; Подать команду "Запись данных"
|
||||
mov AL, 0xC5 ;0x45 ;запись в мультитрековом режиме
|
||||
; Подать команду "Запись данных"
|
||||
mov AL, 0xC5 ;0x45 ;запись в мультитрековом режиме
|
||||
call FDCDataOutput
|
||||
mov AL, [FDD_Head]
|
||||
shl AL, 2
|
||||
@@ -558,19 +558,19 @@ WriteSector:
|
||||
call FDCDataOutput
|
||||
mov AL, [FDD_Sector]
|
||||
call FDCDataOutput
|
||||
mov AL, 2 ;код размера сектора (512 байт)
|
||||
mov AL, 2 ;код размера сектора (512 байт)
|
||||
call FDCDataOutput
|
||||
mov AL, 18; 3Fh ;число секторов на дорожке
|
||||
mov AL, 18; 3Fh ;число секторов на дорожке
|
||||
call FDCDataOutput
|
||||
mov AL, 1Bh ;значение GPL
|
||||
mov AL, 1Bh ;значение GPL
|
||||
call FDCDataOutput
|
||||
mov AL, 0FFh;значение DTL
|
||||
mov AL, 0FFh;значение DTL
|
||||
call FDCDataOutput
|
||||
; Ожидаем прерывание по завершении операции
|
||||
; Ожидаем прерывание по завершении операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status], FDC_Normal
|
||||
jne @@Exit_3
|
||||
; Считываем статус завершения операции
|
||||
; Считываем статус завершения операции
|
||||
call GetStatusInfo
|
||||
test [FDC_ST0], 11000000b ;11011000b
|
||||
jnz @@Err_2
|
||||
@@ -584,21 +584,21 @@ WriteSector:
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;* ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;*******************************************************
|
||||
WriteSectWithRetr:
|
||||
pusha
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
mov [RecalRepCounter], 0
|
||||
@@TryAgain_1:
|
||||
; Обнулить счетчик повторения операции чтени
|
||||
; Обнулить счетчик повторения операции чтени
|
||||
mov [ReadRepCounter], 0
|
||||
@@WriteSector_1:
|
||||
call WriteSector
|
||||
@@ -606,11 +606,11 @@ WriteSectWithRetr:
|
||||
je @@Exit_4
|
||||
cmp [FDC_Status], 1
|
||||
je @@Err_4
|
||||
; Троекратное повторение чтени
|
||||
; Троекратное повторение чтени
|
||||
inc [ReadRepCounter]
|
||||
cmp [ReadRepCounter], 3
|
||||
jb @@WriteSector_1
|
||||
; Троекратное повторение рекалибровки
|
||||
; Троекратное повторение рекалибровки
|
||||
call RecalibrateFDD
|
||||
call SeekTrack
|
||||
inc [RecalRepCounter]
|
||||
@@ -625,7 +625,7 @@ WriteSectWithRetr:
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
|
||||
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
|
||||
;*********************************************
|
||||
GetStatusInfo:
|
||||
push AX
|
||||
|
||||
@@ -109,28 +109,28 @@ hd_read_pio:
|
||||
xor eax, eax
|
||||
mov edx, [hdbase]
|
||||
inc edx
|
||||
out dx, al; ATAFeatures ॣ¨áâà "®á®¡¥®á⥩"
|
||||
out dx, al; ATAFeatures регистр "особенностей"
|
||||
inc edx
|
||||
inc eax
|
||||
out dx, al; ATASectorCount áçñâ稪 ᥪâ®à®¢
|
||||
out dx, al; ATASectorCount счётчик секторов
|
||||
inc edx
|
||||
mov eax, [esp+4]
|
||||
out dx, al; ATASectorNumber ॣ¨áâà ®¬¥à ᥪâ®à
|
||||
out dx, al; ATASectorNumber регистр номера сектора
|
||||
shr eax, 8
|
||||
inc edx
|
||||
out dx, al; ATACylinder ®¬¥à 樫¨¤à (¬« ¤è¨© ¡ ©â)
|
||||
out dx, al; ATACylinder номер цилиндра (младший байт)
|
||||
shr eax, 8
|
||||
inc edx
|
||||
out dx, al; ®¬¥à 樫¨¤à (áâ à訩 ¡ ©â)
|
||||
out dx, al; номер цилиндра (старший байт)
|
||||
shr eax, 8
|
||||
inc edx
|
||||
and al, 1+2+4+8
|
||||
add al, byte [hdid]
|
||||
add al, 128+64+32
|
||||
out dx, al; ®¬¥à £®«®¢ª¨/®¬¥à ¤¨áª
|
||||
out dx, al; номер головки/номер диска
|
||||
inc edx
|
||||
mov al, 20h
|
||||
out dx, al; ATACommand ॣ¨áâà ª®¬ ¤
|
||||
out dx, al; ATACommand регистр команд
|
||||
sti
|
||||
|
||||
call wait_for_sector_buffer
|
||||
|
||||
@@ -52,7 +52,7 @@ write_cache_more:
|
||||
cmp [dma_hdd], 1
|
||||
jnz .nodma
|
||||
@@:
|
||||
; Ž¡ê¥¤¨ï¥¬ § ¯¨áì æ¥¯®çª¨ ¯®á«¥¤®¢ ⥫ìëå ᥪâ®à®¢ ¢ ®¤® ®¡à 饨¥ ª ¤¨áªã
|
||||
; Объединяем запись цепочки последовательных секторов в одно обращение к диску
|
||||
cmp ecx, 1
|
||||
jz .nonext
|
||||
cmp dword [esi+8+4], 2
|
||||
|
||||
@@ -346,10 +346,10 @@ uni2ansi_str:
|
||||
mov al, '_'
|
||||
jmp .doit
|
||||
.yo1:
|
||||
mov al, 'ð'
|
||||
mov al, 0xF0 ; 'Ё'
|
||||
jmp .doit
|
||||
.yo2:
|
||||
mov al, 'ñ'
|
||||
mov al, 0xF1 ; 'ё'
|
||||
jmp .doit
|
||||
.rus1:
|
||||
; 0x410-0x43F -> 0x80-0xAF
|
||||
@@ -389,9 +389,9 @@ ansi2uni_char:
|
||||
; 0xF0 -> 0x401
|
||||
; 0xF1 -> 0x451
|
||||
@@:
|
||||
cmp al, 'ð'
|
||||
cmp al, 0xF0 ; 'Ё'
|
||||
jz .yo1
|
||||
cmp al, 'ñ'
|
||||
cmp al, 0xF1 ; 'ё'
|
||||
jz .yo2
|
||||
.unk:
|
||||
mov al, '_' ; ah=0
|
||||
@@ -411,16 +411,16 @@ char_toupper:
|
||||
jb .ret
|
||||
cmp al, 'z'
|
||||
jbe .az
|
||||
cmp al, 'ñ'
|
||||
cmp al, 0xF1 ; 'ё'
|
||||
jz .yo1
|
||||
cmp al, ' '
|
||||
cmp al, 0xA0 ; 'а'
|
||||
jb .ret
|
||||
cmp al, 'à'
|
||||
cmp al, 0xE0 ; 'р'
|
||||
jb .rus1
|
||||
cmp al, 'ï'
|
||||
cmp al, 0xEF ; 'я'
|
||||
ja .ret
|
||||
; 0xE0-0xEF -> 0x90-0x9F
|
||||
sub al, 'à'-'�'
|
||||
sub al, 0xE0-0x90
|
||||
.ret:
|
||||
ret
|
||||
.rus1:
|
||||
|
||||
Reference in New Issue
Block a user