2013.10.15
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第498回]


●E−80のRS232C受信テスト

この連休を使ってE−80ミニコンのソフトウェアの暫定的な仕上げと、試作4号機の動作テストをやっておりました。
いろいろ思わぬことに悩まされたりしまして、結局HPの更新までは手が回りませんでした。
やっとクリアできまして、本日は今までY様、H様にお送りした説明書の手直しやら追加やらといった作業をしておりました。
それも明日にはなんとか終わりそうです。

さてそこで、前回からの続きです。
前回はE−80ミニコンから送信したデータを、ZBKボードが受信している画面をお見せして説明をしました。
今回はZBKボードから送信したデータをE−80ミニコンが受信します。
下がその画面です。

左側がZBKボードで右側がE−80ミニコンです。


READ #命令は受信割込みを使ったRS232C受信命令です。
受信割込みはWRITE #0命令の実行によって許可され、プログラムが終了すると禁止されます。
WRITE #0については前回説明をしました。
WRITE #0命令の実行によって、受信割込みが許可されたあとは、プログラムの進行とは関係なく、データが受信される都度、受信バッファに受信データが蓄積されていきます。
受信バッファの容量は256バイトです。

READ #1命令を実行すると、指定した文字変数(上の画像ではA$)に受信バッファから受信した文字列が読み込まれます。
もし0D0Aコードが受信されていたら、その0D0Aコードの直前までの文字列がA$に入ります。
それとともに整数変数(上の画像ではA%)にはその文字列が入ります(READ #1の実行に先立って、A%=0の実行が必要です)。
このときは同時にA%=LEN(A$)が実行されたことになります。
これは文字列の終端記号0D0Aが受信されたことを示していますから、すみやかにA$の処理を行ないます。
0D0A受信後にREAD #1命令が実行されたあと、A$を処理しないで引き続き同じREAD #1命令を実行すると、A$の値は次に受信された文字列で置き換えられてしまいます。

READ #1が実行されたとき、受信バッファに新たに受信された文字列がない場合にはA%の値は0のままです。
READ #1が実行されたとき、受信バッファに新たな文字列が受信されているときは、その文字列がA$に入りますが、まだ0D0Aコードが受信されていないときはA%の値は−1になります。

上の画像のプログラムのようにA%の値が1以上になるまでREAD #1命令を繰り返し実行することで、A$に受信文字列を格納することができます。
プログラム例ではREAD #1のみを繰り返し実行していますが、受信は割込みによってプログラムの実行とは関係なく行なわれますから、必要な命令を実行しつつ、ときどきREAD #1命令を実行する、というようにプログラムすることができます。

受信バッファはF800〜F8FFに置きました。
このバッファはリングバッファです。
受信したデータは順に後ろに向かって格納されていきますが、バッファの終わりまでくると、先頭に戻って受信が続けられます。
そのような動作を可能にするため、受信バッファ内の未読文字列の先頭位置(アドレスF900)、受信済みデータの終わり+1(アドレスF901)、未読文字列の文字数(アドレスF902)を使います。
F900、F901の値はバッファアドレスの下位8ビットです。
受信割込みプログラムによってF901とF902の値が更新されます。
READ #1が実行されたとき、0D0Aが受信されていたら、F900とF902の値が更新されます。
READ #1が実行されたとき、まだ0D0Aが受信されていなければ、F900、F902の値は更新されません。
上の画面では、その様子を確認するために受信バッファ(F800〜)とF900〜の値をDMコマンドで表示させています。

下の画面では、そのあと同じプログラムを実行して、バッファに続いて受信データが格納されるところを確認しています。

しかし、このままではいかんなあ、ということに気が付きました。
いえこのままでも全くいけないわけではありません。
しかし特殊な場合ですが、受信バッファを強制的にクリアしたいことがあります。
そのような場合にも対応できるように、WRITE #0命令にバッファクリアの機能ももたせることにしました。

上の画像はそのように機能追加する前のものですので、プログラムの再実行によって、前のプログラムの実行によって受信されたデータの後ろに、新しい受信データが格納されていますが、その後のプログラム変更によって、今はWRITE #0の実行により、受信バッファの先頭はF800にセットされるようになっています。

次回に続きます。

ワンボードマイコンでCP/Mを![第498回]
2013.10.15upload

前へ
次へ
ホームページトップへ戻る