good-bye floppy!
git-svn-id: svn://kolibrios.org@3487 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d613a64038
commit
08bb2f6f9f
@ -1,929 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision$
|
|
||||||
|
|
||||||
|
|
||||||
;**********************************************************
|
|
||||||
; Непосредственная работа с устройством СD (ATAPI)
|
|
||||||
;**********************************************************
|
|
||||||
; Автор части исходного текста Кулаков Владимир Геннадьевич
|
|
||||||
; Адаптация, доработка и разработка Mario79,<Lrz>
|
|
||||||
|
|
||||||
; Максимальное количество повторений операции чтения
|
|
||||||
MaxRetr equ 10
|
|
||||||
; Предельное время ожидания готовности к приему команды
|
|
||||||
; (в тиках)
|
|
||||||
BSYWaitTime equ 1000 ;2
|
|
||||||
NoTickWaitTime equ 0xfffff
|
|
||||||
CDBlockSize equ 2048
|
|
||||||
;********************************************
|
|
||||||
;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ *
|
|
||||||
;* Многократное повторение чтения при сбоях *
|
|
||||||
;********************************************
|
|
||||||
ReadCDWRetr:
|
|
||||||
;-----------------------------------------------------------
|
|
||||||
; input : eax = block to read
|
|
||||||
; ebx = destination
|
|
||||||
;-----------------------------------------------------------
|
|
||||||
pushad
|
|
||||||
mov eax,[CDSectorAddress]
|
|
||||||
mov ebx,[CDDataBuf_pointer]
|
|
||||||
call cd_calculate_cache
|
|
||||||
xor edi,edi
|
|
||||||
add esi,8
|
|
||||||
inc edi
|
|
||||||
.hdreadcache:
|
|
||||||
; cmp dword [esi+4],0 ; empty
|
|
||||||
; je .nohdcache
|
|
||||||
cmp [esi],eax ; correct sector
|
|
||||||
je .yeshdcache
|
|
||||||
.nohdcache:
|
|
||||||
add esi,8
|
|
||||||
inc edi
|
|
||||||
dec ecx
|
|
||||||
jnz .hdreadcache
|
|
||||||
call find_empty_slot_CD_cache ; ret in edi
|
|
||||||
|
|
||||||
push edi
|
|
||||||
push eax
|
|
||||||
call cd_calculate_cache_2
|
|
||||||
shl edi,11
|
|
||||||
add edi,eax
|
|
||||||
mov [CDDataBuf_pointer],edi
|
|
||||||
pop eax
|
|
||||||
pop edi
|
|
||||||
|
|
||||||
call ReadCDWRetr_1
|
|
||||||
cmp [DevErrorCode],0
|
|
||||||
jne .exit
|
|
||||||
|
|
||||||
mov [CDDataBuf_pointer],ebx
|
|
||||||
call cd_calculate_cache_1
|
|
||||||
lea esi,[edi*8+esi]
|
|
||||||
mov [esi],eax ; sector number
|
|
||||||
; mov dword [esi+4],1 ; hd read - mark as same as in hd
|
|
||||||
.yeshdcache:
|
|
||||||
mov esi,edi
|
|
||||||
shl esi,11 ;9
|
|
||||||
push eax
|
|
||||||
call cd_calculate_cache_2
|
|
||||||
add esi,eax
|
|
||||||
pop eax
|
|
||||||
mov edi,ebx ;[CDDataBuf_pointer]
|
|
||||||
mov ecx,512 ;/4
|
|
||||||
cld
|
|
||||||
rep movsd ; move data
|
|
||||||
.exit:
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
ReadCDWRetr_1:
|
|
||||||
pushad
|
|
||||||
|
|
||||||
; Цикл, пока команда не выполнена успешно или не
|
|
||||||
; исчерпано количество попыток
|
|
||||||
mov ECX,MaxRetr
|
|
||||||
@@NextRetr:
|
|
||||||
; Подать команду
|
|
||||||
;*************************************************
|
|
||||||
;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА *
|
|
||||||
;* Считываются данные пользователя, информация *
|
|
||||||
;* субканала и контрольная информация *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* перменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале; *
|
|
||||||
;* CDSectorAddress - адрес считываемого сектора. *
|
|
||||||
;* Данные считывается в массив CDDataBuf. *
|
|
||||||
;*************************************************
|
|
||||||
;ReadCD:
|
|
||||||
push ecx
|
|
||||||
; pusha
|
|
||||||
; Задать размер сектора
|
|
||||||
; mov [CDBlockSize],2048 ;2352
|
|
||||||
; Очистить буфер пакетной команды
|
|
||||||
call clear_packet_buffer
|
|
||||||
; Сформировать пакетную команду для считывания
|
|
||||||
; сектора данных
|
|
||||||
; Задать код команды Read CD
|
|
||||||
mov [PacketCommand],byte 0x28 ;0xBE
|
|
||||||
; Задать адрес сектора
|
|
||||||
mov AX,word [CDSectorAddress+2]
|
|
||||||
xchg AL,AH
|
|
||||||
mov word [PacketCommand+2],AX
|
|
||||||
mov AX,word [CDSectorAddress]
|
|
||||||
xchg AL,AH
|
|
||||||
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
|
|
||||||
|
|
||||||
; cmp [DevErrorCode],0
|
|
||||||
test eax,eax
|
|
||||||
jz @@End_4
|
|
||||||
|
|
||||||
or ecx,ecx ;{SPraid.simba} (for cd load)
|
|
||||||
jz @@End_4
|
|
||||||
dec ecx
|
|
||||||
|
|
||||||
cmp [timer_ticks_enable],0
|
|
||||||
jne @f
|
|
||||||
mov eax,NoTickWaitTime
|
|
||||||
.wait:
|
|
||||||
dec eax
|
|
||||||
; test eax,eax
|
|
||||||
jz @@NextRetr
|
|
||||||
jmp .wait
|
|
||||||
@@:
|
|
||||||
; Задержка на 2,5 секунды
|
|
||||||
; mov EAX,[timer_ticks]
|
|
||||||
; add EAX,50 ;250
|
|
||||||
;@@Wait:
|
|
||||||
; call change_task
|
|
||||||
; cmp EAX,[timer_ticks]
|
|
||||||
; ja @@Wait
|
|
||||||
loop @@NextRetr
|
|
||||||
@@End_4:
|
|
||||||
mov dword [DevErrorCode],eax
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
; Универсальные процедуры, обеспечивающие выполнение
|
|
||||||
; пакетных команд в режиме PIO
|
|
||||||
|
|
||||||
; Максимально допустимое время ожидания реакции
|
|
||||||
; устройства на пакетную команду (в тиках)
|
|
||||||
|
|
||||||
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 - размер принимаемого блока данных. *
|
|
||||||
; return eax DevErrorCode
|
|
||||||
;****************************************************
|
|
||||||
SendPacketDatCommand:
|
|
||||||
xor eax,eax
|
|
||||||
; mov byte [DevErrorCode],al
|
|
||||||
; Задать режим CHS
|
|
||||||
mov byte [ATAAddressMode],al
|
|
||||||
; Послать 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 ;закончить, сохранив код ошибки
|
|
||||||
|
|
||||||
; Ожидание готовности дисковода к приему
|
|
||||||
; пакетной команды
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
add DX,7 ;порт 1х7h
|
|
||||||
mov ecx,NoTickWaitTime
|
|
||||||
@@WaitDevice0:
|
|
||||||
cmp [timer_ticks_enable],0
|
|
||||||
jne @f
|
|
||||||
dec ecx
|
|
||||||
; test ecx,ecx
|
|
||||||
jz @@Err1_1
|
|
||||||
jmp .test
|
|
||||||
@@:
|
|
||||||
call change_task
|
|
||||||
; Проверить время выполнения команды
|
|
||||||
mov EAX,[timer_ticks]
|
|
||||||
sub EAX,[TickCounter_1]
|
|
||||||
cmp EAX,BSYWaitTime
|
|
||||||
ja @@Err1_1 ;ошибка тайм-аута
|
|
||||||
; Проверить готовность
|
|
||||||
.test:
|
|
||||||
in AL,DX
|
|
||||||
test AL,80h ;состояние сигнала BSY
|
|
||||||
jnz @@WaitDevice0
|
|
||||||
test AL,08h ;состояние сигнала DRQ
|
|
||||||
jz @@WaitDevice0
|
|
||||||
test AL,1 ;состояние сигнала ERR
|
|
||||||
jnz @@Err6
|
|
||||||
; Послать пакетную команду
|
|
||||||
cli
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
mov AX,[PacketCommand]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,[PacketCommand+2]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,[PacketCommand+4]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,[PacketCommand+6]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,[PacketCommand+8]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,[PacketCommand+10]
|
|
||||||
out DX,AX
|
|
||||||
sti
|
|
||||||
; Ожидание готовности данных
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
add DX,7 ;порт 1х7h
|
|
||||||
mov ecx,NoTickWaitTime
|
|
||||||
@@WaitDevice1:
|
|
||||||
cmp [timer_ticks_enable],0
|
|
||||||
jne @f
|
|
||||||
dec ecx
|
|
||||||
; test ecx,ecx
|
|
||||||
jz @@Err1_1
|
|
||||||
jmp .test_1
|
|
||||||
@@:
|
|
||||||
call change_task
|
|
||||||
; Проверить время выполнения команды
|
|
||||||
mov EAX,[timer_ticks]
|
|
||||||
sub EAX,[TickCounter_1]
|
|
||||||
cmp EAX,MaxCDWaitTime
|
|
||||||
ja @@Err1_1 ;ошибка тайм-аута
|
|
||||||
; Проверить готовность
|
|
||||||
.test_1:
|
|
||||||
in AL,DX
|
|
||||||
test AL,80h ;состояние сигнала BSY
|
|
||||||
jnz @@WaitDevice1
|
|
||||||
test AL,08h ;состояние сигнала DRQ
|
|
||||||
jz @@WaitDevice1
|
|
||||||
test AL,1 ;состояние сигнала ERR
|
|
||||||
jnz @@Err6_temp
|
|
||||||
; Принять блок данных от контроллера
|
|
||||||
mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf
|
|
||||||
; Загрузить адрес регистра данных контроллера
|
|
||||||
mov DX,[ATABasePortAddr] ;порт 1x0h
|
|
||||||
; Загрузить в счетчик размер блока в байтах
|
|
||||||
xor ecx,ecx
|
|
||||||
mov CX,CDBlockSize
|
|
||||||
; Вычислить размер блока в 16-разрядных словах
|
|
||||||
shr CX,1 ;разделить размер блока на 2
|
|
||||||
; Принять блок данных
|
|
||||||
cli
|
|
||||||
cld
|
|
||||||
rep insw
|
|
||||||
sti
|
|
||||||
; Успешное завершение приема данных
|
|
||||||
@@End_8:
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Записать код ошибки
|
|
||||||
@@Err1_1:
|
|
||||||
xor eax,eax
|
|
||||||
inc eax
|
|
||||||
ret
|
|
||||||
; mov [DevErrorCode],1
|
|
||||||
; ret
|
|
||||||
@@Err6_temp:
|
|
||||||
mov eax,7
|
|
||||||
ret
|
|
||||||
; mov [DevErrorCode],7
|
|
||||||
; ret
|
|
||||||
@@Err6:
|
|
||||||
mov eax,6
|
|
||||||
ret
|
|
||||||
; mov [DevErrorCode],6
|
|
||||||
;@@End_8:
|
|
||||||
; ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;***********************************************
|
|
||||||
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
|
|
||||||
;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ *
|
|
||||||
;* Входные параметры передаются через *
|
|
||||||
;* глобальные перменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале; *
|
|
||||||
;* PacketCommand - 12-байтный командный пакет. *
|
|
||||||
;***********************************************
|
|
||||||
SendPacketNoDatCommand:
|
|
||||||
pushad
|
|
||||||
xor eax,eax
|
|
||||||
; mov byte [DevErrorCode],al
|
|
||||||
; Задать режим CHS
|
|
||||||
mov byte [ATAAddressMode],al
|
|
||||||
; Послать ATA-команду передачи пакетной команды
|
|
||||||
mov byte [ATAFeatures],al
|
|
||||||
mov byte [ATASectorCount],al
|
|
||||||
mov byte [ATASectorNumber],al
|
|
||||||
mov word [ATACylinder],ax
|
|
||||||
mov byte [ATAHead],al
|
|
||||||
mov [ATACommand],0A0h
|
|
||||||
call SendCommandToHDD_1
|
|
||||||
; cmp [DevErrorCode],0 ;проверить код ошибки
|
|
||||||
test eax,eax
|
|
||||||
jnz @@End_9 ;закончить, сохранив код ошибки
|
|
||||||
; Ожидание готовности дисковода к приему
|
|
||||||
; пакетной команды
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
add DX,7 ;порт 1х7h
|
|
||||||
@@WaitDevice0_1:
|
|
||||||
call change_task
|
|
||||||
; Проверить время ожидания
|
|
||||||
mov EAX,[timer_ticks]
|
|
||||||
sub EAX,[TickCounter_1]
|
|
||||||
cmp EAX,BSYWaitTime
|
|
||||||
ja @@Err1_3 ;ошибка тайм-аута
|
|
||||||
; Проверить готовность
|
|
||||||
in AL,DX
|
|
||||||
test AL,80h ;состояние сигнала BSY
|
|
||||||
jnz @@WaitDevice0_1
|
|
||||||
test AL,1 ;состояние сигнала ERR
|
|
||||||
jnz @@Err6_1
|
|
||||||
test AL,08h ;состояние сигнала DRQ
|
|
||||||
jz @@WaitDevice0_1
|
|
||||||
; Послать пакетную команду
|
|
||||||
; cli
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
mov AX,word [PacketCommand]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,word [PacketCommand+2]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,word [PacketCommand+4]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,word [PacketCommand+6]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,word [PacketCommand+8]
|
|
||||||
out DX,AX
|
|
||||||
mov AX,word [PacketCommand+10]
|
|
||||||
out DX,AX
|
|
||||||
; sti
|
|
||||||
cmp [ignore_CD_eject_wait],1
|
|
||||||
je @@clear_DEC
|
|
||||||
; Ожидание подтверждения приема команды
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
add DX,7 ;порт 1х7h
|
|
||||||
@@WaitDevice1_1:
|
|
||||||
call change_task
|
|
||||||
; Проверить время выполнения команды
|
|
||||||
mov EAX,[timer_ticks]
|
|
||||||
sub EAX,[TickCounter_1]
|
|
||||||
cmp EAX,MaxCDWaitTime
|
|
||||||
ja @@Err1_3 ;ошибка тайм-аута
|
|
||||||
; Ожидать освобождения устройства
|
|
||||||
in AL,DX
|
|
||||||
test AL,80h ;состояние сигнала BSY
|
|
||||||
jnz @@WaitDevice1_1
|
|
||||||
test AL,1 ;состояние сигнала ERR
|
|
||||||
jnz @@Err6_1
|
|
||||||
test AL,40h ;состояние сигнала DRDY
|
|
||||||
jz @@WaitDevice1_1
|
|
||||||
@@clear_DEC:
|
|
||||||
and [DevErrorCode],0
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
; Записать код ошибки
|
|
||||||
@@Err1_3:
|
|
||||||
xor eax,eax
|
|
||||||
inc eax
|
|
||||||
jmp @@End_9
|
|
||||||
@@Err6_1:
|
|
||||||
mov eax,6
|
|
||||||
@@End_9:
|
|
||||||
mov [DevErrorCode],eax
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
;****************************************************
|
|
||||||
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* переменные: *
|
|
||||||
;* 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 к приему команды
|
|
||||||
; Выбрать нужный диск
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
add DX,6 ;адрес регистра головок
|
|
||||||
mov AL,[DiskNumber]
|
|
||||||
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
|
|
||||||
mov ecx,NoTickWaitTime
|
|
||||||
@@WaitHDReady_2:
|
|
||||||
cmp [timer_ticks_enable],0
|
|
||||||
jne @f
|
|
||||||
dec ecx
|
|
||||||
; test ecx,ecx
|
|
||||||
jz @@Err1_4
|
|
||||||
jmp .test
|
|
||||||
@@:
|
|
||||||
call change_task
|
|
||||||
; Проверить время ожидания
|
|
||||||
mov eax,[timer_ticks]
|
|
||||||
sub eax,[TickCounter_1]
|
|
||||||
cmp eax,BSYWaitTime ;300 ;ожидать 3 сек.
|
|
||||||
ja @@Err1_4 ;ошибка тайм-аута
|
|
||||||
; Прочитать регистр состояния
|
|
||||||
.test:
|
|
||||||
in AL,DX
|
|
||||||
; Проверить состояние сигнала BSY
|
|
||||||
test AL,80h
|
|
||||||
jnz @@WaitHDReady_2
|
|
||||||
; Проверить состояние сигнала DRQ
|
|
||||||
test AL,08h
|
|
||||||
jnz @@WaitHDReady_2
|
|
||||||
|
|
||||||
; Загрузить команду в регистры контроллера
|
|
||||||
cli
|
|
||||||
mov DX,[ATABasePortAddr]
|
|
||||||
inc DX ;регистр "особенностей"
|
|
||||||
mov AL,[ATAFeatures]
|
|
||||||
out DX,AL
|
|
||||||
inc DX ;счетчик секторов
|
|
||||||
mov AL,[ATASectorCount]
|
|
||||||
out DX,AL
|
|
||||||
inc DX ;регистр номера сектора
|
|
||||||
mov AL,[ATASectorNumber]
|
|
||||||
out DX,AL
|
|
||||||
inc DX ;номер цилиндра (младший байт)
|
|
||||||
mov AX,[ATACylinder]
|
|
||||||
out DX,AL
|
|
||||||
inc DX ;номер цилиндра (старший байт)
|
|
||||||
mov AL,AH
|
|
||||||
out DX,AL
|
|
||||||
inc DX ;номер головки/номер диска
|
|
||||||
mov AL,[DiskNumber]
|
|
||||||
shl AL,4
|
|
||||||
cmp [ATAHead],0Fh ;проверить номер головки
|
|
||||||
ja @@Err5_4
|
|
||||||
or AL,[ATAHead]
|
|
||||||
or AL,10100000b
|
|
||||||
mov AH,[ATAAddressMode]
|
|
||||||
shl AH,6
|
|
||||||
or AL,AH
|
|
||||||
out DX,AL
|
|
||||||
; Послать команду
|
|
||||||
mov AL,[ATACommand]
|
|
||||||
inc DX ;регистр команд
|
|
||||||
out DX,AL
|
|
||||||
sti
|
|
||||||
; Сбросить признак ошибки
|
|
||||||
; mov [DevErrorCode],0
|
|
||||||
@@End_10:
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
; Записать код ошибки
|
|
||||||
@@Err1_4:
|
|
||||||
xor eax,eax
|
|
||||||
inc eax
|
|
||||||
; mov [DevErrorCode],1
|
|
||||||
ret
|
|
||||||
@@Err2_4:
|
|
||||||
mov eax,2
|
|
||||||
; mov [DevErrorCode],2
|
|
||||||
ret
|
|
||||||
@@Err3_4:
|
|
||||||
mov eax,3
|
|
||||||
; mov [DevErrorCode],3
|
|
||||||
ret
|
|
||||||
@@Err4_4:
|
|
||||||
mov eax,4
|
|
||||||
; mov [DevErrorCode],4
|
|
||||||
ret
|
|
||||||
@@Err5_4:
|
|
||||||
mov eax,5
|
|
||||||
; mov [DevErrorCode],5
|
|
||||||
; Завершение работы программы
|
|
||||||
ret
|
|
||||||
; sti
|
|
||||||
; popad
|
|
||||||
|
|
||||||
;*************************************************
|
|
||||||
;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* перменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
WaitUnitReady:
|
|
||||||
pusha
|
|
||||||
; Запомнить время начала операции
|
|
||||||
mov EAX,[timer_ticks]
|
|
||||||
mov [WURStartTime],EAX
|
|
||||||
; Очистить буфер пакетной команды
|
|
||||||
call clear_packet_buffer
|
|
||||||
; Сформировать команду TEST UNIT READY
|
|
||||||
mov [PacketCommand],word 00h
|
|
||||||
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
|
|
||||||
mov ecx,NoTickWaitTime
|
|
||||||
@@SendCommand:
|
|
||||||
; Подать команду проверки готовности
|
|
||||||
call SendPacketNoDatCommand
|
|
||||||
cmp [timer_ticks_enable],0
|
|
||||||
jne @f
|
|
||||||
cmp [DevErrorCode],0
|
|
||||||
je @@End_11
|
|
||||||
dec ecx
|
|
||||||
; cmp ecx,0
|
|
||||||
jz .Error
|
|
||||||
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 - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
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]
|
|
||||||
dec eax
|
|
||||||
mov [eax],byte 1
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;*************************************************
|
|
||||||
;* РАЗРЕШИТЬ СМЕНУ ДИСКА *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* перменные: *
|
|
||||||
;* 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]
|
|
||||||
dec eax
|
|
||||||
mov [eax],byte 0
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;*************************************************
|
|
||||||
;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* перменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
LoadMedium:
|
|
||||||
pusha
|
|
||||||
; Очистить буфер пакетной команды
|
|
||||||
call clear_packet_buffer
|
|
||||||
; Сформировать команду START/STOP UNIT
|
|
||||||
; Задать код команды
|
|
||||||
mov [PacketCommand],word 1Bh
|
|
||||||
; Задать операцию загрузки носителя
|
|
||||||
mov [PacketCommand+4],word 00000011b
|
|
||||||
; Подать команду
|
|
||||||
call SendPacketNoDatCommand
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;*************************************************
|
|
||||||
;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* перменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
EjectMedium:
|
|
||||||
pusha
|
|
||||||
; Очистить буфер пакетной команды
|
|
||||||
call clear_packet_buffer
|
|
||||||
; Сформировать команду START/STOP UNIT
|
|
||||||
; Задать код команды
|
|
||||||
mov [PacketCommand],word 1Bh
|
|
||||||
; Задать операцию извлечения носителя
|
|
||||||
mov [PacketCommand+4],word 00000010b
|
|
||||||
; Подать команду
|
|
||||||
call SendPacketNoDatCommand
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;*************************************************
|
|
||||||
;* Проверить событие нажатия кнопки извлечения *
|
|
||||||
;* диска *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* переменные: *
|
|
||||||
;* ChannelNumber - номер канала; *
|
|
||||||
;* DiskNumber - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
align 4
|
|
||||||
check_ATAPI_device_event:
|
|
||||||
pusha
|
|
||||||
mov eax,[timer_ticks]
|
|
||||||
sub eax,[timer_ATAPI_check]
|
|
||||||
cmp eax,100
|
|
||||||
jb .end_1
|
|
||||||
mov al,[DRIVE_DATA+1]
|
|
||||||
and al,11b
|
|
||||||
cmp al,10b
|
|
||||||
jz .ide3
|
|
||||||
.ide2_1:
|
|
||||||
mov al,[DRIVE_DATA+1]
|
|
||||||
and al,1100b
|
|
||||||
cmp al,1000b
|
|
||||||
jz .ide2
|
|
||||||
.ide1_1:
|
|
||||||
mov al,[DRIVE_DATA+1]
|
|
||||||
and al,110000b
|
|
||||||
cmp al,100000b
|
|
||||||
jz .ide1
|
|
||||||
.ide0_1:
|
|
||||||
mov al,[DRIVE_DATA+1]
|
|
||||||
and al,11000000b
|
|
||||||
cmp al,10000000b
|
|
||||||
jz .ide0
|
|
||||||
.end:
|
|
||||||
|
|
||||||
sti
|
|
||||||
mov eax,[timer_ticks]
|
|
||||||
mov [timer_ATAPI_check],eax
|
|
||||||
.end_1:
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ide3:
|
|
||||||
cli
|
|
||||||
cmp [ATAPI_IDE3_lock],1
|
|
||||||
jne .ide2_1
|
|
||||||
cmp [IDE_Channel_2],0
|
|
||||||
jne .ide1_1
|
|
||||||
cmp [cd_status],0
|
|
||||||
jne .end
|
|
||||||
mov [IDE_Channel_2],1
|
|
||||||
call reserve_ok2
|
|
||||||
mov [ChannelNumber],2
|
|
||||||
mov [DiskNumber],1
|
|
||||||
mov [cdpos],4
|
|
||||||
call GetEvent_StatusNotification
|
|
||||||
cmp [CDDataBuf+4],byte 1
|
|
||||||
je .eject_ide3
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide2_1
|
|
||||||
.eject_ide3:
|
|
||||||
call .eject
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide2_1
|
|
||||||
|
|
||||||
.ide2:
|
|
||||||
cli
|
|
||||||
cmp [ATAPI_IDE2_lock],1
|
|
||||||
jne .ide1_1
|
|
||||||
cmp [IDE_Channel_2],0
|
|
||||||
jne .ide1_1
|
|
||||||
cmp [cd_status],0
|
|
||||||
jne .end
|
|
||||||
mov [IDE_Channel_2],1
|
|
||||||
call reserve_ok2
|
|
||||||
mov [ChannelNumber],2
|
|
||||||
mov [DiskNumber],0
|
|
||||||
mov [cdpos],3
|
|
||||||
call GetEvent_StatusNotification
|
|
||||||
cmp [CDDataBuf+4],byte 1
|
|
||||||
je .eject_ide2
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide1_1
|
|
||||||
.eject_ide2:
|
|
||||||
call .eject
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide1_1
|
|
||||||
|
|
||||||
.ide1:
|
|
||||||
cli
|
|
||||||
cmp [ATAPI_IDE1_lock],1
|
|
||||||
jne .ide0_1
|
|
||||||
cmp [IDE_Channel_1],0
|
|
||||||
jne .end
|
|
||||||
cmp [cd_status],0
|
|
||||||
jne .end
|
|
||||||
mov [IDE_Channel_1],1
|
|
||||||
call reserve_ok2
|
|
||||||
mov [ChannelNumber],1
|
|
||||||
mov [DiskNumber],1
|
|
||||||
mov [cdpos],2
|
|
||||||
call GetEvent_StatusNotification
|
|
||||||
cmp [CDDataBuf+4],byte 1
|
|
||||||
je .eject_ide1
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide0_1
|
|
||||||
.eject_ide1:
|
|
||||||
call .eject
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .ide0_1
|
|
||||||
|
|
||||||
.ide0:
|
|
||||||
cli
|
|
||||||
cmp [ATAPI_IDE0_lock],1
|
|
||||||
jne .end
|
|
||||||
cmp [IDE_Channel_1],0
|
|
||||||
jne .end
|
|
||||||
cmp [cd_status],0
|
|
||||||
jne .end
|
|
||||||
mov [IDE_Channel_1],1
|
|
||||||
call reserve_ok2
|
|
||||||
mov [ChannelNumber],1
|
|
||||||
mov [DiskNumber],0
|
|
||||||
mov [cdpos],1
|
|
||||||
call GetEvent_StatusNotification
|
|
||||||
cmp [CDDataBuf+4],byte 1
|
|
||||||
je .eject_ide0
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .end
|
|
||||||
.eject_ide0:
|
|
||||||
call .eject
|
|
||||||
call syscall_cdaudio.free
|
|
||||||
jmp .end
|
|
||||||
|
|
||||||
.eject:
|
|
||||||
call clear_CD_cache
|
|
||||||
call allow_medium_removal
|
|
||||||
mov [ignore_CD_eject_wait],1
|
|
||||||
call EjectMedium
|
|
||||||
mov [ignore_CD_eject_wait],0
|
|
||||||
ret
|
|
||||||
iglobal
|
|
||||||
timer_ATAPI_check dd 0
|
|
||||||
ATAPI_IDE0_lock db 0
|
|
||||||
ATAPI_IDE1_lock db 0
|
|
||||||
ATAPI_IDE2_lock db 0
|
|
||||||
ATAPI_IDE3_lock db 0
|
|
||||||
ignore_CD_eject_wait db 0
|
|
||||||
endg
|
|
||||||
;*************************************************
|
|
||||||
;* Получить сообщение о событии или состоянии *
|
|
||||||
;* устройства *
|
|
||||||
;* Входные параметры передаются через глобальные *
|
|
||||||
;* переменные: *
|
|
||||||
;* 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 - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
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 - номер диска на канале. *
|
|
||||||
;*************************************************
|
|
||||||
;ReadCapacity:
|
|
||||||
; pusha
|
|
||||||
;; Очистить буфер пакетной команды
|
|
||||||
; call clear_packet_buffer
|
|
||||||
;; Задать размер буфера в байтах
|
|
||||||
; mov [CDBlockSize],8
|
|
||||||
;; Сформировать команду 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
|
|
||||||
ret
|
|
@ -1,271 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision$
|
|
||||||
|
|
||||||
|
|
||||||
sys_cd_audio:
|
|
||||||
|
|
||||||
cmp word [cdbase],word 0
|
|
||||||
jnz @f
|
|
||||||
mov eax,1
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
|
|
||||||
; eax=1 cdplay at ebx 0x00FFSSMM
|
|
||||||
; eax=2 get tracklist size of ecx to [ebx]
|
|
||||||
; eax=3 stop/pause playing
|
|
||||||
|
|
||||||
cmp eax,1
|
|
||||||
jnz nocdp
|
|
||||||
call sys_cdplay
|
|
||||||
ret
|
|
||||||
nocdp:
|
|
||||||
|
|
||||||
cmp eax,2
|
|
||||||
jnz nocdtl
|
|
||||||
mov edi,[TASK_BASE]
|
|
||||||
add edi,TASKDATA.mem_start
|
|
||||||
add ebx,[edi]
|
|
||||||
call sys_cdtracklist
|
|
||||||
ret
|
|
||||||
nocdtl:
|
|
||||||
|
|
||||||
cmp eax,3
|
|
||||||
jnz nocdpause
|
|
||||||
call sys_cdpause
|
|
||||||
ret
|
|
||||||
nocdpause:
|
|
||||||
|
|
||||||
mov eax,0xffffff01
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sys_cd_atapi_command:
|
|
||||||
|
|
||||||
pushad
|
|
||||||
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,6
|
|
||||||
mov ax,word [cdid]
|
|
||||||
out dx,al
|
|
||||||
mov esi,10
|
|
||||||
call delay_ms
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
in al,dx
|
|
||||||
and al,0x80
|
|
||||||
cmp al,0
|
|
||||||
jnz res
|
|
||||||
jmp cdl6
|
|
||||||
res:
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
mov al,0x8
|
|
||||||
out dx,al
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,0x206
|
|
||||||
mov al,0xe
|
|
||||||
out dx,al
|
|
||||||
mov esi,1
|
|
||||||
call delay_ms
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,0x206
|
|
||||||
mov al,0x8
|
|
||||||
out dx,al
|
|
||||||
mov esi,30
|
|
||||||
call delay_ms
|
|
||||||
xor cx,cx
|
|
||||||
cdl5:
|
|
||||||
inc cx
|
|
||||||
cmp cx,10
|
|
||||||
jz cdl6
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
in al,dx
|
|
||||||
and al,0x88
|
|
||||||
cmp al,0x00
|
|
||||||
jz cdl5
|
|
||||||
mov esi,100
|
|
||||||
call delay_ms
|
|
||||||
jmp cdl5
|
|
||||||
cdl6:
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,4
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,5
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
mov al,0xec
|
|
||||||
out dx,al
|
|
||||||
mov esi,5
|
|
||||||
call delay_ms
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,1
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
add dx,1
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
add dx,1
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
add dx,1
|
|
||||||
mov al,0
|
|
||||||
out dx,al
|
|
||||||
add dx,1
|
|
||||||
mov al,128
|
|
||||||
out dx,al
|
|
||||||
add dx,2
|
|
||||||
mov al,0xa0
|
|
||||||
out dx,al
|
|
||||||
xor cx,cx
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
cdl1:
|
|
||||||
inc cx
|
|
||||||
cmp cx,100
|
|
||||||
jz cdl2
|
|
||||||
in al,dx
|
|
||||||
and ax,0x88
|
|
||||||
cmp al,0x8
|
|
||||||
jz cdl2
|
|
||||||
mov esi,2
|
|
||||||
call delay_ms
|
|
||||||
jmp cdl1
|
|
||||||
cdl2:
|
|
||||||
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
sys_cdplay:
|
|
||||||
|
|
||||||
mov ax,5
|
|
||||||
push ax
|
|
||||||
push ebx
|
|
||||||
cdplay:
|
|
||||||
call sys_cd_atapi_command
|
|
||||||
cli
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
mov ax,0x0047
|
|
||||||
out dx,ax
|
|
||||||
mov al,1
|
|
||||||
mov ah,[esp+0] ; min xx
|
|
||||||
out dx,ax
|
|
||||||
mov ax,[esp+1] ; fr sec
|
|
||||||
out dx,ax
|
|
||||||
mov ax,256+99
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0001
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0000
|
|
||||||
out dx,ax
|
|
||||||
mov esi,10
|
|
||||||
call delay_ms
|
|
||||||
sti
|
|
||||||
add dx,7
|
|
||||||
in al,dx
|
|
||||||
test al,1
|
|
||||||
jz cdplayok
|
|
||||||
mov ax,[esp+4]
|
|
||||||
dec ax
|
|
||||||
mov [esp+4],ax
|
|
||||||
cmp ax,0
|
|
||||||
jz cdplayfail
|
|
||||||
jmp cdplay
|
|
||||||
cdplayfail:
|
|
||||||
cdplayok:
|
|
||||||
pop ebx
|
|
||||||
pop ax
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
sys_cdtracklist:
|
|
||||||
|
|
||||||
push ebx
|
|
||||||
tcdplay:
|
|
||||||
call sys_cd_atapi_command
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
mov ax,0x43+2*256
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,200
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0x0
|
|
||||||
out dx,ax
|
|
||||||
in al,dx
|
|
||||||
mov cx,1000
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
add dx,7
|
|
||||||
cld
|
|
||||||
cdtrnwewait:
|
|
||||||
mov esi,10
|
|
||||||
call delay_ms
|
|
||||||
in al,dx
|
|
||||||
and al,128
|
|
||||||
cmp al,0
|
|
||||||
jz cdtrl1
|
|
||||||
loop cdtrnwewait
|
|
||||||
cdtrl1:
|
|
||||||
; read the result
|
|
||||||
mov ecx,[esp+0]
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
cdtrread:
|
|
||||||
add dx,7
|
|
||||||
in al,dx
|
|
||||||
and al,8
|
|
||||||
cmp al,8
|
|
||||||
jnz cdtrdone
|
|
||||||
sub dx,7
|
|
||||||
in ax,dx
|
|
||||||
mov [ecx],ax
|
|
||||||
add ecx,2
|
|
||||||
jmp cdtrread
|
|
||||||
cdtrdone:
|
|
||||||
pop ecx
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
sys_cdpause:
|
|
||||||
|
|
||||||
call sys_cd_atapi_command
|
|
||||||
|
|
||||||
mov dx,word [cdbase]
|
|
||||||
mov ax,0x004B
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0
|
|
||||||
out dx,ax
|
|
||||||
mov ax,0
|
|
||||||
out dx,ax
|
|
||||||
|
|
||||||
mov esi,10
|
|
||||||
call delay_ms
|
|
||||||
add dx,7
|
|
||||||
in al,dx
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
@ -8,10 +8,6 @@
|
|||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
iglobal
|
|
||||||
;function pointers.
|
|
||||||
fdc_irq_func dd fdc_null
|
|
||||||
endg
|
|
||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
dmasize db 0x0
|
dmasize db 0x0
|
||||||
@ -25,47 +21,9 @@ fdc_init: ;start with clean tracks.
|
|||||||
rep stosb
|
rep stosb
|
||||||
ret
|
ret
|
||||||
|
|
||||||
fdc_irq:
|
;fdc_irq:
|
||||||
call [fdc_irq_func]
|
|
||||||
fdc_null:
|
fdc_null:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
save_image:
|
|
||||||
call reserve_flp
|
|
||||||
call restorefatchain
|
|
||||||
pusha
|
|
||||||
call check_label
|
|
||||||
cmp [FDC_Status],0
|
|
||||||
jne unnecessary_save_image
|
|
||||||
mov [FDD_Track],0 ; Öèëèíäð
|
|
||||||
mov [FDD_Head],0 ; Ñòîðîíà
|
|
||||||
mov [FDD_Sector],1 ; Ñåêòîð
|
|
||||||
mov esi,RAMDISK
|
|
||||||
call SeekTrack
|
|
||||||
save_image_1:
|
|
||||||
push esi
|
|
||||||
call take_data_from_application_1
|
|
||||||
pop esi
|
|
||||||
add esi,512
|
|
||||||
call WriteSectWithRetr
|
|
||||||
; call WriteSector
|
|
||||||
cmp [FDC_Status],0
|
|
||||||
jne unnecessary_save_image
|
|
||||||
inc [FDD_Sector]
|
|
||||||
cmp [FDD_Sector],19
|
|
||||||
jne save_image_1
|
|
||||||
mov [FDD_Sector],1
|
|
||||||
inc [FDD_Head]
|
|
||||||
cmp [FDD_Head],2
|
|
||||||
jne save_image_1
|
|
||||||
mov [FDD_Head],0
|
|
||||||
inc [FDD_Track]
|
|
||||||
call SeekTrack
|
|
||||||
cmp [FDD_Track],80
|
|
||||||
jne save_image_1
|
|
||||||
unnecessary_save_image:
|
|
||||||
mov [fdc_irq_func],fdc_null
|
|
||||||
popa
|
|
||||||
mov [flp_status],0
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ p_irq6:
|
|||||||
mov edi, 6
|
mov edi, 6
|
||||||
cmp [v86_irqhooks+edi*8], 0
|
cmp [v86_irqhooks+edi*8], 0
|
||||||
jnz v86_irq2
|
jnz v86_irq2
|
||||||
call fdc_irq
|
; call fdc_irq
|
||||||
call ready_for_next_irq
|
call ready_for_next_irq
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
iret
|
iret
|
||||||
@ -684,10 +684,10 @@ term9:
|
|||||||
; jnz @f
|
; jnz @f
|
||||||
; call free_cd_channel
|
; call free_cd_channel
|
||||||
; and [cd_status], 0
|
; and [cd_status], 0
|
||||||
@@:
|
;@@:
|
||||||
cmp [flp_status], esi
|
; cmp [flp_status], esi
|
||||||
jnz @f
|
; jnz @f
|
||||||
and [flp_status], 0
|
; and [flp_status], 0
|
||||||
@@:
|
@@:
|
||||||
pop esi
|
pop esi
|
||||||
cmp [bgrlockpid], esi
|
cmp [bgrlockpid], esi
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2934,3 +2934,50 @@ fs_HdDelete:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
; \end{diamond}
|
; \end{diamond}
|
||||||
|
|
||||||
|
|
||||||
|
; \begin{diamond}
|
||||||
|
fat_find_lfn:
|
||||||
|
; in: esi->name
|
||||||
|
; [esp+4] = next
|
||||||
|
; [esp+8] = first
|
||||||
|
; [esp+C]... - possibly parameters for first and next
|
||||||
|
; out: CF=1 - file not found
|
||||||
|
; else CF=0, esi->next name component, edi->direntry
|
||||||
|
pusha
|
||||||
|
lea eax, [esp+0Ch+20h]
|
||||||
|
call dword [eax-4]
|
||||||
|
jc .reterr
|
||||||
|
sub esp, 262*2 ; reserve place for LFN
|
||||||
|
mov ebp, esp
|
||||||
|
push 0 ; for fat_get_name: read ASCII name
|
||||||
|
.l1:
|
||||||
|
call fat_get_name
|
||||||
|
jc .l2
|
||||||
|
call fat_compare_name
|
||||||
|
jz .found
|
||||||
|
.l2:
|
||||||
|
lea eax, [esp+0Ch+20h+262*2+4]
|
||||||
|
call dword [eax-8]
|
||||||
|
jnc .l1
|
||||||
|
add esp, 262*2+4
|
||||||
|
.reterr:
|
||||||
|
stc
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
.found:
|
||||||
|
add esp, 262*2+4
|
||||||
|
; if this is LFN entry, advance to true entry
|
||||||
|
cmp byte [edi+11], 0xF
|
||||||
|
jnz @f
|
||||||
|
lea eax, [esp+0Ch+20h]
|
||||||
|
call dword [eax-8]
|
||||||
|
jc .reterr
|
||||||
|
@@:
|
||||||
|
add esp, 8 ; CF=0
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,49 +268,49 @@ endg
|
|||||||
|
|
||||||
;********************************************************************
|
;********************************************************************
|
||||||
mov eax,[edi+1]
|
mov eax,[edi+1]
|
||||||
cmp eax,'FD '
|
; cmp eax,'FD '
|
||||||
je fs_yesflpdisk
|
; je fs_yesflpdisk
|
||||||
cmp eax,'FLOP'
|
; cmp eax,'FLOP'
|
||||||
jne fs_noflpdisk
|
jne fs_noflpdisk
|
||||||
|
|
||||||
fs_yesflpdisk:
|
; fs_yesflpdisk:
|
||||||
call reserve_flp
|
; call reserve_flp
|
||||||
|
|
||||||
cmp byte [edi+1+11],0
|
; cmp byte [edi+1+11],0
|
||||||
je fs_give_dir1
|
; je fs_give_dir1
|
||||||
|
|
||||||
mov eax,[edi+1+12]
|
; mov eax,[edi+1+12]
|
||||||
cmp eax,'1 '
|
; cmp eax,'1 '
|
||||||
je fs_yesflpdisk_first
|
; je fs_yesflpdisk_first
|
||||||
cmp eax,'FIRS'
|
; cmp eax,'FIRS'
|
||||||
je fs_yesflpdisk_first
|
; je fs_yesflpdisk_first
|
||||||
cmp eax,'2 '
|
; cmp eax,'2 '
|
||||||
je fs_yesflpdisk_second
|
; je fs_yesflpdisk_second
|
||||||
cmp eax,'SECO'
|
; cmp eax,'SECO'
|
||||||
jne fs_noflpdisk
|
; jne fs_noflpdisk
|
||||||
jmp fs_yesflpdisk_second
|
; jmp fs_yesflpdisk_second
|
||||||
|
|
||||||
fs_yesflpdisk_first:
|
; fs_yesflpdisk_first:
|
||||||
mov [flp_number],1
|
; mov [flp_number],1
|
||||||
jmp fs_yesflpdisk_start
|
; jmp fs_yesflpdisk_start
|
||||||
fs_yesflpdisk_second:
|
; fs_yesflpdisk_second:
|
||||||
mov [flp_number],2
|
; mov [flp_number],2
|
||||||
fs_yesflpdisk_start:
|
; fs_yesflpdisk_start:
|
||||||
cmp dword [esp+20],0 ; READ
|
; cmp dword [esp+20],0 ; READ
|
||||||
jne fs_noflpdisk_read
|
; jne fs_noflpdisk_read
|
||||||
|
|
||||||
mov eax,[esp+4] ; fname
|
; mov eax,[esp+4] ; fname
|
||||||
add eax,2*12+1
|
; add eax,2*12+1
|
||||||
mov ebx,[esp+16] ; block start
|
; mov ebx,[esp+16] ; block start
|
||||||
inc ebx
|
; inc ebx
|
||||||
mov ecx,[esp+12] ; block count
|
; mov ecx,[esp+12] ; block count
|
||||||
mov edx,[esp+8] ; return
|
; mov edx,[esp+8] ; return
|
||||||
mov esi,[esp+0]
|
; mov esi,[esp+0]
|
||||||
sub esi,eax
|
; sub esi,eax
|
||||||
add esi,12+1 ; file name length
|
; add esi,12+1 ; file name length
|
||||||
call floppy_fileread
|
; call floppy_fileread
|
||||||
|
|
||||||
jmp file_system_return
|
; jmp file_system_return
|
||||||
|
|
||||||
|
|
||||||
fs_noflpdisk_read:
|
fs_noflpdisk_read:
|
||||||
|
@ -22,12 +22,6 @@ rootdirs:
|
|||||||
db 7,'ramdisk'
|
db 7,'ramdisk'
|
||||||
dd fs_OnRamdisk
|
dd fs_OnRamdisk
|
||||||
dd fs_NextRamdisk
|
dd fs_NextRamdisk
|
||||||
db 2,'fd'
|
|
||||||
dd fs_OnFloppy
|
|
||||||
dd fs_NextFloppy
|
|
||||||
db 10,'floppydisk'
|
|
||||||
dd fs_OnFloppy
|
|
||||||
dd fs_NextFloppy
|
|
||||||
db 3,'hd0'
|
db 3,'hd0'
|
||||||
dd fs_OnHd0
|
dd fs_OnHd0
|
||||||
dd fs_NextHd0
|
dd fs_NextHd0
|
||||||
@ -441,37 +435,6 @@ fs_RamdiskServices:
|
|||||||
dd fs_RamdiskCreateFolder
|
dd fs_RamdiskCreateFolder
|
||||||
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
|
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
|
||||||
|
|
||||||
fs_OnFloppy:
|
|
||||||
cmp ecx, 2
|
|
||||||
ja file_system_lfn.notfound
|
|
||||||
mov eax, [ebx]
|
|
||||||
cmp eax, fs_NumFloppyServices
|
|
||||||
jae fs_OnRamdisk.not_impl
|
|
||||||
call reserve_flp
|
|
||||||
mov [flp_number], cl
|
|
||||||
mov ecx, [ebx+12]
|
|
||||||
mov edx, [ebx+16]
|
|
||||||
; add edx, std_application_base_address
|
|
||||||
add ebx, 4
|
|
||||||
call dword [fs_FloppyServices + eax*4]
|
|
||||||
and [flp_status], 0
|
|
||||||
mov [image_of_eax], eax
|
|
||||||
mov [image_of_ebx], ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
fs_FloppyServices:
|
|
||||||
dd fs_FloppyRead
|
|
||||||
dd fs_FloppyReadFolder
|
|
||||||
dd fs_FloppyRewrite
|
|
||||||
dd fs_FloppyWrite
|
|
||||||
dd fs_FloppySetFileEnd
|
|
||||||
dd fs_FloppyGetFileInfo
|
|
||||||
dd fs_FloppySetFileInfo
|
|
||||||
dd 0
|
|
||||||
dd fs_FloppyDelete
|
|
||||||
dd fs_FloppyCreateFolder
|
|
||||||
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
|
|
||||||
|
|
||||||
fs_OnHd0:
|
fs_OnHd0:
|
||||||
call reserve_hd1
|
call reserve_hd1
|
||||||
mov [hdbase], 0x1F0
|
mov [hdbase], 0x1F0
|
||||||
|
@ -695,7 +695,7 @@ include 'vmodeld.inc'
|
|||||||
; STACK AND FDC
|
; STACK AND FDC
|
||||||
|
|
||||||
call stack_init
|
call stack_init
|
||||||
call fdc_init
|
; call fdc_init
|
||||||
|
|
||||||
|
|
||||||
; LOAD DEFAULT SKIN
|
; LOAD DEFAULT SKIN
|
||||||
@ -1998,23 +1998,8 @@ version_inf:
|
|||||||
version_end:
|
version_end:
|
||||||
endg
|
endg
|
||||||
|
|
||||||
sys_cachetodiskette:
|
sys_cachetodiskette: ; << removed
|
||||||
cmp ebx, 1
|
mov [esp + 32], ebx
|
||||||
jne .no_floppy_a_save
|
|
||||||
mov [flp_number], 1
|
|
||||||
jmp .save_image_on_floppy
|
|
||||||
.no_floppy_a_save:
|
|
||||||
cmp ebx, 2
|
|
||||||
jne .no_floppy_b_save
|
|
||||||
mov [flp_number], 2
|
|
||||||
.save_image_on_floppy:
|
|
||||||
call save_image
|
|
||||||
mov [esp + 32], dword 0
|
|
||||||
cmp [FDC_Status], 0
|
|
||||||
je .yes_floppy_save
|
|
||||||
.no_floppy_b_save:
|
|
||||||
mov [esp + 32], dword 1
|
|
||||||
.yes_floppy_save:
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
|
@ -211,7 +211,7 @@ include "gui/button.inc"
|
|||||||
include "fs/fs.inc" ; syscall
|
include "fs/fs.inc" ; syscall
|
||||||
include "fs/fat32.inc" ; read / write for fat32 filesystem
|
include "fs/fat32.inc" ; read / write for fat32 filesystem
|
||||||
include "fs/ntfs.inc" ; read / write for ntfs filesystem
|
include "fs/ntfs.inc" ; read / write for ntfs filesystem
|
||||||
include "fs/fat12.inc" ; read / write for fat12 filesystem
|
;include "fs/fat12.inc" ; read / write for fat12 filesystem
|
||||||
include "blkdev/rd.inc" ; ramdisk read /write
|
include "blkdev/rd.inc" ; ramdisk read /write
|
||||||
include "fs/fs_lfn.inc" ; syscall, version 2
|
include "fs/fs_lfn.inc" ; syscall, version 2
|
||||||
;include "fs/iso9660.inc" ; read for iso9660 filesystem CD
|
;include "fs/iso9660.inc" ; read for iso9660 filesystem CD
|
||||||
@ -253,7 +253,7 @@ include "bus/user/special.inc"
|
|||||||
; Floppy drive controller
|
; Floppy drive controller
|
||||||
|
|
||||||
include "blkdev/fdc.inc"
|
include "blkdev/fdc.inc"
|
||||||
include "blkdev/flp_drv.inc"
|
;include "blkdev/flp_drv.inc"
|
||||||
|
|
||||||
; IDE cache
|
; IDE cache
|
||||||
include "blkdev/ide_cache.inc"
|
include "blkdev/ide_cache.inc"
|
||||||
@ -261,11 +261,6 @@ include "blkdev/ide_cache.inc"
|
|||||||
; HD drive controller
|
; HD drive controller
|
||||||
include "blkdev/hd_drv.inc"
|
include "blkdev/hd_drv.inc"
|
||||||
|
|
||||||
; CD drive controller
|
|
||||||
|
|
||||||
;include "blkdev/cdrom.inc"
|
|
||||||
;include "blkdev/cd_drv.inc"
|
|
||||||
|
|
||||||
; Character devices
|
; Character devices
|
||||||
|
|
||||||
include "hid/keyboard.inc"
|
include "hid/keyboard.inc"
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
; C402 -> C7FF window position in stack
|
; C402 -> C7FF window position in stack
|
||||||
; D000 -> D1FF FDC controller
|
; D000 -> D1FF FDC controller
|
||||||
; D200 -> D3FF FDC controller for Fat12
|
; D200 -> D3FF FDC controller for Fat12
|
||||||
|
; - D201..D2A1 cleaned in fdc.init (fs/fdc.inc)
|
||||||
; D400 -> DFFF free (3k)
|
; D400 -> DFFF free (3k)
|
||||||
|
|
||||||
; E000 -> F9FF free (6k5)
|
; E000 -> F9FF free (6k5)
|
||||||
|
Loading…
Reference in New Issue
Block a user