C#でx86エミュレータを作る

久々の投稿です。最近は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」をモチーフにしました。

emulator_shot1

 

昨日と今日の休日を全部使って16bitモード時のMOV命令を実装しました。テストには「NASM」を使ってアセンブルと逆アセンブルしたりしていますが、いつかは「DEBUG.COM」のようにコンソール上でアセンブルができるようにできたらいいなと思います。

ではまた制作状況が進展したら投稿します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).