Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5363 yogev_ezra 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 5363 $
9
 
4700 mario79 10
;-----------------------------------------------------------------------------
2288 clevermous 11
;**********************************************************
3539 clevermous 12
;  Непосредственная работа с устройством СD (ATAPI)
2288 clevermous 13
;**********************************************************
3539 clevermous 14
; Автор части исходного текста Кулаков Владимир Геннадьевич
15
; Адаптация, доработка и разработка Mario79,
2288 clevermous 16
 
3539 clevermous 17
; Максимальное количество повторений операции чтения
2288 clevermous 18
MaxRetr equ 10
3539 clevermous 19
; Предельное время ожидания готовности к приему команды
20
; (в тиках)
2288 clevermous 21
BSYWaitTime equ 1000  ;2
22
NoTickWaitTime equ 0xfffff
23
CDBlockSize equ 2048
24
;********************************************
3539 clevermous 25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
26
;* Многократное повторение чтения при сбоях *
2288 clevermous 27
;********************************************
28
ReadCDWRetr:
29
;-----------------------------------------------------------
30
; input  : eax = block to read
31
;          ebx = destination
32
;-----------------------------------------------------------
33
        pushad
34
        mov     eax, [CDSectorAddress]
35
        mov     ebx, [CDDataBuf_pointer]
36
        call    cd_calculate_cache
37
        xor     edi, edi
38
        add     esi, 8
39
        inc     edi
4700 mario79 40
;--------------------------------------
41
align 4
2288 clevermous 42
.hdreadcache:
43
        cmp     [esi], eax      ; correct sector
44
        je      .yeshdcache
4700 mario79 45
 
2288 clevermous 46
        add     esi, 8
47
        inc     edi
48
        dec     ecx
49
        jnz     .hdreadcache
4700 mario79 50
 
2288 clevermous 51
        call    find_empty_slot_CD_cache ; ret in edi
52
 
53
        push    edi
54
        push    eax
55
        call    cd_calculate_cache_2
56
        shl     edi, 11
57
        add     edi, eax
58
        mov     [CDDataBuf_pointer], edi
59
        pop     eax
60
        pop     edi
61
 
62
        call    ReadCDWRetr_1
63
        cmp     [DevErrorCode], 0
64
        jne     .exit
65
 
66
        mov     [CDDataBuf_pointer], ebx
67
        call    cd_calculate_cache_1
68
        lea     esi, [edi*8+esi]
69
        mov     [esi], eax      ; sector number
4700 mario79 70
;--------------------------------------
2288 clevermous 71
.yeshdcache:
72
        mov     esi, edi
4700 mario79 73
        shl     esi, 11 ;9
2288 clevermous 74
        push    eax
75
        call    cd_calculate_cache_2
76
        add     esi, eax
77
        pop     eax
4700 mario79 78
        mov     edi, ebx ;[CDDataBuf_pointer]
79
        mov     ecx, 512 ;/4
2288 clevermous 80
        cld
81
        rep movsd               ; move data
4700 mario79 82
;--------------------------------------
2288 clevermous 83
.exit:
84
        popad
85
        ret
4700 mario79 86
;-----------------------------------------------------------------------------
2288 clevermous 87
ReadCDWRetr_1:
88
        pushad
3539 clevermous 89
; Цикл, пока команда не выполнена успешно или не
90
; исчерпано количество попыток
4700 mario79 91
        mov     ecx, MaxRetr
92
;--------------------------------------
93
align 4
2288 clevermous 94
@@NextRetr:
3539 clevermous 95
; Подать команду
2288 clevermous 96
;*************************************************
3539 clevermous 97
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
98
;* Считываются данные пользователя, информация   *
99
;* субканала и контрольная информация            *
100
;* Входные параметры передаются через глобальные *
101
;* перменные:                                    *
102
;* ChannelNumber - номер канала;                 *
103
;* DiskNumber - номер диска на канале;           *
104
;* CDSectorAddress - адрес считываемого сектора. *
105
;* Данные считывается в массив CDDataBuf.        *
2288 clevermous 106
;*************************************************
107
;ReadCD:
108
        push    ecx
3539 clevermous 109
; Очистить буфер пакетной команды
2288 clevermous 110
        call    clear_packet_buffer
3539 clevermous 111
; Сформировать пакетную команду для считывания
112
; сектора данных
113
; Задать код команды Read CD
4700 mario79 114
        mov     [PacketCommand], byte 0x28 ;0xBE
3539 clevermous 115
; Задать адрес сектора
4700 mario79 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
3539 clevermous 122
; Задать количество считываемых секторов
2288 clevermous 123
        mov     [PacketCommand+8], byte 1
3539 clevermous 124
; Подать команду
2288 clevermous 125
        call    SendPacketDatCommand
126
        pop     ecx
127
 
128
        test    eax, eax
129
        jz      @@End_4
130
 
131
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
132
        jz      @@End_4
4700 mario79 133
 
2288 clevermous 134
        dec     ecx
135
 
136
        cmp     [timer_ticks_enable], 0
137
        jne     @f
4700 mario79 138
 
2288 clevermous 139
        mov     eax, NoTickWaitTime
4700 mario79 140
;--------------------------------------
141
align 4
2288 clevermous 142
.wait:
143
        dec     eax
144
        jz      @@NextRetr
4700 mario79 145
 
2288 clevermous 146
        jmp     .wait
4700 mario79 147
;--------------------------------------
148
align 4
2288 clevermous 149
@@:
150
        loop    @@NextRetr
4700 mario79 151
;--------------------------------------
2288 clevermous 152
@@End_4:
153
        mov     dword [DevErrorCode], eax
154
        popad
155
        ret
4700 mario79 156
;-----------------------------------------------------------------------------
3539 clevermous 157
; Универсальные процедуры, обеспечивающие выполнение
158
;             пакетных команд в режиме PIO
159
; Максимально допустимое время ожидания реакции
160
; устройства на пакетную команду (в тиках)
4700 mario79 161
;-----------------------------------------------------------------------------
3539 clevermous 162
MaxCDWaitTime equ 1000 ;200 ;10 секунд
2288 clevermous 163
uglobal
3539 clevermous 164
; Область памяти для формирования пакетной команды
2288 clevermous 165
PacketCommand:
166
                 rb 12  ;DB 12 DUP (?)
3539 clevermous 167
; Адрес считываемого сектора данных
4700 mario79 168
CDSectorAddress:   dd ?
3539 clevermous 169
; Время начала очередной операции с диском
4700 mario79 170
TickCounter_1     dd 0
3539 clevermous 171
; Время начала ожидания готовности устройства
4700 mario79 172
WURStartTime      dd 0
3539 clevermous 173
; указатель буфера для считывания
2288 clevermous 174
CDDataBuf_pointer dd 0
175
endg
4700 mario79 176
;-----------------------------------------------------------------------------
2288 clevermous 177
;****************************************************
3539 clevermous 178
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
179
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
180
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
181
;* Входные параметры передаются через глобальные    *
182
;* перменные:                                       *
183
;* ChannelNumber - номер канала;                    *
184
;* DiskNumber - номер диска на канале;              *
185
;* PacketCommand - 12-байтный командный пакет;      *
186
;* CDBlockSize - размер принимаемого блока данных.  *
2288 clevermous 187
; return eax DevErrorCode
188
;****************************************************
189
SendPacketDatCommand:
190
        xor     eax, eax
3539 clevermous 191
; Задать режим CHS
2288 clevermous 192
        mov     byte [ATAAddressMode], al
3539 clevermous 193
; Послать ATA-команду передачи пакетной команды
2288 clevermous 194
        mov     byte [ATAFeatures], al
195
        mov     byte [ATASectorCount], al
196
        mov     byte [ATASectorNumber], al
3539 clevermous 197
        ; Загрузить размер передаваемого блока
2288 clevermous 198
        mov     [ATAHead], al
199
        mov     [ATACylinder], CDBlockSize
4700 mario79 200
        mov     [ATACommand], 0xA0
2288 clevermous 201
        call    SendCommandToHDD_1
202
        test    eax, eax
3539 clevermous 203
        jnz     @@End_8    ;закончить, сохранив код ошибки
204
; Ожидание готовности дисковода к приему
205
; пакетной команды
4700 mario79 206
        mov     dx, [ATABasePortAddr]
207
        add     dx, 7    ;порт 1х7h
2288 clevermous 208
        mov     ecx, NoTickWaitTime
4700 mario79 209
;--------------------------------------
210
align 4
2288 clevermous 211
@@WaitDevice0:
212
        cmp     [timer_ticks_enable], 0
213
        jne     @f
4700 mario79 214
 
2288 clevermous 215
        dec     ecx
216
        jz      @@Err1_1
4700 mario79 217
 
2288 clevermous 218
        jmp     .test
4700 mario79 219
;--------------------------------------
220
align 4
2288 clevermous 221
@@:
222
        call    change_task
3539 clevermous 223
        ; Проверить время выполнения команды
4700 mario79 224
        mov     eax, [timer_ticks]
225
        sub     eax, [TickCounter_1]
226
        cmp     eax, BSYWaitTime
3539 clevermous 227
        ja      @@Err1_1   ;ошибка тайм-аута
228
        ; Проверить готовность
4700 mario79 229
;--------------------------------------
230
align 4
2288 clevermous 231
.test:
4700 mario79 232
        in      al, dx
233
        test    al, 0x80  ;состояние сигнала BSY
2288 clevermous 234
        jnz     @@WaitDevice0
4700 mario79 235
 
236
        test    al, 1    ;состояние сигнала ERR
2288 clevermous 237
        jnz     @@Err6
4700 mario79 238
 
239
        test    al, 0x8  ;состояние сигнала DRQ
2288 clevermous 240
        jz      @@WaitDevice0
3539 clevermous 241
; Послать пакетную команду
2288 clevermous 242
        cli
4700 mario79 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
2288 clevermous 256
        sti
3539 clevermous 257
; Ожидание готовности данных
4700 mario79 258
        mov     dx, [ATABasePortAddr]
259
        add     dx, 7  ;порт 1х7h
2288 clevermous 260
        mov     ecx, NoTickWaitTime
4700 mario79 261
;--------------------------------------
262
align 4
2288 clevermous 263
@@WaitDevice1:
264
        cmp     [timer_ticks_enable], 0
265
        jne     @f
4700 mario79 266
 
2288 clevermous 267
        dec     ecx
268
        jz      @@Err1_1
4700 mario79 269
 
2288 clevermous 270
        jmp     .test_1
4700 mario79 271
;--------------------------------------
272
align 4
2288 clevermous 273
@@:
274
        call    change_task
3539 clevermous 275
        ; Проверить время выполнения команды
4700 mario79 276
        mov     eax, [timer_ticks]
277
        sub     eax, [TickCounter_1]
278
        cmp     eax, MaxCDWaitTime
3539 clevermous 279
        ja      @@Err1_1   ;ошибка тайм-аута
280
        ; Проверить готовность
4700 mario79 281
;--------------------------------------
282
align 4
2288 clevermous 283
.test_1:
4700 mario79 284
        in      al, dx
285
        test    al, 0x80  ;состояние сигнала BSY
2288 clevermous 286
        jnz     @@WaitDevice1
4700 mario79 287
 
288
        test    al, 1    ;состояние сигнала ERR
2288 clevermous 289
        jnz     @@Err6_temp
4700 mario79 290
 
291
        test    al, 0x8  ;состояние сигнала DRQ
2288 clevermous 292
        jz      @@WaitDevice1
3539 clevermous 293
; Принять блок данных от контроллера
4700 mario79 294
        mov     edi, [CDDataBuf_pointer]
3539 clevermous 295
        ; Загрузить адрес регистра данных контроллера
4700 mario79 296
        mov     dx, [ATABasePortAddr]
3539 clevermous 297
        ; Загрузить в счетчик размер блока в байтах
2288 clevermous 298
        xor     ecx, ecx
4700 mario79 299
        mov     cx, CDBlockSize
3539 clevermous 300
        ; Вычислить размер блока в 16-разрядных словах
4700 mario79 301
        shr     cx, 1 ;разделить размер блока на 2
3539 clevermous 302
        ; Принять блок данных
2288 clevermous 303
        cli
304
        cld
305
        rep insw
306
        sti
4700 mario79 307
;--------------------------------------
3539 clevermous 308
; Успешное завершение приема данных
2288 clevermous 309
@@End_8:
310
        xor     eax, eax
311
        ret
4700 mario79 312
;--------------------------------------
3539 clevermous 313
; Записать код ошибки
2288 clevermous 314
@@Err1_1:
315
        xor     eax, eax
316
        inc     eax
317
        ret
4700 mario79 318
;--------------------------------------
2288 clevermous 319
@@Err6_temp:
320
        mov     eax, 7
321
        ret
4700 mario79 322
;--------------------------------------
2288 clevermous 323
@@Err6:
324
        mov     eax, 6
325
        ret
4700 mario79 326
;-----------------------------------------------------------------------------
2288 clevermous 327
;***********************************************
3539 clevermous 328
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
329
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
330
;* Входные параметры передаются через          *
331
;* глобальные перменные:                       *
332
;* ChannelNumber - номер канала;               *
333
;* DiskNumber - номер диска на канале;         *
334
;* PacketCommand - 12-байтный командный пакет. *
2288 clevermous 335
;***********************************************
336
SendPacketNoDatCommand:
337
        pushad
338
        xor     eax, eax
3539 clevermous 339
; Задать режим CHS
2288 clevermous 340
        mov     byte [ATAAddressMode], al
3539 clevermous 341
; Послать ATA-команду передачи пакетной команды
2288 clevermous 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
4700 mario79 347
        mov     [ATACommand], 0xA0
2288 clevermous 348
        call    SendCommandToHDD_1
349
        test    eax, eax
3539 clevermous 350
        jnz     @@End_9  ;закончить, сохранив код ошибки
351
; Ожидание готовности дисковода к приему
352
; пакетной команды
4700 mario79 353
        mov     dx, [ATABasePortAddr]
354
        add     dx, 7  ;порт 1х7h
355
;--------------------------------------
356
align 4
2288 clevermous 357
@@WaitDevice0_1:
358
        call    change_task
3539 clevermous 359
        ; Проверить время ожидания
4700 mario79 360
        mov     eax, [timer_ticks]
361
        sub     eax, [TickCounter_1]
362
        cmp     eax, BSYWaitTime
3539 clevermous 363
        ja      @@Err1_3   ;ошибка тайм-аута
364
        ; Проверить готовность
4700 mario79 365
        in      al, dx
366
        test    al, 0x80  ;состояние сигнала BSY
2288 clevermous 367
        jnz     @@WaitDevice0_1
4700 mario79 368
 
369
        test    al, 1    ;состояние сигнала ERR
2288 clevermous 370
        jnz     @@Err6_1
4700 mario79 371
 
372
        test    al, 0x8  ;состояние сигнала DRQ
2288 clevermous 373
        jz      @@WaitDevice0_1
3539 clevermous 374
; Послать пакетную команду
2288 clevermous 375
;        cli
4700 mario79 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
2288 clevermous 389
;        sti
390
        cmp     [ignore_CD_eject_wait], 1
391
        je      @@clear_DEC
3539 clevermous 392
; Ожидание подтверждения приема команды
4700 mario79 393
        mov     dx, [ATABasePortAddr]
394
        add     dx, 7  ;порт 1х7h
395
;--------------------------------------
396
align 4
2288 clevermous 397
@@WaitDevice1_1:
398
        call    change_task
3539 clevermous 399
        ; Проверить время выполнения команды
4700 mario79 400
        mov     eax, [timer_ticks]
401
        sub     eax, [TickCounter_1]
402
        cmp     eax, MaxCDWaitTime
3539 clevermous 403
        ja      @@Err1_3   ;ошибка тайм-аута
404
        ; Ожидать освобождения устройства
4700 mario79 405
        in      al, dx
406
        test    al, 0x80  ;состояние сигнала BSY
2288 clevermous 407
        jnz     @@WaitDevice1_1
4700 mario79 408
 
409
        test    al, 1    ;состояние сигнала ERR
2288 clevermous 410
        jnz     @@Err6_1
4700 mario79 411
 
412
        test    al, 0x40  ;состояние сигнала DRDY
2288 clevermous 413
        jz      @@WaitDevice1_1
4700 mario79 414
;--------------------------------------
2288 clevermous 415
@@clear_DEC:
416
        and     [DevErrorCode], 0
417
        popad
418
        ret
4700 mario79 419
;--------------------------------------
3539 clevermous 420
; Записать код ошибки
2288 clevermous 421
@@Err1_3:
422
        xor     eax, eax
423
        inc     eax
424
        jmp     @@End_9
4700 mario79 425
;--------------------------------------
2288 clevermous 426
@@Err6_1:
427
        mov     eax, 6
4700 mario79 428
;--------------------------------------
2288 clevermous 429
@@End_9:
430
        mov     [DevErrorCode], eax
431
        popad
432
        ret
4700 mario79 433
;-----------------------------------------------------------------------------
2288 clevermous 434
;****************************************************
3539 clevermous 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                       *
2288 clevermous 452
;****************************************************
453
SendCommandToHDD_1:
3539 clevermous 454
; Проверить значение кода режима
2288 clevermous 455
        cmp     [ATAAddressMode], 1
456
        ja      @@Err2_4
3539 clevermous 457
; Проверить корректность номера канала
4700 mario79 458
        mov     bx, [ChannelNumber]
459
        cmp     bx, 1
2288 clevermous 460
        jb      @@Err3_4
4700 mario79 461
 
462
        cmp     bx, 2
2288 clevermous 463
        ja      @@Err3_4
3539 clevermous 464
; Установить базовый адрес
4700 mario79 465
        dec     bx
466
        shl     ebx, 2
2288 clevermous 467
        movzx   ebx, bx
4700 mario79 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
3539 clevermous 476
; Ожидание готовности HDD к приему команды
477
        ; Выбрать нужный диск
4700 mario79 478
        mov     dx, [ATABasePortAddr]
479
        add     dx, 6   ;адрес регистра головок
480
        mov     al, [DiskNumber]
481
        cmp     al, 1   ;проверить номера диска
2288 clevermous 482
        ja      @@Err4_4
4700 mario79 483
 
484
        shl     al, 4
485
        or      al, 10100000b
486
        out     dx, al
3539 clevermous 487
        ; Ожидать, пока диск не будет готов
4700 mario79 488
        inc     dx
2288 clevermous 489
        mov     eax, [timer_ticks]
490
        mov     [TickCounter_1], eax
491
        mov     ecx, NoTickWaitTime
4700 mario79 492
;--------------------------------------
493
align 4
2288 clevermous 494
@@WaitHDReady_2:
495
        cmp     [timer_ticks_enable], 0
496
        jne     @f
4700 mario79 497
 
2288 clevermous 498
        dec     ecx
499
        jz      @@Err1_4
4700 mario79 500
 
2288 clevermous 501
        jmp     .test
4700 mario79 502
;--------------------------------------
503
align 4
2288 clevermous 504
@@:
505
        call    change_task
3539 clevermous 506
        ; Проверить время ожидания
2288 clevermous 507
        mov     eax, [timer_ticks]
508
        sub     eax, [TickCounter_1]
4700 mario79 509
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
3539 clevermous 510
        ja      @@Err1_4   ;ошибка тайм-аута
4700 mario79 511
;--------------------------------------
512
align 4
2288 clevermous 513
.test:
4700 mario79 514
        in      al, dx ; Прочитать регистр состояния
3539 clevermous 515
        ; Проверить состояние сигнала BSY
4700 mario79 516
        test    al, 0x80
2288 clevermous 517
        jnz     @@WaitHDReady_2
3539 clevermous 518
        ; Проверить состояние сигнала DRQ
4700 mario79 519
        test    al, 0x8
2288 clevermous 520
        jnz     @@WaitHDReady_2
3539 clevermous 521
; Загрузить команду в регистры контроллера
2288 clevermous 522
        cli
4700 mario79 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 ;проверить номер головки
2288 clevermous 543
        ja      @@Err5_4
4700 mario79 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
3539 clevermous 551
; Послать команду
4700 mario79 552
        mov     al, [ATACommand]
553
        inc     dx      ;регистр команд
554
        out     dx, al
2288 clevermous 555
        sti
4700 mario79 556
;--------------------------------------
2288 clevermous 557
@@End_10:
558
        xor     eax, eax
559
        ret
4700 mario79 560
;--------------------------------------
3539 clevermous 561
; Записать код ошибки
2288 clevermous 562
@@Err1_4:
563
        xor     eax, eax
564
        inc     eax
565
        ret
4700 mario79 566
;--------------------------------------
2288 clevermous 567
@@Err2_4:
568
        mov     eax, 2
569
        ret
4700 mario79 570
;--------------------------------------
2288 clevermous 571
@@Err3_4:
572
        mov     eax, 3
573
        ret
4700 mario79 574
;--------------------------------------
2288 clevermous 575
@@Err4_4:
576
        mov     eax, 4
577
        ret
4700 mario79 578
;--------------------------------------
2288 clevermous 579
@@Err5_4:
580
        mov     eax, 5
581
        ret
4700 mario79 582
;-----------------------------------------------------------------------------
2288 clevermous 583
;*************************************************
3539 clevermous 584
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
585
;* Входные параметры передаются через глобальные *
586
;* перменные:                                    *
587
;* ChannelNumber - номер канала;                 *
588
;* DiskNumber - номер диска на канале.           *
2288 clevermous 589
;*************************************************
590
WaitUnitReady:
591
        pusha
3539 clevermous 592
; Запомнить время начала операции
4700 mario79 593
        mov     eax, [timer_ticks]
594
        mov     [WURStartTime], eax
3539 clevermous 595
; Очистить буфер пакетной команды
2288 clevermous 596
        call    clear_packet_buffer
3539 clevermous 597
; Сформировать команду TEST UNIT READY
4700 mario79 598
        mov     [PacketCommand], word 0
3539 clevermous 599
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
2288 clevermous 600
        mov     ecx, NoTickWaitTime
4700 mario79 601
;--------------------------------------
602
align 4
2288 clevermous 603
@@SendCommand:
3539 clevermous 604
        ; Подать команду проверки готовности
2288 clevermous 605
        call    SendPacketNoDatCommand
606
        cmp     [timer_ticks_enable], 0
607
        jne     @f
4700 mario79 608
 
2288 clevermous 609
        cmp     [DevErrorCode], 0
610
        je      @@End_11
4700 mario79 611
 
2288 clevermous 612
        dec     ecx
613
        jz      .Error
4700 mario79 614
 
2288 clevermous 615
        jmp     @@SendCommand
4700 mario79 616
;--------------------------------------
617
align 4
2288 clevermous 618
@@:
619
        call    change_task
3539 clevermous 620
        ; Проверить код ошибки
2288 clevermous 621
        cmp     [DevErrorCode], 0
622
        je      @@End_11
3539 clevermous 623
        ; Проверить время ожидания готовности
4700 mario79 624
        mov     eax, [timer_ticks]
625
        sub     eax, [WURStartTime]
626
        cmp     eax, MaxCDWaitTime
2288 clevermous 627
        jb      @@SendCommand
4700 mario79 628
;--------------------------------------
2288 clevermous 629
.Error:
3539 clevermous 630
        ; Ошибка тайм-аута
2288 clevermous 631
        mov     [DevErrorCode], 1
4700 mario79 632
;--------------------------------------
2288 clevermous 633
@@End_11:
634
        popa
635
        ret
4700 mario79 636
;-----------------------------------------------------------------------------
2288 clevermous 637
;*************************************************
3539 clevermous 638
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
639
;* Входные параметры передаются через глобальные *
640
;* перменные:                                    *
641
;* ChannelNumber - номер канала;                 *
642
;* DiskNumber - номер диска на канале.           *
2288 clevermous 643
;*************************************************
644
prevent_medium_removal:
645
        pusha
3539 clevermous 646
; Очистить буфер пакетной команды
2288 clevermous 647
        call    clear_packet_buffer
3539 clevermous 648
; Задать код команды
2288 clevermous 649
        mov     [PacketCommand], byte 0x1E
3539 clevermous 650
; Задать код запрета
2288 clevermous 651
        mov     [PacketCommand+4], byte 11b
3539 clevermous 652
; Подать команду
2288 clevermous 653
        call    SendPacketNoDatCommand
654
        mov     eax, ATAPI_IDE0_lock
655
        add     eax, [cdpos]
656
        dec     eax
657
        mov     [eax], byte 1
658
        popa
659
        ret
4700 mario79 660
;-----------------------------------------------------------------------------
2288 clevermous 661
;*************************************************
3539 clevermous 662
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
663
;* Входные параметры передаются через глобальные *
664
;* перменные:                                    *
665
;* ChannelNumber - номер канала;                 *
666
;* DiskNumber - номер диска на канале.           *
2288 clevermous 667
;*************************************************
668
allow_medium_removal:
669
        pusha
3539 clevermous 670
; Очистить буфер пакетной команды
2288 clevermous 671
        call    clear_packet_buffer
3539 clevermous 672
; Задать код команды
2288 clevermous 673
        mov     [PacketCommand], byte 0x1E
3539 clevermous 674
; Задать код запрета
4700 mario79 675
        mov     [PacketCommand+4], byte 0
3539 clevermous 676
; Подать команду
2288 clevermous 677
        call    SendPacketNoDatCommand
678
        mov     eax, ATAPI_IDE0_lock
679
        add     eax, [cdpos]
680
        dec     eax
681
        mov     [eax], byte 0
682
        popa
683
        ret
4700 mario79 684
;-----------------------------------------------------------------------------
2288 clevermous 685
;*************************************************
3539 clevermous 686
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
687
;* Входные параметры передаются через глобальные *
688
;* перменные:                                    *
689
;* ChannelNumber - номер канала;                 *
690
;* DiskNumber - номер диска на канале.           *
2288 clevermous 691
;*************************************************
692
LoadMedium:
693
        pusha
3539 clevermous 694
; Очистить буфер пакетной команды
2288 clevermous 695
        call    clear_packet_buffer
3539 clevermous 696
; Сформировать команду START/STOP UNIT
697
        ; Задать код команды
4700 mario79 698
        mov     [PacketCommand], word 0x1B
3539 clevermous 699
        ; Задать операцию загрузки носителя
2288 clevermous 700
        mov     [PacketCommand+4], word 00000011b
3539 clevermous 701
; Подать команду
2288 clevermous 702
        call    SendPacketNoDatCommand
703
        popa
704
        ret
4700 mario79 705
;-----------------------------------------------------------------------------
2288 clevermous 706
;*************************************************
3539 clevermous 707
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
708
;* Входные параметры передаются через глобальные *
709
;* перменные:                                    *
710
;* ChannelNumber - номер канала;                 *
711
;* DiskNumber - номер диска на канале.           *
2288 clevermous 712
;*************************************************
713
EjectMedium:
714
        pusha
3539 clevermous 715
; Очистить буфер пакетной команды
2288 clevermous 716
        call    clear_packet_buffer
3539 clevermous 717
; Сформировать команду START/STOP UNIT
718
        ; Задать код команды
4700 mario79 719
        mov     [PacketCommand], word 0x1B
3539 clevermous 720
        ; Задать операцию извлечения носителя
2288 clevermous 721
        mov     [PacketCommand+4], word 00000010b
3539 clevermous 722
; Подать команду
2288 clevermous 723
        call    SendPacketNoDatCommand
724
        popa
725
        ret
4700 mario79 726
;-----------------------------------------------------------------------------
2288 clevermous 727
;*************************************************
3539 clevermous 728
;* Проверить событие нажатия кнопки извлечения   *
729
;*                     диска                     *
730
;* Входные параметры передаются через глобальные *
731
;* переменные:                                   *
732
;* ChannelNumber - номер канала;                 *
733
;* DiskNumber - номер диска на канале.           *
2288 clevermous 734
;*************************************************
3534 clevermous 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
4700 mario79 740
 
3534 clevermous 741
        xor     eax, eax
742
        inc     eax
743
        ret
4700 mario79 744
;--------------------------------------
3534 clevermous 745
.no:
746
        xor     eax, eax
747
        ret
748
endp
4700 mario79 749
;-----------------------------------------------------------------------------
2288 clevermous 750
align 4
751
check_ATAPI_device_event:
752
        pusha
753
        mov     eax, [timer_ticks]
754
        sub     eax, [timer_ATAPI_check]
755
        cmp     eax, 100
756
        jb      .end_1
4700 mario79 757
 
4734 mario79 758
        pushfd
2288 clevermous 759
        mov     al, [DRIVE_DATA+1]
760
        and     al, 11b
761
        cmp     al, 10b
762
        jz      .ide3
4700 mario79 763
;--------------------------------------
2288 clevermous 764
.ide2_1:
765
        mov     al, [DRIVE_DATA+1]
766
        and     al, 1100b
767
        cmp     al, 1000b
768
        jz      .ide2
4700 mario79 769
;--------------------------------------
2288 clevermous 770
.ide1_1:
771
        mov     al, [DRIVE_DATA+1]
772
        and     al, 110000b
773
        cmp     al, 100000b
774
        jz      .ide1
4700 mario79 775
;--------------------------------------
2288 clevermous 776
.ide0_1:
777
        mov     al, [DRIVE_DATA+1]
778
        and     al, 11000000b
779
        cmp     al, 10000000b
780
        jz      .ide0
4700 mario79 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
;--------------------------------------
2288 clevermous 830
.end:
4734 mario79 831
        popfd
2288 clevermous 832
        mov     eax, [timer_ticks]
833
        mov     [timer_ATAPI_check], eax
4700 mario79 834
;--------------------------------------
2288 clevermous 835
.end_1:
836
        popa
837
        ret
4700 mario79 838
;-----------------------------------------------------------------------------
2288 clevermous 839
.ide3:
840
        cli
841
        cmp     [ATAPI_IDE3_lock], 1
842
        jne     .ide2_1
4700 mario79 843
 
2288 clevermous 844
        cmp     [cd_status], 0
845
        jne     .end
4700 mario79 846
 
3742 clevermous 847
        mov     ecx, ide_channel2_mutex
848
        call    mutex_lock
2288 clevermous 849
        call    reserve_ok2
850
        mov     [ChannelNumber], 2
851
        mov     [DiskNumber], 1
852
        mov     [cdpos], 4
853
        call    GetEvent_StatusNotification
854
        cmp     [CDDataBuf+4], byte 1
4700 mario79 855
        jne     @f
856
 
2288 clevermous 857
        call    .eject
4700 mario79 858
;--------------------------------------
859
@@:
2288 clevermous 860
        call    syscall_cdaudio.free
861
        jmp     .ide2_1
4700 mario79 862
;-----------------------------------------------------------------------------
2288 clevermous 863
.ide2:
864
        cli
865
        cmp     [ATAPI_IDE2_lock], 1
866
        jne     .ide1_1
4700 mario79 867
 
2288 clevermous 868
        cmp     [cd_status], 0
869
        jne     .end
4700 mario79 870
 
3742 clevermous 871
        mov     ecx, ide_channel2_mutex
872
        call    mutex_lock
2288 clevermous 873
        call    reserve_ok2
874
        mov     [ChannelNumber], 2
875
        mov     [DiskNumber], 0
876
        mov     [cdpos], 3
877
        call    GetEvent_StatusNotification
878
        cmp     [CDDataBuf+4], byte 1
4700 mario79 879
        jne     @f
880
 
2288 clevermous 881
        call    .eject
4700 mario79 882
;--------------------------------------
883
@@:
2288 clevermous 884
        call    syscall_cdaudio.free
885
        jmp     .ide1_1
4700 mario79 886
;-----------------------------------------------------------------------------
2288 clevermous 887
.ide1:
888
        cli
889
        cmp     [ATAPI_IDE1_lock], 1
890
        jne     .ide0_1
4700 mario79 891
 
2288 clevermous 892
        cmp     [cd_status], 0
893
        jne     .end
4700 mario79 894
 
3742 clevermous 895
        mov     ecx, ide_channel1_mutex
896
        call    mutex_lock
2288 clevermous 897
        call    reserve_ok2
898
        mov     [ChannelNumber], 1
899
        mov     [DiskNumber], 1
900
        mov     [cdpos], 2
901
        call    GetEvent_StatusNotification
902
        cmp     [CDDataBuf+4], byte 1
4700 mario79 903
        jne     @f
904
 
2288 clevermous 905
        call    .eject
4700 mario79 906
;--------------------------------------
907
@@:
2288 clevermous 908
        call    syscall_cdaudio.free
909
        jmp     .ide0_1
4700 mario79 910
;-----------------------------------------------------------------------------
2288 clevermous 911
.ide0:
912
        cli
913
        cmp     [ATAPI_IDE0_lock], 1
4734 mario79 914
        jne     .ide7_1
4700 mario79 915
 
2288 clevermous 916
        cmp     [cd_status], 0
917
        jne     .end
4700 mario79 918
 
3742 clevermous 919
        mov     ecx, ide_channel1_mutex
920
        call    mutex_lock
2288 clevermous 921
        call    reserve_ok2
922
        mov     [ChannelNumber], 1
923
        mov     [DiskNumber], 0
924
        mov     [cdpos], 1
925
        call    GetEvent_StatusNotification
926
        cmp     [CDDataBuf+4], byte 1
4700 mario79 927
        jne     @f
928
 
929
        call    .eject
930
;--------------------------------------
931
@@:
2288 clevermous 932
        call    syscall_cdaudio.free
4734 mario79 933
        jmp     .ide7_1
4700 mario79 934
;-----------------------------------------------------------------------------
935
.ide7:
936
        cli
937
        cmp     [ATAPI_IDE7_lock], 1
4734 mario79 938
        jne     .ide6_1
4700 mario79 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
 
2288 clevermous 953
        call    .eject
4700 mario79 954
;--------------------------------------
955
@@:
2288 clevermous 956
        call    syscall_cdaudio.free
4734 mario79 957
        jmp     .ide6_1
4700 mario79 958
;-----------------------------------------------------------------------------
959
.ide6:
960
        cli
961
        cmp     [ATAPI_IDE6_lock], 1
4734 mario79 962
        jne     .ide5_1
4700 mario79 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
4734 mario79 981
        jmp     .ide5_1
4700 mario79 982
;-----------------------------------------------------------------------------
983
.ide5:
984
        cli
985
        cmp     [ATAPI_IDE5_lock], 1
4734 mario79 986
        jne     .ide4_1
4700 mario79 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
4734 mario79 1005
        jmp     .ide4_1
4700 mario79 1006
;-----------------------------------------------------------------------------
1007
.ide4:
1008
        cli
1009
        cmp     [ATAPI_IDE4_lock], 1
4734 mario79 1010
        jne     .ide11_1
4700 mario79 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
4734 mario79 1029
        jmp     .ide11_1
4700 mario79 1030
;-----------------------------------------------------------------------------
1031
.ide11:
1032
        cli
1033
        cmp     [ATAPI_IDE11_lock], 1
4734 mario79 1034
        jne     .ide10_1
2288 clevermous 1035
 
4700 mario79 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
4734 mario79 1053
        jmp     .ide10_1
4700 mario79 1054
;-----------------------------------------------------------------------------
1055
.ide10:
1056
        cli
1057
        cmp     [ATAPI_IDE10_lock], 1
4734 mario79 1058
        jne     .ide9_1
4700 mario79 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
4734 mario79 1077
        jmp     .ide9_1
4700 mario79 1078
;-----------------------------------------------------------------------------
1079
.ide9:
1080
        cli
1081
        cmp     [ATAPI_IDE9_lock], 1
4734 mario79 1082
        jne     .ide8_1
4700 mario79 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
4734 mario79 1101
        jmp     .ide8_1
4700 mario79 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
1125
        jmp     .end
1126
;-----------------------------------------------------------------------------
2288 clevermous 1127
.eject:
1128
        call    clear_CD_cache
1129
        call    allow_medium_removal
1130
        mov     [ignore_CD_eject_wait], 1
1131
        call    EjectMedium
1132
        mov     [ignore_CD_eject_wait], 0
1133
        ret
4700 mario79 1134
;-----------------------------------------------------------------------------
2288 clevermous 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
4700 mario79 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
2288 clevermous 1149
ignore_CD_eject_wait db 0
1150
endg
4700 mario79 1151
;-----------------------------------------------------------------------------
2288 clevermous 1152
;*************************************************
3539 clevermous 1153
;* Получить сообщение о событии или состоянии    *
1154
;*                  устройства                   *
1155
;* Входные параметры передаются через глобальные *
1156
;* переменные:                                   *
1157
;* ChannelNumber - номер канала;                 *
1158
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1159
;*************************************************
1160
GetEvent_StatusNotification:
1161
        pusha
1162
        mov     [CDDataBuf_pointer], CDDataBuf
3539 clevermous 1163
; Очистить буфер пакетной команды
2288 clevermous 1164
        call    clear_packet_buffer
3539 clevermous 1165
; Задать код команды
2288 clevermous 1166
        mov     [PacketCommand], byte 4Ah
1167
        mov     [PacketCommand+1], byte 00000001b
3539 clevermous 1168
; Задать запрос класса сообщений
2288 clevermous 1169
        mov     [PacketCommand+4], byte 00010000b
3539 clevermous 1170
; Размер выделенной области
2288 clevermous 1171
        mov     [PacketCommand+7], byte 8h
1172
        mov     [PacketCommand+8], byte 0h
3539 clevermous 1173
; Подать команду
2288 clevermous 1174
        call    SendPacketDatCommand
1175
        popa
1176
        ret
4700 mario79 1177
;-----------------------------------------------------------------------------
2288 clevermous 1178
;*************************************************
3539 clevermous 1179
; прочитать информацию из TOC
1180
;* Входные параметры передаются через глобальные *
1181
;* переменные:                                   *
1182
;* ChannelNumber - номер канала;                 *
1183
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1184
;*************************************************
1185
Read_TOC:
1186
        pusha
1187
        mov     [CDDataBuf_pointer], CDDataBuf
3539 clevermous 1188
; Очистить буфер пакетной команды
2288 clevermous 1189
        call    clear_packet_buffer
3539 clevermous 1190
; Сформировать пакетную команду для считывания
1191
; сектора данных
2288 clevermous 1192
        mov     [PacketCommand], byte 0x43
3539 clevermous 1193
        ; Задать формат
2288 clevermous 1194
        mov     [PacketCommand+2], byte 1
3539 clevermous 1195
; Размер выделенной области
2288 clevermous 1196
        mov     [PacketCommand+7], byte 0xFF
1197
        mov     [PacketCommand+8], byte 0h
3539 clevermous 1198
; Подать команду
2288 clevermous 1199
        call    SendPacketDatCommand
1200
        popa
1201
        ret
4700 mario79 1202
;-----------------------------------------------------------------------------
2288 clevermous 1203
;*************************************************
3539 clevermous 1204
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1205
;* Входные параметры передаются через глобальные *
1206
;* переменные:                                   *
1207
;* ChannelNumber - номер канала;                 *
1208
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1209
;*************************************************
1210
;ReadCapacity:
1211
;       pusha
3539 clevermous 1212
;; Очистить буфер пакетной команды
2288 clevermous 1213
;       call  clear_packet_buffer
3539 clevermous 1214
;; Задать размер буфера в байтах
2288 clevermous 1215
;       mov     [CDBlockSize],8
3539 clevermous 1216
;; Сформировать команду READ CAPACITY
2288 clevermous 1217
;       mov     [PacketCommand],word 25h
3539 clevermous 1218
;; Подать команду
2288 clevermous 1219
;       call    SendPacketDatCommand
1220
;       popa
1221
;       ret
4700 mario79 1222
;-----------------------------------------------------------------------------
2288 clevermous 1223
clear_packet_buffer:
3539 clevermous 1224
; Очистить буфер пакетной команды
2288 clevermous 1225
        and     [PacketCommand], dword 0
1226
        and     [PacketCommand+4], dword 0
1227
        and     [PacketCommand+8], dword 0
1228
        ret
4700 mario79 1229
;-----------------------------------------------------------------------------