Subversion Repositories Kolibri OS

Rev

Rev 6842 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6842 Rev 8051
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2015. 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 6842 $
8
$Revision: 8051 $
Line 9... Line 9...
9
 
9
 
10
; HDD and CD search
10
; HDD and CD search
Line 161... Line 161...
161
        xor     ah, ah
161
        xor     ah, ah
162
;--------------------------------------
162
;--------------------------------------
163
.end:
163
.end:
164
        ret
164
        ret
165
;-----------------------------------------------------------------------------
165
;-----------------------------------------------------------------------------
166
; Адрес считываемого сектора в режиме LBA
166
; Address of reading sector in LBA mode
167
uglobal
167
uglobal
168
SectorAddress   dd ?
168
SectorAddress   dd ?
169
dev_name:
169
dev_name:
170
        rb 41
170
        rb 41
171
endg
171
endg
172
;-----------------------------------------------------------------------------
172
;-----------------------------------------------------------------------------
173
;*************************************************
173
;*************************************************
174
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
174
;*     READING THE HARD DISK IDENTIFIER          *
175
;* Входные параметры передаются через глобальные *
175
;* Input parameters are passed through the global*
176
;* переменные:                                   *
176
;* variables:                                    *
177
;* ChannelNumber - номер канала (1 или 2);       *
177
;* ChannelNumber - channel number (1 or 2);      *
178
;* DiskNumber - номер диска на канале (0 или 1). *
178
;* DiskNumber - disk number on channel (0 or 1)  *
179
;* Идентификационный блок данных считывается     *
179
;* Block of identificational data is reading     *
180
;* в массив Sector512.                           *
180
;* to Sector512 array.                           *
181
;*************************************************
181
;*************************************************
182
ReadHDD_ID:
182
ReadHDD_ID:
183
; Задать режим CHS
183
; set up CHS mode
184
        mov     [ATAAddressMode], 0
184
        mov     [ATAAddressMode], 0
185
; Послать команду идентификации устройства
185
; send device identification command
186
        mov     [ATAFeatures], 0
186
        mov     [ATAFeatures], 0
187
        mov     [ATAHead], 0
187
        mov     [ATAHead], 0
188
        mov     [ATACommand], 0xEC
188
        mov     [ATACommand], 0xEC
189
        call    SendCommandToHDD
189
        call    SendCommandToHDD
190
        cmp     [DevErrorCode], 0 ;проверить код ошибки
190
        cmp     [DevErrorCode], 0 ; check the error code
191
        jne     @@End  ;закончить, сохранив код ошибки
191
        jne     @@End    ; finish, saving the error code
Line 192... Line 192...
192
 
192
 
193
        mov     dx, [ATABasePortAddr]
193
        mov     dx, [ATABasePortAddr]
194
        add     dx, 7    ;адрес регистра состояни
194
        add     dx, 7    ; address of state register
195
        mov     ecx, 0xffff
195
        mov     ecx, 0xffff
196
@@WaitCompleet:
196
@@WaitCompleet:
197
        ; Проверить время выполнения команды
197
        ; Check command execution time
198
        dec     ecx
198
        dec     ecx
199
        jz      @@Error1  ;ошибка тайм-аута
199
        jz      @@Error1 ; timeout error
200
        ; Проверить готовность
200
        ; Check if ready or not
201
        in      al, dx
201
        in      al, dx
202
        test    al, 80h  ;состояние сигнала BSY
202
        test    al, 80h  ; BSY signal state
Line 203... Line 203...
203
        jnz     @@WaitCompleet
203
        jnz     @@WaitCompleet
204
 
204
 
Line 205... Line 205...
205
        test    al, 1    ;состояние сигнала ERR
205
        test    al, 1    ; ERR signal state
206
        jnz     @@Error6
206
        jnz     @@Error6
207
 
207
 
208
        test    al, 08h  ;состояние сигнала DRQ
208
        test    al, 08h  ; DRQ signal state
209
        jz      @@WaitCompleet
209
        jz      @@WaitCompleet
210
; Принять блок данных от контроллера
210
; Receive data block from controller
211
        mov     edi, Sector512
211
        mov     edi, Sector512
212
        mov     dx, [ATABasePortAddr];регистр данных
212
        mov     dx, [ATABasePortAddr]; data register
213
        mov     cx, 256  ;число считываемых слов
213
        mov     cx, 256  ; number of word to receive
214
        rep insw         ;принять блок данных
214
        rep insw         ; receive data block
215
        ret
215
        ret
216
; Записать код ошибки
216
; write the error code
217
@@Error1:
217
@@Error1:
218
        mov     [DevErrorCode], 1
218
        mov     [DevErrorCode], 1
219
        ret
219
        ret
220
@@Error6:
220
@@Error6:
221
        mov     [DevErrorCode], 6
221
        mov     [DevErrorCode], 6
222
@@End:
222
@@End:
223
        ret
223
        ret
224
;-----------------------------------------------------------------------------
224
;-----------------------------------------------------------------------------
225
uglobal
225
uglobal
226
; Стандартные базовые адреса каналов 1 и 2
226
; Standart base addresses of channels 1 or 2
227
StandardATABases dw ?, ? ; 1F0h, 170h
227
StandardATABases dw ?, ? ; 1F0h, 170h
228
; Номер канала
228
; Channel number
229
ChannelNumber   db ?
229
ChannelNumber   db ?
230
; Номер диска
230
; Disk number
231
DiskNumber      db ?
231
DiskNumber      db ?
232
DeviceNumber    db ?
232
DeviceNumber    db ?
233
; Базовый адрес группы портов контроллера ATA
233
; Base address of ATA controller's port group
234
ATABasePortAddr dw ?
234
ATABasePortAddr dw ?
235
; Параметры ATA-команды
235
; ATA-command parameters
236
ATAFeatures     db ? ;особенности
236
ATAFeatures     db ? ; features
237
ATASectorCount  db ? ;количество обрабатываемых секторов
237
ATASectorCount  db ? ; count of processing sectors
238
ATASectorNumber db ? ;номер начального сектора
238
ATASectorNumber db ? ; initial sector number
239
ATACylinder     dw ? ;номер начального цилиндра
239
ATACylinder     dw ? ; initial cylinder number
240
ATAHead         db ? ;номер начальной головки
240
ATAHead         db ? ; initial head number
241
ATAAddressMode  db ? ;режим адресации (0 - CHS, 1 - LBA)
241
ATAAddressMode  db ? ; addressing mode (0 - CHS, 1 - LBA)
242
ATACommand      db ? ;код команды, подлежащей выполнению
242
ATACommand      db ? ; executing command number
243
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
243
; Error code (0 - no errors, 1 - waiting time limit exceed
244
; интервал ожидания, 2 - неверный код режима адресации,
244
; 2 - incorrect code of addressing mode,
245
; 3 - неверный номер канала, 4 - неверный номер диска,
245
; 3 - incorrect channel number, 4 - incorrect disk number,
246
; 5 - неверный номер головки, 6 - ошибка при выполнении
246
; 5 - incorrect head number, 6 - command execution error,
247
; команды, 7 - таймаут при выборе канала)
247
; 7 - time out when choosing channel)
248
DevErrorCode dd ?
248
DevErrorCode dd ?
249
endg
249
endg
250
;-----------------------------------------------------------------------------
250
;-----------------------------------------------------------------------------
251
;****************************************************
251
;****************************************************
252
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
252
;*          SEND COMMAND TO GIVEN DISK              *
253
;* Входные параметры передаются через глобальные    *
253
;* Input parameters are passed through the global   *
254
;* переменные:                                      *
254
;* variables:                                       *
255
;* ChannelNumber - номер канала (1 или 2);          *
255
;* ChannelNumber - channel number (1 or 2);         *
256
;* DiskNumber - номер диска (0 или 1);              *
256
;* DiskNumber - disk number (0 or 1);               *
257
;* ATAFeatures - "особенности";                     *
257
;* ATAFeatures - "features";                        *
258
;* ATASectorCount - количество секторов;            *
258
;* ATASectorCount - sector count;                   *
259
;* ATASectorNumber - номер начального сектора;      *
259
;* ATASectorNumber - initial sector number;         *
260
;* ATACylinder - номер начального цилиндра;         *
260
;* ATACylinder - initial cylinder number;           *
261
;* ATAHead - номер начальной головки;               *
261
;* ATAHead - initial head number;                   *
262
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
262
;* ATAAddressMode - addressing mode (0-CHS, 1-LBA); *
263
;* ATACommand - код команды.                        *
263
;* ATACommand - command code.                       *
264
;* После успешного выполнения функции:              *
264
;* If the function finished successfully:           *
265
;* в ATABasePortAddr - базовый адрес HDD;           *
265
;* in ATABasePortAddr - base address of HDD;        *
266
;* в DevErrorCode - ноль.                           *
266
;* in DevErrorCode - zero.                          *
267
;* При возникновении ошибки в DevErrorCode будет    *
267
;* If error has occured then in DevErrorCode will   *
268
;* возвращен код ошибки.                            *
268
;* be the error code.                               *
269
;****************************************************
269
;****************************************************
270
SendCommandToHDD:
270
SendCommandToHDD:
271
; Проверить значение кода режима
271
; Check the addressing mode code
272
        cmp     [ATAAddressMode], 1
272
        cmp     [ATAAddressMode], 1
273
        ja      @@Err2
273
        ja      @@Err2
274
; Проверить корректность номера канала
274
; Check the channel number correctness
275
        movzx   ebx, [ChannelNumber]
275
        movzx   ebx, [ChannelNumber]
276
        dec     ebx
276
        dec     ebx
277
        cmp     ebx, 1
277
        cmp     ebx, 1
278
        ja      @@Err3
278
        ja      @@Err3
279
; Установить базовый адрес
279
; Set the base address
280
        shl     ebx, 1
280
        shl     ebx, 1
281
        mov     ax, [ebx+StandardATABases]
281
        mov     ax, [ebx+StandardATABases]
282
        mov     [ATABasePortAddr], ax
282
        mov     [ATABasePortAddr], ax
283
; Ожидание готовности HDD к приему команды
283
; Waiting for HDD ready to receive a command
284
        ; Выбрать нужный диск
284
        ; Choose desired disk
285
        mov     dx, [ATABasePortAddr]
285
        mov     dx, [ATABasePortAddr]
286
        add     dx, 6   ;адрес регистра головок
286
        add     dx, 6   ; address of the heads register
Line 287... Line 287...
287
        mov     al, [DiskNumber]
287
        mov     al, [DiskNumber]
288
        cmp     al, 1   ;проверить номера диска
288
        cmp     al, 1   ; check the disk number
289
        ja      @@Err4
289
        ja      @@Err4
290
 
290
 
291
        shl     al, 4
291
        shl     al, 4
292
        or      al, 10100000b
292
        or      al, 10100000b
293
        out     dx, al
293
        out     dx, al
294
        ; Ожидать, пока диск не будет готов
294
        ; Waiting for disk ready
295
        inc     dx
295
        inc     dx
296
        mov     ecx, 0xfff
296
        mov     ecx, 0xfff
297
@@WaitHDReady:
297
@@WaitHDReady:
298
        ; Проверить время ожидани
298
        ; Check waiting time
299
        dec     ecx
299
        dec     ecx
300
        jz      @@Err1
300
        jz      @@Err1
301
        ; Прочитать регистр состояни
301
        ; Read the state register
302
        in      al, dx
302
        in      al, dx
303
        ; Проверить состояние сигнала BSY
303
        ; Check the state of BSY signal
304
        test    al, 80h
304
        test    al, 80h
305
        jnz     @@WaitHDReady
305
        jnz     @@WaitHDReady
306
        ; Проверить состояние сигнала DRQ
306
        ; Check the state of DRQ signal
307
        test    al, 08h
307
        test    al, 08h
308
        jnz     @@WaitHDReady
308
        jnz     @@WaitHDReady
309
; Загрузить команду в регистры контроллера
309
; load command to controller's registers
310
        cli
310
        cli
311
        mov     dx, [ATABasePortAddr]
311
        mov     dx, [ATABasePortAddr]
312
        inc     dx      ;регистр "особенностей"
312
        inc     dx      ; "features" register
313
        mov     al, [ATAFeatures]
313
        mov     al, [ATAFeatures]
314
        out     dx, AL
314
        out     dx, AL
315
        inc     dx      ;счетчик секторов
315
        inc     dx      ; sector counter
316
        mov     al, [ATASectorCount]
316
        mov     al, [ATASectorCount]
317
        out     dx, AL
317
        out     dx, AL
318
        inc     dx      ;регистр номера сектора
318
        inc     dx      ; sector number register
319
        mov     al, [ATASectorNumber]
319
        mov     al, [ATASectorNumber]
320
        out     dx, AL
320
        out     dx, AL
321
        inc     dx      ;номер цилиндра (младший байт)
321
        inc     dx      ; cylinder number (low byte)
322
        mov     ax, [ATACylinder]
322
        mov     ax, [ATACylinder]
323
        out     dx, AL
323
        out     dx, AL
324
        inc     dx      ;номер цилиндра (старший байт)
324
        inc     dx      ; cylinder number (high byte)
325
        mov     al, AH
325
        mov     al, AH
326
        out     dx, AL
326
        out     dx, AL
327
        inc     dx      ;номер головки/номер диска
327
        inc     dx      ; head number / disk number
Line 328... Line 328...
328
        mov     al, [DiskNumber]
328
        mov     al, [DiskNumber]
329
        shl     al, 4
329
        shl     al, 4
330
        cmp     [ATAHead], 0xF ;проверить номер головки
330
        cmp     [ATAHead], 0xF ; check head number
331
        ja      @@Err5
331
        ja      @@Err5
332
 
332
 
333
        or      al, [ATAHead]
333
        or      al, [ATAHead]
334
        or      al, 10100000b
334
        or      al, 10100000b
335
        mov     ah, [ATAAddressMode]
335
        mov     ah, [ATAAddressMode]
336
        shl     ah, 6
336
        shl     ah, 6
337
        or      al, ah
337
        or      al, ah
338
        out     dx, al
338
        out     dx, al
339
; Послать команду
339
; Send command
340
        mov     al, [ATACommand]
340
        mov     al, [ATACommand]
341
        inc     dx      ;регистр команд
341
        inc     dx      ; command register
342
        out     dx, al
342
        out     dx, al
343
        sti
343
        sti
344
; Сбросить признак ошибки
344
; reset the error sign
345
        mov     [DevErrorCode], 0
345
        mov     [DevErrorCode], 0
346
        ret
346
        ret
347
; Записать код ошибки
347
; write error code
Line 357... Line 357...
357
@@Err4:
357
@@Err4:
358
        mov     [DevErrorCode], 4
358
        mov     [DevErrorCode], 4
359
        ret
359
        ret
360
@@Err5:
360
@@Err5:
361
        mov     [DevErrorCode], 5
361
        mov     [DevErrorCode], 5
362
; Завершение работы программы
362
; finish work
363
        ret
363
        ret
364
;-----------------------------------------------------------------------------
364
;-----------------------------------------------------------------------------
365
;*************************************************
365
;*************************************************
366
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
366
;*     READ ATAPI DEVICE IDENTIFIER              *
367
;* Входные параметры передаются через глобальные *
367
;* Input parameters are passed through the global*
368
;* перменные:                                    *
368
;* variables:                                    *
369
;* ChannelNumber - номер канала;                 *
369
;* ChannelNumber - channel number;               *
370
;* DiskNumber - номер диска на канале.           *
370
;* DiskNumber - disk number on channel.          *
371
;* Идентификационный блок данных считывается     *
371
;* Block of identificational data is reading     *
372
;* в массив Sector512.                           *
372
;* to Sector512 array.                           *                           *
373
;*************************************************
373
;*************************************************
374
ReadCD_ID:
374
ReadCD_ID:
375
; Задать режим CHS
375
; Set CHS mode
376
        mov     [ATAAddressMode], 0
376
        mov     [ATAAddressMode], 0
377
; Послать команду идентификации устройства
377
; Send command for device identification
378
        mov     [ATAFeatures], 0
378
        mov     [ATAFeatures], 0
379
        mov     [ATASectorCount], 0
379
        mov     [ATASectorCount], 0
380
        mov     [ATASectorNumber], 0
380
        mov     [ATASectorNumber], 0
381
        mov     [ATACylinder], 0
381
        mov     [ATACylinder], 0
382
        mov     [ATAHead], 0
382
        mov     [ATAHead], 0
383
        mov     [ATACommand], 0xA1
383
        mov     [ATACommand], 0xA1
384
        call    SendCommandToHDD
384
        call    SendCommandToHDD
385
        cmp     [DevErrorCode], 0;проверить код ошибки
385
        cmp     [DevErrorCode], 0 ; check the error code
386
        jne     @@End_1  ;закончить, сохранив код ошибки
386
        jne     @@End_1  ; finish, saving the error code
387
; Ожидать готовность данных HDD
387
; Wait for HDD data ready
388
        mov     dx, [ATABasePortAddr]
388
        mov     dx, [ATABasePortAddr]
389
        add     dx, 7  ;порт 1х7h
389
        add     dx, 7      ; port 1х7h
390
        mov     ecx, 0xffff
390
        mov     ecx, 0xffff
391
@@WaitCompleet_1:
391
@@WaitCompleet_1:
392
        ; Проверить врем
392
        ; Check time
393
        dec     ecx
393
        dec     ecx
394
        jz      @@Error1_1 ;ошибка тайм-аута
394
        jz      @@Error1_1 ; time out error
395
        ; Проверить готовность
395
        ; Check readyness
396
        in      al, dx
396
        in      al, dx
397
        test    al, 80h  ;состояние сигнала BSY
397
        test    al, 80h    ; BSY signal state
398
        jnz     @@WaitCompleet_1
398
        jnz     @@WaitCompleet_1
Line 399... Line 399...
399
 
399
 
400
        test    al, 1    ;состояние сигнала ERR
400
        test    al, 1      ; ERR signal state
Line 401... Line 401...
401
        jnz     @@Error6_1
401
        jnz     @@Error6_1
402
 
402
 
403
        test    al, 08h  ;состояние сигнала DRQ
403
        test    al, 08h    ; DRQ signal state
404
        jz      @@WaitCompleet_1
404
        jz      @@WaitCompleet_1
405
; Принять блок данных от контроллера
405
; Receive data block from controller
406
        mov     edi, Sector512 ;offset Sector512
406
        mov     edi, Sector512 ; offset Sector512
407
        mov     dx, [ATABasePortAddr];порт 1x0h
407
        mov     dx, [ATABasePortAddr] ; port 1x0h
408
        mov     cx, 256;число считываемых слов
408
        mov     cx, 256    ; words read count
409
        rep insw
409
        rep insw
410
        ret
410
        ret
411
; Записать код ошибки
411
; write the error code
412
@@Error1_1:
412
@@Error1_1:
413
        mov     [DevErrorCode], 1
413
        mov     [DevErrorCode], 1
414
        ret
414
        ret
415
@@Error6_1:
415
@@Error6_1:
416
        mov     [DevErrorCode], 6
416
        mov     [DevErrorCode], 6
417
@@End_1:
417
@@End_1:
418
        ret
418
        ret
419
;-----------------------------------------------------------------------------
419
;-----------------------------------------------------------------------------
420
;*************************************************
420
;*************************************************
421
;*                СБРОС УСТРОЙСТВА               *
421
;*                DEVICE RESET                   *
422
;* Входные параметры передаются через глобальные *
422
;* Input parameters are passed through the global*
423
;* переменные:                                   *
423
;* variables:                                    *
424
;* ChannelNumber - номер канала (1 или 2);       *
424
;* ChannelNumber - channel number (1 or 2);      *
425
;* DiskNumber - номер диска (0 или 1).           *
425
;* DiskNumber - disk number (0 or 1).            *
426
;*************************************************
426
;*************************************************
427
DeviceReset:
427
DeviceReset:
428
; Проверить корректность номера канала
428
; Check the channel number correctness
429
        movzx   ebx, [ChannelNumber]
429
        movzx   ebx, [ChannelNumber]
430
        dec     ebx
430
        dec     ebx
431
        cmp     ebx, 1
431
        cmp     ebx, 1
432
        ja      @@Err3_2
432
        ja      @@Err3_2
433
; Установить базовый адрес
433
; Set base address
434
        shl     ebx, 1
434
        shl     ebx, 1
435
        mov     dx, [ebx+StandardATABases]
435
        mov     dx, [ebx+StandardATABases]
436
        mov     [ATABasePortAddr], dx
436
        mov     [ATABasePortAddr], dx
437
; Выбрать нужный диск
437
; Choose desired disk
438
        add     dx, 6   ;адрес регистра головок
438
        add     dx, 6   ; address of heads register
439
        mov     al, [DiskNumber]
439
        mov     al, [DiskNumber]
Line 440... Line 440...
440
        cmp     al, 1   ;проверить номера диска
440
        cmp     al, 1   ; check disk number
441
        ja      @@Err4_2
441
        ja      @@Err4_2
442
 
442
 
443
        shl     al, 4
443
        shl     al, 4
444
        or      al, 10100000b
444
        or      al, 10100000b
445
        out     dx, al
445
        out     dx, al
446
; Послать команду "Сброс"
446
; Send the "Reset" command
447
        mov     al, 0x8
447
        mov     al, 0x8
448
        inc     dx      ;регистр команд
448
        inc     dx      ; command register
449
        out     dx, al
449
        out     dx, al
450
        mov     ecx, 0x80000
450
        mov     ecx, 0x80000
451
@@WaitHDReady_1:
451
@@WaitHDReady_1:
452
        ; Проверить время ожидани
452
        ; Check waiting time
453
        dec     ecx
453
        dec     ecx
454
        je      @@Err1_2 ;ошибка тайм-аута
454
        je      @@Err1_2 ; time out error
455
        ; Прочитать регистр состояни
455
        ; read the state register
456
        in      al, dx
456
        in      al, dx
457
        ; Проверить состояние сигнала BSY
457
        ; Check the state of BSY signal
458
        test    al, 80h
458
        test    al, 80h
459
        jnz     @@WaitHDReady_1
459
        jnz     @@WaitHDReady_1
460
; Сбросить признак ошибки
460
; reset the error sign
461
        mov     [DevErrorCode], 0
461
        mov     [DevErrorCode], 0
462
        ret
462
        ret
463
; Обработка ошибок
463
; error processing
464
@@Err1_2:
464
@@Err1_2:
465
        mov     [DevErrorCode], 1
465
        mov     [DevErrorCode], 1
466
        ret
466
        ret
467
@@Err3_2:
467
@@Err3_2:
468
        mov     [DevErrorCode], 3
468
        mov     [DevErrorCode], 3
469
        ret
469
        ret
470
@@Err4_2:
470
@@Err4_2:
471
        mov     [DevErrorCode], 4
471
        mov     [DevErrorCode], 4
472
; Записать код ошибки
472
; write error code