SDCCでMCS51コードをコンパイルするときの注意点

SDCCでは、PDATA変数をアクセスするための_XPAGEの定義は必須と考えたほうが良いかもしれない。_XPAGEが未定義である場合はMCS51の伝統に従い_XPAGE = 0xA0と仮定することによる誤動作の可能性がある。

初期化指定子がないPDATA/XDATA変数が存在する場合、lib/src/mcs51/crtxclear.asmにて_XPAGE定義が参照され初期化(ゼロクリア)される。
_XPAGEが未定義である場合、アドレス(0xA0)のSFRレジスタが間違ってアクセスされることによる誤動作に加え、PDATA/XDATA変数が正しく初期化されないという不具合が発生する可能性がある。

初期化指定子があるPDATA/XDATA変数が存在する場合、lib/src/mcs51/crtxinit.asmにて_XPAGE定義を参照するコードが実行される。_XPAGEが未定義である場合、アドレス(0xA0)のSFRレジスタが間違ってアクセスされることによる誤動作に加え、初期化指定子があるPDATA/XDATA変数が正しく初期化されないという不具合が発生する可能性がある。

[nRF24LE1]
SDKではPAGEレジスタがMPAGEとして定義されているため_XPAGEをMPAGEと同じアドレスで追加定義する必要がある。これはPDATA変数を正しく処理するためにも必須である。
何も対処せずに初期化指定子があるPDATA/XDATA変数を使用した場合、誤ってP2ポート(QFN48のみ)がアクセスされることによる誤動作や初期化指定子があるPDATA/XDATA変数が初期化されないという不具合が発生する。

[nRF24LU1P]
SDCCのlib/src/mcs51/crtxinit.asmソース内のDUAL_DPTRの値を0から1に書き換えた後アセンブルしその.relをリンカーの最後のパラメタとして指定する必要がある。
何も対処せずに初期化指定子があるPDATA/XDATA変数を使用した場合、誤ってUSBCONレジスタがアクセスされることによる誤動作や初期化指定子があるPDATA/XDATA変数が初期化されないという不具合が発生する。

※PAGEレジスタが存在しないためPDATA変数が使えないことは当然であるが複数の不具合が同時発生するとデバッグが困難になるため想定外のHW誤動作だけは防ぐという意味で未使用のSFRアドレスを_XPAGEとして定義することは良いことかもしれない。

以上、SDCCでMCS51するさいの参考にでもなれば幸いです。