Subversion Repositories Kolibri OS

Rev

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

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