2009-11-24 9 views
6

学習目的のために、私は8051マイクロコントローラエミュレータを構築するつもりです。私はC/C++/C#でのプログラミングが快適です。これはクラスプロジェクトではなく、私の側からの学習イニシアチブです。8051エミュレータの作り方

私はこれについて議論するかなりの質問を見つけました。しかし、実際にコードを書き始める前に、どの領域をフォーカスする必要があるのか​​を知るために、細かいレベルで少し壊したいと思っていました。

私の最初の要件は次のとおりです。ユーザーはアセンブリコードを書くことができます

  1. テキストエディタ(エディットボックスコントロールを使用することができます)

  2. 検証構文が正しいかどう

  3. は小さなウィンドウを持っています実行時にレジスタ値を表示します。

  4. ユーザーがプログラムを起動したときに、手順はレジスタウィンドウを段階的に更新する必要があります。

私は、マイクロコントローラをエミュレートする方法をもっと知りたいと思っています。

私は理解して道私はさらにそれを打破することができます

  1. 私は命令または使用可能な命令を格納し、構文を検証するためにいくつかの他の方法のためのルックアップテーブルを持っている必要があります。これを実装する方法については、私に教えてください。

  2. 8051の各命令をエミュレートするにはどうすればよいですか?

  3. レジスタの場合、タイプに基づいて符号なし整数を使用してテーブルを更新できます。

  4. マイクロコントローラにはRAMメモリが限られているので、オーバーフローやその他の問題を避けるためにメモリ内で実行されているコードの長さやコードを確認するにはどうすればよいですか?

エミュレータがどのようにビルドアップされているかを詳しく説明するいくつかのopensourceプロジェクトがある場合は、ご理解ください。

+2

@Kavitech Singh。あなたのプロジェクトはどうですか? –

答えて

7

私はこのプロジェクトの範囲について、少なくともタイトルに関連して少し不明だと思います。

エミュレータは、バイナリコードを実行します。エミュレータにはエディタ(開発ツール)やアセンブラ(同上)は含まれていません。アセンブラはシンタックスチェックと変換を行う必要があります。つまり、エミュレータは事前​​に検証された法的コードを実行するのは比較的簡単です。

完全なIDEを構築したいと思うようです。これは、エディタ、アセンブラ、エミュレータの周りに多くのGUIをラップします。私はそのステップを最後のものとして残します。あなたがエミュレータのワーキングメモリとして(例えば)64Kバイトまでの配列を使用することができます

:エミュレータ自体に関するご質問については


。プログラム内の変数を使用してレジスタをエミュレートします。私はunsigned char *を使用してプログラムカウンタをエミュレートし、intを他のほとんどのものに使用します...

操作はかなり簡単です:0(またはあらかじめ決められた起動場所)でプログラムカウンタを起動し、そのポインタを介して命令をフェッチし、その命令に関連付けられている操作が何であれレジスタおよびメモリに適用するループ。簡単な実装では、すべての可能な命令コードを含む巨大なswitchステートメントを中心に扱います。

私が言ったように、あなたのエミュレータは違法命令を心配する必要はありません。なぜなら、アセンブラは何も生成すべきでないからです。不正な操作に当たった場合、プログラム(メインループ)を停止させることができます。

同様に、エミュレータは、範囲、インデックス、またはサイズのオーバーランを心配する必要はありません。これはアセンブラの問題でも、リンカの問題でもあります。


アップデート:右ここSO中からいくつかのポインタ:

Emulator Framework

+1

少なくとも、それは別々のプロジェクトにしてください。 – ziggystar

+0

Carl: あなたは、私はIDEタイプの環境を探していると言うのは間違いありません。しかし、意図は、構文の強調表示など多くのファンシーなGUI機能を持っていることです。 非常にシンプルにするために、私はメインウィンドウで小さなエディットボックスを使用することができ、ユーザーはいくつかの指示を入力してコードを実行できます。命令が実際にPC上でエミュレート/シミュレートされる方法にもっと興味があります。 –

+0

私はいくつかの詳細を追加しました。それらはあなたの質問のその側面についてあなたを助けるはずです。 –

6

最近、私は一緒にも小型の8ビット・マイクロコントローラであるAVRチップのためのエミュレータを置きます。ソースはGitHubにghewgill/emulinoとしてあります。最も興味深いファイルはcpu.cで、各CPU命令の実装が含まれています。キー行は(いくつかの詳細を省略)cpu_run()である:

while (state == CPU_RUN) { 
    u16 instr = Program[PC++]; 
    Instr[instr](instr); 
} 

これは16ビット・ワードをロードするプログラムメモリからPCレジスタにより指し示さ、命令ジャンプテーブルへのインデックスのようにそれを使用し(これ関数ポインタの64k配列です - 実際のテーブルはコンパイル時にスクリプトによって生成されます)。この関数はそのソースファイルのdo_XXX()関数の1つで、実際の命令を実行する前にさらに命令のデコードを行うことができます。例えば、do_ADD()関数:

static void do_ADD(u16 instr) 
{ 
    trace(__FUNCTION__); 
    // ------rdddddrrrr 
    u16 r = (instr & 0xf) | ((instr >> 5) & 0x10); 
    u16 d = ((instr >> 4) & 0x1f); 
    u8 x = Data.Reg[d] + Data.Reg[r]; 
    Data.SREG.H = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x08) != 0; 
    Data.SREG.V = (((Data.Reg[d] & Data.Reg[r] & ~x) | (~Data.Reg[d] & ~Data.Reg[r] & x)) & 0x80) != 0; 
    Data.SREG.N = (x & 0x80) != 0; 
    Data.SREG.S = Data.SREG.N^Data.SREG.V; 
    Data.SREG.Z = x == 0; 
    Data.SREG.C = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x80) != 0; 
    Data.Reg[d] = x; 
    Cycle++; 
} 

これは、実際の加算演算(Data.Reg[d] + Data.Reg[r])を行い、その結果に基づいて、すべての様々な条件フラグを設定します。

+0

Greg: ありがとうございます。 Visual Studio 2005/2008の下でコンパイルできますか? あなたの仕事を簡単に理解するのに役立つ追加の資料。あなたがエミュレートしたチップについての詳細も? –

+0

これはチップですhttp://www.atmel.com/products/AVR/ –

+0

私はOS Xでしかビルドしませんでしたが、それは移植性があるはずです。しかし、そこには保証はありません(パッチは受け入れられました!)。それをエミュレートするチップはATmega168Pです。データシートはhttp://www.atmel.com/dyn/products/datasheets.asp?family_id=607 –

関連する問題