プチZ80 開発その2 (レジスタの設計)
昨晩、pmanさんとツイッターで話したら、速度は実機の1/100もでなさそうなことがわかった。おそらく、Z80部分で1/100〜1/1000、実機エミュ部分はさらにそれ以上遅くなると思う。
もちろん、実用性は気にしないで速度は度外視なのでよいのだが、あらためて実機の速度で動かすのはむずかしそうだとわかった。
とりあえず、実機のエミュでなくすごく簡単な仮想的なマシンのIOを作れば?とアドバイスをもらったので、まずはそれを目指してみる。
実用性はないので、成果品にはそれほど意味はないのだが、ほとんどのエミュはZ80のエキスパートが作っていると思うので、Z80の初心者が勉強しながらその結果を残しておくと、後で資料としてはそれなりに役に立つのではないかと思う。
さすがにZ80は広く普及しているだけあって、まだ一冊も本を買っていないが、Webの情報だけでだいたいの内容を知ることができた。
現在参考にしているものは以下のとおり。
<参考資料>
Z80アセンブリャ講座 -入門編-
'http://www.systemax.jp/doc/Z80_text.html
Z80教室
http://njprog.com/z80_room.htm
Z-80仕様まとめ
http://d.hatena.ne.jp/Tnzk/20080318/1205820286
OPコード秘話
http://njprog.com/z80_002.htm
CPU Z80の設計 その1
http://www.ne.jp/asahi/yikai/class/schools/verilog/Z80_1.pdf
Z80命令説明書
http://www.alles.or.jp/~thisida/nd3setumeisyo/nd3_z80meirei.pdf
MSX2 TECHNICAL HANDBOOK
http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=FrontPage
Z80命令表
http://www.infonet.co.jp/ueyama/ip/software/z80_command.html
■レジスタの設計
前述の「Z80教室」や「CPU Z80の設計 その1」によると、Z80のオペコードは3bitごとに読むと操作対象レジスタ等の意味が明確になるとのことだった。
例えば8ビット演算命令については、オペコードの2進表現が
(aabbbccc)
となっているとして、cccがレジスタを表す。
例えば、ADD A,B のオペコードは &H80 で、2進表現は(10000000)。
下位3ビットの(000)がレジスタBを表している。
これに基づくと、レジスタを配列にしておくと、オペコードと簡単に対応させることができる。
左がZ80のレジスタ名、右がプチコンの変数名(配列)である。
'B : R(&B000) = R(0)
'C : R(&B001) = R(1)
'D : R(&B010) = R(2)
'E : R(&B011) = R(3)
'H : R(&B100) = R(4)
'L : R(&B101) = R(5)
'(HL): R(&B110) = R(6)
'A : R(&B111) = R(7)
ところでプチコンでは、単純変数と配列変数の間には、実行速度に2〜3倍程度の差があること思い出される。
一応設計としては、(1)速度を犠牲にして簡明さをとる、(2)速度をとって記述を冗長にする、の2つが考えられる。
Aレジスタであれば、変数名を「RA」とするなどだ。この場合、レジスタの数だけコード量が増えるが、多少の高速化は可能だ。
しかし、今回は(1)をとり、配列で持つことにする。
もちろん、最初の方針のとおり、まずは勉強が目的であるし、この方が最初の完成までは早いからだ。
どうしても速度を出したい欲が出てきた時には、コードを全面書き換えしなおしてもよい。
ということで方針も明確に決まった。