Subversion Repositories Kolibri OS

Rev

Rev 3555 | Rev 3908 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3555 Rev 3725
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 3555 $
8
$Revision: 3725 $
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
        DEBUGF  1, "K : Channel %d ",[ChannelNumber]:2
-
 
48
        DEBUGF  1, "Disk %d\n",[DiskNumber]:1
47
        call    ReadHDD_ID
49
        call    ReadHDD_ID
48
        cmp     [DevErrorCode], 0
50
        cmp     [DevErrorCode], 0
49
        jne     FindHDD_2
51
        jne     FindHDD_2
50
        cmp     [Sector512+6], word 16
52
        cmp     [Sector512+6], word 16
51
        ja      FindHDD_2
53
        ja      FindHDD_2
52
        cmp     [Sector512+12], word 255
54
        cmp     [Sector512+12], word 255
53
        ja      FindHDD_2
55
        ja      FindHDD_2
54
        inc     byte [DRIVE_DATA+1]
56
        inc     byte [DRIVE_DATA+1]
55
        jmp     FindHDD_2_2
57
        jmp     Print_Device_Name
56
   FindHDD_2:
58
   FindHDD_2:
57
        call    DeviceReset
59
        call    DeviceReset
58
        cmp     [DevErrorCode], 0
60
        cmp     [DevErrorCode], 0
59
        jne     FindHDD_2_2
61
        jne     FindHDD_2_2
60
        call    ReadCD_ID
62
        call    ReadCD_ID
61
        cmp     [DevErrorCode], 0
63
        cmp     [DevErrorCode], 0
62
        jne     FindHDD_2_2
64
        jne     FindHDD_2_2
63
        inc     byte [DRIVE_DATA+1]
65
        inc     byte [DRIVE_DATA+1]
64
        inc     byte [DRIVE_DATA+1]
66
        inc     byte [DRIVE_DATA+1]
-
 
67
Print_Device_Name:      
-
 
68
        pushad
-
 
69
        pushfd
-
 
70
        mov     esi, Sector512+27*2
-
 
71
        mov     edi, dev_name
-
 
72
        mov     ecx, 20
-
 
73
        cld
-
 
74
@@:
-
 
75
        lodsw
-
 
76
        xchg    ah, al
-
 
77
        stosw
-
 
78
        loop    @b
-
 
79
        popfd
-
 
80
        popad
-
 
81
        DEBUGF 1, "K : Dev: %s \n", dev_name
65
   FindHDD_2_2:
82
   FindHDD_2_2:
66
        ret
83
        ret
67
 
84
 
68
FindHDD_3:
85
FindHDD_3:
69
        call    FindHDD_1
86
        call    FindHDD_1
70
        shl     byte [DRIVE_DATA+1], 2
87
        shl     byte [DRIVE_DATA+1], 2
71
        ret
88
        ret
72
 
-
 
73
 
89
 
74
; Адрес считываемого сектора в режиме LBA
90
; Адрес считываемого сектора в режиме LBA
75
uglobal
91
uglobal
76
SectorAddress   DD ?
92
SectorAddress   DD ?
-
 
93
dev_name:
-
 
94
        rb 41
77
endg
95
endg
78
;*************************************************
96
;*************************************************
79
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
97
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
80
;* Входные параметры передаются через глобальные *
98
;* Входные параметры передаются через глобальные *
81
;* переменные:                                   *
99
;* переменные:                                   *
82
;* ChannelNumber - номер канала (1 или 2);       *
100
;* ChannelNumber - номер канала (1 или 2);       *
83
;* DiskNumber - номер диска на канале (0 или 1). *
101
;* DiskNumber - номер диска на канале (0 или 1). *
84
;* Идентификационный блок данных считывается     *
102
;* Идентификационный блок данных считывается     *
85
;* в массив Sector512.                           *
103
;* в массив Sector512.                           *
86
;*************************************************
104
;*************************************************
87
ReadHDD_ID:
105
ReadHDD_ID:
88
; Задать режим CHS
106
; Задать режим CHS
89
        mov     [ATAAddressMode], 0
107
        mov     [ATAAddressMode], 0
90
; Послать команду идентификации устройства
108
; Послать команду идентификации устройства
91
        mov     [ATAFeatures], 0
109
        mov     [ATAFeatures], 0
92
        mov     [ATAHead], 0
110
        mov     [ATAHead], 0
93
        mov     [ATACommand], 0ECh
111
        mov     [ATACommand], 0ECh
94
        call    SendCommandToHDD
112
        call    SendCommandToHDD
95
        cmp     [DevErrorCode], 0;проверить код ошибки
113
        cmp     [DevErrorCode], 0;проверить код ошибки
96
        jne     @@End  ;закончить, сохранив код ошибки
114
        jne     @@End  ;закончить, сохранив код ошибки
97
        mov     DX, [ATABasePortAddr]
115
        mov     DX, [ATABasePortAddr]
98
        add     DX, 7    ;адрес регистра состояни
116
        add     DX, 7    ;адрес регистра состояни
99
        mov     ecx, 0xffff
117
        mov     ecx, 0xffff
100
@@WaitCompleet:
118
@@WaitCompleet:
101
        ; Проверить время выполнения команды
119
        ; Проверить время выполнения команды
102
        dec     ecx
120
        dec     ecx
103
;        cmp  ecx,0
121
;        cmp  ecx,0
104
        jz      @@Error1  ;ошибка тайм-аута
122
        jz      @@Error1  ;ошибка тайм-аута
105
        ; Проверить готовность
123
        ; Проверить готовность
106
        in      AL, DX
124
        in      AL, DX
107
        test    AL, 80h  ;состояние сигнала BSY
125
        test    AL, 80h  ;состояние сигнала BSY
108
        jnz     @@WaitCompleet
126
        jnz     @@WaitCompleet
109
        test    AL, 1    ;состояние сигнала ERR
127
        test    AL, 1    ;состояние сигнала ERR
110
        jnz     @@Error6
128
        jnz     @@Error6
111
        test    AL, 08h  ;состояние сигнала DRQ
129
        test    AL, 08h  ;состояние сигнала DRQ
112
        jz      @@WaitCompleet
130
        jz      @@WaitCompleet
113
; Принять блок данных от контроллера
131
; Принять блок данных от контроллера
114
;        mov     AX,DS
132
;        mov     AX,DS
115
;        mov     ES,AX
133
;        mov     ES,AX
116
        mov     EDI, Sector512 ;offset Sector512
134
        mov     EDI, Sector512 ;offset Sector512
117
        mov     DX, [ATABasePortAddr];регистр данных
135
        mov     DX, [ATABasePortAddr];регистр данных
118
        mov     CX, 256  ;число считываемых слов
136
        mov     CX, 256  ;число считываемых слов
119
        rep insw         ;принять блок данных
137
        rep insw         ;принять блок данных
120
        ret
138
        ret
121
; Записать код ошибки
139
; Записать код ошибки
122
@@Error1:
140
@@Error1:
123
        mov     [DevErrorCode], 1
141
        mov     [DevErrorCode], 1
124
        ret
142
        ret
125
@@Error6:
143
@@Error6:
126
        mov     [DevErrorCode], 6
144
        mov     [DevErrorCode], 6
127
@@End:
145
@@End:
128
        ret
146
        ret
129
 
147
 
130
 
148
 
131
iglobal
149
iglobal
132
; Стандартные базовые адреса каналов 1 и 2
150
; Стандартные базовые адреса каналов 1 и 2
133
StandardATABases DW 1F0h, 170h
151
StandardATABases DW 1F0h, 170h
134
endg
152
endg
135
uglobal
153
uglobal
136
; Номер канала
154
; Номер канала
137
ChannelNumber   DW ?
155
ChannelNumber   DW ?
138
; Номер диска
156
; Номер диска
139
DiskNumber      DB ?
157
DiskNumber      DB ?
140
; Базовый адрес группы портов контроллера ATA
158
; Базовый адрес группы портов контроллера ATA
141
ATABasePortAddr DW ?
159
ATABasePortAddr DW ?
142
; Параметры ATA-команды
160
; Параметры ATA-команды
143
ATAFeatures     DB ? ;особенности
161
ATAFeatures     DB ? ;особенности
144
ATASectorCount  DB ? ;количество обрабатываемых секторов
162
ATASectorCount  DB ? ;количество обрабатываемых секторов
145
ATASectorNumber DB ? ;номер начального сектора
163
ATASectorNumber DB ? ;номер начального сектора
146
ATACylinder     DW ? ;номер начального цилиндра
164
ATACylinder     DW ? ;номер начального цилиндра
147
ATAHead         DB ? ;номер начальной головки
165
ATAHead         DB ? ;номер начальной головки
148
ATAAddressMode  DB ? ;режим адресации (0 - CHS, 1 - LBA)
166
ATAAddressMode  DB ? ;режим адресации (0 - CHS, 1 - LBA)
149
ATACommand      DB ? ;код команды, подлежащей выполнению
167
ATACommand      DB ? ;код команды, подлежащей выполнению
150
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
168
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
151
; интервал ожидания, 2 - неверный код режима адресации,
169
; интервал ожидания, 2 - неверный код режима адресации,
152
; 3 - неверный номер канала, 4 - неверный номер диска,
170
; 3 - неверный номер канала, 4 - неверный номер диска,
153
; 5 - неверный номер головки, 6 - ошибка при выполнении
171
; 5 - неверный номер головки, 6 - ошибка при выполнении
154
; команды)
172
; команды)
155
DevErrorCode dd ?
173
DevErrorCode dd ?
156
endg
174
endg
157
;****************************************************
175
;****************************************************
158
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
176
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
159
;* Входные параметры передаются через глобальные    *
177
;* Входные параметры передаются через глобальные    *
160
;* переменные:                                      *
178
;* переменные:                                      *
161
;* ChannelNumber - номер канала (1 или 2);          *
179
;* ChannelNumber - номер канала (1 или 2);          *
162
;* DiskNumber - номер диска (0 или 1);              *
180
;* DiskNumber - номер диска (0 или 1);              *
163
;* ATAFeatures - "особенности";                     *
181
;* ATAFeatures - "особенности";                     *
164
;* ATASectorCount - количество секторов;            *
182
;* ATASectorCount - количество секторов;            *
165
;* ATASectorNumber - номер начального сектора;      *
183
;* ATASectorNumber - номер начального сектора;      *
166
;* ATACylinder - номер начального цилиндра;         *
184
;* ATACylinder - номер начального цилиндра;         *
167
;* ATAHead - номер начальной головки;               *
185
;* ATAHead - номер начальной головки;               *
168
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
186
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
169
;* ATACommand - код команды.                        *
187
;* ATACommand - код команды.                        *
170
;* После успешного выполнения функции:              *
188
;* После успешного выполнения функции:              *
171
;* в ATABasePortAddr - базовый адрес HDD;           *
189
;* в ATABasePortAddr - базовый адрес HDD;           *
172
;* в DevErrorCode - ноль.                           *
190
;* в DevErrorCode - ноль.                           *
173
;* При возникновении ошибки в DevErrorCode будет    *
191
;* При возникновении ошибки в DevErrorCode будет    *
174
;* возвращен код ошибки.                            *
192
;* возвращен код ошибки.                            *
175
;****************************************************
193
;****************************************************
176
SendCommandToHDD:
194
SendCommandToHDD:
177
; Проверить значение кода режима
195
; Проверить значение кода режима
178
        cmp     [ATAAddressMode], 1
196
        cmp     [ATAAddressMode], 1
179
        ja      @@Err2
197
        ja      @@Err2
180
; Проверить корректность номера канала
198
; Проверить корректность номера канала
181
        mov     BX, [ChannelNumber]
199
        mov     BX, [ChannelNumber]
182
        cmp     BX, 1
200
        cmp     BX, 1
183
        jb      @@Err3
201
        jb      @@Err3
184
        cmp     BX, 2
202
        cmp     BX, 2
185
        ja      @@Err3
203
        ja      @@Err3
186
; Установить базовый адрес
204
; Установить базовый адрес
187
        dec     BX
205
        dec     BX
188
        shl     BX, 1
206
        shl     BX, 1
189
        movzx   ebx, bx
207
        movzx   ebx, bx
190
        mov     AX, [ebx+StandardATABases]
208
        mov     AX, [ebx+StandardATABases]
191
        mov     [ATABasePortAddr], AX
209
        mov     [ATABasePortAddr], AX
192
; Ожидание готовности HDD к приему команды
210
; Ожидание готовности HDD к приему команды
193
        ; Выбрать нужный диск
211
        ; Выбрать нужный диск
194
        mov     DX, [ATABasePortAddr]
212
        mov     DX, [ATABasePortAddr]
195
        add     DX, 6   ;адрес регистра головок
213
        add     DX, 6   ;адрес регистра головок
196
        mov     AL, [DiskNumber]
214
        mov     AL, [DiskNumber]
197
        cmp     AL, 1   ;проверить номера диска
215
        cmp     AL, 1   ;проверить номера диска
198
        ja      @@Err4
216
        ja      @@Err4
199
        shl     AL, 4
217
        shl     AL, 4
200
        or      AL, 10100000b
218
        or      AL, 10100000b
201
        out     DX, AL
219
        out     DX, AL
202
        ; Ожидать, пока диск не будет готов
220
        ; Ожидать, пока диск не будет готов
203
        inc     DX
221
        inc     DX
204
        mov     ecx, 0xfff
222
        mov     ecx, 0xfff
205
;        mov     eax,[timer_ticks]
223
;        mov     eax,[timer_ticks]
206
;        mov     [TickCounter_1],eax
224
;        mov     [TickCounter_1],eax
207
@@WaitHDReady:
225
@@WaitHDReady:
208
        ; Проверить время ожидани
226
        ; Проверить время ожидани
209
        dec     ecx
227
        dec     ecx
210
;        cmp  ecx,0
228
;        cmp  ecx,0
211
        jz      @@Err1
229
        jz      @@Err1
212
;        mov     eax,[timer_ticks]
230
;        mov     eax,[timer_ticks]
213
;        sub     eax,[TickCounter_1]
231
;        sub     eax,[TickCounter_1]
214
;        cmp     eax,300    ;ожидать 300 тиков
232
;        cmp     eax,300    ;ожидать 300 тиков
215
;        ja      @@Err1   ;ошибка тайм-аута
233
;        ja      @@Err1   ;ошибка тайм-аута
216
        ; Прочитать регистр состояни
234
        ; Прочитать регистр состояни
217
        in      AL, DX
235
        in      AL, DX
218
        ; Проверить состояние сигнала BSY
236
        ; Проверить состояние сигнала BSY
219
        test    AL, 80h
237
        test    AL, 80h
220
        jnz     @@WaitHDReady
238
        jnz     @@WaitHDReady
221
        ; Проверить состояние сигнала DRQ
239
        ; Проверить состояние сигнала DRQ
222
        test    AL, 08h
240
        test    AL, 08h
223
        jnz     @@WaitHDReady
241
        jnz     @@WaitHDReady
224
; Загрузить команду в регистры контроллера
242
; Загрузить команду в регистры контроллера
225
        cli
243
        cli
226
        mov     DX, [ATABasePortAddr]
244
        mov     DX, [ATABasePortAddr]
227
        inc     DX      ;регистр "особенностей"
245
        inc     DX      ;регистр "особенностей"
228
        mov     AL, [ATAFeatures]
246
        mov     AL, [ATAFeatures]
229
        out     DX, AL
247
        out     DX, AL
230
        inc     DX      ;счетчик секторов
248
        inc     DX      ;счетчик секторов
231
        mov     AL, [ATASectorCount]
249
        mov     AL, [ATASectorCount]
232
        out     DX, AL
250
        out     DX, AL
233
        inc     DX      ;регистр номера сектора
251
        inc     DX      ;регистр номера сектора
234
        mov     AL, [ATASectorNumber]
252
        mov     AL, [ATASectorNumber]
235
        out     DX, AL
253
        out     DX, AL
236
        inc     DX      ;номер цилиндра (младший байт)
254
        inc     DX      ;номер цилиндра (младший байт)
237
        mov     AX, [ATACylinder]
255
        mov     AX, [ATACylinder]
238
        out     DX, AL
256
        out     DX, AL
239
        inc     DX      ;номер цилиндра (старший байт)
257
        inc     DX      ;номер цилиндра (старший байт)
240
        mov     AL, AH
258
        mov     AL, AH
241
        out     DX, AL
259
        out     DX, AL
242
        inc     DX      ;номер головки/номер диска
260
        inc     DX      ;номер головки/номер диска
243
        mov     AL, [DiskNumber]
261
        mov     AL, [DiskNumber]
244
        shl     AL, 4
262
        shl     AL, 4
245
        cmp     [ATAHead], 0Fh;проверить номер головки
263
        cmp     [ATAHead], 0Fh;проверить номер головки
246
        ja      @@Err5
264
        ja      @@Err5
247
        or      AL, [ATAHead]
265
        or      AL, [ATAHead]
248
        or      AL, 10100000b
266
        or      AL, 10100000b
249
        mov     AH, [ATAAddressMode]
267
        mov     AH, [ATAAddressMode]
250
        shl     AH, 6
268
        shl     AH, 6
251
        or      AL, AH
269
        or      AL, AH
252
        out     DX, AL
270
        out     DX, AL
253
; Послать команду
271
; Послать команду
254
        mov     AL, [ATACommand]
272
        mov     AL, [ATACommand]
255
        inc     DX      ;регистр команд
273
        inc     DX      ;регистр команд
256
        out     DX, AL
274
        out     DX, AL
257
        sti
275
        sti
258
; Сбросить признак ошибки
276
; Сбросить признак ошибки
259
        mov     [DevErrorCode], 0
277
        mov     [DevErrorCode], 0
260
        ret
278
        ret
261
; Записать код ошибки
279
; Записать код ошибки
262
@@Err1:
280
@@Err1:
263
        mov     [DevErrorCode], 1
281
        mov     [DevErrorCode], 1
264
        ret
282
        ret
265
@@Err2:
283
@@Err2:
266
        mov     [DevErrorCode], 2
284
        mov     [DevErrorCode], 2
267
        ret
285
        ret
268
@@Err3:
286
@@Err3:
269
        mov     [DevErrorCode], 3
287
        mov     [DevErrorCode], 3
270
        ret
288
        ret
271
@@Err4:
289
@@Err4:
272
        mov     [DevErrorCode], 4
290
        mov     [DevErrorCode], 4
273
        ret
291
        ret
274
@@Err5:
292
@@Err5:
275
        mov     [DevErrorCode], 5
293
        mov     [DevErrorCode], 5
276
; Завершение работы программы
294
; Завершение работы программы
277
        ret
295
        ret
278
 
296
 
279
;*************************************************
297
;*************************************************
280
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
298
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
281
;* Входные параметры передаются через глобальные *
299
;* Входные параметры передаются через глобальные *
282
;* перменные:                                    *
300
;* перменные:                                    *
283
;* ChannelNumber - номер канала;                 *
301
;* ChannelNumber - номер канала;                 *
284
;* DiskNumber - номер диска на канале.           *
302
;* DiskNumber - номер диска на канале.           *
285
;* Идентификационный блок данных считывается     *
303
;* Идентификационный блок данных считывается     *
286
;* в массив Sector512.                           *
304
;* в массив Sector512.                           *
287
;*************************************************
305
;*************************************************
288
ReadCD_ID:
306
ReadCD_ID:
289
; Задать режим CHS
307
; Задать режим CHS
290
        mov     [ATAAddressMode], 0
308
        mov     [ATAAddressMode], 0
291
; Послать команду идентификации устройства
309
; Послать команду идентификации устройства
292
        mov     [ATAFeatures], 0
310
        mov     [ATAFeatures], 0
293
        mov     [ATASectorCount], 0
311
        mov     [ATASectorCount], 0
294
        mov     [ATASectorNumber], 0
312
        mov     [ATASectorNumber], 0
295
        mov     [ATACylinder], 0
313
        mov     [ATACylinder], 0
296
        mov     [ATAHead], 0
314
        mov     [ATAHead], 0
297
        mov     [ATACommand], 0A1h
315
        mov     [ATACommand], 0A1h
298
        call    SendCommandToHDD
316
        call    SendCommandToHDD
299
        cmp     [DevErrorCode], 0;проверить код ошибки
317
        cmp     [DevErrorCode], 0;проверить код ошибки
300
        jne     @@End_1  ;закончить, сохранив код ошибки
318
        jne     @@End_1  ;закончить, сохранив код ошибки
301
; Ожидать готовность данных HDD
319
; Ожидать готовность данных HDD
302
        mov     DX, [ATABasePortAddr]
320
        mov     DX, [ATABasePortAddr]
303
        add     DX, 7  ;порт 1х7h
321
        add     DX, 7  ;порт 1х7h
304
        mov     ecx, 0xffff
322
        mov     ecx, 0xffff
305
@@WaitCompleet_1:
323
@@WaitCompleet_1:
306
        ; Проверить врем
324
        ; Проверить врем
307
        dec     ecx
325
        dec     ecx
308
;        cmp    ecx,0
326
;        cmp    ecx,0
309
        jz      @@Error1_1 ;ошибка тайм-аута
327
        jz      @@Error1_1 ;ошибка тайм-аута
310
        ; Проверить готовность
328
        ; Проверить готовность
311
        in      AL, DX
329
        in      AL, DX
312
        test    AL, 80h  ;состояние сигнала BSY
330
        test    AL, 80h  ;состояние сигнала BSY
313
        jnz     @@WaitCompleet_1
331
        jnz     @@WaitCompleet_1
314
        test    AL, 1    ;состояние сигнала ERR
332
        test    AL, 1    ;состояние сигнала ERR
315
        jnz     @@Error6_1
333
        jnz     @@Error6_1
316
        test    AL, 08h  ;состояние сигнала DRQ
334
        test    AL, 08h  ;состояние сигнала DRQ
317
        jz      @@WaitCompleet_1
335
        jz      @@WaitCompleet_1
318
; Принять блок данных от контроллера
336
; Принять блок данных от контроллера
319
;        mov     AX,DS
337
;        mov     AX,DS
320
;        mov     ES,AX
338
;        mov     ES,AX
321
        mov     EDI, Sector512 ;offset Sector512
339
        mov     EDI, Sector512 ;offset Sector512
322
        mov     DX, [ATABasePortAddr];порт 1x0h
340
        mov     DX, [ATABasePortAddr];порт 1x0h
323
        mov     CX, 256;число считываемых слов
341
        mov     CX, 256;число считываемых слов
324
        rep insw
342
        rep insw
325
        ret
343
        ret
326
; Записать код ошибки
344
; Записать код ошибки
327
@@Error1_1:
345
@@Error1_1:
328
        mov     [DevErrorCode], 1
346
        mov     [DevErrorCode], 1
329
        ret
347
        ret
330
@@Error6_1:
348
@@Error6_1:
331
        mov     [DevErrorCode], 6
349
        mov     [DevErrorCode], 6
332
@@End_1:
350
@@End_1:
333
        ret
351
        ret
334
 
352
 
335
;*************************************************
353
;*************************************************
336
;*                СБРОС УСТРОЙСТВА               *
354
;*                СБРОС УСТРОЙСТВА               *
337
;* Входные параметры передаются через глобальные *
355
;* Входные параметры передаются через глобальные *
338
;* переменные:                                   *
356
;* переменные:                                   *
339
;* ChannelNumber - номер канала (1 или 2);       *
357
;* ChannelNumber - номер канала (1 или 2);       *
340
;* DiskNumber - номер диска (0 или 1).           *
358
;* DiskNumber - номер диска (0 или 1).           *
341
;*************************************************
359
;*************************************************
342
DeviceReset:
360
DeviceReset:
343
; Проверить корректность номера канала
361
; Проверить корректность номера канала
344
        mov     BX, [ChannelNumber]
362
        mov     BX, [ChannelNumber]
345
        cmp     BX, 1
363
        cmp     BX, 1
346
        jb      @@Err3_2
364
        jb      @@Err3_2
347
        cmp     BX, 2
365
        cmp     BX, 2
348
        ja      @@Err3_2
366
        ja      @@Err3_2
349
; Установить базовый адрес
367
; Установить базовый адрес
350
        dec     BX
368
        dec     BX
351
        shl     BX, 1
369
        shl     BX, 1
352
        movzx   ebx, bx
370
        movzx   ebx, bx
353
        mov     DX, [ebx+StandardATABases]
371
        mov     DX, [ebx+StandardATABases]
354
        mov     [ATABasePortAddr], DX
372
        mov     [ATABasePortAddr], DX
355
; Выбрать нужный диск
373
; Выбрать нужный диск
356
        add     DX, 6   ;адрес регистра головок
374
        add     DX, 6   ;адрес регистра головок
357
        mov     AL, [DiskNumber]
375
        mov     AL, [DiskNumber]
358
        cmp     AL, 1   ;проверить номера диска
376
        cmp     AL, 1   ;проверить номера диска
359
        ja      @@Err4_2
377
        ja      @@Err4_2
360
        shl     AL, 4
378
        shl     AL, 4
361
        or      AL, 10100000b
379
        or      AL, 10100000b
362
        out     DX, AL
380
        out     DX, AL
363
; Послать команду "Сброс"
381
; Послать команду "Сброс"
364
        mov     AL, 08h
382
        mov     AL, 08h
365
        inc     DX      ;регистр команд
383
        inc     DX      ;регистр команд
366
        out     DX, AL
384
        out     DX, AL
367
        mov     ecx, 0x80000
385
        mov     ecx, 0x80000
368
@@WaitHDReady_1:
386
@@WaitHDReady_1:
369
        ; Проверить время ожидани
387
        ; Проверить время ожидани
370
        dec     ecx
388
        dec     ecx
371
;        cmp     ecx,0
389
;        cmp     ecx,0
372
        je      @@Err1_2 ;ошибка тайм-аута
390
        je      @@Err1_2 ;ошибка тайм-аута
373
        ; Прочитать регистр состояни
391
        ; Прочитать регистр состояни
374
        in      AL, DX
392
        in      AL, DX
375
        ; Проверить состояние сигнала BSY
393
        ; Проверить состояние сигнала BSY
376
        test    AL, 80h
394
        test    AL, 80h
377
        jnz     @@WaitHDReady_1
395
        jnz     @@WaitHDReady_1
378
; Сбросить признак ошибки
396
; Сбросить признак ошибки
379
        mov     [DevErrorCode], 0
397
        mov     [DevErrorCode], 0
380
        ret
398
        ret
381
; Обработка ошибок
399
; Обработка ошибок
382
@@Err1_2:
400
@@Err1_2:
383
        mov     [DevErrorCode], 1
401
        mov     [DevErrorCode], 1
384
        ret
402
        ret
385
@@Err3_2:
403
@@Err3_2:
386
        mov     [DevErrorCode], 3
404
        mov     [DevErrorCode], 3
387
        ret
405
        ret
388
@@Err4_2:
406
@@Err4_2:
389
        mov     [DevErrorCode], 4
407
        mov     [DevErrorCode], 4
390
; Записать код ошибки
408
; Записать код ошибки
391
        ret
409
        ret
392
 
410
 
393
EndFindHDD:
411
EndFindHDD: