2026.2.25
前へ

目次へ戻る
ホームページトップへ戻る

パソコンをつくろう!(パソコン自作のすすめ)
組み立てキットを使って自作に挑戦!

[第405回]



●KL5C80A12の怪(4)

前回を書いてからあとで気が付きました。
前回は次のように書きましたがよく考えてみるとやっぱりおかしいです。

可能性として考えられるとするとCPU内部のプロセスで先のINT処理(実はステップ処理の最初のエントリなので本当の割込みではないのですが)そのエントリ時に何かの命令の第一コードが読み込まれていてCPUはそのオペランドが来るのを待っている段階だとすれば3Eをオペランドだと思ってそれを読み込んだタイミングで次の割込み許可を出してしまう…。

前回のロジアナの波形では3Eを読んだときにINT信号の下がりエッジがあります。
INT信号はM1のときにしか出力されません([第402回]回路図参照)。
ということはKL5C80A12は「3E」を命令の第1バイトであると認識していることになります。
そういうことからするとやっぱり辻褄が合いません。
依然としてなぜかは謎なのですが何らかの原因でCPUが誤動作をするとしか考えられません。
TK80モニタモードでは正常に動作します。
それがND80Zモニタモードだと必ず誤動作してしまいます。
そこまではっきりしているのならば。
前回書きましたようにND80Zモニタプログラムを部分的にTK80モニタプログラムと入れ替えて動作させてみればどこでKL5C80A12が誤動作するのかがわかるのではないか?

これはなかなかにしんどい作業でしたが根気よく進めた結果ついにその箇所を突き止めました。



アドレス08BEでキー入力ルーチンをCALLしています。
ここではUSB接続をしたリモートプログラムと動作を兼用するために本来のキー入力ルーチンをRAMアドレスに入れて書き換え可能にしています。
下の部分です。



FFC6はRAMアドレスです。
ここにKEYINへのジャンプ命令を置くかリモートプログラムへのジャンプを置くかで2通りの動作をさせることができます。
他のところでもこのような使い方をしているところはありますし何よりもこれがZ80だと普通に動作してしまいます(それは当然のことです)。
しかしどうやらこのことによってKL5C80A12の内部で変なスイッチが入ってしまうらしいのです。
全く理解できないことにそのスイッチはほかのタイミングでは影響を与えないのですが外部からINT信号が入力されたときにのみ異常な動作として「活性化」されます。
どうもそのようにしか考えられません。
それでここでRAMアドレスをCALLしているところをROMのプログラムアドレスに変更したところ正常に動作するようになりました。



あっと。
説明不足でした。
08BEはCD900Dに書き換えました。
0D90はROMの空きエリアです。
このようにすることでプログラム全体のアドレスが変化してしまわないように配慮しています。

これで一件落着したわけなのですけれど。
なんとなく気持ちが悪いことも事実です。
腑に落ちませんねえ。
何なんでしょう。
そこをそのように直したらまともに動作するようになったのですからそこが原因だったことに間違いはなさそうです。
しかし。
KEYINと割込みとは直接は関係していないのですよねえ。
[ADRSSET]とか[RED INC]とかだと(RAMアドレスをコールしても)まともに働きます。
RAMアドレスをコールするKEYINだと[RUN][CONT]でEI、RETIを実行すると異常が発生してしまいます。
うむむむ。
やっぱり割込みとどこかが関係しているようです。
多分。
KL5C80A12の内部ロジックにバグがあるのでしょう。
納得はいきませんけれど。
渋々ながら一件落着ということにいたしましょう。

パソコンをつくろう![第405回]
2026.2.25upload

前へ

目次へ戻る
ホームページトップへ戻る