Subversion Repositories Kolibri OS

Rev

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

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