Not enough RAM
コンパイラーがRAM不足をいってきていますが本当でしょうか?

いくつかのデバイスでは標準的なRAMのアクセスを行っているとRAM不足な場合があります。これらのデバイスにはPIC16C509,57,66,67,76,77などがあります。

デフォルトではコンパイラーは自動的に変数をRAMに割り当て、RAMの下位アドレスから利用できるように思われます。
#device *=16はRAMメモリのポインタサイズ(RAMアドレスのbit数)を指定するものです。
このような設定が無い場合、デフォルトで
#device *=8
の設定となり、RAMアドレスは8bitとなり、256バイト以上のメモリは使用できなくなります。
このような場合には、*=16とすることで、RAMアドレスは16bitに拡張されます。
但し、コンパイル語のプログラムメモリ消費量は増えますので注意して下さい。
[参考] コンパイラがどのようにRAMを使用しているかは、Symbol map(*.sym)に記載 されています。
PICマイコンのRAMは128Byteごとのbank切換えになっています。
例えば、F877A は 4bank あります。
しかも各バンクで使用できるのは 20h-70hまでの80byte程度(0h-1Fhまでは各種I/O関係レジスタ、71-7FhまではBank共通エリア)
詳しくは、各デバイスのデータシートを参照ください。
以上のように、RAM領域は80byte程度で分割されているので、配列などを確保してしまうと、RAMが細切れに使用されてしまい、不足する場合があります。

3つのRAMの使い方を示します。:

1. #BYTE、#BITディレクティブでRAMに変数を割り当てます。これらの変数にはポインターは作成できません。 サンプル:

#BYTE counter=0x30

2. READ_BANKとWRITE_BANK関数で配列のようにRAMをアクセスします。 このアクセスでは、このRAMに配列を割り当てたようなものです。 サンプル:

for(i=0;i<15;i++)
	Write_Bank(1,i,getc());
for(i=0;i<=15;i++)
	PUTC(Read_Bank(1,i));

3. PCMユーザーはフルRAMアクセスのために16bitポインターに切替えることが出来ます。 これはより多くのROMを必要とします。
#DEVICEに*=16を追加して下さい。 サンプル:

#DEVICE PIC16C77 *=16