Subversion Repositories Kolibri OS

Rev

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

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