 |
会员登陆 |
|
|
|
|
 |
最近更新 |
|
|
| |
|
深入CD-ROM编程 |
|
|
发表时间:2005-9-28 14:56:21 浏览人次: 我要投稿 |
|
|
|
>其中,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 字节 1AH01H 字节 00H02H 字节 03H03H 字节 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 字节 1AH01H 字节 00H02H 字节 0CH03H 字节 11 DUP(?)0EH 双字 缓冲区地址12H 单字 缓冲区长度14H 字节 6 DUP(?)在缓冲区内按一定的格式填入参数,便可操纵CD-ROM的动作。缓冲区的格式:作用 长度 格式出盒 1 输入:00解锁出盒键 2 输入:01 00加锁出盒键 2 输入:01 01入盒 1 输入:053.PLAY AUDIO偏移量 类型 内容00H 字节 16H01H 字节 00H02H 字节 84H03H 字节 10 DUP (?)0DH 字节 01H0EH 字节 起始扇区数(0~74)0FH 字节 起始秒数10H 字节 起始分钟数11H 字节 00H12H 双字 播放扇区数(75扇区/s)从指定的起始时间开始播放指定的扇区数然后自动停止4.STOP AUDIO偏移量 类型 内容00H 字节 ODH01H 字节 00H02H 字节 85H03H 字节 10 DUP (?)停止播放以上给出的是CD-ROM常用功能的设备驱动程序请求头格式,但是在应用中怎样实现上述功能呢?有两种方法。一是直接访问设备驱动程序,这种方法比较复杂,本文不作介绍。二是使用MSCDEX提供的接口。主要功能有以下几种。(1) 检测MSCDEX是否安装BX=0AX=1500HINT 2FH返回:BX=CD-ROM的个数CX=起始的CD-ROM盘号(0-A,1-B,等等)(2) 发送设备驱动程序请求ES:BX=设备驱动程序请求头地址CX=CD-ROM盘号(0-A,1-B,等等)AX=1510HINT 2FH用户填写请求头,通过INT 2FH完成所需要的功能。下面给出一段例程,播放CD中第二支曲目30秒钟。限于篇幅,本程序未作错误处理,假设执行正确。CODE SEGMENTASSUME CS: CODE, DS:CODEBUF DB OBH, 2, 5 DUP(?)REQ DB 1AH,0,3,11 DUP(?)DD BUFDW 7DB 6 DUP (?)PLAY DB 16 H,0,84H,10 DUP (?),1DB 3 DUP(?),0DD 75*30START:MOV AX,CODEMOV DS,AXXOR BX,BXMOV AX,1500HINT 2FHOR BX,BXJZ NO-CDMOV AX,SEG REQMOV ES,AXMOV BX,OFFSET REQMOV AX,1510HINT 2FHMOV AX, [BUF+2]MOV [PLAY+0EH],AXMOV AL, [BUF+4]MOV [PLAY+10H],ALMOV AX, SEGPLAYMOV ES,AXMOV BX,OFFSET PLAYMOV AX,1510HINT 2FHNO-CD:MOV AH,4CHINT 21HCODE ENDSEND START还有一些功能,因为不是应用必需的,这里就不再赘述。
作者:余珏 陈志慧
|
| |
|
|
|
| |
|