CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

シリアルコントローラ

今回、ボード上に実装したシリアルコントローラSCN2681(DUART)は初めて使う品番ですが、フィリップス社のマニュアルが見つかったのでざっと確認しておきます。

機能は非同期調歩型シリアルコントローラが2組、ボーレートジェネレータ、タイマ/カウンタ、割込みコントローラ、入力ポート7本、出力ポート8本が集積されています

シリアル部分はuPD7201TL16C550と似たようなものだろうし後でシリアル接続デバッグの時に見ればいいだろうとほっておいて先ずはLEDチカチカにつかう汎用ポートの使い方を調べていました

マニュアルを読み進めると、この汎用出力ポートはシリアルコントローラのステータス出力と兼用になっていて制御レジスタOPCRで機能切替するとあります。パラレルデータの実体はOPRレジスタにセットしてその内容をビット反転したものが出力されるとあります。8255みたいに初期化が必要なのはこれはまぁ想定内。

ところが内蔵レジスタマップを見てみると制御ワードを入れるOPCRレジスタはあるのですが、データ本体のOPRレジスタがどうしても見つからないのです

え、OPRが直接アクセスできない?どうやってパラレルデータをセットするのか・・と一瞬悩みましたがこれはアドレス0xEにあるSet Output Port Bits Command0xFにあるReset Output Port Bits Commandを使うようです。これらのワードで「1」になっているビットが選択的にセット/リセットされ「0」のビットは変化なし、前の状態を引き継ぐとなっています。つまり8255で云うところのビットモードのようなものです(しかもこちらは全ビット同時に実行できる)

たしかにビットごとに別々の制御をさせるときは他のビットに影響を与えることなくそのビットだけON/OFFしたいわけでこの方が合理的なわけです

ただしLEDチカチカのようにビットパタンをパラレルで同時出力する場合は「1」にするところと「0」にするところをそれぞれ明示的に2度指定してやらなければなりません。

たとえばポートに0x55を出力する場合はこうなります: