CPU実験室

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

モニタ作成

いちおう1文字出力(入力は確認できてないけどたぶん大丈夫)とSRAMの動作ができているので原始モニタのコーディングを始めました。ROMの抜き差しをしなくて済むようにバイナリコードをシリアルからSRAM上に展開(「L」:ロード)とコードの実行先頭番地へのジャンプ(「G」:実行)の2つのみのコマンドを持つモニタで、今までもいくつかのCPU用に作ってきたので簡単なはず・・・でした

 

f:id:O3I:20200119095358j:plain

しれっと動作状況だしていますが、ここまで来るのに苦節1週間です。

 先ず初っ端からオープニングメッセージすら出ない状況が続きました。

これは文字列出力ルーチンでR1に文字列データが格納された先頭アドレスを与えて0が来るまで1文字出力を呼んでいるだけです。ソースコードの見た目はMC68000そっくり

f:id:O3I:20200119100621j:plain

これを実行させると「0123456789...ABCDEFG..」とまるでシリアル出力のテストのような文字列を表示して止まってしまいます。R1をインデックスにしたレジスタ間接の意味で()を付けたつもりなんですがアセンブラの出力リストをみるとレジスタ直接となんと全く同じコードを吐いています

f:id:O3I:20200119101350j:plain

 

これではダメで、マニュアルのアドレッシングの説明を見てみると純粋なレジスタ間接というのはなくて必ずディスプレースメント付きになるようです

f:id:O3I:20200119101249j:plain

 

結局ここはディスプレースメントを0にしたmovb 0(r1),r0と書かなければなりません。このアドレッシングは強力というかオーバースペック?か、ディスプレースメント分だけで全物理アドレスをはるかに超える符号付30ビット(1GByte)空間をアクセスできるようです

f:id:O3I:20200119102416j:plain