授業でつかっていた仮想マシン

メモリ空間は16bit、1ワードも16bit。
レジスタは全部で4つ。もちろん16bit。

汎用スタック

リターンスタック

計算結果のフラグ
計算結果によってCフラグとZフラグが立つことがある。残り14bitは予約。

「次に実行する」命令のアドレス
実際にフェッチされるたびに1ずつ増える

  • 命令

cccoooaaaddAAAss
[オペランド1]
[オペランド2]

  • ccc3bit

コンディションビット。直前の計算結果を基にgt,ge,lt,le,eq,ne,t,f(以降何を指定しても実行されない。NOP扱い)

  • ooo3bit

オペコードビット。ALUに与える命令を指示する。add,sub,and,or,not,xor,tst,mov。ただしtst以前は結果が暗黙的にFレジスタに反映される。NOTはソースオペランドを無視する

  • aaa,AAA3bit

アドレッシングモード
n,r,[n],[r+n],[--r],[r++],*[r+n],r+2
最後のは、
mov t,[--S1],PC+2
mov t,PC,どこか
としてサブルーチンジャンプに使う
nが出てくるときには、次ワード、更に次のワード(16bit)をオペランドとして使う

  • ss,dd2bit

レジスタ。アドレッシングモードがn,[n]の時は無視される。


超シンプル。TTLで組むとたぶん凄い部品数少ないはず。割り込みないし。でも、スタックフレームの話や局所変数、テキスト領域、データ領域、メモリマップドI/O、CPUのフェッチとデコードまでを一気に教えられる便利なものでした。
何より、効率を考えてないで命令コードに「全く例外がない」という素直なアーキティクチャが気に入っています。
今年から使うのやめたので公開。や、去年も一昨年も使ってなかったな。
今年の目標はもう少し高レベルで行きましょう。おお!


ちなみにこのアーキティクチャはARMを参考にして作りました(どんな命令にもコンディションビットがあるところとか)。ALUの機能をデコードするところなんかは結構お気に入り。これに比べると、MIPSって命令のモードがたくさんあって複雑ですね。
実際にCPUに落とし込む際には「immidiate(即値)」が別途フェッチが必要になるので、メモリ速度に対して律速になるところがパイプラインのハザードになります。というか、こんなCPUにパイプライン使うなというか。ロード・ストアアーキティクチャじゃなくて豊富なアドレッシングモードを持っているのもなるべく単純な命令だけで済まそうとした結果です。アドレッシングモードをを豊富にした方がデコードするべきところが少なくなるという。たぶんこれ、4MHzくらいで動いてるんだよ(笑)。