Functions
Functionを実装したいというレベルです。
文章が少しわかりにくいですが、
Add the instruction width to the counter value and push it on the stack
というのは、つまり指示一回が4byte使っているならその分現在のカウンタに加算してpushということですかね。
4byteの使い方は、call arg1 arg2 function
という感じでいいでしょうか。
0 | 1 | 2 | 3 |
Call Op xx011xx0 | Jump Address | Not Used | Not Used |
Return Op xx011xx1 | Not Used | Not Used | Not Used |
OpCodeをどうするか悩みますが、bit3とbit4が両方1のときにbit0で判断するようにしてみます。
また、Stackについては、関数用のStackを新しく作ってしまいましょう。
ふつうのStackが使いにくくなるのは少しあれですからね。
Call
Callについては、Stackへの書き込みとカウンタへの書き込み双方する必要があります。
StackへのPushの方については、Call Opの時はFunction用StackのPushを有効にし、Stackへの入力はカウンタの値+4をダイレクトに入れます。この+4のところは、まあハードコードでもいいでしょう。
Jump先のカウンタへの書き込みは、byte1をダイレクトにカウンタに入れます。
ここら辺は、単純にMuxで切り替えてしまえばいいでしょうか。
Return
Returuについては、Stackからの読み込みとカウンタへの書き込み双方になります。
Function StackからのPopラインをで有効にし、その出力をカウンタへ入れます。
カウンタの方は機能的にはCallとそこまで変わりませんね。
完成
以下のようになりました。

二つ並んでるうち下の方が関数用ですね。
カウンタ周りはこんな感じ。少し無理やり感が出てきています。

以下のようなコードで、Reg0に5を足し続けるコードが問題なく動きました。
label loop_begin
call jump_here _ _
call jump_here _ _
call jump_here _ _
if_eq _ _ loop_begin
label jump_here
addi2 reg0 5 reg0
ret
コメント