Subversion Repositories Kolibri OS

Rev

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

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