箕原辰夫
学生の理解のために作った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フラグさえ実装していないのですから。 下記の命令セットを見て何がなんだかわからない方は利用をお控え下さい。
MOVE | source, destination | ||
ADD | source, destination | (A, B only) | |
SUB | source, destination | (A, B only) | |
CMP | source, destination | (A, B only) | |
ADDC | source, destination | (A, B only)未実装 | |
SUBC | source, destination | (A, B only)未実装 | |
ADDU | source, destination | (A, B only)未実装 | |
SUBU | source, destination | (A, B only)未実装 | |
ADDUC | source, destination | (A, B only)未実装 | |
SUBUC | source, destination | (A, B only)未実装 | |
CMPU | source, destination | (A, B only)未実装 | |
CLR | destination | (A, B only) | |
COM | destination | (A, B only) | |
NEG | destination | (A, B only) | |
INC | destination | (A, B only) | |
DEC | destination | (A, B only) | |
TEST | destination | (A, B only)未実装 | |
ASL | destination | (A, B only) | |
ASR | destination | (A, B only) | |
LSL | destination | (A, B only)未実装 | |
LSR | destination | (A, B only)未実装 | |
ROL | destination | (A, B only)未実装 | |
ROR | destination | (A, B only)未実装 | |
AND | source, destination | (A, B only) | |
OR | source, destination | (A, B only) | |
XOR | source, destination | (A, B only) | |
PUSH | source | (A, B, X, Y, PC only)未実装 | |
POP | destination | (A, B, X, Y, PC only)未実装 | |
BSR | label 未実装 | ||
RTS 未実装 | |||
BRA | label | Always | |
BEQ | label | Equals | Z=1 |
BNE | label | Not Equals | Z=0 |
BGT | label | Greater than | Z + (N XOR V) = 0 未実装 |
BGTU | label | GT Unsigned | C + Z = 0 未実装 |
BGE | label | Greater or Equals N XOR V = 0 未実装 | |
BGEU | label | GE Unsigned | C = 0 未実装 |
BLT | label | Lesser Than | Z + (N XOR V) = 1 未実装 |
BLTU | label | LT Unsigned | C = 1 未実装 |
BLE | label | Lesser or Equals/td> | N XOR V = 1 未実装 |
BLEU | label | LE Unsigned | C + Z = 1 未実装 |
BMI | label | Minus | N = 1 |
BPL | label | Plus | N = 0 |
BCC | label | Carry Clear | C = 0 未実装 |
BCS | label | Carry Set | C = 1 未実装 |
BVC | label | Overflow Clear/td> | V = 0 未実装 |
BVS | label | Overflow Set | V = 1 未実装 |
BRN | label | Never 未実装 | |
NOP | |||
HALT |
どこが、デバッグか!と怒られそうですが、実行中に当然レジスタの内容を書き換えることが できます。今レジスタをリセットするボタンが付いていませんが、今後つける予定です。 もう一度、プログラムの始めから実行したいときは、PCに0000を入力してください。 ただし、入力後は、他の関係ないところをクリックしておいて、入力状態から解除しておいてください。 ちなみに、Stepボタンで1命令ずつ、Startボタンで1命令につき0.5秒(ということは、 0.0000005MIPSでしょうか)で実行できます。HALT命令に出会うと止まります。
本当は、マイクロプログラミングまでやる予定でしたので、ゲート番号なども入っています。 実行時に使われているレジスタやバスを点滅させる予定でしたが、まだできていません。 将来できれば、作ります。