8251と8255
2025.11.06
8251と8255は兄弟みたいなものだが、用途は違う。
大雑把にいうとシリアルとパラレル

学生の頃の話

MSXに8251のカートリッジを自作して、それでMZやポケコンと通信できたら素晴らしいと思いついた。プログラムやデータの転送ができるようになる。
MZもRS-232Cは無いから、MZ側にも8251ボードが必要となるわけだが、とりあえずポケコンなら簡単そう。
RS-232Cのレベル変換は電源(+12V,-12V)がいるから面倒くさい。当時新しかったMAX232は高価だし、TTLレベルで直結すればいいか、という具合。
結果的から書くと、この最初の試みはうまくいかなかったけど。

確か、クリスタルの周波数が合わなかったのかな。完全に忘れたけど。近くのパーツ屋に無かったか。
他のマイコンやパソコンと1,200bpsとか9,600bpsといった決まったボーレートで通信するなら、クリスタルはそれに合ったものにしなければならない。
でも、自分で作ったものなら適当なボーレートでも、お互いに一致していれば良いのだから、適当な周波数で構わない。

最初の頃は8251のレジスタ設定をサッパリ理解できなかった。

どうも難しそうだと一旦保留にして、今度は8255ならどうだろうと。
じつは使い方としてハンドシェークモードというのがあるけど、やはり当時の理解力ではサッパリで、
それなら、一番単純なI/Oポートとしての使い方によって、お互いにパラレル接続で転送できないかと。

幸い、MZ側には別の目的で作った8255ボードが載せてあった。あとはMSX側に8255カートリッジが有れば良い。配線は多いけど、手間だけの問題だろう。

パラレル転送で思い出すのはプリンタI/F

データ1バイト(8bit)で、ストローブ、ビジー信号、GNDだけ。
プリンタへ、データの準備ができたよ、という合図がストローブ。Lパルスを一瞬送る。
ビジーというのは相手側(一般にはプリンタ)がデータを受け取れない事を示す。これがHレベルならMSX側は(Lになるまで)待つ。

この考えで、MSXとMZの8255同士をつないでやれば、データ転送が簡単にできるじゃないか。

ところが当時の頭ではプログラムがややこしく、えーと、MSXがこうで、その時MZはああして・・・と考えるとごちゃごちゃして分からなかった。

そこで友人と、それぞれMSXとMZになりきって、その役割をシミュレーションした。

そっちがビジーじゃないからストローブ出したよ、データ受け取った。そっちがビジー出してくれないとこっちは次のデータを送ってしまう。一旦止めないと。
えーと、そっちがこうしたら、こっちは・・・

相手の8255の初期化が終わっていないと、制御信号が不定だからどうするのとか、色々考えるべき事があった。

受信しながらフロッピーに書き込もうとすると時間がかかるから、メモリ容量が許す限りメモリ上に展開し、全部受信が終わってからファイル保存しよう。

紆余曲折が有り、何度かプログラムを作り直してようやく安定して転送できるようになった。あまり高速に転送しようとすると、ケーブルにノイズが乗ってデータが化けるから、そこそこ遅くする必要があった。
当時の実験プログラムなどの記録は、古いノートに書き記してある。

これでMZ側はCP/Mのフロッピーをセクターダンプして送信し、MSX側ではそれを受信してメモリ上に展開し、ファイル一つ分の受信が終わったらバイナリで保存する。
こうしてCP/Mの外部コマンド等をMSX-DOS上で動かせるようになった。M80(マクロアセンブラ)、L80(リンカ)、F80(FORTRANコンパイラ)などを持ってきてMSXで使っていた。

当時は8bit単位でデータ転送(データ線は8本)したけど、配線が面倒だったら4bit単位つまり4本にして、あとはプログラムで対応してもよい。でも8bitのほうが単純である。


ふたつの8255同士を接続する時に注意すべき事がある。電源が別々になっている8255同士は直結しない方が良い。

当時はそんな注意点は想像もできず、いや、ちょっとは気になっていたかもしれないが、動けばよしでやっていた。

相手側の電源が入っていない時、こちらの8255から電圧を出していると、向こうの8255が壊れるおそれがある。

CMOS等の入力回路を見たことがあるだろうか。たとえば74HCのデータシートに載っている。入力ピンにはダイオードが電源とGNDに付いている。静電気対策のため。
もし電源OFFのときに信号線に電圧がかかると、そのダイオードを通って電源に流れる事になる。
これで2つの問題が発生する。ひとつは、その漏れ電流で本来電源OFFの回路に微妙に電圧がかかって問題を起こす。リセットが正常にかからなかったりする。
もうひとつは、この保護ダイオードは電流を流すように作られていない為、壊れる可能性が高い。

どうすれば良いかというと、電圧を送らないようにする。送信側はオープンコレクタ(オープンドレイン)のICを通して出力する。
Lかオープン(ハイインピーダンス)のどちらかしかない。

受信側にプルアップ抵抗を設けてやる。オープンコレクタで論理反転するが、送信側か受信側のどちらか(のソフト)で論理反転してやれば済む。
74LS14等のシュミットICで受信しても良い。波形整形できる。
オープンコレクタはL→Hの立ち上がりが遅い(プルアップ抵抗で浮遊容量を充電するため)ので、速く転送しようとしても立ち上がりが追いつかない。ケーブルの長さによっては転送を遅くしないとうまくいかない事がある。
送信側のICのドライブ能力次第だが、プルアップ抵抗をできるだけ小さめにしてみるとか。たとえば1KΩとか。実例としてFDD I/Fは、3.5インチの場合だと1KΩプルアップだったと思う。
トラックバックURL
トラックバック一覧
コメント一覧
kanitama - 2025年11月06日 20:22
試行錯誤しながら経験を重ねることが大切だとわかります。たとえ失敗してものちに原因がわかることで経験値がアップするかもしれません。大きな代償を払ってもあとで取り返せるかもしれません。いくつになってもチャレンジは続けたいですねw。
コメント投稿

名前

URL

メッセージ

- CafeLog -