Subversion Repositories Kolibri OS

Rev

Rev 380 | Rev 431 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. $Revision: 425 $
  2. ;**********************************************************
  3. ;  Íåïîñðåäñòâåííàÿ ðàáîòà ñ êîíòðîëëåðîì ãèáêîãî äèñêà
  4. ;**********************************************************
  5. ; Àâòîð èñõîäíîãî òåêñòà  Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  6. ; Àäàïòàöèÿ è äîðàáîòêà Mario79
  7.  
  8. give_back_application_data:  ; ïåðåñëàòü ïðèëîæåíèþ
  9.      mov edi,[TASK_BASE]
  10.      mov edi,[edi+TASKDATA.mem_start]
  11.      add edi,ecx
  12. give_back_application_data_1:
  13.      mov esi,FDD_BUFF   ;FDD_DataBuffer  ;0x40000
  14.      xor ecx,ecx
  15.      mov cx,128
  16.      cld
  17.      rep movsd
  18.      ret
  19.  
  20. take_data_from_application:   ; âçÿòü èç ïðèëîæåíè
  21.      mov esi,[TASK_BASE]
  22.      mov esi,[esi+TASKDATA.mem_start]
  23.      add esi,ecx
  24. take_data_from_application_1:
  25.      mov edi,FDD_BUFF   ;FDD_DataBuffer  ;0x40000
  26.      xor ecx,ecx
  27.      mov cx,128
  28.      cld
  29.      rep movsd
  30.      ret
  31.  
  32. ; Êîäû çàâåðøåíèÿ îïåðàöèè ñ êîíòðîëëåðîì (FDC_Status)
  33. FDC_Normal         equ 0 ;íîðìàëüíîå çàâåðøåíèå
  34. FDC_TimeOut        equ 1 ;îøèáêà òàéì-àóòà
  35. FDC_DiskNotFound   equ 2 ;â äèñêîâîäå íåò äèñêà
  36. FDC_TrackNotFound  equ 3 ;äîðîæêà íå íàéäåíà
  37. FDC_SectorNotFound equ 4 ;ñåêòîð íå íàéäåí
  38.  
  39. ; Ìàêñèìàëüíûå çíà÷åíèÿ êîîðäèíàò ñåêòîðà (çàäàííûå
  40. ; çíà÷åíèÿ ñîîòâåòñòâóþò ïàðàìåòðàì ñòàíäàðòíîãî
  41. ; òðåõäþéìîâîãî ãèáêîãî äèñêà îáúåìîì 1,44 Ìá)
  42. MAX_Track   equ 79
  43. MAX_Head    equ  1
  44. MAX_Sector  equ 18
  45.  
  46. uglobal
  47. ; Ñ÷åò÷èê òèêîâ òàéìåðà
  48. TickCounter dd ?
  49. ; Êîä çàâåðøåíèÿ îïåðàöèè ñ êîíòðîëëåðîì ÍÃÌÄ
  50. FDC_Status  DB ?
  51. ; Ôëàã ïðåðûâàíèÿ îò ÍÃÌÄ
  52. FDD_IntFlag DB ?
  53. ; Ìîìåíò íà÷àëà ïîñëåäíåé îïåðàöèè ñ ÍÃÌÄ
  54. FDD_Time    DD ?
  55. ; Íîìåð äèñêîâîäà
  56. FDD_Type    db 0
  57. ; Êîîðäèíàòû ñåêòîðà
  58. FDD_Track   DB ?
  59. FDD_Head    DB ?
  60. FDD_Sector  DB ?
  61.  
  62. ; Áëîê ðåçóëüòàòà îïåðàöèè
  63. FDC_ST0 DB ?
  64. FDC_ST1 DB ?
  65. FDC_ST2 DB ?
  66. FDC_C   DB ?
  67. FDC_H   DB ?
  68. FDC_R   DB ?
  69. FDC_N   DB ?
  70. ; Ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
  71. ReadRepCounter  DB ?
  72. ; Ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
  73. RecalRepCounter DB ?
  74. endg
  75. ; Îáëàñòü ïàìÿòè äëÿ õðàíåíèÿ ïðî÷èòàííîãî ñåêòîðà
  76. ;FDD_DataBuffer:  times 512 db 0   ;DB 512 DUP (?)
  77. fdd_motor_status db 0
  78. timer_fdd_motor  dd 0
  79.  
  80. ;*************************************
  81. ;* ÈÍÈÖÈÀËÈÇÀÖÈß ÐÅÆÈÌÀ ÏÄÏ ÄËß ÍÃÌÄ *
  82. ;*************************************
  83. Init_FDC_DMA:
  84.         pushad
  85.         mov al,0
  86.         out 0x0c,al     ; reset the flip-flop to a known state.
  87.         mov al,6                ; mask channel 2 so we can reprogram it.
  88.         out 0x0a,al
  89.         mov al,[dmamode] ; 0x46 -> Read from floppy - 0x4A Write to floppy
  90.         out 0x0b,al
  91.         mov al,0
  92.         out 0x0c,al     ; reset the flip-flop to a known state.
  93.         mov eax,0xD000
  94.         out 0x04,al     ; set the channel 2 starting address to 0
  95.         shr eax,8
  96.         out 0x04,al
  97.         shr eax,8
  98.         out 0x81,al
  99.         mov al,0
  100.         out 0x0c, al    ; reset flip-flop
  101.         mov al, 0xff    ;set count (actual size -1)
  102.         out 0x5, al
  103.         mov al,0x1  ;[dmasize]       ;(0x1ff = 511 / 0x23ff =9215)
  104.         out 0x5,al
  105.         mov al,2
  106.         out 0xa,al
  107.         popad
  108.         ret
  109.  
  110. ;***********************************
  111. ;* ÇÀÏÈÑÀÒÜ ÁÀÉÒ Â ÏÎÐÒ ÄÀÍÍÛÕ FDC *
  112. ;* Ïàðàìåòðû:                      *
  113. ;* AL - âûâîäèìûé áàéò.            *
  114. ;***********************************
  115. FDCDataOutput:
  116. ;        pusha
  117.         push eax ecx edx
  118.         mov     AH,AL     ;çàïîìíèòü áàéò â AH
  119. ; Ñáðîñèòü ïåðåìåííóþ ñîñòîÿíèÿ êîíòðîëëåðà
  120.         mov     [FDC_Status],FDC_Normal
  121. ; Ïðîâåðèòü ãîòîâíîñòü êîíòðîëëåðà ê ïðèåìó äàííûõ
  122.         mov     DX,3F4h   ;(ïîðò ñîñòîÿíèÿ FDC)
  123.         mov     ecx, 0x10000 ;óñòàíîâèòü ñ÷åò÷èê òàéì-àóòà
  124. @@TestRS:
  125.         in      AL,DX     ;ïðî÷èòàòü ðåãèñòð RS
  126.         and     AL,0C0h   ;âûäåëèòü ðàçðÿäû 6 è 7
  127.         cmp     AL,80h    ;ïðîâåðèòü ðàçðÿäû 6 è 7
  128.         je      @@OutByteToFDC
  129.         loop    @@TestRS
  130. ; Îøèáêà òàéì-àóòà
  131.         mov     [FDC_Status],FDC_TimeOut
  132.         jmp @@End_5
  133. ; Âûâåñòè áàéò â ïîðò äàííûõ
  134. @@OutByteToFDC:
  135.         inc     DX
  136.         mov     AL,AH
  137.         out     DX,AL
  138. @@End_5:
  139. ;        popa
  140.         pop edx ecx eax
  141.         ret
  142.  
  143. ;******************************************
  144. ;*   ÏÐÎ×ÈÒÀÒÜ ÁÀÉÒ ÈÇ ÏÎÐÒÀ ÄÀÍÍÛÕ FDC   *
  145. ;* Ïðîöåäóðà íå èìååò âõîäíûõ ïàðàìåòðîâ. *
  146. ;* Âûõîäíûå äàííûå:                       *
  147. ;* AL - ñ÷èòàííûé áàéò.                   *
  148. ;******************************************
  149. FDCDataInput:
  150.         push    ECX
  151.         push    DX
  152. ; Ñáðîñèòü ïåðåìåííóþ ñîñòîÿíèÿ êîíòðîëëåðà
  153.         mov     [FDC_Status],FDC_Normal
  154. ; Ïðîâåðèòü ãîòîâíîñòü êîíòðîëëåðà ê ïåðåäà÷å äàííûõ
  155.         mov     DX,3F4h   ;(ïîðò ñîñòîÿíèÿ FDC)
  156.         xor     CX,CX     ;óñòàíîâèòü ñ÷åò÷èê òàéì-àóòà
  157. @@TestRS_1:
  158.         in      AL,DX     ;ïðî÷èòàòü ðåãèñòð RS
  159.         and     AL,0C0h   ;âûäëèòü ðàçðÿäû 6 è 7
  160.         cmp     AL,0C0h   ;ïðîâåðèòü ðàçðÿäû 6 è 7
  161.         je      @@GetByteFromFDC
  162.         loop    @@TestRS_1
  163. ; Îøèáêà òàéì-àóòà
  164.         mov     [FDC_Status],FDC_TimeOut
  165.         jmp @@End_6
  166. ; Ââåñòè áàéò èç ïîðòà äàííûõ
  167. @@GetByteFromFDC:
  168.         inc     DX
  169.         in      AL,DX
  170. @@End_6:  pop     DX
  171.         pop     ECX
  172.         ret
  173.  
  174. ;*********************************************
  175. ;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
  176. ;*********************************************
  177. FDCInterrupt:
  178. ; Óñòàíîâèòü ôëàã ïðåðûâàíè
  179.         mov     [FDD_IntFlag],1
  180.         ret
  181.  
  182.  
  183. ;******************************************
  184. ;* ÓÑÒÀÍÎÂÈÒÜ ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈÉ *
  185. ;*             ÍÃÌÄ                       *
  186. ;******************************************
  187. SetUserInterrupts:
  188.          mov     [fdc_irq_func],FDCInterrupt
  189.          ret
  190.  
  191. ;*******************************************
  192. ;* ÎÆÈÄÀÍÈÅ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
  193. ;*******************************************
  194. WaitFDCInterrupt:
  195.         pusha
  196. ; Ñáðîñèòü áàéò ñîñòîÿíèÿ îïåðàöèè
  197.         mov     [FDC_Status],FDC_Normal
  198. ; Ñáðîñèòü ôëàã ïðåðûâàíè
  199.         mov     [FDD_IntFlag],0
  200. ; Îáíóëèòü ñ÷åò÷èê òèêîâ
  201.         mov     eax,[timer_ticks]
  202.         mov     [TickCounter],eax
  203. ; Îæèäàòü óñòàíîâêè ôëàãà ïðåðûâàíèÿ ÍÃÌÄ
  204. @@TestRS_2:
  205.         cmp     [FDD_IntFlag],0
  206.         jnz     @@End_7           ;ïðåðûâàíèå ïðîèçîøëî
  207.         call    change_task
  208.         mov     eax,[timer_ticks]
  209.         sub     eax,[TickCounter]
  210.         cmp     eax,50  ;25   ;5 ;îæèäàòü 5 òèêîâ
  211.         jb      @@TestRS_2
  212. ;        jl      @@TestRS_2
  213. ; Îøèáêà òàéì-àóòà
  214.         mov     [FDC_Status],FDC_TimeOut
  215. ;        mov   [flp_status],0
  216. @@End_7:  popa
  217.         ret
  218.  
  219. ;*********************************
  220. ;* ÂÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ "A:" *
  221. ;*********************************
  222. FDDMotorON:
  223.         pusha
  224. ;        cmp     [fdd_motor_status],1
  225. ;        je      fdd_motor_on
  226.         mov     al,[flp_number]
  227.         cmp     [fdd_motor_status],al
  228.         je      fdd_motor_on
  229. ; Ïðîèçâåñòè ñáðîñ êîíòðîëëåðà ÍÃÌÄ
  230.         mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
  231.         mov     AL,0
  232.         out     DX,AL
  233. ; Âûáðàòü è âêëþ÷èòü ìîòîð äèñêîâîäà
  234.         cmp     [flp_number],1
  235.         jne     FDDMotorON_B
  236. ;        call    FDDMotorOFF_B
  237.         mov     AL,1Ch    ; Floppy A
  238.         jmp     FDDMotorON_1
  239. FDDMotorON_B:
  240. ;        call    FDDMotorOFF_A
  241.         mov     AL,2Dh    ; Floppy B
  242. FDDMotorON_1:
  243.         out     DX,AL
  244. ; Îáíóëèòü ñ÷åò÷èê òèêîâ
  245.         mov     eax,[timer_ticks]
  246.         mov     [TickCounter],eax
  247. ; Îæèäàòü 0,5 ñ
  248. @@dT:
  249.         call    change_task
  250.         mov     eax,[timer_ticks]
  251.         sub     eax,[TickCounter]
  252.         cmp     eax,50  ;10
  253.         jb      @@dT
  254.         cmp     [flp_number],1
  255.         jne     fdd_motor_on_B
  256.         mov     [fdd_motor_status],1
  257.         jmp     fdd_motor_on
  258. fdd_motor_on_B:
  259.         mov     [fdd_motor_status],2
  260. fdd_motor_on:
  261.         call    save_timer_fdd_motor
  262.         popa
  263.         ret
  264.  
  265. ;*****************************************
  266. ;*  ÑÎÕÐÀÍÅÍÈÅ ÓÊÀÇÀÒÅËß ÂÐÅÌÅÍÈ         *
  267. ;*****************************************
  268. save_timer_fdd_motor:
  269.         mov     eax,[timer_ticks]
  270.         mov     [timer_fdd_motor],eax
  271.         ret
  272.  
  273. ;*****************************************
  274. ;*  ÏÐÎÂÅÐÊÀ ÇÀÄÅÐÆÊÈ ÂÛÊËÞ×ÅÍÈß ÌÎÒÎÐÀ  *
  275. ;*****************************************
  276. check_fdd_motor_status:
  277.         cmp     [fdd_motor_status],0
  278.         je      end_check_fdd_motor_status_1
  279.         mov     eax,[timer_ticks]
  280.         sub     eax,[timer_fdd_motor]
  281.         cmp     eax,500
  282.         jb      end_check_fdd_motor_status
  283.         call    FDDMotorOFF
  284.         mov     [fdd_motor_status],0
  285. end_check_fdd_motor_status_1:
  286.         mov     [flp_status],0
  287. end_check_fdd_motor_status:
  288.         ret
  289.  
  290. ;**********************************
  291. ;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
  292. ;**********************************
  293. FDDMotorOFF:
  294.         push    AX
  295.         push    DX
  296.         cmp     [flp_number],1
  297.         jne     FDDMotorOFF_1
  298.         call    FDDMotorOFF_A
  299.         jmp     FDDMotorOFF_2
  300. FDDMotorOFF_1:
  301.         call    FDDMotorOFF_B
  302. FDDMotorOFF_2:
  303.         pop     DX
  304.         pop     AX
  305.         ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
  306.         mov    [root_read],0
  307.         mov    [flp_fat],0
  308.         ret
  309.  
  310. FDDMotorOFF_A:
  311.         mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
  312.         mov     AL,0Ch  ; Floppy A
  313.         out     DX,AL
  314.         ret
  315.  
  316. FDDMotorOFF_B:
  317.         mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
  318.         mov     AL,5h  ; Floppy B
  319.         out     DX,AL
  320.         ret
  321.  
  322. ;*******************************
  323. ;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
  324. ;*******************************
  325. RecalibrateFDD:
  326.         pusha
  327.         call    save_timer_fdd_motor
  328. ; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
  329.         mov     AL,07h
  330.         call    FDCDataOutput
  331.         mov     AL,00h
  332.         call    FDCDataOutput
  333. ; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
  334.         call    WaitFDCInterrupt
  335. ;        cmp    [FDC_Status],0
  336. ;        je    no_fdc_status_error
  337. ;        mov   [flp_status],0
  338. ;no_fdc_status_error:
  339.         call    save_timer_fdd_motor
  340.         popa
  341.         ret
  342.  
  343. ;*****************************************************
  344. ;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
  345. ;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
  346. ;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
  347. ;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
  348. ;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
  349. ;*****************************************************
  350. SeekTrack:
  351.         pusha
  352.         call    save_timer_fdd_motor
  353. ; Ïîäàòü êîìàíäó "Ïîèñê"
  354.         mov     AL,0Fh
  355.         call    FDCDataOutput
  356.         ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
  357.         mov     AL,[FDD_Head]
  358.         shl     AL,2
  359.         call    FDCDataOutput
  360.         ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
  361.         mov     AL,[FDD_Track]
  362.         call    FDCDataOutput
  363. ; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
  364.         call    WaitFDCInterrupt
  365.         cmp     [FDC_Status],FDC_Normal
  366.         jne     @@Exit
  367. ; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
  368.         mov     AL,08h
  369.         call    FDCDataOutput
  370.         call    FDCDataInput
  371.         mov     [FDC_ST0],AL
  372.         call    FDCDataInput
  373.         mov     [FDC_C],AL
  374. ; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
  375.         ; Ïîèñê çàâåðøåí?
  376.         test    [FDC_ST0],100000b
  377.         je      @@Err
  378.         ; Çàäàííûé òðåê íàéäåí?
  379.         mov     AL,[FDC_C]
  380.         cmp     AL,[FDD_Track]
  381.         jne     @@Err
  382.         ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
  383.         mov     AL,[FDC_ST0]
  384.         and     AL,100b
  385.         shr     AL,2
  386.         cmp     AL,[FDD_Head]
  387.         jne     @@Err
  388.         ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
  389.         mov     [FDC_Status],FDC_Normal
  390.         jmp @@Exit
  391. @@Err:  ; Òðåê íå íàéäåí
  392.         mov     [FDC_Status],FDC_TrackNotFound
  393. ;        mov   [flp_status],0
  394. @@Exit:
  395.         call    save_timer_fdd_motor
  396.         popa
  397.         ret
  398.  
  399. ;*******************************************************
  400. ;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
  401. ;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
  402. ;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
  403. ;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
  404. ;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
  405. ;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
  406. ;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
  407. ;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
  408. ;*******************************************************
  409. ReadSector:
  410.         pushad
  411.         call    save_timer_fdd_motor
  412. ; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
  413.         mov     AX,0
  414.         mov     DX,03F7h
  415.         out     DX,AL
  416. ; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
  417.         mov     [dmamode],0x46
  418.         call    Init_FDC_DMA
  419. ; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
  420.         mov     AL,0E6h  ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
  421.         call    FDCDataOutput
  422.         mov     AL,[FDD_Head]
  423.         shl     AL,2
  424.         call    FDCDataOutput
  425.         mov     AL,[FDD_Track]
  426.         call    FDCDataOutput
  427.         mov     AL,[FDD_Head]
  428.         call    FDCDataOutput
  429.         mov     AL,[FDD_Sector]
  430.         call    FDCDataOutput
  431.         mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
  432.         call    FDCDataOutput
  433.         mov     AL,18  ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
  434.         call    FDCDataOutput
  435.         mov     AL,1Bh  ;çíà÷åíèå GPL
  436.         call    FDCDataOutput
  437.         mov     AL,0FFh ;çíà÷åíèå DTL
  438.         call    FDCDataOutput
  439. ; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
  440.         call    WaitFDCInterrupt
  441.         cmp     [FDC_Status],FDC_Normal
  442.         jne     @@Exit_1
  443. ; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
  444.         call    GetStatusInfo
  445.         test    [FDC_ST0],11011000b
  446.         jnz     @@Err_1
  447.         mov     [FDC_Status],FDC_Normal
  448.         jmp @@Exit_1
  449. @@Err_1:  mov     [FDC_Status],FDC_SectorNotFound
  450. ;        mov   [flp_status],0
  451. @@Exit_1:
  452.         call    save_timer_fdd_motor
  453.         popad
  454.         ret
  455.  
  456. ;*******************************************************
  457. ;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
  458. ;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
  459. ;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
  460. ;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
  461. ;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
  462. ;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
  463. ;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
  464. ;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
  465. ;*******************************************************
  466. ReadSectWithRetr:
  467.         pusha
  468. ; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
  469.         mov     [RecalRepCounter],0
  470. @@TryAgain:
  471. ; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
  472.         mov     [ReadRepCounter],0
  473. @@ReadSector_1:
  474.         call    ReadSector
  475.         cmp     [FDC_Status],0
  476.         je      @@Exit_2
  477.         cmp     [FDC_Status],1
  478.         je      @@Err_3
  479.         ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
  480.         inc     [ReadRepCounter]
  481.         cmp     [ReadRepCounter],3
  482.         jb      @@ReadSector_1
  483.         ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
  484.         call    RecalibrateFDD
  485.         call    SeekTrack
  486.         inc     [RecalRepCounter]
  487.         cmp     [RecalRepCounter],3
  488.         jb      @@TryAgain
  489. ;        mov   [flp_status],0
  490. @@Exit_2:
  491.         popa
  492.         ret
  493. @@Err_3:
  494.         mov   [flp_status],0
  495.         popa
  496.         ret
  497.  
  498. ;*******************************************************
  499. ;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
  500. ;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
  501. ;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
  502. ;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
  503. ;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
  504. ;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
  505. ;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
  506. ;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
  507. ;*******************************************************
  508. WriteSector:
  509.         pushad
  510.         call    save_timer_fdd_motor
  511. ; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
  512.         mov     AX,0
  513.         mov     DX,03F7h
  514.         out     DX,AL
  515. ; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
  516.         mov     [dmamode],0x4A
  517.         call    Init_FDC_DMA
  518. ; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
  519.         mov     AL,0xC5  ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
  520.         call    FDCDataOutput
  521.         mov     AL,[FDD_Head]
  522.         shl     AL,2
  523.         call    FDCDataOutput
  524.         mov     AL,[FDD_Track]
  525.         call    FDCDataOutput
  526.         mov     AL,[FDD_Head]
  527.         call    FDCDataOutput
  528.         mov     AL,[FDD_Sector]
  529.         call    FDCDataOutput
  530.         mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
  531.         call    FDCDataOutput
  532.         mov     AL,18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
  533.         call    FDCDataOutput
  534.         mov     AL,1Bh  ;çíà÷åíèå GPL
  535.         call    FDCDataOutput
  536.         mov     AL,0FFh ;çíà÷åíèå DTL
  537.         call    FDCDataOutput
  538. ; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
  539.         call    WaitFDCInterrupt
  540.         cmp     [FDC_Status],FDC_Normal
  541.         jne     @@Exit_3
  542. ; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
  543.         call    GetStatusInfo
  544.         test    [FDC_ST0],11000000b  ;11011000b
  545.         jnz     @@Err_2
  546.         mov     [FDC_Status],FDC_Normal
  547.         jmp @@Exit_3
  548. @@Err_2:  mov     [FDC_Status],FDC_SectorNotFound
  549. @@Exit_3:
  550.         call    save_timer_fdd_motor
  551.         popad
  552.         ret
  553.  
  554. ;*******************************************************
  555. ;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
  556. ;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
  557. ;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
  558. ;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
  559. ;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
  560. ;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
  561. ;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
  562. ;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
  563. ;*******************************************************
  564. WriteSectWithRetr:
  565.         pusha
  566. ; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
  567.         mov     [RecalRepCounter],0
  568. @@TryAgain_1:
  569. ; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
  570.         mov     [ReadRepCounter],0
  571. @@WriteSector_1:
  572.         call    WriteSector
  573.         cmp     [FDC_Status],0
  574.         je      @@Exit_4
  575.         cmp     [FDC_Status],1
  576.         je      @@Err_4
  577.         ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
  578.         inc     [ReadRepCounter]
  579.         cmp     [ReadRepCounter],3
  580.         jb      @@WriteSector_1
  581.         ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
  582.         call    RecalibrateFDD
  583.         call    SeekTrack
  584.         inc     [RecalRepCounter]
  585.         cmp     [RecalRepCounter],3
  586.         jb      @@TryAgain_1
  587. @@Exit_4:
  588.         popa
  589.         ret
  590. @@Err_4:
  591.         mov   [flp_status],0
  592.         popa
  593.         ret
  594.  
  595. ;*********************************************
  596. ;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
  597. ;*********************************************
  598. GetStatusInfo:
  599.         push    AX
  600.         call    FDCDataInput
  601.         mov     [FDC_ST0],AL
  602.         call    FDCDataInput
  603.         mov     [FDC_ST1],AL
  604.         call    FDCDataInput
  605.         mov     [FDC_ST2],AL
  606.         call    FDCDataInput
  607.         mov     [FDC_C],AL
  608.         call    FDCDataInput
  609.         mov     [FDC_H],AL
  610.         call    FDCDataInput
  611.         mov     [FDC_R],AL
  612.         call    FDCDataInput
  613.         mov     [FDC_N],AL
  614.         pop     AX
  615.         ret
  616.  
  617.