Turing Complete “Functions”

Functions

Functionを実装したいというレベルです。
文章が少しわかりにくいですが、

Add the instruction width to the counter value and push it on the stack

というのは、つまり指示一回が4byte使っているならその分現在のカウンタに加算してpushということですかね。
4byteの使い方は、call arg1 arg2 functionという感じでいいでしょうか。

0123
Call Op
xx011xx0
Jump AddressNot UsedNot Used
Return Op
xx011xx1
Not UsedNot UsedNot 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

コメント

タイトルとURLをコピーしました