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

遊戲埠偵測經典範例:GAMEPORT 組合語言源碼解析

     編輯:組合語言

程式背景

GAMEPORT.ASM 由 Paul Cullum 釋出至公共領域,是一個極精簡的 COM 程式(.MODEL TINY),功能單一:偵測 I/O 埠 201h(標準遊戲埠)是否存在搖桿裝置。全程不足 30 行指令,卻完整展示了「I/O 埠讀寫、位元遮罩檢測、輪詢延遲、DOS 字串輸出」等組合語言核心操作。

硬體原理速覽

  • 遊戲埠基址 201h,寫入任意值觸發單穩態多振盪器充電
  • 讀取同一埠,低 4 位(D0-D3)對應 4 個搖桿按鈕/軸向電阻充電狀態
  • 若無裝置接駁,電阻無限大,電容充電極快,讀回值低 4 位全為 1(0Fh)
  • 有裝置時,電阻有限,充電較慢,讀回值低 4 位不全為 1

程式碼逐段解讀

mov al, 1          ; 任意值觸發充電
mov dx, 201h       ; 遊戲埠位址
out dx, al         ; 寫入觸發
mov cx, 0F00h      ; 延遲迴圈計數器(約 3840 次)
port_loop:
  in al, dx        ; 讀取狀態
  and al, 0Fh      ; 只看低 4 位
  cmp al, 0Fh      ; 全 1 代表無裝置
  je jstick_exists
  loop port_loop   ; CX-- 直到 0
; 迴圈結束仍未讀到非 0Fh → 判定無遊戲埠
mov dx, OFFSET no
jmp SHORT done
jstick_exists:
mov dx, OFFSET yes
done:
mov ah, 9h
int 21h            ; DOS 列印字串
mov ax, 4c00h
int 21h            ; 正常結束

關鍵細節

  • 延遲迴圈校準:0F00h(3840)經驗值,足讓電容在無裝置時充飽電;有裝置時 RC 時間常數較大,迴圈內必會讀到非 0Fh。
  • 位元遮罩:AND AL, 0Fh 只保留 D0-D3,忽略高 4 位(通常為浮動或固定值)。
  • 最小化 DOS 呼叫:僅用 INT 21h/09h 輸出結果,INT 21h/4C00h 退出,無檔案操作、無記憶體配置。

擴展與現代對應

  • 可擴展為完整搖桿校準程式:測量充電時間換算電阻值 → 位置座標
  • 現代系統透過 HID/USB 介面處理遊戲控制器,但「觸發-輪詢-閾值判斷」的基本邏輯在 GPIO 偵測、電容式觸控、電阻式感測器驅動中依然通用。
  • 原始碼採用 MASM/TASM 相容語法(.MODEL TINY, ORG 100h),可直接以 TASM /m GAMEPORT + TLINK /t GAMEPORT 建置為 COM 檔。

教學價值

GAMEPORT 是「硬體偵測最小系統」的教科書級範例:無作業系統抽象層、直接操作 I/O 埠、以時序特徵推斷硬體存在性。適合作為組合語言入門課「I/O 埠程式設計」的第一個實驗專案。

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