CPU実験室

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

サブルーチン

ベリファイチェックでエラーが出るということはメモリアクセスが間に合ってないのかも?ということでマスタクロックを作っている20MHz発振器を14.7654MHzのものと交換しました。

アクセスサイクルは約270nsでクロックに比例して遅くなっていますがこれでも時々エラーになります。頻度は下がったようですがまだタイミングに問題がありそうで、/RDY信号で制御しなければならないのか、SRAMの方に問題があるのか・・・・・通電してしばらく(暖まってくると?)エラーが無くなるのでちょっと様子見です。

 

f:id:O3I:20201206123202j:plain

 

先にシリアルのデバッグをやっつけようと思い1文字入出力のサブルーチンを書き始めたのですが、ここでなんとAm29kのインストラクションセットにRET:リタン命令が無いのに気付きました(NOPにつづいて今更・・)

マニュアルを見るとスタックポインタに相当するレジスタはあるのですがスタックフレームの生成や管理はユーザに任されているようです。たしかに次に実行するアドレスを任意のレジスタに退避してサブルーチンに飛ぶCALL命令はあるのですが

 

f:id:O3I:20201206121244j:plain

対応するRET命令はなく、退避したレジスタを指定した間接レジスタジャンプJMPI命令で戻るようで、この辺りはTMS9995似ています

 

サブルーチンをリカーシブ(再帰的)に呼ばなければメモリ上のスタックを使わなくてもとりあえずはサブルーチンは記述できます。LEDチカチカプログラムの待ちタイマをサブルーチンで記述してみました。

NOPRETエイリアスとして書けるようにマクロで展開させます。また汎用レジスタは大量にありレジスタ番号で指定しているとこんがらがってくるので適当な別名を与えてしまいます。

f:id:O3I:20201206121304j:plain

 

プログラムの本体です。CALL命令も遅延分岐のため直後にNOP命令を挿入しておきます。

f:id:O3I:20201206121403j:plain

 

サブルーチンで4096回空回しをしてやると最下位26Hzでトグルして目で追えるチカチカになっています。

 

f:id:O3I:20201206123136j:plain