久々の投稿です。最近はC#でx86のエミュレータを作っていて、なかなか時間が取れませんでした。今回はこのx86エミュレータに関して少し書いてみようと思います。
ことの発端はd-kamiさんの「Javaで作る超簡易x86エミュレータ」(http://www.slideshare.net/d-kami/java-24934130)のスライドでした。Managedな言語で書かれたエミュレータははたしてどの程度の性能がでるのか?という疑問を抱きながらいろいろ検索してところ、JavaやC#で書かれたエミュレータが結構ありました。もちろんVirtualBoxやBochsのような本格的x86エミュレータではありませんが、DOSBoxのようなMS-DOSエミュレータである「Aeon 」(http://www.aeonemulator.net/)や「JPCSP」(http://jpcsp.org/)などはすでに実使用に十分な性能を発揮しているそうです。
CPU、つまりハードウェアをエミュレートするためにはそのハードウェアの動きを知る必要がありますが、そのためにIntelのアーキテクチャーマニュアルや「はじめて読む8086」「はじめて読む486」「The 80×86 Family」などの本を購入して読んでいます。
今回作るx86エミュレータの目的は以下のとおりです。
- C#で作成
- unsafeコードを使わない (.Net Frameworkが動くシステムではどこでも動くように)
- 486をエミュレートする
- Windows 95 (98)を動かせる
まだまだ始めたばかりなので、ほぼ何もできてない状態ですが、一度始めた以上最後までやってみたいと思います。
現在開発用のコンソールプログラムができて、バイナリファイルを仮想メモリに読み込んで表示させたり、レジスタを操作したり、Opcodeを一個一個実行したりできる状態です。見た目はMS-DOSのデバッグツールである「DEBUG.COM」をモチーフにしました。
昨日と今日の休日を全部使って16bitモード時のMOV命令を実装しました。テストには「NASM」を使ってアセンブルと逆アセンブルしたりしていますが、いつかは「DEBUG.COM」のようにコンソール上でアセンブルができるようにできたらいいなと思います。
ではまた制作状況が進展したら投稿します。