Image: 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:
	;それ以外の場合はこちらにジャンプ

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!