PC-8001 外付け232Cボード

PC-8001

PC-8001の内蔵シリアル8251は、CMTとTTLレベルの信号ソケットに切り替えて使用できます。ただ、割り込み受信対応してないので300bpsが実用最大スピードらしいのです。もうちょっと速いスピードは出ないものか…KZ80マイコンでも115200bpsで通信できてましたし。

ユーザーズマニュアルに外付け232Cボードの命令が

PC-8001を久々に本格的にさわりだしたので、押入れにしまい込んでいたユーザーズマニュアルとN-BASICマニュアルを引っ張り出してきたところ、ユーザーズマニュアルに、外付け232Cシリアル専用命令として PRINT%n,INPUT%n (n:シリアルポート番号 1/2)などが紹介されてました。
N-BASICリファレンスマニュアルには何故か書いてないんですけどね。

拡張I/FのRS232C命令 コマンド
RS232Cポートの初期化INT%<ポート番号>,<uPD8251モードバイト>,<uPD8251コマンドバイト>
RS232Cポートへの出力PRINT%<ポート番号>,<出力するデータのリスト>
RS232Cポートからの入力 INPUT%<ポート番号>,<変数のリスト>
※232Cからデータが来るまで入力待ち
バッファ入力数取得PORT(<ポート番号>)
指定長文字取得INPUT$(<長さ>,%<ポート番号>)

PC-8001純正外付け拡張BOX PC-8011に内蔵されている回路みたいで、8251シリアルLSIを2つ装備してるそうです。しかも127バイトですが割り込み入力バッファも装備している模様。これに似せた回路を組めば割と実用的なスピード(といっても4800bpsとか9600bps)のシリアル端子を装備してMacやPCと通信できそうです。しかもN-BASICに標準の命令でシリアル通信ができそうというところがちょっと惹かれました。使ったことのない命令がまだN-BASIC ROM内にある!!

割り込み処理の仕組み

PC-8011の回路図は本ボード作成当時は手元になかったので、以下の情報から割り込み処理の仕組みを推測しました。

  • PC-8011には割り込みコントローラuPD8214が2つ装備されていて16レベルの割り込みをサポート
  • PC-8001のN-BASICは$8000(16kモデルだと$C000)から2バイト単位で処理ロジックROM内アドレスが並んでいる

EnriさんのPC-8001コーナの情報によると、PC-8001のRAMにある割り込みベクタ(処理アドレス)テーブルは以下のようになっているようです。8001実機で機械語モニタ Dコマンドで見てみるとたしかに8008hと800AhにN-BASIC ROMルーチンへのアドレスが入っています。

割り込みテーブル
8000H-8001H:IEEE-448
8002H-8003H:IEEE-448
8004H-8005H:リアルタイムクロック
8006H-8007H:未使用
8008H-8009H:RS-232C Ch1 
800AH-800BH:RS-232C Ch2 

800CH-800DH:/INT9 汎用パラレル
800EH-800FH:/INT8 汎用パラレル
8010H-8011H:/INT7
8012H-8013H:/INT6
8014H-8015H:/INT5
8016H-8017H:/INT4
8018H-8019H:/INT3
801AH-801BH:/INT2
801CH-801DH:/INT1
801EH-801FH:/INT0

Enriさん PC-8001コーナ

割り込みコントローラーuPD8214は以前KZ80マイコン用にロジックIC(74HC148)で実験で作った割り込み制御回路と一緒で、割り込みを受け付けたときに3本のデータバス用出力にコードを出してくる仕組みです。通常はZ80の割り込みモードをIM0(モード0)に設定してRST命令(0番地、8番地、18h番地…にジャンプ)を生成するのが一般的な使い方だと思ってました。

上記の使い方だとPC-8001の割り込みベクタテーブルの構成が合いません。悩んでることをTwitterでつぶやいていたらElectrelic(@electrelic)さんにPC-8001の割り込み制御はIM2(モード2)だということを教えていただきました。

EnriさんがまとめているPC-8001コーナにも「モード2」と明確に書かれてました。なんと!Z80のSIOなどのザイログ社製周辺LSIではないので割り込みモード2を使ってるとは思い至りませんでした。(いつもの思い込み…^^);;)

割り込み/INTについて
/INTはオプションのPC-8011・8012・8013によって変ります。(どのオプションでもモード2で使用)
コントロラーチップは8214(PC-8011は2つ、PC-8012・8013は1つ)を使用されています。
割り込み順位は/INT0が最低です。

Enriさんページ PC-8001コーナ

N-BASICの初期化処理で、Z80の割り込みレジスタI (アイ)に$80 or $C0をいれておいて IM2 コマンドを発行してるはず。そして、8251に受信データが届いてRxRDYがHレベルになってシリアル受信割り込みをかける際に、232Cボード側でハード的に08h(シリアル ch1)、0Ah(シリアル ch2)のどちらかを Z80 の割り込み許可(#M1と#IOREQがL)が来た時にデータバスに乗せてあげれば良さそうです。これだとKZ80マイコンで試作した回路の応用できます。

uPD8214割り込みコントローラLSIは国内で手にはいるみたいですが、割り込み時にハード的にデータバスにデータを乗せるだけで良いならロジックICでいけそう。

外部シリアルボードの回路

割り込みコントローラの回路が見えてきたので、それを 含めてその他の回路も検討します。

割り込みコントローラ

割り込みコントローラ回路は、以前KZ80マイコン用に考えた回路ものの変形で、74LS148プライオリティエンコーダからの3本の出力を74HC541へ入れます。この際に、ベクタ番号を2個おきにしたいので、データバスA1〜A3へ接続します。それ以外の端子は、プルダウンしてLレベルにします。これでシリアル1/2からの受信割り込み要求が来たら0,2,4…という感じでベクタ番号をデータバスに出力します。

アドレスデコーダ

外部シリアル1/2のI/OアドレスはPC-8011の仕様として決まっていてC0h〜C3hです。これを74LS00と74LS138で構成します。I/Oアドレス$C0はアドレスバスA7とA6信号線がHレベルなのでANDをとって74LS138のE3へ。A4とA5の信号線はLレベルなのでそのまま74LS138のE1とE2へ。あとはA1〜A3の信号線をデコードしています。

シリアルクロック

8251のシリアル送信/受信クロックはKZ80-IOBと同じく74HC4060で水晶振動子19.6608MHzを発振・分周して使用します。8251のスピードは最大9600bps、最小150bpsとします。(最悪150bpsで通信できればイイやというw)

試作基板を作ったあとで気づきましたが、PC-8001の外部バスにはシリアルクロックも来てまして、それを使えば4800bps固定にはなりますがクロック発振回路が不要になります。

8251まわりの回路

8251シリアルは基本PC-8001外部バスのアドレスバス、データバスと直結です。#RD/#WR(読み書き)端子はいつもどおり74LS32 ORゲートで#IOREQと混ぜて、#IORD/IOWRを作って接続します。

232Cボードと言いつつPC/MacとはKZ80マイコンといっしょでTTLレベルのFDTI-USBコンバータを使用することにして手を抜きました。いつもの8ピンL型ピンヘッダを2つ装備します。

試作と送受信テスト

検討した回路で、ユニバーサル基板に試作しました。割り込みで使ってない端子を外部端子にするところは省略しました。プルアップ抵抗、プルダウン抵抗は集合抵抗10kをつかいました。いつもの秋月電子Bタイプユニバーサル基板に配線しましたが、ギュウギュウですね。^^)

テストはN-BASICのPRINT%n,INPUT%nコマンドを使用してみます。いつも使っているUSB FTDIシリアル変換基板経由でMacと接続。Mac側では screen コマンドでシリアルコンソールを立ち上げました。

$ screen /dev/tty/usbXXXXXX 9600

uPD8251を2つ搭載して、232Cポート1と2どちらも9600bpsでMacとの通信に成功しました!

そこそこのスピードでシリアルポートが使えるようになったので、KZ80機械語モニターなどのシリアル通信を使ったプログラムでKZ80マイコンと同様に他のMac/PCからPC-8001へ接続することもできそうです。

コメント