【doc】CD唱盘的检索播放
CD唱盘的检索播放
多媒蒋
叫ch递槌京
一
辽宁省铁岭县李千户中一校(112606)金风霞 ?_?-??_.一
用过WINDOWS95的用户可能会发现,它的 CD唱盘播放程序CD…PIAY,EXE具有CD唱盘的 检索播放功能.即顺序播放CD唱盘中每个曲目的 前一段内容,这一功能对于很多用户来说是有一定 实用价值的.特别适合于对不熟悉唱盘的内容的选 择欣赏之用.下面的程序可以在DOS状态下实现这 一
功能.
由于CD唱盘的痢区格式不兼容DOS的文件管 理系统,所以对它的拄制
完全不同于软驱盘及硬 盘驱动器,不能用BIOS或DOS的有关磁盘操作功 能对其正常操作.对干CD唱盘的大部分操作,必须 通过直接访问其设备驱动程序而实现,具体可通过 INT2FH中的有关功能进行设备请求操作.在具体 的CD唱盘控制过程中,首先需要建立标准的设备请 求头结构和控制甩缓冲区,并在缓冲区中填入适当的 控制码,然后把所用缓冲区的地址(包括段址和偏移 地址)送入设备头中的存放缓冲地址处.最后把设备 头地址送入EStBx寄存器,调用INT2FH的1S10H 号功能,即可完成CD—ROM的有关操作.调用结束
返回时,一般在缓冲医的特定位置返回有关的CD唱 盘的信息或操作反馈信息.具体的各种控制功能的 内容'甥e冲区结构及编程方法请参考有关的资 料和文后程序.
实现曲目检索是编程中的一个主要问题,要完 成此功能需要控制曲目的播放时间.一般有两种方 法可实现曲目的固定时间长度的播放效果?第一种 方法是在播放操作时指定播放的扇区总数(每秒75个 扇区),当播放完这些扇区时会自动停止播放,但是 由于CD唱盘播放之后即可脱离控制丽返回DOS或 继续其他操作,所以用上述方法需要实时幢攫I播放 状态,以便进行下一曲目的播放动作}另一种方法 是按正常的方法播放曲目的全部内容,然后在指定 的延时时间之后强制停止播放,因为此方法的cD 唱盘的播放状态及停止状态都在程序的控制之中, 所以编制方法相对简单.在文后的程序中采用了第 二种方法,通过用户定时中断INT2CH精确的定 时,实现了CD唱盘各曲目的固定时间长度的播放 ,『l1
操作及曲目的全盘检索功能}
文后程序甩汇编语言写成.经汇编,链接并转换 为COM文件后即可使用,在DOS状态下运行之后 将在屏幕上显示出整个CD盘的曲目总数,全盘播放 时间及各曲目的起始时间等信息井开始曲目检索工 作,此时在屏幕中央位置实时显示当前1佥索的曲目 序号及进度,并从盘的第一首曲目开始播放,每个 曲目播放10秒钟后自动停止并开始下一曲目的播放. 当全盘曲目播放完毕时将结束程序返回DOS状态. 在检索过程中.如果想欣赏当前正在检索曲目的全
都内容,此时可按下P键则进入正常播放状态.在屏 幕上的提示信息也由检索变为播放,之后可正常播 放完此曲目及后面的所有曲目内容I在检索或播放 状态下按下L键可结束程序返回DOS状态并在后 台播放余下的曲目内容I在按下P键进入播放状态 后也可按下T键使程序重新进入到检索状态,程序 将从当前的曲目开始检索后面的曲目}在播放或检 索状态下可随时按下ESC键结束程序并停止播放状 态.
此程序在486机,DOS6.2操作系统,松下二倍速 光驱及花王真16位声卡环境下遇试通过,困程序中全 都采用汉字信息提示,所以可在如UCDOS等汉字系 统下很好的运行,如果在西文状态下使用最好修改提 示信息为英文方式.
ICD唱盘检索程序
fC.DPLAY.COM
CODESEGMEl,IT
ASSUMEC,S:CODE}DS,?DE
OGIOOH
BEGIN,JMPSTART
I获得cD—ROM状态缓冲区
GETBUFFOBOBH,11DUP(?)I I获得cD—FK)M状态设备头
GETcD0B1AH,0,0~'-I.11DUP(?)
ADDG0D0
LONGDW5
DB6DUP(?)
I关闭cD唱盘播放设备头
STOPDB0DH,O,85H,10DUP(?) NOCDERRDB7,NoFoundcd_r0tilDevice$
cDNuMDW0;存CDROM驱动器号 PLAYNUMDBi
38电l齄镰霾技礤与维护...199蔫J痒_嚣a2期
Z
;摇放cD唱盘设备头
P1AYDB】6H.0,84H,】0DUP(?),】 DB16.2,l,0,0,0,0.0 ALLSECDwO;总秒数
PLAYSEDWO{指定曲目起始秒戡 PLAYNUDBO;总曲目数
THIRTY1DB60
THIRTY2DW75
MSGDB'Track: MSGEDDB'$
DAT】DW1
NuMDBo;当前曲目号
PLAYMMDBOl当前分钟数 PLAYSSDB0;当前秒戡
NUMCD8'O0一[.摇放状态显示 PLAYMMCDBOO: PLAYSSCDB0O1 BZDB,T;测试标志
HELP1DBCDPLAY(T:testP:play.
OBL:ployandquit DB'ESC:slopondquit)
JSzDW0时间计数
0LDINT1CDDo
START:
MOVAH,OFH;初始化屏幕
INT】OH
MAH,o
INT1OH
LEABP.HELP1
MOVBL.74H
MOVDX.05t~H
MOVCX,55
CALLDi~~PSTR
MOVSI,OFFSETADDG MOVAX,OFFSETGET8UFF MOVWORDPTRCS}CSl3,AX MOVAX.CS
MOVWORDPCS-[sI+2],AX MOV8X.0
MOVAX,15O,0H
INT2FH;硷查CDROM是否存在 ORBX,8X
JNZNEXT1}转错误处理
MOVDX,OFFSETNocDERR MOVA?.9
INT21H
JMPEXIT
NEXT1tMOVCDNUM.CX CALLGETCOIN+取cD盘信息 MOVAL.PLAYNU,处理总曲目数 XORAH.AH
XORDX.DX
CAl1.HEXASC,转换为10进制 LEABP.MSG
MOV81.,10H M0VDX,OSIAH MOVCX,8
CALI.DISPSTR MOVAX.351CH T21H;取定时中断向量
_EADI,OLDINT1Cl
MOV[D8x
MOV[DI+2],ES MOVDX,oFFSETNEWINT1C
MOVAX.251CH INT21H{修改中断向量 PUSHCS
POPES
CALLSTOPCD M0VAL,PLAYNUM CA_LPLAYCD LOP,CALLDISPt:IUM
MOVAH.1
INTl6H
JNZEXlTT
CMPBZ,P
JZLOP
0MPJSZ,182是否到时
JBLOP
MOVJsz,o恢复计数韧值 MaVAL.PLAYNU C?PPLAYNUM,AL JBINCNuM;是否处理完 CALLSTOPCO
JMPFESTOR
INCNtIM:INCPLAYNUMl处理下一曲日 CALLSTOPCD
MOVAL,PLA?qUM
CALLPLAYCD
JMPLoP
E)cITT:MOVAH,o接收按键
INT16H
CMPAL,1BH,ESc键退出
JNZSC^NP
CALLSToPCD
JMPREST.R
SCANP:ORAL.201-1 CMPAL,P;P健进凡播就状态
JNZSCANT
MOVBZ.P
JLOP
SCANTCMPAL,…t,T键避l入检测状态 JNZSCANL
M0VBZ,T.
JMPLOP
SCk~LrC?PAL,;L键描敲并退出 JZRESTOR
JLOP
REsT0RtMShOFFsEToL131NT1~
MOVDX,WOftDPTR[SO ?OAx,wOftDPTR[81+2] M0VDS.AX
M0VAX.251CH
INI"21H;恢复原中断
EXITMOVAH,4CH
INT2lH;返回DOs状态
PLAYCDl播放指定的曲目
MOVBYTEPCSl[GETBI_lFF],怕H
MOVBYTEPcs[~TCO+1],7 MOVBYTEPcs[GE"rNJ~F+1],AL MOBx,OFFSETGETCD
MOCX.CDNUM
MaVAX.151OH
INT2R-I
MOVAL,BYTEPTRCS【[GET8uFF+4] MULTHIRTYI
电脑螭程技巧与维护?1~9~96年第12期39
0RB×.B×
MOVBL,ByTEPTRCS;[GEIBtJFF+3] ADDAX,Bx
MoVPLAYSE.AX
AX,ALLSEC
SUBAX.PLAYsE
MULTHIRTY2
MOVWQRDPTRCS:[PLAY+12HI,AX MOVWOrlDPTRCS:[PLAY+14HI.D×
MOVA)(,WORDPTRcS{[GETBuFF+2] MOVWQRDPTFICS:EPLAY+.EHI.AX MOVAL,[GETBIJFF+3]
MOVCst[PtAY+OFH3,AL
MOvAL,[GE1BUFF+4]
lovCs【[PLAY+lOH3,AL
?oV13X,0FFsETPLAY
.IIOVAX,151oH
INT2FH
T
GETC[3~tt:I取co盘信息
MOVBY]IEPTRCs:[GETBUFF],OAH
MOVE3YTEPTRCst[GETCD+121-1],7
?OVBX,OFFSE3"GET?
MOVCX,CDNuM
MoVAX.151oH
1NT2FH
XORAX,AX
?avAL,BYTETRCsl[GETBOFF+5] MULTHIRTYl
XORBX,B×
OvBL,BYTEPTRCs【[GETBuFF+4] ADDAX.B×
MOMl札LsEC,AX|存总扇区数
MOMBL,BYTEPTRCS[GETBUFF+2] MOVFt.AYNLI,BLI存总曲日数
RET
GETPLlNt;取当前播敲状态
MOVTEPTRCs[GErBUFF3,OCH MOVBYTEPTRCS,[G盯CD+1刖],n MOVBX,0FFSETGETCD
MOVAX,l51oH
MOvCX,CDNUM
lNTzFH
XORAX,AX
?DvAL,BYTEPTRCS[GETBuFF+2]
?^ONuM.AL{当前曲目号一 MOMAL,BYTEPTRCS,[GETI~UFF+4]
MOMPLAYMM,ALI当前分钟教 M0vAL,BYTEPTRcS.[GETBuFF+5]
MOVPtAYS$,ALI当前秒教
RET
DISPNIJM:I显示当前播斌状卷 CALI.13ETPLlN MDvAL,NUM
^NDAL,0FH
ORAL,30H
?avByTEPTRCs.CNt~c+1],AL
M0VAL,NUM
MOVCL,4
SHRAL,CL
ANDAL,0FH
?AL,30H
'?OvNUMC,AL
XORAX,AX
MOVAt.,PLAYMM x0rdx,dx
ca"nexasc
?avAL,cs,[MSC~D] M0VPLA?MC+I1AL MOVAL,Cs:[?sGED一1] MOvPLAYhtMC,AL XORA×,AX
MOVla.,PLAYS,3 xordx,dx
callh0xasc
MOVla.,INS:[MSaED]
MavPLAYSSC+l,AL ?avAL,Ds:[MSGED--1]
M0VPLAYSSC,AL LEABP,NUMC
MOVBL.1OH
MOVD×,O82AH
MOVCX,ll
CALLOISPSTR RET
$'fOPCDl停止CD唱盘播敲 MOVB×,oFFSETSTOP MovAX,151ffel ?OvCX,Col嘎什^
INT2FH
T
HExA8cI转换为十进翩教 PUSHC×
MULDAT1
MOVSl,OFFSETM9ED MOVCX.2
MOVB×,l0
CYCLE:
DlVBX
ORDL.3oh
?Dv[sI]tDL
DECSI
MOVD×,O
LooPCYCLE
POPCX
RET
DISPSTR:|彩色字符串显示 PUSHCX
PUSHDS
POPES
MOVBH,0
h^0VAL,0 MOVAH,l3H INTl0H
POPCX
T
NEWINT1C;}定时中断暇务程序
PUSHD8
PIcS
POpDS
lCCSlJSZ POPDS
lRET
CODEENDS ENDBEGIN (收稿日期:1996年8月31日)
4O电l舾壤程技巧与缝护,?19196-.年第12期