Subversion Repositories Kolibri OS

Rev

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