Subversion Repositories Kolibri OS

Rev

Rev 2 | Rev 75 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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