Subversion Repositories Kolibri OS

Rev

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

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