楽天市場
[無料でホームページを作成] [通報・削除依頼]

1kワードのTINYBASIC その6

◎ASCIIコードの出力

1kワードのTINYBASICではASCIIコードをPR文で出力させることができません。

ASCIIコードには文字だけではなく制御コードも含まれており、特に制御コードが出力できるか否かは、
プログラムの利便性に大きく関わってきます。 そこで、ASCIIコードを直接出力する方法を検討しました。

①UARTを搭載しているデバイスの場合 (PIC16F1704/PIC16F18323/PIC16F18313)
 アスキーコードをTXREGに直接書き込みます。
 PIC16F18313の場合、次のように記述します。(XXは16進アスキーコード) (1,$9A)=$XX

 アセンブラでプログラムを組む場合は一般的に送信バッファーが空であることを確認してから、TXREGにASCIIコード
 を書き込むのですが、インタープリタの場合は処理が遅いのでバッファーの確認を行う必要がありません。

②UARTを搭載していないデバイスの場合 (PIC16F1703)
 送受信バッファー$007FにまずASCIIコードを書き込み、BASICランチャー内の機械語サブルーチンを呼びだす。
  (0,$7F)=XX:CALL(7,$61)  $0761は$007Fに書き込まれたASCIIコードをシリアル出力するサブルーチンのアドレス
 詳細はPIC16F1703用インタープリタのアセンブラソースを参照してください。

①②いずれもダイレクトコマンドでは使用できません。プログラム中に記述する必要があります。

<応用例>
前回ご紹介した時計のプログラムでは時間が1秒おきに下に流れてしまいます。
TeraTerm(VT100)のエスケープシーケンスを用いて秒毎に同じ場所に表示することができます。

img_20190711-041111.jpg

○プログラムの変更点

40 PR:PR H;".";M;".";S
--->
37 PR:(1,$9A)=$1B:PR "[s";
40 PR H;".";M;".";S;

解説 前回のプログラムでは、改行した後に時刻を表示し、時刻の表示後に更に改行します。
   今回のプログラムでは、最初に改行するところまでは一緒ですが、エスケ-プシーケンス”ESC[s”を用いて
   時刻を表示する位置をTeraTermに記憶させます。$1BはESCの
ASCIIコードです。
   エスケ-プシーケンスを出力した後、時刻を表示させますが、改行はしません。

90 PR H;".";M;".";S
--->
89 (1,$9A)=$1B:PR "[2K";:(1,$9A)=$1B:PR "[u";
90 PR H;".";M;".";S;


解説 前回のプログラムでは、時刻を表示し、時刻の表示後に改行します。
   今回のプログラムでは、まずカーソル行を消去させてから、(エスケ-プシーケンス”ESC[2K”)
   先にTeraTermに記憶させた位置にカーソルを復帰させます。(エスケ-プシーケンス”ESC[u”)

   エスケ-プシーケンスを出力した後、時刻を表示させますが、改行はしません。