Subversion Repositories Kolibri OS

Rev

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

Rev 2455 Rev 3534
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2011. 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: 2455 $
8
$Revision: 3534 $
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
proc check_fdd_motor_status_has_work?
-
 
288
        cmp     [flp_status], 0
-
 
289
        jnz     .yes
-
 
290
        cmp     [fdd_motor_status], 0
-
 
291
        jz      .no
-
 
292
        mov     eax, [timer_ticks]
-
 
293
        sub     eax, [timer_fdd_motor]
-
 
294
        cmp     eax, 500
-
 
295
        jb      .no
-
 
296
.yes:
-
 
297
        xor     eax, eax
-
 
298
        inc     eax
-
 
299
        ret
-
 
300
.no:
-
 
301
        xor     eax, eax
-
 
302
        ret
-
 
303
endp
-
 
304
 
287
align 4
305
align 4
288
check_fdd_motor_status:
306
check_fdd_motor_status:
289
        cmp     [fdd_motor_status], 0
307
        cmp     [fdd_motor_status], 0
290
        je      end_check_fdd_motor_status_1
308
        je      end_check_fdd_motor_status_1
291
        mov     eax, [timer_ticks]
309
        mov     eax, [timer_ticks]
292
        sub     eax, [timer_fdd_motor]
310
        sub     eax, [timer_fdd_motor]
293
        cmp     eax, 500
311
        cmp     eax, 500
294
        jb      end_check_fdd_motor_status
312
        jb      end_check_fdd_motor_status
295
        call    FDDMotorOFF
313
        call    FDDMotorOFF
296
        mov     [fdd_motor_status], 0
314
        mov     [fdd_motor_status], 0
297
end_check_fdd_motor_status_1:
315
end_check_fdd_motor_status_1:
298
        mov     [flp_status], 0
316
        mov     [flp_status], 0
299
end_check_fdd_motor_status:
317
end_check_fdd_motor_status:
300
        ret
318
        ret
301
 
319
 
302
;**********************************
320
;**********************************
303
;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
321
;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
304
;**********************************
322
;**********************************
305
FDDMotorOFF:
323
FDDMotorOFF:
306
        push    AX
324
        push    AX
307
        push    DX
325
        push    DX
308
        cmp     [flp_number], 1
326
        cmp     [flp_number], 1
309
        jne     FDDMotorOFF_1
327
        jne     FDDMotorOFF_1
310
        call    FDDMotorOFF_A
328
        call    FDDMotorOFF_A
311
        jmp     FDDMotorOFF_2
329
        jmp     FDDMotorOFF_2
312
FDDMotorOFF_1:
330
FDDMotorOFF_1:
313
        call    FDDMotorOFF_B
331
        call    FDDMotorOFF_B
314
FDDMotorOFF_2:
332
FDDMotorOFF_2:
315
        pop     DX
333
        pop     DX
316
        pop     AX
334
        pop     AX
317
        ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
335
        ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
318
        mov     [root_read], 0
336
        mov     [root_read], 0
319
        mov     [flp_fat], 0
337
        mov     [flp_fat], 0
320
        ret
338
        ret
321
 
339
 
322
FDDMotorOFF_A:
340
FDDMotorOFF_A:
323
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
341
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
324
        mov     AL, 0Ch ; Floppy A
342
        mov     AL, 0Ch ; Floppy A
325
        out     DX, AL
343
        out     DX, AL
326
        ret
344
        ret
327
 
345
 
328
FDDMotorOFF_B:
346
FDDMotorOFF_B:
329
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
347
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
330
        mov     AL, 5h ; Floppy B
348
        mov     AL, 5h ; Floppy B
331
        out     DX, AL
349
        out     DX, AL
332
        ret
350
        ret
333
 
351
 
334
;*******************************
352
;*******************************
335
;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
353
;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
336
;*******************************
354
;*******************************
337
RecalibrateFDD:
355
RecalibrateFDD:
338
        pusha
356
        pusha
339
        call    save_timer_fdd_motor
357
        call    save_timer_fdd_motor
340
; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
358
; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
341
        mov     AL, 07h
359
        mov     AL, 07h
342
        call    FDCDataOutput
360
        call    FDCDataOutput
343
        mov     AL, 00h
361
        mov     AL, 00h
344
        call    FDCDataOutput
362
        call    FDCDataOutput
345
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
363
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
346
        call    WaitFDCInterrupt
364
        call    WaitFDCInterrupt
347
;        cmp    [FDC_Status],0
365
;        cmp    [FDC_Status],0
348
;        je    no_fdc_status_error
366
;        je    no_fdc_status_error
349
;        mov   [flp_status],0
367
;        mov   [flp_status],0
350
;no_fdc_status_error:
368
;no_fdc_status_error:
351
        call    save_timer_fdd_motor
369
        call    save_timer_fdd_motor
352
        popa
370
        popa
353
        ret
371
        ret
354
 
372
 
355
;*****************************************************
373
;*****************************************************
356
;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
374
;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
357
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
375
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
358
;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
376
;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
359
;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
377
;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
360
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
378
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
361
;*****************************************************
379
;*****************************************************
362
SeekTrack:
380
SeekTrack:
363
        pusha
381
        pusha
364
        call    save_timer_fdd_motor
382
        call    save_timer_fdd_motor
365
; Ïîäàòü êîìàíäó "Ïîèñê"
383
; Ïîäàòü êîìàíäó "Ïîèñê"
366
        mov     AL, 0Fh
384
        mov     AL, 0Fh
367
        call    FDCDataOutput
385
        call    FDCDataOutput
368
        ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
386
        ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
369
        mov     AL, [FDD_Head]
387
        mov     AL, [FDD_Head]
370
        shl     AL, 2
388
        shl     AL, 2
371
        call    FDCDataOutput
389
        call    FDCDataOutput
372
        ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
390
        ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
373
        mov     AL, [FDD_Track]
391
        mov     AL, [FDD_Track]
374
        call    FDCDataOutput
392
        call    FDCDataOutput
375
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
393
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
376
        call    WaitFDCInterrupt
394
        call    WaitFDCInterrupt
377
        cmp     [FDC_Status], FDC_Normal
395
        cmp     [FDC_Status], FDC_Normal
378
        jne     @@Exit
396
        jne     @@Exit
379
; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
397
; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
380
        mov     AL, 08h
398
        mov     AL, 08h
381
        call    FDCDataOutput
399
        call    FDCDataOutput
382
        call    FDCDataInput
400
        call    FDCDataInput
383
        mov     [FDC_ST0], AL
401
        mov     [FDC_ST0], AL
384
        call    FDCDataInput
402
        call    FDCDataInput
385
        mov     [FDC_C], AL
403
        mov     [FDC_C], AL
386
; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
404
; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
387
        ; Ïîèñê çàâåðøåí?
405
        ; Ïîèñê çàâåðøåí?
388
        test    [FDC_ST0], 100000b
406
        test    [FDC_ST0], 100000b
389
        je      @@Err
407
        je      @@Err
390
        ; Çàäàííûé òðåê íàéäåí?
408
        ; Çàäàííûé òðåê íàéäåí?
391
        mov     AL, [FDC_C]
409
        mov     AL, [FDC_C]
392
        cmp     AL, [FDD_Track]
410
        cmp     AL, [FDD_Track]
393
        jne     @@Err
411
        jne     @@Err
394
        ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
412
        ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
395
        mov     AL, [FDC_ST0]
413
        mov     AL, [FDC_ST0]
396
        and     AL, 100b
414
        and     AL, 100b
397
        shr     AL, 2
415
        shr     AL, 2
398
        cmp     AL, [FDD_Head]
416
        cmp     AL, [FDD_Head]
399
        jne     @@Err
417
        jne     @@Err
400
        ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
418
        ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
401
        mov     [FDC_Status], FDC_Normal
419
        mov     [FDC_Status], FDC_Normal
402
        jmp     @@Exit
420
        jmp     @@Exit
403
@@Err:  ; Òðåê íå íàéäåí
421
@@Err:  ; Òðåê íå íàéäåí
404
        mov     [FDC_Status], FDC_TrackNotFound
422
        mov     [FDC_Status], FDC_TrackNotFound
405
;        mov   [flp_status],0
423
;        mov   [flp_status],0
406
@@Exit:
424
@@Exit:
407
        call    save_timer_fdd_motor
425
        call    save_timer_fdd_motor
408
        popa
426
        popa
409
        ret
427
        ret
410
 
428
 
411
;*******************************************************
429
;*******************************************************
412
;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
430
;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
413
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
431
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
414
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
432
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
415
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
433
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
416
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
434
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
417
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
435
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
418
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
436
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
419
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
437
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
420
;*******************************************************
438
;*******************************************************
421
ReadSector:
439
ReadSector:
422
        pushad
440
        pushad
423
        call    save_timer_fdd_motor
441
        call    save_timer_fdd_motor
424
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
442
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
425
        mov     AX, 0
443
        mov     AX, 0
426
        mov     DX, 03F7h
444
        mov     DX, 03F7h
427
        out     DX, AL
445
        out     DX, AL
428
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
446
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
429
        mov     [dmamode], 0x46
447
        mov     [dmamode], 0x46
430
        call    Init_FDC_DMA
448
        call    Init_FDC_DMA
431
; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
449
; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
432
        mov     AL, 0E6h ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
450
        mov     AL, 0E6h ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
433
        call    FDCDataOutput
451
        call    FDCDataOutput
434
        mov     AL, [FDD_Head]
452
        mov     AL, [FDD_Head]
435
        shl     AL, 2
453
        shl     AL, 2
436
        call    FDCDataOutput
454
        call    FDCDataOutput
437
        mov     AL, [FDD_Track]
455
        mov     AL, [FDD_Track]
438
        call    FDCDataOutput
456
        call    FDCDataOutput
439
        mov     AL, [FDD_Head]
457
        mov     AL, [FDD_Head]
440
        call    FDCDataOutput
458
        call    FDCDataOutput
441
        mov     AL, [FDD_Sector]
459
        mov     AL, [FDD_Sector]
442
        call    FDCDataOutput
460
        call    FDCDataOutput
443
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
461
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
444
        call    FDCDataOutput
462
        call    FDCDataOutput
445
        mov     AL, 18 ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
463
        mov     AL, 18 ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
446
        call    FDCDataOutput
464
        call    FDCDataOutput
447
        mov     AL, 1Bh ;çíà÷åíèå GPL
465
        mov     AL, 1Bh ;çíà÷åíèå GPL
448
        call    FDCDataOutput
466
        call    FDCDataOutput
449
        mov     AL, 0FFh;çíà÷åíèå DTL
467
        mov     AL, 0FFh;çíà÷åíèå DTL
450
        call    FDCDataOutput
468
        call    FDCDataOutput
451
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
469
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
452
        call    WaitFDCInterrupt
470
        call    WaitFDCInterrupt
453
        cmp     [FDC_Status], FDC_Normal
471
        cmp     [FDC_Status], FDC_Normal
454
        jne     @@Exit_1
472
        jne     @@Exit_1
455
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
473
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
456
        call    GetStatusInfo
474
        call    GetStatusInfo
457
        test    [FDC_ST0], 11011000b
475
        test    [FDC_ST0], 11011000b
458
        jnz     @@Err_1
476
        jnz     @@Err_1
459
        mov     [FDC_Status], FDC_Normal
477
        mov     [FDC_Status], FDC_Normal
460
        jmp     @@Exit_1
478
        jmp     @@Exit_1
461
@@Err_1:
479
@@Err_1:
462
        mov     [FDC_Status], FDC_SectorNotFound
480
        mov     [FDC_Status], FDC_SectorNotFound
463
;        mov   [flp_status],0
481
;        mov   [flp_status],0
464
@@Exit_1:
482
@@Exit_1:
465
        call    save_timer_fdd_motor
483
        call    save_timer_fdd_motor
466
        popad
484
        popad
467
        ret
485
        ret
468
 
486
 
469
;*******************************************************
487
;*******************************************************
470
;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
488
;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
471
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
489
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
472
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
490
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
473
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
491
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
474
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
492
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
475
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
493
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
476
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
494
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
477
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
495
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
478
;*******************************************************
496
;*******************************************************
479
ReadSectWithRetr:
497
ReadSectWithRetr:
480
        pusha
498
        pusha
481
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
499
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
482
        mov     [RecalRepCounter], 0
500
        mov     [RecalRepCounter], 0
483
@@TryAgain:
501
@@TryAgain:
484
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
502
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
485
        mov     [ReadRepCounter], 0
503
        mov     [ReadRepCounter], 0
486
@@ReadSector_1:
504
@@ReadSector_1:
487
        call    ReadSector
505
        call    ReadSector
488
        cmp     [FDC_Status], 0
506
        cmp     [FDC_Status], 0
489
        je      @@Exit_2
507
        je      @@Exit_2
490
        cmp     [FDC_Status], 1
508
        cmp     [FDC_Status], 1
491
        je      @@Err_3
509
        je      @@Err_3
492
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
510
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
493
        inc     [ReadRepCounter]
511
        inc     [ReadRepCounter]
494
        cmp     [ReadRepCounter], 3
512
        cmp     [ReadRepCounter], 3
495
        jb      @@ReadSector_1
513
        jb      @@ReadSector_1
496
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
514
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
497
        call    RecalibrateFDD
515
        call    RecalibrateFDD
498
        call    SeekTrack
516
        call    SeekTrack
499
        inc     [RecalRepCounter]
517
        inc     [RecalRepCounter]
500
        cmp     [RecalRepCounter], 3
518
        cmp     [RecalRepCounter], 3
501
        jb      @@TryAgain
519
        jb      @@TryAgain
502
;        mov   [flp_status],0
520
;        mov   [flp_status],0
503
@@Exit_2:
521
@@Exit_2:
504
        popa
522
        popa
505
        ret
523
        ret
506
@@Err_3:
524
@@Err_3:
507
        mov     [flp_status], 0
525
        mov     [flp_status], 0
508
        popa
526
        popa
509
        ret
527
        ret
510
 
528
 
511
;*******************************************************
529
;*******************************************************
512
;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
530
;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
513
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
531
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
514
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
532
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
515
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
533
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
516
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
534
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
517
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
535
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
518
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
536
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
519
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
537
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
520
;*******************************************************
538
;*******************************************************
521
WriteSector:
539
WriteSector:
522
        pushad
540
        pushad
523
        call    save_timer_fdd_motor
541
        call    save_timer_fdd_motor
524
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
542
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
525
        mov     AX, 0
543
        mov     AX, 0
526
        mov     DX, 03F7h
544
        mov     DX, 03F7h
527
        out     DX, AL
545
        out     DX, AL
528
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
546
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
529
        mov     [dmamode], 0x4A
547
        mov     [dmamode], 0x4A
530
        call    Init_FDC_DMA
548
        call    Init_FDC_DMA
531
; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
549
; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
532
        mov     AL, 0xC5 ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
550
        mov     AL, 0xC5 ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
533
        call    FDCDataOutput
551
        call    FDCDataOutput
534
        mov     AL, [FDD_Head]
552
        mov     AL, [FDD_Head]
535
        shl     AL, 2
553
        shl     AL, 2
536
        call    FDCDataOutput
554
        call    FDCDataOutput
537
        mov     AL, [FDD_Track]
555
        mov     AL, [FDD_Track]
538
        call    FDCDataOutput
556
        call    FDCDataOutput
539
        mov     AL, [FDD_Head]
557
        mov     AL, [FDD_Head]
540
        call    FDCDataOutput
558
        call    FDCDataOutput
541
        mov     AL, [FDD_Sector]
559
        mov     AL, [FDD_Sector]
542
        call    FDCDataOutput
560
        call    FDCDataOutput
543
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
561
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
544
        call    FDCDataOutput
562
        call    FDCDataOutput
545
        mov     AL, 18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
563
        mov     AL, 18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
546
        call    FDCDataOutput
564
        call    FDCDataOutput
547
        mov     AL, 1Bh ;çíà÷åíèå GPL
565
        mov     AL, 1Bh ;çíà÷åíèå GPL
548
        call    FDCDataOutput
566
        call    FDCDataOutput
549
        mov     AL, 0FFh;çíà÷åíèå DTL
567
        mov     AL, 0FFh;çíà÷åíèå DTL
550
        call    FDCDataOutput
568
        call    FDCDataOutput
551
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
569
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
552
        call    WaitFDCInterrupt
570
        call    WaitFDCInterrupt
553
        cmp     [FDC_Status], FDC_Normal
571
        cmp     [FDC_Status], FDC_Normal
554
        jne     @@Exit_3
572
        jne     @@Exit_3
555
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
573
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
556
        call    GetStatusInfo
574
        call    GetStatusInfo
557
        test    [FDC_ST0], 11000000b ;11011000b
575
        test    [FDC_ST0], 11000000b ;11011000b
558
        jnz     @@Err_2
576
        jnz     @@Err_2
559
        mov     [FDC_Status], FDC_Normal
577
        mov     [FDC_Status], FDC_Normal
560
        jmp     @@Exit_3
578
        jmp     @@Exit_3
561
@@Err_2:
579
@@Err_2:
562
        mov     [FDC_Status], FDC_SectorNotFound
580
        mov     [FDC_Status], FDC_SectorNotFound
563
@@Exit_3:
581
@@Exit_3:
564
        call    save_timer_fdd_motor
582
        call    save_timer_fdd_motor
565
        popad
583
        popad
566
        ret
584
        ret
567
 
585
 
568
;*******************************************************
586
;*******************************************************
569
;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
587
;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
570
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
588
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
571
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
589
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
572
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
590
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
573
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
591
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
574
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
592
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
575
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
593
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
576
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
594
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
577
;*******************************************************
595
;*******************************************************
578
WriteSectWithRetr:
596
WriteSectWithRetr:
579
        pusha
597
        pusha
580
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
598
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
581
        mov     [RecalRepCounter], 0
599
        mov     [RecalRepCounter], 0
582
@@TryAgain_1:
600
@@TryAgain_1:
583
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
601
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
584
        mov     [ReadRepCounter], 0
602
        mov     [ReadRepCounter], 0
585
@@WriteSector_1:
603
@@WriteSector_1:
586
        call    WriteSector
604
        call    WriteSector
587
        cmp     [FDC_Status], 0
605
        cmp     [FDC_Status], 0
588
        je      @@Exit_4
606
        je      @@Exit_4
589
        cmp     [FDC_Status], 1
607
        cmp     [FDC_Status], 1
590
        je      @@Err_4
608
        je      @@Err_4
591
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
609
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
592
        inc     [ReadRepCounter]
610
        inc     [ReadRepCounter]
593
        cmp     [ReadRepCounter], 3
611
        cmp     [ReadRepCounter], 3
594
        jb      @@WriteSector_1
612
        jb      @@WriteSector_1
595
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
613
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
596
        call    RecalibrateFDD
614
        call    RecalibrateFDD
597
        call    SeekTrack
615
        call    SeekTrack
598
        inc     [RecalRepCounter]
616
        inc     [RecalRepCounter]
599
        cmp     [RecalRepCounter], 3
617
        cmp     [RecalRepCounter], 3
600
        jb      @@TryAgain_1
618
        jb      @@TryAgain_1
601
@@Exit_4:
619
@@Exit_4:
602
        popa
620
        popa
603
        ret
621
        ret
604
@@Err_4:
622
@@Err_4:
605
        mov     [flp_status], 0
623
        mov     [flp_status], 0
606
        popa
624
        popa
607
        ret
625
        ret
608
 
626
 
609
;*********************************************
627
;*********************************************
610
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
628
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
611
;*********************************************
629
;*********************************************
612
GetStatusInfo:
630
GetStatusInfo:
613
        push    AX
631
        push    AX
614
        call    FDCDataInput
632
        call    FDCDataInput
615
        mov     [FDC_ST0], AL
633
        mov     [FDC_ST0], AL
616
        call    FDCDataInput
634
        call    FDCDataInput
617
        mov     [FDC_ST1], AL
635
        mov     [FDC_ST1], AL
618
        call    FDCDataInput
636
        call    FDCDataInput
619
        mov     [FDC_ST2], AL
637
        mov     [FDC_ST2], AL
620
        call    FDCDataInput
638
        call    FDCDataInput
621
        mov     [FDC_C], AL
639
        mov     [FDC_C], AL
622
        call    FDCDataInput
640
        call    FDCDataInput
623
        mov     [FDC_H], AL
641
        mov     [FDC_H], AL
624
        call    FDCDataInput
642
        call    FDCDataInput
625
        mov     [FDC_R], AL
643
        mov     [FDC_R], AL
626
        call    FDCDataInput
644
        call    FDCDataInput
627
        mov     [FDC_N], AL
645
        mov     [FDC_N], AL
628
        pop     AX
646
        pop     AX
629
        ret
647
        ret