78K0や78K0Sの8ビットのマイコン、特にAll Flashの製品では通常のメモリの中に特殊なアドレスが予約されています。ここでは、その違いと使い方について簡単に説明します。
[内蔵メモリ領域]
これらのマイコンに内蔵され、プログラムにより通常使用するメモリとしては以下の3つがあります。
| メモリ領域 | 特徴/機能 |
| ROM | 命令や固定データ用で、マスクまたはフラッシュで構成 |
| 高速RAM | データアクセス専用のメモリ |
| 内部拡張RAM | データや命令を格納 |
[ROM]
通常のプログラムや固定データ用に用いられますが、マイコンのアーキテクチャにより特殊な領域が存在します。
ベクタ・テーブル[0000〜003FH]
この領域にはベクタ・テーブルが並んでいます。特に0000と0001番地はリセット解除後に実行開始する命令のアドレス情報をベクタとしてセットします。残りは使用する割り込みに対応して、割り込み処理プログラムの開始アドレス情報をベクタとしてセットします。通常は下記の例に示すように、DW擬似命令により処理部のアドレスを記述します。ここで、STARTは実際のプログラムの実行開始アドレスです。記述例を以下に示します。使用しない割り込みのベクタはRETI命令を記述したダミーエントリを準備しておき、そのアドレスを記述します。
VECT CSEG AT 0
DW START ;00:リセットエントリー
DW DUMYINT ;02:未使用割り込み用ダミーエントリ
DW LVIINT ;04:低電圧
DW P0INT ;06:エッジ検出割り込み
DW DUMYINT ;08:エッジ検出割り込み(未使用)
CALLTテーブル[0040H〜007FH]
この領域には1バイトのCALL命令であるCALLT命令を使用するときの各CALLT命令に対応した処理プログラムの開始アドレス情報をベクタとしてセットします。
例えばサブルーチンSUBADDR0及び1へのベクタを以下のようにして設定しておくと、CALLT [SUB1]やCALLT [SUB2]と記述することでSUBADDR0やSUBADDR1をサブルーチンとしてコールできます。Cコンパイラではコード効率を良くするためにこの機能を利用しています。
CALTTBL CSEG CALLT0
SUB1: DW SUBADDR0 ;サブルーチン1
SUB2: DW SUBADDR1 ;サブルーチン2
オプションバイト他[0080H〜]
この領域はAll Flashマイコンで各種の設定情報やセキュリティ情報のための領域です。通常、プログラムで参照することはありません。設定したいデータはDB擬似命令で記述します。
OPTIONB CSEG AT 80H
DB 01111111B ;WDTは最低速で動作
DB 00000001B ;POCは2.7V動作
DB 0
DB 0
DB 0
プログラム領域[〜07FFH]
通常のプログラムで使用できる領域です。プログラムは通常CSEGで指定します。
CALLFエントリ領域[0800H〜0FFFH]
この領域は2バイトのCALL命令であるCALLF命令で実際に処理するプログラム(ハンドラ)のための領域です。CALLTとは異なり、ここには実際の処理部分が入ります。CALLF命令を使わない場合には通常のプログラム領域として使うこともできます。
(通常のプログラムと同様にサブルーチン・プログラムを記述するだけです。そのように記述したサブルーチンをコールする際にCALL命令ではなくCALLF命令を使用します。)
プログラム領域[1000H〜]
この領域は個々のデバイスにより大きさが異なります(アドレスとしては最大でも0EFFFまでです)。また、8000H以降の領域は、フラッシュのセルフ・プログラミング時には書き込み用のファームウェアに置き換わってしまいます。
[高速RAM]
最大1Kバイトの領域が割り当てられています。この領域はその最後のアドレスが固定されていて、内蔵される高速RAMの容量により開始アドレスが異なります。代表的なマイコンの高速RAMを下表に示します。
| シリーズ | デバイス | アドレス | 容量(バイト) |
| 78K0S/Kx1+ | UPD78F9210〜9212 | 0FE80H〜0FEFFH | 128 |
| UPD78F9221 | 0FE80H〜0FEFFH | 128 |
| UPD78F9222 | 0FE00H〜0FEFFH | 256 |
| UPD78F9232、9234 | 0FE00H〜0FEFFH | 256 |
| 78K0/Kx2 | UPD78F0500 | 0FD00H〜0FEFFH | 512 |
| UPD78F0501 | 0FC00H〜0FEFFH | 768 |
| UPD78F0502、0503 | 0FB00H〜0FEFFH | 1024 |
| UPD78F0511 | 0FC00H〜0FEFFH | 768 |
| UPD78F0512〜0515 | 0FB00H〜0FEFFH | 1024 |
| UPD78F0521 | 0FC00H〜0FEFFH | 768 |
| UPD78F0522〜0525 | 0FB00H〜0FEFFH | 1024 |
| UPD78F0531 | 0FC00H〜0FEFFH | 768 |
| UPD78F0532〜0535 | 0FB00H〜0FEFFH | 1024 |
| UPD78F0544〜0547 | 0FB00H〜0FEFFH | 1024 |
| 78K0/Lx2 | UPD78F0361 | 0FC00H〜0FEFFH | 768 |
| UPD78F0362〜0397 | 0FB00H〜0FEFFH | 1024 |
なお、高速RAMはスタックを含めたデータ専用領域です。ここからプログラムをフェッチすることはできません。また、高速RAMはいくつかに分かれているので、スタック領域を設定する際には注意が必要です。
そのうちの一つは、ショート・ダイレクト・アドレッシング(saddr、saddrp)領域と呼ばれる領域です。これは0FE20H〜0FF1FHの256バイトの領域で、そのうち0FE20H〜0FEFFHが高速RAMになります。この領域にバイト長の変数を配置するには、下記のようにSADDR属性でDSEGを定義し、そこでDS擬似命令で変数(領域)を定義します。
D0 DSEG SADDR
DATA1: DS 1
DATA2: DS 1
DATA3: DS 1
このように定義した変数は以下のように、汎用レジスタを介することなく、値を代入したり演算を行なったりと汎用レジスタと同じように使用することもできます。
MOV DATA1,#1
INC DATA2
CMP DATA3,#10
また、上記のようにバイト単位の変数ではなく、16ビットの変数として使用する場合には再配置属性をsaddrではなくsaddrpとします。これによりsaddrpに指定した変数は16ビットアクセスができるようになります。なお、この再配置属性を指定すると変数は必ず偶数番地に配置されます。
DP DSEG SADDRP
DATA1P: DS 2
DATA2P: DS 2
DATA3P: DS 2
このように、このショート・ダイレクト・アドレッシング領域は便利に使えるので、スタックのような単純な機能で使うのはもったいないところです。
もう一つは78K0だけの制限で、78K0Sでは該当しませんが、0FEE0〜0FEFFHの32バイトの領域です。この領域には78K0の汎用レジスタが配置されています。78K0では割り込み処理の高速化のために、割り込みで使用するレジスタを切り替えられる機能(レジスタ・バンク機能)があります。この機能を利用すると、割り込み処理で使用するレジスタをスタックにセーブしたり、逆に復帰したりする手間が必要なくなります。
また、高速RAMはセルフ・プログラミングではエントリRAMやデータ・エリアとしても使われます。
なお、SADDR領域に限定せずに高速RAMにデータ領域を配置する場合にはDSEG指定で、再配置属性をIHRAMに指定します。以下に例を示します。
RAMD DSEG IHRAM
DATA4: DS 2
[内部拡張RAM]
内部拡張RAMはプログラムの実行が可能なRAM領域です。通常のデータやプログラムをこの領域に配置することはできますが、スタックを設定することはできません。この領域には通常は、それほどアクセス頻度が高くないような変数やデータ量が大きな変数(配列など)を配置します。また、一部のデバイスでは、ROMコレクション機能でプログラムを実行するためにも使用されます。
この領域はDSEG指定で、再配置属性をIXRAMに指定します。以下に例を示します。
LSPRAM2 DSEG IXRAM
DATA_AREA1:
DS 20H
DATA_AREA2:
DS 20H
DATA_AREA3:
DS 20H
(2005/12)