Subversion Repositories Kolibri OS

Rev

Rev 431 | Rev 593 | 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.