Subversion Repositories Kolibri OS

Rev

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

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