MCD(Mouse CD Player)是一個常駐記憶體(TSR)程式,由 Zou Dan 於 1995 年編寫。它攔截滑鼠中斷(INT 33h),擴展滑鼠事件處理器,讓使用者在任何 DOS 環境(含遊戲中)透過特定滑鼠手勢控制 CD-ROM 播放:雙鍵/三鍵同時按下停止,滑鼠移至螢幕左/右邊緣雙鍵切換上/下一曲。程式展示了 INT 33h 鉤掛、MSCDEX (INT 2Fh/15xx) CD 控制、TSR 常駐、媒體更換偵測等進階技術。
INT 33h/AX=8888h 自定義檢測入口,返回 'zd' 識別已安裝AX=0Ch(設定事件呼叫遮罩),將使用者原本的事件向量保存,改指向內部 MY 例程AX=0, 21h 等)透傳原 INT 33h; BX = 按鍵狀態, CX/DX = 游標座標
CMP BX, 7 ; 三鍵同時按下 → 停止
CMP BX, 3 ; 雙鍵同時按下
CMP DX, 1 ; 游標最上列 → 停止
CMP CX, 599 ; 最右欄 → 下一曲
CMP CX, 1 ; 最左欄 → 上一曲
設定全域 CTRL 旗標(NEXT/BACK/STOP),隨後呼叫 MEDIACHG(媒體更換檢查)→ CHECK(目前播放狀態)→ 依旗標執行 PLAY/PAUSE。
CD_INT MACRO
MOV AX, 1510h ; MSCDEX 裝置控制
MOV CX, CD_ROM_DRIVER
INT 2Fh
ENDM
1510h 子功能:03h 讀取 TOC、0Bh 讀取軌道起始 LBA、0Ch 讀取目前播放位置、16h/84h 播放、16h/85h 暫停CD_COMMAND 32 位元組,狀態區塊 CD_STATE 32 位元組TRACK_BUFF(40 軌 × 4 位元組 LBA)呼叫 1510h/02h/09h 讀取媒體狀態,AL=FFh 表示媒體已更換 → 重新執行 INIT 重讀 TOC。
INT 33h/AX=0,返回 FFFFh 表已安裝)INT 2Fh/1500h 取得 CD-ROM 驅動器號(CX)INIT 讀取 TOC、建立軌道 LBA 表PAUSE → PLAY)CX=00001010b(移動+雙鍵)指向 MYINT 21h/3533h 保存原 INT 33h 向量 → 2533h 設定新向量INT 27h TSR 常駐(保留至 INIT_CD 標籤)MARK 旗標區分「內部事件」與「使用者事件」,確保原應用程式滑鼠功能不受影響CHECK 例程處理 MSCDEX 回傳的 BCD 編碼軌號(SHR/AND/LOOP ADD 10)SZD 乘法例程計算分/秒/幀 → 絕對扇區號,播放時以 RED_MAX - TRACK_START 反向計算剩餘長度MCD 展示了「全域熱鍵/手勢 → 硬體裝置控制」的雛形。現代對應:多媒體鍵盤驅動、遊戲手把映射軟體、HID 宏處理器。其「中斷鉤掛 + 狀態機 + 硬體協議」三層架構在鍵盤過濾驅動、VR 控制器映射層中依然通用。