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 |
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 |
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_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 |
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 |
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,24 → 169,17 |
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 |
260,27 → 186,28 |
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 |
287,7 → 214,7 |
ret |
|
;********************************* |
;* "A:" * |
;* ÂÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ "A:" * |
;********************************* |
FDDMotorON: |
pusha |
296,11 → 223,11 |
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 |
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 |
ret |
|
;***************************************** |
;*
* |
;* ÑÎÕÐÀÍÅÍÈÅ ÓÊÀÇÀÒÅËß ÂÐÅÌÅÍÈ * |
;***************************************** |
save_timer_fdd_motor: |
mov eax,[timer_ticks] |
340,11 → 268,11 |
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 |
351,11 → 279,13 |
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_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,30 → 338,30 |
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 |
438,24 → 368,24 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
ret |
|
;********************************************* |
;*
* |
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ * |
;********************************************* |
GetStatusInfo: |
push AX |