Subversion Repositories Kolibri OS

Rev

Rev 6464 | Rev 8053 | 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: 7136 $
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
; Максимальное количество повторений операции чтения
7136 dunkaist 18
MaxRetr = 10
3539 clevermous 19
; Предельное время ожидания готовности к приему команды
20
; (в тиках)
7136 dunkaist 21
BSYWaitTime = 1000  ;2
22
NoTickWaitTime = 0xfffff
23
CDBlockSize = 2048
2288 clevermous 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
;-----------------------------------------------------------------------------
7136 dunkaist 162
MaxCDWaitTime = 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
; Проверить корректность номера канала
6464 pathoswith 458
        movzx   ebx, [ChannelNumber]
459
        dec     ebx
460
        cmp     ebx, 1
2288 clevermous 461
        ja      @@Err3_4
3539 clevermous 462
; Установить базовый адрес
4700 mario79 463
        shl     ebx, 2
464
        mov     eax, [cdpos]
465
        dec     eax
466
        shr     eax, 2
467
        imul    eax, sizeof.IDE_DATA
468
        add     eax, IDE_controller_1
469
        add     eax, ebx
470
        mov     ax, [eax+IDE_DATA.BAR0_val]
471
        mov     [ATABasePortAddr], ax
3539 clevermous 472
; Ожидание готовности HDD к приему команды
473
        ; Выбрать нужный диск
4700 mario79 474
        mov     dx, [ATABasePortAddr]
475
        add     dx, 6   ;адрес регистра головок
476
        mov     al, [DiskNumber]
477
        cmp     al, 1   ;проверить номера диска
2288 clevermous 478
        ja      @@Err4_4
4700 mario79 479
 
480
        shl     al, 4
481
        or      al, 10100000b
482
        out     dx, al
3539 clevermous 483
        ; Ожидать, пока диск не будет готов
4700 mario79 484
        inc     dx
2288 clevermous 485
        mov     eax, [timer_ticks]
486
        mov     [TickCounter_1], eax
487
        mov     ecx, NoTickWaitTime
4700 mario79 488
;--------------------------------------
489
align 4
2288 clevermous 490
@@WaitHDReady_2:
491
        cmp     [timer_ticks_enable], 0
492
        jne     @f
4700 mario79 493
 
2288 clevermous 494
        dec     ecx
495
        jz      @@Err1_4
4700 mario79 496
 
2288 clevermous 497
        jmp     .test
4700 mario79 498
;--------------------------------------
499
align 4
2288 clevermous 500
@@:
501
        call    change_task
3539 clevermous 502
        ; Проверить время ожидания
2288 clevermous 503
        mov     eax, [timer_ticks]
504
        sub     eax, [TickCounter_1]
4700 mario79 505
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
3539 clevermous 506
        ja      @@Err1_4   ;ошибка тайм-аута
4700 mario79 507
;--------------------------------------
508
align 4
2288 clevermous 509
.test:
4700 mario79 510
        in      al, dx ; Прочитать регистр состояния
3539 clevermous 511
        ; Проверить состояние сигнала BSY
4700 mario79 512
        test    al, 0x80
2288 clevermous 513
        jnz     @@WaitHDReady_2
3539 clevermous 514
        ; Проверить состояние сигнала DRQ
4700 mario79 515
        test    al, 0x8
2288 clevermous 516
        jnz     @@WaitHDReady_2
3539 clevermous 517
; Загрузить команду в регистры контроллера
2288 clevermous 518
        cli
4700 mario79 519
        mov     dx, [ATABasePortAddr]
520
        inc     dx      ;регистр "особенностей"
521
        mov     al, [ATAFeatures]
522
        out     dx, al
523
        inc     dx      ;счетчик секторов
524
        mov     al, [ATASectorCount]
525
        out     dx, al
526
        inc     dx      ;регистр номера сектора
527
        mov     al, [ATASectorNumber]
528
        out     dx, al
529
        inc     dx      ;номер цилиндра (младший байт)
530
        mov     ax, [ATACylinder]
531
        out     dx, al
532
        inc     dx      ;номер цилиндра (старший байт)
533
        mov     al, ah
534
        out     dx, al
535
        inc     dx      ;номер головки/номер диска
536
        mov     al, [DiskNumber]
537
        shl     al, 4
538
        cmp     [ATAHead], 0xF ;проверить номер головки
2288 clevermous 539
        ja      @@Err5_4
4700 mario79 540
 
541
        or      al, [ATAHead]
542
        or      al, 10100000b
543
        mov     ah, [ATAAddressMode]
544
        shl     ah, 6
545
        or      al, ah
546
        out     dx, al
3539 clevermous 547
; Послать команду
4700 mario79 548
        mov     al, [ATACommand]
549
        inc     dx      ;регистр команд
550
        out     dx, al
2288 clevermous 551
        sti
4700 mario79 552
;--------------------------------------
2288 clevermous 553
@@End_10:
554
        xor     eax, eax
555
        ret
4700 mario79 556
;--------------------------------------
3539 clevermous 557
; Записать код ошибки
2288 clevermous 558
@@Err1_4:
559
        xor     eax, eax
560
        inc     eax
561
        ret
4700 mario79 562
;--------------------------------------
2288 clevermous 563
@@Err2_4:
564
        mov     eax, 2
565
        ret
4700 mario79 566
;--------------------------------------
2288 clevermous 567
@@Err3_4:
568
        mov     eax, 3
569
        ret
4700 mario79 570
;--------------------------------------
2288 clevermous 571
@@Err4_4:
572
        mov     eax, 4
573
        ret
4700 mario79 574
;--------------------------------------
2288 clevermous 575
@@Err5_4:
576
        mov     eax, 5
577
        ret
4700 mario79 578
;-----------------------------------------------------------------------------
2288 clevermous 579
;*************************************************
3539 clevermous 580
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
581
;* Входные параметры передаются через глобальные *
582
;* перменные:                                    *
583
;* ChannelNumber - номер канала;                 *
584
;* DiskNumber - номер диска на канале.           *
2288 clevermous 585
;*************************************************
586
WaitUnitReady:
587
        pusha
3539 clevermous 588
; Запомнить время начала операции
4700 mario79 589
        mov     eax, [timer_ticks]
590
        mov     [WURStartTime], eax
3539 clevermous 591
; Очистить буфер пакетной команды
2288 clevermous 592
        call    clear_packet_buffer
3539 clevermous 593
; Сформировать команду TEST UNIT READY
4700 mario79 594
        mov     [PacketCommand], word 0
3539 clevermous 595
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
2288 clevermous 596
        mov     ecx, NoTickWaitTime
4700 mario79 597
;--------------------------------------
598
align 4
2288 clevermous 599
@@SendCommand:
3539 clevermous 600
        ; Подать команду проверки готовности
2288 clevermous 601
        call    SendPacketNoDatCommand
602
        cmp     [timer_ticks_enable], 0
603
        jne     @f
4700 mario79 604
 
2288 clevermous 605
        cmp     [DevErrorCode], 0
606
        je      @@End_11
4700 mario79 607
 
2288 clevermous 608
        dec     ecx
609
        jz      .Error
4700 mario79 610
 
2288 clevermous 611
        jmp     @@SendCommand
4700 mario79 612
;--------------------------------------
613
align 4
2288 clevermous 614
@@:
615
        call    change_task
3539 clevermous 616
        ; Проверить код ошибки
2288 clevermous 617
        cmp     [DevErrorCode], 0
618
        je      @@End_11
3539 clevermous 619
        ; Проверить время ожидания готовности
4700 mario79 620
        mov     eax, [timer_ticks]
621
        sub     eax, [WURStartTime]
622
        cmp     eax, MaxCDWaitTime
2288 clevermous 623
        jb      @@SendCommand
4700 mario79 624
;--------------------------------------
2288 clevermous 625
.Error:
3539 clevermous 626
        ; Ошибка тайм-аута
2288 clevermous 627
        mov     [DevErrorCode], 1
4700 mario79 628
;--------------------------------------
2288 clevermous 629
@@End_11:
630
        popa
631
        ret
4700 mario79 632
;-----------------------------------------------------------------------------
2288 clevermous 633
;*************************************************
3539 clevermous 634
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
635
;* Входные параметры передаются через глобальные *
636
;* перменные:                                    *
637
;* ChannelNumber - номер канала;                 *
638
;* DiskNumber - номер диска на канале.           *
2288 clevermous 639
;*************************************************
640
prevent_medium_removal:
641
        pusha
3539 clevermous 642
; Очистить буфер пакетной команды
2288 clevermous 643
        call    clear_packet_buffer
3539 clevermous 644
; Задать код команды
2288 clevermous 645
        mov     [PacketCommand], byte 0x1E
3539 clevermous 646
; Задать код запрета
2288 clevermous 647
        mov     [PacketCommand+4], byte 11b
3539 clevermous 648
; Подать команду
2288 clevermous 649
        call    SendPacketNoDatCommand
650
        mov     eax, ATAPI_IDE0_lock
651
        add     eax, [cdpos]
652
        dec     eax
653
        mov     [eax], byte 1
654
        popa
655
        ret
4700 mario79 656
;-----------------------------------------------------------------------------
2288 clevermous 657
;*************************************************
3539 clevermous 658
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
659
;* Входные параметры передаются через глобальные *
660
;* перменные:                                    *
661
;* ChannelNumber - номер канала;                 *
662
;* DiskNumber - номер диска на канале.           *
2288 clevermous 663
;*************************************************
664
allow_medium_removal:
665
        pusha
3539 clevermous 666
; Очистить буфер пакетной команды
2288 clevermous 667
        call    clear_packet_buffer
3539 clevermous 668
; Задать код команды
2288 clevermous 669
        mov     [PacketCommand], byte 0x1E
3539 clevermous 670
; Задать код запрета
4700 mario79 671
        mov     [PacketCommand+4], byte 0
3539 clevermous 672
; Подать команду
2288 clevermous 673
        call    SendPacketNoDatCommand
674
        mov     eax, ATAPI_IDE0_lock
675
        add     eax, [cdpos]
676
        dec     eax
677
        mov     [eax], byte 0
678
        popa
679
        ret
4700 mario79 680
;-----------------------------------------------------------------------------
2288 clevermous 681
;*************************************************
3539 clevermous 682
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
683
;* Входные параметры передаются через глобальные *
684
;* перменные:                                    *
685
;* ChannelNumber - номер канала;                 *
686
;* DiskNumber - номер диска на канале.           *
2288 clevermous 687
;*************************************************
688
LoadMedium:
689
        pusha
3539 clevermous 690
; Очистить буфер пакетной команды
2288 clevermous 691
        call    clear_packet_buffer
3539 clevermous 692
; Сформировать команду START/STOP UNIT
693
        ; Задать код команды
4700 mario79 694
        mov     [PacketCommand], word 0x1B
3539 clevermous 695
        ; Задать операцию загрузки носителя
2288 clevermous 696
        mov     [PacketCommand+4], word 00000011b
3539 clevermous 697
; Подать команду
2288 clevermous 698
        call    SendPacketNoDatCommand
699
        popa
700
        ret
4700 mario79 701
;-----------------------------------------------------------------------------
2288 clevermous 702
;*************************************************
3539 clevermous 703
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
704
;* Входные параметры передаются через глобальные *
705
;* перменные:                                    *
706
;* ChannelNumber - номер канала;                 *
707
;* DiskNumber - номер диска на канале.           *
2288 clevermous 708
;*************************************************
709
EjectMedium:
710
        pusha
3539 clevermous 711
; Очистить буфер пакетной команды
2288 clevermous 712
        call    clear_packet_buffer
3539 clevermous 713
; Сформировать команду START/STOP UNIT
714
        ; Задать код команды
4700 mario79 715
        mov     [PacketCommand], word 0x1B
3539 clevermous 716
        ; Задать операцию извлечения носителя
2288 clevermous 717
        mov     [PacketCommand+4], word 00000010b
3539 clevermous 718
; Подать команду
2288 clevermous 719
        call    SendPacketNoDatCommand
720
        popa
721
        ret
4700 mario79 722
;-----------------------------------------------------------------------------
2288 clevermous 723
;*************************************************
3539 clevermous 724
;* Проверить событие нажатия кнопки извлечения   *
725
;*                     диска                     *
726
;* Входные параметры передаются через глобальные *
727
;* переменные:                                   *
728
;* ChannelNumber - номер канала;                 *
729
;* DiskNumber - номер диска на канале.           *
2288 clevermous 730
;*************************************************
3534 clevermous 731
proc check_ATAPI_device_event_has_work?
732
        mov     eax, [timer_ticks]
733
        sub     eax, [timer_ATAPI_check]
734
        cmp     eax, 100
735
        jb      .no
4700 mario79 736
 
3534 clevermous 737
        xor     eax, eax
738
        inc     eax
739
        ret
4700 mario79 740
;--------------------------------------
3534 clevermous 741
.no:
742
        xor     eax, eax
743
        ret
744
endp
4700 mario79 745
;-----------------------------------------------------------------------------
2288 clevermous 746
align 4
747
check_ATAPI_device_event:
748
        pusha
749
        mov     eax, [timer_ticks]
750
        sub     eax, [timer_ATAPI_check]
751
        cmp     eax, 100
752
        jb      .end_1
4700 mario79 753
 
4734 mario79 754
        pushfd
2288 clevermous 755
        mov     al, [DRIVE_DATA+1]
756
        and     al, 11b
757
        cmp     al, 10b
758
        jz      .ide3
4700 mario79 759
;--------------------------------------
2288 clevermous 760
.ide2_1:
761
        mov     al, [DRIVE_DATA+1]
762
        and     al, 1100b
763
        cmp     al, 1000b
764
        jz      .ide2
4700 mario79 765
;--------------------------------------
2288 clevermous 766
.ide1_1:
767
        mov     al, [DRIVE_DATA+1]
768
        and     al, 110000b
769
        cmp     al, 100000b
770
        jz      .ide1
4700 mario79 771
;--------------------------------------
2288 clevermous 772
.ide0_1:
773
        mov     al, [DRIVE_DATA+1]
774
        and     al, 11000000b
775
        cmp     al, 10000000b
776
        jz      .ide0
4700 mario79 777
;--------------------------------------
778
.ide7_1:
779
        mov     al, [DRIVE_DATA+6]
780
        and     al, 11b
781
        cmp     al, 10b
782
        jz      .ide7
783
;--------------------------------------
784
.ide6_1:
785
        mov     al, [DRIVE_DATA+6]
786
        and     al, 1100b
787
        cmp     al, 1000b
788
        jz      .ide6
789
;--------------------------------------
790
.ide5_1:
791
        mov     al, [DRIVE_DATA+6]
792
        and     al, 110000b
793
        cmp     al, 100000b
794
        jz      .ide5
795
;--------------------------------------
796
.ide4_1:
797
        mov     al, [DRIVE_DATA+6]
798
        and     al, 11000000b
799
        cmp     al, 10000000b
800
        jz      .ide4
801
;--------------------------------------
802
.ide11_1:
803
        mov     al, [DRIVE_DATA+11]
804
        and     al, 11b
805
        cmp     al, 10b
806
        jz      .ide11
807
;--------------------------------------
808
.ide10_1:
809
        mov     al, [DRIVE_DATA+11]
810
        and     al, 1100b
811
        cmp     al, 1000b
812
        jz      .ide10
813
;--------------------------------------
814
.ide9_1:
815
        mov     al, [DRIVE_DATA+11]
816
        and     al, 110000b
817
        cmp     al, 100000b
818
        jz      .ide9
819
;--------------------------------------
820
.ide8_1:
821
        mov     al, [DRIVE_DATA+11]
822
        and     al, 11000000b
823
        cmp     al, 10000000b
824
        jz      .ide8
825
;--------------------------------------
2288 clevermous 826
.end:
4734 mario79 827
        popfd
2288 clevermous 828
        mov     eax, [timer_ticks]
829
        mov     [timer_ATAPI_check], eax
4700 mario79 830
;--------------------------------------
2288 clevermous 831
.end_1:
832
        popa
833
        ret
4700 mario79 834
;-----------------------------------------------------------------------------
2288 clevermous 835
.ide3:
836
        cli
837
        cmp     [ATAPI_IDE3_lock], 1
838
        jne     .ide2_1
4700 mario79 839
 
2288 clevermous 840
        cmp     [cd_status], 0
841
        jne     .end
4700 mario79 842
 
3742 clevermous 843
        mov     ecx, ide_channel2_mutex
844
        call    mutex_lock
2288 clevermous 845
        call    reserve_ok2
846
        mov     [ChannelNumber], 2
847
        mov     [DiskNumber], 1
848
        mov     [cdpos], 4
849
        call    GetEvent_StatusNotification
850
        cmp     [CDDataBuf+4], byte 1
4700 mario79 851
        jne     @f
852
 
2288 clevermous 853
        call    .eject
4700 mario79 854
;--------------------------------------
855
@@:
2288 clevermous 856
        call    syscall_cdaudio.free
857
        jmp     .ide2_1
4700 mario79 858
;-----------------------------------------------------------------------------
2288 clevermous 859
.ide2:
860
        cli
861
        cmp     [ATAPI_IDE2_lock], 1
862
        jne     .ide1_1
4700 mario79 863
 
2288 clevermous 864
        cmp     [cd_status], 0
865
        jne     .end
4700 mario79 866
 
3742 clevermous 867
        mov     ecx, ide_channel2_mutex
868
        call    mutex_lock
2288 clevermous 869
        call    reserve_ok2
870
        mov     [ChannelNumber], 2
871
        mov     [DiskNumber], 0
872
        mov     [cdpos], 3
873
        call    GetEvent_StatusNotification
874
        cmp     [CDDataBuf+4], byte 1
4700 mario79 875
        jne     @f
876
 
2288 clevermous 877
        call    .eject
4700 mario79 878
;--------------------------------------
879
@@:
2288 clevermous 880
        call    syscall_cdaudio.free
881
        jmp     .ide1_1
4700 mario79 882
;-----------------------------------------------------------------------------
2288 clevermous 883
.ide1:
884
        cli
885
        cmp     [ATAPI_IDE1_lock], 1
886
        jne     .ide0_1
4700 mario79 887
 
2288 clevermous 888
        cmp     [cd_status], 0
889
        jne     .end
4700 mario79 890
 
3742 clevermous 891
        mov     ecx, ide_channel1_mutex
892
        call    mutex_lock
2288 clevermous 893
        call    reserve_ok2
894
        mov     [ChannelNumber], 1
895
        mov     [DiskNumber], 1
896
        mov     [cdpos], 2
897
        call    GetEvent_StatusNotification
898
        cmp     [CDDataBuf+4], byte 1
4700 mario79 899
        jne     @f
900
 
2288 clevermous 901
        call    .eject
4700 mario79 902
;--------------------------------------
903
@@:
2288 clevermous 904
        call    syscall_cdaudio.free
905
        jmp     .ide0_1
4700 mario79 906
;-----------------------------------------------------------------------------
2288 clevermous 907
.ide0:
908
        cli
909
        cmp     [ATAPI_IDE0_lock], 1
4734 mario79 910
        jne     .ide7_1
4700 mario79 911
 
2288 clevermous 912
        cmp     [cd_status], 0
913
        jne     .end
4700 mario79 914
 
3742 clevermous 915
        mov     ecx, ide_channel1_mutex
916
        call    mutex_lock
2288 clevermous 917
        call    reserve_ok2
918
        mov     [ChannelNumber], 1
919
        mov     [DiskNumber], 0
920
        mov     [cdpos], 1
921
        call    GetEvent_StatusNotification
922
        cmp     [CDDataBuf+4], byte 1
4700 mario79 923
        jne     @f
924
 
925
        call    .eject
926
;--------------------------------------
927
@@:
2288 clevermous 928
        call    syscall_cdaudio.free
4734 mario79 929
        jmp     .ide7_1
4700 mario79 930
;-----------------------------------------------------------------------------
931
.ide7:
932
        cli
933
        cmp     [ATAPI_IDE7_lock], 1
4734 mario79 934
        jne     .ide6_1
4700 mario79 935
 
936
        cmp     [cd_status], 0
937
        jne     .end
938
 
939
        mov     ecx, ide_channel4_mutex
940
        call    mutex_lock
941
        call    reserve_ok2
942
        mov     [ChannelNumber], 2
943
        mov     [DiskNumber], 1
944
        mov     [cdpos], 8
945
        call    GetEvent_StatusNotification
946
        cmp     [CDDataBuf+4], byte 1
947
        jne     @f
948
 
2288 clevermous 949
        call    .eject
4700 mario79 950
;--------------------------------------
951
@@:
2288 clevermous 952
        call    syscall_cdaudio.free
4734 mario79 953
        jmp     .ide6_1
4700 mario79 954
;-----------------------------------------------------------------------------
955
.ide6:
956
        cli
957
        cmp     [ATAPI_IDE6_lock], 1
4734 mario79 958
        jne     .ide5_1
4700 mario79 959
 
960
        cmp     [cd_status], 0
961
        jne     .end
962
 
963
        mov     ecx, ide_channel4_mutex
964
        call    mutex_lock
965
        call    reserve_ok2
966
        mov     [ChannelNumber], 2
967
        mov     [DiskNumber], 0
968
        mov     [cdpos], 7
969
        call    GetEvent_StatusNotification
970
        cmp     [CDDataBuf+4], byte 1
971
        jne     @f
972
 
973
        call    .eject
974
;--------------------------------------
975
@@:
976
        call    syscall_cdaudio.free
4734 mario79 977
        jmp     .ide5_1
4700 mario79 978
;-----------------------------------------------------------------------------
979
.ide5:
980
        cli
981
        cmp     [ATAPI_IDE5_lock], 1
4734 mario79 982
        jne     .ide4_1
4700 mario79 983
 
984
        cmp     [cd_status], 0
985
        jne     .end
986
 
987
        mov     ecx, ide_channel3_mutex
988
        call    mutex_lock
989
        call    reserve_ok2
990
        mov     [ChannelNumber], 1
991
        mov     [DiskNumber], 1
992
        mov     [cdpos], 6
993
        call    GetEvent_StatusNotification
994
        cmp     [CDDataBuf+4], byte 1
995
        jne     @f
996
 
997
        call    .eject
998
;--------------------------------------
999
@@:
1000
        call    syscall_cdaudio.free
4734 mario79 1001
        jmp     .ide4_1
4700 mario79 1002
;-----------------------------------------------------------------------------
1003
.ide4:
1004
        cli
1005
        cmp     [ATAPI_IDE4_lock], 1
4734 mario79 1006
        jne     .ide11_1
4700 mario79 1007
 
1008
        cmp     [cd_status], 0
1009
        jne     .end
1010
 
1011
        mov     ecx, ide_channel3_mutex
1012
        call    mutex_lock
1013
        call    reserve_ok2
1014
        mov     [ChannelNumber], 1
1015
        mov     [DiskNumber], 0
1016
        mov     [cdpos], 5
1017
        call    GetEvent_StatusNotification
1018
        cmp     [CDDataBuf+4], byte 1
1019
        jne     @f
1020
 
1021
        call    .eject
1022
;--------------------------------------
1023
@@:
1024
        call    syscall_cdaudio.free
4734 mario79 1025
        jmp     .ide11_1
4700 mario79 1026
;-----------------------------------------------------------------------------
1027
.ide11:
1028
        cli
1029
        cmp     [ATAPI_IDE11_lock], 1
4734 mario79 1030
        jne     .ide10_1
2288 clevermous 1031
 
4700 mario79 1032
        cmp     [cd_status], 0
1033
        jne     .end
1034
 
1035
        mov     ecx, ide_channel6_mutex
1036
        call    mutex_lock
1037
        call    reserve_ok2
1038
        mov     [ChannelNumber], 2
1039
        mov     [DiskNumber], 1
1040
        mov     [cdpos], 12
1041
        call    GetEvent_StatusNotification
1042
        cmp     [CDDataBuf+4], byte 1
1043
        jne     @f
1044
 
1045
        call    .eject
1046
;--------------------------------------
1047
@@:
1048
        call    syscall_cdaudio.free
4734 mario79 1049
        jmp     .ide10_1
4700 mario79 1050
;-----------------------------------------------------------------------------
1051
.ide10:
1052
        cli
1053
        cmp     [ATAPI_IDE10_lock], 1
4734 mario79 1054
        jne     .ide9_1
4700 mario79 1055
 
1056
        cmp     [cd_status], 0
1057
        jne     .end
1058
 
1059
        mov     ecx, ide_channel6_mutex
1060
        call    mutex_lock
1061
        call    reserve_ok2
1062
        mov     [ChannelNumber], 2
1063
        mov     [DiskNumber], 0
1064
        mov     [cdpos], 11
1065
        call    GetEvent_StatusNotification
1066
        cmp     [CDDataBuf+4], byte 1
1067
        jne     @f
1068
 
1069
        call    .eject
1070
;--------------------------------------
1071
@@:
1072
        call    syscall_cdaudio.free
4734 mario79 1073
        jmp     .ide9_1
4700 mario79 1074
;-----------------------------------------------------------------------------
1075
.ide9:
1076
        cli
1077
        cmp     [ATAPI_IDE9_lock], 1
4734 mario79 1078
        jne     .ide8_1
4700 mario79 1079
 
1080
        cmp     [cd_status], 0
1081
        jne     .end
1082
 
1083
        mov     ecx, ide_channel5_mutex
1084
        call    mutex_lock
1085
        call    reserve_ok2
1086
        mov     [ChannelNumber], 1
1087
        mov     [DiskNumber], 1
1088
        mov     [cdpos], 10
1089
        call    GetEvent_StatusNotification
1090
        cmp     [CDDataBuf+4], byte 1
1091
        jne     @f
1092
 
1093
        call    .eject
1094
;--------------------------------------
1095
@@:
1096
        call    syscall_cdaudio.free
4734 mario79 1097
        jmp     .ide8_1
4700 mario79 1098
;-----------------------------------------------------------------------------
1099
.ide8:
1100
        cli
1101
        cmp     [ATAPI_IDE8_lock], 1
1102
        jne     .end
1103
 
1104
        cmp     [cd_status], 0
1105
        jne     .end
1106
 
1107
        mov     ecx, ide_channel5_mutex
1108
        call    mutex_lock
1109
        call    reserve_ok2
1110
        mov     [ChannelNumber], 1
1111
        mov     [DiskNumber], 0
1112
        mov     [cdpos], 9
1113
        call    GetEvent_StatusNotification
1114
        cmp     [CDDataBuf+4], byte 1
1115
        jne     @f
1116
 
1117
        call    .eject
1118
;--------------------------------------
1119
@@:
1120
        call    syscall_cdaudio.free
1121
        jmp     .end
1122
;-----------------------------------------------------------------------------
2288 clevermous 1123
.eject:
1124
        call    clear_CD_cache
1125
        call    allow_medium_removal
1126
        mov     [ignore_CD_eject_wait], 1
1127
        call    EjectMedium
1128
        mov     [ignore_CD_eject_wait], 0
1129
        ret
4700 mario79 1130
;-----------------------------------------------------------------------------
2288 clevermous 1131
iglobal
1132
timer_ATAPI_check dd 0
1133
ATAPI_IDE0_lock db 0
1134
ATAPI_IDE1_lock db 0
1135
ATAPI_IDE2_lock db 0
1136
ATAPI_IDE3_lock db 0
4700 mario79 1137
ATAPI_IDE4_lock db 0
1138
ATAPI_IDE5_lock db 0
1139
ATAPI_IDE6_lock db 0
1140
ATAPI_IDE7_lock db 0
1141
ATAPI_IDE8_lock db 0
1142
ATAPI_IDE9_lock db 0
1143
ATAPI_IDE10_lock db 0
1144
ATAPI_IDE11_lock db 0
2288 clevermous 1145
ignore_CD_eject_wait db 0
1146
endg
4700 mario79 1147
;-----------------------------------------------------------------------------
2288 clevermous 1148
;*************************************************
3539 clevermous 1149
;* Получить сообщение о событии или состоянии    *
1150
;*                  устройства                   *
1151
;* Входные параметры передаются через глобальные *
1152
;* переменные:                                   *
1153
;* ChannelNumber - номер канала;                 *
1154
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1155
;*************************************************
1156
GetEvent_StatusNotification:
1157
        pusha
1158
        mov     [CDDataBuf_pointer], CDDataBuf
3539 clevermous 1159
; Очистить буфер пакетной команды
2288 clevermous 1160
        call    clear_packet_buffer
3539 clevermous 1161
; Задать код команды
2288 clevermous 1162
        mov     [PacketCommand], byte 4Ah
1163
        mov     [PacketCommand+1], byte 00000001b
3539 clevermous 1164
; Задать запрос класса сообщений
2288 clevermous 1165
        mov     [PacketCommand+4], byte 00010000b
3539 clevermous 1166
; Размер выделенной области
2288 clevermous 1167
        mov     [PacketCommand+7], byte 8h
1168
        mov     [PacketCommand+8], byte 0h
3539 clevermous 1169
; Подать команду
2288 clevermous 1170
        call    SendPacketDatCommand
1171
        popa
1172
        ret
4700 mario79 1173
;-----------------------------------------------------------------------------
2288 clevermous 1174
;*************************************************
3539 clevermous 1175
; прочитать информацию из TOC
1176
;* Входные параметры передаются через глобальные *
1177
;* переменные:                                   *
1178
;* ChannelNumber - номер канала;                 *
1179
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1180
;*************************************************
1181
Read_TOC:
1182
        pusha
1183
        mov     [CDDataBuf_pointer], CDDataBuf
3539 clevermous 1184
; Очистить буфер пакетной команды
2288 clevermous 1185
        call    clear_packet_buffer
3539 clevermous 1186
; Сформировать пакетную команду для считывания
1187
; сектора данных
2288 clevermous 1188
        mov     [PacketCommand], byte 0x43
3539 clevermous 1189
        ; Задать формат
2288 clevermous 1190
        mov     [PacketCommand+2], byte 1
3539 clevermous 1191
; Размер выделенной области
2288 clevermous 1192
        mov     [PacketCommand+7], byte 0xFF
1193
        mov     [PacketCommand+8], byte 0h
3539 clevermous 1194
; Подать команду
2288 clevermous 1195
        call    SendPacketDatCommand
1196
        popa
1197
        ret
4700 mario79 1198
;-----------------------------------------------------------------------------
2288 clevermous 1199
;*************************************************
3539 clevermous 1200
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1201
;* Входные параметры передаются через глобальные *
1202
;* переменные:                                   *
1203
;* ChannelNumber - номер канала;                 *
1204
;* DiskNumber - номер диска на канале.           *
2288 clevermous 1205
;*************************************************
1206
;ReadCapacity:
1207
;       pusha
3539 clevermous 1208
;; Очистить буфер пакетной команды
2288 clevermous 1209
;       call  clear_packet_buffer
3539 clevermous 1210
;; Задать размер буфера в байтах
2288 clevermous 1211
;       mov     [CDBlockSize],8
3539 clevermous 1212
;; Сформировать команду READ CAPACITY
2288 clevermous 1213
;       mov     [PacketCommand],word 25h
3539 clevermous 1214
;; Подать команду
2288 clevermous 1215
;       call    SendPacketDatCommand
1216
;       popa
1217
;       ret
4700 mario79 1218
;-----------------------------------------------------------------------------
2288 clevermous 1219
clear_packet_buffer:
3539 clevermous 1220
; Очистить буфер пакетной команды
2288 clevermous 1221
        and     [PacketCommand], dword 0
1222
        and     [PacketCommand+4], dword 0
1223
        and     [PacketCommand+8], dword 0
1224
        ret
4700 mario79 1225
;-----------------------------------------------------------------------------