2023年
カテゴリー:
新年あけましておめでとうございます。
今年もよろしくお願いします。
2022年の大きな変化はプリント基板を注文するようになったことでした。
今年は何ができるかな。いろいろ構想しているものはあるので少しずつでも実現させていきたいですね。
新年あけましておめでとうございます。
今年もよろしくお願いします。
2022年の大きな変化はプリント基板を注文するようになったことでした。
今年は何ができるかな。いろいろ構想しているものはあるので少しずつでも実現させていきたいですね。
SN74141を試すで触れた消灯しているはずなのに中央がボーっと光る問題、思い当たることがあると書きましたが、対策が効いてほぼ原因が確定したのでそれについて書きたいと思います。
実は、ヒントになることはニキシー管を点灯してみたにも少し書いています。
あの時はこんな現象は起きていませんでした。
何が違っているかというと、カソードを1本ずつ手でGNDに接続していたのをSN74141で切り替えるように変更したことです。
複数のSN74141が揃ったので動かしてみることにします。ニキシー管を点灯してみたで使った基板を流用します。
4ビットのカウンタを追加して順に点灯させることにします。
管もSN74141も取り換えて試すのが目的です。管は前回同様、ピン1, 13のみ穴に通し基板にハンダづけしているのはアノードのピン13だけです。SN74141はZIFソケットを使いました。
ウクライナから買った石でニキシー管用のデコーダ・ドライバのSN74141が入手困難らしいと書きましたが、その後eBayで度々見かけたのでいくつか購入しました。単にこれまで欲しいと思わなかったので目に入っていなかっただけみたいです。
これはオリジナルのTIのSN74141ANです。元々SN7441というのがあって、それの改良版です。
SN7441もSN74141もBCD-to-Decimal Decoder / Driverというもので、デコーダの出力は60Vという高耐圧のオープンコレクタになっています。これは多くのニキシー管のカソードを直接ドライブ可能です。
アドレスエラー・バスエラー時の表示は、未対応のフォーマットの場合にはスタックに積まれたワードをそのまま16進ダンプするようにしたので、デコードルーチンは後回しにして判別を書くことにしました。
まずMC68020以上であることの判別は容易(MC68010の判別(補足)参照)なのですが、MC68020からMC68030で追加された命令はありません。というかあるにはあるのですがMMU関係の命令なのでMC68020+MC68851(PMMU)でも実行できてしまいます。細かな動作の違いはあるかもしれませんが...
前回までで従来の機能がセグメントモードで動作するようになりましたが、セグメントモードで動作するなら当然D(ump)などのコマンドでもセグメントが指定できなくてはなりません。
この辺りは8086のセグメントやTLCS-90のバンクを移植する形で対応しました。
表記はZ8000らしく<<SEG>>OFFSET
形式も考えましたが、長くなるので8086同様SEG:OFFSET
形式としています。
コマンドのパラメータ以外に対応が必要なのはR(egister)コマンドにおけるSSPとPCです。
などの方法が考えられます。
1.は勝手に名前を付けることになることと、2回に分けて設定するのは面倒です。
前回枠組みができたので実際に変更していきます。
直接アドレスやJR
, CALR
などの相対アドレスはアセンブラが良きに計らってくれるので書き直す必要はありません。
問題はレジスタ間接(インデックスなども含む)です。これは単純に書き換えられない上に、アドレスレジスタが隣り合う2つのレジスタをペアにする関係でレジスタの割り当てを大きく変更する必要がありました。幸いレジスタ数に余裕があったためレジスタ番号の書き換え程度で済んでいますが、不足する場合はメモリに退避するなど変更規模が大きくなってしまいます。
今回は大きく3つのパターンで対応しました。
レジスタ間接のまま32ビット化するのが一番手っ取り早いのですが、レジスタをペアで使用するので多用するとレジスタが足りなくなる恐れがあります。
これはどこを指すかわからない場合に使用しました。具体的にはSTROUT
ルーチンへの引数と各コマンドでの対象メモリへのアクセスです。
Z8001を動かすで非セグメントモードで動くことがわかりました。動作する石も複数確保できましたので、本来のセグメントモードで動かすことにします。
Z8000ファミリにはセグメントモードでも動作するZ8001(とZ8003)と非セグメントモード専用のZ8002(とZ8004)があります。両者はリセット時のPC, PSWの初期値を格納する形式が異なる上にアドレスが重なるので同一バイナリで両方に対応することはできません。
Z8001(とZ8003)はセグメントモードでも非セグメントモードでも動作させることができます。これは同一バイナリで両対応するのは可能ですが、ほぼすべてのルーチンを2つ持つようなことになってしまいます。
結局3種類のバイナリを作ることになります。