Subversion Repositories Kolibri OS

Rev

Rev 5594 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5565 serge 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 5596 $
9
 
5201 serge 10
;-----------------------------------------------------------------------------
87 mario79 11
;**********************************************************
3555 Serge 12
;  Непосредственная работа с устройством СD (ATAPI)
87 mario79 13
;**********************************************************
3555 Serge 14
; Автор части исходного текста Кулаков Владимир Геннадьевич
15
; Адаптация, доработка и разработка Mario79,
87 mario79 16
 
3555 Serge 17
; Максимальное количество повторений операции чтения
543 spraid 18
MaxRetr equ 10
3555 Serge 19
; Предельное время ожидания готовности к приему команды
20
; (в тиках)
87 mario79 21
BSYWaitTime equ 1000  ;2
538 spraid 22
NoTickWaitTime equ 0xfffff
1276 Lrz 23
CDBlockSize equ 2048
87 mario79 24
;********************************************
3555 Serge 25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
26
;* Многократное повторение чтения при сбоях *
87 mario79 27
;********************************************
28
ReadCDWRetr:
585 mario79 29
;-----------------------------------------------------------
30
; input  : eax = block to read
31
;          ebx = destination
32
;-----------------------------------------------------------
3555 Serge 33
        pushad
2434 Serge 34
        mov     eax, [CDSectorAddress]
35
        mov     ebx, [CDDataBuf_pointer]
3555 Serge 36
        call    cd_calculate_cache
2434 Serge 37
        xor     edi, edi
38
        add     esi, 8
3555 Serge 39
        inc     edi
5201 serge 40
;--------------------------------------
41
align 4
585 mario79 42
.hdreadcache:
2434 Serge 43
        cmp     [esi], eax      ; correct sector
3555 Serge 44
        je      .yeshdcache
5201 serge 45
 
2434 Serge 46
        add     esi, 8
3555 Serge 47
        inc     edi
48
        dec     ecx
49
        jnz     .hdreadcache
5201 serge 50
 
3555 Serge 51
        call    find_empty_slot_CD_cache ; ret in edi
585 mario79 52
 
3555 Serge 53
        push    edi
54
        push    eax
55
        call    cd_calculate_cache_2
2434 Serge 56
        shl     edi, 11
57
        add     edi, eax
58
        mov     [CDDataBuf_pointer], edi
3555 Serge 59
        pop     eax
60
        pop     edi
585 mario79 61
 
3555 Serge 62
        call    ReadCDWRetr_1
2434 Serge 63
        cmp     [DevErrorCode], 0
3555 Serge 64
        jne     .exit
628 mario79 65
 
2434 Serge 66
        mov     [CDDataBuf_pointer], ebx
3555 Serge 67
        call    cd_calculate_cache_1
2434 Serge 68
        lea     esi, [edi*8+esi]
69
        mov     [esi], eax      ; sector number
5201 serge 70
;--------------------------------------
585 mario79 71
.yeshdcache:
2434 Serge 72
        mov     esi, edi
5201 serge 73
        shl     esi, 11 ;9
3555 Serge 74
        push    eax
75
        call    cd_calculate_cache_2
2434 Serge 76
        add     esi, eax
3555 Serge 77
        pop     eax
5201 serge 78
        mov     edi, ebx ;[CDDataBuf_pointer]
79
        mov     ecx, 512 ;/4
3555 Serge 80
        cld
81
        rep movsd               ; move data
5201 serge 82
;--------------------------------------
628 mario79 83
.exit:
3555 Serge 84
        popad
85
        ret
5201 serge 86
;-----------------------------------------------------------------------------
585 mario79 87
ReadCDWRetr_1:
1168 Lrz 88
        pushad
3555 Serge 89
; Цикл, пока команда не выполнена успешно или не
90
; исчерпано количество попыток
5201 serge 91
        mov     ecx, MaxRetr
92
;--------------------------------------
93
align 4
87 mario79 94
@@NextRetr:
3555 Serge 95
; Подать команду
1276 Lrz 96
;*************************************************
3555 Serge 97
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
98
;* Считываются данные пользователя, информация   *
99
;* субканала и контрольная информация            *
100
;* Входные параметры передаются через глобальные *
101
;* перменные:                                    *
102
;* ChannelNumber - номер канала;                 *
103
;* DiskNumber - номер диска на канале;           *
104
;* CDSectorAddress - адрес считываемого сектора. *
105
;* Данные считывается в массив CDDataBuf.        *
1276 Lrz 106
;*************************************************
107
;ReadCD:
3555 Serge 108
        push    ecx
109
; Очистить буфер пакетной команды
110
        call    clear_packet_buffer
111
; Сформировать пакетную команду для считывания
112
; сектора данных
113
; Задать код команды Read CD
5201 serge 114
        mov     [PacketCommand], byte 0x28 ;0xBE
3555 Serge 115
; Задать адрес сектора
5201 serge 116
        mov     ax, word [CDSectorAddress+2]
117
        xchg    al, ah
118
        mov     word [PacketCommand+2], ax
119
        mov     ax, word [CDSectorAddress]
120
        xchg    al, ah
121
        mov     word [PacketCommand+4], ax
3555 Serge 122
; Задать количество считываемых секторов
2434 Serge 123
        mov     [PacketCommand+8], byte 1
3555 Serge 124
; Подать команду
125
        call    SendPacketDatCommand
126
        pop     ecx
585 mario79 127
 
2434 Serge 128
        test    eax, eax
3555 Serge 129
        jz      @@End_4
1276 Lrz 130
 
2434 Serge 131
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
3555 Serge 132
        jz      @@End_4
5201 serge 133
 
3555 Serge 134
        dec     ecx
585 mario79 135
 
2434 Serge 136
        cmp     [timer_ticks_enable], 0
3555 Serge 137
        jne     @f
5201 serge 138
 
2434 Serge 139
        mov     eax, NoTickWaitTime
5201 serge 140
;--------------------------------------
141
align 4
538 spraid 142
.wait:
3555 Serge 143
        dec     eax
144
        jz      @@NextRetr
5201 serge 145
 
3555 Serge 146
        jmp     .wait
5201 serge 147
;--------------------------------------
148
align 4
538 spraid 149
@@:
3555 Serge 150
        loop    @@NextRetr
5201 serge 151
;--------------------------------------
87 mario79 152
@@End_4:
2434 Serge 153
        mov     dword [DevErrorCode], eax
1168 Lrz 154
        popad
155
        ret
5201 serge 156
;-----------------------------------------------------------------------------
3555 Serge 157
; Универсальные процедуры, обеспечивающие выполнение
158
;             пакетных команд в режиме PIO
159
; Максимально допустимое время ожидания реакции
160
; устройства на пакетную команду (в тиках)
5201 serge 161
;-----------------------------------------------------------------------------
3555 Serge 162
MaxCDWaitTime equ 1000 ;200 ;10 секунд
1276 Lrz 163
uglobal
3555 Serge 164
; Область памяти для формирования пакетной команды
2434 Serge 165
PacketCommand:
166
                 rb 12  ;DB 12 DUP (?)
3555 Serge 167
; Адрес считываемого сектора данных
5201 serge 168
CDSectorAddress:   dd ?
3555 Serge 169
; Время начала очередной операции с диском
5201 serge 170
TickCounter_1     dd 0
3555 Serge 171
; Время начала ожидания готовности устройства
5201 serge 172
WURStartTime      dd 0
3555 Serge 173
; указатель буфера для считывания
87 mario79 174
CDDataBuf_pointer dd 0
1276 Lrz 175
endg
5201 serge 176
;-----------------------------------------------------------------------------
87 mario79 177
;****************************************************
3555 Serge 178
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
179
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
180
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
181
;* Входные параметры передаются через глобальные    *
182
;* перменные:                                       *
183
;* ChannelNumber - номер канала;                    *
184
;* DiskNumber - номер диска на канале;              *
185
;* PacketCommand - 12-байтный командный пакет;      *
186
;* CDBlockSize - размер принимаемого блока данных.  *
1276 Lrz 187
; return eax DevErrorCode
87 mario79 188
;****************************************************
189
SendPacketDatCommand:
2434 Serge 190
        xor     eax, eax
3555 Serge 191
; Задать режим CHS
2434 Serge 192
        mov     byte [ATAAddressMode], al
3555 Serge 193
; Послать ATA-команду передачи пакетной команды
2434 Serge 194
        mov     byte [ATAFeatures], al
195
        mov     byte [ATASectorCount], al
196
        mov     byte [ATASectorNumber], al
3555 Serge 197
        ; Загрузить размер передаваемого блока
2434 Serge 198
        mov     [ATAHead], al
199
        mov     [ATACylinder], CDBlockSize
5201 serge 200
        mov     [ATACommand], 0xA0
1168 Lrz 201
        call    SendCommandToHDD_1
2434 Serge 202
        test    eax, eax
3555 Serge 203
        jnz     @@End_8    ;закончить, сохранив код ошибки
204
; Ожидание готовности дисковода к приему
205
; пакетной команды
5201 serge 206
        mov     dx, [ATABasePortAddr]
207
        add     dx, 7    ;порт 1х7h
2434 Serge 208
        mov     ecx, NoTickWaitTime
5201 serge 209
;--------------------------------------
210
align 4
87 mario79 211
@@WaitDevice0:
2434 Serge 212
        cmp     [timer_ticks_enable], 0
1168 Lrz 213
        jne     @f
5201 serge 214
 
1168 Lrz 215
        dec     ecx
1276 Lrz 216
        jz      @@Err1_1
5201 serge 217
 
1168 Lrz 218
        jmp     .test
5201 serge 219
;--------------------------------------
220
align 4
538 spraid 221
@@:
1168 Lrz 222
        call    change_task
3555 Serge 223
        ; Проверить время выполнения команды
5201 serge 224
        mov     eax, [timer_ticks]
225
        sub     eax, [TickCounter_1]
226
        cmp     eax, BSYWaitTime
3555 Serge 227
        ja      @@Err1_1   ;ошибка тайм-аута
228
        ; Проверить готовность
5201 serge 229
;--------------------------------------
230
align 4
538 spraid 231
.test:
5201 serge 232
        in      al, dx
233
        test    al, 0x80  ;состояние сигнала BSY
1168 Lrz 234
        jnz     @@WaitDevice0
5201 serge 235
 
236
        test    al, 1    ;состояние сигнала ERR
2010 serge 237
        jnz     @@Err6
5201 serge 238
 
239
        test    al, 0x8  ;состояние сигнала DRQ
1168 Lrz 240
        jz      @@WaitDevice0
3555 Serge 241
; Послать пакетную команду
1168 Lrz 242
        cli
5201 serge 243
        mov     dx, [ATABasePortAddr]
244
        mov     ax, [PacketCommand]
245
        out     dx, ax
246
        mov     ax, [PacketCommand+2]
247
        out     dx, ax
248
        mov     ax, [PacketCommand+4]
249
        out     dx, ax
250
        mov     ax, [PacketCommand+6]
251
        out     dx, ax
252
        mov     ax, [PacketCommand+8]
253
        out     dx, ax
254
        mov     ax, [PacketCommand+10]
255
        out     dx, ax
1168 Lrz 256
        sti
3555 Serge 257
; Ожидание готовности данных
5201 serge 258
        mov     dx, [ATABasePortAddr]
259
        add     dx, 7  ;порт 1х7h
2434 Serge 260
        mov     ecx, NoTickWaitTime
5201 serge 261
;--------------------------------------
262
align 4
87 mario79 263
@@WaitDevice1:
2434 Serge 264
        cmp     [timer_ticks_enable], 0
1168 Lrz 265
        jne     @f
5201 serge 266
 
1168 Lrz 267
        dec     ecx
1276 Lrz 268
        jz      @@Err1_1
5201 serge 269
 
1168 Lrz 270
        jmp     .test_1
5201 serge 271
;--------------------------------------
272
align 4
538 spraid 273
@@:
1168 Lrz 274
        call    change_task
3555 Serge 275
        ; Проверить время выполнения команды
5201 serge 276
        mov     eax, [timer_ticks]
277
        sub     eax, [TickCounter_1]
278
        cmp     eax, MaxCDWaitTime
3555 Serge 279
        ja      @@Err1_1   ;ошибка тайм-аута
280
        ; Проверить готовность
5201 serge 281
;--------------------------------------
282
align 4
538 spraid 283
.test_1:
5201 serge 284
        in      al, dx
285
        test    al, 0x80  ;состояние сигнала BSY
1168 Lrz 286
        jnz     @@WaitDevice1
5201 serge 287
 
288
        test    al, 1    ;состояние сигнала ERR
2010 serge 289
        jnz     @@Err6_temp
5201 serge 290
 
291
        test    al, 0x8  ;состояние сигнала DRQ
1168 Lrz 292
        jz      @@WaitDevice1
3555 Serge 293
; Принять блок данных от контроллера
5201 serge 294
        mov     edi, [CDDataBuf_pointer]
3555 Serge 295
        ; Загрузить адрес регистра данных контроллера
5201 serge 296
        mov     dx, [ATABasePortAddr]
3555 Serge 297
        ; Загрузить в счетчик размер блока в байтах
2434 Serge 298
        xor     ecx, ecx
5201 serge 299
        mov     cx, CDBlockSize
3555 Serge 300
        ; Вычислить размер блока в 16-разрядных словах
5201 serge 301
        shr     cx, 1 ;разделить размер блока на 2
3555 Serge 302
        ; Принять блок данных
1168 Lrz 303
        cli
304
        cld
3555 Serge 305
        rep insw
1168 Lrz 306
        sti
5201 serge 307
;--------------------------------------
3555 Serge 308
; Успешное завершение приема данных
1276 Lrz 309
@@End_8:
2434 Serge 310
        xor     eax, eax
1276 Lrz 311
        ret
5201 serge 312
;--------------------------------------
3555 Serge 313
; Записать код ошибки
87 mario79 314
@@Err1_1:
2434 Serge 315
        xor     eax, eax
3555 Serge 316
        inc     eax
317
        ret
5201 serge 318
;--------------------------------------
87 mario79 319
@@Err6_temp:
2434 Serge 320
        mov     eax, 7
3555 Serge 321
        ret
5201 serge 322
;--------------------------------------
87 mario79 323
@@Err6:
2434 Serge 324
        mov     eax, 6
3555 Serge 325
        ret
5201 serge 326
;-----------------------------------------------------------------------------
87 mario79 327
;***********************************************
3555 Serge 328
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
329
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
330
;* Входные параметры передаются через          *
331
;* глобальные перменные:                       *
332
;* ChannelNumber - номер канала;               *
333
;* DiskNumber - номер диска на канале;         *
334
;* PacketCommand - 12-байтный командный пакет. *
87 mario79 335
;***********************************************
336
SendPacketNoDatCommand:
1168 Lrz 337
        pushad
2434 Serge 338
        xor     eax, eax
3555 Serge 339
; Задать режим CHS
2434 Serge 340
        mov     byte [ATAAddressMode], al
3555 Serge 341
; Послать ATA-команду передачи пакетной команды
2434 Serge 342
        mov     byte [ATAFeatures], al
343
        mov     byte [ATASectorCount], al
344
        mov     byte [ATASectorNumber], al
345
        mov     word [ATACylinder], ax
346
        mov     byte [ATAHead], al
5201 serge 347
        mov     [ATACommand], 0xA0
1168 Lrz 348
        call    SendCommandToHDD_1
2434 Serge 349
        test    eax, eax
3555 Serge 350
        jnz     @@End_9  ;закончить, сохранив код ошибки
351
; Ожидание готовности дисковода к приему
352
; пакетной команды
5201 serge 353
        mov     dx, [ATABasePortAddr]
354
        add     dx, 7  ;порт 1х7h
355
;--------------------------------------
356
align 4
87 mario79 357
@@WaitDevice0_1:
1168 Lrz 358
        call    change_task
3555 Serge 359
        ; Проверить время ожидания
5201 serge 360
        mov     eax, [timer_ticks]
361
        sub     eax, [TickCounter_1]
362
        cmp     eax, BSYWaitTime
3555 Serge 363
        ja      @@Err1_3   ;ошибка тайм-аута
364
        ; Проверить готовность
5201 serge 365
        in      al, dx
366
        test    al, 0x80  ;состояние сигнала BSY
1168 Lrz 367
        jnz     @@WaitDevice0_1
5201 serge 368
 
369
        test    al, 1    ;состояние сигнала ERR
1168 Lrz 370
        jnz     @@Err6_1
5201 serge 371
 
372
        test    al, 0x8  ;состояние сигнала DRQ
1168 Lrz 373
        jz      @@WaitDevice0_1
3555 Serge 374
; Послать пакетную команду
87 mario79 375
;        cli
5201 serge 376
        mov     dx, [ATABasePortAddr]
377
        mov     ax, word [PacketCommand]
378
        out     dx, ax
379
        mov     ax, word [PacketCommand+2]
380
        out     dx, ax
381
        mov     ax, word [PacketCommand+4]
382
        out     dx, ax
383
        mov     ax, word [PacketCommand+6]
384
        out     dx, ax
385
        mov     ax, word [PacketCommand+8]
386
        out     dx, ax
387
        mov     ax, word [PacketCommand+10]
388
        out     dx, ax
87 mario79 389
;        sti
2434 Serge 390
        cmp     [ignore_CD_eject_wait], 1
3555 Serge 391
        je      @@clear_DEC
392
; Ожидание подтверждения приема команды
5201 serge 393
        mov     dx, [ATABasePortAddr]
394
        add     dx, 7  ;порт 1х7h
395
;--------------------------------------
396
align 4
87 mario79 397
@@WaitDevice1_1:
1168 Lrz 398
        call    change_task
3555 Serge 399
        ; Проверить время выполнения команды
5201 serge 400
        mov     eax, [timer_ticks]
401
        sub     eax, [TickCounter_1]
402
        cmp     eax, MaxCDWaitTime
3555 Serge 403
        ja      @@Err1_3   ;ошибка тайм-аута
404
        ; Ожидать освобождения устройства
5201 serge 405
        in      al, dx
406
        test    al, 0x80  ;состояние сигнала BSY
1168 Lrz 407
        jnz     @@WaitDevice1_1
5201 serge 408
 
409
        test    al, 1    ;состояние сигнала ERR
1168 Lrz 410
        jnz     @@Err6_1
5201 serge 411
 
412
        test    al, 0x40  ;состояние сигнала DRDY
1168 Lrz 413
        jz      @@WaitDevice1_1
5201 serge 414
;--------------------------------------
1276 Lrz 415
@@clear_DEC:
2434 Serge 416
        and     [DevErrorCode], 0
1276 Lrz 417
        popad
418
        ret
5201 serge 419
;--------------------------------------
3555 Serge 420
; Записать код ошибки
87 mario79 421
@@Err1_3:
2434 Serge 422
        xor     eax, eax
3555 Serge 423
        inc     eax
424
        jmp     @@End_9
5201 serge 425
;--------------------------------------
87 mario79 426
@@Err6_1:
2434 Serge 427
        mov     eax, 6
5201 serge 428
;--------------------------------------
87 mario79 429
@@End_9:
2434 Serge 430
        mov     [DevErrorCode], eax
1168 Lrz 431
        popad
432
        ret
5201 serge 433
;-----------------------------------------------------------------------------
87 mario79 434
;****************************************************
3555 Serge 435
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
436
;* Входные параметры передаются через глобальные    *
437
;* переменные:                                      *
438
;* ChannelNumber - номер канала (1 или 2);          *
439
;* DiskNumber - номер диска (0 или 1);              *
440
;* ATAFeatures - "особенности";                     *
441
;* ATASectorCount - количество секторов;            *
442
;* ATASectorNumber - номер начального сектора;      *
443
;* ATACylinder - номер начального цилиндра;         *
444
;* ATAHead - номер начальной головки;               *
445
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
446
;* ATACommand - код команды.                        *
447
;* После успешного выполнения функции:              *
448
;* в ATABasePortAddr - базовый адрес HDD;           *
449
;* в DevErrorCode - ноль.                           *
450
;* При возникновении ошибки в DevErrorCode будет    *
451
;* возвращен код ошибки в eax                       *
87 mario79 452
;****************************************************
453
SendCommandToHDD_1:
3555 Serge 454
; Проверить значение кода режима
2434 Serge 455
        cmp     [ATAAddressMode], 1
1168 Lrz 456
        ja      @@Err2_4
3555 Serge 457
; Проверить корректность номера канала
5201 serge 458
        mov     bx, [ChannelNumber]
459
        cmp     bx, 1
1168 Lrz 460
        jb      @@Err3_4
5201 serge 461
 
462
        cmp     bx, 2
1168 Lrz 463
        ja      @@Err3_4
3555 Serge 464
; Установить базовый адрес
5201 serge 465
        dec     bx
466
        shl     ebx, 2
2434 Serge 467
        movzx   ebx, bx
5201 serge 468
        mov     eax, [cdpos]
469
        dec     eax
470
        shr     eax, 2
471
        imul    eax, sizeof.IDE_DATA
472
        add     eax, IDE_controller_1
473
        add     eax, ebx
474
        mov     ax, [eax+IDE_DATA.BAR0_val]
475
        mov     [ATABasePortAddr], ax
3555 Serge 476
; Ожидание готовности HDD к приему команды
477
        ; Выбрать нужный диск
5201 serge 478
        mov     dx, [ATABasePortAddr]
479
        add     dx, 6   ;адрес регистра головок
480
        mov     al, [DiskNumber]
481
        cmp     al, 1   ;проверить номера диска
1168 Lrz 482
        ja      @@Err4_4
5201 serge 483
 
484
        shl     al, 4
485
        or      al, 10100000b
486
        out     dx, al
3555 Serge 487
        ; Ожидать, пока диск не будет готов
5201 serge 488
        inc     dx
2434 Serge 489
        mov     eax, [timer_ticks]
490
        mov     [TickCounter_1], eax
491
        mov     ecx, NoTickWaitTime
5201 serge 492
;--------------------------------------
493
align 4
87 mario79 494
@@WaitHDReady_2:
2434 Serge 495
        cmp     [timer_ticks_enable], 0
3555 Serge 496
        jne     @f
5201 serge 497
 
3555 Serge 498
        dec     ecx
499
        jz      @@Err1_4
5201 serge 500
 
3555 Serge 501
        jmp     .test
5201 serge 502
;--------------------------------------
503
align 4
538 spraid 504
@@:
1168 Lrz 505
        call    change_task
3555 Serge 506
        ; Проверить время ожидания
2434 Serge 507
        mov     eax, [timer_ticks]
508
        sub     eax, [TickCounter_1]
5201 serge 509
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
3555 Serge 510
        ja      @@Err1_4   ;ошибка тайм-аута
5201 serge 511
;--------------------------------------
512
align 4
538 spraid 513
.test:
5201 serge 514
        in      al, dx ; Прочитать регистр состояния
3555 Serge 515
        ; Проверить состояние сигнала BSY
5201 serge 516
        test    al, 0x80
1168 Lrz 517
        jnz     @@WaitHDReady_2
3555 Serge 518
        ; Проверить состояние сигнала DRQ
5201 serge 519
        test    al, 0x8
1168 Lrz 520
        jnz     @@WaitHDReady_2
3555 Serge 521
; Загрузить команду в регистры контроллера
1168 Lrz 522
        cli
5201 serge 523
        mov     dx, [ATABasePortAddr]
524
        inc     dx      ;регистр "особенностей"
525
        mov     al, [ATAFeatures]
526
        out     dx, al
527
        inc     dx      ;счетчик секторов
528
        mov     al, [ATASectorCount]
529
        out     dx, al
530
        inc     dx      ;регистр номера сектора
531
        mov     al, [ATASectorNumber]
532
        out     dx, al
533
        inc     dx      ;номер цилиндра (младший байт)
534
        mov     ax, [ATACylinder]
535
        out     dx, al
536
        inc     dx      ;номер цилиндра (старший байт)
537
        mov     al, ah
538
        out     dx, al
539
        inc     dx      ;номер головки/номер диска
540
        mov     al, [DiskNumber]
541
        shl     al, 4
542
        cmp     [ATAHead], 0xF ;проверить номер головки
1168 Lrz 543
        ja      @@Err5_4
5201 serge 544
 
545
        or      al, [ATAHead]
546
        or      al, 10100000b
547
        mov     ah, [ATAAddressMode]
548
        shl     ah, 6
549
        or      al, ah
550
        out     dx, al
3555 Serge 551
; Послать команду
5201 serge 552
        mov     al, [ATACommand]
553
        inc     dx      ;регистр команд
554
        out     dx, al
1168 Lrz 555
        sti
5201 serge 556
;--------------------------------------
1276 Lrz 557
@@End_10:
2434 Serge 558
        xor     eax, eax
3555 Serge 559
        ret
5201 serge 560
;--------------------------------------
3555 Serge 561
; Записать код ошибки
87 mario79 562
@@Err1_4:
2434 Serge 563
        xor     eax, eax
3555 Serge 564
        inc     eax
565
        ret
5201 serge 566
;--------------------------------------
87 mario79 567
@@Err2_4:
2434 Serge 568
        mov     eax, 2
3555 Serge 569
        ret
5201 serge 570
;--------------------------------------
87 mario79 571
@@Err3_4:
2434 Serge 572
        mov     eax, 3
3555 Serge 573
        ret
5201 serge 574
;--------------------------------------
87 mario79 575
@@Err4_4:
2434 Serge 576
        mov     eax, 4
3555 Serge 577
        ret
5201 serge 578
;--------------------------------------
87 mario79 579
@@Err5_4:
2434 Serge 580
        mov     eax, 5
3555 Serge 581
        ret
5201 serge 582
;-----------------------------------------------------------------------------
87 mario79 583
;*************************************************
3555 Serge 584
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
585
;* Входные параметры передаются через глобальные *
586
;* перменные:                                    *
587
;* ChannelNumber - номер канала;                 *
588
;* DiskNumber - номер диска на канале.           *
87 mario79 589
;*************************************************
590
WaitUnitReady:
1168 Lrz 591
        pusha
3555 Serge 592
; Запомнить время начала операции
5201 serge 593
        mov     eax, [timer_ticks]
594
        mov     [WURStartTime], eax
3555 Serge 595
; Очистить буфер пакетной команды
596
        call    clear_packet_buffer
597
; Сформировать команду TEST UNIT READY
5201 serge 598
        mov     [PacketCommand], word 0
3555 Serge 599
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
2434 Serge 600
        mov     ecx, NoTickWaitTime
5201 serge 601
;--------------------------------------
602
align 4
87 mario79 603
@@SendCommand:
3555 Serge 604
        ; Подать команду проверки готовности
1168 Lrz 605
        call    SendPacketNoDatCommand
2434 Serge 606
        cmp     [timer_ticks_enable], 0
1168 Lrz 607
        jne     @f
5201 serge 608
 
2434 Serge 609
        cmp     [DevErrorCode], 0
1168 Lrz 610
        je      @@End_11
5201 serge 611
 
1168 Lrz 612
        dec     ecx
1276 Lrz 613
        jz      .Error
5201 serge 614
 
1168 Lrz 615
        jmp     @@SendCommand
5201 serge 616
;--------------------------------------
617
align 4
637 mario79 618
@@:
1168 Lrz 619
        call    change_task
3555 Serge 620
        ; Проверить код ошибки
2434 Serge 621
        cmp     [DevErrorCode], 0
1168 Lrz 622
        je      @@End_11
3555 Serge 623
        ; Проверить время ожидания готовности
5201 serge 624
        mov     eax, [timer_ticks]
625
        sub     eax, [WURStartTime]
626
        cmp     eax, MaxCDWaitTime
1168 Lrz 627
        jb      @@SendCommand
5201 serge 628
;--------------------------------------
637 mario79 629
.Error:
3555 Serge 630
        ; Ошибка тайм-аута
2434 Serge 631
        mov     [DevErrorCode], 1
5201 serge 632
;--------------------------------------
87 mario79 633
@@End_11:
1168 Lrz 634
        popa
635
        ret
5201 serge 636
;-----------------------------------------------------------------------------
87 mario79 637
;*************************************************
3555 Serge 638
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
639
;* Входные параметры передаются через глобальные *
640
;* перменные:                                    *
641
;* ChannelNumber - номер канала;                 *
642
;* DiskNumber - номер диска на канале.           *
585 mario79 643
;*************************************************
644
prevent_medium_removal:
1168 Lrz 645
        pusha
3555 Serge 646
; Очистить буфер пакетной команды
647
        call    clear_packet_buffer
648
; Задать код команды
2434 Serge 649
        mov     [PacketCommand], byte 0x1E
3555 Serge 650
; Задать код запрета
2434 Serge 651
        mov     [PacketCommand+4], byte 11b
3555 Serge 652
; Подать команду
653
        call    SendPacketNoDatCommand
2434 Serge 654
        mov     eax, ATAPI_IDE0_lock
655
        add     eax, [cdpos]
3555 Serge 656
        dec     eax
2434 Serge 657
        mov     [eax], byte 1
1168 Lrz 658
        popa
659
        ret
5201 serge 660
;-----------------------------------------------------------------------------
585 mario79 661
;*************************************************
3555 Serge 662
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
663
;* Входные параметры передаются через глобальные *
664
;* перменные:                                    *
665
;* ChannelNumber - номер канала;                 *
666
;* DiskNumber - номер диска на канале.           *
618 mario79 667
;*************************************************
585 mario79 668
allow_medium_removal:
1168 Lrz 669
        pusha
3555 Serge 670
; Очистить буфер пакетной команды
671
        call    clear_packet_buffer
672
; Задать код команды
2434 Serge 673
        mov     [PacketCommand], byte 0x1E
3555 Serge 674
; Задать код запрета
5201 serge 675
        mov     [PacketCommand+4], byte 0
3555 Serge 676
; Подать команду
677
        call    SendPacketNoDatCommand
2434 Serge 678
        mov     eax, ATAPI_IDE0_lock
679
        add     eax, [cdpos]
3555 Serge 680
        dec     eax
2434 Serge 681
        mov     [eax], byte 0
1168 Lrz 682
        popa
683
        ret
5201 serge 684
;-----------------------------------------------------------------------------
585 mario79 685
;*************************************************
3555 Serge 686
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
687
;* Входные параметры передаются через глобальные *
688
;* перменные:                                    *
689
;* ChannelNumber - номер канала;                 *
690
;* DiskNumber - номер диска на канале.           *
87 mario79 691
;*************************************************
692
LoadMedium:
1168 Lrz 693
        pusha
3555 Serge 694
; Очистить буфер пакетной команды
695
        call    clear_packet_buffer
696
; Сформировать команду START/STOP UNIT
697
        ; Задать код команды
5201 serge 698
        mov     [PacketCommand], word 0x1B
3555 Serge 699
        ; Задать операцию загрузки носителя
2434 Serge 700
        mov     [PacketCommand+4], word 00000011b
3555 Serge 701
; Подать команду
1168 Lrz 702
        call    SendPacketNoDatCommand
703
        popa
704
        ret
5201 serge 705
;-----------------------------------------------------------------------------
87 mario79 706
;*************************************************
3555 Serge 707
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
708
;* Входные параметры передаются через глобальные *
709
;* перменные:                                    *
710
;* ChannelNumber - номер канала;                 *
711
;* DiskNumber - номер диска на канале.           *
87 mario79 712
;*************************************************
585 mario79 713
EjectMedium:
1168 Lrz 714
        pusha
3555 Serge 715
; Очистить буфер пакетной команды
716
        call    clear_packet_buffer
717
; Сформировать команду START/STOP UNIT
718
        ; Задать код команды
5201 serge 719
        mov     [PacketCommand], word 0x1B
3555 Serge 720
        ; Задать операцию извлечения носителя
2434 Serge 721
        mov     [PacketCommand+4], word 00000010b
3555 Serge 722
; Подать команду
1168 Lrz 723
        call    SendPacketNoDatCommand
724
        popa
725
        ret
5201 serge 726
;-----------------------------------------------------------------------------
87 mario79 727
;*************************************************
3555 Serge 728
;* Проверить событие нажатия кнопки извлечения   *
729
;*                     диска                     *
730
;* Входные параметры передаются через глобальные *
731
;* переменные:                                   *
732
;* ChannelNumber - номер канала;                 *
733
;* DiskNumber - номер диска на канале.           *
87 mario79 734
;*************************************************
3555 Serge 735
proc check_ATAPI_device_event_has_work?
736
        mov     eax, [timer_ticks]
737
        sub     eax, [timer_ATAPI_check]
738
        cmp     eax, 100
739
        jb      .no
5201 serge 740
 
3555 Serge 741
        xor     eax, eax
742
        inc     eax
743
        ret
5201 serge 744
;--------------------------------------
3555 Serge 745
.no:
746
        xor     eax, eax
747
        ret
748
endp
5201 serge 749
;-----------------------------------------------------------------------------
1168 Lrz 750
align 4
618 mario79 751
check_ATAPI_device_event:
1168 Lrz 752
        pusha
2434 Serge 753
        mov     eax, [timer_ticks]
754
        sub     eax, [timer_ATAPI_check]
755
        cmp     eax, 100
3555 Serge 756
        jb      .end_1
5201 serge 757
 
758
        pushfd
2434 Serge 759
        mov     al, [DRIVE_DATA+1]
760
        and     al, 11b
761
        cmp     al, 10b
3555 Serge 762
        jz      .ide3
5201 serge 763
;--------------------------------------
618 mario79 764
.ide2_1:
2434 Serge 765
        mov     al, [DRIVE_DATA+1]
766
        and     al, 1100b
767
        cmp     al, 1000b
3555 Serge 768
        jz      .ide2
5201 serge 769
;--------------------------------------
618 mario79 770
.ide1_1:
2434 Serge 771
        mov     al, [DRIVE_DATA+1]
772
        and     al, 110000b
773
        cmp     al, 100000b
3555 Serge 774
        jz      .ide1
5201 serge 775
;--------------------------------------
618 mario79 776
.ide0_1:
2434 Serge 777
        mov     al, [DRIVE_DATA+1]
778
        and     al, 11000000b
779
        cmp     al, 10000000b
3555 Serge 780
        jz      .ide0
5201 serge 781
;--------------------------------------
782
.ide7_1:
783
        mov     al, [DRIVE_DATA+6]
784
        and     al, 11b
785
        cmp     al, 10b
786
        jz      .ide7
787
;--------------------------------------
788
.ide6_1:
789
        mov     al, [DRIVE_DATA+6]
790
        and     al, 1100b
791
        cmp     al, 1000b
792
        jz      .ide6
793
;--------------------------------------
794
.ide5_1:
795
        mov     al, [DRIVE_DATA+6]
796
        and     al, 110000b
797
        cmp     al, 100000b
798
        jz      .ide5
799
;--------------------------------------
800
.ide4_1:
801
        mov     al, [DRIVE_DATA+6]
802
        and     al, 11000000b
803
        cmp     al, 10000000b
804
        jz      .ide4
805
;--------------------------------------
806
.ide11_1:
807
        mov     al, [DRIVE_DATA+11]
808
        and     al, 11b
809
        cmp     al, 10b
810
        jz      .ide11
811
;--------------------------------------
812
.ide10_1:
813
        mov     al, [DRIVE_DATA+11]
814
        and     al, 1100b
815
        cmp     al, 1000b
816
        jz      .ide10
817
;--------------------------------------
818
.ide9_1:
819
        mov     al, [DRIVE_DATA+11]
820
        and     al, 110000b
821
        cmp     al, 100000b
822
        jz      .ide9
823
;--------------------------------------
824
.ide8_1:
825
        mov     al, [DRIVE_DATA+11]
826
        and     al, 11000000b
827
        cmp     al, 10000000b
828
        jz      .ide8
829
;--------------------------------------
618 mario79 830
.end:
5201 serge 831
        popfd
2434 Serge 832
        mov     eax, [timer_ticks]
833
        mov     [timer_ATAPI_check], eax
5201 serge 834
;--------------------------------------
618 mario79 835
.end_1:
1168 Lrz 836
        popa
837
        ret
5201 serge 838
;-----------------------------------------------------------------------------
618 mario79 839
.ide3:
3555 Serge 840
        cli
2434 Serge 841
        cmp     [ATAPI_IDE3_lock], 1
3555 Serge 842
        jne     .ide2_1
5201 serge 843
 
2434 Serge 844
        cmp     [cd_status], 0
3555 Serge 845
        jne     .end
5201 serge 846
 
3908 Serge 847
        mov     ecx, ide_channel2_mutex
848
        call    mutex_lock
3555 Serge 849
        call    reserve_ok2
2434 Serge 850
        mov     [ChannelNumber], 2
851
        mov     [DiskNumber], 1
852
        mov     [cdpos], 4
3555 Serge 853
        call    GetEvent_StatusNotification
2434 Serge 854
        cmp     [CDDataBuf+4], byte 1
5201 serge 855
        jne     @f
856
 
3555 Serge 857
        call    .eject
5201 serge 858
;--------------------------------------
859
@@:
3555 Serge 860
        call    syscall_cdaudio.free
861
        jmp     .ide2_1
5201 serge 862
;-----------------------------------------------------------------------------
618 mario79 863
.ide2:
3555 Serge 864
        cli
2434 Serge 865
        cmp     [ATAPI_IDE2_lock], 1
3555 Serge 866
        jne     .ide1_1
5201 serge 867
 
2434 Serge 868
        cmp     [cd_status], 0
3555 Serge 869
        jne     .end
5201 serge 870
 
3908 Serge 871
        mov     ecx, ide_channel2_mutex
872
        call    mutex_lock
3555 Serge 873
        call    reserve_ok2
2434 Serge 874
        mov     [ChannelNumber], 2
875
        mov     [DiskNumber], 0
876
        mov     [cdpos], 3
3555 Serge 877
        call    GetEvent_StatusNotification
2434 Serge 878
        cmp     [CDDataBuf+4], byte 1
5201 serge 879
        jne     @f
880
 
3555 Serge 881
        call    .eject
5201 serge 882
;--------------------------------------
883
@@:
3555 Serge 884
        call    syscall_cdaudio.free
885
        jmp     .ide1_1
5201 serge 886
;-----------------------------------------------------------------------------
618 mario79 887
.ide1:
3555 Serge 888
        cli
2434 Serge 889
        cmp     [ATAPI_IDE1_lock], 1
3555 Serge 890
        jne     .ide0_1
5201 serge 891
 
2434 Serge 892
        cmp     [cd_status], 0
3555 Serge 893
        jne     .end
5201 serge 894
 
3908 Serge 895
        mov     ecx, ide_channel1_mutex
896
        call    mutex_lock
3555 Serge 897
        call    reserve_ok2
2434 Serge 898
        mov     [ChannelNumber], 1
899
        mov     [DiskNumber], 1
900
        mov     [cdpos], 2
3555 Serge 901
        call    GetEvent_StatusNotification
2434 Serge 902
        cmp     [CDDataBuf+4], byte 1
5201 serge 903
        jne     @f
904
 
3555 Serge 905
        call    .eject
5201 serge 906
;--------------------------------------
907
@@:
3555 Serge 908
        call    syscall_cdaudio.free
909
        jmp     .ide0_1
5201 serge 910
;-----------------------------------------------------------------------------
618 mario79 911
.ide0:
3555 Serge 912
        cli
2434 Serge 913
        cmp     [ATAPI_IDE0_lock], 1
5201 serge 914
        jne     .ide7_1
915
 
2434 Serge 916
        cmp     [cd_status], 0
3555 Serge 917
        jne     .end
5201 serge 918
 
3908 Serge 919
        mov     ecx, ide_channel1_mutex
920
        call    mutex_lock
3555 Serge 921
        call    reserve_ok2
2434 Serge 922
        mov     [ChannelNumber], 1
923
        mov     [DiskNumber], 0
924
        mov     [cdpos], 1
3555 Serge 925
        call    GetEvent_StatusNotification
2434 Serge 926
        cmp     [CDDataBuf+4], byte 1
5201 serge 927
        jne     @f
928
 
929
        call    .eject
930
;--------------------------------------
931
@@:
3555 Serge 932
        call    syscall_cdaudio.free
5201 serge 933
        jmp     .ide7_1
934
;-----------------------------------------------------------------------------
935
.ide7:
936
        cli
937
        cmp     [ATAPI_IDE7_lock], 1
938
        jne     .ide6_1
939
 
940
        cmp     [cd_status], 0
941
        jne     .end
942
 
943
        mov     ecx, ide_channel4_mutex
944
        call    mutex_lock
945
        call    reserve_ok2
946
        mov     [ChannelNumber], 2
947
        mov     [DiskNumber], 1
948
        mov     [cdpos], 8
949
        call    GetEvent_StatusNotification
950
        cmp     [CDDataBuf+4], byte 1
951
        jne     @f
952
 
3555 Serge 953
        call    .eject
5201 serge 954
;--------------------------------------
955
@@:
3555 Serge 956
        call    syscall_cdaudio.free
5201 serge 957
        jmp     .ide6_1
958
;-----------------------------------------------------------------------------
959
.ide6:
960
        cli
961
        cmp     [ATAPI_IDE6_lock], 1
962
        jne     .ide5_1
963
 
964
        cmp     [cd_status], 0
965
        jne     .end
966
 
967
        mov     ecx, ide_channel4_mutex
968
        call    mutex_lock
969
        call    reserve_ok2
970
        mov     [ChannelNumber], 2
971
        mov     [DiskNumber], 0
972
        mov     [cdpos], 7
973
        call    GetEvent_StatusNotification
974
        cmp     [CDDataBuf+4], byte 1
975
        jne     @f
976
 
977
        call    .eject
978
;--------------------------------------
979
@@:
980
        call    syscall_cdaudio.free
981
        jmp     .ide5_1
982
;-----------------------------------------------------------------------------
983
.ide5:
984
        cli
985
        cmp     [ATAPI_IDE5_lock], 1
986
        jne     .ide4_1
987
 
988
        cmp     [cd_status], 0
989
        jne     .end
990
 
991
        mov     ecx, ide_channel3_mutex
992
        call    mutex_lock
993
        call    reserve_ok2
994
        mov     [ChannelNumber], 1
995
        mov     [DiskNumber], 1
996
        mov     [cdpos], 6
997
        call    GetEvent_StatusNotification
998
        cmp     [CDDataBuf+4], byte 1
999
        jne     @f
1000
 
1001
        call    .eject
1002
;--------------------------------------
1003
@@:
1004
        call    syscall_cdaudio.free
1005
        jmp     .ide4_1
1006
;-----------------------------------------------------------------------------
1007
.ide4:
1008
        cli
1009
        cmp     [ATAPI_IDE4_lock], 1
1010
        jne     .ide11_1
1011
 
1012
        cmp     [cd_status], 0
1013
        jne     .end
1014
 
1015
        mov     ecx, ide_channel3_mutex
1016
        call    mutex_lock
1017
        call    reserve_ok2
1018
        mov     [ChannelNumber], 1
1019
        mov     [DiskNumber], 0
1020
        mov     [cdpos], 5
1021
        call    GetEvent_StatusNotification
1022
        cmp     [CDDataBuf+4], byte 1
1023
        jne     @f
1024
 
1025
        call    .eject
1026
;--------------------------------------
1027
@@:
1028
        call    syscall_cdaudio.free
1029
        jmp     .ide11_1
1030
;-----------------------------------------------------------------------------
1031
.ide11:
1032
        cli
1033
        cmp     [ATAPI_IDE11_lock], 1
1034
        jne     .ide10_1
1035
 
1036
        cmp     [cd_status], 0
1037
        jne     .end
1038
 
1039
        mov     ecx, ide_channel6_mutex
1040
        call    mutex_lock
1041
        call    reserve_ok2
1042
        mov     [ChannelNumber], 2
1043
        mov     [DiskNumber], 1
1044
        mov     [cdpos], 12
1045
        call    GetEvent_StatusNotification
1046
        cmp     [CDDataBuf+4], byte 1
1047
        jne     @f
1048
 
1049
        call    .eject
1050
;--------------------------------------
1051
@@:
1052
        call    syscall_cdaudio.free
1053
        jmp     .ide10_1
1054
;-----------------------------------------------------------------------------
1055
.ide10:
1056
        cli
1057
        cmp     [ATAPI_IDE10_lock], 1
1058
        jne     .ide9_1
1059
 
1060
        cmp     [cd_status], 0
1061
        jne     .end
1062
 
1063
        mov     ecx, ide_channel6_mutex
1064
        call    mutex_lock
1065
        call    reserve_ok2
1066
        mov     [ChannelNumber], 2
1067
        mov     [DiskNumber], 0
1068
        mov     [cdpos], 11
1069
        call    GetEvent_StatusNotification
1070
        cmp     [CDDataBuf+4], byte 1
1071
        jne     @f
1072
 
1073
        call    .eject
1074
;--------------------------------------
1075
@@:
1076
        call    syscall_cdaudio.free
1077
        jmp     .ide9_1
1078
;-----------------------------------------------------------------------------
1079
.ide9:
1080
        cli
1081
        cmp     [ATAPI_IDE9_lock], 1
1082
        jne     .ide8_1
1083
 
1084
        cmp     [cd_status], 0
1085
        jne     .end
1086
 
1087
        mov     ecx, ide_channel5_mutex
1088
        call    mutex_lock
1089
        call    reserve_ok2
1090
        mov     [ChannelNumber], 1
1091
        mov     [DiskNumber], 1
1092
        mov     [cdpos], 10
1093
        call    GetEvent_StatusNotification
1094
        cmp     [CDDataBuf+4], byte 1
1095
        jne     @f
1096
 
1097
        call    .eject
1098
;--------------------------------------
1099
@@:
1100
        call    syscall_cdaudio.free
1101
        jmp     .ide8_1
1102
;-----------------------------------------------------------------------------
1103
.ide8:
1104
        cli
1105
        cmp     [ATAPI_IDE8_lock], 1
1106
        jne     .end
1107
 
1108
        cmp     [cd_status], 0
1109
        jne     .end
1110
 
1111
        mov     ecx, ide_channel5_mutex
1112
        call    mutex_lock
1113
        call    reserve_ok2
1114
        mov     [ChannelNumber], 1
1115
        mov     [DiskNumber], 0
1116
        mov     [cdpos], 9
1117
        call    GetEvent_StatusNotification
1118
        cmp     [CDDataBuf+4], byte 1
1119
        jne     @f
1120
 
1121
        call    .eject
1122
;--------------------------------------
1123
@@:
1124
        call    syscall_cdaudio.free
3555 Serge 1125
        jmp     .end
5201 serge 1126
;-----------------------------------------------------------------------------
618 mario79 1127
.eject:
3555 Serge 1128
        call    clear_CD_cache
1129
        call    allow_medium_removal
2434 Serge 1130
        mov     [ignore_CD_eject_wait], 1
3555 Serge 1131
        call    EjectMedium
2434 Serge 1132
        mov     [ignore_CD_eject_wait], 0
1168 Lrz 1133
        ret
5201 serge 1134
;-----------------------------------------------------------------------------
5596 serge 1135
iglobal
1136
timer_ATAPI_check dd 0
1137
ATAPI_IDE0_lock db 0
1138
ATAPI_IDE1_lock db 0
1139
ATAPI_IDE2_lock db 0
1140
ATAPI_IDE3_lock db 0
1141
ATAPI_IDE4_lock db 0
1142
ATAPI_IDE5_lock db 0
1143
ATAPI_IDE6_lock db 0
1144
ATAPI_IDE7_lock db 0
1145
ATAPI_IDE8_lock db 0
1146
ATAPI_IDE9_lock db 0
1147
ATAPI_IDE10_lock db 0
1148
ATAPI_IDE11_lock db 0
1149
ignore_CD_eject_wait db 0
1276 Lrz 1150
endg
5201 serge 1151
;-----------------------------------------------------------------------------
618 mario79 1152
;*************************************************
3555 Serge 1153
;* Получить сообщение о событии или состоянии    *
1154
;*                  устройства                   *
1155
;* Входные параметры передаются через глобальные *
1156
;* переменные:                                   *
1157
;* ChannelNumber - номер канала;                 *
1158
;* DiskNumber - номер диска на канале.           *
618 mario79 1159
;*************************************************
1160
GetEvent_StatusNotification:
1168 Lrz 1161
        pusha
2434 Serge 1162
        mov     [CDDataBuf_pointer], CDDataBuf
3555 Serge 1163
; Очистить буфер пакетной команды
1164
        call    clear_packet_buffer
1165
; Задать код команды
2434 Serge 1166
        mov     [PacketCommand], byte 4Ah
1167
        mov     [PacketCommand+1], byte 00000001b
3555 Serge 1168
; Задать запрос класса сообщений
2434 Serge 1169
        mov     [PacketCommand+4], byte 00010000b
3555 Serge 1170
; Размер выделенной области
2434 Serge 1171
        mov     [PacketCommand+7], byte 8h
1172
        mov     [PacketCommand+8], byte 0h
3555 Serge 1173
; Подать команду
1168 Lrz 1174
        call    SendPacketDatCommand
1175
        popa
1176
        ret
5201 serge 1177
;-----------------------------------------------------------------------------
618 mario79 1178
;*************************************************
3555 Serge 1179
; прочитать информацию из TOC
1180
;* Входные параметры передаются через глобальные *
1181
;* переменные:                                   *
1182
;* ChannelNumber - номер канала;                 *
1183
;* DiskNumber - номер диска на канале.           *
758 mario79 1184
;*************************************************
1185
Read_TOC:
1168 Lrz 1186
        pusha
2434 Serge 1187
        mov     [CDDataBuf_pointer], CDDataBuf
3555 Serge 1188
; Очистить буфер пакетной команды
1189
        call    clear_packet_buffer
1190
; Сформировать пакетную команду для считывания
1191
; сектора данных
2434 Serge 1192
        mov     [PacketCommand], byte 0x43
3555 Serge 1193
        ; Задать формат
2434 Serge 1194
        mov     [PacketCommand+2], byte 1
3555 Serge 1195
; Размер выделенной области
2434 Serge 1196
        mov     [PacketCommand+7], byte 0xFF
1197
        mov     [PacketCommand+8], byte 0h
3555 Serge 1198
; Подать команду
1199
        call    SendPacketDatCommand
1168 Lrz 1200
        popa
1201
        ret
5201 serge 1202
;-----------------------------------------------------------------------------
758 mario79 1203
;*************************************************
3555 Serge 1204
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1205
;* Входные параметры передаются через глобальные *
1206
;* переменные:                                   *
1207
;* ChannelNumber - номер канала;                 *
1208
;* DiskNumber - номер диска на канале.           *
618 mario79 1209
;*************************************************
1210
;ReadCapacity:
628 mario79 1211
;       pusha
3555 Serge 1212
;; Очистить буфер пакетной команды
628 mario79 1213
;       call  clear_packet_buffer
3555 Serge 1214
;; Задать размер буфера в байтах
628 mario79 1215
;       mov     [CDBlockSize],8
3555 Serge 1216
;; Сформировать команду READ CAPACITY
628 mario79 1217
;       mov     [PacketCommand],word 25h
3555 Serge 1218
;; Подать команду
628 mario79 1219
;       call    SendPacketDatCommand
1220
;       popa
1221
;       ret
5201 serge 1222
;-----------------------------------------------------------------------------
585 mario79 1223
clear_packet_buffer:
3555 Serge 1224
; Очистить буфер пакетной команды
2434 Serge 1225
        and     [PacketCommand], dword 0
1226
        and     [PacketCommand+4], dword 0
1227
        and     [PacketCommand+8], dword 0
1168 Lrz 1228
        ret
5201 serge 1229
;-----------------------------------------------------------------------------