深入CD-ROM程式設計

才智咖 人氣:5.63K
深入CD-ROM程式設計
在多媒體系統中,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常用功能使用的.命令碼和格式:
L 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)
L 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
 AUDIO
偏移量 型別 內容
00H 位元組 16H
01H 位元組 00H
02H 位元組 84H
03H 位元組 10 DUP (?)
0DH 位元組 01H
0EH 位元組 起始扇區數(0~74)
0FH 位元組 起始秒數
10H 位元組 起始分鐘數
11H 位元組 00H
12H 雙字 播放扇區數(75扇區/s)
從指定的起始時間開始播放指定的扇區數然後自動停止
 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
還有一些功能,因為不是應用必需的,這裡就不再贅述。 

作者:餘珏 陳志慧