Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/14-3
14-3 ARM ネイティブサブルーチンの呼び出し
68Kアプリケーションから ARM ネイティブのサブルーチンをコールするには、新しい関数 PceNativeCall を使用します。
PceNativeCall 関数は2つの引数をとります。
- ARM ネイティブ関数のポインタ。これは通常はコードリソースに保存されています。ARM ネイティブサブルーチンがリソースに保存されている場合、68Kアプリケーションは単純に DmGetResource を使用してリソースを取得し、MemHandleLock を使用してそのリソースをロックすることで ARM ネイティブサブルーチンのポインタを取得できます。
- データブロックを指すポインタ。これにより、68Kアプリケーションは ARM ネイティブサブルーチンとデータを交換することができます。
PceNativeCall をコールする前に、プロセッサタイプを確認する必要があります。
- プロセッサが ARM の場合、68Kアプリケーションから ARM 関数をコールします。
- プロセッサが x86 ファミリの(つまり、アプリケーションはWindows上の Palm OS シミュレータ上で動作している)場合、68Kアプリケーションは ARM 関数を代替する Windows DLL をコールします。
- 上記以外の場合、68Kアプリケーションは関数の68Kバージョンをコールするか、あるいはその機能を68Kアプリケーションに合理的に組み込むことができなければ体良く失敗します。この例は、アプリケーションが Palm OS Garnet よりも前のバージョンでも動作するという前提です。
リスト 14.1 にこのプロセスを示します。わかりやすさのために、この例では ARM 関数にはパラメータを渡していません。
リスト 14.1 ARM 関数のコール
static UInt32 PceNativeResourceCall(DmResType resType, DmResID resID, char *DLLEntryPointP, void *userCPB) { UInt32 processorType; MemHandle armH; MemPtr armP; UInt32 result; // get the processor type FtrGet(sysFileCSystem, sysFtrNumProcessorID, &processorType); if (sysFtrNumProcessorIsARM(processorType)){ // running on ARM; call the actual ARM resource armH = DmGetResource(resType, resID); armP = MemHandleLock(armH); result = PceNativeCall(armP, userCPB); MemHandleUnlock(armH); DmReleaseResource(armH); } else if (processorType == sysFtrNumProcessorx86) { // running on Simulator; call the DLL result = PceNativeCall((NativeFuncType *)DLLEntryPointP, userCPB); } else { // some other processor; fail gracefully ErrNonFatalDisplay("Unsupported processor type"); result = -1; } return result; }
各種のプロセッサタイプのための( 全て sysFtrNumProcessor〜 で始まる名前の )#define が SystemMgr.h で定義されています。