先日10日から,ホストのモデムを2400MNP5に変更した.モデムの設定は,端末速度固定モードで9600BPSとした.こうしておけば,今までのように接続される速度(300,1200,2400など)に応じてホスト側の通信速度を切り替える必要がない.フロー制御は,MNP接続の有無に係わらずRS/CSフローを併用,通常はXON/XOFFとRS/CSが動作する.XMODEM転送時は,RS/CSフローのみとする.アクセスするモデムを端末速度固定モードの9600BPSを始めとして,300BPSまで接続テストしたがどれもうまくいった.各速度毎にMNPを設定,非設定にして試すもすべて良好.回線がつながらないというような事態は一度も無し.MNPと相性の悪いといわれるXMODEMもテストするが一応問題なく転送できた.
アクセス中にホスト側のモデムの信号ランプを見ているとなかなか面白い.RSやCSランプがフロー制御のために点消灯する.CSランプが消灯するとそれに合わせたかのようにSDのランプが消灯する.(当り前か.)ホストに向けて無手順ファイルアップロードを行うと一時的にRSランプが消灯し,合わせてRDランプが消灯する.これでホスト側からのフローオフが有効に働いているのが分かる.
実のところ,以前にホストのプログラムをQBで書き直した時に,いずれはMNPを使用するだろうとMNP対応可能なようにRS/CSフロー制御をプログラミングしておいたのだが,それの動作や効果を試すのはこれが初めてである.
さて,これで通信速度が早くなったと一安心したいのだが,テスト中に,やはりホスト側の不具合というか処理の遅さが目に付きだした.何点かそれを列挙してみる.
- XMODEM(CRC−1K)のCRC計算が遅い.
これは,以前からも気が付いていたのだが,1ブロック(1024バイト)を転送し,受信OKのACKを受けてから次のブロックの転送を始めるまでに2〜3秒間ちょっと間が空くことで分かる.原因はCRCの計算である.
QBはBASICであるがゆえにというのが正しいのかどうか知らないがビットシフトや符号なし整数の演算命令がない.このため効率よくCRC計算させるプログラムが書けない.どうしても時間がかかるのである.1024バイトともなるとその遅さが顕著に現れる.128バイトなら処理時間が目につくという程ではない.これでは,何のための高速転送か分からない.
- ホストの実効処理速度は2400が限界.
MNP5(圧縮あり)で,ホスト,端末とも9600の端末速度固定モードでモデムを使うならば,実効速度3000〜最高(運がよければ)4800で通信可能というのがMNPモデムの売り文句なのだが,この効果を活かすためには,ホスト,端末とも計算機処理が9600に追従出来ての事である.ホストの内部処理が遅ければだめだ(端末側の通信ソフトは問題なかろう).
回線ポートの送信速度を早くしたところで,ポートに出力するデータを9600の速度で準備できないのでは意味がない.受信の場合は,たびたびフローストップを掛けてしまう.1200非MNPで接続した時,モデムは9600BPS(実効速度は必ずしも9600ではない)でホストからくるデータを回線に出し切れず,データ転送途中でCSをオフにしてフローストップしてくるのが,モデムのCSランプで分かる.2400非MNPで接続した時,同様にCSランプが途中で消灯するならば,ホストは実効速度2400以上でデータ送信している事になる.ところがである,ボードのアーテイクルを連続読みだししてもCSランプが消灯しない.つまり,9600BPSでモデムに接続していても,流しているデータの速度は2400程度であるということだ.
さて,この原因だが一つにはCPUの処理速度が挙げられる.ホストはPC−9801M2だが,このマシンは8MHzの8086である.このCPUは今や骨董品に近い存在だ.VMやラップトップのLV21,LV22などに使用されているCPUV30よりもまだ遅い.これらの機種の遅さは定評だが,それよりもまだ遅いのだから困ったものだ.ちなみに12MHzの80286で動くRX21を使ってホストを試験的に動かすと4800BPSは充分出るようだ。24時間無人で動くホスト(そしてホストだけにしか使えない,このマシンを他の事に使うことができない)にはあまり高価なマシンを使うわけにもいかずいたしかたの無いところ。
二つ目の原因としては,ホストのプラグラムに問題がある.QBに備わっている通信回線制御にはRS/CSのフロー制御はない.また,xon/xoff制御で回線オープンするとバイナリモードが通らないのはもちろんの事,CTRL+Zの変換やタブ変換など勝手な事をやらかしてくれる.プラグラム上でフロー制御を管理したいと思えばこれら全てをプログラムしてやる必要がある.また,ATLASでは,画面制御のエスケープシーケンスを送信したり,しなかったりの制御を行っている(アーティクルの中のESCシーケンス部分のカットも行う).処理中にESCがきたかどうか,xon/xoffは受信したかどうか,RSをオフするタイミングかどうか,受信したBSキーは漢字の後かどうかなどをうまくやろうと思えば,一文字送受信する度にいろんな処理モジュールをくぐらせる必要がある.そしてこれらをQBでプログラムしているのである.これでは,とうてい高速処理は望めない.さらに悪い事にコンパイルしてみてもQBのシステムランタイムルーチンが裏でタイマー処理などの複雑な割り込み処理を常に行っている.いわゆる荷が重いというやつである.アセンブラかCで書き直さない限り改善が望めない状況である.
- ESCキーの聞くタイミングがずれる.
これは,1200で接続した時に起きるのだが,モデムのデータバッファリングの作用により,ホストがESCを受け付けるタイミングと端末でESCを押すタイミングがずれてしまう事に起因する.別の現象として,ログオフした時に,ログオフメッセージが完全に表示されないうちに回線が切断されてしまうという不具合もある.ホストの方は,ログオフメッセージをモデムに向けて完全に送信してから切断処理しているのだが,この時点で,メッセージはモデムにバッファされただけで回線上には掃きだし切れていない,このようなタイミングでホストがERオフ(切断処理)するものだからモデムは無情にもバッファ内のデータを掃き出さないうちに回線を切断してしまう.モデムのバッファリングを活用したがゆえの副作用がでたわけだ.
最近のCは,アセンブラを併用せずとも割り込みが記述できるようになった.CPU速度の遅いM2ではあるが,Cでプログラムし,QBの管理から離れれば今よりは高速処理が期待できるのではないかと思い,Cによるプログラムの書き直しに着手した.この連休では通信回線制御の部分を書き上げた.XMODEMのモジュールもCで書き直した.QBはもともと構造化言語になっているので書き直しは割と楽である.そのままCの文法に変換していけば事足りる.とはいうものの先は長い,やはり個人の能力の限界を感じてしまう.ホストプログラムには,プログラミングの課題が豊富に存在する(回線制御,ファイル管理,エディタ,検索処理などなど).一つ一つ解決しなければならないが,それもまた楽しである.