深入CD-ROM编程

[入库:2005年8月28日] [更新:2007年3月24日]

本文简介:

在多媒体系统中,cd-rom是必不可少的。以dos为例,cd-rom应用环境的大致结构是:
用户

mscdex

厂家提供的驱动程序

cd-rom
其中,mscdex起到了一个转换器的作用,将cd上的文件格式转化为标准的dos文件格式,使cd-rom象普通驱动器一样受dos管理。
但是,在一般应用中,cd-rom还能用来播放音乐碟,许多应用软件(如creative labs的quick cd)可以模拟一台cd音响,完成出盒、入盒、播放、快速进退和重复等一系列功能。实际上,mscdex并未提供这些功能,必须访问cd-rom的驱动程序,才能达到上述目的,因为所有cd-rom的驱动程序与mscdex之间的接口都是规范的,这给我们提供了极大的方便。下面将详细阐述如何实现上述功能。
dos的设备分为字符设备和块设备两种,cd-rom的驱动程序属于前者,访问它必须遵循dos的要求:填写设备驱动程序请求头、访问驱动程序的策略(strategy)过程、访问驱动程序的中断(interrupt)过程。
设备驱动程序请求头的基本格式如下:
偏移量 类型 含义
00h 字节 请求头长度
01h 字节 驱动程序内的子单元
02h 字节 命令码
03h 单字 返回码

以下内容根据命令码进行填写
下面给出几种cd-rom常用功能使用的命令码和格式:
1.ioctl input:
偏移量 类型 内容
00h 字节 1ah
01h 字节 00h
02h 字节 03h
03h 字节 11 dup(?)
0eh 双字 缓冲区地址
12h 单字 缓冲区长度
14h 字节 6 dup (?)
在缓冲区内按一定的格式填入参数,便可得到cd-rom的各种状态。
缓冲区的格式:
作用 长度 格式
取cd-rom状态 5 输入:06 xx xx xx xx
返回:06 ss ss 00 00
说明:ss ss为状态字,关键的有两位
位0:1、开门 0、关门
位b:1、有盘 0、无盘
取cd总扇区数 5 输入:08 xx xx xx xx
返回:08 ll ll ll ll
说明:ll ll ll ll为总扇区数
取音乐cd信息 7 输入:0a xx xx xx xx xx xx
返回:0a xx nn tt ss mm xx
说明: nn为曲目数
mm为分钟数
ss为秒数(0~59)
tt为扇区数(0~74)
cd的一个扇区大小为2048b
播放速度为每秒75扇区即150kb/s
取指定歌曲 7 输入:0b nn xx xx xx xx xx
的起始时间 返回:0b nn tt ss mm xx xx
说明: nn为曲目序号
mm为起始分钟数
ss为起始秒数(0~59)
tt为起始扇区数(0~74)
取播放状态 11 输入:0c xx xx xx xx xx xx xx xx xx xx
返回:0c xx nn xx mm ss tt xx zm zs zt
说明: nn为曲目序号(bcd码)
mm为该曲目分钟数
ss为该曲目秒数(0~59)
tt为扇区数(0~74)
zm为总分钟数
zs为总秒数(0~59)
zt为扇区数(0~74)
2.ioctl output
偏移量 类型 内容
00h 字节 1ah
01h 字节 00h
02h 字节 0ch
03h 字节 11 dup(?)
0eh 双字 缓冲区地址
12h 单字 缓冲区长度
14h 字节 6 dup(?)
在缓冲区内按一定的格式填入参数,便可操纵cd-rom的动作。
缓冲区的格式:
作用 长度 格式
出盒 1 输入:00
解锁出盒键 2 输入:01 00
加锁出盒键 2 输入:01 01
入盒 1 输入:05
3.play audio
偏移量 类型 内容
00h 字节 16h
01h 字节 00h
02h 字节 84h
03h 字节 10 dup (?)
0dh 字节 01h
0eh 字节 起始扇区数(0~74)
0fh 字节 起始秒数
10h 字节 起始分钟数
11h 字节 00h
12h 双字 播放扇区数(75扇区/s)
从指定的起始时间开始播放指定的扇区数然后自动停止
4.stop audio
偏移量 类型 内容
00h 字节 odh
01h 字节 00h
02h 字节 85h
03h 字节 10 dup (?)
停止播放
以上给出的是cd-rom常用功能的设备驱动程序请求头格式,但是在应用中怎样实现上述功能呢?有两种方法。
一是直接访问设备驱动程序,这种方法比较复杂,本文不作介绍。
二是使用mscdex提供的接口。主要功能有以下几种。
(1) 检测mscdex是否安装
bx=0
ax=1500h
int 2fh
返回:
bx=cd-rom的个数
cx=起始的cd-rom盘号(0-a,1-b,等等)
(2) 发送设备驱动程序请求
es:bx=设备驱动程序请求头地址
cx=cd-rom盘号(0-a,1-b,等等)
ax=1510h
int 2fh
用户填写请求头,通过int 2fh完成所需要的功能。
下面给出一段例程,播放cd中第二支曲目30秒钟。
限于篇幅,本程序未作错误处理,假设执行正确。
code segment
assume cs: code, ds:code
buf db obh, 2, 5 dup(?)
req db 1ah,0,3,11 dup(?)
dd buf
dw 7
db 6 dup (?)
play db 16 h,0,84h,10 dup (?),1
db 3 dup(?),0
dd 75*30
start:
mov ax,code
mov ds,ax
xor bx,bx
mov ax,1500h
int 2fh
or bx,bx
jz no-cd
mov ax,seg req
mov es,ax
mov bx,offset req
mov ax,1510h
int 2fh
mov ax, [buf+2]
mov [play+0eh],ax
mov al, [buf+4]
mov [play+10h],al
mov ax, seg

play
mov es,ax
mov bx,offset play
mov ax,1510h
int 2fh
no-cd:
mov ah,4ch
int 21h
code ends
end start
还有一些功能,因为不是应用必需的,这里就不再赘述。

本文关键:深入CD-ROM编程
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top