Rev 2434 | Rev 3555 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2434 | Rev 2465 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. 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: 2434 $ |
8 | $Revision: 2465 $ |
9 | 9 | ||
10 | 10 | ||
11 | ;****************************************************** |
11 | ;****************************************************** |
12 | ; ïîèñê ïðèâîäîâ HDD è CD |
12 | ; ïîèñê ïðèâîäîâ HDD è CD |
13 | ; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
13 | ; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
14 | ; àäàïòàöèÿ è äîðàáîòêà Mario79 |
14 | ; àäàïòàöèÿ è äîðàáîòêà Mario79 |
15 | ;****************************************************** |
15 | ;****************************************************** |
16 | 16 | ||
17 | ;**************************************************** |
17 | ;**************************************************** |
18 | ;* ÏÎÈÑÊ HDD è CD * |
18 | ;* ÏÎÈÑÊ HDD è CD * |
19 | ;**************************************************** |
19 | ;**************************************************** |
20 | FindHDD: |
20 | FindHDD: |
21 | mov [ChannelNumber], 1 |
21 | mov [ChannelNumber], 1 |
22 | mov [DiskNumber], 0 |
22 | mov [DiskNumber], 0 |
23 | call FindHDD_3 |
23 | call FindHDD_3 |
24 | ; mov ax,[Sector512+176] |
24 | ; mov ax,[Sector512+176] |
25 | ; mov [DRIVE_DATA+6],ax |
25 | ; mov [DRIVE_DATA+6],ax |
26 | ; mov ax,[Sector512+126] |
26 | ; mov ax,[Sector512+126] |
27 | ; mov [DRIVE_DATA+8],ax |
27 | ; mov [DRIVE_DATA+8],ax |
28 | ; mov ax,[Sector512+128] |
28 | ; mov ax,[Sector512+128] |
29 | ; mov [DRIVE_DATA+8],ax |
29 | ; mov [DRIVE_DATA+8],ax |
30 | mov [DiskNumber], 1 |
30 | mov [DiskNumber], 1 |
31 | call FindHDD_3 |
31 | call FindHDD_3 |
32 | ; mov al,[Sector512+176] |
32 | ; mov al,[Sector512+176] |
33 | ; mov [DRIVE_DATA+7],al |
33 | ; mov [DRIVE_DATA+7],al |
34 | inc [ChannelNumber] |
34 | inc [ChannelNumber] |
35 | mov [DiskNumber], 0 |
35 | mov [DiskNumber], 0 |
36 | call FindHDD_3 |
36 | call FindHDD_3 |
37 | ; mov al,[Sector512+176] |
37 | ; mov al,[Sector512+176] |
38 | ; mov [DRIVE_DATA+8],al |
38 | ; mov [DRIVE_DATA+8],al |
39 | mov [DiskNumber], 1 |
39 | mov [DiskNumber], 1 |
40 | call FindHDD_1 |
40 | call FindHDD_1 |
41 | ; mov al,[Sector512+176] |
41 | ; mov al,[Sector512+176] |
42 | ; mov [DRIVE_DATA+9],al |
42 | ; mov [DRIVE_DATA+9],al |
43 | 43 | ||
44 | jmp EndFindHDD |
44 | jmp EndFindHDD |
45 | 45 | ||
46 | FindHDD_1: |
46 | FindHDD_1: |
47 | call ReadHDD_ID |
47 | call ReadHDD_ID |
48 | cmp [DevErrorCode], 0 |
48 | cmp [DevErrorCode], 0 |
49 | jne FindHDD_2 |
49 | jne FindHDD_2 |
50 | cmp [Sector512+6], word 16 |
50 | cmp [Sector512+6], word 16 |
51 | ja FindHDD_2 |
51 | ja FindHDD_2 |
52 | cmp [Sector512+12], word 255 |
52 | cmp [Sector512+12], word 255 |
53 | ja FindHDD_2 |
53 | ja FindHDD_2 |
54 | inc byte [DRIVE_DATA+1] |
54 | inc byte [DRIVE_DATA+1] |
55 | jmp FindHDD_2_2 |
55 | jmp FindHDD_2_2 |
56 | FindHDD_2: |
56 | FindHDD_2: |
57 | call DeviceReset |
57 | call DeviceReset |
58 | cmp [DevErrorCode], 0 |
58 | cmp [DevErrorCode], 0 |
59 | jne FindHDD_2_2 |
59 | jne FindHDD_2_2 |
60 | call ReadCD_ID |
60 | call ReadCD_ID |
61 | cmp [DevErrorCode], 0 |
61 | cmp [DevErrorCode], 0 |
62 | jne FindHDD_2_2 |
62 | jne FindHDD_2_2 |
63 | inc byte [DRIVE_DATA+1] |
63 | inc byte [DRIVE_DATA+1] |
64 | inc byte [DRIVE_DATA+1] |
64 | inc byte [DRIVE_DATA+1] |
65 | FindHDD_2_2: |
65 | FindHDD_2_2: |
66 | ret |
66 | ret |
67 | 67 | ||
68 | FindHDD_3: |
68 | FindHDD_3: |
69 | call FindHDD_1 |
69 | call FindHDD_1 |
70 | shl byte [DRIVE_DATA+1], 2 |
70 | shl byte [DRIVE_DATA+1], 2 |
71 | ret |
71 | ret |
72 | 72 | ||
73 | 73 | ||
74 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA |
74 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA |
75 | uglobal |
75 | uglobal |
76 | SectorAddress DD ? |
76 | SectorAddress DD ? |
77 | endg |
77 | endg |
78 | ;************************************************* |
78 | ;************************************************* |
79 | ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ * |
79 | ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ * |
80 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
80 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
81 | ;* ïåðåìåííûå: * |
81 | ;* ïåðåìåííûå: * |
82 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
82 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
83 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). * |
83 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). * |
84 | ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * |
84 | ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * |
85 | ;* â ìàññèâ Sector512. * |
85 | ;* â ìàññèâ Sector512. * |
86 | ;************************************************* |
86 | ;************************************************* |
87 | ReadHDD_ID: |
87 | ReadHDD_ID: |
88 | ; Çàäàòü ðåæèì CHS |
88 | ; Çàäàòü ðåæèì CHS |
89 | mov [ATAAddressMode], 0 |
89 | mov [ATAAddressMode], 0 |
90 | ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà |
90 | ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà |
91 | mov [ATAFeatures], 0 |
91 | mov [ATAFeatures], 0 |
92 | mov [ATAHead], 0 |
92 | mov [ATAHead], 0 |
93 | mov [ATACommand], 0ECh |
93 | mov [ATACommand], 0ECh |
94 | call SendCommandToHDD |
94 | call SendCommandToHDD |
95 | cmp [DevErrorCode], 0;ïðîâåðèòü êîä îøèáêè |
95 | cmp [DevErrorCode], 0;ïðîâåðèòü êîä îøèáêè |
96 | jne @@End ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
96 | jne @@End ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
97 | mov DX, [ATABasePortAddr] |
97 | mov DX, [ATABasePortAddr] |
98 | add DX, 7 ;àäðåñ ðåãèñòðà ñîñòîÿíè |
98 | add DX, 7 ;àäðåñ ðåãèñòðà ñîñòîÿíè |
99 | mov ecx, 0xffff |
99 | mov ecx, 0xffff |
100 | @@WaitCompleet: |
100 | @@WaitCompleet: |
101 | ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû |
101 | ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû |
102 | dec ecx |
102 | dec ecx |
103 | ; cmp ecx,0 |
103 | ; cmp ecx,0 |
104 | jz @@Error1 ;îøèáêà òàéì-àóòà |
104 | jz @@Error1 ;îøèáêà òàéì-àóòà |
105 | ; Ïðîâåðèòü ãîòîâíîñòü |
105 | ; Ïðîâåðèòü ãîòîâíîñòü |
106 | in AL, DX |
106 | in AL, DX |
107 | test AL, 80h ;ñîñòîÿíèå ñèãíàëà BSY |
107 | test AL, 80h ;ñîñòîÿíèå ñèãíàëà BSY |
108 | jnz @@WaitCompleet |
108 | jnz @@WaitCompleet |
109 | test AL, 1 ;ñîñòîÿíèå ñèãíàëà ERR |
109 | test AL, 1 ;ñîñòîÿíèå ñèãíàëà ERR |
110 | jnz @@Error6 |
110 | jnz @@Error6 |
111 | test AL, 08h ;ñîñòîÿíèå ñèãíàëà DRQ |
111 | test AL, 08h ;ñîñòîÿíèå ñèãíàëà DRQ |
112 | jz @@WaitCompleet |
112 | jz @@WaitCompleet |
113 | ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà |
113 | ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà |
114 | ; mov AX,DS |
114 | ; mov AX,DS |
115 | ; mov ES,AX |
115 | ; mov ES,AX |
116 | mov EDI, Sector512 ;offset Sector512 |
116 | mov EDI, Sector512 ;offset Sector512 |
117 | mov DX, [ATABasePortAddr];ðåãèñòð äàííûõ |
117 | mov DX, [ATABasePortAddr];ðåãèñòð äàííûõ |
118 | mov CX, 256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ |
118 | mov CX, 256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ |
119 | rep insw ;ïðèíÿòü áëîê äàííûõ |
119 | rep insw ;ïðèíÿòü áëîê äàííûõ |
120 | ret |
120 | ret |
121 | ; Çàïèñàòü êîä îøèáêè |
121 | ; Çàïèñàòü êîä îøèáêè |
122 | @@Error1: |
122 | @@Error1: |
123 | mov [DevErrorCode], 1 |
123 | mov [DevErrorCode], 1 |
124 | ret |
124 | ret |
125 | @@Error6: |
125 | @@Error6: |
126 | mov [DevErrorCode], 6 |
126 | mov [DevErrorCode], 6 |
127 | @@End: |
127 | @@End: |
128 | ret |
128 | ret |
129 | 129 | ||
130 | 130 | ||
131 | iglobal |
131 | iglobal |
132 | ; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2 |
132 | ; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2 |
133 | StandardATABases DW 1F0h, 170h |
133 | StandardATABases DW 1F0h, 170h |
134 | endg |
134 | endg |
135 | uglobal |
135 | uglobal |
136 | ; Íîìåð êàíàëà |
136 | ; Íîìåð êàíàëà |
137 | ChannelNumber DW ? |
137 | ChannelNumber DW ? |
138 | ; Íîìåð äèñêà |
138 | ; Íîìåð äèñêà |
139 | DiskNumber DB ? |
139 | DiskNumber DB ? |
140 | ; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA |
140 | ; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA |
141 | ATABasePortAddr DW ? |
141 | ATABasePortAddr DW ? |
142 | ; Ïàðàìåòðû ATA-êîìàíäû |
142 | ; Ïàðàìåòðû ATA-êîìàíäû |
143 | ATAFeatures DB ? ;îñîáåííîñòè |
143 | ATAFeatures DB ? ;îñîáåííîñòè |
144 | ATASectorCount DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ |
144 | ATASectorCount DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ |
145 | ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà |
145 | ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà |
146 | ATACylinder DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà |
146 | ATACylinder DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà |
147 | ATAHead DB ? ;íîìåð íà÷àëüíîé ãîëîâêè |
147 | ATAHead DB ? ;íîìåð íà÷àëüíîé ãîëîâêè |
148 | ATAAddressMode DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA) |
148 | ATAAddressMode DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA) |
149 | ATACommand DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ |
149 | ATACommand DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ |
150 | ; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé |
150 | ; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé |
151 | ; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè, |
151 | ; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè, |
152 | ; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà, |
152 | ; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà, |
153 | ; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè |
153 | ; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè |
154 | ; êîìàíäû) |
154 | ; êîìàíäû) |
155 | DevErrorCode dd ? |
155 | DevErrorCode dd ? |
156 | endg |
156 | endg |
157 | ;**************************************************** |
157 | ;**************************************************** |
158 | ;* ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ * |
158 | ;* ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ * |
159 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
159 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
160 | ;* ïåðåìåííûå: * |
160 | ;* ïåðåìåííûå: * |
161 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
161 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
162 | ;* DiskNumber - íîìåð äèñêà (0 èëè 1); * |
162 | ;* DiskNumber - íîìåð äèñêà (0 èëè 1); * |
163 | ;* ATAFeatures - "îñîáåííîñòè"; * |
163 | ;* ATAFeatures - "îñîáåííîñòè"; * |
164 | ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ; * |
164 | ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ; * |
165 | ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà; * |
165 | ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà; * |
166 | ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà; * |
166 | ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà; * |
167 | ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè; * |
167 | ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè; * |
168 | ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); * |
168 | ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); * |
169 | ;* ATACommand - êîä êîìàíäû. * |
169 | ;* ATACommand - êîä êîìàíäû. * |
170 | ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè: * |
170 | ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè: * |
171 | ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD; * |
171 | ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD; * |
172 | ;* â DevErrorCode - íîëü. * |
172 | ;* â DevErrorCode - íîëü. * |
173 | ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò * |
173 | ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò * |
174 | ;* âîçâðàùåí êîä îøèáêè. * |
174 | ;* âîçâðàùåí êîä îøèáêè. * |
175 | ;**************************************************** |
175 | ;**************************************************** |
176 | SendCommandToHDD: |
176 | SendCommandToHDD: |
177 | ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà |
177 | ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà |
178 | cmp [ATAAddressMode], 1 |
178 | cmp [ATAAddressMode], 1 |
179 | ja @@Err2 |
179 | ja @@Err2 |
180 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
180 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
181 | mov BX, [ChannelNumber] |
181 | mov BX, [ChannelNumber] |
182 | cmp BX, 1 |
182 | cmp BX, 1 |
183 | jb @@Err3 |
183 | jb @@Err3 |
184 | cmp BX, 2 |
184 | cmp BX, 2 |
185 | ja @@Err3 |
185 | ja @@Err3 |
186 | ; Óñòàíîâèòü áàçîâûé àäðåñ |
186 | ; Óñòàíîâèòü áàçîâûé àäðåñ |
187 | dec BX |
187 | dec BX |
188 | shl BX, 1 |
188 | shl BX, 1 |
189 | movzx ebx, bx |
189 | movzx ebx, bx |
190 | mov AX, [ebx+StandardATABases] |
190 | mov AX, [ebx+StandardATABases] |
191 | mov [ATABasePortAddr], AX |
191 | mov [ATABasePortAddr], AX |
192 | ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû |
192 | ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû |
193 | ; Âûáðàòü íóæíûé äèñê |
193 | ; Âûáðàòü íóæíûé äèñê |
194 | mov DX, [ATABasePortAddr] |
194 | mov DX, [ATABasePortAddr] |
195 | add DX, 6 ;àäðåñ ðåãèñòðà ãîëîâîê |
195 | add DX, 6 ;àäðåñ ðåãèñòðà ãîëîâîê |
196 | mov AL, [DiskNumber] |
196 | mov AL, [DiskNumber] |
197 | cmp AL, 1 ;ïðîâåðèòü íîìåðà äèñêà |
197 | cmp AL, 1 ;ïðîâåðèòü íîìåðà äèñêà |
198 | ja @@Err4 |
198 | ja @@Err4 |
199 | shl AL, 4 |
199 | shl AL, 4 |
200 | or AL, 10100000b |
200 | or AL, 10100000b |
201 | out DX, AL |
201 | out DX, AL |
202 | ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ |
202 | ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ |
203 | inc DX |
203 | inc DX |
204 | mov ecx, 0xfff |
204 | mov ecx, 0xfff |
205 | ; mov eax,[timer_ticks] |
205 | ; mov eax,[timer_ticks] |
206 | ; mov [TickCounter_1],eax |
206 | ; mov [TickCounter_1],eax |
207 | @@WaitHDReady: |
207 | @@WaitHDReady: |
208 | ; Ïðîâåðèòü âðåìÿ îæèäàíè |
208 | ; Ïðîâåðèòü âðåìÿ îæèäàíè |
209 | dec ecx |
209 | dec ecx |
210 | ; cmp ecx,0 |
210 | ; cmp ecx,0 |
211 | jz @@Err1 |
211 | jz @@Err1 |
212 | ; mov eax,[timer_ticks] |
212 | ; mov eax,[timer_ticks] |
213 | ; sub eax,[TickCounter_1] |
213 | ; sub eax,[TickCounter_1] |
214 | ; cmp eax,300 ;îæèäàòü 300 òèêîâ |
214 | ; cmp eax,300 ;îæèäàòü 300 òèêîâ |
215 | ; ja @@Err1 ;îøèáêà òàéì-àóòà |
215 | ; ja @@Err1 ;îøèáêà òàéì-àóòà |
216 | ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè |
216 | ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè |
217 | in AL, DX |
217 | in AL, DX |
218 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY |
218 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY |
219 | test AL, 80h |
219 | test AL, 80h |
220 | jnz @@WaitHDReady |
220 | jnz @@WaitHDReady |
221 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ |
221 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ |
222 | test AL, 08h |
222 | test AL, 08h |
223 | jnz @@WaitHDReady |
223 | jnz @@WaitHDReady |
224 | ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà |
224 | ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà |
225 | cli |
225 | cli |
226 | mov DX, [ATABasePortAddr] |
226 | mov DX, [ATABasePortAddr] |
227 | inc DX ;ðåãèñòð "îñîáåííîñòåé" |
227 | inc DX ;ðåãèñòð "îñîáåííîñòåé" |
228 | mov AL, [ATAFeatures] |
228 | mov AL, [ATAFeatures] |
229 | out DX, AL |
229 | out DX, AL |
230 | inc DX ;ñ÷åò÷èê ñåêòîðîâ |
230 | inc DX ;ñ÷åò÷èê ñåêòîðîâ |
231 | mov AL, [ATASectorCount] |
231 | mov AL, [ATASectorCount] |
232 | out DX, AL |
232 | out DX, AL |
233 | inc DX ;ðåãèñòð íîìåðà ñåêòîðà |
233 | inc DX ;ðåãèñòð íîìåðà ñåêòîðà |
234 | mov AL, [ATASectorNumber] |
234 | mov AL, [ATASectorNumber] |
235 | out DX, AL |
235 | out DX, AL |
236 | inc DX ;íîìåð öèëèíäðà (ìëàäøèé áàéò) |
236 | inc DX ;íîìåð öèëèíäðà (ìëàäøèé áàéò) |
237 | mov AX, [ATACylinder] |
237 | mov AX, [ATACylinder] |
238 | out DX, AL |
238 | out DX, AL |
239 | inc DX ;íîìåð öèëèíäðà (ñòàðøèé áàéò) |
239 | inc DX ;íîìåð öèëèíäðà (ñòàðøèé áàéò) |
240 | mov AL, AH |
240 | mov AL, AH |
241 | out DX, AL |
241 | out DX, AL |
242 | inc DX ;íîìåð ãîëîâêè/íîìåð äèñêà |
242 | inc DX ;íîìåð ãîëîâêè/íîìåð äèñêà |
243 | mov AL, [DiskNumber] |
243 | mov AL, [DiskNumber] |
244 | shl AL, 4 |
244 | shl AL, 4 |
245 | cmp [ATAHead], 0Fh;ïðîâåðèòü íîìåð ãîëîâêè |
245 | cmp [ATAHead], 0Fh;ïðîâåðèòü íîìåð ãîëîâêè |
246 | ja @@Err5 |
246 | ja @@Err5 |
247 | or AL, [ATAHead] |
247 | or AL, [ATAHead] |
248 | or AL, 10100000b |
248 | or AL, 10100000b |
249 | mov AH, [ATAAddressMode] |
249 | mov AH, [ATAAddressMode] |
250 | shl AH, 6 |
250 | shl AH, 6 |
251 | or AL, AH |
251 | or AL, AH |
252 | out DX, AL |
252 | out DX, AL |
253 | ; Ïîñëàòü êîìàíäó |
253 | ; Ïîñëàòü êîìàíäó |
254 | mov AL, [ATACommand] |
254 | mov AL, [ATACommand] |
255 | inc DX ;ðåãèñòð êîìàíä |
255 | inc DX ;ðåãèñòð êîìàíä |
256 | out DX, AL |
256 | out DX, AL |
257 | sti |
257 | sti |
258 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
258 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
259 | mov [DevErrorCode], 0 |
259 | mov [DevErrorCode], 0 |
260 | ret |
260 | ret |
261 | ; Çàïèñàòü êîä îøèáêè |
261 | ; Çàïèñàòü êîä îøèáêè |
262 | @@Err1: |
262 | @@Err1: |
263 | mov [DevErrorCode], 1 |
263 | mov [DevErrorCode], 1 |
264 | ret |
264 | ret |
265 | @@Err2: |
265 | @@Err2: |
266 | mov [DevErrorCode], 2 |
266 | mov [DevErrorCode], 2 |
267 | ret |
267 | ret |
268 | @@Err3: |
268 | @@Err3: |
269 | mov [DevErrorCode], 3 |
269 | mov [DevErrorCode], 3 |
270 | ret |
270 | ret |
271 | @@Err4: |
271 | @@Err4: |
272 | mov [DevErrorCode], 4 |
272 | mov [DevErrorCode], 4 |
273 | ret |
273 | ret |
274 | @@Err5: |
274 | @@Err5: |
275 | mov [DevErrorCode], 5 |
275 | mov [DevErrorCode], 5 |
276 | ; Çàâåðøåíèå ðàáîòû ïðîãðàììû |
276 | ; Çàâåðøåíèå ðàáîòû ïðîãðàììû |
277 | ret |
277 | ret |
278 | 278 | ||
279 | ;************************************************* |
279 | ;************************************************* |
280 | ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI * |
280 | ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI * |
281 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
281 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
282 | ;* ïåðìåííûå: * |
282 | ;* ïåðìåííûå: * |
283 | ;* ChannelNumber - íîìåð êàíàëà; * |
283 | ;* ChannelNumber - íîìåð êàíàëà; * |
284 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå. * |
284 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå. * |
285 | ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * |
285 | ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * |
286 | ;* â ìàññèâ Sector512. * |
286 | ;* â ìàññèâ Sector512. * |
287 | ;************************************************* |
287 | ;************************************************* |
288 | ReadCD_ID: |
288 | ReadCD_ID: |
289 | ; Çàäàòü ðåæèì CHS |
289 | ; Çàäàòü ðåæèì CHS |
290 | mov [ATAAddressMode], 0 |
290 | mov [ATAAddressMode], 0 |
291 | ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà |
291 | ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà |
292 | mov [ATAFeatures], 0 |
292 | mov [ATAFeatures], 0 |
293 | mov [ATASectorCount], 0 |
293 | mov [ATASectorCount], 0 |
294 | mov [ATASectorNumber], 0 |
294 | mov [ATASectorNumber], 0 |
295 | mov [ATACylinder], 0 |
295 | mov [ATACylinder], 0 |
296 | mov [ATAHead], 0 |
296 | mov [ATAHead], 0 |
297 | mov [ATACommand], 0A1h |
297 | mov [ATACommand], 0A1h |
298 | call SendCommandToHDD |
298 | call SendCommandToHDD |
299 | cmp [DevErrorCode], 0;ïðîâåðèòü êîä îøèáêè |
299 | cmp [DevErrorCode], 0;ïðîâåðèòü êîä îøèáêè |
300 | jne @@End_1 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
300 | jne @@End_1 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè |
301 | ; Îæèäàòü ãîòîâíîñòü äàííûõ HDD |
301 | ; Îæèäàòü ãîòîâíîñòü äàííûõ HDD |
302 | mov DX, [ATABasePortAddr] |
302 | mov DX, [ATABasePortAddr] |
303 | add DX, 7 ;ïîðò 1õ7h |
303 | add DX, 7 ;ïîðò 1õ7h |
304 | mov ecx, 0xffff |
304 | mov ecx, 0xffff |
305 | @@WaitCompleet_1: |
305 | @@WaitCompleet_1: |
306 | ; Ïðîâåðèòü âðåì |
306 | ; Ïðîâåðèòü âðåì |
307 | dec ecx |
307 | dec ecx |
308 | ; cmp ecx,0 |
308 | ; cmp ecx,0 |
309 | jz @@Error1_1 ;îøèáêà òàéì-àóòà |
309 | jz @@Error1_1 ;îøèáêà òàéì-àóòà |
310 | ; Ïðîâåðèòü ãîòîâíîñòü |
310 | ; Ïðîâåðèòü ãîòîâíîñòü |
311 | in AL, DX |
311 | in AL, DX |
312 | test AL, 80h ;ñîñòîÿíèå ñèãíàëà BSY |
312 | test AL, 80h ;ñîñòîÿíèå ñèãíàëà BSY |
313 | jnz @@WaitCompleet_1 |
313 | jnz @@WaitCompleet_1 |
314 | test AL, 1 ;ñîñòîÿíèå ñèãíàëà ERR |
314 | test AL, 1 ;ñîñòîÿíèå ñèãíàëà ERR |
315 | jnz @@Error6_1 |
315 | jnz @@Error6_1 |
316 | test AL, 08h ;ñîñòîÿíèå ñèãíàëà DRQ |
316 | test AL, 08h ;ñîñòîÿíèå ñèãíàëà DRQ |
317 | jz @@WaitCompleet_1 |
317 | jz @@WaitCompleet_1 |
318 | ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà |
318 | ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà |
319 | ; mov AX,DS |
319 | ; mov AX,DS |
320 | ; mov ES,AX |
320 | ; mov ES,AX |
321 | mov EDI, Sector512 ;offset Sector512 |
321 | mov EDI, Sector512 ;offset Sector512 |
322 | mov DX, [ATABasePortAddr];ïîðò 1x0h |
322 | mov DX, [ATABasePortAddr];ïîðò 1x0h |
323 | mov CX, 256;÷èñëî ñ÷èòûâàåìûõ ñëîâ |
323 | mov CX, 256;÷èñëî ñ÷èòûâàåìûõ ñëîâ |
324 | rep insw |
324 | rep insw |
325 | ret |
325 | ret |
326 | ; Çàïèñàòü êîä îøèáêè |
326 | ; Çàïèñàòü êîä îøèáêè |
327 | @@Error1_1: |
327 | @@Error1_1: |
328 | mov [DevErrorCode], 1 |
328 | mov [DevErrorCode], 1 |
329 | ret |
329 | ret |
330 | @@Error6_1: |
330 | @@Error6_1: |
331 | mov [DevErrorCode], 6 |
331 | mov [DevErrorCode], 6 |
332 | @@End_1: |
332 | @@End_1: |
333 | ret |
333 | ret |
334 | 334 | ||
335 | ;************************************************* |
335 | ;************************************************* |
336 | ;* ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ * |
336 | ;* ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ * |
337 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
337 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
338 | ;* ïåðåìåííûå: * |
338 | ;* ïåðåìåííûå: * |
339 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
339 | ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * |
340 | ;* DiskNumber - íîìåð äèñêà (0 èëè 1). * |
340 | ;* DiskNumber - íîìåð äèñêà (0 èëè 1). * |
341 | ;************************************************* |
341 | ;************************************************* |
342 | DeviceReset: |
342 | DeviceReset: |
343 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
343 | ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà |
344 | mov BX, [ChannelNumber] |
344 | mov BX, [ChannelNumber] |
345 | cmp BX, 1 |
345 | cmp BX, 1 |
346 | jb @@Err3_2 |
346 | jb @@Err3_2 |
347 | cmp BX, 2 |
347 | cmp BX, 2 |
348 | ja @@Err3_2 |
348 | ja @@Err3_2 |
349 | ; Óñòàíîâèòü áàçîâûé àäðåñ |
349 | ; Óñòàíîâèòü áàçîâûé àäðåñ |
350 | dec BX |
350 | dec BX |
351 | shl BX, 1 |
351 | shl BX, 1 |
352 | movzx ebx, bx |
352 | movzx ebx, bx |
353 | mov DX, [ebx+StandardATABases] |
353 | mov DX, [ebx+StandardATABases] |
354 | mov [ATABasePortAddr], DX |
354 | mov [ATABasePortAddr], DX |
355 | ; Âûáðàòü íóæíûé äèñê |
355 | ; Âûáðàòü íóæíûé äèñê |
356 | add DX, 6 ;àäðåñ ðåãèñòðà ãîëîâîê |
356 | add DX, 6 ;àäðåñ ðåãèñòðà ãîëîâîê |
357 | mov AL, [DiskNumber] |
357 | mov AL, [DiskNumber] |
358 | cmp AL, 1 ;ïðîâåðèòü íîìåðà äèñêà |
358 | cmp AL, 1 ;ïðîâåðèòü íîìåðà äèñêà |
359 | ja @@Err4_2 |
359 | ja @@Err4_2 |
360 | shl AL, 4 |
360 | shl AL, 4 |
361 | or AL, 10100000b |
361 | or AL, 10100000b |
362 | out DX, AL |
362 | out DX, AL |
363 | ; Ïîñëàòü êîìàíäó "Ñáðîñ" |
363 | ; Ïîñëàòü êîìàíäó "Ñáðîñ" |
364 | mov AL, 08h |
364 | mov AL, 08h |
365 | inc DX ;ðåãèñòð êîìàíä |
365 | inc DX ;ðåãèñòð êîìàíä |
366 | out DX, AL |
366 | out DX, AL |
367 | mov ecx, 0x80000 |
367 | mov ecx, 0x80000 |
368 | @@WaitHDReady_1: |
368 | @@WaitHDReady_1: |
369 | ; Ïðîâåðèòü âðåìÿ îæèäàíè |
369 | ; Ïðîâåðèòü âðåìÿ îæèäàíè |
370 | dec ecx |
370 | dec ecx |
371 | ; cmp ecx,0 |
371 | ; cmp ecx,0 |
372 | je @@Err1_2 ;îøèáêà òàéì-àóòà |
372 | je @@Err1_2 ;îøèáêà òàéì-àóòà |
373 | ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè |
373 | ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè |
374 | in AL, DX |
374 | in AL, DX |
375 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY |
375 | ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY |
376 | test AL, 80h |
376 | test AL, 80h |
377 | jnz @@WaitHDReady_1 |
377 | jnz @@WaitHDReady_1 |
378 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
378 | ; Ñáðîñèòü ïðèçíàê îøèáêè |
379 | mov [DevErrorCode], 0 |
379 | mov [DevErrorCode], 0 |
380 | ret |
380 | ret |
381 | ; Îáðàáîòêà îøèáîê |
381 | ; Îáðàáîòêà îøèáîê |
382 | @@Err1_2: |
382 | @@Err1_2: |
383 | mov [DevErrorCode], 1 |
383 | mov [DevErrorCode], 1 |
384 | ret |
384 | ret |
385 | @@Err3_2: |
385 | @@Err3_2: |
386 | mov [DevErrorCode], 3 |
386 | mov [DevErrorCode], 3 |
387 | ret |
387 | ret |
388 | @@Err4_2: |
388 | @@Err4_2: |
389 | mov [DevErrorCode], 4 |
389 | mov [DevErrorCode], 4 |
390 | ; Çàïèñàòü êîä îøèáêè |
390 | ; Çàïèñàòü êîä îøèáêè |
391 | ret |
391 | ret |
392 | 392 | ||
393 | EndFindHDD: |
393 | EndFindHDD: |