作りたい。
IPLとメモリマップ
X68000のIPLのバイナリファイルIPLROM.DATはこちらから入手:IPL-ROM - 無償公開されたシャープのソフトウェア - ソフトウェアライブラリ - X68000 LIBRARY
その説明によれば、IPLは0xfe0000~0xffffffに配置されるとのこと。
注意 リセット直後のみ $0000~$ffff は $ff0000~$ffffff と同じ内容が読める.
ということなので、MC68000のアドレス0x000000からはファイルの0x010000からが見えることになる。
MC68000の起動シーケンス
EASy68K • View topic - M68000 Startup Code Question (Newbie) によれば、MC68000は起動時に0x000000から4バイトをA7(SP)に、次の4バイトをPCに取り出して実行を開始するらしい。
IPLROM.DATをxxd
コマンドでダンプした内容:
0010000: 0000 2000 00ff 0010 203c 1087 0507 4e75 .. ..... <....Nu |
- SP=0x002000, PC=0xff0010となる
IPLプログラムの解析
PC=0xff0010
から実行開始ということで、コードをダンプしてみてみる(ファイルでは0x010010から):
ff0010: 46fc 2700 4ff9 0000 2000 4e70 91c8 203c F.'.O... .Np.. < |
- MC68000の命令セットは16bit単位で、最初の2バイトによって命令が決まり、何バイトの命令か決まる
逆アセすると
ff0010: 46 fc 27 00 move #$2700, SR |
SR
: ステータスレジスタ。上位8ビットのシステムコントロールエリアの初期化reset
: ハードウェアのリセット
MC68000のエミュレーションを動かしてみたいが
- px68kで使われているソースm68000を動かしてみようとコンパイルしてみたが、実行環境のポインタを
UINT32
と相互変換したりしていて、コンパイルエラーが出てしまう。 - d68k.cという、逆アセンブラは動かせたので、0x0000から0xffffまで命令を逆アセンブルして表示してみる
- IPLROM.DATの内容をPC(=0xff0010)から2バイト読み込み命令を実行する。実装してない命令が出てきたらassertで落とすようにしておいて、順に実装していく。
リンク
- IPL-ROM - 無償公開されたシャープのソフトウェア - ソフトウェアライブラリ - X68000 LIBRARY
- Data Crystal
- MOTOROLA PROGRAMMER’s REFERENCE MANUAL
- ひっそりぃドットコム とりあえずX68000エミュxkeropiのMPUコアをC言語化してみた
- SCHG:68000 ASM-to-Hex Code Reference - Sonic Retro ニーモニックとマシンコードの対応表
- Index MC68000のアセンブラの命令の動作説明