X1TurboBASICにおける、高速RS232C送受信方法                         2002.8.2 佐藤 達之  X1TurboのRS232Cは、基準クロックに2MHzを使用しているため通常 の方法だと9600bps以上での通信ができません。  X1のSIOに入力出来る最大クロックは2MHzで、このとき125000bpsとなり DOS/V PCでよく使われる115200bpsと近い事が分かります。  ハードウェアの工作を行い特殊なアダプターを作成すればよいのですが、誰にでも 手に入るクロスケーブルのみで、X1とPC間で高速通信できないかどうか検討しま す。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 1.まえおき −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  X1のRS232Cポートでは、SIO-BのDTR信号をLowにすることで、外部クロックを 選択する事が出来ます。  本来同期通信の為の仕様ですが、調歩同期モードでも使えます。  SIO-Bの、DTRをLowにして、外部クロックを選択し、RS232CポートのST2(15),RT(17)に 通信速度の16倍のクロックをRS232Cレベルで入力します。  例:115200bpsの時、115200 x 16 = 1.8432MHz  こうすることで、Z80用のリモートデバッガ等を115200bpsで普通に使用できるように なるので、使い勝手がかなり良くなりますが、RS232CジャンパBOX等を使用して特殊なア ダプターを制作する必要があり、誰でも簡単に使えるというわけには行きません。  同期通信モードを使って特殊なエンコードを行えば、115200bpsで送信できますがこれ だと受信が出来ません。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 2.そのままでは8ビット送受信は無理 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  調歩同期では、スタートビットの変化を検出して後、ビット幅の中間の位置をサンプ リングしていくため、時間マージンはビット幅の±50%と非常に広くなっています。  X1で設定可能な12500bpsは、PCの115200bpsと比べて約+8.5%ですから、一見 そのまま通信出来るような気がします。  ところが、同期が取られるのはスタートビットだけなので、誤差は累積されてしまい、 10bit転送する間には誤差は8.5%x10 = 85%と広がってしまい許容範囲を大きく越えてし まい、データは完全に化けてしまいます。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 3.ビット幅を減らすと −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  そこでビット幅を減らし、誤差が小さい部分のデータだけを使用できないかと考えて みます。  ところが、普通にビットを削っただけでは、下記のようにbit5受信時には、完全に1 ビットずれてしまいます。  SIO内部や、ドライバ、線間ディレイを考えるとbit3辺りが限界になってきます。  ところが、PC側のビット長は5ビット未満に出来ないため、STOPビットが正常に検出 できないため、絶えずフレーミングエラーが発生し、データバケ、次データのスタート ビット同期不良の危険に絶えずさられており、安心して使えません。 X1側:125000bps, 8bit , no parity , stop 1 PC側:115200bps, 8bit , no parity , stop 1 time(us) 0 8 16 24 32 40 48 56 64 72 80 | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ X1 TX |START|bit0 |bit1 |bit2 |bit3 |bit4 |bit5 |bit6 |bit7 |STOP | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ margin(us) 3.66 2.98 2.3 1.62 0.94 0.26 -0.42 -1.1 -1.78 -2.46 ---+-----+------+------+-----+------+------+-----+-----+------+---- PC RX | ST bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 STOP ---+-----+------+------+-----+------+------+-----+-----+------+---- | | | | | | | | | | time(us) 4.34 13.02 21.7 30.38 39.06 47.74 56.42 65.1 73.78 82.46 PC側:125000bps, 8bit , no parity , stop 1 X1側:115200bps, 8bit , no parity , stop 1 time(us) 0 8.68 17.36 26.04 34.72 43.4 52.08 60.76 69.44 78.12 86.8 | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ PC TX |START|bit0 |bit1 |bit2 |bit3 |bit4 |bit5 |bit6 |bit7 |STOP1| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ margin(us) 4 3.32 2.64 1.96 1.28 0.6 -0.02 -0.76 -1.44 -2.12 ---+----+-----+-----+----+-----+----+----+----+-----+------ X1 RX | ST bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 STOP | ---+----+-----+-----+----+-----+----+----+----+-----+------ | | | | | | | | | | time(us) 4 12 20 28 36 44 52 60 68 76 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 4.特殊エンコード/デコードによるニブル転送 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  そこで、送信時/受信時に特殊なエンコード/デコードを行うことにします。  基本的な考え方は、送信側で2ビットづつ同じデータを送信して、受信側でマージン の広いビット位置を選択して受信をすることで、大きなマージンを取ります。  ただしビット0だけは、マージンが多いので1対1で送受信ます。  当然8ビットは1キャラクタで送れないので、1バイトを4ビットx2キャラクタに 分解します。 **************** X1送信 −> PC受信 **************** 1)通信プロトコル X1送信側 125000bps , 8bit , no parity , stop 2 PC受信側 115200bps , 8bit , no parity , stop 1 転送速度 125000bps/11bit/2chr = 5681cps (56818bps相当) 2)エンコード/デコード表 X1送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STP1|STP1| +--------------+-----+----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START| bit0 | bit1 | bit2 | bit3 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START| bit4 | bit5 | bit6 | bit7 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+----+ PC受信デコード表 +--------------+-----+----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0| X |bit1| X |bit2| X |bit3| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4| X |bit5| X |bit6| X |bit7| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8 16 24 32 40 48 56 64 72 80 88 (us) | | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ X1 TX |START| bit0 | bit1 | bit2 | bit3 | STOP | +-----+-----------+-----+-----+-----------+-----------+-----------+ margin 3.66 5.02 6.38 7.74 6.9 5.54 (us) ---+-----+------+------+-----+------+------+-----+-----+------+---- PC RX | ST bit0 --- bit1 --- bit2 --- bit3 --- STOP ---+-----+------+------+-----+------+------+-----+-----+------+---- | | | | | | | | | | time(us) 4.34 13.02 21.7 30.38 39.06 47.74 56.42 65.1 73.78 82.46 最小マージンはスタートビットの3.66us=42%/RXbitであるが、これを除いたすべての ビットは本来の規定50%を上回っている。 **************** PC送信 −> X1受信 **************** 1)通信プロトコル PC送信側 115200bps , 8bit , no parity , stop 1 X1受信側 125000bps , 8bit , no parity , stop 1 転送速度 115200ps/10bit/2chr = 5760cps (57600bps相当) 2)エンコード/デコード表 PC送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0| bit1 | bit2 | bit3 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4| bit5 | bit6 | bit7 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ X1受信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START|bit0| X |bit1| X |bit2| X |bit3| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START|bit4| X |bit5| X |bit6| X |bit7| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8.68 17.36 26.04 34.72 43.4 52.08 60.76 69.44 78.12 86.8 (us) | | | | | | | | | | | +------+------+------+------+------+------+------+------+------+------+ PC TX |START | bit0 | bit1 | bit2 | bit3 | STOP | +------+------+-------------+-------------+-------------+-------------+ margin 4 3.32 6.76 8.08 7.92 7.24 6.56 (us) ---+-----+------+------+-----+------+-----+-----+-----+------+ X1 RX | ST bit0 --- bit1 --- bit2 --- bit3 --- STOP ---+-----+------+------+-----+------+-----+-----+-----+------+ | | | | | | | | | | time(us) 4 12 20 28 36 44 52 60 68 76 最小マージンはスタートビットの3.32us=41%/RXbitであるが、これを除いたすべての ビットが本来の規定50%を上回っている。 ********************* 注意点 ********************* ・1バイトを2キャラクタの分割するので、専用の送受信モジュールが必要 (または、送信前にエンコード、受信後にデコード) ・1バイト目受信後、一定時間内に2バイト目が来ない場合は1バイト目を破棄する。 ※2001.10.29 追記 X1受信側のストップビット長は1ビットとしたが、送信側と受信側で異なるビッ ト数を設定することは出来なかった... 送信側の2ビットは必修なので、受信側でしっかり2ビット監視されてしまうと フレーミングエラー+次バイトの取りこぼしを発生してしまい、この方法は使えない ということになる。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 5.1キャラクタ5ビット化と高速化 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー もう少し発展させて、1キャラクタ5ビットに変更し、多少の高速化を図る。 ニブル(4ビット)時に比べると、最小マージンが劣化するが、5ビット化により ロー/ハイニブルの種別が区別できるため、プログラムが多少楽になる。 ***************** X1送信 −> PC受信 **************** 1)通信プロトコル X1送信側 125000bps , 8bit , no parity , stop 1 PC受信側 115200bps , 7bit , no parity , stop 1 転送速度 125000bps/10bit/2chr = 6250cps (62500bps相当) 2)エンコード/デコード表 X1送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START|bit0|bit1|bit2| bit3 | 0 | 0 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START|bit4|bit5|bit6| bit7 | 1 | 1 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ PC受信デコード表 +--------------+-----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0|bit1|bit2|bit3| X | 0 | X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4|bit5|bit6|bit7| X | 1 | X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8 16 24 32 40 48 56 64 72 80 (us) | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ X1 TX |START|bit0 |bit1 |bit2 | bit3 | 0 | STOP | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ margin 3.66 2.98 2.3 1.62 7.06 7.58 6.22 (us) ---+-----+------+------+-----+------+------+-----+-----+ PC RX | ST bit0 bit1 bit2 bit3 --- 0 --- STOP ---+-----+------+------+-----+------+------+-----+-----+ | | | | | | | | | time(us) 4.34 13.02 21.7 30.38 39.06 47.74 56.42 65.1 73.78 最小マージンは1.62us=18%RXbitになる。 ***************** PC送信 −> X1受信 **************** 1)通信プロトコル PC送信側 115200bps , 7bit , no parity , stop 1 X1受信側 125000bps , 8bit , no parity , stop 1 転送速度 115200ps/9bit/2chr = 6400cps (64000bps相当) 2)エンコード/デコード表 PC送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0|bit1|bit2| bit3 | 0 |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4|bit5|bit6| bit7 | 1 |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ X1受信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START|bit0|bit1|bit2| X |bit3| X | 0 | X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START|bit4|bit5|bit6| X |bit7| X | 1 | X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8.68 17.36 26.04 34.72 43.4 52.08 60.76 69.44 78.12 (us) | | | | | | | | | | +------+------+------+------+------+------+------+------+------+ PC TX |START | bit0 | bit1 | bit2 | bit3 | 0 |STOP | +------+------+------+------+-------------+-------------+------+ margin 4 3.32 2.64 1.96 8.08 7.92 2.12 (us) ---+-----+------+------+-----+------+-----+-----+-----+------+ X1 RX | ST bit0 bit1 bit2 --- bit3 --- 0 --- STOP ---+-----+------+------+-----+------+-----+-----+-----+------+ | | | | | | | | | | time(us) 4 12 20 28 36 44 52 60 68 76 最小マージンは1.96us=24.5%/RXbitである。 **************** 注意点 ***************** ・1バイト目受信後、一定時間内に2バイト目が来ない場合は1バイト目を破棄する。 ・1バイト目/2バイト目の順番にデータが来なければ、フレーミングエラーとする −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 6.再び4ビットに戻してマージンを広げる −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  エラーレートを軽減するため、再度4ビットに戻してマージンが最大に なるエンコード方法を探す。 ***************** X1送信 −> PC受信 **************** 1)通信プロトコル X1送信側 125000bps , 8bit , no parity , stop 1 PC受信側 115200bps , 7bit , no parity , stop 1 転送速度 125000bps/10bit/2chr = 6250cps (62500bps相当) 2)エンコード/デコード表 X1送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START|bit0| bit1 | bit2 | bit3 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START|bit4| bit5 | bit6 | bit7 | STOP | +--------------+-----+----+----+----+----+----+----+----+----+----+ PC受信デコード表 +--------------+-----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0|bit1| X |bit2| X |bit3| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4|bit5| X |bit6| X |bit7| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8 16 24 32 40 48 56 64 72 80 (us) | | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ X1 TX |START|bit0 | bit1 | bit2 | bit3 | STOP | +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ margin 3.66 2.98 5.7 7.06 7.58 6.22 (us) ---+-----+------+------+-----+------+------+-----+-----+ PC RX | ST bit0 bit1 --- bit2 --- bit3 --- STOP ---+-----+------+------+-----+------+------+-----+-----+ | | | | | | | | | time(us) 4.34 13.02 21.7 30.38 39.06 47.74 56.42 65.1 73.78 最小マージンは2.98usになる。  通信速度は 5000bps相当 ***************** PC送信 −> X1受信 **************** 1)通信プロトコル PC送信側 115200bps , 7bit , no parity , stop 1 X1受信側 125000bps , 8bit , no parity , stop 1 転送速度 115200ps/9bit/2chr = 6400cps (64000bps相当) 2)エンコード/デコード表 PC送信エンコード +--------------+-----+----+----+----+----+----+----+----+----+ |送信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 1ST|START|bit0| bit1 | bit2 | bit3 |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ |PC TX DATA 2ND|START|bit4| bit5 | bit6 | bit7 |STOP| +--------------+-----+----+----+----+----+----+----+----+----+ X1受信エンコード +--------------+-----+----+----+----+----+----+----+----+----+----+ |受信キャラクタ|START|bit0|bit1|bit2|bit3|bit4|bit5|bit6|bit7|STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 1ST|START|bit0| X |bit1| X |bit2| X |bit3| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ |X1 TX DATA 2ND|START|bit4| X |bit5| Z |bit6| X |bit7| X |STOP| +--------------+-----+----+----+----+----+----+----+----+----+----+ 3)タイムシーケンスと最小マージン time 0 8.68 17.36 26.04 34.72 43.4 52.08 60.76 69.44 78.12 (us) | | | | | | | | | | +------+------+------+------+------+------+------+------+------+ PC TX |START | bit0 | bit1 | bit2 | bit3 | STOP | +------+------+------+------+-------------+-------------+------+ margin 4 3.32 6.72 8.08 7.92 2.12 (us) ---+-----+------+------+-----+------+-----+-----+-----+------+ X1 RX | ST bit0 --- bit1 --- bit2 --- bit3 --- STOP ---+-----+------+------+-----+------+-----+-----+-----+------+ | | | | | | | | | | time(us) 4 12 20 28 36 44 52 60 68 76 最小マージンは2.12usである。  通信速度は 5000bps相当 **************** 注意点 ***************** ・1バイト目受信後、一定時間内に2バイト目が来ない場合は1バイト目を破棄する。 ・1バイト目/2バイト目の順番にデータが来なければ、フレーミングエラーとする −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 7.関連情報 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー  1)X1のRS232C周りの仕様  USER'S MANUALのRS-232Cの所に回路図のってます。 turbo側 RS232C   TXDA ->--- TXD(2) RTSA ->--- RTS(4) DTRA ->--- DTR(20) RXDA -<--- RXD(3) CTSA -<--- CTS(5) DCDA -<--- DSR(6) TXCA -<--- (DTRB==0) ? ST2(15) : ZC/TO1 RXCA -<--- (DTRB==0) ? RT(17) : ZC/TO1 CTSB -<--- CI(22) DCDB -<--- CD(8)   ポイント ・turboM<>RS232C間の信号には、それぞれRS232C用ドライバー/レシーバが 入っています。   ・DCDAにDSRを接続しているのは、Z80SIOの送信自動フロー制御させる 「オートイネーブル時」に「DCDが無効の時は受信データを捨てる」 という合の悪い仕様に対応するためにそうなっている。 ・マウスポート側のDTRBをLにすると外部同期、Hにすると内部同期となる。    外部同期として、ST2,RTに1.8432MHzを入力し、x16調歩同期モードに    すると115200bpsで送受信可能  2)TurboのBIOSでは使えない。    X1TurboBAISCはRS232Cデバイスをサポートしているので、初期化がBASICで初期化   +CTC再設定のみとお手軽な為、当初BASIC上でテストを行っていた。    ところがBASICでは受信データを取りこぼすのなんのって、調べていくうちに4800bps   程度の普通の通信でも取りこぼす、なんともお粗末なものだと判明した。    まず、125000bpsで取りこぼすのは、タイマー割り込み処理などが、割り込み禁止   状態で長らく処理されるため、SIOの割り込みが待たされてしまうことが原因である。    割り込みエントリの頭でとっとと割り込み可としてもらいたいものである。    でなければ、なんのためにデイジーチェインをサポートし、割り込みハンドラを   上位RAM内に配置したのかわかりゃしない。    4800bpsで取りこぼしの方だが、これはどうやらフロー制御の問題である。    ハードフロー制御では、通常受信バッファがいっぱいに成りそうなときに「待っ   た」を相手に掛けられるが、PC標準のUARTは送信FIFOにより「まった」を掛けら   れてから16バイトは送信して来る可能性がある。    これに対し、Z80SIOの受信FIFOは3バイトしかないのでフロー制御後にデータを   受信してやらないとオーバーフローすることになる。    ということなので、どうやらturboのBIOSはバッファがいっぱいになってから「待   った」を掛ける「低級」なドライバーを積んでいるようだ。    長々書いたが、結果としては高速通信アプリにはturboのBIOSはつかえねーという   ことである。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 8.改訂履歴 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ー 2001.11.29 初版 2002. 8. 2 「7.関連情報」を追記