首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

滑鼠控制 CD 音樂播放器:MCD 組合語言源碼全解析

     編輯:組合語言

專案概覽

MCD(Mouse CD Player)是一個常駐記憶體(TSR)程式,由 Zou Dan 於 1995 年編寫。它攔截滑鼠中斷(INT 33h),擴展滑鼠事件處理器,讓使用者在任何 DOS 環境(含遊戲中)透過特定滑鼠手勢控制 CD-ROM 播放:雙鍵/三鍵同時按下停止,滑鼠移至螢幕左/右邊緣雙鍵切換上/下一曲。程式展示了 INT 33h 鉤掛、MSCDEX (INT 2Fh/15xx) CD 控制、TSR 常駐、媒體更換偵測等進階技術。

核心架構

滑鼠中斷鉤掛(NEW_33)

  • INT 33h/AX=8888h 自定義檢測入口,返回 'zd' 識別已安裝
  • 攔截 AX=0Ch(設定事件呼叫遮罩),將使用者原本的事件向量保存,改指向內部 MY 例程
  • 其餘功能(AX=0, 21h 等)透傳原 INT 33h

自定義滑鼠事件處理器(MY)

; 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。

MSCDEX CD 控制介面(CD_INT 巨集)

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)

媒體更換偵測(MEDIACHG)

呼叫 1510h/02h/09h 讀取媒體狀態,AL=FFh 表示媒體已更換 → 重新執行 INIT 重讀 TOC。

安裝與常駐流程(INIT_CD)

  1. 檢查滑鼠驅動(INT 33h/AX=0,返回 FFFFh 表已安裝)
  2. INT 2Fh/1500h 取得 CD-ROM 驅動器號(CX)
  3. INIT 讀取 TOC、建立軌道 LBA 表
  4. 啟動播放第一軌(PAUSE → PLAY)
  5. 設定滑鼠事件遮罩 CX=00001010b(移動+雙鍵)指向 MY
  6. INT 21h/3533h 保存原 INT 33h 向量 → 2533h 設定新向量
  7. INT 27h TSR 常駐(保留至 INIT_CD 標籤)

技術亮點

  • 滑鼠中斷鏈式轉發:保存使用者事件向量,MARK 旗標區分「內部事件」與「使用者事件」,確保原應用程式滑鼠功能不受影響
  • BCD→二進制轉換:CHECK 例程處理 MSCDEX 回傳的 BCD 編碼軌號(SHR/AND/LOOP ADD 10)
  • LBA 運算:SZD 乘法例程計算分/秒/幀 → 絕對扇區號,播放時以 RED_MAX - TRACK_START 反向計算剩餘長度
  • 極簡使用者介面:無視窗、無選單,純滑鼠手勢操作,適合全螢幕遊戲/應用環境

現代啟示

MCD 展示了「全域熱鍵/手勢 → 硬體裝置控制」的雛形。現代對應:多媒體鍵盤驅動、遊戲手把映射軟體、HID 宏處理器。其「中斷鉤掛 + 狀態機 + 硬體協議」三層架構在鍵盤過濾驅動、VR 控制器映射層中依然通用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved