2016-09-19 20:16 — asano
今回は80系の同期/非同期シリアル通信コントローラ8251 USART (Universal Synchronous Asynchronous Receiver Transmitter)の紹介です。
これはOKI電子デバイスのMSM82C51A-2、8251のC-MOS版です。
この8251、Z80 SIOが高価だったこともありZ80システムに使われることも多かったですね。
有名どころではNECのPC-8001, PC-8801の各シリーズのカセットインターフェイスやシリアルポートに使われています。これはまぁNECがZ80はCPUしか製造していなくて、8251は自社で製造していたという理由でしょうが。
雑誌等に掲載されたZ80システムの製作記事でもZ80 SIOより8251の方が多かったように思います。
これはPC-9801用のカセットインターフェイスに使用されていたもの、NEC製のμPD8251ACです。
これは自作のZ80ボード3号機に使用のもの、上と全く同じ型番ですがパッケージがツルツルタイプからザラザラタイプに変わっています。製造年が2年ほど違うせいなのか、工場が違うせいなのか。
ところで8251と言えばソフトからリセットを掛けるときの「おまじない」が有名です。論理的なソフトウェアに「おまじない」って何なんだと思いますが... リセットコマンド40Hの前にダミーの00Hを何回か書くという奴です。00Hを書く回数にいくつかの説があるのも何なんだと言うところです。
ということでこのリセットの方法について考えていきましょう。
まず8251のアドレスは2つしかないので、データ以外のモード設定・コマンド等は全て同じアドレスに書き込まなくてはいけません。そこでリセット直後の書き込みはモード設定と解釈され、その後モード毎に必要なデータを書き込むと初期設定が完了し、それ以後書き込まれたものはコマンドと解釈されるようになっています。正しくリセットを書けるためにはコマンド受付状態でリセットコマンドを発行すればよいわけですが、初期化の途中なのか初期化が済んでコマンド待ちになっているのかはわからないので、ダミーデータを書き込んで確実にコマンド待ちにしてからリセットコマンドを書き込むというのがあの「おまじない」の正体なのです。
ではダミーとして何をどれだけ書き込めばよいのでしょうか?
まず何を書き込むかですが、ダミーを書いている途中で初期化が完了する(コマンド待ちになる)可能性が高い(というか通常は初期化は完了します)のでコマンドとして解釈されてもリセットされないデータである必要があります。ダミーでリセットがかかると最後の本物のリセットコマンドの書き込み時にコマンド待ちであることが保証できなくなってしまいますから。リセットはビット6が1の場合なので、ビット6が0なら何でも良いのですが普通は00Hを使うことが多いですね。これは多くのプロセッサでレジスタに任意の値をセットするより0にするほうが簡単なためです。
次に何回書き込む必要があるかです。リセットからコマンド待ちになるまでに書き込む必要があるのは
非同期モード | ビット[1:0]が00以外 | / | / |
---|---|---|---|
同期(1キャラクター) | ビット[1:0]=00,ビット7=1 | 1st同期キャラクタ(値は任意) | / |
同期(2キャラクター) | ビット[1:0]=00,ビット7=0 | 1st同期キャラクタ(値は任意) | 2nd同期キャラクタ(値は任意) |
なので、最悪はリセットされた直後の場合で3回の書き込みが必要になります。
ということでダミーの00Hを3回書いた後にリセットコマンド40Hを書き込むとなります。
ダミーを00Hではなく80Hにすれば2回で済みますね。
でも、01Hとか03Hにしても1回にはできませんよ。
コメントを追加