プチZ80 開発その1
何をとち狂ったか、急にプチコンでZ80エミュレータを作ろうと思い立った。
前にも書いたけど、Tiny野郎さんがエミュレーション的なコードでP6の3Dゴルフシミュレーションをプチコン移植したとのことだったので、可能は可能なのだろうと思った。
それでZ80の解説記事を読み漁っているうちに面白くなってきてしまったので、本格的に製作にとりかかってしまった。
世の中にはZ80エミュレータのコードなどくさるほどあるので、効率からすれば使えそうなコードを移植するのが一番いい。
が、自分がやりたいのは、Z80、というかマイクロコンピュータの勉強なんである。
Z80のエミュを作る過程において、マイクロコンピュータの勉強をしたいだけなんである。
そのため、コードは完全にゼロから作ることとした。
なにしろ、Z80の機械語は、パソピア7の時代にちょろちょろっと触っただけで、本格的に使ったことはない。それを今から勉強しようというのです。結構、大変なことが予想される。
上記のとおり、勉強が目的なので、実用的な面は求めない。
最終的には、簡単そうな特定の8ビットPCをエミュレーションしてみたいが、それが実用的なスピードで動くとはとても思えない。
大雑把に考えて、実機の10〜100倍程度遅いものになると考えられる。
それでも単に作ってみたいので作ってみることにする。
...
現状は、資料を読み漁りながら、メモリ、レジスタ、スタックなどを書いてみた。
今のところ、以前にBrainFuckインタプリタを書いたことが思いのほか役立っている感じ。BrainFuckは超簡単な仮想マシンだからね。
GRPをメモリとしてみなすんだけど、GRPの横幅がちょうど256なので、HLレジスタの上位下位がY座標X座標に分かれて簡単になるので、ちょっと感動(?)。
こんな感じ。
''MEMREAD_HL_8 8bit Read ''I: R(4)<=Address High 8-15bit, R(5)<=Address Low 0-7bit ''O: R(6)<=Read Data @MEMREAD_HL_8 R(6)=GSPOIT(R(5),R(4)) RETURN ''MEMWRTIE_HL_8 8bit Write ''I: R(4)<=Address High 8-15bit, R(5)<=Address Low 0-7bit, R(6)<=Write Data ''O: Nothing @MEMWRITE_HL_8 GPSET R(5),R(4),R(6) RETURN
R(4),R(5)がH,Lレジスタ、R(6)が(HL)を表すことにした。
実際には、GRPは48KBしかないので、複数のGRPをまたがるように処理しないといけないんだけど、とりあえずは48KBのメモリしか載せてないと思って簡単に。
しかし、フラグレジスタの各ビットのフラグの扱いがよくわからない...。
もうちょっと調査が必要そうだな。