Subversion Repositories Kolibri OS

Rev

Rev 2288 | Rev 3534 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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