Subversion Repositories Kolibri OS

Rev

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

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