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