Subversion Repositories Kolibri OS

Rev

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

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