承接 HDR.ASM (ID 13299) 的標頭與策略/中斷框架,DRIVER.ASM (Ray Duncan, 1985) 提供一個功能完整 (雖為存根) 的字元裝置驅動程式範本:包含標頭、屬性字解析、請求標頭結構、策略/中斷常式、16 大命令碼分派表、狀態字定義、錯誤/完成出口集中處理、初始化常式。所有實際裝置操作常式 (Input, Output, Ioctl 等) 僅為 `JMP Done` 存根,但架構完整可直接擴充為真實驅動程式 (如序列埠、平行埠、虛擬磁碟、鍵盤過濾器)。
Header dd -1 ; 串列結尾
dw 8000h ; 字元裝置, Bit 15=1
dw Strat ; 策略常式
dw Intr ; 中斷常式
db 'DRIVER ' ; 裝置名稱 (8 字元)
屬性字位定義 (註解詳盡):Bit 15=字元, Bit 14=IOCTL, Bit 13=非 IBM 格式, Bit 11=Open/Close/Removable, Bit 3=Clock, Bit 2=NUL, Bit 1=StdOut, Bit 0=StdIn。
Request struc
Rlength db ? ; 長度
Unit db ? ; 單元號
Command db ? ; 命令碼
Status dw ? ; 狀態字
Reserve db 8 dup (?)
Media db ? ; 媒體描述符
Address dd ? ; 緩衝區位址
Count dw ? ; 計數
Sector dw ? ; 起始扇區 (區塊裝置)
Request ends
Strat proc far
mov word ptr cs:[RH_Ptr], bx
mov word ptr cs:[RH_Ptr+2], es
ret
Strat endp
僅儲存 ES:BX (請求標頭遠端指標) 至本地變數 RH_Ptr。
Intr proc far
push ax, bx, cx, dx, ds, es, di, si, bp
push cs; pop ds ; 設定本地資料段
les di, [RH_Ptr] ; ES:DI -> 請求標頭
mov bl, es:[di.Command] ; 取得命令碼
xor bh, bh
cmp bx, Max_Cmd ; Max_Cmd=15 (DOS 3.x)
jg Unk_Command
shl bx, 1
jmp word ptr [bx+Dispatch] ; 分派表跳轉
... (錯誤/完成出口) ...
Intr endp
Dispatch:
dw Init ; 0
dw Media_Chk ; 1
dw Build_Bpb ; 2
dw Ioctl_Inp ; 3
dw Input ; 4
dw Nd_Input ; 5
dw Inp_Stat ; 6
dw Inp_Flush ; 7
dw Output ; 8
dw Outp_Vfy ; 9
dw Outp_Stat ; 10
dw Outp_Flush ; 11
dw Ioctl_Outp ; 12
dw Dev_Open ; 13
dw Dev_Close ; 14
dw Rem_Media ; 15
Unk_Command:
mov al, 3 ; 未知命令錯誤碼
Error:
mov ah, 81h ; Error + Done bits
jmp Exit
Done:
mov ah, 1 ; Done bit only
Exit:
lds bx, cs:[RH_Ptr]
mov ds:[bx.Status], ax ; 寫入狀態字
pop bp, di, si, es, ds, dx, cx, bx, ax
ret
所有常式最終跳轉 `Error` (帶錯誤碼 AL) 或 `Done`,由 `Exit` 統一寫入狀態字、恢復暫存器、返回。極佳的結構化錯誤處理模式。
每個常式註解詳細列出請求標頭偏移對應參數:
Init:
push es, di
mov ah, 9
mov dx, offset Ident
int 21h ; 列印簽名
pop di, es
mov word ptr es:[di.Address], offset Init
mov word ptr es:[di.Address+2], cs
jmp Done ; 釋放 Init 佔用記憶體
初始化常式可呼叫 DOS 服務 01-0Ch, 30h。此處將首個可用記憶體設為 `Init` 自身位址,使初始化碼記憶體在驅動程式載入完成後被回收。
code segment public 'CODE'
driver proc far
assume cs:code,ds:code,es:code
org 0
Max_Cmd equ 15
... (屬性字位定義註解) ...
Header ...
RH_Ptr dd ?
Ident db ...
Dispatch ...
Request struc ... ends
Strat ...
Intr ... (含分派、出口、16 個存根、Init)
Driver endp
code ends
end
DRIVER.ASM 雖為存根,但其架構嚴謹、註解詳盡、覆蓋 DOS 2.x/3.x 所有命令碼,是學習裝置驅動程式模型、中斷處理、參數驗證、錯誤傳播、記憶體管理的黃金範本。現代 Windows WDF/KMDF、Linux `file_operations`、UEFI Driver Binding 皆可見其架構基因。