BASMAIN.ASM 是 Microsoft BASIC 編譯器 (BC) 產生的可執行檔前置模組,負責在 BASIC 主程式 ($$main) 執行前:
/M:nnn,限制程式最大可用記憶體 (nnn KB,範圍 64~1024)。$$main 進入 BASIC 程式邏輯。basmain proc far
assume cs:cseg, ds:cseg, ss:nothing, es:nothing
push ds
xor ax, ax
mov ds, ax ; DS=0 存取 IVT/DOS 通訊區
mov si, 4F2h
mov ax, es ; ES = PSP 區段
mov [si], ax ; 存入 0:04F2h
pop ds
mov si, 80h ; PSP:80h = 命令列長度+字串
mov ch, 0
mov cl, [si] ; CL = 長度
jcxz p025 ; 無參數直接跳轉
p010: inc si
mov al, [si]
cmp al, '/' ; 尋找 '/'
jnz p020
mov ax, [si+1]
cmp ax, ':M' ; "/M" 或 "/m"
jz p030
cmp ax, ':m'
jz p030
p020: loop p010
p025: jmp p080 ; 找不到 /M 直接進入 BASIC
p030: ; 解析 /M:nnn
add si, 3 ; 指向數字
mov ax, 0
mov bx, 0
mov cx, 10
p040: mov bl, [si]
cmp bl, '0'; jb p050
cmp bl, '9'; ja p050
sub bl, '0' ; ASCII 轉數值
mul cx ; AX *= 10
add ax, bx ; 累加
inc si
jmp p040
p050: cmp ax, 64; jb p060 ; <64K 錯誤
cmp ax, 1024; ja p060 ; >1024K 錯誤
mov cl, 6
sal ax, cl ; KB 轉段落 (*64)
mov bx, es ; PSP 區段
add bx, ax ; 新記憶體頂端
mov si, 2 ; PSP:02h = 目前記憶體頂端
mov ax, [si]
cmp ax, bx
jae p055 ; 新設定較大不可行
mov dx, offset msg2 ; "Unable to limit memory"
jmp p065
p055: mov [si], bx ; 更新 PSP:02h
jmp p080
p060: mov dx, offset msg1 ; "Memory specification must be from 64 to 1024"
p065: add dx, 100h ; PSP 位移調整
mov ah, 9
int 21h ; DOS 列印字串 (以 $ 結尾)
p080: jmp $$main ; 進入 BASIC 主程式
basmain endp
LINK BASMAIN+yourprog, yourprog, NUL.MAP, BASCOM
BASMAIN 必須為第一個模組,且 end basmain 指定程式進入點。