ROMが残っているようですがどうしてROM不足のエラーが発生するのですか?

使用している各関数のサイズを小さくすることが出来ないかと言う目でプログラムを見直して下さい。
例えば、main()関数が大きくなり1つのメモリ・セグメントに収まらない場合、out of ROMエラーが発生します。 main()関数のコードの一部を別々の関数に移動しmain()によって呼び出されるようにmain()関数を小さくすることです。 例えば、main()の先頭にある初期化コードのほとんどをinit()関数に移動してコードを作成するようにして下さい。

変数として構造体をお使いの場合は、構造体を使わないように変更するとROM領域の大幅な削減ができます。
グローバル変数を積極的に利用することでROM領域を削減する効果があります。
注意 1
#separateは自動インライン展開を防ぐだけで、貴重なスタックを消費しますので使用時は注意が必要です。
注意 2
セグメントを「またぐ」関数は作成できませんので各セグメントに小さな空きスペースがデッドスペースとして残ってしまうことも考慮してください。

OUT OF ROMエラー[ROMエリアの不足]は関数が1つのセグメントに割り当てられない場合に起こります。関数とインライン関数の 全ては同じ1つのハードウェアページに割り当てられます。これらはリンカーが自動的に割り当てます。#separateで宣言された関数のみ 分離されます。次の例で見てみましょう:

TEST.C
	MAIN ?614 RAM=5
		DELAY_MS 0/19 RAM=1
		READ_DATA (INLINE) RAM=5
		PROCESS_DATA (INLINE) RAM=11
		OUTPUT_DATA (INLINE) RAM=6
		PUTHEX (INLINE) RAM=2
			PUTHEX1 0/18 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2 @PUTCHAR_9600_52_49 0/30 RAM=2
		PUTHEX1 0/18 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2

この例ではメインプログラムがほとんどインライン関数を呼び出しています。main()のサイズは614ワードあり`56デバイスの512ワードを 超えていますから割り当てることが出来ません。 リンカーが出す?はセグメントに割り当てようとして割り当てられない場合に表示します。 x/yの表示はxがページセグメント、yがコードサイズを表します。ここでリンカーの規則としてインライン関数はスタックを節約して呼び出せますが、その代わり関数を記述するコードサイズは大きくなります。 この例で、比較的大きな関数PROCESS_DATAとMAINの2つの関数を#separateで宣言して結果を見ると次の様になります。:

TEST.C
	MAIN ?406 RAM=5
	DELAY_MS 0/19 RAM=1
	READ_DATA (INLINE) RAM=5
	PROCESS_DATA (INLINE) RAM=11
	OUTPUT_DATA (INLINE) RAM=6
	PUTHEX (INLINE) RAM=2
		PUTHEX1 0/18 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2
		PUTHEX1 0/18 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2
			@PUTCHAR_9600_52_49 0/30 RAM=2