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


PICBASICコンパイラ

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

[第11回]



●ASMファイルとLISTファイル

前回はちょっとわけがあってPICのマシン語プログラムのリストについては説明をしませんでした。
今までは毎回マシン語の命令コードの横にPICのアセンブラニーモニックを併記してそれで説明をしてきました。
しかし毎回そういうことをするのもなかなかに面倒なことです。
そこで息切れをしてしまわないうちになんとかすることを考えました。
まずは手順をおって説明をいたします。
下の画像は前回お見せしたのと同じことをしていますが、ちょっとPICBASICコンパイラのシステムプログラムに手を加えました。

今回の本筋とは関係ないのですがついでに説明をしておきます。
ソースプログラムファイルをロードしたところに*cnvert*と表示されています。
この部分はDEMO版では表示しないようにしていたのですがそれを表示するようにしました。
ここでソースプログラムからマシン語コードへの変換をやっていますよという表示です。
種明かしのようなものですがやっぱり何も表示しないよりはこのように表示したほうがやってる感が見えて安心できると思います。

次に/runコマンドでプログラムを実行しました。

ここでも今まではなかった表示をしています。
outbytes=36というのはマシン語コードを36バイト単位でターゲットのPIC18F14K50に書き込みましたという表示です。
これもやっていますよということを明示しています。
書き込んだあとそのプログラムを実行中です。

前回と同じように[Ctrl][B]を入力してブレークしました。


実はさきほどの画面で*convert*と表示したときにマシン語コードを生成すると同時に下のファイルを作成するようにしました。
それが今回のテーマです。
いままで説明のために手作業で行なっていたことをプログラムでやるようにしたのです。
マシン語のコードの右側にアセンブラニーモニックも並べて表記しています。
こういうものがあると理解しやすくなると思ってそのようにしました。
2000 000e     movlw D'0'
2002 946e     movwf TRISC
2004      _20
2004 822a     incf PORTC
2006 02ef     goto _20
2008 10f0


このリストを見ると
PORTC=PORTC+1
をマシン語にしたときよりもマシン語のプログラムが簡単になっています。
PORTC=PORTC+1のコンパイルでは+1のところが+Nの命令としてマシン語コードに翻訳されるため下記の3命令になります。

82 50 loop:movf PORTC,w
01 0F addlw 01
82 6E movwf PORTC

そこのところが
PORTC++
では+Nではなくて+1のみに限定した命令なので
incf PORTC
の1命令に翻訳されます。
incfはインクリメントです。
incfとgotoを交互に実行するだけなので実行クロックはincf=1とgoto=2の合計3クロックになります。
すると1回の出力にかかる時間は3/12=250nsになります。
RC0の出力の1周期はその2倍の500nsです。
前回お見せしたCPLDロジアナでの観測結果と一致しています。

さて。
R++命令でそのようにコンパイルできるならPORTC=PORTC+1も翻訳時にそのように判断してこちらも
incf PORTC
にすればよいではないか、と思われるかもしれません。
そりゃあできないことはありませんけれどそれだけコンパイラの開発に負担がかかってしまいます。
+1の部分だけでは済まないのです。
A=B+1
というような場合は除外しなければなりません。
ま、ま、コンパイラを作ろうなんて作業自体が並みの作業じゃありませんから、そのあたりのところはなるべく簡単に済ませたいと考えています。

そもそもはこんなファイルなどを作るつもりは全くなかったのです。
上の方に書きましたように毎回のようにマシン語のコードにアセンブラニーモニックを手作業で追記したものを作成してそれをもとに説明するというのもなかなかに面倒なことですから、いっそのことコンパイル時にこういうファイルも作成したら参考になるのではないかと考えました。
思いつくのは簡単なことなのですけれど実際にそういう機能を追加で組み込むなどということは当初想定していませんでしたから結局今まで作ってきたコンパイラプログラムを全面的に書き直すことになってしまいました。
なにしろBASICの命令をPICのマシン語コードに置き換えるだけではなくて、同時にアセンブラニーモニックも追加しなければならないのですからそりゃあもう並みの作業じゃありません。
ちょいと大変な作業でした。

で。
せっかくアセンブラニーモニックを追加するのならばその追加する部分だけを別ファイルに仕立てたらこういうファイルができるのではないか、とまたまた思いついてしまいました。

    movlw D'0'
    movwf TRISC
_20
    incf PORTC
    goto _20


当連載のはじめのところあたりに書きましたようにPICBASICコンパイラはその機能のゆえに対象をPIC18Fから以降のシリーズに限定しています。
PICライタを必要としないという前提で考えるとそういうことになってしまいます。
PIC12とかPIC16は対象外です。
しかしPICライタをお持ちでPICアセンブラとしてフリーのMPLAB IDEをお使いで、ある程度はPICのアセンブラが使えるという方でしたら、こういうファイルがあれば利用できるのではないかと思います。
PICBASICコンパイラ用のBASICのソースプログラムはTXTファイルです。
PORTC++のサンプルプログラムのファイル名はBSOUTT4.TXTですが、そのコンパイル時に追加で作成することにした上記のファイルは拡張子ASMをつけてBSOUTT4.ASMというファイルになります。
拡張子はASMですが中身はプレーンテキストですから普通のテキストエディタで開けますしもちろんMPLAB IDEでも開けます。
MPLAB IDEでアセンブルできるようにPICアセンブラの文法に準じたソースファイルにしてあります。
これならPIC12でもPIC16でも使えます。
もっともこれだけではまだ不足しているところがあります。
それぞれのデバイスにあわせたCONFIGの設定などが当然必要になります。
さすがにそこまで手を広げますと収拾がつかなくなってしまいますからこのファイルはあくまで「参考」ということで利用を考えていただければと思います。
ちなみに最初にお見せしたリストファイルも中身はプレーンテキストですからやはり普通のテキストエディタで開くことができます。
こちらの拡張子はLISTです。
BSOUTT4.LISTというファイル名になります。
本当はLSTという拡張子にしたかったのですがMPLAB IDEはソースプログラムをアセンブルすると拡張子がLSTのリストファイルを生成しますから、そのときに上書きされてしまわないための配慮です。

PICBASICコンパイラ[第11回]
2023.4.17upload

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