作りたい。

IPLとメモリマップ

X68000のIPLのバイナリファイルIPLROM.DATはこちらから入手:IPL-ROM - 無償公開されたシャープのソフトウェア - ソフトウェアライブラリ - X68000 LIBRARY

その説明によれば、IPLは0xfe0000~0xffffffに配置されるとのこと。

X68k:PM - Data Crystalによると、

注意 リセット直後のみ $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
ff0014: 4f f9 00 00 20 00  lea     $2000.l, A7
ff001a: 4e 70              reset
ff001c: 91 c8              suba.l  A0, A0
ff001e: 20 3c 00 ff 05 40  move.l  #$ff0540, D0
...
  • SR: ステータスレジスタ。上位8ビットのシステムコントロールエリアの初期化
  • reset: ハードウェアのリセット

MC68000のエミュレーションを動かしてみたいが

  • px68kで使われているソースm68000を動かしてみようとコンパイルしてみたが、実行環境のポインタをUINT32と相互変換したりしていて、コンパイルエラーが出てしまう。
  • d68k.cという、逆アセンブラは動かせたので、0x0000から0xffffまで命令を逆アセンブルして表示してみる
  • IPLROM.DATの内容をPC(=0xff0010)から2バイト読み込み命令を実行する。実装してない命令が出てきたらassertで落とすようにしておいて、順に実装していく。

リンク