CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

シリアル受信処理(2)

シリアル送信は単にビット列を垂れ流しにすればいいので簡単ですが、受信処理はいつ信号が来るかわからないので処理の先頭にスタートビットの待ち受け処理を入れてあります。
またこの待つにしても永久に待つか、タイムアウトを設けるかですが、人間のキー押下を待つような場合は永久待ちでもOKでしょう。
一方、長さの分からないデータ列を受信する場合は最後のキャラクタで次が来るかはわからないので永久待ちだとそこでフリーズしてしまいます。その場合は想定されるキャラクタ間時間を過ぎたらタイムアウトが必要です。
 
ここでは1文字受信処理coninを呼ぶときCレシスタに1を入れておくと永久待ち。
0だとスタートビットを65536回チェックする以内(数100ms)に立下りが来ないとタイムアウトエラーとしました。
 
 
イメージ 1
こうしたシリアル送受信のようなシステム側がサービスを提供する部分はなるべくコンパクトに作りたいところです。
ただでさえRAM領域が256バイトしかないのでワーキングエリアやサブルーチンでスタックを消費するのも避けてきましたが、如何せんコードが入るROM領域も2048バイトと限られています。
送受信処理もサブルーチンやループを展開して書いていたらそれだけで2~300バイトになってしまったので積極的に最適化しなければなりません。
 
clock数調整のウェイトルーチンは前項のようにコードのベタ書きをやめてレジスタデクリメントの最小ループによるサブルーチンに置き換えました。
CALLに必要なクロック数も考慮しておりループ数Xと端数Yはダミーの命令挿入で調整します。
 
イメージ 2