GAMEPORT.ASM 由 Paul Cullum 釋出至公共領域,是一個極精簡的 COM 程式(.MODEL TINY),功能單一:偵測 I/O 埠 201h(標準遊戲埠)是否存在搖桿裝置。全程不足 30 行指令,卻完整展示了「I/O 埠讀寫、位元遮罩檢測、輪詢延遲、DOS 字串輸出」等組合語言核心操作。
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 位(通常為浮動或固定值)。INT 21h/09h 輸出結果,INT 21h/4C00h 退出,無檔案操作、無記憶體配置。.MODEL TINY, ORG 100h),可直接以 TASM /m GAMEPORT + TLINK /t GAMEPORT 建置為 COM 檔。GAMEPORT 是「硬體偵測最小系統」的教科書級範例:無作業系統抽象層、直接操作 I/O 埠、以時序特徵推斷硬體存在性。適合作為組合語言入門課「I/O 埠程式設計」的第一個實驗專案。