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のソースです。
自作PC-XTエミュレータでFreeDOSが起動しません
Re: 自作PC-XTエミュレータでFreeDOSが起動しません
この問題の原因かはわかりませんが、とりあえずADD命令でのフラグの設定がおかしいようですね。
例えばadd.cの最初の方にあるsx86_ubyte op_add8関数を見ると
add.cの他の関数にも同様のおかしい処理が書かれていました。
また、パリティフラグは計算結果の最下位バイトに含まれているビット1が偶数個の場合1に、奇数個の場合0になるはずなのに、
add.cのsx86_uword op_add16関数などではなぜか下から2バイト目も計算に含めてしまい、結果がおかしくなっています。
例えば、様々なエミュレータで以下のプログラムを実行し、出力結果をまとめると、となり、xtvmだけOFとPFの値が違っていることがわかります。
8086run
8086インタプリタ
プログラム (nasm 2.11.08で確認)
例えばadd.cの最初の方にあるsx86_ubyte op_add8関数を見ると
となっており、キャリーフラグとオーバーフローフラグが必ず一致するようになっていますが、これは明らかにおかしいでしょう。
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
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で殴ればいい!(死亡フラグ)
Re: 自作PC-XTエミュレータでFreeDOSが起動しません
みけCATさん情報ありがとうございます。
その部分を修正してみたのですが、動作は変わりませんでした。
それと、MS-DOSで試してみたんですが、 3.3 4.01 5.0 は動作することがわかりました。
言い忘れていましたが、SDLのウィンドウと一緒に出るコマンドプロンプト画面で tキー を押すと
簡易操作コンソールに入ります。
コマンドも載せておきます。
fda : フロッピーイメージ変更 打ち込んだらファイル名を聞かれるので入力してEnterです。
dbg : デバッグモード切替 メモリのダンプを取るように設定します。これのあとは一回下記のresetコマンドを打つといいかもです。
reset : vmリセット int 19hしてるだけなので不完全かもです。
dbgout : メモリダンプをdebug.logに出力します。(プログラム部分のみ) 命令長無視してるので [ 〇 bytes unfeched ]がいっぱいファイル内に出ます。
その部分を修正してみたのですが、動作は変わりませんでした。
それと、MS-DOSで試してみたんですが、 3.3 4.01 5.0 は動作することがわかりました。
言い忘れていましたが、SDLのウィンドウと一緒に出るコマンドプロンプト画面で tキー を押すと
簡易操作コンソールに入ります。
コマンドも載せておきます。
fda : フロッピーイメージ変更 打ち込んだらファイル名を聞かれるので入力してEnterです。
dbg : デバッグモード切替 メモリのダンプを取るように設定します。これのあとは一回下記のresetコマンドを打つといいかもです。
reset : vmリセット int 19hしてるだけなので不完全かもです。
dbgout : メモリダンプをdebug.logに出力します。(プログラム部分のみ) 命令長無視してるので [ 〇 bytes unfeched ]がいっぱいファイル内に出ます。