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


PICBASICコンパイラ

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

[第5回]



●サンプルプログラム

今回はPICBASICのサンプルプログラムをお見せします。
下はPICBASIC COMPILERの画面です。

PICBASIC COMPILERはWindowsのコマンドプロンプトで動作します。
まだソフトウェアの開発中ですからプログラムにはバージョンを示すナンバーがついています。
現在はPICBS2E.EXEです。
デバッグのために色々なメッセージなどを表示するように作ってありますがそれでは説明をするのにはわずらわしいところがありますのでデバッグメッセージをカットしたDEMO版を起動します。
PICBS2EDEMO[Enter]
と入力することでPICBASIC COMPILERが起動します。
起動するとログファイルがオープンします。
操作の記録を後で確認することができます。
picbs connectedの表示はPICBS01ボードがUSB接続されていることを示しています。
ここまでで準備完了です。
このあと通常のBASICインタプリタと全く同じ調子で行番号をつけてBASICの命令文を入力作成することができます。
今回は作成済みのサンプルプログラムをロードしました。
BASICプログラムはLISTコマンドで表示することができます。
そのあと/RUNコマンドでプログラムを実行しました。

あれ?
これって…。
インタプリタ、でしょ?

いえ。コンパイラです。

しかし、これはどう見てもBASICインタプリタにしか見えませんが。

そう思いますよね。でもれっきとした正真正銘のBASICコンパイラなのです。

だって。普通はコンパイルとかリンカとかの手続きがありますでしょ。
それが全然ないじゃありませんか。

実は。
/LOADコマンドでファイルをロードしたしたときに同時に(ナイショで)コンパイルを実行してマシン語オブジェクトを作成してしまっているのです。
そして。
これが最も肝心なところなのですけれど。
PICコンパイラというからにはソースプログラムから作成したマシン語コードはそのあとでPICに書き込まなければ実用にはなりません。
上の画面は一見すると/RUNコマンドの入力によってWindowsのコマンドプロンプト上でデバッグ用に何かシミュレータのようなものが走っているのではないかというような想像をしてしまいます。
しかしシミュレータなどではありません。
/RUNコマンドの実行によってUSB接続をしたPICBS01を介してターゲットボード(ここではPICBS03)上のPIC18F14K50にマシン語コードを書き込んでしまってからそのマシン語コードを実際にPICBS03上で実行しているのです。
今回はデモンストレーションですからそういう「裏作業」を全てだんまりで実行していますが、それじゃあちょっと気持ちが悪い、本当にコンパイルされているのか、本当にマシン語コードが書き込まれているのか、実行前に確認したい、と思われるかもしれません。
回が進みましたらそのあたりのメーセージは表示するように考えています。

それにしても。
これだけではちょっと信じられないなあ。

それはそうですよね。
そのあたりをご理解いただくために上の操作画面に続く画面を見ていただきます。

/RUNコマンドによってPICターゲットボード(PICBS03)がマシン語プログラムを実行する結果、コマンドプロンプト側のPICBASICコンパイラはキー入力ができなくなります(先ほどの画面の最後のところ)。
しかし例外として[Ctrl][B]と[Ctrl][C]のみは受け付けられるようになっています。
[Ctrl][B]は[Ctrl]キーと[B]([b]も同じ)を同時に押します。
すると実行中のプログラムがブレークします。
なお[Ctrl][C]はPICBASICコンパイラシステムの強制終了です。

マシン語プログラムでしょ。
それがブレークできるの?

それができるのです。
しかもあらかじめ何かをプログラムに埋め込むなんてことをしておく必要はありません。
普通のプログラムのままでいつでもブレーク可能です。
上の画面をご覧ください。
行番号30のところでブレークしたことが表示されています。

いやいやいや。
これはやっぱりインタプリタでしょう。
アナタ、きっとウソついてますね。

ウソなどついてません。
間違いなく(PICBS03が)行番号30に該当するマシン語プログラムのところを実行中にブレークしたのです。

ブレーク後はターゲットボード(PICBS03)との間でコマンドとデータのやりとりができるようになります。
/RDコマンドでPICBS03に搭載しているPIC18F14K50のレジスタの値を直接読むことができます。
ここでは
/RD PORTC
を入力してPORTCの現在の値を表示させています。
今回のサンプルプログラムはPORTCに00と01を交互に書き込む無限ループプログラムです。
行番号30の「実行中に」ブレークしたためまだPORTCの値は00になっています(行番号30の「実行後」のブレークならPORTCの値は01になります)。

さらに、さらに。
/pmrdコマンドを使うことで、PICに書き込んだプログラム(命令コード)を読み出すことができます。
表示されているのはさきほど/RUNコマンドでPICBS03のPIC18F14K50に実際に書き込まれたマシン語コードです。
参考までに下にそれを解読して示します。

00 0E movlw 00
94 6E movwf TRISC
00 0E loop:movlw 00
82 6E movwf PORTC
01 0E movlw 01
82 6E movwf PORTC
02 EF goto loop
10 F0 

PICにはリテラル(定数)を直接レジスタに代入する命令コードはありません。
定数はwレジスタを経由してレジスタに代入するため上記リストのように少し面倒なプログラムになります。
もっとも
movlw 00
movwf TRISC

clrf TRISC
とすることもできますがそこまでの最適化は今のところ考えていません。
これだけできれば十分じゃありませんか?

ところで。
[Ctrl][B]でブレークしたプログラムは
/CONTコマンド
でそのブレークポイントから実行を再開させることができます(上の画像参照)。

実行を再開したプログラムは当然[Ctrl][B]によって再度ブレークさせることができます。

今度は行番号20の直前でブレークしました。
「break in」はその行の「実行中に」ブレークしたことを示します。
「break before」はその行の「実行直前に」ブレークしたことを示します。
もう一度/rd PORTCを実行してみました。
今度はPORTCの値は01になりました。

これが現在開発中のPICBASIC COMPILERです。
超簡単、超シンプルなコンパイラをめざしています。

忘れるところでした。
下は今回の操作を記録したログです。
ログがあると操作したこととその結果をあとから確認することができるのでとても便利です。
logfile piciolog\0406073813.txt open
PIC BASIC COMPILER
picbs connected
>/load bsoutt1.txt
loading bsoutt1.txt ...4lines read ok
>list
   10 out TRISC,0                                                             
   20 out PORTC,0                                                             
   30 out PORTC,1                                                             
   40 goto 20                                                                 
>/run
[Ctrl][B]
break in line#=30
   30 out PORTC,1
 >/rd PORTC
[00]
>/pmrd 80,0
00 0E 94 6E 00 0E 82 6E-01 0E 82 6E 02 EF 10 F0
FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF
>/cont
[Ctrl][B]
break before line#=20
   20 out PORTC,0
 >/rd PORTC
[01]
>/exit

リモート接続を終了しました
logfile closed at Thu Apr 06 07:46:16 2023


PICBASICコンパイラ[第5回]
2023.4.6upload

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