Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 593 $
9
 
10
 
87 mario79 11
;**********************************************************
12
;  Непосредственная работа с устройством СD (ATAPI)
13
;**********************************************************
14
; Автор исходного текста  Кулаков Владимир Геннадьевич.
15
; Адаптация и доработка Mario79
16
 
17
;        Процедура для полного считывания всех
18
;           данных из сектора компакт-диска
19
; Автор текста программы Кулаков Владимир Геннадьевич.
20
 
21
; Максимальное количество повторений операции чтения
543 spraid 22
MaxRetr equ 10
87 mario79 23
; Предельное время ожидания готовности к приему команды
24
; (в тиках)
25
BSYWaitTime equ 1000  ;2
538 spraid 26
NoTickWaitTime equ 0xfffff
87 mario79 27
;*************************************************
28
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
29
;* Считываются данные пользователя, информация   *
30
;* субканала и контрольная информация            *
31
;* Входные параметры передаются через глобальные *
32
;* перменные:                                    *
33
;* ChannelNumber - номер канала;                 *
34
;* DiskNumber - номер диска на канале;           *
35
;* CDSectorAddress - адрес считываемого сектора. *
36
;* Данные считывается в массив CDDataBuf.        *
37
;*************************************************
38
ReadCD:
585 mario79 39
	pusha
87 mario79 40
; Задать размер сектора
585 mario79 41
	mov	[CDBlockSize],2048 ;2352
87 mario79 42
; Очистить буфер пакетной команды
585 mario79 43
	call  clear_packet_buffer
87 mario79 44
; Сформировать пакетную команду для считывания
45
; сектора данных
585 mario79 46
	; Задать код команды Read CD
47
	mov	[PacketCommand],byte 0x28  ;0xBE
48
	; Задать адрес сектора
49
	mov	AX,word [CDSectorAddress+2]
50
	xchg	AL,AH
51
	mov	word [PacketCommand+2],AX
52
	mov	AX,word [CDSectorAddress]
53
	xchg	AL,AH
54
	mov	word [PacketCommand+4],AX
87 mario79 55
;        mov   eax,[CDSectorAddress]
56
;        mov   [PacketCommand+2],eax
585 mario79 57
	; Задать количество считываемых секторов
58
	mov	[PacketCommand+8],byte 1
59
	; Задать считывание данных в полном объеме
87 mario79 60
;        mov     [PacketCommand+9],byte 0xF8
61
; Подать команду
585 mario79 62
	call	SendPacketDatCommand
87 mario79 63
;        call test_mario79
585 mario79 64
	popa
65
	ret
87 mario79 66
 
67
;********************************************
68
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
69
;* Многократное повторение чтения при сбоях *
70
;********************************************
71
ReadCDWRetr:
585 mario79 72
;-----------------------------------------------------------
73
; input  : eax = block to read
74
;          ebx = destination
75
;-----------------------------------------------------------
76
    pushad
77
    mov   eax,[CDSectorAddress]
78
    mov   ebx,[CDDataBuf_pointer]
79
    call  cd_calculate_cache
80
    add   esi,8
81
    mov   edi,1
82
.hdreadcache:
83
;    push  esi
84
;    mov   esi,[esi]
85
;    call  test_mario79
86
;    mov   esi,eax
87
;    call  test_mario79
88
;    pop   esi
89
 
90
;    cmp   dword [esi+4],0       ; empty
91
;    je    .nohdcache
92
    cmp   [esi],eax		; correct sector
93
    je	  .yeshdcache
94
.nohdcache:
95
    add   esi,8
96
    inc   edi
97
    dec   ecx
98
    jnz   .hdreadcache
99
    call  find_empty_slot_CD_cache	 ; ret in edi
100
 
101
    push  edi
102
    push  eax
103
    call  cd_calculate_cache_2
104
    shl   edi,11
105
    add   edi,eax
106
    mov   [CDDataBuf_pointer],edi
107
    pop   eax
108
    pop   edi
109
 
110
    call  ReadCDWRetr_1
111
    mov   [CDDataBuf_pointer],ebx
112
    call  cd_calculate_cache_1
113
    lea   esi,[edi*8+esi]
114
;    push  esi
115
;    call  test_mario79
116
;    mov   esi,eax
117
;    call  test_mario79
118
;    pop   esi
119
    mov   [esi],eax		; sector number
120
;    mov   dword [esi+4],1       ; hd read - mark as same as in hd
121
.yeshdcache:
122
    mov   esi,edi
123
    shl   esi,11    ;9
124
    push  eax
125
    call  cd_calculate_cache_2
126
    add   esi,eax
127
    pop   eax
128
    mov   edi,ebx   ;[CDDataBuf_pointer]
129
    mov   ecx,512   ;/4
130
    cld
131
    rep   movsd 		; move data
132
    popad
133
    ret
134
 
135
ReadCDWRetr_1:
136
	pushad
137
 
87 mario79 138
; Цикл, пока команда не выполнена успешно или не
139
; исчерпано количество попыток
585 mario79 140
	mov	ECX,MaxRetr
87 mario79 141
@@NextRetr:
142
; Подать команду
585 mario79 143
	call	ReadCD
144
	cmp	[DevErrorCode],0
145
	je	@@End_4
146
 
147
	or		ecx,ecx 		;{SPraid.simba} (for cd load)
148
	jz		@@End_4
149
	dec	ecx
150
 
151
	cmp    [timer_ticks_enable],0
152
	jne	@f
153
	mov	eax,NoTickWaitTime
538 spraid 154
.wait:
585 mario79 155
	dec	eax
156
	cmp	eax,0
157
	je	@@NextRetr
158
	jmp	.wait
538 spraid 159
@@:
87 mario79 160
; Задержка на 2,5 секунды
585 mario79 161
	mov	EAX,[timer_ticks]
162
	add	EAX,250 ;50
87 mario79 163
@@Wait:
585 mario79 164
	call	change_task
165
	cmp	EAX,[timer_ticks]
166
	ja	@@Wait
167
	loop	@@NextRetr
87 mario79 168
@@End_4:
585 mario79 169
	popad
170
	ret
87 mario79 171
 
172
 
173
;   Универсальные процедуры, обеспечивающие выполнение
174
;             пакетных команд в режиме PIO
175
;
176
; Автор текста программы Кулаков Владимир Геннадьевич.
177
 
178
; Максимально допустимое время ожидания реакции
179
; устройства на пакетную команду (в тиках)
180
MaxCDWaitTime equ 1000 ;200 ;10 секунд
181
 
182
; Область памяти для формирования пакетной команды
585 mario79 183
PacketCommand:	 rb 12	;DB 12 DUP (?)
87 mario79 184
; Область памяти для приема данных от дисковода
185
;CDDataBuf       DB 4096 DUP (0)
186
; Размер принимаемого блока данных в байтах
585 mario79 187
CDBlockSize	DW ?
87 mario79 188
; Адрес считываемого сектора данных
189
CDSectorAddress: DD ?
190
; Время начала очередной операции с диском
191
TickCounter_1 DD 0
192
; Время начала ожидания готовности устройства
193
WURStartTime DD 0
194
; указатель буфера для считывания
195
CDDataBuf_pointer dd 0
196
 
197
;****************************************************
198
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
199
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
200
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
201
;* Входные параметры передаются через глобальные    *
202
;* перменные:                                       *
203
;* ChannelNumber - номер канала;                    *
204
;* DiskNumber - номер диска на канале;              *
205
;* PacketCommand - 12-байтный командный пакет;      *
206
;* CDBlockSize - размер принимаемого блока данных.  *
207
;****************************************************
208
SendPacketDatCommand:
585 mario79 209
	pushad
87 mario79 210
; Задать режим CHS
585 mario79 211
	mov	[ATAAddressMode],0
87 mario79 212
; Послать ATA-команду передачи пакетной команды
585 mario79 213
	mov	[ATAFeatures],0
214
	mov	[ATASectorCount],0
215
	mov	[ATASectorNumber],0
216
	; Загрузить размер передаваемого блока
217
	mov	AX,[CDBlockSize]
218
	mov	[ATACylinder],AX
219
	mov	[ATAHead],0
220
	mov	[ATACommand],0A0h
221
	call	SendCommandToHDD_1
222
	cmp	[DevErrorCode],0 ;проверить код ошибки
223
	jne	@@End_8    ;закончить, сохранив код ошибки
87 mario79 224
 
225
; Ожидание готовности дисковода к приему
226
; пакетной команды
585 mario79 227
	mov	DX,[ATABasePortAddr]
228
	add	DX,7	 ;порт 1х7h
229
	mov	ecx,NoTickWaitTime
87 mario79 230
@@WaitDevice0:
585 mario79 231
	cmp	[timer_ticks_enable],0
232
	jne	@f
233
	dec	ecx
234
	cmp	ecx,0
235
	je	@@Err1_1
236
	jmp	.test
538 spraid 237
@@:
585 mario79 238
	call	change_task
239
	; Проверить время выполнения команды
240
	mov	EAX,[timer_ticks]
241
	sub	EAX,[TickCounter_1]
242
	cmp	EAX,BSYWaitTime
243
	ja	@@Err1_1   ;ошибка тайм-аута
244
	; Проверить готовность
538 spraid 245
.test:
585 mario79 246
	in	AL,DX
247
	test	AL,80h	 ;состояние сигнала BSY
248
	jnz	@@WaitDevice0
249
	test	AL,08h	 ;состояние сигнала DRQ
250
	jz	@@WaitDevice0
251
	test	AL,1	 ;состояние сигнала ERR
252
	jnz	@@Err6
87 mario79 253
; Послать пакетную команду
585 mario79 254
	cli
255
	mov	DX,[ATABasePortAddr]
256
	mov	AX,[PacketCommand]
257
	out	DX,AX
258
	mov	AX,[PacketCommand+2]
259
	out	DX,AX
260
	mov	AX,[PacketCommand+4]
261
	out	DX,AX
262
	mov	AX,[PacketCommand+6]
263
	out	DX,AX
264
	mov	AX,[PacketCommand+8]
265
	out	DX,AX
266
	mov	AX,[PacketCommand+10]
267
	out	DX,AX
268
	sti
87 mario79 269
; Ожидание готовности данных
585 mario79 270
	mov	DX,[ATABasePortAddr]
271
	add	DX,7   ;порт 1х7h
272
	mov	ecx,NoTickWaitTime
87 mario79 273
@@WaitDevice1:
585 mario79 274
	cmp	[timer_ticks_enable],0
275
	jne	@f
276
	dec	ecx
277
	cmp	ecx,0
278
	je	@@Err1_1
279
	jmp	.test_1
538 spraid 280
@@:
585 mario79 281
	call	change_task
282
	; Проверить время выполнения команды
283
	mov	EAX,[timer_ticks]
284
	sub	EAX,[TickCounter_1]
285
	cmp	EAX,MaxCDWaitTime
286
	ja	@@Err1_1   ;ошибка тайм-аута
287
	; Проверить готовность
538 spraid 288
.test_1:
585 mario79 289
	in	AL,DX
290
	test	AL,80h	 ;состояние сигнала BSY
291
	jnz	@@WaitDevice1
292
	test	AL,08h	 ;состояние сигнала DRQ
293
	jz	@@WaitDevice1
294
	test	AL,1	 ;состояние сигнала ERR
295
	jnz	@@Err6_temp
87 mario79 296
; Принять блок данных от контроллера
585 mario79 297
	mov	EDI,[CDDataBuf_pointer] ;0x7000  ;CDDataBuf
298
	; Загрузить адрес регистра данных контроллера
299
	mov	DX,[ATABasePortAddr] ;порт 1x0h
300
	; Загрузить в счетчик размер блока в байтах
301
	xor	ecx,ecx
302
	mov	CX,[CDBlockSize]
303
	; Вычислить размер блока в 16-разрядных словах
304
	shr	CX,1 ;разделить размер блока на 2
305
	; Принять блок данных
306
	cli
307
	cld
308
	rep	insw
309
	sti
310
	; Успешное завершение приема данных
311
	jmp @@End_8
87 mario79 312
 
313
; Записать код ошибки
314
@@Err1_1:
585 mario79 315
	mov	[DevErrorCode],1
316
	jmp @@End_8
87 mario79 317
@@Err6_temp:
585 mario79 318
	mov	[DevErrorCode],7
319
	jmp @@End_8
87 mario79 320
@@Err6:
585 mario79 321
	mov	[DevErrorCode],6
87 mario79 322
 
323
@@End_8:
585 mario79 324
	popad
325
	ret
87 mario79 326
 
327
 
328
 
329
;***********************************************
330
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
331
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
332
;* Входные параметры передаются через          *
333
;* глобальные перменные:                       *
334
;* ChannelNumber - номер канала;               *
335
;* DiskNumber - номер диска на канале;         *
336
;* PacketCommand - 12-байтный командный пакет. *
337
;***********************************************
338
SendPacketNoDatCommand:
585 mario79 339
	pushad
87 mario79 340
; Задать режим CHS
585 mario79 341
	mov	[ATAAddressMode],0
87 mario79 342
; Послать ATA-команду передачи пакетной команды
585 mario79 343
	mov	[ATAFeatures],0
344
	mov	[ATASectorCount],0
345
	mov	[ATASectorNumber],0
346
	mov	[ATACylinder],0
347
	mov	[ATAHead],0
348
	mov	[ATACommand],0A0h
349
	call	SendCommandToHDD_1
350
	cmp	[DevErrorCode],0 ;проверить код ошибки
351
	jne	@@End_9  ;закончить, сохранив код ошибки
87 mario79 352
; Ожидание готовности дисковода к приему
353
; пакетной команды
585 mario79 354
	mov	DX,[ATABasePortAddr]
355
	add	DX,7   ;порт 1х7h
87 mario79 356
@@WaitDevice0_1:
585 mario79 357
	call	change_task
358
	; Проверить время ожидания
359
	mov	EAX,[timer_ticks]
360
	sub	EAX,[TickCounter_1]
361
	cmp	EAX,BSYWaitTime
362
	ja	@@Err1_3   ;ошибка тайм-аута
363
	; Проверить готовность
364
	in	AL,DX
365
	test	AL,80h	 ;состояние сигнала BSY
366
	jnz	@@WaitDevice0_1
367
	test	AL,1	 ;состояние сигнала ERR
368
	jnz	@@Err6_1
369
	test	AL,08h	 ;состояние сигнала DRQ
370
	jz	@@WaitDevice0_1
87 mario79 371
; Послать пакетную команду
372
;        cli
585 mario79 373
	mov	DX,[ATABasePortAddr]
374
	mov	AX,word [PacketCommand]
375
	out	DX,AX
376
	mov	AX,word [PacketCommand+2]
377
	out	DX,AX
378
	mov	AX,word [PacketCommand+4]
379
	out	DX,AX
380
	mov	AX,word [PacketCommand+6]
381
	out	DX,AX
382
	mov	AX,word [PacketCommand+8]
383
	out	DX,AX
384
	mov	AX,word [PacketCommand+10]
385
	out	DX,AX
87 mario79 386
;        sti
387
; Ожидание подтверждения приема команды
585 mario79 388
	mov	DX,[ATABasePortAddr]
389
	add	DX,7   ;порт 1х7h
87 mario79 390
@@WaitDevice1_1:
585 mario79 391
	call	change_task
392
	; Проверить время выполнения команды
393
	mov	EAX,[timer_ticks]
394
	sub	EAX,[TickCounter_1]
395
	cmp	EAX,MaxCDWaitTime
396
	ja	@@Err1_3   ;ошибка тайм-аута
397
	; Ожидать освобождения устройства
398
	in	AL,DX
399
	test	AL,80h	 ;состояние сигнала BSY
400
	jnz	@@WaitDevice1_1
401
	test	AL,1	 ;состояние сигнала ERR
402
	jnz	@@Err6_1
403
	test	AL,40h	 ;состояние сигнала DRDY
404
	jz	@@WaitDevice1_1
405
	jmp @@End_9
87 mario79 406
 
407
; Записать код ошибки
408
@@Err1_3:
585 mario79 409
	mov	[DevErrorCode],1
410
	jmp @@End_9
87 mario79 411
@@Err6_1:
585 mario79 412
	mov	[DevErrorCode],6
87 mario79 413
@@End_9:
585 mario79 414
	popad
415
	ret
87 mario79 416
 
417
;****************************************************
418
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
419
;* Входные параметры передаются через глобальные    *
420
;* переменные:                                      *
421
;* ChannelNumber - номер канала (1 или 2);          *
422
;* DiskNumber - номер диска (0 или 1);              *
423
;* ATAFeatures - "особенности";                     *
424
;* ATASectorCount - количество секторов;            *
425
;* ATASectorNumber - номер начального сектора;      *
426
;* ATACylinder - номер начального цилиндра;         *
427
;* ATAHead - номер начальной головки;               *
428
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
429
;* ATACommand - код команды.                        *
430
;* После успешного выполнения функции:              *
431
;* в ATABasePortAddr - базовый адрес HDD;           *
432
;* в DevErrorCode - ноль.                           *
433
;* При возникновении ошибки в DevErrorCode будет    *
434
;* возвращен код ошибки.                            *
435
;****************************************************
436
SendCommandToHDD_1:
585 mario79 437
	pushad
87 mario79 438
; Проверить значение кода режима
585 mario79 439
	cmp	[ATAAddressMode],1
440
	ja	@@Err2_4
87 mario79 441
; Проверить корректность номера канала
585 mario79 442
	mov	BX,[ChannelNumber]
443
	cmp	BX,1
444
	jb	@@Err3_4
445
	cmp	BX,2
446
	ja	@@Err3_4
87 mario79 447
; Установить базовый адрес
585 mario79 448
	dec	BX
449
	shl	BX,1
450
	movzx	ebx,bx
451
	mov	AX,[ebx+StandardATABases]
452
	mov	[ATABasePortAddr],AX
87 mario79 453
; Ожидание готовности HDD к приему команды
585 mario79 454
	; Выбрать нужный диск
455
	mov	DX,[ATABasePortAddr]
456
	add	DX,6	;адрес регистра головок
457
	mov	AL,[DiskNumber]
458
	cmp	AL,1	;проверить номера диска
459
	ja	@@Err4_4
460
	shl	AL,4
461
	or	AL,10100000b
462
	out	DX,AL
463
	; Ожидать, пока диск не будет готов
464
	inc	DX
465
	mov	eax,[timer_ticks]
466
	mov	[TickCounter_1],eax
467
	mov	ecx,NoTickWaitTime
87 mario79 468
@@WaitHDReady_2:
585 mario79 469
	cmp    [timer_ticks_enable],0
470
	jne    @f
471
	dec    ecx
472
	cmp    ecx,0
473
	je     @@Err1_4
474
	jmp    .test
538 spraid 475
@@:
585 mario79 476
	call	change_task
477
	; Проверить время ожидания
478
	mov	eax,[timer_ticks]
479
	sub	eax,[TickCounter_1]
480
	cmp	eax,BSYWaitTime ;300    ;ожидать 3 сек.
481
	ja	@@Err1_4   ;ошибка тайм-аута
482
	; Прочитать регистр состояния
538 spraid 483
.test:
585 mario79 484
	in	AL,DX
485
	; Проверить состояние сигнала BSY
486
	test	AL,80h
487
	jnz	@@WaitHDReady_2
488
	; Проверить состояние сигнала DRQ
489
	test	AL,08h
490
	jnz	@@WaitHDReady_2
538 spraid 491
 
87 mario79 492
; Загрузить команду в регистры контроллера
585 mario79 493
	cli
494
	mov	DX,[ATABasePortAddr]
495
	inc	DX	;регистр "особенностей"
496
	mov	AL,[ATAFeatures]
497
	out	DX,AL
498
	inc	DX	;счетчик секторов
499
	mov	AL,[ATASectorCount]
500
	out	DX,AL
501
	inc	DX	;регистр номера сектора
502
	mov	AL,[ATASectorNumber]
503
	out	DX,AL
504
	inc	DX	;номер цилиндра (младший байт)
505
	mov	AX,[ATACylinder]
506
	out	DX,AL
507
	inc	DX	;номер цилиндра (старший байт)
508
	mov	AL,AH
509
	out	DX,AL
510
	inc	DX	;номер головки/номер диска
511
	mov	AL,[DiskNumber]
512
	shl	AL,4
513
	cmp	[ATAHead],0Fh ;проверить номер головки
514
	ja	@@Err5_4
515
	or	AL,[ATAHead]
516
	or	AL,10100000b
517
	mov	AH,[ATAAddressMode]
518
	shl	AH,6
519
	or	AL,AH
520
	out	DX,AL
87 mario79 521
; Послать команду
585 mario79 522
	mov	AL,[ATACommand]
523
	inc	DX	;регистр команд
524
	out	DX,AL
525
	sti
87 mario79 526
; Сбросить признак ошибки
585 mario79 527
	mov	[DevErrorCode],0
528
	jmp @@End_10
87 mario79 529
; Записать код ошибки
530
@@Err1_4:
585 mario79 531
	mov	[DevErrorCode],1
532
	jmp @@End_10
87 mario79 533
@@Err2_4:
585 mario79 534
	mov	[DevErrorCode],2
535
	jmp @@End_10
87 mario79 536
@@Err3_4:
585 mario79 537
	mov	[DevErrorCode],3
538
	jmp @@End_10
87 mario79 539
@@Err4_4:
585 mario79 540
	mov	[DevErrorCode],4
541
	jmp @@End_10
87 mario79 542
@@Err5_4:
585 mario79 543
	mov	[DevErrorCode],5
87 mario79 544
; Завершение работы программы
545
@@End_10:
538 spraid 546
;        sti
585 mario79 547
	popad
548
	ret
549
 
87 mario79 550
;*************************************************
551
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
552
;* Входные параметры передаются через глобальные *
553
;* перменные:                                    *
554
;* ChannelNumber - номер канала;                 *
555
;* DiskNumber - номер диска на канале.           *
556
;*************************************************
557
WaitUnitReady:
585 mario79 558
	pusha
87 mario79 559
; Запомнить время начала операции
585 mario79 560
	mov	EAX,[timer_ticks]
561
	mov	[WURStartTime],EAX
87 mario79 562
; Очистить буфер пакетной команды
585 mario79 563
	call  clear_packet_buffer
87 mario79 564
; Сформировать команду TEST UNIT READY
585 mario79 565
	mov	[PacketCommand],word 00h
87 mario79 566
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
567
@@SendCommand:
585 mario79 568
	; Подать команду проверки готовности
569
	call	SendPacketNoDatCommand
570
	call	change_task
571
	; Проверить код ошибки
572
	cmp	[DevErrorCode],0
573
	je	@@End_11
574
	; Проверить время ожидания готовности
575
	mov	EAX,[timer_ticks]
576
	sub	EAX,[WURStartTime]
577
	cmp	EAX,MaxCDWaitTime
578
	jb	@@SendCommand
579
	; Ошибка тайм-аута
580
	mov	[DevErrorCode],1
87 mario79 581
@@End_11:
585 mario79 582
	popa
583
	ret
87 mario79 584
 
585
;*************************************************
585 mario79 586
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
587
;* Входные параметры передаются через глобальные *
588
;* перменные:                                    *
589
;* ChannelNumber - номер канала;                 *
590
;* DiskNumber - номер диска на канале.           *
591
;*************************************************
592
prevent_medium_removal:
593
	pusha
594
; Очистить буфер пакетной команды
595
	call  clear_packet_buffer
596
; Задать код команды
597
	mov  [PacketCommand],byte 0x1E
598
; Задать код запрета
599
    mov  [PacketCommand+4],byte 11b
600
; Подать команду
601
	call SendPacketNoDatCommand
602
	popa
603
	ret
604
 
605
;*************************************************
606
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
607
;* Входные параметры передаются через глобальные *
608
;* перменные:                                    *
609
;* ChannelNumber - номер канала;                 *
610
;* DiskNumber - номер диска на канале.           *
611
;*************************************************
612
allow_medium_removal:
613
	pusha
614
; Очистить буфер пакетной команды
615
	call  clear_packet_buffer
616
; Задать код команды
617
	mov  [PacketCommand],byte 0x1E
618
; Задать код запрета
619
    mov  [PacketCommand+4],byte 00b
620
; Подать команду
621
	call SendPacketNoDatCommand
622
	popa
623
	ret
624
 
625
;*************************************************
87 mario79 626
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
627
;* Входные параметры передаются через глобальные *
628
;* перменные:                                    *
629
;* ChannelNumber - номер канала;                 *
630
;* DiskNumber - номер диска на канале.           *
631
;*************************************************
632
LoadMedium:
585 mario79 633
	pusha
87 mario79 634
; Очистить буфер пакетной команды
585 mario79 635
	call  clear_packet_buffer
87 mario79 636
; Сформировать команду START/STOP UNIT
585 mario79 637
	; Задать код команды
638
	mov	[PacketCommand],word 1Bh
639
	; Задать операцию загрузки носителя
640
	mov	[PacketCommand+4],word 00000011b
87 mario79 641
; Подать команду
585 mario79 642
	call	SendPacketNoDatCommand
643
	popa
644
	ret
87 mario79 645
 
646
;*************************************************
647
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
648
;* Входные параметры передаются через глобальные *
649
;* перменные:                                    *
650
;* ChannelNumber - номер канала;                 *
651
;* DiskNumber - номер диска на канале.           *
652
;*************************************************
585 mario79 653
EjectMedium:
654
	pusha
87 mario79 655
; Очистить буфер пакетной команды
585 mario79 656
	call  clear_packet_buffer
87 mario79 657
; Сформировать команду START/STOP UNIT
585 mario79 658
	; Задать код команды
659
	mov	[PacketCommand],word 1Bh
660
	; Задать операцию извлечения носителя
661
	mov	[PacketCommand+4],word 00000010b
87 mario79 662
; Подать команду
585 mario79 663
	call	SendPacketNoDatCommand
664
	popa
665
	ret
87 mario79 666
 
667
;*************************************************
668
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
669
;* Входные параметры передаются через глобальные *
670
;* переменные:                                   *
671
;* ChannelNumber - номер канала;                 *
672
;* DiskNumber - номер диска на канале.           *
673
;*************************************************
674
ReadCapacity:
585 mario79 675
	pusha
87 mario79 676
; Очистить буфер пакетной команды
585 mario79 677
	call  clear_packet_buffer
87 mario79 678
; Задать размер буфера в байтах
585 mario79 679
	mov	[CDBlockSize],8
87 mario79 680
; Сформировать команду READ CAPACITY
585 mario79 681
	mov	[PacketCommand],word 25h
87 mario79 682
; Подать команду
585 mario79 683
	call	SendPacketDatCommand
684
	popa
685
	ret
87 mario79 686
 
585 mario79 687
clear_packet_buffer:
87 mario79 688
; Очистить буфер пакетной команды
585 mario79 689
	mov	[PacketCommand],dword 0
690
	mov	[PacketCommand+4],dword 0
691
	mov	[PacketCommand+8],dword 0
692
	ret
87 mario79 693