スポンサーサイト

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


とりあえずX68000エミュxkeropiのMPUコアをC言語化してみた

そんな訳で、xkeropiのx86アセンブリで書かれたMC68000コアをC言語版コアに置き換えてみました。
あ、先に言っておくとまだちゃんと動いていませんが。
PSPやAndroidでX68000エミュレータが動作するようになるのは、もう少し先になりそうです。
今回は、現状どんだけ動いていないの的な、あるいはどんだけ動いているの的な話になります。

組み込んだのはNJ氏作のPSP用CPS2エミュで使われているMPUコアです。ちょっとググってみたら手持ちの物より新しい「njemu_source_20071028_231dev.zip」というソースが見つかったのでそれを組み込みました。
使うのはcpu/m68000以下のファイルのみですが。

Stephane Dallongevilleさんという方が作られたC68KというMC68000コアなのですが、結構いろいろなエミュレータで使われているようですね。

で、最初はコンパイルだけ通そうと思っていたのですが、気が付いたらかなり適当ですがコアを入れ替えるところまでえいやっとやってしまいました。IRQのハンドリングとか適当すぎてちゃんとは動かない自信がありますが。

実際に動作させてみると、coreでも吐いてくれればデバッグしやすいのですが、画面になにも表示されないだけでそれなりに動いているっぽい。ウィンドウに表示されるfpsとかMHzとかそれっぽい値で変化しているし。
こうなると逆にデバッグが難しいのですが、keropiにはMPUのステップ毎にファイルに出力するコードがあったのでこれを有効にして実行してみました。

まず386版コアの最初の数ステップ

D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<46FC> (00000000 ->) 00FF0010 : move #$2700, SR
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<4FF9> (00FF0010 ->) 00FF0014 : lea $2000.l, A7
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<4E70> (00FF0014 ->) 00FF001A : reset
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<203C> (00FF001A ->) 00FF001E : move.l #$ff0540, D0


次にC言語版コアの最初の数ステップ

D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<46FC> (00000000 ->) 00FF0010 : move #$2700, SR
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<4FF9> (00FF0010 ->) 00FF0014 : lea $2000.l, A7
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<4E70> (00FF0014 ->) 00FF001A : reset
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<91C8> (00FF001A ->) 00FF001C : suba.l A0, A0
D0:00000000 D1:00000000 D2:00000000 D3:00000000 D4:00000000 D5:00000000 D6:00000000 D7:00000000 CR:0000
A0:00000000 A1:00000000 A2:00000000 A3:00000000 A4:00000000 A5:00000000 A6:00000000 A7:00002000 SR:0027
<203C> (00FF001C ->) 00FF001E : move.l #$ff0540, D0


CRについては、386のEFLAGS(キャリーフラグ等の状態フラグを保持するレジスタ)を表示させているのですが、C言語コアには該当するものが当然なく、diffを取ると差分が必ず出てしまうので、常に0000となるように変更。
で比べてみるとそれなりにちゃんと動いています。番地からしてIPL内のプログラムのようですね。
ところが、いきなり4ステップ目に差異が。

reset命令の実行後、アセンブリコアは4バイト先の00FF001E番地の命令を実行していますが、C言語コアのほうは2バイト先の00FF001C番地の命令を実行している。resetは4e70で2バイト命令っと。
うむ。むむ。むむむ。

オリジナルのアセンブリ版コアの方が間違っとるやないかーい。

アセンブリ版コアだと「suba.l A0, A0」という行がすっ飛ばされますね。Z80のアセンブラしかわからないひっそりぃですが、A0からA0を引き算してA0レジスタを0にする、という意味っぽいですね。たまたまA0レジスタは元から0なので問題ないのか。

この数十万ステップ後に大量の差分が出てくるのですが、力尽きたので今日はここまで。


Comment

コメントの投稿


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

Trackback

http://hissorii.blog45.fc2.com/tb.php/216-8216577c

«  | HOME |  »

プロフィール

ひっそりぃ

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


月別アーカイブ


最新記事


カテゴリ



最新コメント


最新トラックバック




RSSリンクの表示


Amazon


QRコード

QRコード

Amazon


ブログランキング

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

メールフォーム

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


カウンタ


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