Subversion Repositories Kolibri OS

Rev

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

Rev 593 Rev 1168
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. 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: 593 $
8
$Revision: 1168 $
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:  pop     DX
179
@@End_6:  pop     DX
180
        pop     ECX
180
        pop     ECX
181
        ret
181
        ret
182
 
182
 
183
;*********************************************
183
;*********************************************
184
;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
184
;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
185
;*********************************************
185
;*********************************************
186
FDCInterrupt:
186
FDCInterrupt:
187
; Óñòàíîâèòü ôëàã ïðåðûâàíè
187
; Óñòàíîâèòü ôëàã ïðåðûâàíè
188
        mov     [FDD_IntFlag],1
188
        mov     [FDD_IntFlag],1
189
        ret
189
        ret
190
 
190
 
191
 
191
 
192
;******************************************
192
;******************************************
193
;* ÓÑÒÀÍÎÂÈÒÜ ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈÉ *
193
;* ÓÑÒÀÍÎÂÈÒÜ ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈÉ *
194
;*             ÍÃÌÄ                       *
194
;*             ÍÃÌÄ                       *
195
;******************************************
195
;******************************************
196
SetUserInterrupts:
196
SetUserInterrupts:
197
         mov     [fdc_irq_func],FDCInterrupt
197
         mov     [fdc_irq_func],FDCInterrupt
198
         ret
198
         ret
199
 
199
 
200
;*******************************************
200
;*******************************************
201
;* ÎÆÈÄÀÍÈÅ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
201
;* ÎÆÈÄÀÍÈÅ ÏÐÅÐÛÂÀÍÈß ÎÒ ÊÎÍÒÐÎËËÅÐÀ ÍÃÌÄ *
202
;*******************************************
202
;*******************************************
203
WaitFDCInterrupt:
203
WaitFDCInterrupt:
204
        pusha
204
        pusha
205
; Ñáðîñèòü áàéò ñîñòîÿíèÿ îïåðàöèè
205
; Ñáðîñèòü áàéò ñîñòîÿíèÿ îïåðàöèè
206
        mov     [FDC_Status],FDC_Normal
206
        mov     [FDC_Status],FDC_Normal
207
; Ñáðîñèòü ôëàã ïðåðûâàíè
207
; Ñáðîñèòü ôëàã ïðåðûâàíè
208
        mov     [FDD_IntFlag],0
208
        mov     [FDD_IntFlag],0
209
; Îáíóëèòü ñ÷åò÷èê òèêîâ
209
; Îáíóëèòü ñ÷åò÷èê òèêîâ
210
        mov     eax,[timer_ticks]
210
        mov     eax,[timer_ticks]
211
        mov     [TickCounter],eax
211
        mov     [TickCounter],eax
212
; Îæèäàòü óñòàíîâêè ôëàãà ïðåðûâàíèÿ ÍÃÌÄ
212
; Îæèäàòü óñòàíîâêè ôëàãà ïðåðûâàíèÿ ÍÃÌÄ
213
@@TestRS_2:
213
@@TestRS_2:
214
        cmp     [FDD_IntFlag],0
214
        cmp     [FDD_IntFlag],0
215
        jnz     @@End_7           ;ïðåðûâàíèå ïðîèçîøëî
215
        jnz     @@End_7           ;ïðåðûâàíèå ïðîèçîøëî
216
        call    change_task
216
        call    change_task
217
        mov     eax,[timer_ticks]
217
        mov     eax,[timer_ticks]
218
        sub     eax,[TickCounter]
218
        sub     eax,[TickCounter]
219
        cmp     eax,50  ;25   ;5 ;îæèäàòü 5 òèêîâ
219
        cmp     eax,50  ;25   ;5 ;îæèäàòü 5 òèêîâ
220
        jb      @@TestRS_2
220
        jb      @@TestRS_2
221
;        jl      @@TestRS_2
221
;        jl      @@TestRS_2
222
; Îøèáêà òàéì-àóòà
222
; Îøèáêà òàéì-àóòà
223
        mov     [FDC_Status],FDC_TimeOut
223
        mov     [FDC_Status],FDC_TimeOut
224
;        mov   [flp_status],0
224
;        mov   [flp_status],0
225
@@End_7:  popa
225
@@End_7:  popa
226
        ret
226
        ret
227
 
227
 
228
;*********************************
228
;*********************************
229
;* ÂÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ "A:" *
229
;* ÂÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ "A:" *
230
;*********************************
230
;*********************************
231
FDDMotorON:
231
FDDMotorON:
232
        pusha
232
        pusha
233
;        cmp     [fdd_motor_status],1
233
;        cmp     [fdd_motor_status],1
234
;        je      fdd_motor_on
234
;        je      fdd_motor_on
235
        mov     al,[flp_number]
235
        mov     al,[flp_number]
236
        cmp     [fdd_motor_status],al
236
        cmp     [fdd_motor_status],al
237
        je      fdd_motor_on
237
        je      fdd_motor_on
238
; Ïðîèçâåñòè ñáðîñ êîíòðîëëåðà ÍÃÌÄ
238
; Ïðîèçâåñòè ñáðîñ êîíòðîëëåðà ÍÃÌÄ
239
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
239
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
240
        mov     AL,0
240
        mov     AL,0
241
        out     DX,AL
241
        out     DX,AL
242
; Âûáðàòü è âêëþ÷èòü ìîòîð äèñêîâîäà
242
; Âûáðàòü è âêëþ÷èòü ìîòîð äèñêîâîäà
243
        cmp     [flp_number],1
243
        cmp     [flp_number],1
244
        jne     FDDMotorON_B
244
        jne     FDDMotorON_B
245
;        call    FDDMotorOFF_B
245
;        call    FDDMotorOFF_B
246
        mov     AL,1Ch    ; Floppy A
246
        mov     AL,1Ch    ; Floppy A
247
        jmp     FDDMotorON_1
247
        jmp     FDDMotorON_1
248
FDDMotorON_B:
248
FDDMotorON_B:
249
;        call    FDDMotorOFF_A
249
;        call    FDDMotorOFF_A
250
        mov     AL,2Dh    ; Floppy B
250
        mov     AL,2Dh    ; Floppy B
251
FDDMotorON_1:
251
FDDMotorON_1:
252
        out     DX,AL
252
        out     DX,AL
253
; Îáíóëèòü ñ÷åò÷èê òèêîâ
253
; Îáíóëèòü ñ÷åò÷èê òèêîâ
254
        mov     eax,[timer_ticks]
254
        mov     eax,[timer_ticks]
255
        mov     [TickCounter],eax
255
        mov     [TickCounter],eax
256
; Îæèäàòü 0,5 ñ
256
; Îæèäàòü 0,5 ñ
257
@@dT:
257
@@dT:
258
        call    change_task
258
        call    change_task
259
        mov     eax,[timer_ticks]
259
        mov     eax,[timer_ticks]
260
        sub     eax,[TickCounter]
260
        sub     eax,[TickCounter]
261
        cmp     eax,50  ;10
261
        cmp     eax,50  ;10
262
        jb      @@dT
262
        jb      @@dT
263
        cmp     [flp_number],1
263
        cmp     [flp_number],1
264
        jne     fdd_motor_on_B
264
        jne     fdd_motor_on_B
265
        mov     [fdd_motor_status],1
265
        mov     [fdd_motor_status],1
266
        jmp     fdd_motor_on
266
        jmp     fdd_motor_on
267
fdd_motor_on_B:
267
fdd_motor_on_B:
268
        mov     [fdd_motor_status],2
268
        mov     [fdd_motor_status],2
269
fdd_motor_on:
269
fdd_motor_on:
270
        call    save_timer_fdd_motor
270
        call    save_timer_fdd_motor
271
        popa
271
        popa
272
        ret
272
        ret
273
 
273
 
274
;*****************************************
274
;*****************************************
275
;*  ÑÎÕÐÀÍÅÍÈÅ ÓÊÀÇÀÒÅËß ÂÐÅÌÅÍÈ         *
275
;*  ÑÎÕÐÀÍÅÍÈÅ ÓÊÀÇÀÒÅËß ÂÐÅÌÅÍÈ         *
276
;*****************************************
276
;*****************************************
277
save_timer_fdd_motor:
277
save_timer_fdd_motor:
278
        mov     eax,[timer_ticks]
278
        mov     eax,[timer_ticks]
279
        mov     [timer_fdd_motor],eax
279
        mov     [timer_fdd_motor],eax
280
        ret
280
        ret
281
 
281
 
282
;*****************************************
282
;*****************************************
283
;*  ÏÐÎÂÅÐÊÀ ÇÀÄÅÐÆÊÈ ÂÛÊËÞ×ÅÍÈß ÌÎÒÎÐÀ  *
283
;*  ÏÐÎÂÅÐÊÀ ÇÀÄÅÐÆÊÈ ÂÛÊËÞ×ÅÍÈß ÌÎÒÎÐÀ  *
284
;*****************************************
284
;*****************************************
-
 
285
align 4
285
check_fdd_motor_status:
286
check_fdd_motor_status:
286
        cmp     [fdd_motor_status],0
287
        cmp     [fdd_motor_status],0
287
        je      end_check_fdd_motor_status_1
288
        je      end_check_fdd_motor_status_1
288
        mov     eax,[timer_ticks]
289
        mov     eax,[timer_ticks]
289
        sub     eax,[timer_fdd_motor]
290
        sub     eax,[timer_fdd_motor]
290
        cmp     eax,500
291
        cmp     eax,500
291
        jb      end_check_fdd_motor_status
292
        jb      end_check_fdd_motor_status
292
        call    FDDMotorOFF
293
        call    FDDMotorOFF
293
        mov     [fdd_motor_status],0
294
        mov     [fdd_motor_status],0
294
end_check_fdd_motor_status_1:
295
end_check_fdd_motor_status_1:
295
        mov     [flp_status],0
296
        mov     [flp_status],0
296
end_check_fdd_motor_status:
297
end_check_fdd_motor_status:
297
        ret
298
        ret
298
 
299
 
299
;**********************************
300
;**********************************
300
;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
301
;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
301
;**********************************
302
;**********************************
302
FDDMotorOFF:
303
FDDMotorOFF:
303
        push    AX
304
        push    AX
304
        push    DX
305
        push    DX
305
        cmp     [flp_number],1
306
        cmp     [flp_number],1
306
        jne     FDDMotorOFF_1
307
        jne     FDDMotorOFF_1
307
        call    FDDMotorOFF_A
308
        call    FDDMotorOFF_A
308
        jmp     FDDMotorOFF_2
309
        jmp     FDDMotorOFF_2
309
FDDMotorOFF_1:
310
FDDMotorOFF_1:
310
        call    FDDMotorOFF_B
311
        call    FDDMotorOFF_B
311
FDDMotorOFF_2:
312
FDDMotorOFF_2:
312
        pop     DX
313
        pop     DX
313
        pop     AX
314
        pop     AX
314
        ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
315
        ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
315
        mov    [root_read],0
316
        mov    [root_read],0
316
        mov    [flp_fat],0
317
        mov    [flp_fat],0
317
        ret
318
        ret
318
 
319
 
319
FDDMotorOFF_A:
320
FDDMotorOFF_A:
320
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
321
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
321
        mov     AL,0Ch  ; Floppy A
322
        mov     AL,0Ch  ; Floppy A
322
        out     DX,AL
323
        out     DX,AL
323
        ret
324
        ret
324
 
325
 
325
FDDMotorOFF_B:
326
FDDMotorOFF_B:
326
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
327
        mov     DX,3F2h ;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
327
        mov     AL,5h  ; Floppy B
328
        mov     AL,5h  ; Floppy B
328
        out     DX,AL
329
        out     DX,AL
329
        ret
330
        ret
330
 
331
 
331
;*******************************
332
;*******************************
332
;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
333
;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
333
;*******************************
334
;*******************************
334
RecalibrateFDD:
335
RecalibrateFDD:
335
        pusha
336
        pusha
336
        call    save_timer_fdd_motor
337
        call    save_timer_fdd_motor
337
; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
338
; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
338
        mov     AL,07h
339
        mov     AL,07h
339
        call    FDCDataOutput
340
        call    FDCDataOutput
340
        mov     AL,00h
341
        mov     AL,00h
341
        call    FDCDataOutput
342
        call    FDCDataOutput
342
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
343
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
343
        call    WaitFDCInterrupt
344
        call    WaitFDCInterrupt
344
;        cmp    [FDC_Status],0
345
;        cmp    [FDC_Status],0
345
;        je    no_fdc_status_error
346
;        je    no_fdc_status_error
346
;        mov   [flp_status],0
347
;        mov   [flp_status],0
347
;no_fdc_status_error:
348
;no_fdc_status_error:
348
        call    save_timer_fdd_motor
349
        call    save_timer_fdd_motor
349
        popa
350
        popa
350
        ret
351
        ret
351
 
352
 
352
;*****************************************************
353
;*****************************************************
353
;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
354
;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
354
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
355
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
355
;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
356
;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
356
;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
357
;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
357
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
358
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
358
;*****************************************************
359
;*****************************************************
359
SeekTrack:
360
SeekTrack:
360
        pusha
361
        pusha
361
        call    save_timer_fdd_motor
362
        call    save_timer_fdd_motor
362
; Ïîäàòü êîìàíäó "Ïîèñê"
363
; Ïîäàòü êîìàíäó "Ïîèñê"
363
        mov     AL,0Fh
364
        mov     AL,0Fh
364
        call    FDCDataOutput
365
        call    FDCDataOutput
365
        ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
366
        ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
366
        mov     AL,[FDD_Head]
367
        mov     AL,[FDD_Head]
367
        shl     AL,2
368
        shl     AL,2
368
        call    FDCDataOutput
369
        call    FDCDataOutput
369
        ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
370
        ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
370
        mov     AL,[FDD_Track]
371
        mov     AL,[FDD_Track]
371
        call    FDCDataOutput
372
        call    FDCDataOutput
372
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
373
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
373
        call    WaitFDCInterrupt
374
        call    WaitFDCInterrupt
374
        cmp     [FDC_Status],FDC_Normal
375
        cmp     [FDC_Status],FDC_Normal
375
        jne     @@Exit
376
        jne     @@Exit
376
; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
377
; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
377
        mov     AL,08h
378
        mov     AL,08h
378
        call    FDCDataOutput
379
        call    FDCDataOutput
379
        call    FDCDataInput
380
        call    FDCDataInput
380
        mov     [FDC_ST0],AL
381
        mov     [FDC_ST0],AL
381
        call    FDCDataInput
382
        call    FDCDataInput
382
        mov     [FDC_C],AL
383
        mov     [FDC_C],AL
383
; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
384
; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
384
        ; Ïîèñê çàâåðøåí?
385
        ; Ïîèñê çàâåðøåí?
385
        test    [FDC_ST0],100000b
386
        test    [FDC_ST0],100000b
386
        je      @@Err
387
        je      @@Err
387
        ; Çàäàííûé òðåê íàéäåí?
388
        ; Çàäàííûé òðåê íàéäåí?
388
        mov     AL,[FDC_C]
389
        mov     AL,[FDC_C]
389
        cmp     AL,[FDD_Track]
390
        cmp     AL,[FDD_Track]
390
        jne     @@Err
391
        jne     @@Err
391
        ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
392
        ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
392
        mov     AL,[FDC_ST0]
393
        mov     AL,[FDC_ST0]
393
        and     AL,100b
394
        and     AL,100b
394
        shr     AL,2
395
        shr     AL,2
395
        cmp     AL,[FDD_Head]
396
        cmp     AL,[FDD_Head]
396
        jne     @@Err
397
        jne     @@Err
397
        ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
398
        ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
398
        mov     [FDC_Status],FDC_Normal
399
        mov     [FDC_Status],FDC_Normal
399
        jmp @@Exit
400
        jmp @@Exit
400
@@Err:  ; Òðåê íå íàéäåí
401
@@Err:  ; Òðåê íå íàéäåí
401
        mov     [FDC_Status],FDC_TrackNotFound
402
        mov     [FDC_Status],FDC_TrackNotFound
402
;        mov   [flp_status],0
403
;        mov   [flp_status],0
403
@@Exit:
404
@@Exit:
404
        call    save_timer_fdd_motor
405
        call    save_timer_fdd_motor
405
        popa
406
        popa
406
        ret
407
        ret
407
 
408
 
408
;*******************************************************
409
;*******************************************************
409
;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
410
;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
410
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
411
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
411
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
412
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
412
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
413
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
413
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
414
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
414
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
415
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
415
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
416
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
416
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
417
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
417
;*******************************************************
418
;*******************************************************
418
ReadSector:
419
ReadSector:
419
        pushad
420
        pushad
420
        call    save_timer_fdd_motor
421
        call    save_timer_fdd_motor
421
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
422
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
422
        mov     AX,0
423
        mov     AX,0
423
        mov     DX,03F7h
424
        mov     DX,03F7h
424
        out     DX,AL
425
        out     DX,AL
425
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
426
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
426
        mov     [dmamode],0x46
427
        mov     [dmamode],0x46
427
        call    Init_FDC_DMA
428
        call    Init_FDC_DMA
428
; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
429
; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
429
        mov     AL,0E6h  ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
430
        mov     AL,0E6h  ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
430
        call    FDCDataOutput
431
        call    FDCDataOutput
431
        mov     AL,[FDD_Head]
432
        mov     AL,[FDD_Head]
432
        shl     AL,2
433
        shl     AL,2
433
        call    FDCDataOutput
434
        call    FDCDataOutput
434
        mov     AL,[FDD_Track]
435
        mov     AL,[FDD_Track]
435
        call    FDCDataOutput
436
        call    FDCDataOutput
436
        mov     AL,[FDD_Head]
437
        mov     AL,[FDD_Head]
437
        call    FDCDataOutput
438
        call    FDCDataOutput
438
        mov     AL,[FDD_Sector]
439
        mov     AL,[FDD_Sector]
439
        call    FDCDataOutput
440
        call    FDCDataOutput
440
        mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
441
        mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
441
        call    FDCDataOutput
442
        call    FDCDataOutput
442
        mov     AL,18  ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
443
        mov     AL,18  ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
443
        call    FDCDataOutput
444
        call    FDCDataOutput
444
        mov     AL,1Bh  ;çíà÷åíèå GPL
445
        mov     AL,1Bh  ;çíà÷åíèå GPL
445
        call    FDCDataOutput
446
        call    FDCDataOutput
446
        mov     AL,0FFh ;çíà÷åíèå DTL
447
        mov     AL,0FFh ;çíà÷åíèå DTL
447
        call    FDCDataOutput
448
        call    FDCDataOutput
448
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
449
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
449
        call    WaitFDCInterrupt
450
        call    WaitFDCInterrupt
450
        cmp     [FDC_Status],FDC_Normal
451
        cmp     [FDC_Status],FDC_Normal
451
        jne     @@Exit_1
452
        jne     @@Exit_1
452
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
453
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
453
        call    GetStatusInfo
454
        call    GetStatusInfo
454
        test    [FDC_ST0],11011000b
455
        test    [FDC_ST0],11011000b
455
        jnz     @@Err_1
456
        jnz     @@Err_1
456
        mov     [FDC_Status],FDC_Normal
457
        mov     [FDC_Status],FDC_Normal
457
        jmp @@Exit_1
458
        jmp @@Exit_1
458
@@Err_1:  mov     [FDC_Status],FDC_SectorNotFound
459
@@Err_1:  mov     [FDC_Status],FDC_SectorNotFound
459
;        mov   [flp_status],0
460
;        mov   [flp_status],0
460
@@Exit_1:
461
@@Exit_1:
461
        call    save_timer_fdd_motor
462
        call    save_timer_fdd_motor
462
        popad
463
        popad
463
        ret
464
        ret
464
 
465
 
465
;*******************************************************
466
;*******************************************************
466
;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
467
;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
467
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
468
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
468
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
469
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
469
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
470
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
470
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
471
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
471
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
472
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
472
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
473
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
473
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
474
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
474
;*******************************************************
475
;*******************************************************
475
ReadSectWithRetr:
476
ReadSectWithRetr:
476
        pusha
477
        pusha
477
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
478
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
478
        mov     [RecalRepCounter],0
479
        mov     [RecalRepCounter],0
479
@@TryAgain:
480
@@TryAgain:
480
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
481
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
481
        mov     [ReadRepCounter],0
482
        mov     [ReadRepCounter],0
482
@@ReadSector_1:
483
@@ReadSector_1:
483
        call    ReadSector
484
        call    ReadSector
484
        cmp     [FDC_Status],0
485
        cmp     [FDC_Status],0
485
        je      @@Exit_2
486
        je      @@Exit_2
486
        cmp     [FDC_Status],1
487
        cmp     [FDC_Status],1
487
        je      @@Err_3
488
        je      @@Err_3
488
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
489
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
489
        inc     [ReadRepCounter]
490
        inc     [ReadRepCounter]
490
        cmp     [ReadRepCounter],3
491
        cmp     [ReadRepCounter],3
491
        jb      @@ReadSector_1
492
        jb      @@ReadSector_1
492
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
493
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
493
        call    RecalibrateFDD
494
        call    RecalibrateFDD
494
        call    SeekTrack
495
        call    SeekTrack
495
        inc     [RecalRepCounter]
496
        inc     [RecalRepCounter]
496
        cmp     [RecalRepCounter],3
497
        cmp     [RecalRepCounter],3
497
        jb      @@TryAgain
498
        jb      @@TryAgain
498
;        mov   [flp_status],0
499
;        mov   [flp_status],0
499
@@Exit_2:
500
@@Exit_2:
500
        popa
501
        popa
501
        ret
502
        ret
502
@@Err_3:
503
@@Err_3:
503
        mov   [flp_status],0
504
        mov   [flp_status],0
504
        popa
505
        popa
505
        ret
506
        ret
506
 
507
 
507
;*******************************************************
508
;*******************************************************
508
;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
509
;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
509
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
510
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
510
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
511
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
511
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
512
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
512
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
513
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
513
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
514
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
514
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
515
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
515
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
516
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
516
;*******************************************************
517
;*******************************************************
517
WriteSector:
518
WriteSector:
518
        pushad
519
        pushad
519
        call    save_timer_fdd_motor
520
        call    save_timer_fdd_motor
520
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
521
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
521
        mov     AX,0
522
        mov     AX,0
522
        mov     DX,03F7h
523
        mov     DX,03F7h
523
        out     DX,AL
524
        out     DX,AL
524
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
525
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
525
        mov     [dmamode],0x4A
526
        mov     [dmamode],0x4A
526
        call    Init_FDC_DMA
527
        call    Init_FDC_DMA
527
; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
528
; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
528
        mov     AL,0xC5  ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
529
        mov     AL,0xC5  ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
529
        call    FDCDataOutput
530
        call    FDCDataOutput
530
        mov     AL,[FDD_Head]
531
        mov     AL,[FDD_Head]
531
        shl     AL,2
532
        shl     AL,2
532
        call    FDCDataOutput
533
        call    FDCDataOutput
533
        mov     AL,[FDD_Track]
534
        mov     AL,[FDD_Track]
534
        call    FDCDataOutput
535
        call    FDCDataOutput
535
        mov     AL,[FDD_Head]
536
        mov     AL,[FDD_Head]
536
        call    FDCDataOutput
537
        call    FDCDataOutput
537
        mov     AL,[FDD_Sector]
538
        mov     AL,[FDD_Sector]
538
        call    FDCDataOutput
539
        call    FDCDataOutput
539
        mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
540
        mov     AL,2    ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
540
        call    FDCDataOutput
541
        call    FDCDataOutput
541
        mov     AL,18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
542
        mov     AL,18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
542
        call    FDCDataOutput
543
        call    FDCDataOutput
543
        mov     AL,1Bh  ;çíà÷åíèå GPL
544
        mov     AL,1Bh  ;çíà÷åíèå GPL
544
        call    FDCDataOutput
545
        call    FDCDataOutput
545
        mov     AL,0FFh ;çíà÷åíèå DTL
546
        mov     AL,0FFh ;çíà÷åíèå DTL
546
        call    FDCDataOutput
547
        call    FDCDataOutput
547
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
548
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
548
        call    WaitFDCInterrupt
549
        call    WaitFDCInterrupt
549
        cmp     [FDC_Status],FDC_Normal
550
        cmp     [FDC_Status],FDC_Normal
550
        jne     @@Exit_3
551
        jne     @@Exit_3
551
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
552
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
552
        call    GetStatusInfo
553
        call    GetStatusInfo
553
        test    [FDC_ST0],11000000b  ;11011000b
554
        test    [FDC_ST0],11000000b  ;11011000b
554
        jnz     @@Err_2
555
        jnz     @@Err_2
555
        mov     [FDC_Status],FDC_Normal
556
        mov     [FDC_Status],FDC_Normal
556
        jmp @@Exit_3
557
        jmp @@Exit_3
557
@@Err_2:  mov     [FDC_Status],FDC_SectorNotFound
558
@@Err_2:  mov     [FDC_Status],FDC_SectorNotFound
558
@@Exit_3:
559
@@Exit_3:
559
        call    save_timer_fdd_motor
560
        call    save_timer_fdd_motor
560
        popad
561
        popad
561
        ret
562
        ret
562
 
563
 
563
;*******************************************************
564
;*******************************************************
564
;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
565
;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
565
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
566
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
566
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
567
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
567
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
568
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
568
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
569
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
569
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
570
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
570
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
571
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
571
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
572
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
572
;*******************************************************
573
;*******************************************************
573
WriteSectWithRetr:
574
WriteSectWithRetr:
574
        pusha
575
        pusha
575
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
576
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
576
        mov     [RecalRepCounter],0
577
        mov     [RecalRepCounter],0
577
@@TryAgain_1:
578
@@TryAgain_1:
578
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
579
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
579
        mov     [ReadRepCounter],0
580
        mov     [ReadRepCounter],0
580
@@WriteSector_1:
581
@@WriteSector_1:
581
        call    WriteSector
582
        call    WriteSector
582
        cmp     [FDC_Status],0
583
        cmp     [FDC_Status],0
583
        je      @@Exit_4
584
        je      @@Exit_4
584
        cmp     [FDC_Status],1
585
        cmp     [FDC_Status],1
585
        je      @@Err_4
586
        je      @@Err_4
586
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
587
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
587
        inc     [ReadRepCounter]
588
        inc     [ReadRepCounter]
588
        cmp     [ReadRepCounter],3
589
        cmp     [ReadRepCounter],3
589
        jb      @@WriteSector_1
590
        jb      @@WriteSector_1
590
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
591
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
591
        call    RecalibrateFDD
592
        call    RecalibrateFDD
592
        call    SeekTrack
593
        call    SeekTrack
593
        inc     [RecalRepCounter]
594
        inc     [RecalRepCounter]
594
        cmp     [RecalRepCounter],3
595
        cmp     [RecalRepCounter],3
595
        jb      @@TryAgain_1
596
        jb      @@TryAgain_1
596
@@Exit_4:
597
@@Exit_4:
597
        popa
598
        popa
598
        ret
599
        ret
599
@@Err_4:
600
@@Err_4:
600
        mov   [flp_status],0
601
        mov   [flp_status],0
601
        popa
602
        popa
602
        ret
603
        ret
603
 
604
 
604
;*********************************************
605
;*********************************************
605
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
606
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
606
;*********************************************
607
;*********************************************
607
GetStatusInfo:
608
GetStatusInfo:
608
        push    AX
609
        push    AX
609
        call    FDCDataInput
610
        call    FDCDataInput
610
        mov     [FDC_ST0],AL
611
        mov     [FDC_ST0],AL
611
        call    FDCDataInput
612
        call    FDCDataInput
612
        mov     [FDC_ST1],AL
613
        mov     [FDC_ST1],AL
613
        call    FDCDataInput
614
        call    FDCDataInput
614
        mov     [FDC_ST2],AL
615
        mov     [FDC_ST2],AL
615
        call    FDCDataInput
616
        call    FDCDataInput
616
        mov     [FDC_C],AL
617
        mov     [FDC_C],AL
617
        call    FDCDataInput
618
        call    FDCDataInput
618
        mov     [FDC_H],AL
619
        mov     [FDC_H],AL
619
        call    FDCDataInput
620
        call    FDCDataInput
620
        mov     [FDC_R],AL
621
        mov     [FDC_R],AL
621
        call    FDCDataInput
622
        call    FDCDataInput
622
        mov     [FDC_N],AL
623
        mov     [FDC_N],AL
623
        pop     AX
624
        pop     AX
624
        ret
625
        ret