modified kernel/trunk/blkdev/fdc.inc
modified kernel/trunk/blkdev/flp_drv.inc modified kernel/trunk/blkdev/rd.inc modified kernel/trunk/kernel.asm git-svn-id: svn://kolibrios.org@19 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
1 parent
ce4fc00ad6
commit
e0427dd723
4 files changed
+253
-605
No files matched your search
+43
-339
@@ -1,24 +1,6 @@
|
||||
;### fdc.inc ### Menuetos floppy stuff.
|
||||
;Version 0.2: Write individual tracks. / Sync ramdisk <-> floppy
|
||||
;Version 0.1: Write full ramdisk to floppy.
|
||||
;гloppyright Tolle.
|
||||
|
||||
;depends on:
|
||||
;restorefatchain
|
||||
;memmove
|
||||
;Int 6 (sys32.inc) should call fdc_irq func.
|
||||
;The ramdisk should be at 0x100000
|
||||
|
||||
;Keeping track of the tracks.
|
||||
iglobal
|
||||
cylinder db 0
|
||||
sector db 1
|
||||
head db 0
|
||||
|
||||
;Memory and dma variables.
|
||||
fdcmem dd 0x100000
|
||||
cpymem dd 0x100000
|
||||
dmamem dd 0x100000
|
||||
;function pointers.
|
||||
fdc_irq_func dd fdc_null
|
||||
endg
|
||||
|
||||
uglobal
|
||||
@@ -26,29 +8,6 @@ uglobal
|
||||
dmamode db 0x0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
;function pointers.
|
||||
fdc_irq_func dd fdc_null
|
||||
fdc_pump_func dd fdc_null
|
||||
endg
|
||||
|
||||
uglobal
|
||||
;General stuff
|
||||
fdc_st0 db 0 ;status register 0 of last resultphase.
|
||||
fdc_mutex db 0 ;wait in line. (Block calling app)
|
||||
fdc_callspending db 0 ;mystery sauce
|
||||
fdc_settings dd 0 ;bitfield.
|
||||
endg
|
||||
;Bit 0 enable direct file write [yes/no]
|
||||
|
||||
fdc_set: ;ebx: fdc_settings bitfield.
|
||||
mov [fdc_settings],ebx
|
||||
ret
|
||||
|
||||
fdc_get: ;returns fdc_settings in ecx
|
||||
mov ecx, [fdc_settings]
|
||||
ret
|
||||
|
||||
fdc_init: ;start with clean tracks.
|
||||
mov edi,0xD201
|
||||
mov al,0
|
||||
@@ -68,302 +27,47 @@ fdc_filesave: ;ebx: cluster to be saved.
|
||||
popa
|
||||
ret
|
||||
|
||||
|
||||
fdc_writeramdisk: ;mark all tracks as dirty.
|
||||
mov edi,0xD201
|
||||
mov al,1
|
||||
mov ecx,160
|
||||
rep stosb
|
||||
jmp fdc_commitflush
|
||||
fdc_commitfile: ;flush dirty tracks to floppy
|
||||
test [fdc_settings],1 ;...but only if this is really wanted by the user.
|
||||
je fdc_commitend
|
||||
fdc_commitflush:
|
||||
cmp [fdc_callspending],5
|
||||
je fdc_commitend
|
||||
inc [fdc_callspending]
|
||||
cmp [fdc_callspending],1
|
||||
je fdc_commitonce
|
||||
fdc_commitend:
|
||||
ret
|
||||
|
||||
fdc_commitonce: ;One at a time.
|
||||
.stall:
|
||||
cli
|
||||
cmp [fdc_mutex],0
|
||||
jne .stallret
|
||||
mov [fdc_mutex],1
|
||||
jmp .goahead
|
||||
.stallret:
|
||||
sti
|
||||
jmp .stall
|
||||
.goahead:
|
||||
sti
|
||||
|
||||
fdc_commitramdisk:
|
||||
|
||||
call restorefatchain
|
||||
;Move the bootsector to a safe place.
|
||||
mov eax,0x100000
|
||||
mov ebx,0xD000
|
||||
mov ecx,512
|
||||
call memmove
|
||||
;Always write the FAT table
|
||||
mov eax,0xD201
|
||||
mov [eax],byte 1
|
||||
inc eax
|
||||
mov [eax],byte 1
|
||||
|
||||
mov [dmamode],0x4A ;read from memory to floppy.
|
||||
mov [dmasize],0x1 ;read 512 bytes sectors.
|
||||
mov [fdc_irq_func],fdc_commitramdisk1
|
||||
call fdc_floppy_on ;start floppy A: moter starts interruptflow.
|
||||
ret
|
||||
fdc_commitramdisk1:
|
||||
mov [fdc_irq_func],fdc_recalibrate_result
|
||||
mov [fdc_pump_func],fdc_commitramdisk2
|
||||
call fdc_recalibrate ;retract the head to cylinder 0, sector 1
|
||||
ret
|
||||
fdc_commitramdisk2:
|
||||
mov[head],0 ;set variables.
|
||||
mov[cylinder],0
|
||||
mov [sector],1
|
||||
mov[cpymem],0x102400
|
||||
mov [fdc_pump_func],fdc_fullpump
|
||||
call fdc_write ;fdc_write will continue interruptflow
|
||||
ret
|
||||
|
||||
fdc_fullpump:
|
||||
add [dmamem],512
|
||||
add [sector],1
|
||||
cmp [sector],19
|
||||
jne .clusterwrite
|
||||
sub [dmamem],9216
|
||||
mov eax,[cpymem]
|
||||
mov ebx,[fdcmem]
|
||||
mov ecx,9216
|
||||
call memmove
|
||||
add [cpymem],9216
|
||||
cmp [head],0
|
||||
je .nocylinderchange
|
||||
add [cylinder],1
|
||||
.nocylinderchange:
|
||||
xor [head],1
|
||||
cmp [cylinder],80
|
||||
jne .noendofwrite
|
||||
mov[fdc_irq_func],fdc_complete
|
||||
call fdc_floppy_off
|
||||
call fdc_init
|
||||
jmp .end
|
||||
.noendofwrite:
|
||||
mov [sector],1
|
||||
.clusterwrite:
|
||||
xor eax,eax
|
||||
mov al,[cylinder]
|
||||
shl eax,1
|
||||
add al,[head]
|
||||
add eax,0xD201
|
||||
mov bl,[eax]
|
||||
cmp bl,1
|
||||
jne fdc_fullpump
|
||||
call fdc_write
|
||||
.end:
|
||||
ret
|
||||
|
||||
fdc_write:
|
||||
call fdc_program_dma
|
||||
call fdc_seek
|
||||
ret
|
||||
|
||||
fdc_seek:
|
||||
mov al, 0x0f
|
||||
call fdc_write_reg
|
||||
mov al,[head]
|
||||
shl al,2
|
||||
call fdc_write_reg
|
||||
mov al,[cylinder]
|
||||
call fdc_write_reg
|
||||
mov [fdc_irq_func],fdc_seek_result
|
||||
ret
|
||||
|
||||
fdc_seek_result:
|
||||
call fdc_sensei
|
||||
cmp al,[cylinder]
|
||||
je .succes
|
||||
call fdc_seek
|
||||
jmp .end
|
||||
.succes:
|
||||
call fdc_write_sector
|
||||
.end:
|
||||
ret
|
||||
|
||||
fdc_write_sector:
|
||||
mov al,0x45 ;write sector command
|
||||
fdc_commandphase:
|
||||
call fdc_write_reg
|
||||
mov al,[head]
|
||||
shl al,2
|
||||
call fdc_write_reg
|
||||
mov al,[cylinder]
|
||||
call fdc_write_reg
|
||||
mov al,[head]
|
||||
call fdc_write_reg
|
||||
mov al,[sector]
|
||||
call fdc_write_reg
|
||||
mov al,2 ;Sector size (2 ~> 512 bytes)
|
||||
call fdc_write_reg
|
||||
mov al,18 ;last sector on track.
|
||||
call fdc_write_reg
|
||||
mov al,27 ;length of GAP3
|
||||
call fdc_write_reg
|
||||
mov al,0xFF ;data length, ignored.
|
||||
call fdc_write_reg
|
||||
mov [fdc_irq_func],fdc_resultphase
|
||||
ret
|
||||
|
||||
fdc_resultphase:
|
||||
call fdc_read_reg
|
||||
mov [fdc_st0],al
|
||||
mov cx,6
|
||||
.readresult:
|
||||
call fdc_read_reg
|
||||
loop .readresult
|
||||
and [fdc_st0],11000000b
|
||||
cmp [fdc_st0],byte 0
|
||||
jz .succes
|
||||
call fdc_seek
|
||||
jmp .end
|
||||
.succes:
|
||||
call [fdc_pump_func]
|
||||
.end:
|
||||
ret
|
||||
|
||||
fdc_sensei:
|
||||
mov al,0x08 ;get interrupt status command
|
||||
call fdc_write_reg
|
||||
call fdc_read_reg ;get result in al;
|
||||
and al,0x80
|
||||
cmp al,0x80
|
||||
je fdc_sensei ;retry
|
||||
call fdc_read_reg
|
||||
ret
|
||||
|
||||
fdc_program_dma:
|
||||
mov al,0
|
||||
out 0x0c,al ; reset the flip-flop to a known state.
|
||||
mov al,6 ; mask channel 2 so we can reprogram it.
|
||||
out 0x0a,al
|
||||
mov al,[dmamode] ; 0x46 -> Read from floppy - 0x4A Write to floppy
|
||||
out 0x0b,al
|
||||
mov al,0
|
||||
out 0x0c,al ; reset the flip-flop to a known state.
|
||||
mov eax,[dmamem]
|
||||
out 0x04,al ; set the channel 2 starting address to 0
|
||||
shr eax,8
|
||||
out 0x04,al
|
||||
shr eax,8
|
||||
out 0x81,al
|
||||
mov al,0
|
||||
out 0x0c, al ; reset flip-flop
|
||||
mov al, 0xff ;set count (actual size -1)
|
||||
out 0x5, al
|
||||
mov al, [dmasize] ;(0x1ff = 511 / 0x23ff =9215)
|
||||
out 0x5,al
|
||||
mov al,2
|
||||
out 0xa,al
|
||||
ret
|
||||
|
||||
fdc_recalibrate:
|
||||
mov al,0x07 ;calibrate command
|
||||
call fdc_write_reg
|
||||
mov al,0 ;select drive 0
|
||||
call fdc_write_reg
|
||||
ret
|
||||
|
||||
fdc_recalibrate_result:
|
||||
mov al,0x08 ;get interrupt status command
|
||||
call fdc_write_reg ;send it
|
||||
call fdc_read_reg ;get command in al;
|
||||
cmp al,0x80
|
||||
je fdc_recalibrate_result
|
||||
mov ah,al
|
||||
call fdc_read_reg
|
||||
cmp ah,0x70
|
||||
jne .end
|
||||
call fdc_recalibrate
|
||||
jmp .reallyend
|
||||
.end:
|
||||
call [fdc_pump_func]
|
||||
.reallyend:
|
||||
ret
|
||||
|
||||
fdc_busy:
|
||||
.command_check:
|
||||
mov dx,0x3F4
|
||||
in al,dx
|
||||
and al,0x10
|
||||
cmp al,0x10
|
||||
je .command_check
|
||||
ret
|
||||
|
||||
fdc_read_reg:
|
||||
status_check:
|
||||
mov dx,0x3F4
|
||||
in al,dx
|
||||
and al,0xc0
|
||||
cmp al,0xc0
|
||||
jne status_check
|
||||
mov dx, 0x3F5
|
||||
in al, dx
|
||||
ret
|
||||
|
||||
fdc_write_reg:
|
||||
mov bl,al
|
||||
.command_check:
|
||||
mov dx,0x3F4
|
||||
in al,dx
|
||||
and al,0x80
|
||||
cmp al,0x80
|
||||
jne .command_check
|
||||
mov al,bl
|
||||
mov dx,0x3F5
|
||||
out dx,al
|
||||
ret
|
||||
|
||||
fdc_floppy_off:
|
||||
mov al,0xC
|
||||
mov dx,0x3f2
|
||||
out dx,al
|
||||
ret
|
||||
|
||||
fdc_floppy_on:
|
||||
mov dx,0x3f2
|
||||
mov al,0x0
|
||||
out dx,al
|
||||
mov al,0x1C
|
||||
out dx,al
|
||||
|
||||
mov eax,50
|
||||
call delay_hs
|
||||
ret
|
||||
|
||||
fdc_complete:
|
||||
mov eax,0xD000
|
||||
mov ebx,0x100000
|
||||
mov ecx,512
|
||||
call memmove
|
||||
|
||||
mov [fdc_irq_func],fdc_null
|
||||
mov [fdc_mutex],0
|
||||
dec [fdc_callspending]
|
||||
cmp [fdc_callspending],0
|
||||
je .realyend
|
||||
mov [fdc_mutex],1
|
||||
call fdc_commitramdisk
|
||||
.realyend:
|
||||
ret
|
||||
|
||||
fdc_irq:
|
||||
call [fdc_irq_func]
|
||||
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,0x100000
|
||||
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
|
||||
|
||||
+160
-232
@@ -1,36 +1,10 @@
|
||||
;**********************************************************
|
||||
; Непосредственная работа с контроллером гибкого диска
|
||||
; ═хяюёЁхфёЄтхээр ЁрсюЄр ё ъюэЄЁюыыхЁюь ушсъюую фшёър
|
||||
;**********************************************************
|
||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; Адаптация и доработка Mario79
|
||||
fdd_read_and_write:
|
||||
pusha
|
||||
read_sector:
|
||||
cmp eax,1
|
||||
jne write_sector
|
||||
call save_HTS_values
|
||||
call flp_readsector
|
||||
call give_back_application_data
|
||||
jmp fdd_read_end
|
||||
write_sector:
|
||||
cmp eax,2
|
||||
jne fdd_read_end
|
||||
call save_HTS_values
|
||||
call take_data_from_application
|
||||
call flp_writesector
|
||||
fdd_read_end:
|
||||
popa
|
||||
ret
|
||||
; └тЄюЁ шёїюфэюую ЄхъёЄр ╩єыръют ┬ырфшьшЁ ├хээрф№хтшў.
|
||||
; └фряЄрЎш ш фюЁрсюЄър Mario79
|
||||
|
||||
save_HTS_values:
|
||||
mov [FDD_Sector],bl
|
||||
mov [FDD_Head],bh
|
||||
shr ebx,16
|
||||
mov [FDD_Track],bl
|
||||
mov [FDD_Type],bh
|
||||
ret
|
||||
|
||||
give_back_application_data: ; переслать приложению
|
||||
give_back_application_data: ; яхЁхёырЄ№ яЁшыюцхэш■
|
||||
mov edi,[3010h]
|
||||
mov edi,[edi+10h]
|
||||
add edi,ecx
|
||||
@@ -42,7 +16,7 @@ give_back_application_data_1:
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
take_data_from_application: ; взять из приложения
|
||||
take_data_from_application: ; тч Є№ шч яЁшыюцхэш
|
||||
mov esi,[3010h]
|
||||
mov esi,[esi+10h]
|
||||
add esi,ecx
|
||||
@@ -54,77 +28,36 @@ take_data_from_application_1:
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
flp_initialization:
|
||||
; Установить новый обработчик прерывания НГМД
|
||||
call SetUserInterrupts
|
||||
; Включить мотор дисковода
|
||||
call FDDMotorON
|
||||
; Инициализировать переменные
|
||||
; mov [FDD_Track],0
|
||||
; mov [FDD_Head],0
|
||||
; mov [FDD_Sector],1
|
||||
; Провести рекалибровку и поиск нулевой дорожки
|
||||
call RecalibrateFDD
|
||||
call SeekTrack
|
||||
ret
|
||||
; ╩юф√ чртхЁ°хэш юяхЁрЎшш ё ъюэЄЁюыыхЁюь (FDC_Status)
|
||||
FDC_Normal equ 0 ;эюЁьры№эюх чртхЁ°хэшх
|
||||
FDC_TimeOut equ 1 ;ю°шсър Єрщь-рєЄр
|
||||
FDC_DiskNotFound equ 2 ;т фшёъютюфх эхЄ фшёър
|
||||
FDC_TrackNotFound equ 3 ;фюЁюцър эх эрщфхэр
|
||||
FDC_SectorNotFound equ 4 ;ёхъЄюЁ эх эрщфхэ
|
||||
|
||||
flp_readsector:
|
||||
call flp_initialization
|
||||
; Прочитать сектор
|
||||
call ReadSectWithRetr
|
||||
; call ReadSector
|
||||
; cmp [FDC_Status],0
|
||||
; jne @@SectorNotFound
|
||||
mov [fdc_irq_func],fdc_null
|
||||
; call FDDMotorOFF
|
||||
ret
|
||||
|
||||
flp_writesector:
|
||||
call flp_initialization
|
||||
; Записать сектор
|
||||
call WriteSectWithRetr
|
||||
; call WriteSector
|
||||
; cmp [FDC_Status],0
|
||||
; jne @@SectorNotFound
|
||||
mov [fdc_irq_func],fdc_null
|
||||
; call FDDMotorOFF
|
||||
ret
|
||||
|
||||
@@DiskNotFound:
|
||||
ret
|
||||
@@SectorNotFound:
|
||||
ret
|
||||
|
||||
; Коды завершения операции с контроллером (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
|
||||
|
||||
; Счетчик тиков таймера
|
||||
; ╤ўхЄўшъ Єшъют ЄрщьхЁр
|
||||
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 ?
|
||||
@@ -132,17 +65,17 @@ FDC_C DB ?
|
||||
FDC_H DB ?
|
||||
FDC_R DB ?
|
||||
FDC_N DB ?
|
||||
; Счетчик повторения операции чтения
|
||||
; ╤ўхЄўшъ яютЄюЁхэш юяхЁрЎшш ўЄхэш
|
||||
ReadRepCounter DB ?
|
||||
; Счетчик повторения операции рекалибровки
|
||||
; ╤ўхЄўшъ яютЄюЁхэш юяхЁрЎшш ЁхърышсЁютъш
|
||||
RecalRepCounter DB ?
|
||||
; Область памяти для хранения прочитанного сектора
|
||||
; ╬сырёЄ№ ярь Єш фы їЁрэхэш яЁюўшЄрээюую ёхъЄюЁр
|
||||
;FDD_DataBuffer: times 512 db 0 ;DB 512 DUP (?)
|
||||
fdd_motor_status db 0
|
||||
timer_fdd_motor dd 0
|
||||
|
||||
;*************************************
|
||||
;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
|
||||
;* ╚═╚╓╚└╦╚╟└╓╚▀ ╨┼╞╚╠└ ╧─╧ ─╦▀ ═├╠─ *
|
||||
;*************************************
|
||||
Init_FDC_DMA:
|
||||
pushad
|
||||
@@ -172,29 +105,29 @@ Init_FDC_DMA:
|
||||
ret
|
||||
|
||||
;***********************************
|
||||
;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
|
||||
;* Параметры: *
|
||||
;* AL - выводимый байт. *
|
||||
;* ╟└╧╚╤└╥▄ ┴└╔╥ ┬ ╧╬╨╥ ─└══█╒ FDC *
|
||||
;* ╧рЁрьхЄЁ√: *
|
||||
;* AL - т√тюфшь√щ срщЄ. *
|
||||
;***********************************
|
||||
FDCDataOutput:
|
||||
; pusha
|
||||
push ax cx dx
|
||||
mov AH,AL ;запомнить байт в AH
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov AH,AL ;чряюьэшЄ№ срщЄ т AH
|
||||
; ╤сЁюёшЄ№ яхЁхьхээє■ ёюёЄю эш ъюэЄЁюыыхЁр
|
||||
mov [FDC_Status],FDC_Normal
|
||||
; Проверить готовность контроллера к приему данных
|
||||
mov DX,3F4h ;(порт состояния FDC)
|
||||
xor CX,CX ;установить счетчик тайм-аута
|
||||
; ╧ЁютхЁшЄ№ уюЄютэюёЄ№ ъюэЄЁюыыхЁр ъ яЁшхьє фрээ√ї
|
||||
mov DX,3F4h ;(яюЁЄ ёюёЄю эш FDC)
|
||||
xor CX,CX ;єёЄрэютшЄ№ ёўхЄўшъ Єрщь-рєЄр
|
||||
@@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
|
||||
@@ -205,29 +138,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
|
||||
@@ -236,58 +169,52 @@ FDCDataInput:
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;* ╬┴╨└┴╬╥╫╚╩ ╧╨┼╨█┬└═╚▀ ╬╥ ╩╬═╥╨╬╦╦┼╨└ ═├╠─ *
|
||||
;*********************************************
|
||||
FDCInterrupt:
|
||||
; Разрешить прерывания
|
||||
; sti
|
||||
; push AX
|
||||
; Установить флаг прерывания
|
||||
; ╙ёЄрэютшЄ№ Їыру яЁхЁ√трэш
|
||||
mov [FDD_IntFlag],1
|
||||
; Послать команду EOI контроллеру прерываний
|
||||
; mov AL,20h
|
||||
; out 20h,AL
|
||||
; pop AX
|
||||
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: popa
|
||||
ret
|
||||
|
||||
;*********************************
|
||||
;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
|
||||
;* ┬╩╦▐╫╚╥▄ ╠╬╥╬╨ ─╚╤╩╬┬╬─└ "A:" *
|
||||
;*********************************
|
||||
FDDMotorON:
|
||||
pusha
|
||||
@@ -296,11 +223,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
|
||||
@@ -311,11 +238,12 @@ 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]
|
||||
sub eax,[TickCounter]
|
||||
cmp eax,50 ;10
|
||||
@@ -332,7 +260,7 @@ fdd_motor_on:
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ *
|
||||
;* ╤╬╒╨└═┼═╚┼ ╙╩└╟└╥┼╦▀ ┬╨┼╠┼═╚ *
|
||||
;*****************************************
|
||||
save_timer_fdd_motor:
|
||||
mov eax,[timer_ticks]
|
||||
@@ -340,22 +268,24 @@ save_timer_fdd_motor:
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА *
|
||||
;* ╧╨╬┬┼╨╩└ ╟└─┼╨╞╩╚ ┬█╩╦▐╫┼═╚▀ ╠╬╥╬╨└ *
|
||||
;*****************************************
|
||||
check_fdd_motor_status:
|
||||
cmp [fdd_motor_status],0
|
||||
je end_check_fdd_motor_status
|
||||
je end_check_fdd_motor_status_1
|
||||
mov eax,[timer_ticks]
|
||||
sub eax,[timer_fdd_motor]
|
||||
cmp eax,500
|
||||
jb end_check_fdd_motor_status
|
||||
call FDDMotorOFF
|
||||
mov [fdd_motor_status],0
|
||||
end_check_fdd_motor_status_1:
|
||||
mov [flp_status],0
|
||||
end_check_fdd_motor_status:
|
||||
ret
|
||||
|
||||
;**********************************
|
||||
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА *
|
||||
;* ┬█╩╦▐╫╚╥▄ ╠╬╥╬╨ ─╚╤╩╬┬╬─└ *
|
||||
;**********************************
|
||||
FDDMotorOFF:
|
||||
push AX
|
||||
@@ -369,35 +299,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
|
||||
@@ -408,54 +338,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:
|
||||
@@ -464,27 +394,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
|
||||
@@ -495,20 +425,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
|
||||
@@ -522,21 +451,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
|
||||
@@ -544,11 +473,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]
|
||||
@@ -564,27 +493,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
|
||||
@@ -595,20 +524,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
|
||||
@@ -621,21 +549,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
|
||||
@@ -643,11 +571,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]
|
||||
@@ -662,7 +590,7 @@ WriteSectWithRetr:
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
|
||||
;* ╧╬╦╙╫╚╥▄ ╚═╘╬╨╠└╓╚▐ ╬ ╨┼╟╙╦▄╥└╥┼ ╬╧┼╨└╓╚╚ *
|
||||
;*********************************************
|
||||
GetStatusInfo:
|
||||
push AX
|
||||
|
||||
@@ -456,11 +456,11 @@ mov [edi+22],ax ; time
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
|
||||
pusha
|
||||
cli
|
||||
call fdc_commitfile
|
||||
sti
|
||||
popa
|
||||
; pusha
|
||||
; cli
|
||||
; call fdc_commitfile
|
||||
; sti
|
||||
; popa
|
||||
|
||||
xor eax,eax ;ok write
|
||||
ret
|
||||
|
||||
+45
-29
@@ -86,7 +86,7 @@ drawbar dd __sys_drawbar
|
||||
putpixel dd __sys_putpixel
|
||||
; } mike.dld
|
||||
|
||||
version db 'Kolibri OS version 0.5.1.0 ',13,10,13,10,0
|
||||
version db 'Kolibri OS version 0.5.1.5 ',13,10,13,10,0
|
||||
;dd endofcode-0x10000
|
||||
|
||||
;db 'Boot02'
|
||||
@@ -2257,7 +2257,7 @@ keyboard_mode_sys db 0
|
||||
|
||||
iglobal
|
||||
version_inf:
|
||||
db 0,5,1,0 ; version 0.5.1.0
|
||||
db 0,5,1,5 ; version 0.5.1.5
|
||||
db UID_KOLIBRI
|
||||
db 'Kolibri',0
|
||||
version_end:
|
||||
@@ -2277,34 +2277,50 @@ main_loop_sys_getkey:
|
||||
ret
|
||||
|
||||
sys_cachetodiskette:
|
||||
pushad
|
||||
cmp eax,1
|
||||
jne no_write_all_of_ramdisk
|
||||
|
||||
call fdc_writeramdisk
|
||||
popad
|
||||
ret
|
||||
no_write_all_of_ramdisk:
|
||||
; pushad
|
||||
; cmp eax,1
|
||||
; jne no_write_all_of_ramdisk
|
||||
; call fdc_writeramdisk
|
||||
; popad
|
||||
; ret
|
||||
; no_write_all_of_ramdisk:
|
||||
; cmp eax,2
|
||||
; jne no_write_part_of_ramdisk
|
||||
; call fdc_commitflush
|
||||
; popad
|
||||
; ret
|
||||
; no_write_part_of_ramdisk:
|
||||
; cmp eax,3
|
||||
; jne no_set_fdc
|
||||
; call fdc_set
|
||||
; popad
|
||||
; ret
|
||||
; no_set_fdc:
|
||||
; cmp eax,4
|
||||
; jne no_get_fdc
|
||||
; popad
|
||||
; call fdc_get
|
||||
; mov [esp+36],ecx
|
||||
; ret
|
||||
; no_get_fdc:
|
||||
; popad
|
||||
; ret
|
||||
cmp eax,1
|
||||
jne no_floppy_a_save
|
||||
mov [flp_number],1
|
||||
jmp save_image_on_floppy
|
||||
no_floppy_a_save:
|
||||
cmp eax,2
|
||||
jne no_write_part_of_ramdisk
|
||||
call fdc_commitflush
|
||||
popad
|
||||
ret
|
||||
no_write_part_of_ramdisk:
|
||||
cmp eax,3
|
||||
jne no_set_fdc
|
||||
call fdc_set
|
||||
popad
|
||||
ret
|
||||
no_set_fdc:
|
||||
cmp eax,4
|
||||
jne no_get_fdc
|
||||
popad
|
||||
call fdc_get
|
||||
mov [esp+36],ecx
|
||||
ret
|
||||
no_get_fdc:
|
||||
popad
|
||||
jne no_floppy_b_save
|
||||
mov [flp_number],2
|
||||
save_image_on_floppy:
|
||||
call save_image
|
||||
mov [esp+36],dword 0
|
||||
cmp [FDC_Status],0
|
||||
je yes_floppy_save
|
||||
no_floppy_b_save:
|
||||
mov [esp+36],dword 1
|
||||
yes_floppy_save:
|
||||
ret
|
||||
|
||||
uglobal
|
||||
|
||||
Reference in new issue
Block a user