出来上がった16バイトのコードをROMに焼き、実行・・・
したのですが、これがまたうんともすうとも。4個のLEDは消灯したままです
ハード接続から内部レジスタの初期化までじっくり見直したのですが特に問題ないので
出力信号を当たって見ました。
まずポートBは0FFHが出力されたまま変化がありません。
ポートBが出力設定されたのと、最初に出力するのはAレジスタの初期値0FFHなのでここまではOKといえます。
LEDはPBnが0になったとき吸込みで点灯するので消えたままになるわけです
一方、アドレスバスは本来は0Ah~0Fhをループしているはずなのですが何故か10h~11hで回っていてこれが変です。
そこでループを構成する命令をもう一度見直していったら・・・・ありました。これです
単なるレジスタのインクリメント命令なのですが、キャリーがあると次の命令はスキップするとあります。最初にPBに0FFhをロードしたあとAレジスタをインクリメントすると00hになると同時にキャリーが立つので次の命令JMP LOOPをスキップしてループの外に飛び出しちゃう、ということです
ループの外のROMのプログラム未書き込み領域はもともと0FFhで埋められていて、
この0FFhというのが7810ではリラティブジャンプ命令「JR -1」と解釈されたので、そこでマイナループしちゃったんですね
とりあえずスキップされてもいい様にINRの次にNOPを挿入。まぁこれで動くでしょう。
先頭部分のNOP埋めは、前回のROM上のプログラムをNOP(00)で上書きして潰すものです。こうしておけばROM容量が尽きるまでは毎回紫外線消去しなくて済むので楽です
あらためて7810のインストラクションセットを見てみると、最初80系に似ていると思ったのは早とちりで条件判断の処理が全く違います。
80系では豊富にある条件ジャンプ、条件コール、条件リタンというのが一切なく全て無条件分岐です。これを演算命令に含まれる次命令スキップ機能と組み合わせて条件判断を実現するようです。