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