forked from KolibriOS/kolibrios
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$
|
||||
|
||||
|
||||
iglobal
|
||||
;function pointers.
|
||||
fdc_irq_func dd fdc_null
|
||||
endg
|
||||
|
||||
uglobal
|
||||
dmasize db 0x0
|
||||
@ -25,47 +21,9 @@ fdc_init: ;start with clean tracks.
|
||||
rep stosb
|
||||
ret
|
||||
|
||||
fdc_irq:
|
||||
call [fdc_irq_func]
|
||||
;fdc_irq:
|
||||
fdc_null:
|
||||
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
|
||||
cmp [v86_irqhooks+edi*8], 0
|
||||
jnz v86_irq2
|
||||
call fdc_irq
|
||||
; call fdc_irq
|
||||
call ready_for_next_irq
|
||||
restore_ring3_context
|
||||
iret
|
||||
@ -684,10 +684,10 @@ term9:
|
||||
; jnz @f
|
||||
; call free_cd_channel
|
||||
; and [cd_status], 0
|
||||
@@:
|
||||
cmp [flp_status], esi
|
||||
jnz @f
|
||||
and [flp_status], 0
|
||||
;@@:
|
||||
; cmp [flp_status], esi
|
||||
; jnz @f
|
||||
; and [flp_status], 0
|
||||
@@:
|
||||
pop esi
|
||||
cmp [bgrlockpid], esi
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2934,3 +2934,50 @@ fs_HdDelete:
|
||||
ret
|
||||
|
||||
; \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]
|
||||
cmp eax,'FD '
|
||||
je fs_yesflpdisk
|
||||
cmp eax,'FLOP'
|
||||
; cmp eax,'FD '
|
||||
; je fs_yesflpdisk
|
||||
; cmp eax,'FLOP'
|
||||
jne fs_noflpdisk
|
||||
|
||||
fs_yesflpdisk:
|
||||
call reserve_flp
|
||||
; fs_yesflpdisk:
|
||||
; call reserve_flp
|
||||
|
||||
cmp byte [edi+1+11],0
|
||||
je fs_give_dir1
|
||||
; cmp byte [edi+1+11],0
|
||||
; je fs_give_dir1
|
||||
|
||||
mov eax,[edi+1+12]
|
||||
cmp eax,'1 '
|
||||
je fs_yesflpdisk_first
|
||||
cmp eax,'FIRS'
|
||||
je fs_yesflpdisk_first
|
||||
cmp eax,'2 '
|
||||
je fs_yesflpdisk_second
|
||||
cmp eax,'SECO'
|
||||
jne fs_noflpdisk
|
||||
jmp fs_yesflpdisk_second
|
||||
; mov eax,[edi+1+12]
|
||||
; cmp eax,'1 '
|
||||
; je fs_yesflpdisk_first
|
||||
; cmp eax,'FIRS'
|
||||
; je fs_yesflpdisk_first
|
||||
; cmp eax,'2 '
|
||||
; je fs_yesflpdisk_second
|
||||
; cmp eax,'SECO'
|
||||
; jne fs_noflpdisk
|
||||
; jmp fs_yesflpdisk_second
|
||||
|
||||
fs_yesflpdisk_first:
|
||||
mov [flp_number],1
|
||||
jmp fs_yesflpdisk_start
|
||||
fs_yesflpdisk_second:
|
||||
mov [flp_number],2
|
||||
fs_yesflpdisk_start:
|
||||
cmp dword [esp+20],0 ; READ
|
||||
jne fs_noflpdisk_read
|
||||
; fs_yesflpdisk_first:
|
||||
; mov [flp_number],1
|
||||
; jmp fs_yesflpdisk_start
|
||||
; fs_yesflpdisk_second:
|
||||
; mov [flp_number],2
|
||||
; fs_yesflpdisk_start:
|
||||
; cmp dword [esp+20],0 ; READ
|
||||
; jne fs_noflpdisk_read
|
||||
|
||||
mov eax,[esp+4] ; fname
|
||||
add eax,2*12+1
|
||||
mov ebx,[esp+16] ; block start
|
||||
inc ebx
|
||||
mov ecx,[esp+12] ; block count
|
||||
mov edx,[esp+8] ; return
|
||||
mov esi,[esp+0]
|
||||
sub esi,eax
|
||||
add esi,12+1 ; file name length
|
||||
call floppy_fileread
|
||||
; mov eax,[esp+4] ; fname
|
||||
; add eax,2*12+1
|
||||
; mov ebx,[esp+16] ; block start
|
||||
; inc ebx
|
||||
; mov ecx,[esp+12] ; block count
|
||||
; mov edx,[esp+8] ; return
|
||||
; mov esi,[esp+0]
|
||||
; sub esi,eax
|
||||
; add esi,12+1 ; file name length
|
||||
; call floppy_fileread
|
||||
|
||||
jmp file_system_return
|
||||
; jmp file_system_return
|
||||
|
||||
|
||||
fs_noflpdisk_read:
|
||||
|
@ -22,12 +22,6 @@ rootdirs:
|
||||
db 7,'ramdisk'
|
||||
dd fs_OnRamdisk
|
||||
dd fs_NextRamdisk
|
||||
db 2,'fd'
|
||||
dd fs_OnFloppy
|
||||
dd fs_NextFloppy
|
||||
db 10,'floppydisk'
|
||||
dd fs_OnFloppy
|
||||
dd fs_NextFloppy
|
||||
db 3,'hd0'
|
||||
dd fs_OnHd0
|
||||
dd fs_NextHd0
|
||||
@ -441,37 +435,6 @@ fs_RamdiskServices:
|
||||
dd fs_RamdiskCreateFolder
|
||||
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:
|
||||
call reserve_hd1
|
||||
mov [hdbase], 0x1F0
|
||||
|
@ -695,7 +695,7 @@ include 'vmodeld.inc'
|
||||
; STACK AND FDC
|
||||
|
||||
call stack_init
|
||||
call fdc_init
|
||||
; call fdc_init
|
||||
|
||||
|
||||
; LOAD DEFAULT SKIN
|
||||
@ -1998,23 +1998,8 @@ version_inf:
|
||||
version_end:
|
||||
endg
|
||||
|
||||
sys_cachetodiskette:
|
||||
cmp ebx, 1
|
||||
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:
|
||||
sys_cachetodiskette: ; << removed
|
||||
mov [esp + 32], ebx
|
||||
ret
|
||||
|
||||
uglobal
|
||||
|
@ -211,7 +211,7 @@ include "gui/button.inc"
|
||||
include "fs/fs.inc" ; syscall
|
||||
include "fs/fat32.inc" ; read / write for fat32 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 "fs/fs_lfn.inc" ; syscall, version 2
|
||||
;include "fs/iso9660.inc" ; read for iso9660 filesystem CD
|
||||
@ -253,7 +253,7 @@ include "bus/user/special.inc"
|
||||
; Floppy drive controller
|
||||
|
||||
include "blkdev/fdc.inc"
|
||||
include "blkdev/flp_drv.inc"
|
||||
;include "blkdev/flp_drv.inc"
|
||||
|
||||
; IDE cache
|
||||
include "blkdev/ide_cache.inc"
|
||||
@ -261,11 +261,6 @@ include "blkdev/ide_cache.inc"
|
||||
; HD drive controller
|
||||
include "blkdev/hd_drv.inc"
|
||||
|
||||
; CD drive controller
|
||||
|
||||
;include "blkdev/cdrom.inc"
|
||||
;include "blkdev/cd_drv.inc"
|
||||
|
||||
; Character devices
|
||||
|
||||
include "hid/keyboard.inc"
|
||||
|
@ -80,6 +80,7 @@
|
||||
; C402 -> C7FF window position in stack
|
||||
; D000 -> D1FF FDC controller
|
||||
; D200 -> D3FF FDC controller for Fat12
|
||||
; - D201..D2A1 cleaned in fdc.init (fs/fdc.inc)
|
||||
; D400 -> DFFF free (3k)
|
||||
|
||||
; E000 -> F9FF free (6k5)
|
||||
|
Loading…
Reference in New Issue
Block a user