опубликован 03-11-2001 23:43 MSK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Пример открывания и закрытия CD-ROM`а (by 7in) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;.MODEL Tiny,Pascal
.CODE
ORG 100h
SMART
Start:
call GetCDROMInfo
or al,al
lea dx,Error
je Exit ; Если MSCDEX
push FirstCDROM
mov ax,1 ; Открыть CD-ROM
push ax
call CDROMEject
lea dx,Opened
mov ah,9
int 21h
push FirstCDROM
xor ax,ax ; Закрыть CD-ROM
push ax
call CDROMEject
lea dx,Closed
Exit: mov ah,9
int 21h
int 20h
Opened DB 'CDROM is Ejected!',13,10,'$'
Closed DB 'Tray is Closed!',13,10,'$'
Error DB 'MSCDEX is not installed!',7,13,10,'$'
;-- Процедуры ---------------------------------------------------------------;
FirstCDROM DW ? ; Номер буквы имени первого CD-ROM-устройства (A=0...)
CDROMsNumber DW ? ; Количество CD-ROM-устройств
; Возвращает AL=1, если MSCDEX загружен, и заполняет FirstCDROM и
; CDROMsNumber соответствующими значениями. Возвращает AL=0, если
; MSCDEX не загружен, и дальнейшая работа с CD-ROM невозможна.
GetCDROMInfo proc
mov ax,1500h
xor bx,bx
xor cx,cx
int 2Fh
xor al,al
or bx,bx
jz @@Error
inc ax
mov FirstCDROM,cx
mov CDROMsNumber,bx
@@Error: ret
GetCDROMInfo endp
; Формат запроса
Request struc
ReqLen DB ? ; Длина запроса
SubUnit DB ? ; Номер подустройства драйвера
Command DB ? ; Код коданды
Status DW ? ; Статус (результат)
; Status - Если бит 15 установлен, значит ошибка, код в младшем байте
; Status - Если бит 9 установлен, значит устройство занято
; Status - Если бит 8 установлен, значит запрос выполнен!!!
Reserved DB 8 dup (?) ; Резерв (устанавливается драйвером)
; Далее идут данные для команды 12 (IOCTLO)
Media DB ? ; Media descriptor byte from BPB
Address DD ? ; Указатель на передаваемые байты
DataSize DW ? ; Количество передаваемых байт
Sector DW ? ; Номер начального сектора
VolID DD ? ; DWORD ptr to requested vol ID if error 0Fh
ends
; Послает драйверу устройства Drive запрос типа Request, на который
; указывает Data. После выполнения запроса в поля ErrorCode и Status
; заносится код результата.
SendCDROMRequest proc
arg Drive:WORD, Data:DWORD
uses ES
mov ax,1510h
mov cx,Drive
les bx,Data
int 2Fh
ret
SendCDROMRequest endp
; Открывает (Open<>0) / закрывает (Open=0) устройство Drive.
; Функция возвращает статус в регистре AX.
CDROMEject proc
arg Drive:WORD, Open:BYTE
local Data:Request, Code:BYTE
mov Data.ReqLen,26
mov Data.SubUnit,0
mov Data.Command,12
and Data.Status,0
mov Data.Media,0
lea ax,Code
mov WORD PTR Data.Address[0],ax
mov WORD PTR Data.Address[2],ss
mov Data.DataSize,1
and Data.Sector,0
and WORD PTR Data.VolID[0],0
and WORD PTR Data.VolID[2],0
mov Code,0
cmp Open,0
jne @@OpenIt
mov Code,5
@@OpenIt: push Drive
push ss
lea ax,Data
push ax
call SendCDROMRequest
mov ax,Data.Status
ret
CDROMEject endp
END Start