PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第145回]
●PICBASICコンパイラの文法(6)変数(6)R変数(4)
また一週間も間が空いてしまいました。
[第142回]でR変数の機能を拡張することについて書きました。
そのようにプログラムを変更するよう検討したのですが、なにしろ現行のプログラムの作業をしてから半年も経ってしまっています。
半年も間が空くとすっかり忘れてしまいます。
それでプログラムの内容を整理しながら思い出すのに何日も費やしてしまいました。
やっとのことでどこをどうすればよいのかの見当がつきました。
PIC18F4550のレジスタは256バイトごとのメモリバンクに分かれています。
PIC18F4550の場合BANK0〜BANK7の8バンクにユーザーが使えるメモリが実装されています。
PICは一度には256バイトの範囲しかアクセスできません。
そこでR変数の機能を拡張して、そこに配列の機能を持たせてR0()〜R7()という配列変数の機能をあらたに組み込むことにしました。
そのようにプログラムを考えてみたのですがもともと変数についてはそんな概念は考えていなかったので、そういう機能を組み込むためにはプログラム全体を再構築しなければならないことがわかってきました。
それはちょっと大変です。
なんとかもう少し簡単にできないものかとここ数日思案していました。
何でもしっかり考えてみるものです。
よい方法を思い付きました。
思いついた方法なら現行の変数の仕組みの枠内でできます。
配列変数はR()にします。
通常のBASICならば()内に添字を置きます。
しかしそのようにするとBASICコンパイラの負担が大きくなります。
そこでPICBASICコンパイラでは添字は()の外に出してRHとRLという特別な変数に機能を割り当てることにしました。
RHにはレジスタバンクの番号0〜7を入れます。
RLにはバンク内のアドレス00〜FFを入れます。
通常のBASICのイメージではR(RH,RL)になります。
この場合でもRH、RLには事前に値を入れておかなければなりません。
配列としてはこのR()だけですからR(RH,RL)と表現しなくてもR()とするだけで意味は通ります。
ということでPICBASICコンパイラプログラムをそのように直して簡単なテストプログラムでテストをしてみました。
[第143回]で説明しましたように通常の変数は出現した順に現行ではレジスタアドレス030から割り当てられていきます。
そのように扱われる変数は英小文字で始まる英小文字と数字で構成される変数名に限ります。
RH、RL、R()は別の場所に割り当てられています。
上のテストプログラムではaはアドレス030、bは031、cは032に割り当てられます。
そしてRH=0、RL=$32ですからR()はレジスタ032を示すことになります。
$32のように数値の頭に$をつけるとそれは16進数を示しています。
テストプログラムは上の画面では先にLOADして上から2行目の/runコマンドでPIC18F4550にマシン語プログラムが書き込まれたあと実行されています。
実行後に今回の説明のためにLISTコマンドでプログラムをリスト表示させました。
通常とは逆の表示です。
プログラムの実行はLIST表示の上の行のところで行なわれて結果が表示されています。
a、b、cの値の表示に続いてRH、RL、R()の値が表示されました。
R()はアドレス032の値を示しています。
アドレス032には変数cが割り当てられていてその値は16ですからRH、RL、R()は正しく機能していることがわかります。
なおPICBSコンパイラのprint文での変数値の表示は16進数です。
変数の値を十進数で表示したいときは変数名の前に%をつけます([第40回]参照)。
PICBASICコンパイラ[第145回]
2024.9.2 upload
前へ
次へ
ホームページトップへ戻る