今回、データバッファ用の3.3V動作SRAMに手持ちのTC55V1001を使いました。これは1Mbitなので4MbitのフラッシュROMのどこに割り当てるかという指示が必要になります
そのため、DLL(シリアルからSRAMに転送)、LOAD(ROMからSRAMに転送)、PROGRAM(SRAMからROMに書込み)、VERIFY(ROMとSRAM内容の比較)の各コマンドに転送元アドレス、転送先アドレス、転送サイズの引数を持つようにして、コマンドラインから引数の分離、解析処理を追加したら一気に4kWのプログラムエリアから溢れてしまいました。
リンカが出力するエラーがオーバーフローそのものずばりでなくなんかわかりにくいのですが。
:0:: error: (1347) can't find 0x12 words (0x12 withtotal) for psect "text8" in class "CODE" (largest unused contiguous range 0xC)
まずはサイズを食っている書式付き文字列変換printf系の組込み関数はヘキサ表示のためにしか使ってないので自前の関数に差し替え
大量の固定文字列リテラルを含むヘルプメッセージもざっくり削除。こういった文字列出力系はコマレスI/Fにしたらそもそも要りませんけど。あと処理の中で同じような記述をしているところを共通関数で括りだしたりしてチマチマとサイズを削りました。これでギリ収まってプログラムスペース消費は99%になりました
ここはケチらないで本来はデバイス自体をメモリの大きいものに交換すればいいですね
40ピンのPICで35ピンのGPIOが確保できるものであればピン配置は変わらないのでプログラムはそのままで置き換えできそうです。最近のデバイスは容量が大きく低電圧でも動作し、入手し易そうなものでも
PIC16F1939 プログラムエリア16kW
PIC18F47Q43 プログラムエリア128kW
が使えそうです。PIC18F47Q43だとRAMエリアも8kbyteあるので簡単なコードであれば外付けのバッファSRAMもいらないかもしれません。
これ買ってこようかと思ったらPIC18F47Q43はPICKIT3がサポートしてないみたいです。残念、