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 |