8251の制御について 投稿者:markn 投稿日:2007/09/26(Wed) 09:55 No.1962 | |
|
こんにちは。 Mixiからやってきました。 私は8ビットのマルチスレッドネットワークOSであるContikiをPC-6001に ポーティングしています。 http://www.sics.se/contiki/ https://sourceforge.net/projects/contiki
いま、RS-232Cドライバを書いてSLIPを動かそうとしているのですが、どうも 通信が不安定で、特に送信系に苦労しています。 技術情報など教えてもらえないでしょうか。 具体的には、送信は ;; export symbols _rs232_arch_writeb_loop: in a, (#0x81) and a, #0x01 ; TxRDY? jr z, _rs232_arch_writeb_loop ld a, d out (#0x80), a ret となっています。受信はRS-232Cの割り込みベクタを書き換え、以下のようにバッファに受信し、あとは定期的にバッファにポーリングをかけています。 _rs232_arch_intr: push bc push af push de push hl in a, (#0x81) and a, #0x02 ; RxRDY? ;; ld a, #0x17 jr z, _rs232_arch_intr_next ; no input in a, (#0x80) ld e, a ld a, #0x01 call #0x2627 ; buffer output A=bufno, e=data ;; ld a, #0x37 _rs232_arch_intr_next: ;; out (#0x81), a ld a, #0x0c call #0x0e8f ; sub CPU handshake output A call #0x0f64 ; rs232c_intrsub pop hl pop de pop af pop bc ei ret 初期化は以下のとおりです。 ld hl, #_rs232_arch_intr di ld (#_rs232c_intr_vector), hl ei ;; 8-N-1 64x clock ld b, #0x4f call #0x0x19bf ; rs232c_init ld a, #0x37 out (#0x81), a ret
なお、Contikiをポートするに当たって、C言語+アセンブラによるクロス環境を整備しています。コンパイルしたオブジェクトファイルをPC-6001のエミュレータで動作するcas/p6フォーマットにコンバートするツールも公開していますので、よかったら使ってみてください。 https://sourceforge.net/projects/hexameter
|
| Re: 8251の制御について markn - 2007/09/26(Wed) 10:05 No.1963 | |
|
|
すみません、不要なコメントがついたまま投稿してしまいました。これらは無視してください。
手元にはRS-232C用のターミナルROMカセットがあります。こいつを自作のドライバでRS-232C経由で吸い出してみたものを逆アセンブルして参考にしています。なお、これは無手順でWindowsに送ったのですが、多少化けているようです。
あと、私の環境は、 P6側: PC-6001 + 西田さん自作の16kB増設メモリ + PC-60m61 AT側: Fedora Core 7 となっています。
基本的にターミナルソフトや自作ドライバでの無手順接続はほとんどトラブルは起こっていません。SLIPはデータの一括送受信が多くなるので、タイミングやステータスの確認、コマンドの送出などに間違いがあるのではないかと思っています。
Fedoraからのpingは通るのですが、いったん激しい通信(HTTPなど)をすると、通らなくなってしまいます(それでもP6がIPパケットを送受信していると思うと嬉しい :-)。
なお、PC-6001VWのモニタ機能には大変お世話になっています。ありがとうございます。>作者の方々 I/Oポート0x80, 0x81もエミュレートしてもらえないかなぁ...。^^;
|
| Re: 8251の制御について 西田 - 2007/09/26(Wed) 12:23 No.1964 | |
|
|
232C 初心者ですが、一つ気づいた事があります。 markn さんの 232C カードって mkII 用でしたよね。初代用とは何か違う可能性があります。 というのは、ROM 内の送信ルーチン(受信はまだ見てませんが)が、初代と mkII で違うんです。 初代: 19E8: PUSH BC 19E9: PUSH DE 19EA: PUSH HL 19EB: PUSH AF 19EC: INA (81h) 19EE: AND 01h 19F0: JR NZ,+05h 19F2: CALL 274Dh 19F5: JR -0Bh 19F7: POP AF 19F8: OUTA (80h) 19FA: JP 0FFBh mkII: 19E8: PUSH BC 19E9: PUSH DE 19EA: PUSH HL 19EB: PUSH AF 19EC: CALL 274Dh 19EF: INA (81h) 19F1: AND 85h 19F3: CP 85h 19F5: JR NZ,-0Bh 19F7: POP AF 19F8: OUTA (80h) 19FA: JP 0FFBh
これは関係ないですかねぇ。。。 |
| Re: 8251の制御について apaslothy - 2007/09/26(Wed) 22:54 No.1965 | |
|
|
PC-88エミュレータ M88の周辺ツール'TransDisk'のソースが参考になるかもしれません。 M88のページ(http://www.retropc.net/cisc/m88/)からdownload→その他→xdisk207.lzhを ダウンロードして解凍すると,siodrv.asmというファイルに8251の制御処理が入っています。 私はこの内容を全く理解しないままソースコードを流用させていただいて,PC-8001に 移植して使っていました(;^^。
改めて内容を確認すると,marknさんのコードにあるような処理に加えてエラーチェックや フロー制御の処理が入っていているので,高負荷時にこの辺の処理が有効に働いてくれ そうな気がします。 |
| Re: 8251の制御について markn - 2007/09/29(Sat) 14:15 No.1968 | |
|
|
送信についてです。 もともとの私のルーチンは送信ステータス0x01(TxRDY)で待っていました。 > 西田さん mkIIのROMルーチンでは0x85(DSR, TxE, TxRDY)で待っています。 > apaslothyさん こちらは0x81(DSR, TxRDY)で待ってますね。 その他の制御は送信時は私のソースと同じです。
ということで、ちょっと調べてみます。
|
|