スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


続・X68000 エミュレータ xkeropiのMPUコアをC言語化する

そんな訳で、X68000エミュレータ xkeropi のMPUコアC言語化の続きです。

早速ですが386アセンブリ版コアとC言語化版コアとの実行トレース結果を比較した結果、起動から約30万ステップ後に差分がどばっとでてきました。

まずは386版コアの差分近くのトレース

D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FE6 SR:0027
<027C> (00FF61DA ->) 00FF616A : andi #$f8ff, SR
D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FE6 SR:0020
<221F> (00FF616A ->) 00FF616E : move.l (A7)+, D1
D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FE0 SR:0026
<2F08> (00FF616E ->) 00FF1344 : move.l A0, -(A7)
D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FDC SR:0026
<41F9> (00FF1344 ->) 00FF1346 : lea $9b4.l, A0


そしてC言語版コアのトレース

D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FE6 SR:0027
<027C> (00FF61DA ->) 00FF616A : andi #$f8ff, SR
D0:00000081 D1:00000072 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FE6 SR:0020
<221F> (00FF616A ->) 00FF616E : move.l (A7)+, D1
D0:00000081 D1:00000000 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FEA SR:0020
<4E75> (00FF616E ->) 00FF6170 : rts
D0:00000081 D1:00000000 D2:0000FFFF D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:0000081C A1:00FF0ECA A2:00000000 A3:00000000 A4:00E840C0 A5:00000000 A6:00000000 A7:00001FEE SR:0020
<33FC> (00FF6170 ->) 00FF1AFE : move.w #$ffff, $a0e.l


最初の2,3行は同じなのですが、途中から全然違ってきます。
細かく見てみましょう。
まず、どちらも以下の命令を実行しています。

andi #$f8ff, SR

Z80のアセンブリしか分からないひっそりぃが68000アセンブリ言語の解説をするのもあれですが、SR(ステータスレジスタ)と0xf8ffとのandを取っています。
つまりSRの8-10bit目を0に落としている。この命令実行後、トレース内のレジスタSR:0027がSR:0020に変化しているのが確認できます。ちなみにMC68000のステータスレジスタは16ビットなのですが、トレース表示内のSR:xxxxは上位8ビットを表示しており、実際は0x27xxが0x20xxと8-10bit目が正しく0になっています。

その後、どちらのコアも「move.l (A7)+, D1」を実行しています。

その次の行が全然違う。386版コアの方は00FF616E番地から突然00FF1344番地に飛び、命令を実行していますが、C言語版コアの方は順当に次の命令を実行、rtsでサブルーチンの呼び先に戻って命令を続行していきます。
しかも386版コアはSRの値が20xxから26xxに突然変わっている。

一見すると386版コアの方がおかしな動作の様に見えますが、386版コアのxkeropiはちゃんと動作しています。かたやC言語版コアのxkeropiは画面に何も表示されない。

実はひっそりぃには心当たりがありました。前回の記事でも書いたのですが、IRQのハンドリングのところをちゃんと書いていないので動かない自信がある、と。そしてステータスレジスタSRの8-10bit目はまさに割り込みマスクのビットなのでした。
つまり386版コアは、割り込みマスクが7でNMI(ノンマスカブルインターラプト)以外の割り込みが禁止されている状態だったのを「andi #$f8ff, SR」することで割り込み禁止が解除されたので、正しく割り込み動作を実行しており、突然実行番地が飛んでいる様に見えたのでした。かたやC言語版コアはIRQハンドリングが正しく動いていない。

...なので修正。実行。

を、変化がでました。コンソールに以下の表示が。

xkeropi: x68k/mem_wrap.c:576: BusError: Assertion `0' failed.
Aborted (core dumped)


うひょひょ、新たな敵が現れたようです...今度はxkeropi自身が死んでいるので、デバッガで追えそうです。
なかなかすんなりとは動いてくれませんねぇ。

というわけで、続く。


Comment

コメントの投稿


管理者にだけ表示を許可する

Trackback

http://hissorii.blog45.fc2.com/tb.php/217-460b235d

«  | HOME |  »

プロフィール

ひっそりぃ

Author:ひっそりぃ
Twitter:@hissorii_com
GitHub:hissorii


月別アーカイブ


最新記事


カテゴリ



最新コメント


最新トラックバック




RSSリンクの表示


Amazon


QRコード

QRコード

Amazon


ブログランキング

ブログランキング【くつろぐ】
にほんブログ村 ゲームブログ×PlayNCBlogへ

メールフォーム

名前:
メール:
件名:
本文:


カウンタ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。