diff --git a/kernel/trunk/blkdev/fdc.inc b/kernel/trunk/blkdev/fdc.inc index 529f217a03..6b4e438d32 100644 --- a/kernel/trunk/blkdev/fdc.inc +++ b/kernel/trunk/blkdev/fdc.inc @@ -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 \ No newline at end of file +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 + diff --git a/kernel/trunk/blkdev/flp_drv.inc b/kernel/trunk/blkdev/flp_drv.inc index 0db9d1e859..411cf86b1d 100644 --- a/kernel/trunk/blkdev/flp_drv.inc +++ b/kernel/trunk/blkdev/flp_drv.inc @@ -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 diff --git a/kernel/trunk/blkdev/rd.inc b/kernel/trunk/blkdev/rd.inc index ad0381a261..4c50315444 100644 --- a/kernel/trunk/blkdev/rd.inc +++ b/kernel/trunk/blkdev/rd.inc @@ -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 diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 766148eb90..a31ef5549b 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -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