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


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第12回]



●PRINT文

プログラミングにはデバッグが欠かせません。
よほど簡単なプログラムでもない限り一発で思った通りのプログラムを書くなどということはまず有り得ないでしょう。
途中で何回もデバッグを繰り返しながら完成させていくことが多いと思います。
そういうときにプログラムの実行過程が「見えない」ということになるとデバッグはほぼお手上げです。
デバッグのためにはプログラム実行の途中結果などを表示させることができればとても助かります。

下は簡単なプログラム例です。
もちろんデバッグなど必要の無いプログラムですがあくまで説明のためのサンプルプログラムです。

説明のためのサンプルですから余り意味のあるプログラムではありません。
ついでですのでこの機会にPICBASICコンパイラの機能についてまた少しだけ紹介します。
PICのプログラムは基本的に8ビットの値を扱います。
ですので当PICBASICコンパイラも今のところは8ビットの値の処理のみと考えています。
しかし中にはせめて16ビットぐらいの数も扱いたいという用途も出てくるかもしれません。
いずれそういう範囲にも機能を拡張していきたいと考えています。
とにかく今のところ8ビットの値のみが処理の対象ですが、その範囲内では今回のプログラム例のように変数名も扱うことができます。
abcとxyzがその例です。
3桁に限りません。
変数名としては最大13桁までの半角英数字が使えます。
先頭の1文字だけは英文字に限ります。

abcxyzなんていうと少年の頃に流行った歌を思い出します。
同年代の方でしたらご存知かと。
「ABC XYZ これはおいらのくちぐせさ…」
フランク永井でしたか。
古き良き昭和の時代もはるか昔のことになってしまいました。
本題に戻ります。
プログラムで実行した変数やSFR(PICの特殊関数レジスタ)の値を確認するためにPICBASICコンパイラには/RDというコマンドを用意しています。

/RDコマンドを実行してみました。

プログラム中の$55は16進数を示しています。
/RDコマンドの表示も16進数です。
変数xyzの値もPORTCの値もプログラム通りの正しい値になっています。
PORTCはI/Oポートですから本来はPICの端子の外にLEDなどを接続して出力を確認すべきなのですがこのように出力に指定したPORTを読むことでも出力値を確認することができます。
しかしこの方法は時として問題が発生する可能性があります。
そのことについては後日説明の予定です。
とにかくこのように/RDコマンドによってプログラムの実行結果を知ることができます。
しかし/RDを使うためにはプログラムを終了させなければなりません。
途中の状態を知ることはできません。
どうしてもということになりますと、途中にSTOP文を挿入するなどしてプログラムを中断させることになります。
それもなかなかに厄介なことです。

ということになりますと。
やっぱりあれです。
今回のテーマにありますように、PRINT文が欲しくなってきます。
「こんなこといいな できたらいいな」を叶えてくれるのはドラえもんのポケットですがそんな便利なものがあるわけはありませんから、欲しければ自分で作るしかありません。

で。
作ってしまいました。

50行にPRINT文を追加しました。
もう何回も書いていますけれど、まるでインタプリタです。
実に簡便でありましょう。
プログラムをちょいちょいと直したら念のためにセーブしておきましょう。
と。
ちょっとここで一旦中座しましたのでプログラムを実行するのは少しあとになりました。

はい。
作業を続行します。
さきほどセーブしたプログラムをロードして実行しました。

PRINT文が実行されてabc、xyz、PORTCの値が表示されました。
PICのプログラムでは16進数を使うことが多いと思いますからPICBASICコンパイラではPRINT文での標準的な数値の表示は16進数です。
ところで。
PICBASICコンパイラではPRINT文はデバッグ用の機能です。
ターゲットのPICボードは最終的にはパソコンとは切り離してスタンドアローン(自立)して単独でプログラムを実行させることが基本的な使い方となります。
その場合には当然PRINT文は用をなしません。
ターゲットのPICに内蔵するシステムプログラムによってスタンドアローンでの実行時にはPRINT文は無視されます。
あっと。
そのうちにLCD表示の機能も付加したいと思っています。
その場合にはLCDに対する表示機能もBASICで加えたいと考えています。

さて。
超簡単なBASICコンパイラを目指しているのですが、こうやって新たな機能を追加したりしますと、さらにああしたい、こうしたいなどと思うようになります。
悪魔の誘惑であります。
むむ。
悪魔よ去れ。
キリスト教の牧師様のおっしゃるには悪魔は元天使なのでなかなかに手ごわいのだそうであります。
うっかりすると神様でも負けそうになってしまうとか。
おいおい。
オールマイテイではなかったのかい。
ということで。
つい悪魔のささやきにちょいと負けてしまってさらに機能を追加してしまいました。

せっかくですので文字表示機能も追加してしまいました。

BASIC定番の” ”での表示です。
ここまでやらなくてもよいようなものですが。

プログラムを実行しました。

/RUNの実行時にoutbytes=36がずらりと表示されてかなり長いマシン語コードが生成されたことがわかります。
このように文字表示もできると確かに便利ではあります。

基本的に数値は16進数で表示します、と書きましたけれど。
中にはやっぱり10進数で表示したいなあ、という場合も出てきます。

ええい、おまけだぁ、持ってけ、ドロボー!
バナナの叩き売りであります。
いやあ。
昭和ですなあ。

10進数の表示機能も追加してしまいました。

これはローカルなルールです。
変数名の前に%をつけると10進数での表示指定になります。
PORTCの出力を10進数にしたってなんの意味もありませんけれど。
ま。これはあくまでただのサンプルです。

プログラムを実行しました。

16進数の55は10進数では85です。
16進数の58は10進数では88です。
ちゃんと正しく表示されています。

参考までに。
最後のプログラムBSTEST1E.TXTをコンパイルしたときに作成されたリストファイルBSTEST1E.LISTの中身です。
2000 000e     movlw D'0'
2002 946e     movwf TRISC
2004 550e     movlw 5
2006 306e     movwf abc
2008 3050     movf abc,w
200A 030f     addlw D'3'
200C 316e     movwf xyz
200E 3150     movf xyz,w
2010 826e     movwf PORTC
2012 610e movlw 061
2014 16ec     call 2c
2016 00f0 
2018 620e movlw 062
201A 16ec     call 2c
201C 00f0 
201E 630e movlw 063
2020 16ec     call 2c
2022 00f0 
2024 3d0e movlw 03d
2026 16ec     call 2c
2028 00f0 
202A 3050     movf abc,w
202C 1aec     call 34
202E 00f0 
2030 0a0e      movlw 0a
2032 16ec     call 2c
2034 00f0 
2036 780e movlw 078
2038 16ec     call 2c
203A 00f0 
203C 790e movlw 079
203E 16ec     call 2c
2040 00f0 
2042 7a0e movlw 07a
2044 16ec     call 2c
2046 00f0 
2048 3d0e movlw 03d
204A 16ec     call 2c
204C 00f0 
204E 3150     movf xyz,w
2050 1aec     call 34
2052 00f0 
2054 0a0e      movlw 0a
2056 16ec     call 2c
2058 00f0 
205A 500e movlw 050
205C 16ec     call 2c
205E 00f0 
2060 4f0e movlw 04f
2062 16ec     call 2c
2064 00f0 
2066 520e movlw 052
2068 16ec     call 2c
206A 00f0 
206C 540e movlw 054
206E 16ec     call 2c
2070 00f0 
2072 430e movlw 043
2074 16ec     call 2c
2076 00f0 
2078 3d0e movlw 03d
207A 16ec     call 2c
207C 00f0 
207E 8250     movf PORTC,w
2080 1aec     call 34
2082 00f0 
2084 0a0e      movlw 0a
2086 16ec     call 2c
2088 00f0 

BASICのソースプログラムはたったの7行ですがコンパイルしてマシン語コードになるとこんなに長くなってしまいます。
PRINT文のところはターゲットのPIC18F14K50に書込み済みのシステムサブルーチンをコールしています。

PICBASICコンパイラ[第12回]
2023.4.18upload

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