2020-08-26 23:00 — asano
カテゴリー:
SBCZ80について進展がありましたので記録しておきます。
メッセージ文字化け
電源ON時にメッセージの一部が化ける現象が発生していました。
CR,LF,"Universal Monitor Z80",CR,LF,00H
上記のメッセージ(最後の00Hは文字列の終端マークです)を表示しているはずなのになぜかLFと"U"の間に変な文字が挿入され次の"U"とともに化けてしまいます。電源ONのままリセットすれば問題はありません。
次にメッセージを少し変形しました。
CR,LF,CR,LF,"Universal Monitor Z80",CR,LF,00H
やはり2文字目のLFの後に挿入されると想像していましたが、実際は4文字目のLFの後"U"の前に挿入されました。
前回はここまで書きました。
さらにLF,"U"の組み合わせに何かあるのかと次を試してみます。
CR,LF,"Uni",CR,LF,"Universal Monitor Z80",CR,LF,00H
今度は最初(2文字目)のLFの後には挿入され7文字目のLFの後は正常です。
続いてメッセージの前に00Hを256個送ってみました。
するとやはりLFと"U"の間に挿入されます。ここでTera Termのログを見ていておかしなことに気づきました。00Hがまったく記録されていないのです。ログの設定に何か無いかと探すと「バイナリ」の項目があったのでチェックを入れて最初からもう一度試すと...
LFと"U"の間に挿入されていると思っていたのが、CRの前(先頭)に挿入されているではないですか。
挿入される文字も0F0Hや0F8Hといった上位側に"1",下位側に"0"が並ぶものばかりです。これ数ビット幅分の"L"パルスが出ていて、スタートビットと下位側数ビット分の"0"と解釈されている可能性が出てきます。そうだとするとZ80 SIOがおかしなキャラクタを出力しているというよりは電源ON/OFFの過渡期のハードウェア的な現象の可能性が高くなってきます。
このあたりで電源OFF時に半角の「タ」が表示されることがあったのを思い出しました。面白いことに「タ」の後電源を入れると正常なのです。
ちなみに「タ」のコードは0C0Hで上の条件に合致します。
これで何が起きているのか大体わかりました。
- 電源OFF時に何らかの理由で"L"パルスが発生しキャラクタと認識された
- そのキャラクタが1バイト文字のコードならそのまま表示された
- そのキャラクタが2バイト文字の1バイト目の場合、Tera Termは2バイト目を待つ
- 2バイト目を待っている間にCR,LFなどの制御文字がくると1バイト目を保留したまま制御文字を実行
- 2バイト目として有効な"U"がきたところで保留していた1バイトと合わせて表示 ⇒ 文字化け
このようなことが起きていたのだと推定できます。
1バイト目を保留したまま制御コードを実行するという挙動は一見不合理に見えますが、SJISを解さない系が(2バイト文字が泣き別れになる位置に)改行コードなどを挿入してしまって壊れたものを救済できるメリットがあります。非バイナリに設定したときのログの記録順序もこの救済を目的としたものではないかと思われます。
いずれにせよこの文字化けはUniversal Monitorの問題ではないのでこの件はこれでお終いです。
Z80 SIO/2を替えてみる
SBCZ80のSIOはZ80 SIO/2(Z8442APS)が指定されているわけですが、他は使えないのでしょうか。部品表の代替可能品には「Z80 SIO同等品」とだけあります。「/2」と明記されていないのでどれでもOKのはずですが一応検討してみます。
Z80 SIOの/0, /1, /2はボンディングオプションでチャネルBの信号線が異なっているわけですが、違いがあるのは25~29ピンのみで他は共通です。SBCZ80はチャネルBを使用しておらず、これらのピンは無接続になっているのでどれを載せても問題ないはずです。
念のため試してみましたが特に問題はありませんでした。
Z80ファミリには非同期(調歩同期)専用のZ80 DARTというものも存在します。以前からピン配置やレジスタがよく似ているなとは思っていたのですが、今回資料を見比べてみて載せられそうだったのでこれも試してみました。
ハードウェア的には11ピンのSYNCAがRIAというモデム用の信号に変わっていますが、SBCZ80ではこのピンは無接続なので問題ありません。
ソフトウェア的にもレジスタなど共通で、非同期以外の設定ができないようになっているだけですのでソフトウェアもそのまま無変更で動作するはずです。
実際に載せ替えてみてもあっけなく動きました。
Add new comment