CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

スタック処理

スタックポインタで指し示されたスタックをアクセスする、ということでわりにさらっと書けたのですが、これがサブルーチン1層のプログラムですら動きません。サブルーチンから戻るときにスタックに入っている値がおかしく(0?)で0番地に飛びリセットされるような動きになってしまいます。

配列で宣言したスタックをインデックス変数(スタックポインタ)でアクセスする方法、スタックポインタの算術的な増減など1行1行は大丈夫そう。一番怪しいのは、それらが同時代入文として実行されるときスタックポインタの更新とそれによる参照がどちらが先に実行されるのか、ということです。同時代入なのでどちらが先ということもないのですがどちらかが先でないと値が決まらないし・・

C言語でいうと *ptr++*++ptrの違いみたいなものです。

 

ところがいろいろいじっているうちptrに定数を入れてポインタを固定にしても戻り値がおかしいことに気付きました。もはやインデックスを変数にすること自体がダメなのか、ということで即値でのアクセスに書き換えました。スタックは2段しかないのでif文で分岐させインデックスは即値にしてあります

f:id:O3I:20210406184447j:plain

なんかいろいろ怪しい記述ですが、一応これで動作正常です。使用マクロセルは

 Total macrocells 61 / 64 ( 95 % )

 Total pins 35 / 36 ( 97 % )

で使用ピン数とともにギリギリになりました

 

スタックをフルに使うサブルーチン2層のプログラムはこのような感じ。

LEDON0ルーチンの中からLEDON7ルーチンを呼ぶようになっていてスタックを2段使います。

f:id:O3I:20210406184514j:plain

実行させるとLED0ON→LED7ON→LED7OFF→LED0OFF→ となり期待通りの動きです