エミュレータを作る!
昔からの夢でエミュレータは作ってみたいと思っていました。
でもエミュレータを作るにはそのハード(CPUや周辺機器など)を事細かく知っていなければなりません。
ハードルは高いのですが、憧れは止まりません。
普段MSXPENを使いまくっていますが、JavaScriptでも実用的な速度になるのでへっぽこなプログラム技術でもなんとかなるのではと思ってしまいました。
前置きはさておき、とりあえずCPUだけでもエミュレーションしてみることにします。
完成した暁にはいろいろな実装実験してみたいと思います。
プログラム
作成環境はwindows10上のubuntuのgccが使いやすいのでコマンドラインでコンパイルしています。
ソースコードはgithubに上げましたのでこちらを参照。
まだ未完成ですので色々問題があります。(汗)
速度はどれくらいでるのか?
自作エミュレータのパフォーマンスは気になるものです。
そこで簡単なテストを行って環境ごとに比較してみました。
まずmsxpen上でZ80とR800で動かして実機相当の速度を計測します。
PC上でエミュレータの速度を計測します。
PCはsurface go(1.6GHz)です。
それと本命のRaspberry pi picoで動作させます。
MSXPenで実行するソースは以下の通り。
org 0c000h
LD DE,10
LOOP1:
LD BC,0
LOOP2:
DEC BC
LD A,B
OR C
JP NZ,LOOP2
DEC DE
LD A,D
OR E
JP NZ,LOOP1
RET
msxpenのBASICコードは以下を記載して実行する。
10 clear200,&hbfff
20 bload"program.bin"
30 defusr=&hc000
35 time=0
40 a=usr(0):t=time
50 print t/60
それぞれ環境をMSX2+とturboRに切り替えて実行しました。
実行結果
DEレジスタとBCレジスタの値でループ回数を指定します。
今回は655360回ループで時間を計測しました。
No. | 環境 | 実行時間[sec] | Z80比率 | Z80換算クロック |
---|---|---|---|---|
1 | MSXPEN MSX2+(比較用) | 5.6 | - | 3.58MHz |
2 | MSXPEN turboR(比較用) | 0.86 | 6.6倍 | 23.64MHz |
3 | RPI pico(125MHz) | 4.1 | 1.38倍 | 4.95MHz |
4 | RPI pico(170MHz) | 3.0 | 1.89倍 | 6.77MHz |
5 | Ubuntu(1.6GHz) | 0.0925 | 60.54倍 | 216.73MHz |
Raspberry pi picは標準クロック125MHzとオーバークロック170MHzで計測しました。
PCが一番速いとして、picoはクロック数の割にはスコアが伸びていません。
原因が分かりませんが、メモリが遅いのでしょうか?
CPUはキャッシュメモリがないし・・・。
エミュレータの完成度が上がったらまたテストしてみます。