自作PC-XTエミュレータでFreeDOSが起動しません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taka
記事: 34
登録日時: 10年前
住所: 三重県

自作PC-XTエミュレータでFreeDOSが起動しません

#1

投稿記事 by taka » 8年前

PC-XTエミュレータを製作中なのですが、FreeDOSがどうしても起動しません。
手本にした8086tinyでは動いているのですが、自作のエミュレータだとBad or missing command interpreter のエラーが出ます。
思いつく限りはやってみたんですが、どうしても動きませんでした。
だれかわかる方 ご教授お願いします。

http://www1.axfc.net/u/3639664
↑ソースなど一式
xtvm/ が 自作エミュで
8086tiny-master/ が 8086tinyで
softx86/ が使用している8086エミュライブラリで(少し手を加えたので同梱)
nasm-2.12.01/bios.asm が 使用しているBIOSのソースです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作PC-XTエミュレータでFreeDOSが起動しません

#2

投稿記事 by みけCAT » 8年前

この問題の原因かはわかりませんが、とりあえずADD命令でのフラグの設定がおかしいようですね。
例えばadd.cの最初の方にあるsx86_ubyte op_add8関数を見ると
softx86/softx86/add.c さんが書きました:

コード:

/* if carry/overflow */
	if (ret < src)
		ctx->state->reg_flags.val |=
			 (SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
	else
		ctx->state->reg_flags.val &=
			~(SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
となっており、キャリーフラグとオーバーフローフラグが必ず一致するようになっていますが、これは明らかにおかしいでしょう。
add.cの他の関数にも同様のおかしい処理が書かれていました。

また、パリティフラグは計算結果の最下位バイトに含まれているビット1が偶数個の場合1に、奇数個の場合0になるはずなのに、
add.cのsx86_uword op_add16関数などではなぜか下から2バイト目も計算に含めてしまい、結果がおかしくなっています。

例えば、様々なエミュレータで以下のプログラムを実行し、出力結果をまとめると、

コード:

                 |     ODITSZ A P C
Bochs            | 0000000000010011
VirtualBox       | 0000001000010011
xtvm             | 0000100000010101
8086run          | 1111000000010011
8086インタプリタ | 0000000000010011
となり、xtvmだけOFとPFの値が違っていることがわかります。

8086run
8086インタプリタ

プログラム (nasm 2.11.08で確認)

コード:

cpu 8086
bits 16
org 0x7c00

start:
	; スタックポインタとセグメントレジスタの初期化
	mov sp, 0x7ff0
	xor ax, ax
	mov ds, ax
	mov es, ax
	mov ss, ax
	jmp 0x0000:main
main:
	; 0x7fff + (-1) の計算をする
	mov ax, 0x7fff
	mov bx, 0xffff
	add ax, bx

	; フラグレジスタの内容をスタックに保存する
	pushf

	; 各フラグの位置を出力する
	mov si, flaglabel
strloop:
	mov al, [si] ; 次の文字をとみ込む
	test al, al
	jz strloopend ; ゼロなら終わり
	mov ah, 0x0e ; 一文字表示コマンドを設定
	xor bx, bx
	int 0x10
	inc si ; 次の文字へ進む
	jmp strloop
strloopend:

	; フラグレジスタの内容を出力する
	pop ax ; スタックに保存したフラグレジスタの内容を読みだす
	mov cx, 16 ; ビット数
printloop:
	rol ax, 1 ; 表示するビットを最下位に持ってくる
	push ax ; データのバックアップを取る
	and ax, strict word 1 ; 最下位のビットを取り出す
	add ax, 0x0e30 ; 数字に変換し、一文字表示のコマンドを設定
	xor bx, bx
	int 0x10
	pop ax ; バックアップしたデータをリストアする
	loop printloop

	; 終了
hltloop:
	cli
	hlt
	jmp hltloop
	ret

	; フラグのラベル
flaglabel:
	db "    ODITSZ A P C", 13, 10, 0

	; おまじないの位置を合わせる
times 510 - ($ - $$) db 0x90
	; ブータブルディスクとして認識させるおまじない
	db 0x55
	db 0xaa

	; FDイメージの残りの部分
times 1474560 - ($ - $$) db 0x00
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taka
記事: 34
登録日時: 10年前
住所: 三重県

Re: 自作PC-XTエミュレータでFreeDOSが起動しません

#3

投稿記事 by taka » 8年前

みけCATさん情報ありがとうございます。
その部分を修正してみたのですが、動作は変わりませんでした。
それと、MS-DOSで試してみたんですが、 3.3 4.01 5.0 は動作することがわかりました。
言い忘れていましたが、SDLのウィンドウと一緒に出るコマンドプロンプト画面で tキー を押すと
簡易操作コンソールに入ります。
コマンドも載せておきます。
fda : フロッピーイメージ変更 打ち込んだらファイル名を聞かれるので入力してEnterです。
dbg : デバッグモード切替 メモリのダンプを取るように設定します。これのあとは一回下記のresetコマンドを打つといいかもです。
reset : vmリセット int 19hしてるだけなので不完全かもです。
dbgout : メモリダンプをdebug.logに出力します。(プログラム部分のみ) 命令長無視してるので [ 〇 bytes unfeched ]がいっぱいファイル内に出ます。

閉鎖

“C言語何でも質問掲示板” へ戻る