ステップ実行実装中っぽい何か。


サウンドモジュールのバグで一時足踏み状態だったCPU実装ですが
昨日 id:akkera102 さんに解決策を提示して頂き一先ずの対策を講じることができましたので
今はCPUコアの微調整を行いながらステップ実行の実装中です。


実行モードでのアドレス表示とステップ実行の実行順など判明した点を
メモ程度に残しておきます。


アドレス表示について。
アドレスはPC(プログラムカウンタ)の内容が表示されます。
プログラムカウンタは次に実行されるコードのアドレスを入れとくレジスタです。
ステップ実行で以下のプログラムを実行するとします。

00 AIA 9
01 <1> 1
02 CAL_ E
03 ENDS 7
04 JUMP F
05 <0> 0
06 <4> 4


[6][RUN]でステップ実行モード、アドレス表示を開始します。
ここでまず 最初の AIA 1 という2語長命令が実行されます。
次に実行されるコードはアドレス 02 03 にある CAL_ENDS 命令(2語長命令)なので
アドレス表示が02と2進 LED に表示されます。
[INCR]を押すと CAL_ENDS が再生されます。
再生が終わるまではアドレス表示は 02 のままであり、命令の実行完了後、
次に実行される JUMP 命令のあるアドレス 04 が表示されます。
以降[INCR]を押すとアドレス 04 が表示され続けるのは無限ループをセットしてる為です。


ユーザメモリ領域(0x00〜0x5F)の取り扱われ方。
ジャンプ命令でユーザメモリ外を示した場合。
以下のプログラムのようにユーザメモリ範囲を超えた指定するとします。

00 JUMP F
02 <F> F
03 <F> F


JUMP 命令の以下に続く2ニブルアドレス値が0x5Fを越えた場合
アドレス値 0x00 を指定したものと解釈・実行されます(次回実行アドレスは 00 からとなる。)。
つまりアドレス表示では常に0x00が示される為、2進LEDは消灯続けた状態になります。


ジャンプ命令でなく、順次実行でユーザメモリ越えした場合。
プログラムの順次実行を行っていき、アドレスが 0x60 を示そうとした場合も
PC には 0x00 がセットされます。

00 JUMP F
01 <5> 5
02 <E> E
〜
5E CAL_ E
5F ENDS 7


上記プログラムをステップモード6で実行してみると分かりやすいです。
まず最初の命令実行で 5E アドレスへジャンプします。
アドレス表示は5Eとなります。
次の命令実行でアドレス 5E 5F にある CAL_ENDS を実行(再生)します。
アドレス表示は 60 とならず 00 となります。
次の命令実行はアドレス 00 にあるジャンプ命令が再び実行され、アドレス 5E へジャンプとなります。


2語長以上の命令がアドレス超えした場合。
デコード中断はされず 00 アドレス以降の値をオペランドや、サービスコール命令の引数と解釈します。

00 M- 7
01 JUMP F
02 <5> 5
03 <F> F
〜
5F CAL_ E


上記プログラムの場合、5F番地から始まるサービスコール命令の2語目がありません。
この場合の内部でのデコードは、
まず5F番地が2語長命令のサービスコール命令だと判断します。
5F番地の次は無いのでPCには00番地がセットされます。
命令は2語長だと解釈されてるので2語目が読み出されます。
PCには00番地がセットされてるので2語目の値は00番地のものが読み出されます。
5F番地のCAL_と00番地の値7(M-という1語長命令)がENDSと解釈され CAL_ENDS が実行されます。


ざっと分かるところでこんなところでしょうか。
デコード中断があるものだと勘違いしてましたが。
実はローテートしてたなんて(汗)。