Subversion Repositories Kolibri OS

Rev

Rev 2455 | Rev 3702 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2455 Rev 3539
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 2455 $
8
$Revision: 3539 $
9
 
9
 
10
 
10
 
11
;******************************************************
11
;******************************************************
12
; ïîèñê ïðèâîäîâ HDD è CD
12
; поиск приводов HDD и CD
Line 13... Line 13...
13
; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
13
; автор исходного текста Кулаков Владимир Геннадьевич.
14
; àäàïòàöèÿ è äîðàáîòêà Mario79
14
; адаптация и доработка Mario79
15
;******************************************************
15
;******************************************************
16
 
16
 
17
;****************************************************
17
;****************************************************
18
;*                 ÏÎÈÑÊ HDD è CD                   *
18
;*                 ПОИСК HDD и CD                   *
19
;****************************************************
19
;****************************************************
Line 69... Line 69...
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
Line 72... Line 72...
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
Line 127... Line 127...
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:
Line 271... Line 271...
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
Line 278... Line 278...
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:
Line 333... Line 333...
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
Line 390... Line 390...
390
; Çàïèñàòü êîä îøèáêè
390
; Записать код ошибки