Subversion Repositories Kolibri OS

Rev

Rev 438 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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