|
■仕様の整理 送受信の機械語ルーチンを一本にまとめようとしているうちに、いささか混乱してきた。 改めて仕様を整理し書き留めておく。ただし暫定仕様であり、やっているうちに変更する可能性がある。 (1) 初期化ルーチン 汎用入出力ポートの8ピンは起動直後ではLowであるため、先に試作した送信ルーチンでは74LS14を入れて反転していたが、送受信の開始に先立ち「初期化ルーチン」により8ピンをHighにする。これにより、74LS14が不要になるだけでなく、5Vを供給する必要がなくなって結線が簡単になる。 D=USR0(0) により、初期化が実行される。変数はダミーである。 (2) 受信ルーチン USR関数の戻り値として、1バイトの受信データを整数変数に代入してBASICに渡す。 A=USR1(0) により、Aに戻り値が入る。受信データが文字の場合、「PRINT CHR$(A)」で表示できる。 バッファを用意すれば、もっと高速な受信が可能となろうが、いろいろと面倒な処理が付随するので、とりあえずこれで行く。送信側は、相手が1バイトずつの受信であることを勘案して手加減すること。 (3) 送信ルーチン USR関数の引数として、1バイトの受信データを整数変数に代入してBASICに渡す。 D=USR2(A) により、Aに代入されたデータが送信される。Dはダミーである。文字を渡す場合は、「A$="K":D=USR(ASC(A$))」として渡す。 文字列を渡していた試作ルーチンに比べ、1バイト送信では"退化"になるが、MSXとのやりとりを考えると一文字ずつ丁寧に送るのがベターかもしれない。 ■まとめ いろいろと試行錯誤しているうちに、上記の仕様に落ち着いてきた。 仕様を見ながら、かなり書き換えないといけない。タイミングも若干変わるかもしれない。 というわけで、もう少し時間がかかりそうである。 ■別のプロジェクト(右写真) 最近ご贔屓のaitendoで購入のボイスレコーダーモジュール(20秒)。特価で1個300円。 しどけなくぶら下がるスピーカーやマイク、スイッチ類を全部外して、プロトタイピング化を図る。 メイン基板の周囲の穴は2.54mmピッチのスルーホールなので、ハンダを除去して改めてピンヘッダをハンダ付ければ簡単にブレッドボードで使えるようになる。 5V電源。RECボタンで「ピッ」音、もう一度で「ピピッ」。最大20秒間録音可能。PLAYボタンで再生。再生中のリトリガ可能。音量調整なし。製品では実装されていなが、ボードには「LED」の表示があり、接続するとちゃんとボタン操作に合わせて点灯する。なお、右写真の最下段では、1.5Vを5Vに昇圧する電池ボックスを使用している。 現在、これの活用方法を思案中である。って、用途も考えずに購入したのかよ。 だって、面白そうで安かったんだもん。1個100円の10秒バージョンもあるし。 |
過去の投稿月別表示
-
詳細
コメント(0)
|
■とりあえず受信 まだ不安定要素はあるが、とりあえず受信できるようになった。 PC側のターミナルソフトからキーインすると、MSXに表示される。 1バイト受信してはBASICに渡すだけの最小限の機能だけなので、あまり早い処理はできない。手入力であれば追随できるが、ファイル送信では、1文字毎に50ミリ秒程度の遅延を入れる必要がある。1文字当たり0.05秒かかるので1秒間に20文字、160bps程度の転送速度か。 100 '================ 110 'SERI_RB.BAS 120 '================ 130 SAVE "SERI_RB.BAS" 140 CLEAR 200,&HBFFF:BLOAD"SERI_RB.OBJ" 150 DEFINT A-Z:DEFUSR=&HC000:A$="" 160 D=USR(0):D$=CHR$(PEEK(&HC003)) 170 IF D$=CHR$(13) THEN PRINT A$:END 180 A$=A$+D$ 190 GOTO 160 ■処理手順 (1) 入力線がHIGHになっているか確認。HIGHでなければ、HIGHになるまで待つ。 (2) LOWになるのを待つ。 (3) ちょっと待って、1ビット目を取り込む。 (4) (3)を計8回繰り返して1バイトのデータを得る。 厄介だったのは、(3)の「ちょっと待って」の部分である。少し処理を変えるたびにウエイトループの定数を変更しないといけない。結局、ステート数計算は断念し、試行錯誤で定数を決めた。 ■問題点 速度については、むやみに高速化を求めるよりも、MSXらしく十分遅く処理することで対処したい。とはいえ、現状ではカセットテープからの読み込みより遅いような気がする。これを酔狂と、いつまで笑ってられることやら。 精度については、MSXどうしの通信であれば送受信とも柔軟に対応できるので、なんとかなるさ、と考えている。PCからの受信は、まだちと厳しいなあ。 残る問題として、受信の際、なぜか漢字が文字化けする。送信ではANKモードで文字化けし、受信では漢字モードで文字化けするっていうのは、なんだかなあ。通信方法が単純ななだけに、タイミング以外に原因の見当がつかないのが困るっぽい。 ■まとめ まだ不完全ではあるものの、MSXどうしの通信に進みたい。実装に当たっては、2本に分かれている送受信プログラムの一本化も考えたい、と考えているところである。 |
|
MSXの受信側プログラムを書いているところだが、予想どおり難航中。 ステート数を数えたりしているが、なかなかうまくタイミングが取れない。 イライラしているところに、イライラするCMに出くわしたので、八つ当たり気味に紹介しておく。 サッポロビール「オフの贅沢」。 見慣れない店のまえで男が足を止める。入ってみると女将が飲み物メニューを差し出す。 「ふつう」 と 「贅沢」。 男が「ふつう」と答えると、女将は「あら、意外」。「じゃ、贅沢」と答えると、「単純」。 ムカッ。「どないせえっちゅうんじゃっ! ワシは帰る!」と、自分なら席を蹴るところである。 サッポロビールは何を考えてこんなCMを作ったのか? とき前後して、サッポロビールの社長が傷害容疑告訴で書類送付されるという「事件」が起きた。 酔っ払った社長が「感謝の意を表すため」、お店の女性のほおを両手ではさむように叩いたとされている。 同社は「手で挟んだ、という認識」としているが、たとえ本当に感謝の意を表すためとはいえ、人前で女性の顔に手を触れるなんてことを普通、するかい? というわけで、サッポロビールは「普通じゃない」というオチがついてしまった次第である。 なもんで、受信側プログラムがうまくいかない今日この頃である。 |
|
http://art17.photozou.jp/pub/378/247378/photo/29483151_org.v1258647991.gif
■実体配線図 MSXの汎用入出力ポートの8ピンは、起動時LOWである。一方、RS232Cぽい通信では、無信号時はHIGHで、スタートビットのLOWにより通信が開始される。 8ピンの状態を無信号時HIGHに反転するため、74LS14を加えている。74LS04でもいいと思うが、波形がしゃきっとするような気がする。伝送が遅延するというウワサは気にしない。 ■送信波形 9600bpsにおける1bitの信号幅は約104μ秒。一方、MSXの1ステートは0.294μ秒。 従って、1bitの信号幅で処理できるステート数は、 104μ秒 ÷ 0.2794μ秒 ≒ 373 により、約373ステート分となる。 例えば「NOP」は本来4ステートのところ、MSXではマシンサイクル1回に付き1ステートのウエイトが入るので、計5ステートとなる。 373 ÷ 5 ≒ 75 により、9600bpsにおける1bitの信号幅は、NOPを約75回実行した長さに相当する。 以上をもとに、アセンブラソースのステート数を数えようと思ったが、面倒になってきた。 というわけで、スタートビットの立下りからストップビットの立上りまでの計算上の時間(938μ秒)と同じような波形になるよう、ウエイトループを調整した。 どうせ信号幅の許容誤差3〜5%のおおらかな通信仕様であり、結果オーライである。 ■奇妙な現象 ところで、奇妙な現象に気づいた。 普段からSONYのHBI-J1を用いて漢字モードを常用しているのだが、試みにANKモードで試してみると、なぜか文字化けが増加する。 機械語プログラムでは、割り込み禁止してPSGを直接操作しているので影響ないはずである。 BASICプログラムでも大したことしていないので、影響が出るとは思えない。 今後の原因究明が待たれる。待っていて解決するのか知らんが。 ■今後の展開 ひとつはPCとの連携。もうひとつはMSXどうしの連携。いずれも、MSX側の受信環境を整える必要がある。 受信は送信に比べ、難易度が格段に高くなる。 また、turboRへの対応も必要かなと思うが、一時的にZ80モードにすればええのんとちゃう? と気乗り薄である。 |
|
■BASICプログラム
前回に書いたとおり、送信したい文字列はUSR関数の引数として渡す。 MSXの場合、文字列は255文字までという制限に留意すべきである。 今回は、「引数として文字列をUSR関数に渡す」という仕様にしたため、このような制限がある。これにこだわらなければ、アセンブラソースを書き換えて、16ビット長のデータも扱えるはずである。 今回のテストしたプログラムは次のとおり。 100 '================ 110 ' SERI.BAS 120 ' SERIAL OUT TEST 130 '================ 140 'SAVE "SERI.BAS" 150 CLEAR 200,&HBFFF:BLOAD"SERIBAS.OBJ" 160 DEFUSR=&HC000:LF$=CHR$(10):CR$=CHR$(13) 170 FOR I=32 TO 126 180 D$=CHR$(I):D$=USR(D$) 190 NEXT 200 D$=USR(CR$):D$=USR(LF$) ">http://art19.photozou.jp/pub/378/247378/photo/29294606.jpg MSXは、SONYのHB-F900を使用。写真右下の赤い小さなブレッドボードがインターフェース。 MSX本体に載っている左側画面はMSXのモニタ。右側がSA-1Fパソコン。文字コード32〜126の文字を表示している。ターミナルソフトは「Tera Term PRO」。MSX風に青地に白文字にしてみた。 http://art19.photozou.jp/pub/378/247378/photo/29275986_org.v1258227281.gif パソコン側で受信しているさまをGIFアニメにしてみた。少〜し実際よりも早目に表示されている。 マシン語部分の転送速度は9600bpsであるが、BASICの部分で時間がかかっている。1文字ずつ送信しているためであって、送信データをまとめてバッファに格納し一気に送信すれば9600bpsの実力が発揮できるはずである。 受信側のパソコンの処理能力に余裕があるのでフロー制御なしでも大丈夫であるが、パソコンからMSXに送信する場合は、データの取りこぼしが予想される。 MSXの受信プログラムも書こうと思っているが、たいてい受信側のほうが面倒なんだなあ。 |



