「PA.EXE」では、何故「Bank切り替え」が無いのか
本書で用いているアセンブラ「PA.EXE」でのプログラムには、何故「Bank切り替え」の
記述が見られないのか、というご質問やご指摘を受けることがしばしばあります。
「こんなプログラムでよくPICマイコンが動くものだ」という言われ方をしたことさえあり
ます。PICマイコン製造元の「マイクロチップテクノロジー社」が提供するアセンブラ
「MPASM」でプログラムを書く場合は、「Bank切り替え」が頻繁に現れるからです。
結論から言うと、「PA.EXE」が非常によくできたアセンブラであるということです。
PICマイコンはプログラムメモリとデータメモリ(RAMとかファイルレジスタとも呼ばれる)
がどちらも複数のブロックからなります(前者がPage0〜Page3の四個、後者がBank0〜
Bank3の四個、ただし、デバイスによって両者とも個数が異なる。例えば、16F84Aは前者が
Page0のみで後者がBank0とBank1の二個)。プログラムメモリの方はあまり気にしなくて
済みますが、ファイルレジスタの方は常に意識しなければなりません。自分で定義する
レジスタファイル(変数)を全てBank0に置いたとしても、肝心なSFR(スペシャル
ファンクションレジスタ=デバイスの特殊な機能を活用するために、予め用意されている
レジスタファイル)が各Bankに散在しているからです。
例えば、ポートBを全ビット出力用として使いたい場合、「MPASM」では
BSF STATUS,RP0 ;Bank1に切り替え
CLRF TRISB ; PortB 全ビット出力用に
BCF STATUS,RP0 ; Bank0に切り替え
のように記述します。TRISBというSFRがBank1にあるからです。Bank1へ行ってTRISBの
書き込みをしたあと、PORTBに0や1を出力するにはPORTBが置かれているBank0に戻らねば
なりません。
「PA.EXE」の場合はどうかというと
mov !rb,#0
;
PortB 全ビット出力用に
の一行で終わりです。つまり、「mov !rb,__ 」の命令文の中でBank切り替えの
作業を自動的に行っているのです。
この例のように、命令文の中で、「PA.EXE」が必用なBank切り替えの作業を実行して
くれるので、プログラマは厄介なBank切り替えを意識しないでプログラミングすることが
可能になります。今は質問にもあったBank切り替えの場合で「PA.EXE」の使いやすさを説明
しましたが、他にも、数値の扱い、演算、比較等、都合の良い命令が数多く用意されており、
「PA.EXE」と「MPASM」の両者を使い比べると、「PA.EXE」がいかにプログラムを書き
やすいアセンブラであるかが分かります。
「PA.EXE」を使うことの問題点はというと、言うまでもなく、より一般的な「MPASM」との
情報交換がダイレクトには行い難いこと(ただし、両者を理解していれば可能)、16F84A
以外のフラッシュタイプのデバイスに対応していないこと(ただし、「PA.EXE」作製者の
Ochiai氏のホームページでは、16F877への対応法が示されている⇒本ホームページの
「その他の情報」)です。
いずれのアセンブラを用いようとも、マイコンに書き込むオブジェクトファイル(*.HEX)
には違いはありません。ですから、ソースファイル(*.asm)を公表して評価を得たいという
のでなければ、しかも16F84Aを活用してというのであれば、プログラムの作成は「PA.EXE」
を用いる方が断然有利といえます。
時として、難解な(というより使い難い)「MPASM」を使いこなすのが「優れ者」のよう
に評価をされがちですが、今では、「BASIC」や「C」で効率よくプログラミングする人も
多いのではないでしょうか。
(追)という私自身も、現在は16F88、16F819を活用するために、「MPASM」で作成して
います。