CPU実験室

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

条件分岐

1文字入出力、メモリ書込み、ジャンプができればそれらの組合せでモニタを作るのは簡単なはずなんですがいろいろつまづいてます。

たとえば以下は原始モニタでターミナルホストから入力された1文字コマンド(「L」:ロード、「G」:実行)でそれぞれの処理に分岐する部分ですがここに至るまで条件判断でミスってました。

cmd_bufに入っている受信したコマンド文字をEQC(EQuals Constant)CJ(Conditional Jump)で判定します。CJはステータスフラグの読取りで既に使っていますがこれはAreg=0で分岐します。ところがEQCと組み合わせた場合、EQCAregとパラメータが合致して引き算が0でAregに定数TRUE(=1)が入り(zeroフラグ=1相当)合致しないとFALSE(=0)が入るとなってました。

つまりCJは単独で使うとJump Zero(JZ)EQCと併用するとJump Non-Zero(JNZ)というふうに全く逆の動きをするということです。この罠には引っかかりました。

ということで最終的に上のようなコードを書いてロジック的には合ってるはず・・

 

なのですが、これを実行させるとまだ何か動作が変です

・「L」、「G」を入力すると何か分岐はしてるっぽい

・でも分岐した先:LOADEXECルーチンの動作がおかしい

・「L」、「G」のどちらでもない入力では再入力プロンプトに戻るはずがフリーズする

 

プログラムを要所残しギリギリに削ってROMに焼き、動作確認のカットアンドトライを繰り返していましたがらちが明かないのでアセンブラが出力したリスティングを眺めてました

するとちょっと変なところがあります

1つ目のCJ:文字が「L」でないときpass1に飛んで「G」との判定を開始するのと、2つ目のCJ:文字が「G」でもないときpass2に飛んで再入力準備をするところ

これらの命令の飛び先との相対距離は2バイトで同じなのに違うバイナリ「A2」と「A3」を生成してます

はたしてこれで良いのか疑問です