Rev 1168 | Rev 1909 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1168 | Rev 1276 | ||
---|---|---|---|
Line 3... | Line 3... | ||
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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 1168 $ |
8 | $Revision: 1276 $ |
9 | 9 | ||
10 | 10 | ||
11 | ;********************************************************** |
11 | ;********************************************************** |
12 | ; Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI) |
12 | ; Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI) |
Line 13... | Line 13... | ||
13 | ;********************************************************** |
13 | ;********************************************************** |
14 | ; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷ |
14 | ; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷ |
15 | ; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79 |
15 | ; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79, |
16 | 16 | ||
17 | ; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ |
17 | ; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ |
18 | MaxRetr equ 10 |
18 | MaxRetr equ 10 |
19 | ; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû |
- | |
20 | ; (â òèêàõ) |
- | |
21 | BSYWaitTime equ 1000 ;2 |
- | |
22 | NoTickWaitTime equ 0xfffff |
- | |
23 | - | ||
24 | ;************************************************* |
- | |
25 | ;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ * |
- | |
26 | ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ * |
- | |
27 | ;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ * |
- | |
28 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
- | |
29 | ;* ïåðìåííûå: * |
- | |
30 | ;* ChannelNumber - íîìåð êàíàëà; * |
- | |
31 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
- | |
32 | ;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. * |
- | |
33 | ;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. * |
- | |
34 | ;************************************************* |
19 | ; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû |
35 | ReadCD: |
- | |
36 | pusha |
- | |
37 | ; Çàäàòü ðàçìåð ñåêòîðà |
- | |
38 | mov [CDBlockSize],2048 ;2352 |
- | |
39 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
- | |
40 | call clear_packet_buffer |
- | |
41 | ; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ |
- | |
42 | ; ñåêòîðà äàííûõ |
- | |
43 | ; Çàäàòü êîä êîìàíäû Read CD |
- | |
44 | mov [PacketCommand],byte 0x28 ;0xBE |
- | |
45 | ; Çàäàòü àäðåñ ñåêòîðà |
- | |
46 | mov AX,word [CDSectorAddress+2] |
- | |
47 | xchg AL,AH |
- | |
48 | mov word [PacketCommand+2],AX |
- | |
49 | mov AX,word [CDSectorAddress] |
- | |
50 | xchg AL,AH |
- | |
51 | mov word [PacketCommand+4],AX |
- | |
52 | ; mov eax,[CDSectorAddress] |
- | |
53 | ; mov [PacketCommand+2],eax |
- | |
54 | ; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ |
- | |
55 | mov [PacketCommand+8],byte 1 |
- | |
56 | ; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå |
- | |
57 | ; mov [PacketCommand+9],byte 0xF8 |
- | |
58 | ; Ïîäàòü êîìàíäó |
- | |
59 | call SendPacketDatCommand |
20 | ; (â òèêàõ) |
60 | popa |
21 | BSYWaitTime equ 1000 ;2 |
61 | ret |
22 | NoTickWaitTime equ 0xfffff |
62 | 23 | CDBlockSize equ 2048 |
|
63 | ;******************************************** |
24 | ;******************************************** |
Line 71... | Line 32... | ||
71 | ;----------------------------------------------------------- |
32 | ;----------------------------------------------------------- |
72 | pushad |
33 | pushad |
73 | mov eax,[CDSectorAddress] |
34 | mov eax,[CDSectorAddress] |
74 | mov ebx,[CDDataBuf_pointer] |
35 | mov ebx,[CDDataBuf_pointer] |
75 | call cd_calculate_cache |
36 | call cd_calculate_cache |
- | 37 | xor edi,edi |
|
76 | add esi,8 |
38 | add esi,8 |
77 | mov edi,1 |
39 | inc edi |
78 | .hdreadcache: |
40 | .hdreadcache: |
79 | ; cmp dword [esi+4],0 ; empty |
41 | ; cmp dword [esi+4],0 ; empty |
80 | ; je .nohdcache |
42 | ; je .nohdcache |
81 | cmp [esi],eax ; correct sector |
43 | cmp [esi],eax ; correct sector |
82 | je .yeshdcache |
44 | je .yeshdcache |
Line 126... | Line 88... | ||
126 | ; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå |
88 | ; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå |
127 | ; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê |
89 | ; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê |
128 | mov ECX,MaxRetr |
90 | mov ECX,MaxRetr |
129 | @@NextRetr: |
91 | @@NextRetr: |
130 | ; Ïîäàòü êîìàíäó |
92 | ; Ïîäàòü êîìàíäó |
- | 93 | ;************************************************* |
|
- | 94 | ;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ * |
|
- | 95 | ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ * |
|
- | 96 | ;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ * |
|
- | 97 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
|
- | 98 | ;* ïåðìåííûå: * |
|
- | 99 | ;* ChannelNumber - íîìåð êàíàëà; * |
|
- | 100 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
|
- | 101 | ;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. * |
|
- | 102 | ;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. * |
|
- | 103 | ;************************************************* |
|
- | 104 | ;ReadCD: |
|
- | 105 | push ecx |
|
- | 106 | ; pusha |
|
- | 107 | ; Çàäàòü ðàçìåð ñåêòîðà |
|
- | 108 | ; mov [CDBlockSize],2048 ;2352 |
|
- | 109 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
|
- | 110 | call clear_packet_buffer |
|
- | 111 | ; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ |
|
- | 112 | ; ñåêòîðà äàííûõ |
|
- | 113 | ; Çàäàòü êîä êîìàíäû Read CD |
|
- | 114 | mov [PacketCommand],byte 0x28 ;0xBE |
|
- | 115 | ; Çàäàòü àäðåñ ñåêòîðà |
|
- | 116 | mov AX,word [CDSectorAddress+2] |
|
- | 117 | xchg AL,AH |
|
- | 118 | mov word [PacketCommand+2],AX |
|
- | 119 | mov AX,word [CDSectorAddress] |
|
- | 120 | xchg AL,AH |
|
- | 121 | mov word [PacketCommand+4],AX |
|
- | 122 | ; mov eax,[CDSectorAddress] |
|
- | 123 | ; mov [PacketCommand+2],eax |
|
- | 124 | ; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ |
|
- | 125 | mov [PacketCommand+8],byte 1 |
|
- | 126 | ; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå |
|
- | 127 | ; mov [PacketCommand+9],byte 0xF8 |
|
- | 128 | ; Ïîäàòü êîìàíäó |
|
- | 129 | call SendPacketDatCommand |
|
131 | call ReadCD |
130 | pop ecx |
- | 131 | ; ret |
|
- | 132 | ||
132 | cmp [DevErrorCode],0 |
133 | ; cmp [DevErrorCode],0 |
- | 134 | test eax,eax |
|
133 | je @@End_4 |
135 | jz @@End_4 |
Line 134... | Line 136... | ||
134 | 136 | ||
135 | or ecx,ecx ;{SPraid.simba} (for cd load) |
137 | or ecx,ecx ;{SPraid.simba} (for cd load) |
136 | jz @@End_4 |
138 | jz @@End_4 |
Line 137... | Line 139... | ||
137 | dec ecx |
139 | dec ecx |
138 | 140 | ||
139 | cmp [timer_ticks_enable],0 |
141 | cmp [timer_ticks_enable],0 |
140 | jne @f |
142 | jne @f |
141 | mov eax,NoTickWaitTime |
143 | mov eax,NoTickWaitTime |
142 | .wait: |
144 | .wait: |
143 | dec eax |
145 | dec eax |
144 | cmp eax,0 |
146 | ; test eax,eax |
145 | je @@NextRetr |
147 | jz @@NextRetr |
146 | jmp .wait |
148 | jmp .wait |
147 | @@: |
149 | @@: |
148 | ; Çàäåðæêà íà 2,5 ñåêóíäû |
150 | ; Çàäåðæêà íà 2,5 ñåêóíäû |
Line 152... | Line 154... | ||
152 | ; call change_task |
154 | ; call change_task |
153 | ; cmp EAX,[timer_ticks] |
155 | ; cmp EAX,[timer_ticks] |
154 | ; ja @@Wait |
156 | ; ja @@Wait |
155 | loop @@NextRetr |
157 | loop @@NextRetr |
156 | @@End_4: |
158 | @@End_4: |
- | 159 | mov dword [DevErrorCode],eax |
|
157 | popad |
160 | popad |
158 | ret |
161 | ret |
Line 159... | Line 162... | ||
159 | 162 | ||
160 | 163 | ||
Line 161... | Line 164... | ||
161 | ; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå |
164 | ; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå |
162 | ; ïàêåòíûõ êîìàíä â ðåæèìå PIO |
165 | ; ïàêåòíûõ êîìàíä â ðåæèìå PIO |
163 | - | ||
Line -... | Line 166... | ||
- | 166 | ||
- | 167 | ; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè |
|
164 | ; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè |
168 | ; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ) |
165 | ; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ) |
169 | |
166 | MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä |
170 | MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä |
167 | 171 | uglobal |
|
168 | ; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû |
172 | ; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû |
169 | PacketCommand: rb 12 ;DB 12 DUP (?) |
173 | PacketCommand: rb 12 ;DB 12 DUP (?) |
170 | ; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà |
174 | ; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà |
171 | ;CDDataBuf DB 4096 DUP (0) |
175 | ;CDDataBuf DB 4096 DUP (0) |
172 | ; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ |
176 | ; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ |
173 | CDBlockSize DW ? |
177 | ;CDBlockSize DW ? |
174 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ |
178 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ |
175 | CDSectorAddress: DD ? |
179 | CDSectorAddress: DD ? |
176 | ; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì |
180 | ; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì |
177 | TickCounter_1 DD 0 |
181 | TickCounter_1 DD 0 |
178 | ; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà |
182 | ; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà |
179 | WURStartTime DD 0 |
183 | WURStartTime DD 0 |
180 | ; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ |
184 | ; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ |
181 | CDDataBuf_pointer dd 0 |
185 | CDDataBuf_pointer dd 0 |
182 | 186 | endg |
|
183 | ;**************************************************** |
187 | ;**************************************************** |
184 | ;* ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, * |
188 | ;* ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, * |
185 | ;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ * |
189 | ;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ * |
186 | ;* ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ * |
190 | ;* ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ * |
187 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
191 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
188 | ;* ïåðìåííûå: * |
192 | ;* ïåðìåííûå: * |
- | 193 | ;* ChannelNumber - íîìåð êàíàëà; * |
|
189 | ;* ChannelNumber - íîìåð êàíàëà; * |
194 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
190 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
195 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò; * |
191 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò; * |
196 | ;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ. * |
192 | ;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ. * |
197 | ; return eax DevErrorCode |
193 | ;**************************************************** |
198 | ;**************************************************** |
194 | SendPacketDatCommand: |
199 | SendPacketDatCommand: |
195 | pushad |
200 | xor eax,eax |
196 | mov [DevErrorCode],0 |
201 | ; mov byte [DevErrorCode],al |
197 | ; Çàäàòü ðåæèì CHS |
202 | ; Çàäàòü ðåæèì CHS |
198 | mov [ATAAddressMode],0 |
203 | mov byte [ATAAddressMode],al |
199 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
204 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
200 | mov [ATAFeatures],0 |
205 | mov byte [ATAFeatures],al |
201 | mov [ATASectorCount],0 |
206 | mov byte [ATASectorCount],al |
202 | mov [ATASectorNumber],0 |
207 | mov byte [ATASectorNumber],al |
203 | ; Çàãðóçèòü ðàçìåð ïåðåäàâàåìîãî áëîêà |
208 | ; Çàãðóçèòü ðàçìåð ïåðåäàâàåìîãî áëîêà |
204 | mov AX,[CDBlockSize] |
209 | mov [ATAHead],al |
- | 210 | ; mov AX,[CDBlockSize] |
|
205 | mov [ATACylinder],AX |
211 | mov [ATACylinder],CDBlockSize |
206 | mov [ATAHead],0 |
212 | mov [ATACommand],0A0h |
Line 207... | Line 213... | ||
207 | mov [ATACommand],0A0h |
213 | call SendCommandToHDD_1 |
208 | call SendCommandToHDD_1 |
214 | test eax,eax |
209 | cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè |
215 | ; cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè |
210 | jne @@End_8 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
216 | jnz @@End_8 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
211 | 217 | ||
212 | ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó |
218 | ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó |
213 | ; ïàêåòíîé êîìàíäû |
219 | ; ïàêåòíîé êîìàíäû |
214 | mov DX,[ATABasePortAddr] |
220 | mov DX,[ATABasePortAddr] |
215 | add DX,7 ;ïîðò 1õ7h |
221 | add DX,7 ;ïîðò 1õ7h |
216 | mov ecx,NoTickWaitTime |
222 | mov ecx,NoTickWaitTime |
217 | @@WaitDevice0: |
223 | @@WaitDevice0: |
218 | cmp [timer_ticks_enable],0 |
224 | cmp [timer_ticks_enable],0 |
219 | jne @f |
225 | jne @f |
220 | dec ecx |
226 | dec ecx |
221 | cmp ecx,0 |
227 | ; test ecx,ecx |
222 | je @@Err1_1 |
228 | jz @@Err1_1 |
Line 259... | Line 265... | ||
259 | mov ecx,NoTickWaitTime |
265 | mov ecx,NoTickWaitTime |
260 | @@WaitDevice1: |
266 | @@WaitDevice1: |
261 | cmp [timer_ticks_enable],0 |
267 | cmp [timer_ticks_enable],0 |
262 | jne @f |
268 | jne @f |
263 | dec ecx |
269 | dec ecx |
264 | cmp ecx,0 |
270 | ; test ecx,ecx |
265 | je @@Err1_1 |
271 | jz @@Err1_1 |
266 | jmp .test_1 |
272 | jmp .test_1 |
267 | @@: |
273 | @@: |
268 | call change_task |
274 | call change_task |
269 | ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû |
275 | ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû |
270 | mov EAX,[timer_ticks] |
276 | mov EAX,[timer_ticks] |
Line 284... | Line 290... | ||
284 | mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf |
290 | mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf |
285 | ; Çàãðóçèòü àäðåñ ðåãèñòðà äàííûõ êîíòðîëëåðà |
291 | ; Çàãðóçèòü àäðåñ ðåãèñòðà äàííûõ êîíòðîëëåðà |
286 | mov DX,[ATABasePortAddr] ;ïîðò 1x0h |
292 | mov DX,[ATABasePortAddr] ;ïîðò 1x0h |
287 | ; Çàãðóçèòü â ñ÷åò÷èê ðàçìåð áëîêà â áàéòàõ |
293 | ; Çàãðóçèòü â ñ÷åò÷èê ðàçìåð áëîêà â áàéòàõ |
288 | xor ecx,ecx |
294 | xor ecx,ecx |
289 | mov CX,[CDBlockSize] |
295 | mov CX,CDBlockSize |
290 | ; Âû÷èñëèòü ðàçìåð áëîêà â 16-ðàçðÿäíûõ ñëîâàõ |
296 | ; Âû÷èñëèòü ðàçìåð áëîêà â 16-ðàçðÿäíûõ ñëîâàõ |
291 | shr CX,1 ;ðàçäåëèòü ðàçìåð áëîêà íà 2 |
297 | shr CX,1 ;ðàçäåëèòü ðàçìåð áëîêà íà 2 |
292 | ; Ïðèíÿòü áëîê äàííûõ |
298 | ; Ïðèíÿòü áëîê äàííûõ |
293 | cli |
299 | cli |
294 | cld |
300 | cld |
295 | rep insw |
301 | rep insw |
296 | sti |
302 | sti |
297 | ; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ |
303 | ; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ |
- | 304 | @@End_8: |
|
- | 305 | xor eax,eax |
|
298 | jmp @@End_8 |
306 | ret |
Line 299... | Line 307... | ||
299 | 307 | ||
300 | ; Çàïèñàòü êîä îøèáêè |
308 | ; Çàïèñàòü êîä îøèáêè |
- | 309 | @@Err1_1: |
|
- | 310 | xor eax,eax |
|
- | 311 | inc eax |
|
301 | @@Err1_1: |
312 | ret |
302 | mov [DevErrorCode],1 |
313 | ; mov [DevErrorCode],1 |
303 | jmp @@End_8 |
314 | ; ret |
- | 315 | @@Err6_temp: |
|
- | 316 | mov eax,7 |
|
304 | @@Err6_temp: |
317 | ret |
305 | mov [DevErrorCode],7 |
318 | ; mov [DevErrorCode],7 |
306 | jmp @@End_8 |
319 | ; ret |
307 | @@Err6: |
- | |
308 | mov [DevErrorCode],6 |
320 | @@Err6: |
309 | @@End_8: |
- | |
310 | popad |
321 | mov eax,6 |
- | 322 | ret |
|
- | 323 | ; mov [DevErrorCode],6 |
|
- | 324 | ;@@End_8: |
|
Line 311... | Line 325... | ||
311 | ret |
325 | ; ret |
312 | 326 | ||
Line 321... | Line 335... | ||
321 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
335 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
322 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò. * |
336 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò. * |
323 | ;*********************************************** |
337 | ;*********************************************** |
324 | SendPacketNoDatCommand: |
338 | SendPacketNoDatCommand: |
325 | pushad |
339 | pushad |
- | 340 | xor eax,eax |
|
326 | mov [DevErrorCode],0 |
341 | ; mov byte [DevErrorCode],al |
327 | ; Çàäàòü ðåæèì CHS |
342 | ; Çàäàòü ðåæèì CHS |
328 | mov [ATAAddressMode],0 |
343 | mov byte [ATAAddressMode],al |
329 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
344 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
330 | mov [ATAFeatures],0 |
345 | mov byte [ATAFeatures],al |
331 | mov [ATASectorCount],0 |
346 | mov byte [ATASectorCount],al |
332 | mov [ATASectorNumber],0 |
347 | mov byte [ATASectorNumber],al |
333 | mov [ATACylinder],0 |
348 | mov word [ATACylinder],ax |
334 | mov [ATAHead],0 |
349 | mov byte [ATAHead],al |
335 | mov [ATACommand],0A0h |
350 | mov [ATACommand],0A0h |
336 | call SendCommandToHDD_1 |
351 | call SendCommandToHDD_1 |
337 | cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè |
352 | ; cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè |
- | 353 | test eax,eax |
|
338 | jne @@End_9 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
354 | jnz @@End_9 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
339 | ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó |
355 | ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó |
340 | ; ïàêåòíîé êîìàíäû |
356 | ; ïàêåòíîé êîìàíäû |
341 | mov DX,[ATABasePortAddr] |
357 | mov DX,[ATABasePortAddr] |
342 | add DX,7 ;ïîðò 1õ7h |
358 | add DX,7 ;ïîðò 1õ7h |
343 | @@WaitDevice0_1: |
359 | @@WaitDevice0_1: |
Line 370... | Line 386... | ||
370 | out DX,AX |
386 | out DX,AX |
371 | mov AX,word [PacketCommand+10] |
387 | mov AX,word [PacketCommand+10] |
372 | out DX,AX |
388 | out DX,AX |
373 | ; sti |
389 | ; sti |
374 | cmp [ignore_CD_eject_wait],1 |
390 | cmp [ignore_CD_eject_wait],1 |
375 | je @@End_9 |
391 | je @@clear_DEC |
376 | ; Îæèäàíèå ïîäòâåðæäåíèÿ ïðèåìà êîìàíäû |
392 | ; Îæèäàíèå ïîäòâåðæäåíèÿ ïðèåìà êîìàíäû |
377 | mov DX,[ATABasePortAddr] |
393 | mov DX,[ATABasePortAddr] |
378 | add DX,7 ;ïîðò 1õ7h |
394 | add DX,7 ;ïîðò 1õ7h |
379 | @@WaitDevice1_1: |
395 | @@WaitDevice1_1: |
380 | call change_task |
396 | call change_task |
Line 389... | Line 405... | ||
389 | jnz @@WaitDevice1_1 |
405 | jnz @@WaitDevice1_1 |
390 | test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
406 | test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
391 | jnz @@Err6_1 |
407 | jnz @@Err6_1 |
392 | test AL,40h ;ñîñòîÿíèå ñèãíàëà DRDY |
408 | test AL,40h ;ñîñòîÿíèå ñèãíàëà DRDY |
393 | jz @@WaitDevice1_1 |
409 | jz @@WaitDevice1_1 |
- | 410 | @@clear_DEC: |
|
- | 411 | and [DevErrorCode],0 |
|
394 | jmp @@End_9 |
412 | popad |
395 | 413 | ret |
|
396 | ; Çàïèñàòü êîä îøèáêè |
414 | ; Çàïèñàòü êîä îøèáêè |
397 | @@Err1_3: |
415 | @@Err1_3: |
398 | mov [DevErrorCode],1 |
416 | xor eax,eax |
- | 417 | inc eax |
|
399 | jmp @@End_9 |
418 | jmp @@End_9 |
400 | @@Err6_1: |
419 | @@Err6_1: |
401 | mov [DevErrorCode],6 |
420 | mov eax,6 |
402 | @@End_9: |
421 | @@End_9: |
- | 422 | mov [DevErrorCode],eax |
|
403 | popad |
423 | popad |
404 | ret |
424 | ret |
Line 405... | Line 425... | ||
405 | 425 | ||
406 | ;**************************************************** |
426 | ;**************************************************** |
Line 418... | Line 438... | ||
418 | ;* ATACommand - êîä êîìàíäû. * |
438 | ;* ATACommand - êîä êîìàíäû. * |
419 | ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè: * |
439 | ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè: * |
420 | ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD; * |
440 | ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD; * |
421 | ;* â DevErrorCode - íîëü. * |
441 | ;* â DevErrorCode - íîëü. * |
422 | ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò * |
442 | ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò * |
423 | ;* âîçâðàùåí êîä îøèáêè. * |
443 | ;* âîçâðàùåí êîä îøèáêè â eax * |
424 | ;**************************************************** |
444 | ;**************************************************** |
425 | SendCommandToHDD_1: |
445 | SendCommandToHDD_1: |
426 | pushad |
446 | ; pushad |
427 | mov [DevErrorCode],0 |
447 | ; mov [DevErrorCode],0 not need |
428 | ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà |
448 | ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà |
429 | cmp [ATAAddressMode],1 |
449 | cmp [ATAAddressMode],1 |
430 | ja @@Err2_4 |
450 | ja @@Err2_4 |
431 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
451 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
432 | mov BX,[ChannelNumber] |
452 | mov BX,[ChannelNumber] |
Line 457... | Line 477... | ||
457 | mov ecx,NoTickWaitTime |
477 | mov ecx,NoTickWaitTime |
458 | @@WaitHDReady_2: |
478 | @@WaitHDReady_2: |
459 | cmp [timer_ticks_enable],0 |
479 | cmp [timer_ticks_enable],0 |
460 | jne @f |
480 | jne @f |
461 | dec ecx |
481 | dec ecx |
462 | cmp ecx,0 |
482 | ; test ecx,ecx |
463 | je @@Err1_4 |
483 | jz @@Err1_4 |
464 | jmp .test |
484 | jmp .test |
465 | @@: |
485 | @@: |
466 | call change_task |
486 | call change_task |
467 | ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ |
487 | ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ |
468 | mov eax,[timer_ticks] |
488 | mov eax,[timer_ticks] |
Line 512... | Line 532... | ||
512 | mov AL,[ATACommand] |
532 | mov AL,[ATACommand] |
513 | inc DX ;ðåãèñòð êîìàíä |
533 | inc DX ;ðåãèñòð êîìàíä |
514 | out DX,AL |
534 | out DX,AL |
515 | sti |
535 | sti |
516 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
536 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
517 | mov [DevErrorCode],0 |
537 | ; mov [DevErrorCode],0 |
518 | jmp @@End_10 |
538 | @@End_10: |
- | 539 | xor eax,eax |
|
- | 540 | ret |
|
519 | ; Çàïèñàòü êîä îøèáêè |
541 | ; Çàïèñàòü êîä îøèáêè |
520 | @@Err1_4: |
542 | @@Err1_4: |
- | 543 | xor eax,eax |
|
- | 544 | inc eax |
|
521 | mov [DevErrorCode],1 |
545 | ; mov [DevErrorCode],1 |
522 | jmp @@End_10 |
546 | ret |
523 | @@Err2_4: |
547 | @@Err2_4: |
- | 548 | mov eax,2 |
|
524 | mov [DevErrorCode],2 |
549 | ; mov [DevErrorCode],2 |
525 | jmp @@End_10 |
550 | ret |
526 | @@Err3_4: |
551 | @@Err3_4: |
- | 552 | mov eax,3 |
|
527 | mov [DevErrorCode],3 |
553 | ; mov [DevErrorCode],3 |
528 | jmp @@End_10 |
554 | ret |
529 | @@Err4_4: |
555 | @@Err4_4: |
- | 556 | mov eax,4 |
|
530 | mov [DevErrorCode],4 |
557 | ; mov [DevErrorCode],4 |
531 | jmp @@End_10 |
558 | ret |
532 | @@Err5_4: |
559 | @@Err5_4: |
- | 560 | mov eax,5 |
|
533 | mov [DevErrorCode],5 |
561 | ; mov [DevErrorCode],5 |
534 | ; Çàâåðøåíèå ðàáîòû ïðîãðàììû |
562 | ; Çàâåðøåíèå ðàáîòû ïðîãðàììû |
535 | @@End_10: |
- | |
536 | ; sti |
- | |
537 | popad |
- | |
538 | ret |
563 | ret |
- | 564 | ; sti |
|
- | 565 | ; popad |
|
Line 539... | Line 566... | ||
539 | 566 | ||
540 | ;************************************************* |
567 | ;************************************************* |
541 | ;* ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ * |
568 | ;* ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ * |
542 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
569 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
Line 561... | Line 588... | ||
561 | cmp [timer_ticks_enable],0 |
588 | cmp [timer_ticks_enable],0 |
562 | jne @f |
589 | jne @f |
563 | cmp [DevErrorCode],0 |
590 | cmp [DevErrorCode],0 |
564 | je @@End_11 |
591 | je @@End_11 |
565 | dec ecx |
592 | dec ecx |
566 | cmp ecx,0 |
593 | ; cmp ecx,0 |
567 | je .Error |
594 | jz .Error |
568 | jmp @@SendCommand |
595 | jmp @@SendCommand |
569 | @@: |
596 | @@: |
570 | call change_task |
597 | call change_task |
571 | ; Ïðîâåðèòü êîä îøèáêè |
598 | ; Ïðîâåðèòü êîä îøèáêè |
572 | cmp [DevErrorCode],0 |
599 | cmp [DevErrorCode],0 |
Line 813... | Line 840... | ||
813 | call allow_medium_removal |
840 | call allow_medium_removal |
814 | mov [ignore_CD_eject_wait],1 |
841 | mov [ignore_CD_eject_wait],1 |
815 | call EjectMedium |
842 | call EjectMedium |
816 | mov [ignore_CD_eject_wait],0 |
843 | mov [ignore_CD_eject_wait],0 |
817 | ret |
844 | ret |
818 | 845 | iglobal |
|
819 | timer_ATAPI_check dd 0 |
846 | timer_ATAPI_check dd 0 |
820 | ATAPI_IDE0_lock db 0 |
847 | ATAPI_IDE0_lock db 0 |
821 | ATAPI_IDE1_lock db 0 |
848 | ATAPI_IDE1_lock db 0 |
822 | ATAPI_IDE2_lock db 0 |
849 | ATAPI_IDE2_lock db 0 |
823 | ATAPI_IDE3_lock db 0 |
850 | ATAPI_IDE3_lock db 0 |
824 | ignore_CD_eject_wait db 0 |
851 | ignore_CD_eject_wait db 0 |
825 | 852 | endg |
|
826 | ;************************************************* |
853 | ;************************************************* |
827 | ;* Ïîëó÷èòü ñîîáùåíèå î ñîáûòèè èëè ñîñòîÿíèè * |
854 | ;* Ïîëó÷èòü ñîîáùåíèå î ñîáûòèè èëè ñîñòîÿíèè * |
828 | ;* óñòðîéñòâà * |
855 | ;* óñòðîéñòâà * |
829 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
856 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
830 | ;* ïåðåìåííûå: * |
857 | ;* ïåðåìåííûå: * |
Line 894... | Line 921... | ||
894 | ; popa |
921 | ; popa |
895 | ; ret |
922 | ; ret |
Line 896... | Line 923... | ||
896 | 923 | ||
897 | clear_packet_buffer: |
924 | clear_packet_buffer: |
898 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
925 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
899 | mov [PacketCommand],dword 0 |
926 | and [PacketCommand],dword 0 |
900 | mov [PacketCommand+4],dword 0 |
927 | and [PacketCommand+4],dword 0 |
901 | mov [PacketCommand+8],dword 0 |
928 | and [PacketCommand+8],dword 0 |