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:
Marat Zakiyanov (Mario79) 2005-11-06 20:01:18 +00:00
parent ce4fc00ad6
commit e0427dd723
4 changed files with 253 additions and 605 deletions

View File

@ -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 iglobal
cylinder db 0 ;function pointers.
sector db 1 fdc_irq_func dd fdc_null
head db 0
;Memory and dma variables.
fdcmem dd 0x100000
cpymem dd 0x100000
dmamem dd 0x100000
endg endg
uglobal uglobal
@ -26,29 +8,6 @@ uglobal
dmamode db 0x0 dmamode db 0x0
endg 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. fdc_init: ;start with clean tracks.
mov edi,0xD201 mov edi,0xD201
mov al,0 mov al,0
@ -68,302 +27,47 @@ fdc_filesave: ;ebx: cluster to be saved.
popa popa
ret 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: fdc_irq:
call [fdc_irq_func] 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,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

View File

@ -1,36 +1,10 @@
;********************************************************** ;**********************************************************
; <EFBFBD>¥¯®á।á⢥­­ ï à ¡®â  á ª®­â஫«¥à®¬ £¨¡ª®£® ¤¨áª  ; Непосредственная работа с контроллером гибкого диска
;********************************************************** ;**********************************************************
; €¢â®à ¨á室­®£® ⥪áâ  Šã« ª®¢ ‚« ¤¨¬¨à ƒ¥­­ ¤ì¥¢¨ç. ; Автор исходного текста Кулаков Владимир Геннадьевич.
; €¤ ¯â æ¨ï ¨ ¤®à ¡®âª  Mario79 ; Адаптация и доработка 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
save_HTS_values: give_back_application_data: ; переслать приложению
mov [FDD_Sector],bl
mov [FDD_Head],bh
shr ebx,16
mov [FDD_Track],bl
mov [FDD_Type],bh
ret
give_back_application_data: ; ¯¥à¥á« âì ¯à¨«®¦¥­¨î
mov edi,[3010h] mov edi,[3010h]
mov edi,[edi+10h] mov edi,[edi+10h]
add edi,ecx add edi,ecx
@ -42,7 +16,7 @@ give_back_application_data_1:
rep movsd rep movsd
ret ret
take_data_from_application: ; ¢§ïâì ¨§ ¯à¨«®¦¥­¨ï take_data_from_application: ; взять из приложения
mov esi,[3010h] mov esi,[3010h]
mov esi,[esi+10h] mov esi,[esi+10h]
add esi,ecx add esi,ecx
@ -54,77 +28,36 @@ take_data_from_application_1:
rep movsd rep movsd
ret ret
flp_initialization: ; Коды завершения операции с контроллером (FDC_Status)
; “áâ ­®¢¨âì ­®¢ë© ®¡à ¡®â稪 ¯à¥à뢠­¨ï <EFBFBD>ƒŒ„ FDC_Normal equ 0 ;нормальное завершение
call SetUserInterrupts FDC_TimeOut equ 1 ;ошибка тайм-аута
; ‚ª«îç¨âì ¬®â®à ¤¨áª®¢®¤  FDC_DiskNotFound equ 2 ;в дисководе нет диска
call FDDMotorON FDC_TrackNotFound equ 3 ;дорожка не найдена
; ˆ­¨æ¨ «¨§¨à®¢ âì ¯¥à¥¬¥­­ë¥ FDC_SectorNotFound equ 4 ;сектор не найден
; mov [FDD_Track],0
; mov [FDD_Head],0
; mov [FDD_Sector],1
; <EFBFBD>஢¥á⨠४ «¨¡à®¢ªã ¨ ¯®¨áª ­ã«¥¢®© ¤®à®¦ª¨
call RecalibrateFDD
call SeekTrack
ret
flp_readsector: ; Максимальные значения координат сектора (заданные
call flp_initialization ; значения соответствуют параметрам стандартного
; <EFBFBD>à®ç¨â âì ᥪâ®à ; трехдюймового гибкого диска объемом 1,44 Мб)
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 Œ¡)
MAX_Track equ 79 MAX_Track equ 79
MAX_Head equ 1 MAX_Head equ 1
MAX_Sector equ 18 MAX_Sector equ 18
; ‘ç¥â稪 ⨪®¢ â ©¬¥à  ; Счетчик тиков таймера
TickCounter dd ? TickCounter dd ?
; Š®¤ § ¢¥à襭¨ï ®¯¥à æ¨¨ á ª®­â஫«¥à®¬ <EFBFBD>ƒŒ„ ; Код завершения операции с контроллером НГМД
FDC_Status DB ? FDC_Status DB ?
; ”« £ ¯à¥à뢠­¨ï ®â <EFBFBD>ƒŒ„ ; Флаг прерывания от НГМД
FDD_IntFlag DB ? FDD_IntFlag DB ?
; Œ®¬¥­â ­ ç «  ¯®á«¥¤­¥© ®¯¥à æ¨¨ á <EFBFBD>ƒŒ„ ; Момент начала последней операции с НГМД
FDD_Time DD ? FDD_Time DD ?
; <EFBFBD>®¬¥à ¤¨áª®¢®¤  ; Номер дисковода
FDD_Type db 0 FDD_Type db 0
; Š®®à¤¨­ âë ᥪâ®à  ; Координаты сектора
FDD_Track DB ? FDD_Track DB ?
FDD_Head DB ? FDD_Head DB ?
FDD_Sector DB ? FDD_Sector DB ?
; <EFBFBD>«®ª १ã«ìâ â  ®¯¥à æ¨¨ ; Блок результата операции
FDC_ST0 DB ? FDC_ST0 DB ?
FDC_ST1 DB ? FDC_ST1 DB ?
FDC_ST2 DB ? FDC_ST2 DB ?
@ -132,17 +65,17 @@ FDC_C DB ?
FDC_H DB ? FDC_H DB ?
FDC_R DB ? FDC_R DB ?
FDC_N DB ? FDC_N DB ?
; ‘ç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ç⥭¨ï ; Счетчик повторения операции чтения
ReadRepCounter DB ? ReadRepCounter DB ?
; ‘ç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ४ «¨¡à®¢ª¨ ; Счетчик повторения операции рекалибровки
RecalRepCounter DB ? RecalRepCounter DB ?
; Ž¡« áâì ¯ ¬ï⨠¤«ï åà ­¥­¨ï ¯à®ç¨â ­­®£® ᥪâ®à  ; Область памяти для хранения прочитанного сектора
;FDD_DataBuffer: times 512 db 0 ;DB 512 DUP (?) ;FDD_DataBuffer: times 512 db 0 ;DB 512 DUP (?)
fdd_motor_status db 0 fdd_motor_status db 0
timer_fdd_motor dd 0 timer_fdd_motor dd 0
;************************************* ;*************************************
;* ˆ<EFBFBD>ˆˆˆ‡€ˆŸ <EFBFBD>…†ˆŒ€ <EFBFBD><EFBFBD> „‹Ÿ <EFBFBD>ƒŒ„ * ;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
;************************************* ;*************************************
Init_FDC_DMA: Init_FDC_DMA:
pushad pushad
@ -172,29 +105,29 @@ Init_FDC_DMA:
ret ret
;*********************************** ;***********************************
;* ‡€<EFBFBD>ˆœ <EFBFBD>€‰ <EFBFBD>Ž<EFBFBD> „€<EFBFBD><EFBFBD> FDC * ;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
;* <EFBFBD> à ¬¥âàë: * ;* Параметры: *
;* AL - ¢ë¢®¤¨¬ë© ¡ ©â. * ;* AL - выводимый байт. *
;*********************************** ;***********************************
FDCDataOutput: FDCDataOutput:
; pusha ; pusha
push ax cx dx push ax cx dx
mov AH,AL ;§ ¯®¬­¨âì ¡ ©â ¢ AH mov AH,AL ;запомнить байт в AH
; ‘¡à®á¨âì ¯¥à¥¬¥­­ãî á®áâ®ï­¨ï ª®­â஫«¥à  ; Сбросить переменную состояния контроллера
mov [FDC_Status],FDC_Normal mov [FDC_Status],FDC_Normal
; <EFBFBD>஢¥à¨âì £®â®¢­®áâì ª®­â஫«¥à  ª ¯à¨¥¬ã ¤ ­­ëå ; Проверить готовность контроллера к приему данных
mov DX,3F4h ;(¯®àâ á®áâ®ï­¨ï FDC) mov DX,3F4h ;(порт состояния FDC)
xor CX,CX ;ãáâ ­®¢¨âì áç¥â稪 â ©¬- ãâ  xor CX,CX ;установить счетчик тайм-аута
@@TestRS: @@TestRS:
in AL,DX ;¯à®ç¨â âì ॣ¨áâà RS in AL,DX ;прочитать регистр RS
and AL,0C0h ;¢ë¤¥«¨âì à §àï¤ë 6 ¨ 7 and AL,0C0h ;выделить разряды 6 и 7
cmp AL,80h ;¯à®¢¥à¨âì à §àï¤ë 6 ¨ 7 cmp AL,80h ;проверить разряды 6 и 7
je @@OutByteToFDC je @@OutByteToFDC
loop @@TestRS loop @@TestRS
; Žè¨¡ª  â ©¬- ãâ  ; Ошибка тайм-аута
mov [FDC_Status],FDC_TimeOut mov [FDC_Status],FDC_TimeOut
jmp @@End_5 jmp @@End_5
; ‚뢥á⨠¡ ©â ¢ ¯®àâ ¤ ­­ëå ; Вывести байт в порт данных
@@OutByteToFDC: @@OutByteToFDC:
inc DX inc DX
mov AL,AH mov AL,AH
@ -205,29 +138,29 @@ FDCDataOutput:
ret ret
;****************************************** ;******************************************
;* <EFBFBD><EFBFBD>Ž—ˆœ <EFBFBD>€‰ ˆ‡ <EFBFBD>Ž<EFBFBD> „€<EFBFBD><EFBFBD> FDC * ;* ПРОЧИТАТЬ БАЙТ ИЗ ПОРТА ДАННЫХ FDC *
;* <EFBFBD>à®æ¥¤ãà  ­¥ ¨¬¥¥â ¢å®¤­ëå ¯ à ¬¥â஢. * ;* Процедура не имеет входных параметров. *
;* ‚ë室­ë¥ ¤ ­­ë¥: * ;* Выходные данные: *
;* AL - áç¨â ­­ë© ¡ ©â. * ;* AL - считанный байт. *
;****************************************** ;******************************************
FDCDataInput: FDCDataInput:
push ECX push ECX
push DX push DX
; ‘¡à®á¨âì ¯¥à¥¬¥­­ãî á®áâ®ï­¨ï ª®­â஫«¥à  ; Сбросить переменную состояния контроллера
mov [FDC_Status],FDC_Normal mov [FDC_Status],FDC_Normal
; <EFBFBD>஢¥à¨âì £®â®¢­®áâì ª®­â஫«¥à  ª ¯¥à¥¤ ç¥ ¤ ­­ëå ; Проверить готовность контроллера к передаче данных
mov DX,3F4h ;(¯®àâ á®áâ®ï­¨ï FDC) mov DX,3F4h ;(порт состояния FDC)
xor CX,CX ;ãáâ ­®¢¨âì áç¥â稪 â ©¬- ãâ  xor CX,CX ;установить счетчик тайм-аута
@@TestRS_1: @@TestRS_1:
in AL,DX ;¯à®ç¨â âì ॣ¨áâà RS in AL,DX ;прочитать регистр RS
and AL,0C0h ;¢ë¤«¨âì à §àï¤ë 6 ¨ 7 and AL,0C0h ;выдлить разряды 6 и 7
cmp AL,0C0h ;¯à®¢¥à¨âì à §àï¤ë 6 ¨ 7 cmp AL,0C0h ;проверить разряды 6 и 7
je @@GetByteFromFDC je @@GetByteFromFDC
loop @@TestRS_1 loop @@TestRS_1
; Žè¨¡ª  â ©¬- ãâ  ; Ошибка тайм-аута
mov [FDC_Status],FDC_TimeOut mov [FDC_Status],FDC_TimeOut
jmp @@End_6 jmp @@End_6
; ‚¢¥á⨠¡ ©â ¨§ ¯®àâ  ¤ ­­ëå ; Ввести байт из порта данных
@@GetByteFromFDC: @@GetByteFromFDC:
inc DX inc DX
in AL,DX in AL,DX
@ -236,58 +169,52 @@ FDCDataInput:
ret ret
;********************************************* ;*********************************************
;* Ž<EFBFBD><EFBFBD><EFBFBD>ŽˆŠ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˆŸ Ž’ ŠŽ<EFBFBD><EFBFBD>Ž<EFBFBD> <EFBFBD>ƒŒ„ * ;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
;********************************************* ;*********************************************
FDCInterrupt: FDCInterrupt:
; <EFBFBD> §à¥è¨âì ¯à¥à뢠­¨ï ; Установить флаг прерывания
; sti
; push AX
; “áâ ­®¢¨âì ä« £ ¯à¥à뢠­¨ï
mov [FDD_IntFlag],1 mov [FDD_IntFlag],1
; <EFBFBD>®á« âì ª®¬ ­¤ã EOI ª®­â஫«¥àã ¯à¥à뢠­¨©
; mov AL,20h
; out 20h,AL
; pop AX
ret ret
;****************************************** ;******************************************
;* <EFBFBD>Žˆœ <EFBFBD>Ž Ž<EFBFBD><EFBFBD><EFBFBD>ŽˆŠ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˆ * ;* УСТАНОВИТЬ НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЙ *
;* <EFBFBD>ƒŒ„ * ;* НГМД *
;****************************************** ;******************************************
SetUserInterrupts: SetUserInterrupts:
mov [fdc_irq_func],FDCInterrupt mov [fdc_irq_func],FDCInterrupt
ret ret
;******************************************* ;*******************************************
;* Ž†ˆ„€<EFBFBD>ˆ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˆŸ Ž’ ŠŽ<EFBFBD><EFBFBD>Ž<EFBFBD> <EFBFBD>ƒŒ„ * ;* ОЖИДАНИЕ ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
;******************************************* ;*******************************************
WaitFDCInterrupt: WaitFDCInterrupt:
pusha pusha
; ‘¡à®á¨âì ¡ ©â á®áâ®ï­¨ï ®¯¥à æ¨¨ ; Сбросить байт состояния операции
mov [FDC_Status],FDC_Normal mov [FDC_Status],FDC_Normal
; ‘¡à®á¨âì ä« £ ¯à¥à뢠­¨ï ; Сбросить флаг прерывания
mov [FDD_IntFlag],0 mov [FDD_IntFlag],0
; Ž¡­ã«¨âì áç¥â稪 ⨪®¢ ; Обнулить счетчик тиков
mov eax,[timer_ticks] mov eax,[timer_ticks]
mov [TickCounter],eax mov [TickCounter],eax
; Ž¦¨¤ âì ãáâ ­®¢ª¨ ä« £  ¯à¥à뢠­¨ï <EFBFBD>ƒŒ„ ; Ожидать установки флага прерывания НГМД
@@TestRS_2: @@TestRS_2:
cmp [FDD_IntFlag],0 cmp [FDD_IntFlag],0
jnz @@End_7 ;¯à¥à뢠­¨¥ ¯à®¨§®è«® jnz @@End_7 ;прерывание произошло
call change_task
mov eax,[timer_ticks] mov eax,[timer_ticks]
sub eax,[TickCounter] sub eax,[TickCounter]
cmp eax,50 ;25 ;5 ;®¦¨¤ âì 5 ⨪®¢ cmp eax,50 ;25 ;5 ;ожидать 5 тиков
jb @@TestRS_2 jb @@TestRS_2
; jl @@TestRS_2 ; jl @@TestRS_2
; Žè¨¡ª  â ©¬- ãâ  ; Ошибка тайм-аута
mov [FDC_Status],FDC_TimeOut mov [FDC_Status],FDC_TimeOut
; mov [flp_status],0 ; mov [flp_status],0
@@End_7: popa @@End_7: popa
ret ret
;********************************* ;*********************************
;* ‚Š‹ž—ˆ’œ ŒŽŽ<EFBFBD> „ˆ‘ŠŽ‚Ž„€ "A:" * ;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
;********************************* ;*********************************
FDDMotorON: FDDMotorON:
pusha pusha
@ -296,11 +223,11 @@ FDDMotorON:
mov al,[flp_number] mov al,[flp_number]
cmp [fdd_motor_status],al cmp [fdd_motor_status],al
je fdd_motor_on je fdd_motor_on
; <EFBFBD>ந§¢¥á⨠á¡à®á ª®­â஫«¥à  <EFBFBD>ƒŒ„ ; Произвести сброс контроллера НГМД
mov DX,3F2h ;¯®àâ ã¯à ¢«¥­¨ï ¤¢¨£ â¥«ï¬¨ mov DX,3F2h ;порт управления двигателями
mov AL,0 mov AL,0
out DX,AL out DX,AL
; ‚ë¡à âì ¨ ¢ª«îç¨âì ¬®â®à ¤¨áª®¢®¤  ; Выбрать и включить мотор дисковода
cmp [flp_number],1 cmp [flp_number],1
jne FDDMotorON_B jne FDDMotorON_B
; call FDDMotorOFF_B ; call FDDMotorOFF_B
@ -311,11 +238,12 @@ FDDMotorON_B:
mov AL,2Dh ; Floppy B mov AL,2Dh ; Floppy B
FDDMotorON_1: FDDMotorON_1:
out DX,AL out DX,AL
; Ž¡­ã«¨âì áç¥â稪 ⨪®¢ ; Обнулить счетчик тиков
mov eax,[timer_ticks] mov eax,[timer_ticks]
mov [TickCounter],eax mov [TickCounter],eax
; Ž¦¨¤ âì 0,5 á ; Ожидать 0,5 с
@@dT: @@dT:
call change_task
mov eax,[timer_ticks] mov eax,[timer_ticks]
sub eax,[TickCounter] sub eax,[TickCounter]
cmp eax,50 ;10 cmp eax,50 ;10
@ -332,7 +260,7 @@ fdd_motor_on:
ret ret
;***************************************** ;*****************************************
;* Ž•<EFBFBD><EFBFBD><EFBFBD>ˆ“Š€‡€’…‹Ÿ <EFBFBD>…Œ…<EFBFBD>ˆ * ;* СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ *
;***************************************** ;*****************************************
save_timer_fdd_motor: save_timer_fdd_motor:
mov eax,[timer_ticks] mov eax,[timer_ticks]
@ -340,22 +268,24 @@ save_timer_fdd_motor:
ret ret
;***************************************** ;*****************************************
;* <EFBFBD><EFBFBD>Ž<EFBFBD>Š€ ‡€„…<EFBFBD>†Šˆ Šž—…<EFBFBD>ˆŸ ŒŽŽ<EFBFBD> * ;* ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА *
;***************************************** ;*****************************************
check_fdd_motor_status: check_fdd_motor_status:
cmp [fdd_motor_status],0 cmp [fdd_motor_status],0
je end_check_fdd_motor_status je end_check_fdd_motor_status_1
mov eax,[timer_ticks] mov eax,[timer_ticks]
sub eax,[timer_fdd_motor] sub eax,[timer_fdd_motor]
cmp eax,500 cmp eax,500
jb end_check_fdd_motor_status jb end_check_fdd_motor_status
call FDDMotorOFF call FDDMotorOFF
mov [fdd_motor_status],0 mov [fdd_motor_status],0
end_check_fdd_motor_status_1:
mov [flp_status],0
end_check_fdd_motor_status: end_check_fdd_motor_status:
ret ret
;********************************** ;**********************************
;* ‚›Š‹ž—ˆ’œ ŒŽŽ<EFBFBD> „ˆ‘ŠŽ‚Ž„€ * ;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА *
;********************************** ;**********************************
FDDMotorOFF: FDDMotorOFF:
push AX push AX
@ -369,35 +299,35 @@ FDDMotorOFF_1:
FDDMotorOFF_2: FDDMotorOFF_2:
pop DX pop DX
pop AX pop AX
; á¡à®á ä« £®¢ ª¥è¨à®¢ ­¨ï ¢ á¢ï§¨ á ãáâ à¥¢ ­¨¥¬ ¨­ä®à¬ æ¨¨ ; сброс флагов кеширования в связи с устареванием информации
mov [root_read],0 mov [root_read],0
mov [flp_fat],0 mov [flp_fat],0
ret ret
FDDMotorOFF_A: FDDMotorOFF_A:
mov DX,3F2h ;¯®àâ ã¯à ¢«¥­¨ï ¤¢¨£ â¥«ï¬¨ mov DX,3F2h ;порт управления двигателями
mov AL,0Ch ; Floppy A mov AL,0Ch ; Floppy A
out DX,AL out DX,AL
ret ret
FDDMotorOFF_B: FDDMotorOFF_B:
mov DX,3F2h ;¯®àâ ã¯à ¢«¥­¨ï ¤¢¨£ â¥«ï¬¨ mov DX,3F2h ;порт управления двигателями
mov AL,5h ; Floppy B mov AL,5h ; Floppy B
out DX,AL out DX,AL
ret ret
;******************************* ;*******************************
;* <EFBFBD>…Š€ˆ<EFBFBD><EFBFBD>ŽŠ€ „ˆ‘ŠŽ‚Ž„€ "A:" * ;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
;******************************* ;*******************************
RecalibrateFDD: RecalibrateFDD:
pusha pusha
call save_timer_fdd_motor call save_timer_fdd_motor
; <EFBFBD>®¤ âì ª®¬ ­¤ã "<EFBFBD>¥ª «¨¡à®¢ª " ; Подать команду "Рекалибровка"
mov AL,07h mov AL,07h
call FDCDataOutput call FDCDataOutput
mov AL,00h mov AL,00h
call FDCDataOutput call FDCDataOutput
; Ž¦¨¤ âì § ¢¥à襭¨ï ®¯¥à æ¨¨ ; Ожидать завершения операции
call WaitFDCInterrupt call WaitFDCInterrupt
; cmp [FDC_Status],0 ; cmp [FDC_Status],0
; je no_fdc_status_error ; je no_fdc_status_error
@ -408,54 +338,54 @@ RecalibrateFDD:
ret ret
;***************************************************** ;*****************************************************
;* <EFBFBD>ŽˆŠ „Ž<EFBFBD>Ž†Šˆ * ;* ПОИСК ДОРОЖКИ *
;* <EFBFBD> à ¬¥âàë ¯¥à¥¤ îâáï ç¥à¥§ £«®¡ «ì­ë¥ ¯¥à¥¬¥­­ë¥: * ;* Параметры передаются через глобальные переменные: *
;* FDD_Track - ­®¬¥à ¤®à®¦ª¨ (0-79); * ;* FDD_Track - номер дорожки (0-79); *
;* FDD_Head - ­®¬¥à £®«®¢ª¨ (0-1). * ;* FDD_Head - номер головки (0-1). *
;* <EFBFBD>¥§ã«ìâ â ®¯¥à æ¨¨ § ­®á¨âáï ¢ FDC_Status. * ;* Результат операции заносится в FDC_Status. *
;***************************************************** ;*****************************************************
SeekTrack: SeekTrack:
pusha pusha
call save_timer_fdd_motor call save_timer_fdd_motor
; <EFBFBD>®¤ âì ª®¬ ­¤ã "<EFBFBD>®¨áª" ; Подать команду "Поиск"
mov AL,0Fh mov AL,0Fh
call FDCDataOutput call FDCDataOutput
; <EFBFBD>¥à¥¤ âì ¡ ©â ­®¬¥à  £®«®¢ª¨/­ ª®¯¨â¥«ï ; Передать байт номера головки/накопителя
mov AL,[FDD_Head] mov AL,[FDD_Head]
shl AL,2 shl AL,2
call FDCDataOutput call FDCDataOutput
; <EFBFBD>¥à¥¤ âì ¡ ©â ­®¬¥à  ¤®à®¦ª¨ ; Передать байт номера дорожки
mov AL,[FDD_Track] mov AL,[FDD_Track]
call FDCDataOutput call FDCDataOutput
; Ž¦¨¤ âì § ¢¥à襭¨ï ®¯¥à æ¨¨ ; Ожидать завершения операции
call WaitFDCInterrupt call WaitFDCInterrupt
cmp [FDC_Status],FDC_Normal cmp [FDC_Status],FDC_Normal
jne @@Exit jne @@Exit
; ‘®åà ­¨âì १ã«ìâ â ¯®¨áª  ; Сохранить результат поиска
mov AL,08h mov AL,08h
call FDCDataOutput call FDCDataOutput
call FDCDataInput call FDCDataInput
mov [FDC_ST0],AL mov [FDC_ST0],AL
call FDCDataInput call FDCDataInput
mov [FDC_C],AL mov [FDC_C],AL
; <EFBFBD>஢¥à¨âì १ã«ìâ â ¯®¨áª  ; Проверить результат поиска
; <EFBFBD>®¨áª § ¢¥à襭? ; Поиск завершен?
test [FDC_ST0],100000b test [FDC_ST0],100000b
je @@Err je @@Err
; ‡ ¤ ­­ë© â४ ­ ©¤¥­? ; Заданный трек найден?
mov AL,[FDC_C] mov AL,[FDC_C]
cmp AL,[FDD_Track] cmp AL,[FDD_Track]
jne @@Err jne @@Err
; <EFBFBD>®¬¥à £®«®¢ª¨ ᮢ¯ ¤ ¥â á § ¤ ­­ë¬? ; Номер головки совпадает с заданным?
mov AL,[FDC_ST0] mov AL,[FDC_ST0]
and AL,100b and AL,100b
shr AL,2 shr AL,2
cmp AL,[FDD_Head] cmp AL,[FDD_Head]
jne @@Err jne @@Err
; Ž¯¥à æ¨ï § ¢¥à襭  ãᯥ譮 ; Операция завершена успешно
mov [FDC_Status],FDC_Normal mov [FDC_Status],FDC_Normal
jmp @@Exit jmp @@Exit
@@Err: ; ’४ ­¥ ­ ©¤¥­ @@Err: ; Трек не найден
mov [FDC_Status],FDC_TrackNotFound mov [FDC_Status],FDC_TrackNotFound
; mov [flp_status],0 ; mov [flp_status],0
@@Exit: @@Exit:
@ -464,27 +394,27 @@ SeekTrack:
ret ret
;******************************************************* ;*******************************************************
;* <EFBFBD>ˆ…ŠŽ<EFBFBD> „€<EFBFBD><EFBFBD> * ;* ЧТЕНИЕ СЕКТОРА ДАННЫХ *
;* <EFBFBD> à ¬¥âàë ¯¥à¥¤ îâáï ç¥à¥§ £«®¡ «ì­ë¥ ¯¥à¥¬¥­­ë¥: * ;* Параметры передаются через глобальные переменные: *
;* FDD_Track - ­®¬¥à ¤®à®¦ª¨ (0-79); * ;* FDD_Track - номер дорожки (0-79); *
;* FDD_Head - ­®¬¥à £®«®¢ª¨ (0-1); * ;* FDD_Head - номер головки (0-1); *
;* FDD_Sector - ­®¬¥à ᥪâ®à  (1-18). * ;* FDD_Sector - номер сектора (1-18). *
;* <EFBFBD>¥§ã«ìâ â ®¯¥à æ¨¨ § ­®á¨âáï ¢ FDC_Status. * ;* Результат операции заносится в FDC_Status. *
;* á«ãç ¥ ãᯥ譮£® ¢ë¯®«­¥­¨ï ®¯¥à æ¨¨ ç⥭¨ï * ;* В случае успешного выполнения операции чтения *
;* ᮤ¥à¦¨¬®¥ ᥪâ®à  ¡ã¤¥â § ­¥á¥­® ¢ FDD_DataBuffer. * ;* содержимое сектора будет занесено в FDD_DataBuffer. *
;******************************************************* ;*******************************************************
ReadSector: ReadSector:
pushad pushad
call save_timer_fdd_motor call save_timer_fdd_motor
; “áâ ­®¢¨âì ᪮à®áâì ¯¥à¥¤ ç¨ 500 Š¡ ©â/á ; Установить скорость передачи 500 Кбайт/с
mov AX,0 mov AX,0
mov DX,03F7h mov DX,03F7h
out DX,AL out DX,AL
; ˆ­¨æ¨ «¨§¨à®¢ âì ª ­ « ¯àאַ£® ¤®áâ㯠 ª ¯ ¬ï⨠; Инициализировать канал прямого доступа к памяти
mov [dmamode],0x46 mov [dmamode],0x46
call Init_FDC_DMA call Init_FDC_DMA
; <EFBFBD>®¤ âì ª®¬ ­¤ã "—⥭¨¥ ¤ ­­ëå" ; Подать команду "Чтение данных"
mov AL,0E6h ;ç⥭¨¥ ¢ ¬ã«ìâ¨â४®¢®¬ ०¨¬¥ mov AL,0E6h ;чтение в мультитрековом режиме
call FDCDataOutput call FDCDataOutput
mov AL,[FDD_Head] mov AL,[FDD_Head]
shl AL,2 shl AL,2
@ -495,20 +425,19 @@ ReadSector:
call FDCDataOutput call FDCDataOutput
mov AL,[FDD_Sector] mov AL,[FDD_Sector]
call FDCDataOutput call FDCDataOutput
mov AL,2 ;ª®¤ à §¬¥à  ᥪâ®à  (512 ¡ ©â) mov AL,2 ;код размера сектора (512 байт)
call FDCDataOutput call FDCDataOutput
mov AL,18 ;+1; 3Fh ;ç¨á«® ᥪâ®à®¢ ­  ¤®à®¦ª¥ mov AL,18 ;+1; 3Fh ;число секторов на дорожке
call FDCDataOutput call FDCDataOutput
mov AL,1Bh ;§­ ç¥­¨¥ GPL mov AL,1Bh ;значение GPL
call FDCDataOutput call FDCDataOutput
mov AL,0FFh ;§­ ç¥­¨¥ DTL mov AL,0FFh ;значение DTL
call FDCDataOutput call FDCDataOutput
; Ожидаем прерывание по завершении операции
; Ž¦¨¤ ¥¬ ¯à¥à뢠­¨¥ ¯® § ¢¥à襭¨¨ ®¯¥à æ¨¨
call WaitFDCInterrupt call WaitFDCInterrupt
cmp [FDC_Status],FDC_Normal cmp [FDC_Status],FDC_Normal
jne @@Exit_1 jne @@Exit_1
; ‘ç¨â뢠¥¬ áâ âãá § ¢¥à襭¨ï ®¯¥à æ¨¨ ; Считываем статус завершения операции
call GetStatusInfo call GetStatusInfo
test [FDC_ST0],11011000b test [FDC_ST0],11011000b
jnz @@Err_1 jnz @@Err_1
@ -522,21 +451,21 @@ ReadSector:
ret ret
;******************************************************* ;*******************************************************
;* <EFBFBD>ˆ…ŠŽ<EFBFBD> ( <EFBFBD>ŽŽ<EFBFBD><EFBFBD>ˆ…Œ Ž<EFBFBD><EFBFBD>ˆˆ <EFBFBD><EFBFBD>ˆ <EFBFBD>Ž…) * ;* ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
;* <EFBFBD> à ¬¥âàë ¯¥à¥¤ îâáï ç¥à¥§ £«®¡ «ì­ë¥ ¯¥à¥¬¥­­ë¥: * ;* Параметры передаются через глобальные переменные: *
;* FDD_Track - ­®¬¥à ¤®à®¦ª¨ (0-79); * ;* FDD_Track - номер дорожки (0-79); *
;* FDD_Head - ­®¬¥à £®«®¢ª¨ (0-1); * ;* FDD_Head - номер головки (0-1); *
;* FDD_Sector - ­®¬¥à ᥪâ®à  (1-18). * ;* FDD_Sector - номер сектора (1-18). *
;* <EFBFBD>¥§ã«ìâ â ®¯¥à æ¨¨ § ­®á¨âáï ¢ FDC_Status. * ;* Результат операции заносится в FDC_Status. *
;* á«ãç ¥ ãᯥ譮£® ¢ë¯®«­¥­¨ï ®¯¥à æ¨¨ ç⥭¨ï * ;* В случае успешного выполнения операции чтения *
;* ᮤ¥à¦¨¬®¥ ᥪâ®à  ¡ã¤¥â § ­¥á¥­® ¢ FDD_DataBuffer. * ;* содержимое сектора будет занесено в FDD_DataBuffer. *
;******************************************************* ;*******************************************************
ReadSectWithRetr: ReadSectWithRetr:
pusha pusha
; Ž¡­ã«¨âì áç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ४ «¨¡à®¢ª¨ ; Обнулить счетчик повторения операции рекалибровки
mov [RecalRepCounter],0 mov [RecalRepCounter],0
@@TryAgain: @@TryAgain:
; Ž¡­ã«¨âì áç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ç⥭¨ï ; Обнулить счетчик повторения операции чтения
mov [ReadRepCounter],0 mov [ReadRepCounter],0
@@ReadSector_1: @@ReadSector_1:
call ReadSector call ReadSector
@ -544,11 +473,11 @@ ReadSectWithRetr:
je @@Exit_2 je @@Exit_2
cmp [FDC_Status],1 cmp [FDC_Status],1
je @@Err_3 je @@Err_3
; ’஥ªà â­®¥ ¯®¢â®à¥­¨¥ ç⥭¨ï ; Троекратное повторение чтения
inc [ReadRepCounter] inc [ReadRepCounter]
cmp [ReadRepCounter],3 cmp [ReadRepCounter],3
jb @@ReadSector_1 jb @@ReadSector_1
; ’஥ªà â­®¥ ¯®¢â®à¥­¨¥ ४ «¨¡à®¢ª¨ ; Троекратное повторение рекалибровки
call RecalibrateFDD call RecalibrateFDD
call SeekTrack call SeekTrack
inc [RecalRepCounter] inc [RecalRepCounter]
@ -564,27 +493,27 @@ ReadSectWithRetr:
ret ret
;******************************************************* ;*******************************************************
;* ‡€<EFBFBD>ˆœ …ŠŽ<EFBFBD> „€<EFBFBD><EFBFBD> * ;* ЗАПИСЬ СЕКТОРА ДАННЫХ *
;* <EFBFBD> à ¬¥âàë ¯¥à¥¤ îâáï ç¥à¥§ £«®¡ «ì­ë¥ ¯¥à¥¬¥­­ë¥: * ;* Параметры передаются через глобальные переменные: *
;* FDD_Track - ­®¬¥à ¤®à®¦ª¨ (0-79); * ;* FDD_Track - номер дорожки (0-79); *
;* FDD_Head - ­®¬¥à £®«®¢ª¨ (0-1); * ;* FDD_Head - номер головки (0-1); *
;* FDD_Sector - ­®¬¥à ᥪâ®à  (1-18). * ;* FDD_Sector - номер сектора (1-18). *
;* <EFBFBD>¥§ã«ìâ â ®¯¥à æ¨¨ § ­®á¨âáï ¢ FDC_Status. * ;* Результат операции заносится в FDC_Status. *
;* á«ãç ¥ ãᯥ譮£® ¢ë¯®«­¥­¨ï ®¯¥à æ¨¨ § ¯¨á¨ * ;* В случае успешного выполнения операции записи *
;* ᮤ¥à¦¨¬®¥ FDD_DataBuffer ¡ã¤¥â § ­¥á¥­® ¢ ᥪâ®à. * ;* содержимое FDD_DataBuffer будет занесено в сектор. *
;******************************************************* ;*******************************************************
WriteSector: WriteSector:
pushad pushad
call save_timer_fdd_motor call save_timer_fdd_motor
; “áâ ­®¢¨âì ᪮à®áâì ¯¥à¥¤ ç¨ 500 Š¡ ©â/á ; Установить скорость передачи 500 Кбайт/с
mov AX,0 mov AX,0
mov DX,03F7h mov DX,03F7h
out DX,AL out DX,AL
; ˆ­¨æ¨ «¨§¨à®¢ âì ª ­ « ¯àאַ£® ¤®áâ㯠 ª ¯ ¬ï⨠; Инициализировать канал прямого доступа к памяти
mov [dmamode],0x4A mov [dmamode],0x4A
call Init_FDC_DMA call Init_FDC_DMA
; <EFBFBD>®¤ âì ª®¬ ­¤ã "‡ ¯¨áì ¤ ­­ëå" ; Подать команду "Запись данных"
mov AL,0xC5 ;0x45 ;§ ¯¨áì ¢ ¬ã«ìâ¨â४®¢®¬ ०¨¬¥ mov AL,0xC5 ;0x45 ;запись в мультитрековом режиме
call FDCDataOutput call FDCDataOutput
mov AL,[FDD_Head] mov AL,[FDD_Head]
shl AL,2 shl AL,2
@ -595,20 +524,19 @@ WriteSector:
call FDCDataOutput call FDCDataOutput
mov AL,[FDD_Sector] mov AL,[FDD_Sector]
call FDCDataOutput call FDCDataOutput
mov AL,2 ;ª®¤ à §¬¥à  ᥪâ®à  (512 ¡ ©â) mov AL,2 ;код размера сектора (512 байт)
call FDCDataOutput call FDCDataOutput
mov AL,18; 3Fh ;ç¨á«® ᥪâ®à®¢ ­  ¤®à®¦ª¥ mov AL,18; 3Fh ;число секторов на дорожке
call FDCDataOutput call FDCDataOutput
mov AL,1Bh ;§­ ç¥­¨¥ GPL mov AL,1Bh ;значение GPL
call FDCDataOutput call FDCDataOutput
mov AL,0FFh ;§­ ç¥­¨¥ DTL mov AL,0FFh ;значение DTL
call FDCDataOutput call FDCDataOutput
; Ожидаем прерывание по завершении операции
; Ž¦¨¤ ¥¬ ¯à¥à뢠­¨¥ ¯® § ¢¥à襭¨¨ ®¯¥à æ¨¨
call WaitFDCInterrupt call WaitFDCInterrupt
cmp [FDC_Status],FDC_Normal cmp [FDC_Status],FDC_Normal
jne @@Exit_3 jne @@Exit_3
; ‘ç¨â뢠¥¬ áâ âãá § ¢¥à襭¨ï ®¯¥à æ¨¨ ; Считываем статус завершения операции
call GetStatusInfo call GetStatusInfo
test [FDC_ST0],11000000b ;11011000b test [FDC_ST0],11000000b ;11011000b
jnz @@Err_2 jnz @@Err_2
@ -621,21 +549,21 @@ WriteSector:
ret ret
;******************************************************* ;*******************************************************
;* ‡€<EFBFBD>ˆœ …ŠŽ<EFBFBD> ( <EFBFBD>ŽŽ<EFBFBD><EFBFBD>ˆ…Œ Ž<EFBFBD><EFBFBD>ˆˆ <EFBFBD><EFBFBD>ˆ <EFBFBD>Ž…) * ;* ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
;* <EFBFBD> à ¬¥âàë ¯¥à¥¤ îâáï ç¥à¥§ £«®¡ «ì­ë¥ ¯¥à¥¬¥­­ë¥: * ;* Параметры передаются через глобальные переменные: *
;* FDD_Track - ­®¬¥à ¤®à®¦ª¨ (0-79); * ;* FDD_Track - номер дорожки (0-79); *
;* FDD_Head - ­®¬¥à £®«®¢ª¨ (0-1); * ;* FDD_Head - номер головки (0-1); *
;* FDD_Sector - ­®¬¥à ᥪâ®à  (1-18). * ;* FDD_Sector - номер сектора (1-18). *
;* <EFBFBD>¥§ã«ìâ â ®¯¥à æ¨¨ § ­®á¨âáï ¢ FDC_Status. * ;* Результат операции заносится в FDC_Status. *
;* á«ãç ¥ ãᯥ譮£® ¢ë¯®«­¥­¨ï ®¯¥à æ¨¨ § ¯¨á¨ * ;* В случае успешного выполнения операции записи *
;* ᮤ¥à¦¨¬®¥ FDD_DataBuffer ¡ã¤¥â § ­¥á¥­® ¢ ᥪâ®à. * ;* содержимое FDD_DataBuffer будет занесено в сектор. *
;******************************************************* ;*******************************************************
WriteSectWithRetr: WriteSectWithRetr:
pusha pusha
; Ž¡­ã«¨âì áç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ४ «¨¡à®¢ª¨ ; Обнулить счетчик повторения операции рекалибровки
mov [RecalRepCounter],0 mov [RecalRepCounter],0
@@TryAgain_1: @@TryAgain_1:
; Ž¡­ã«¨âì áç¥â稪 ¯®¢â®à¥­¨ï ®¯¥à æ¨¨ ç⥭¨ï ; Обнулить счетчик повторения операции чтения
mov [ReadRepCounter],0 mov [ReadRepCounter],0
@@WriteSector_1: @@WriteSector_1:
call WriteSector call WriteSector
@ -643,11 +571,11 @@ WriteSectWithRetr:
je @@Exit_4 je @@Exit_4
cmp [FDC_Status],1 cmp [FDC_Status],1
je @@Err_4 je @@Err_4
; ’஥ªà â­®¥ ¯®¢â®à¥­¨¥ ç⥭¨ï ; Троекратное повторение чтения
inc [ReadRepCounter] inc [ReadRepCounter]
cmp [ReadRepCounter],3 cmp [ReadRepCounter],3
jb @@WriteSector_1 jb @@WriteSector_1
; ’஥ªà â­®¥ ¯®¢â®à¥­¨¥ ४ «¨¡à®¢ª¨ ; Троекратное повторение рекалибровки
call RecalibrateFDD call RecalibrateFDD
call SeekTrack call SeekTrack
inc [RecalRepCounter] inc [RecalRepCounter]
@ -662,7 +590,7 @@ WriteSectWithRetr:
ret ret
;********************************************* ;*********************************************
;* <EFBFBD>Ž“—ˆœ ˆ<EFBFBD>”Ž<EFBFBD>Œ€ˆž Ž <EFBFBD>…‡“œ Ž<EFBFBD><EFBFBD>ˆˆ * ;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
;********************************************* ;*********************************************
GetStatusInfo: GetStatusInfo:
push AX push AX

View File

@ -456,11 +456,11 @@ mov [edi+22],ax ; time
pop edi esi edx ecx ebx eax pop edi esi edx ecx ebx eax
add esp,32 add esp,32
pusha ; pusha
cli ; cli
call fdc_commitfile ; call fdc_commitfile
sti ; sti
popa ; popa
xor eax,eax ;ok write xor eax,eax ;ok write
ret ret

View File

@ -86,7 +86,7 @@ drawbar dd __sys_drawbar
putpixel dd __sys_putpixel putpixel dd __sys_putpixel
; } mike.dld ; } 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 ;dd endofcode-0x10000
;db 'Boot02' ;db 'Boot02'
@ -2257,7 +2257,7 @@ keyboard_mode_sys db 0
iglobal iglobal
version_inf: 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 UID_KOLIBRI
db 'Kolibri',0 db 'Kolibri',0
version_end: version_end:
@ -2277,34 +2277,50 @@ main_loop_sys_getkey:
ret ret
sys_cachetodiskette: sys_cachetodiskette:
pushad ; pushad
cmp eax,1 ; cmp eax,1
jne no_write_all_of_ramdisk ; jne no_write_all_of_ramdisk
; call fdc_writeramdisk
call fdc_writeramdisk ; popad
popad ; ret
ret ; no_write_all_of_ramdisk:
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 cmp eax,2
jne no_write_part_of_ramdisk jne no_floppy_b_save
call fdc_commitflush mov [flp_number],2
popad save_image_on_floppy:
ret call save_image
no_write_part_of_ramdisk: mov [esp+36],dword 0
cmp eax,3 cmp [FDC_Status],0
jne no_set_fdc je yes_floppy_save
call fdc_set no_floppy_b_save:
popad mov [esp+36],dword 1
ret yes_floppy_save:
no_set_fdc:
cmp eax,4
jne no_get_fdc
popad
call fdc_get
mov [esp+36],ecx
ret
no_get_fdc:
popad
ret ret
uglobal uglobal