Subversion Repositories Kolibri OS

Rev

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

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