PC-98x1でのXMS情報をアセンブラで取得する
xms.asm はじめのバージョン
code segment
assume cs:code, ds:code
org 100h
cr equ 0dh
lf equ 0ah
start: jmp is_xms
m_nai db 'XMSドライバは存在しません。',cr,lf,'$'
m_aru db 'XMSドライバが存在します。',cr,lf,'$'
m_a20ok db 'A20は有効になっています。',cr,lf,'$'
m_a20ng db 'A20は無効です。',cr,lf,'$'
m_a20 db 'A20を有効化します。',cr,lf,'$'
m_a20n db 'A20を有効化できませんでした。',cr,lf,'$'
m_hmaok db 'HMAが存在します。',cr,lf,'$'
m_hmang db 'HMAは存在しません。',cr,lf,'$'
is_xms:
mov ax, 4300h ; mov ah=43h,mov al=00hでも同じ
int 2fh
cmp al,80h
jz xms_aru
mov dx,offset m_nai
jmp disp
xms_aru:
mov dx,offset m_aru
disp: mov ah,09h
int 21h
is_hma:
mov ah,00h
int 2fh
cmp dx,01h
jz hma_aru
mov dx,offset m_hmang
jmp hma
hma_aru:
mov dx,offset m_hmaok
hma:
mov ah,09h
int 21h
is_a20:
mov ah, 07h
int 2fh
cmp ax, 01h
jz a20_aru
;A20無効の場合
mov dx, offset m_a20ng ;無効の表示
mov ah,09h
int 21h
mov dx, offset m_a20
mov ah,09h
int 21h
mov ah,05h ;A20を有効化
int 2fh
cmp ax,01h ;有効化できたら
jz a20_aru ;a20_aruにジャンプ
mov dx, offset m_a20n
jmp disp_a20
a20_aru:
mov dx, offset m_a20ok
jmp disp_a20
disp_a20:
mov ah, 09h
int 21h
mov ah,4ch
int 21h
code ends
end start
PC-9821Cx(i486)で作りました。
xms.asm 次のバージョン
で,作り直し。
(どこが変わったか分かりづらくてすいません。
code segment
assume cs:code, ds:code
org 100h
cr equ 0dh
lf equ 0ah
start: jmp is_xms
m_nai db 'XMSドライバは存在しません。',cr,lf,'$'
m_aru db 'XMSドライバが存在します。',cr,lf,'$'
m_a20ok db 'A20は有効です。',cr,lf,'$'
m_a20ng db 'A20は無効です。',cr,lf,'$'
m_a20 db 'A20を有効化します。',cr,lf,'$'
m_a20activeok db 'A20を有効化しました。',cr,lf,'$'
m_a20activeng db 'A20を有効化できませんでした。',cr,lf,'$'
m_hmaok db 'HMAに16byte要求し成功しました。',cr,lf,'$'
m_hmang db 'HMAに16byte要求し失敗しました。',cr,lf,'$'
is_xms:
mov ax, 4300h ; mov ah=43h,mov al=00hでも同じ
int 2fh
cmp al,80h
jz xms_aru
mov dx,offset m_nai
jmp disp
xms_aru:
mov dx,offset m_aru
jmp disp
disp: mov ah,09h
int 21h
jmp is_hma
is_hma:
mov ah,01h
mov dx, 010h ; HMAに16byte要求
int 2fh
cmp ax,01h ;割り当て成功したら
jz hma_aru
mov dx,offset m_hmang
jmp disp_hma
hma_aru:
mov dx,offset m_hmaok
disp_hma:
mov ah,09h
int 21h
is_a20:
mov ah, 07h
int 2fh
test ax, 01h
jz a20_aru
;A20無効の場合
mov dx, offset m_a20ng ;無効の表示
mov ah,09h
int 21h
mov dx, offset m_a20
mov ah,09h
int 21h
mov ah,05h ;A20を有効化
int 2fh
test ax,01h ;有効化できたら
jz a20_activeok ;a20_activeokにジャンプ
mov dx, offset m_a20activeng
jmp disp_a20
a20_activeok:
mov dx, offset m_a20ok
jmp disp_a20
a20_aru:
mov dx, offset m_a20ok
jmp disp_a20
disp_a20:
mov ah, 09h
int 21h
mov ax,4c00h
int 21h
code ends
end start
結果
次のようになりました。
XMSドライバが存在します。
HMAに16byte要求し失敗しました。
A20は有効です。
ちなみに,vmapの結果は次の通りです。
(HMAのところだけ)
VMAP Version 2.01 Copyright (C) 1989-91 by c.mos
----- XMS ver2.00 -----
HMA used: 57 KB by DOS