PIC

オマケ: ZK-MIPS mini (TK-80風、MIPS32 トレーニングキット)

2013年7月27日

ZK-80 miniではMIPS32 CPUを内蔵したPIC32MXに、8080 CPUをエミュレーションさせている。MIPS32を内蔵した石であれば、MIPS32のプログラムを動かせるだろうということで、作ってみた。MIPSの命令を、ハンドアセンブルできる人限定のツール(笑)。


使用方法は、TK-80とほぼ同じ。メモリーは、0xA0000800-0xA0001FFFの6 kBが使用可能(ディスプレイに表示されるのは、下位16ビットのみ)。ただし、0xA0001FF8-0xA0001FFFは、LED表示データー領域である。次のサブルーチンが使用可能。
・アドレス0xA0000700  アドレス・データレジスタ表示(引数:$v0)
・アドレス0xA0000710  キー入力(入力があるまで待つ;戻り値:$v0)
・アドレス0xA0000720  キー入力(入力がなくてもただちに戻る;戻り値:$v0)
・アドレス0xA0000730  4.5 msタイマー
・アドレス0xA0000740  9 msタイマー
・アドレス0xA0000750  27 msタイマー

ZK-80 miniとハードは全く同じなので、インターフェース(LEDとキーボード)部分は、全く同じコードを使っている。モニタープログラムは、Cで書いた。電源を入れると0xA0000800から以下のサンプルプログラムが入っているので、実行可能である。
0xA0000800 0x24100049 addiu $s0,$zero,0x49
0xA0000804 0x3C11A000 lui   $s1,0xA000
0xA0000808 0x24120000 addiu $s2,$zero,0x00
0xA000080C 0x24130000 addiu $s3,$zero,0x00
0xA0000810 0x02519021 addu  $s2,$s2,$s1
0xA0000814 0xA2501FF8 sb    $s0,0x1FF8($s2)
0xA0000818 0x0C0001D4 jal   0xA0000750
0xA000081C 0x00000000 nop
0xA0000820 0x26730001 addiu $s3,$s3,1
0xA0000824 0x3273000F andi  $s3,$s3,15
0xA0000828 0x1660FFFB bne   $s3,$zero,-20
0xA000082C 0x00000000 nop
0xA0000830 0xA2401FF8 sb    $zero,0x1FF8($s2)
0xA0000834 0x26520001 addiu $s2,$s2,1
0xA0000838 0x32520007 andi  $s2,$s2,7
0xA000083C 0x1000FFF4 b     -48
0xA0000840 0x00000000 nop

ZK-MIPS miniを作成するにあたり、ずいぶん悩んだのが、main.cの初期化ルーチンに書いた次の部分に関して。
	// Make RAM executable.
	mBMXSetRAMKernProgOffset(0x700);
	mBMXSetRAMUserDataOffset(0x2000);
	mBMXSetRAMUserProgOffset(0x2000);
プログラムのほとんどの部分は手がかからずに簡単に書けたのだが、最後の難関がRAMに書き込んだプログラムを実行するところであった。どうやらPIC32MXでは、セキュリティーのためだと思われるが、実行プロセスがRAM領域に移ると、例外で停止するようだ。WindowsのDEP(Data Execution Prevention)のような物だろう。これを解除するために必要なコードが、上に書いた部分。他に勉強になったのは、PIC32MXでは実行権限にカーネルとユーザーと2つ在るようで、カーネルの実行かユーザーの実行かでも区別できるようになっているということ。組込みマイコンとはいえ、32 bitともなると、色々出来るようになっているようである。

ZK-MIPS mini ver 0.1はここからダウンロードできます。

コメント

e.naka (2013年8月1日 18:59:13)

もし、KM-Z80も、MIPS32命令で直にBASICを走らせられたら高速化する?

Katsumi (2013年8月1日 20:52:48)

e.nakaさん、こんにちは。

MIPS32は、48 MHzで走っていますからね。ビデオシグナルの作成にかなり取られますが、それを差し引いても、30 MHzぐらいの速度で32 bitの石が動いているわけですから、2 MHzで動く8 bitの石とは比べ物にならないはずです。MZ-80Kからはなれて、そういうプログラムをしたら、面白いかもしれませんね。

あと、Z80の速度を2 MHzに合わせるルーチンを削除すれば、3 MHzぐらいの速度にはなりますよ。

コメント送信