8ビットPICの最上位に相当するPIC18Fシリーズ。命令語長は16ビットになり、データメモリや、プログラムメモリの扱いも少し、スマートになりました。
データメモリとプログラムメモリが別のアドレス空間を持つ、電卓アーキテクチャ(ハーバード・アーキテクチャ)であることは、16シリーズや12シリーズと変わりません。
また、スタックも、16シリーズなどと変わりなく、ハードウェアスタックですが、段数が31段になったこと。スタックに対するPUSH/POPができるなど、使いやすくなっています。
プログラムメモリは、1ワード16ビットになり、全空間をリニアにアクセスできます。ページ切り替えの必要はなくなりました。
空間は、20ビットアドレスで、1MWの広さがあります。
いわゆるJUMP/CALLは、GOTO/CALLと、相対アドレスで分岐するBRA/RCALLが用意されています。BRA/RCALLの相対アドレスは11ビット幅で、-1024〜+1023Wの分岐が可能です。
条件分岐命令が新たにサポートされていますが、これも、相対アドレス。分岐できる幅は、-128〜127Wとなっています。
注意しなければならないのは、間接ジャンプの際に使用するプログラムカウンタです。空間が広くなったことに伴い、3バイト(PCLATU/PCLATH/PCL)構成になりました。16Fシリーズなどのように、通常のGOTO/CALLがここの影響を受けなくなったので、使いやすくなっています。
CPUによっては、同じ広さの外部メモリを使用することができます。基本的には、通常のプログラム実行空間と変わりなく、プロセッサモードによって、内部のプログラムメモリと外部の(主にフラッシュ)メモリのアロケーションを指定するようになっています。
プログラムメモリをデータとして読み取る場合のアドレス空間です。バイトアドレスされているので、21ビット、2MBの広さです。
アクセス方法は、バイトアドレスを、TBLPTRU/TBLPTRH/TBLPTRLの三つのレジスタにセットし、TBLRD命令を実行すると、TABLATに1バイト読み込むというもの。TBLRD命令が単純な読み込みのほかに、POST_INC/POST_DEC/PRE_INCをサポートしているのでループ処理などは簡単になりました。
プログラムの書き換えも出来るようになったのですが、こちらは、通常のアクセスどおりとは行かず、ブロック単位の特殊な操作になります。
データ空間は、バイトアドレスで、12ビット、4KBの広さです。これをリニアに扱う方法と、バンクで切り替えで開く背する方法、それから、常に固定バンクをアクセスする方法の三通りのアクセス方法があります。
データ空間は、256バイト毎、16バンクに分けられています。通常の演算命令などではオペランドが8ビットなので、アドレスと指定できるのは256バイト。そこで、BSRに格納されたバンクアドレスを参照してアクセスします。
SFRなど、よく使うレジスタをアクセスするのに、バンクを切り替えていると面倒ですし、処理も遅く鳴ります。そこで、SFRが含まれているバンクをいつでもアクセスできるようにしているのが、このモード。オペランドは8ビットなので、1バンク内の256バイトをアクセスできます。
初期のPIC18Fでは、実際に固定バンクだったようですが、新しいPIC18Fでは、仮想化して、SFRと一部のRAMを一つの固定バンクに見せています。
MOVFF命令では、レジスタからレジスタへの移動命令ですが、このとき、12ビットのリニアアドレスでレジスタを指定します。BSRに関係なくアクセスできるので便利です。
また、アドレス間接指定にFSR0/FSR1/FSR2を使用しますが(三つに増えました)、それぞれ、2バイト構成で12ビットのアドレスを全て指定できます。間接アドレスを操作している場合には、バンクを意識する必要はありません。
バンク切り替えと、固定バンクの二つの方法の指定は、命令語の中に埋め込まれている1ビットのフラグで切り替えています。
プログラムメモリの書き換えが出来るようになったので、存在意義が多少薄れているのですが、それでも、バイト単位で気軽に書き込める点は、便利なところです。
バイト単位で、ポート経由で読み書きします。アドレスの広さはCPUによりますが、およそ、1KBぐらいまで。256バイトを超えるCPUでは、アドレスを2バイトで指定するようになっています。
データを間接アクセスする、インデックスレジスタは、3本になりました(FSR0/FSR1/FSR2)。それぞれ、2バイト構成で、全データ空間をリニアにアクセスします。
データの読み書きは、窓レジスタ(INDFnなど)を通して行うのは、16Fシリーズなどと同様です。
アドレッシングモードが強化されました。これに対応する窓レジスタが別々に用意されています。
指定されるアドレスは、FSRnの内容。Cの、*ptrに相等。
FSRnで示されるアドレスをアクセス後、FSRnを+1。Cの、*ptr++に相等。
FSRnで示されるアドレスをアクセス後、FSRnを-1。Cの、*ptr--に相等。
FSRnを-1したのち、FSRnで示されるアドレスをアクセス。Cの、*++ptrに相等。
アドレスは、FSRn+WREG。WREGは符号付で解釈される。オフセットつき間接アドレス。構造体のアクセスや、スタックフレームのアクセスなど、使い道は多いが、WREGが使われるので、二項演算ができない。Cの、*(ptr+w)に相等。