IRCS-AUX(仮称)計画

第2部

〜IRCSを利用した通信の実現〜
〜物理層デバイスドライバの完成〜
1.はじめに
さて、第1部にて、IRCS−AUX(略してIAU X,未だに仮称(ゲ、愛称募集中(オ)物理層の実現の為の目処は付きましたが、 完成までは行きませんでした。確か、残っていた課題は
 1)物理層低級処理部の完成
 2)物理層と上位層とのインターフェース
 3)物理層と上位層との間のデータ内容
 4)リンク層の問題 です(忘れてる)。3) は実質的に 2) と変わりませんね。
その後、1997年4月の段階で、物理層は完成しました(デバッグが完全に終わ ったのは7月だったりしますが。)。この記事は、そのまとめとなります。がし かし、もう半年も経って、何をやっていたか、忘れてしまいました。(^^; ログ が残っていたので、それから文章を起こしています。(ソースを見ても、もはや 思い出せない)(^^;;;
2.物理層低級処理部の完成
(変形)PPM,家製協フォーマット,を使う事は決まったので、その実装お よび実現が問題となります。
2.1.従来方式のまま(1997 Feb.27)
さて、従来方式ってどんなだっけ?
えーと、シリアルチップ:8251 の割込を使い、76.8kbaud/9.6kcps、毎秒96 00回もの割込を発生させ、1バイトずつ、CPUが解析すると言うものです。 この方法だと、猛烈な勢いで割込が発生するため、非常に速いCPUで無ければ、 処理が追い付かないと言う問題があります。それをいかに軽い処理にし、遅いC PUでも動作するようにするか、という問題です。
まずは、オーソドックスに、普通の通信ソフトが行っている様に、割込回数を 半分にしてしまう方法を試してみました。
PC-9801/9821 シリーズの 8251(互換)には、最低2バイトのバッファが有り ますので、それをうまい事使えば、4800回の割込で、9600回データを得 られます。
その結果、送信処理が追い付かないのは治りました(80486SX 33MHzにて)。 しかしながら、相変わらず受信処理はこぼしまくります。受信バッファを巨大化 したり、CRC生成/検査をシリアル割込外で行ったりしましたが、ダメです。 その様な状態では、下手な小細工をしても無駄でしょう。素直にアルゴリズムを 変更すべきです。なお、386SX クラスのマシンで実験したところ、通信速度を 51.2k baud にまで落とせば、エラー率が3%程度まで減少しました。しかしな がら、これはIRCSハードウェアのマージンぎりぎりとなります。
2.2.第4の方式(1997 Mar.12)
既に3つも方式ためしていたっけ?ログにはそう書いてあるけれど。
さて、新しいアルゴリズムを考案する事にしました。従来の方式では、常時モ ニターしていたが為、割込回数が多すぎるのが問題でしたから、常時モニターす る事をやめる事にしました。
まず、単純にポーリング間隔をトレーラーの長さによる限界まで引き伸ばし、 単純に処理を軽くする事が考えられますが、これは気分的にいいものでは有りま せん。見落とす可能性が上がる訳ですから。他に方法が無かった時に試しましょ う。
FEZ師匠と共に、98(きゅうはち/きゅうせんはっぴゃく not きゅうじゅうはち)や8251の 資料を漁りました。AT/compatible には無く、98独自の機能として、同期 転送モードと言うのが有りますが(そもそも、この機能が有った事がIRCSの 始まり。最近はIrDAの為にこの機能をわざわざ追加したそうな)、そのモー ドにて、同期キャラクタ検出機能と言うのが有ります。ある事は知っていました が、どのような物かは全く気にしていませんでした。この検出機能をIAUXに 利用出来ないか、試してみる事にしました。
同期転送モードでは、送信側と受信側で、ビット単位の同期を取る必要が有り ます(START/STOP bit が無いので)。したがって、通信開始時に、同期を取り ます。具体的には、送信側では、SYNCキャラクタを送信し続け、受信側では ハントモードに入り、SYNCキャラクタを待ち、同期を取ります。同期が取れ たならば、同期転送モードにより、通信を開始します。
このハントモードの試験プログラムを組み、パソコン2台をクロス接続し、色 々試したところ、ハントモードでは、SYNCキャラクタを検出するまで、同期 転送モードにかかわらず、受信割込が発生しない事が分かりました。しかも、一 度SYNCキャラクタを検出すると、今まで試していた、同期転送モードの様に、 常時割込が発生するようになる事も分かりました。
この事を利用すれば、データを受信していない時の割込を無くし、負荷を大幅 に軽くする事が出来ます。この時、副作用として、リバースケーブルによる動作 試験が出来なくなりますが(IRCSとリバースケーブルでは論理が逆である事 が大きな問題となる)、IAUXを実現出来るかもしれないと言うメリットに比 べれば、大した事は有りません。リバースケーブルデバッグ機能は、ばっさり削 除し、FEZ師匠にデバッグ用のIRCSハードをもう1台借りる事にしました。 また、データが来た時だけ、割込が発生するようになる(ハズ)ので、一度割込 がかかった後は、1パケット受信し終わるまで、割込終了せずに、受信し続ける 事にし、CPUパワー全てを受信につぎ込み、受信成功率を大幅に上げる事をも くろみました。実際、IRCSは指定された時に、全CPUパワーをつぎ込んで 受信に専念します。
さて、この方式実現の為の改造の困難や,バグ,エンバグなどに悩まされ、ま た、ダブルSYNCキャラクタハントモードへの変更など(軽量,確実化)、完 成までに1週間消費しましたが(後述のI/Fの骨組みの実装,布石もやってた けど)、動作試験版IAUX0.40 が完成しました。その結果、十二分に実用に 耐えそうであり、9801VM/VX クラスでも実現出来そうな事が分かりました。
2.3.正式公開版作成(1997 Mar.20)
実現までには、まだ壁が有りますが(有ったと思う)、一番大きな壁は越えま した。まだ、細かな事が有ったかと思いますが、忘れました。これにて物理層低 級処理部は完成しました。
3.上位層とのインターフェース(1997 Mar.20)
さて、今作っているものは、物理層の制御ソフトですから、一般的には、メイ ンで走るソフトではなく、常駐物かデバドラにするのが良いでしょう。MS-DOS/ DOS/V の標準的なインターフェースである、デバイスドライバにする事にし、上 位層からの制御方法は、ある程度メジャーな通信デバイスドライバである、MC D互換とする事にしました。
これはわざわざ記述するほど難しくは有りません(物理層低級処理の実現と比 べれば)。非常に面倒で、えらい手間がかかりましたが。詳細は、IAUXパッ ケージ付属のAPIリファレンス(ひょっとしたらこの記事の付録として添付) を参照して下さい。
4.上位層とのデータ
KISS。決定。私が packeter だから。以上。投げやりだなぁ。
KISSというのは、上位層との間でやり取りするパケット(データ列)の先 頭と最後尾に、フラグとなるデータを付加し、パケットの中に、フラグとなるデ ータと同じデータが有れば、メタデータを起き別のデータに置き換える、と言う ものです。
IAUXがパケット方式によりデータを送受信するので、リンク層にて、パケ ットの先頭が判別出来るように、KISS方式を採用しました。(先頭が判らな ければ、リンク層の為のデータと、さらに上位層の為のデータの区別が付きにく くなり、効率が悪くなる)
5.こまごまとしたこと
  • 1-persistent CSMA処理。
  • CRCによるエラー検出。
  • カスタムコードによる検査。
  • 8MHz系/5MHz系の自動判別。
  • MCD互換デバイスドライバAPI搭載。
  • MCD互換 I/O Control API搭載。
  • MCD互換 Direct PASCAL call API搭載。
  • デバイスドライバ対応デバッガが無い(;_;) エライクロウシタ
  • MS-DOS の仕様により、デバドラで難しい事をやると MS-DOS が落ちる(;_;)
  • IAUX動作開始/IRCS未接続への対応。
  • IAUX動作終了/通常の通信モードへの移行,への対応。
  • 割込処理への本格対応。
  • ハントモードの扱いを間違え、はまる。
  • デバドラ常駐時のオプションによる環境設定に対応。
  • コマンドラインユーティリティーの内蔵。
  • 「読」書き。
  • IRCS/IAUX再初期化対応(活線接続,取外対応)。
  • デバグデバグデバグ。
  • エンバグエンバグエンバグ。
  • バッファフル処理。
  • com化。
  • UMB対応。
  • idle データ動的確保で省メモリ。
  • VM(10MHz)→VX(8MHz) 動作試験。理論上の問題は無し。
    # 兎小屋にモニタが1台しかなく、片方しか受信出来なかったんだわ、これが。
  • 通常の通信ソフトとの衝突に対応。
  • XMS,EMS非対応。
  • IRCSハード検出の確実化。
          RETRY 32回での、検出試験結果。
         環境 前方3m,90゜下方1m,90゜上方1.5m,CLEAN
          45゜左1.5m机,45゜右1m自分。
         総試験回数 223 回
         失敗回数 13 回
         失敗率 5.8 %
         失敗時待ち時間 約1秒
         
          RETRY 128回にて、検出試験350回エラーフリー達成。
         ただし、失敗待ち時間が4秒……。
  • VM(10MHz)←→VX(8MHz) 動作試験。なんら問題無し。
    # モニタ1台なのは、気合でカバー。
  • 暫定公開。
     FEZ Engineers' Network consIsts of eXperts
     ファイルボード:0030: IRCS 赤外線リモコンサポートソフトウェア
     16:IAUX043.LZH 20K 0 97/04/01 FEN025
      MS98>AUX driver with IRCS ver0.43暫
  • コマンドラインユーティリティにて int 24h 対応。
  • 八十八夜,正式公開。
     同BBS
     18:IAUX044.LZH 28K 1 97/05/03 FEN025
      MS98>AUX driver with IRCS ver0.44
  • MS-DOS のバグにより、SHARE が落ちる事への、消極的対応。(thanks to FEZ)
  • MCD互換 Direct C call API搭載。
  • MCD互換 Direct ASSEMBLY call API搭載。
  • KTX付属KTXMCDにてIAUXを積極的に使える様に対応しようかと、
    解析したところ、バグ発見。大幅に作りなおしてしまう。
  • KTXMCD:MCD/IAUX自動判別。その他大量にいじる。
  • API切り離し対応。
    1997 Jun.06 Fri. ver0.50正式公開
     22:IAUX050.LZH 44K 0 97/06/07 FEN025
      MS98>AUX driver with IRCS ver0.50
     FEZ師匠いわく「水無誕生日おめでとう」らしい。
  • エンバグ発見。C call にもかかわらず、CY 返しをしていた。マヌー
     24:IAUX051.LZH 44K 1 97/08/03 FEN025
      MS98>AUX driver with IRCS ver0.51
     AUX driver with IRCS PC-98x1 standard 8251 "IAUX" version 0.50
  • 任務完了。
    と、まぁ、色々有りすぎて、何が有ったか細かい所までは覚えていません。
    6.FIN
    以上により、物理層は完成しました。
    あとはリンク層を完成させる事により、全く通常の通信回線として扱う事が出 来る様になります。しかしながら、技術的興味の有った部分は完成してしまった ため、もう技術的興味は有りません(私は)。したがって、リンク層ドライバを 作る気は、ほとんど、全く、有りません。ま、パケット通信の快適化の為に、A X.25ドライバ,KISS処理付き(TNCには元々KISSモードが付いて いる)を作った場合、そのままIAUXに利用出来るでしょうけれど。ノーマル のAX.25ってば、番号フレーム処理が甘いんだよね〜。非番号制フレームだ と、届いたかどうか判らないしね〜。通信ゲームを作ったら(興味は有るが、作 る気は無い)、リンク層も書かなくちゃならないし。そもそも、モデムを作った としたら、リンク層書かなくちゃねぇ。リンク層ドライバ書くの面倒だなぁ。F ENIXどうなるんでしょ?最近、熱く燃えられる番組ほとんど無いし。ΖΖ最 終回か(2Dの飛龍に若干はまったらしい、VG ゾロ(?)は結構 はまったけど、 MGΖΖが出たとしたらはまりそうで恐ひ)。マクロス15周年Anniver saryか、もうそんなに経つのか……。Thexder燃え〜。FireHa wk燃え燃え〜。はみだし刑事情熱系いいっすね。何書いてんだか。
    7.参考文献&すぺしゃるさんくす
    バイブル本こと「パケット通信ハンドブック」 秦 正人,山内 雪路
    CQ出版社 1987年5月10日初版,1990年2月20日第7版
    バイブル本の続編「パケット通信ネットワーク」
    人の借りて読んだので、諸元は分かりません(._.)
    秀和の解析マニュアルとか、トラ技SPとか、テクニカルデータブックとか……
    FEZ師匠、thomas仙人、うぼうぼ、えーと後は……(^^;

    執筆:1996年10月某日〜1997年2月10日、 1997年2月27日〜7月15日〜10月12日、 1997 Nov.07 Fri.
    web 用に修正:1998年9月3日

  • Last modified on Thr,03 Sep,1998.
    FENIX ほめぱげ
    G-HAL ほめぱげ
    ソフトヱアに関するウダウダ
    →→ IAUX に関するウダウダ
    Mail to, メールはこちらへ
    Suggestion Box, 投書箱
    BBS, 掲示板 UserName:BBS、Password:BBS
    (C) 1996 G-HAL