aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src/arm/PNOMain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/PalmOS/Src/arm/PNOMain.cpp')
-rw-r--r--backends/PalmOS/Src/arm/PNOMain.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/arm/PNOMain.cpp b/backends/PalmOS/Src/arm/PNOMain.cpp
new file mode 100644
index 0000000000..6fc59e0000
--- /dev/null
+++ b/backends/PalmOS/Src/arm/PNOMain.cpp
@@ -0,0 +1,60 @@
+#include "PACEInterfaceLib.h"
+#include "ArmNative.h"
+
+// Linker still looks for ARMlet_Main as entry point, but the
+// "ARMlet" name is now officially discouraged. Compare an
+// contrast to "PilotMain" for 68K applications.
+#define PNO_Main ARMlet_Main
+// entry point
+extern "C"
+unsigned long PNO_Main(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP);
+
+#ifndef WIN32
+
+#pragma thumb off
+asm void * __ARMlet_Take_Func_Addr__(void *f)
+{
+ sub r0, r0, r10 // 0 convert pointer to zero-based address
+ ldr r12, [pc, #8] // 4 load zero-based address of this routine plus offset into r12
+ sub r12, pc, r12 // 8 compute start of PNO by subtracting this from PC
+ add r0, r0, r12 // 12 add PNO start to function pointer
+ bx lr // 16 return to caller
+ dcd __ARMlet_Take_Func_Addr__ + 16 // 20
+}
+#pragma thumb reset
+
+#else
+#define __ARMlet_Take_Func_Addr__(x) x
+#endif
+
+unsigned long PNO_Main(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) {
+/* const PnoProc call[] = {
+ (PnoProc)__ARMlet_Take_Func_Addr__(OSystem_PALMOS_update_screen__wide_portrait),
+ (PnoProc)__ARMlet_Take_Func_Addr__(OSystem_PALMOS_update_screen__wide_landscape),
+ //OSystem_PALMOS_copy_rect
+ };
+*/
+#ifndef WIN32
+ // needed before making any OS calls using the
+ // PACEInterface library
+ InitPACEInterface(emulStateP, call68KFuncP);
+#else
+ global.call68KFuncP = call68KFuncP;
+ global.emulStateP = emulStateP;
+ global.userData68KP = userData68KP;
+#endif
+
+ UInt32 run = ByteSwap32(*(UInt32 *)userData68KP);
+
+ switch (run) {
+ case 0:
+ OSystem_PALMOS_update_screen__wide_portrait(userData68KP);
+ break;
+ case 1:
+ OSystem_PALMOS_update_screen__wide_landscape(userData68KP);
+ break;
+ }
+
+ return 0;
+// return call[run](userData68KP);
+}