MCPU08について

箕原辰夫


学生の理解のために作ったCPUのシミュレータです。まだ完成していません。 ネーミングは安易で、2008年に作ったからMicro CPU 08の略です。 実は、8bit機ではなくて、16bit機になっています。 Motorolaの6809あるいは、CPU12風にインストラクションセットが作ってあります。 シミュレータなので、いい加減に作ってありますので、ご容赦願います。 なお、(昔のNSやMotorolaなどの文面を借りて)、このシミュレータを人命などの危険な 任務が伴うようなアプリケーションには決して利用しないでください(あり得ないと思いますが)。 一応、未だに8xx6を利用している宇宙機などの例もありますので。


プログラミング・モデル

これもMotorola系用語ですが、 ユーザが利用できるレジスタは、A, B, X, Y, SP, CCR, PCです。 ただし、PC相対とかのアドレッシングはありません(シミュレータでは不要でしょう)。 CCRには、Z(Zero)、N(Negative)、C(Carry)、V(Overflow)がありますが、まだCとVは、 面倒なので実装していません。もう少し余裕ができたら実装したいかな。

アドレッシングモード

以下参照ですが、まだ実装できていないものが多いです。すいません。

	
	
レジスタ直接A, B, X, Y, SP(SPはまだ)
レジスタ間接@X, @Y, @SP(まだ)
 ポストインクリメント(まだ) @X++, @Y++, @SP++
 プレデクリメント(まだ)@--X, @--Y, @--SP
イメディエイト(即値)#Value(16進数で)
メモリ直接Address(16進数で)
メモリ間接@Address(まだ、16進数で)

メモリ構成

ハーバード・アーキテクチャではありませんが(バスを共有しているので)、 プログラミングメモリとデータメモリはまったく別になっていて、アクセスできません。 すなわち、PCにデータメモリのアドレスをいれて動きませんし、 その他のレジスタにプログラミングメモリのアドレスを入れても動きません。 また、スタックも別領域になっています。 メモリデータは、バイトでなくて、16bitのワード単位になっています。 シミュレータなので、アセンブラがそのまま動きますが、一応、一命令2ワード必要とします。 そのため、下の方のプログラミングのテーブルのアドレスが2飛びになっています。 データもレジスタも全部16進数で表示されます。これも将来なんとかしたいところです。

	
	0000〜0FFF:プログラム用メモリ
	1000〜2FFF:データメモリ
	3000〜37FF:スタックメモリ
	3800〜3FFF:メモリマップドI/O用(おいおい、何をつけるの?)
	

命令セット

一応、Motorola系を踏襲していますが、ByteとかWordの指定はできません。 単純に全部、16bitのワード単位で計算します。 分岐命令は、destinationの欄に、labelの欄に書かれた名前を記述します。 この版では(まだ版番号も付けていませんが)、空白を取り除いていないので、 プログラムのテーブルの欄に余計な空白を記述しないで下さい。 また、テーブルの各セルに入力状態のままだと、そのセルの値を認識しないので、別の 関係ないセルをクリックしてから、プログラムを実行して下さい。 そのうち、全部実装したいと思います。確か、大文字・小文字の差は吸収してくれる はずです。 6809では、AとBレジスタを統合してDレジスタ扱いにしていましたが、 それは必要ないと感じてやっていません。 同じ理由で、MULT, DIV(乗算・除算命令)などもありません。 Uが付く命令はUnsignedの意味ですが、まだ実装していません。 C, Vフラグさえ実装していないのですから。 下記の命令セットを見て何がなんだかわからない方は利用をお控え下さい。


MOVEsource, destination
ADDsource, destination(A, B only)
SUBsource, destination(A, B only)
CMPsource, destination(A, B only)
ADDCsource, destination(A, B only)未実装
SUBCsource, destination(A, B only)未実装
ADDUsource, destination(A, B only)未実装
SUBUsource, destination(A, B only)未実装
ADDUCsource, destination(A, B only)未実装
SUBUCsource, destination(A, B only)未実装
CMPUsource, destination(A, B only)未実装
CLRdestination(A, B only)
COMdestination(A, B only)
NEGdestination(A, B only)
INCdestination(A, B only)
DECdestination(A, B only)
TESTdestination(A, B only)未実装
ASLdestination(A, B only)
ASRdestination(A, B only)
LSLdestination(A, B only)未実装
LSRdestination(A, B only)未実装
ROLdestination(A, B only)未実装
RORdestination(A, B only)未実装
ANDsource, destination(A, B only)
ORsource, destination(A, B only)
XORsource, destination(A, B only)
PUSHsource(A, B, X, Y, PC only)未実装
POPdestination(A, B, X, Y, PC only)未実装
BSRlabel 未実装
RTS 未実装
BRAlabelAlways
BEQlabelEqualsZ=1
BNElabelNot EqualsZ=0
BGTlabelGreater thanZ + (N XOR V) = 0 未実装
BGTUlabelGT UnsignedC + Z = 0 未実装
BGElabelGreater or Equals N XOR V = 0 未実装
BGEUlabelGE UnsignedC = 0 未実装
BLTlabelLesser ThanZ + (N XOR V) = 1 未実装
BLTUlabelLT UnsignedC = 1 未実装
BLElabelLesser or Equals/td>N XOR V = 1 未実装
BLEUlabelLE UnsignedC + Z = 1 未実装
BMIlabelMinusN = 1
BPLlabelPlusN = 0
BCClabelCarry ClearC = 0 未実装
BCSlabelCarry SetC = 1 未実装
BVClabelOverflow Clear/td>V = 0 未実装
BVSlabelOverflow SetV = 1 未実装
BRNlabelNever 未実装
NOP
HALT

対話的な実行・デバッグ

どこが、デバッグか!と怒られそうですが、実行中に当然レジスタの内容を書き換えることが できます。今レジスタをリセットするボタンが付いていませんが、今後つける予定です。 もう一度、プログラムの始めから実行したいときは、PCに0000を入力してください。 ただし、入力後は、他の関係ないところをクリックしておいて、入力状態から解除しておいてください。 ちなみに、Stepボタンで1命令ずつ、Startボタンで1命令につき0.5秒(ということは、 0.0000005MIPSでしょうか)で実行できます。HALT命令に出会うと止まります。


何故ブロック図がついているか

本当は、マイクロプログラミングまでやる予定でしたので、ゲート番号なども入っています。 実行時に使われているレジスタやバスを点滅させる予定でしたが、まだできていません。 将来できれば、作ります。