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