CPU実験室

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

サブルーチンテスト(2)

プログラムを実行させるとLED0が点滅するのでサブルーチンは正常にコールされているだろうことはわかります。

CPLDボード上のインジケータでアドレスバスの遷移を見てみると、

f:id:O3I:20210404163032j:plain

アドレス004でサブルーチンコール、アドレス008でサブルーチンからのリタン、アドレス005でループの先頭へのジャンプを繰り返していてコーディング通りの動作です。

ちょっと気になるのはリタンしたときの帰り番地がコール元と同じアドレス004であることです。これはコールの際にその時のプログラムカウンタ値をそのままスタックに退避しているからで確かにその通りの動きなんですがこれではCALL LEDONから抜け出せなくなるんじゃないかと。一般的なCPUの処理だとCALL命令の次のアドレスを退避していたはずです。

 

これはMC14500マニュアルのRTN命令の説明にちゃんと書いてありました

f:id:O3I:20210404160603j:plain

なるほど、RTN実行後の次の命令は無視する、となっています。これでCALL命令が書いてある004番地に戻っても大丈夫ということでした。

 

スタックの深さ1段でうまくいったので次は段数を増やしてみます。12ビットレジスタ×DEPTH段数のLIFO型信号を定義し、あわせて現在のスタックの位置を示すスタックポインタptrを追加しました。PUSH時(CALL)とPOP時(RTN)でポインタを増減させます。

 

f:id:O3I:20210404160615j:plain

さて現在のCPLDでどこまでスタック段数を増やせるでしょうか。マクロ定義DEPTHを変えてコンパイルし消費マクロセルとの関係を見るとこんな感じです。

(横軸:スタック段数、縦軸:消費マクロセル)

f:id:O3I:20210404170033j:plain

現在のEPM7064(マクロセル64個)では2段、EPM7128(マクロセル128個)に差し替えてもせいぜい6段が限度のようです