JDOSとDOS/VのBIOS識別方法 [PS/55]
JDOS依存のアプリケーションを作るにあたって、安全対策として画面モードではなくDOSの種類を識別する必要があった。日本IBMによるDOS/VのBIOSインターフェース技術解説書によれば、DOS/VとJDOS(上の図ではPS/55 DOS)の識別はINT 15h, AX=4900hが使えると記載されているが、果たしてこれが本当に機能していたのか怪しい。少なくとも私が調べた限り、JDOSではこのファンクションはサポートされていない。
INT 15h,AX=4900h | INT 7Dh | |
---|---|---|
DOS J5.02/V | CY=0, AH=0, BL=0 | 0以外 |
DOS J5.02 | CY=1, AH=86h | 0以外 |
DOS 5.02 | CY=1, AH=86h | 0 |
PS/55のBIOS ROM側にこのファンクションが用意されていた可能性はあるが、もしそうだとすると、PS/55でPC DOSを動かしてもJDOSの判定が返ってくることになるのでは。あるいは、BIOS ROM側にJDOSとPC DOSを区別する方法が備わっているのか。そんな回りくどいことをやるとは思えない。
よって、INT 15hで正しい値が返ってくるのはDOS/Vのみ。英語DOSとJDOSの区別はInt 7Dhの割り込みベクターが0かそれ以外かで識別する。DOS/VもINT 7Dhに値を持っているので、INT 7DhだけではDOS/VとJDOSの区別が付かない。
NASM用に書いたコードを置いておく。
;Copyright (c) 2023 akm
;This content is under the MIT License.
;THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND.
mov ax, 0x4900
int 0x15
jc init_ChkDOS2
cmp ah, 0
jne init_ChkDOS2
cmp bl, 1
jne exit;this works for DOS/V only?
jmp init_ChkDOSok
init_ChkDOS2:
;check Int 7Dh vector is not 0 (if it is then PC DOS)
mov ax, 0x357D
int 0x21
cmp bx, 0
jne init_ChkDOSok
mov ax, es
cmp ax, 0
jne init_ChkDOSok
jmp exit;this works for non-IBMJ DOS
init_ChkDOSok:
;JDOSの場合はここ
exit:
;それ以外の場合はこちらにジャンプ