Subversion Repositories Kolibri OS

Rev

Rev 346 | Rev 425 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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