CPU実験室

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

コーディング開始

パラレルLEDへのハード的なアクセスは用意できたので、意味のあるプログラムで動作確認していきます。まずはいつものようにLEDチカチカですが最小のコードはこのようになりました。

 

f:id:O3I:20191117082631j:plain

レジスタの内容をLEDがあるポートに出力したあと、レジスタ内容をインクリメントして最初に戻るという単純なものです。

最初の1行目、LEDのポートアドレスを定義している「EQU」、これは言語仕様がわからずバイナリサーチしたとき予約語のテーブルにはなかったのですが、いくらなんでもこれくらいはあるだろうと使ってみたら通りました。ベースはGAS(GNU-Assembler)なのだと思いますが、他に「PORT」「SET」や「=」、「#DEFINE」も試してみましたがこれらはエラーになってダメでした。

次にR0レジスタの内容をこの絶対値アドレスに転送。インクリメントはINCとかの専用命令はなく即値のクイック加算ADDQが用意されています。これはMC68000と同じですね。最後のジャンプ命令は相対アドレッシングが何かまだ懐疑的なので絶対値ジャンプにしてます。

アセンブルされたオブジェクトファイルをリトルエンディアンということに気を付けてROMにアサインするとこのようになります

f:id:O3I:20191117084728j:plain

 

さてこれを4個のROMにそれぞれ焼いて基板にセット。電源ONしました

f:id:O3I:20191117090248j:plain

んー、見た目何も変わってないです。LEDもチカチカせず。いや目に見えないくらいの超高速点滅してるかと思いましたがオシロで当たっても変化無し。

 

TCU(NS320C201)が生成する/RD(ch1)と/WR(ch2)信号を見てみると

f:id:O3I:20191117091136j:plain

たしかに4回コードを読んで1回書込みをするという動作を230kHzくらいの周期で繰り返しています。アドレスラインもROMのA0,A1だけパタパタしていて他のビットは0固定なのでこのLチカプログラムは正常にループしていると考えられます。

ですが、まずLEDのあるポートにアクセスできていないということと、実は上記の状態、波形というのはチャンピオンデータでなかなかこのような安定状態にならないのです。電源ON直後は全アドレスバス、全データバスがめちゃくちゃに暴走していて電源OFF/ON、リセットボタンを連打しているうちにいつのまにかスッとループに引き込まれるような謎の動きをしています。