refactoring for Wiz port; random cleanups
authornotaz <notasas@gmail.com>
Wed, 15 Jul 2009 16:13:43 +0000 (16:13 +0000)
committernotaz <notasas@gmail.com>
Wed, 15 Jul 2009 16:13:43 +0000 (16:13 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@703 be3aeb3a-fb24-0410-a615-afba39da0efa

18 files changed:
common/config.c
common/menu.c
common/menu.h
common/plat.h
gp2x/940ctl.c
gp2x/Makefile
gp2x/emu.c
gp2x/gp2x.h
gp2x/in_gp2x.c
gp2x/main.c
gp2x/plat.c
gp2x/soc.c [new file with mode: 0644]
gp2x/soc.h [new file with mode: 0644]
gp2x/soc_mmsp2.c [moved from gp2x/gp2x.c with 56% similarity]
gp2x/soc_mmsp2.h [new file with mode: 0644]
gp2x/soc_pollux.c [new file with mode: 0644]
linux/gp2x.c
pandora/emu.c

index 3ad6a94..c5ff538 100644 (file)
@@ -538,6 +538,7 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                                return 0;
                        return 1;
 
+#if 0 // TODO rm?
                case MA_OPT_CPU_CLOCKS:
 #ifdef __GP2X__
                        if (strcasecmp(var, "GP2X CPU clocks") != 0) return 0;
@@ -546,6 +547,7 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
 #endif
                        currentConfig.CPUclock = atoi(val);
                        return 1;
+#endif
 
                case MA_OPT2_GAMMA:
                        if (strcasecmp(var, "Gamma correction") != 0) return 0;
index eccdefc..0b49234 100644 (file)
@@ -1702,11 +1702,7 @@ static menu_entry e_menu_options[] =
        mee_onoff     ("Enable sound",             MA_OPT_ENABLE_SOUND,  currentConfig.EmuOpt, 0x004),\r
        mee_cust      ("Sound Quality",            MA_OPT_SOUND_QUALITY, mh_opt_misc, mgn_opt_sound),\r
        mee_cust      ("Confirm savestate",        MA_OPT_CONFIRM_STATES,mh_opt_misc, mgn_opt_c_saves),\r
-#if   defined(__GP2X__)\r
-       mee_range     ("GP2X CPU clocks",          MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 400),\r
-#elif defined(PSP)\r
-       mee_range     ("PSP CPU clock",            MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, )\r
-#endif\r
+       mee_range     (cpu_clk_name,               MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 900),\r
        mee_handler   ("[Display options]",        menu_loop_gfx_options),\r
        mee_handler   ("[Advanced options]",       menu_loop_adv_options),\r
        mee_handler   ("[Sega/Mega CD options]",   menu_loop_cd_options),\r
index a3625f8..430f002 100644 (file)
@@ -96,7 +96,7 @@ typedef enum
 
 typedef struct
 {
-       char *name;
+       const char *name;
        menu_behavior beh;
        menu_id id;
        void *var;              /* for on-off/range settings */
index ca1b3f3..ac7a438 100644 (file)
@@ -3,6 +3,7 @@ extern "C" {
 #endif
 
 /* stuff to be implemented by platform code */
+extern char cpu_clk_name[];
 /* TODO rename all these */
 extern const char * const keyNames[]; // TODO rm
 void  emu_prepareDefaultConfig(void);
@@ -18,6 +19,9 @@ int  emu_getMainDir(char *dst, int len);
 void menu_romload_prepare(const char *rom_name);
 void menu_romload_end(void);
 
+void plat_init(void);
+void plat_finish(void);
+
 /* menu: enter (switch bpp, etc), begin/end drawing */
 void plat_video_menu_enter(int is_rom_loaded);
 void plat_video_menu_begin(void);
index 7d7a400..083036e 100644 (file)
@@ -11,7 +11,8 @@
 #include <errno.h>\r
 \r
 #include "code940/940shared.h"\r
-#include "gp2x.h"\r
+#include "soc_mmsp2.h"\r
+#include "soc.h"\r
 #include "emu.h"\r
 #include "../common/mp3.h"\r
 #include "../common/arm_utils.h"\r
 #include "../../pico/sound/ym2612.h"\r
 #include "../../pico/sound/mix.h"\r
 \r
-/* we will need some gp2x internals here */\r
-extern volatile unsigned short *gp2x_memregs; /* from minimal library rlyeh */\r
-extern volatile unsigned long  *gp2x_memregl;\r
-\r
 extern int reset_timing;\r
 static unsigned char *shared_mem = 0;\r
 static _940_data_t *shared_data = 0;\r
@@ -286,8 +283,8 @@ void YM2612Init_940(int baseclock, int rate)
        printf("YM2612Init_940()\n");\r
        printf("Mem usage: shared_data: %i, shared_ctl: %i\n", sizeof(*shared_data), sizeof(*shared_ctl));\r
 \r
-       Reset940(1, 2);\r
-       Pause940(1);\r
+       reset940(1, 2);\r
+       pause940(1);\r
 \r
        gp2x_memregs[0x3B40>>1] = 0;      // disable DUALCPU interrupts for 920\r
        gp2x_memregs[0x3B42>>1] = 1;      // enable  DUALCPU interrupts for 940\r
@@ -347,8 +344,8 @@ void YM2612Init_940(int baseclock, int rate)
        gp2x_memregl[0x4510>>2] = 0xffffffff; // clear pending IRQs in INTPND\r
 \r
        /* start the 940 */\r
-       Reset940(0, 2);\r
-       Pause940(0);\r
+       reset940(0, 2);\r
+       pause940(0);\r
 \r
        // YM2612ResetChip_940(); // will be done on JOB940_YM2612INIT\r
 \r
index ea86f6b..b5ca333 100644 (file)
@@ -54,8 +54,8 @@ LD = $(CROSS)ld
 OBJCOPY = $(CROSS)objcopy\r
 \r
 # frontend\r
-# TODO: clean cpuctrl\r
-OBJS += main.o gp2x.o emu.o in_gp2x.o plat.o squidgehack.o cpuctrl.o\r
+# TODO: rm cpuctrl\r
+OBJS += main.o soc.o soc_mmsp2.o soc_pollux.o emu.o in_gp2x.o plat.o squidgehack.o cpuctrl.o\r
 # 940 core control\r
 OBJS += 940ctl.o\r
 \r
index 69a464e..585c1d5 100644 (file)
@@ -16,6 +16,7 @@
 \r
 #include "emu.h"\r
 #include "gp2x.h"\r
+#include "soc.h"\r
 #include "../common/menu.h"\r
 #include "../common/arm_utils.h"\r
 #include "../common/fonts.h"\r
@@ -40,8 +41,6 @@
 #endif\r
 \r
 \r
-int select_exits = 0;\r
-\r
 extern int crashed_940;\r
 \r
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];\r
@@ -1017,7 +1016,7 @@ const char *plat_get_credits(void)
                "Reesy & FluBBa: DrZ80 core\n"\r
                "MAME devs: YM2612 and SN76496 cores\n"\r
                "rlyeh and others: minimal SDK\n"\r
-               "Squidge: squidgehack\n"\r
+               "Squidge: mmuhack\n"\r
                "Dzz: ARM940 sample\n"\r
                "GnoStiC / Puck2099: USB joy code\n"\r
                "craigix: GP2X hardware\n"\r
index 5bebe74..3f6dadd 100644 (file)
@@ -1,34 +1,12 @@
-\r
 #ifndef __GP2X_H__\r
 #define __GP2X_H__\r
 \r
-\r
-void gp2x_init(void);\r
-void gp2x_deinit(void);\r
-\r
 /* video */\r
-void gp2x_video_flip(void);\r
-void gp2x_video_flip2(void);\r
 void gp2x_video_changemode(int bpp);\r
-void gp2x_video_changemode2(int bpp);\r
-void gp2x_video_setpalette(int *pal, int len);\r
-void gp2x_video_RGB_setscaling(int ln_offs, int W, int H);\r
-void gp2x_video_wait_vsync(void);\r
-void gp2x_video_flush_cache(void);\r
-void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len);\r
 void gp2x_memcpy_all_buffers(void *data, int offset, int len);\r
 void gp2x_memset_all_buffers(int offset, int byte, int len);\r
-void gp2x_pd_clone_buffer2(void);\r
 \r
 /* input */\r
 int gp2x_touchpad_read(int *x, int *y);\r
 \r
-/* 940 core */\r
-void Pause940(int yes);\r
-void Reset940(int yes, int bank);\r
-\r
-\r
-extern int memdev;\r
-\r
-\r
 #endif\r
index 213b3d4..8066ca7 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "../common/input.h"
 #include "in_gp2x.h"
+#include "soc.h"
 
 #define IN_PREFIX "gp2x:"
 #define IN_GP2X_NBUTTONS 32
@@ -12,8 +13,6 @@
 static int in_gp2x_combo_keys = 0;
 static int in_gp2x_combo_acts = 0;
 
-extern volatile unsigned short *gp2x_memregs; /* from minimal library rlyeh */
-
 enum  { BTN_UP = 0,      BTN_LEFT = 2,      BTN_DOWN = 4,  BTN_RIGHT = 6,
         BTN_START = 8,   BTN_SELECT = 9,    BTN_L = 10,    BTN_R = 11,
         BTN_A = 12,      BTN_B = 13,        BTN_X = 14,    BTN_Y = 15,
@@ -43,6 +42,7 @@ static int in_gp2x_get_bind_count(void)
 static int in_gp2x_get_gpio_bits(void)
 {
 #ifndef FAKE_IN_GP2X
+       extern volatile unsigned short *gp2x_memregs;
        int value;
        value = gp2x_memregs[0x1198>>1] & 0xff; // GPIO M
        if (value == 0xFD) value = 0xFA;
index 0ea8e82..2eed35b 100644 (file)
@@ -10,7 +10,6 @@
 #include <strings.h>\r
 #include <linux/limits.h>\r
 \r
-#include "gp2x.h"\r
 #include "../common/menu.h"\r
 #include "../common/emu.h"\r
 #include "../common/config.h"\r
@@ -24,8 +23,6 @@
 #include "cpuctrl.h"\r
 \r
 \r
-extern char *ext_menu, *ext_state;\r
-extern int select_exits;\r
 extern char *PicoConfigFile;\r
 static int load_state_slot = -1;\r
 int mmuhack_status = 0;\r
@@ -35,24 +32,15 @@ void parse_cmd_line(int argc, char *argv[])
 {\r
        int x, unrecognized = 0;\r
 \r
-       for(x = 1; x < argc; x++)\r
+       for (x = 1; x < argc; x++)\r
        {\r
-               if(argv[x][0] == '-')\r
+               if (argv[x][0] == '-')\r
                {\r
-                       if(strcasecmp(argv[x], "-menu") == 0) {\r
-                               if(x+1 < argc) { ++x; ext_menu = argv[x]; } /* External Frontend: Program Name */\r
+                       if (strcasecmp(argv[x], "-config") == 0) {\r
+                               if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
                        }\r
-                       else if(strcasecmp(argv[x], "-state") == 0) {\r
-                               if(x+1 < argc) { ++x; ext_state = argv[x]; } /* External Frontend: Arguments */\r
-                       }\r
-                       else if(strcasecmp(argv[x], "-config") == 0) {\r
-                               if(x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
-                       }\r
-                       else if(strcasecmp(argv[x], "-selectexit") == 0) {\r
-                               select_exits = 1;\r
-                       }\r
-                       else if(strcasecmp(argv[x], "-loadstate") == 0) {\r
-                               if(x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
+                       else if (strcasecmp(argv[x], "-loadstate") == 0) {\r
+                               if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
                        }\r
                        else {\r
                                unrecognized = 1;\r
@@ -72,15 +60,11 @@ void parse_cmd_line(int argc, char *argv[])
        }\r
 \r
        if (unrecognized) {\r
-               printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2008\n");\r
+               printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009\n");\r
                printf("usage: %s [options] [romfile]\n", argv[0]);\r
-               printf( "options:\n"\r
-                               "-menu <menu_path> launch a custom program on exit instead of default gp2xmenu\n"\r
-                               "-state <param>    pass '-state param' to the menu program\n"\r
-                               "-config <file>    use specified config file instead of default 'picoconfig.bin'\n"\r
-                               "                  see currentConfig_t structure in emu.h for the file format\n"\r
-                               "-selectexit       pressing SELECT will exit the emu and start 'menu_path'\n"\r
-                               "-loadstate <num>  if ROM is specified, try loading slot <num>\n");\r
+               printf("options:\n"\r
+                       " -config <file>    use specified config file instead of default 'config.cfg'\n"\r
+                       " -loadstate <num>  if ROM is specified, try loading slot <num>\n");\r
        }\r
 }\r
 \r
@@ -89,22 +73,22 @@ int main(int argc, char *argv[])
 {\r
        g_argv = argv;\r
 \r
+       /* in_init() must go before config, config accesses in_ fwk */\r
        in_init();\r
        emu_prepareDefaultConfig();\r
        emu_ReadConfig(0, 0);\r
        config_readlrom(PicoConfigFile);\r
 \r
+       plat_init();\r
        in_probe();\r
        in_debug_dump();\r
-       gp2x_init();\r
+\r
        if (currentConfig.EmuOpt&0x10) {\r
                int ret = mmuhack();\r
                printf("squidge hack code finished and returned %i\n", ret); fflush(stdout);\r
                mmuhack_status = ret;\r
        }\r
        cpuctrl_init();\r
-       // Reset940(1);\r
-       // Pause940(1);\r
        if (currentConfig.EmuOpt&0x100) {\r
                printf("setting RAM timings.. "); fflush(stdout);\r
                // craigix: --trc 6 --tras 4 --twr 1 --tmrd 1 --trfc 1 --trp 2 --trcd 2\r
@@ -169,8 +153,8 @@ int main(int argc, char *argv[])
        emu_Deinit();\r
        sharedmem_deinit();\r
        cpuctrl_deinit();\r
-       gp2x_deinit();\r
-       if(mmuhack_status)\r
+       plat_finish();\r
+       if (mmuhack_status)\r
                mmuunhack();\r
 \r
        return 0;\r
index a2b8394..0160634 100644 (file)
@@ -1,11 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 
 #include "gp2x.h"
+#include "soc.h"
 #include "../common/plat.h"
 #include "../common/readpng.h"
 #include "../common/menu.h"
 #include "../common/emu.h"
+#include "../linux/sndout_oss.h"
 
+/* GP2X local */
+void *gp2x_screens[4];
+
+void gp2x_video_changemode(int bpp)
+{
+       gp2x_video_changemode_ll(bpp);
+
+       gp2x_memset_all_buffers(0, 0, 320*240*2);
+       gp2x_video_flip();
+}
+
+static void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
+{
+       char *dst;
+       if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }
+       if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }
+       if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }
+       if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }
+}
+
+void gp2x_memcpy_all_buffers(void *data, int offset, int len)
+{
+       gp2x_memcpy_buffers(0xf, data, offset, len);
+}
+
+void gp2x_memset_all_buffers(int offset, int byte, int len)
+{
+       memset((char *)gp2x_screens[0] + offset, byte, len);
+       memset((char *)gp2x_screens[1] + offset, byte, len);
+       memset((char *)gp2x_screens[2] + offset, byte, len);
+       memset((char *)gp2x_screens[3] + offset, byte, len);
+}
+
+/* common */
+char cpu_clk_name[16] = "GP2X CPU clocks";
 
 void plat_video_menu_enter(int is_rom_loaded)
 {
@@ -26,19 +66,70 @@ void plat_video_menu_enter(int is_rom_loaded)
        gp2x_memcpy_buffers((1<<2), g_screen_ptr, 0, 320*240*2);
 
        // switch to 16bpp
-       gp2x_video_changemode2(16);
+       gp2x_video_changemode_ll(16);
        gp2x_video_RGB_setscaling(0, 320, 240);
        gp2x_video_flip2();
 }
 
 void plat_video_menu_begin(void)
 {
-       gp2x_pd_clone_buffer2();
+       memcpy(g_screen_ptr, gp2x_screens[2], 320*240*2);
 }
 
 void plat_video_menu_end(void)
 {
-       gp2x_video_flush_cache();
+       // FIXME
+       // gp2x_video_flush_cache();
        gp2x_video_flip2();
 }
 
+void plat_init(void)
+{
+       gp2x_soc_t soc;
+
+       soc = soc_detect();
+       switch (soc)
+       {
+       case SOCID_MMSP2:
+               mmsp2_init();
+               break;
+       case SOCID_POLLUX:
+               pollux_init();
+               strcpy(cpu_clk_name, "Wiz CPU clock");
+               break;
+       default:
+               fprintf(stderr, "could not recognize SoC, bailing out.\n");
+               exit(1);
+       }
+
+       gp2x_memset_all_buffers(0, 0, 320*240*2);
+
+       // snd
+       sndout_oss_init();
+}
+
+void plat_finish(void)
+{
+       switch (gp2x_soc)
+       {
+       case SOCID_MMSP2:
+               mmsp2_finish();
+               break;
+       case SOCID_POLLUX:
+               pollux_finish();
+               break;
+       }
+
+       gp2x_video_changemode(16);
+       sndout_oss_exit();
+}
+
+void lprintf(const char *fmt, ...)
+{
+       va_list vl;
+
+       va_start(vl, fmt);
+       vprintf(fmt, vl);
+       va_end(vl);
+}
+
diff --git a/gp2x/soc.c b/gp2x/soc.c
new file mode 100644 (file)
index 0000000..d34077d
--- /dev/null
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "soc.h"
+#include "../common/emu.h"
+
+gp2x_soc_t gp2x_soc = -1;
+
+gp2x_soc_t soc_detect(void)
+{
+       volatile unsigned short *memregs;
+       volatile unsigned int *memregl;
+       int pollux_chipname[0x30/4 + 1];
+       char *pollux_chipname_c = (char *)pollux_chipname;
+       gp2x_soc_t ret = -1;
+       int memdev;
+       int i;
+
+       memdev = open("/dev/mem", O_RDONLY);
+       if (memdev == -1)
+       {
+               perror("open(/dev/mem)");
+               return -1;
+       }
+
+       memregs = mmap(0, 0x20000, PROT_READ, MAP_SHARED, memdev, 0xc0000000);
+       if (memregs == MAP_FAILED)
+       {
+               perror("mmap(memregs)");
+               close(memdev);
+               return -1;
+       }
+       memregl = (volatile void *)memregs;
+
+       if (memregs[0x1836>>1] == 0x2330)
+       {
+               printf("looks like this is MMSP2\n");
+               ret = SOCID_MMSP2;
+               goto out;
+       }
+
+       /* perform word reads. Byte reads might also work,
+        * but we don't want to play with that. */
+       for (i = 0; i < 0x30; i += 4)
+       {
+               pollux_chipname[i >> 2] = memregl[(0x1f810 + i) >> 2];
+       }
+       pollux_chipname_c[0x30] = 0;
+
+       for (i = 0; i < 0x30; i++)
+       {
+               unsigned char c = pollux_chipname_c[i];
+               if (c < 0x20 || c > 0x7f)
+                       goto not_pollux_like;
+       }
+
+       printf("found pollux-like id: \"%s\"\n", pollux_chipname_c);
+
+       if (strncmp(pollux_chipname_c, "MAGICEYES-LEAPFROG-LF1000", 25) ||
+               strncmp(pollux_chipname_c, "MAGICEYES-POLLUX", 16))
+       {
+               ret = SOCID_POLLUX;
+               goto out;
+       }
+
+not_pollux_like:
+out:
+       munmap((void *)memregs, 0x20000);
+       close(memdev);
+       gp2x_soc = ret;
+       return ret;     
+}
+
diff --git a/gp2x/soc.h b/gp2x/soc.h
new file mode 100644 (file)
index 0000000..c47db17
--- /dev/null
@@ -0,0 +1,21 @@
+typedef enum {
+       SOCID_MMSP2 = 1,
+       SOCID_POLLUX,
+} gp2x_soc_t;
+
+extern gp2x_soc_t gp2x_soc;
+
+gp2x_soc_t soc_detect(void);
+
+void mmsp2_init(void);
+void mmsp2_finish(void);
+
+void pollux_init(void);
+void pollux_finish(void);
+
+void gp2x_video_flip(void);
+void gp2x_video_flip2(void);
+void gp2x_video_changemode_ll(int bpp);
+void gp2x_video_setpalette(int *pal, int len);
+void gp2x_video_RGB_setscaling(int ln_offs, int W, int H);
+void gp2x_video_wait_vsync(void);
similarity index 56%
rename from gp2x/gp2x.c
rename to gp2x/soc_mmsp2.c
index f350352..86e3ac8 100644 (file)
-/**\r
- * All this is mostly based on rlyeh's minimal library.\r
- * Copied here to review all his code and understand what's going on.\r
-**/\r
-\r
-/*\r
-\r
-  GP2X minimal library v0.A by rlyeh, (c) 2005. emulnation.info@rlyeh (swap it!)\r
-\r
-  Thanks to Squidge, Robster, snaff, Reesy and NK, for the help & previous work! :-)\r
-\r
-  License\r
-  =======\r
-\r
-  Free for non-commercial projects (it would be nice receiving a mail from you).\r
-  Other cases, ask me first.\r
-\r
-  GamePark Holdings is not allowed to use this library and/or use parts from it.\r
-\r
-*/\r
-\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <stdarg.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-#include <sys/mman.h>\r
-#include <sys/types.h>\r
-#include <sys/stat.h>\r
-#include <fcntl.h>\r
-#include <errno.h>\r
-\r
-#include "gp2x.h"\r
-#include "../linux/sndout_oss.h"\r
-#include "../common/arm_utils.h"\r
-#include "../common/arm_linux.h"\r
-#include "../common/emu.h"\r
-\r
-volatile unsigned short *gp2x_memregs;\r
-//static\r
-volatile unsigned long  *gp2x_memregl;\r
-static void *gp2x_screens[4];\r
-static int screensel = 0;\r
-//static\r
-int memdev = 0;\r
-static int touchdev = -1;\r
-static int touchcal[7] = { 6203, 0, -1501397, 0, -4200, 16132680, 65536 };\r
-\r
-#define FRAMEBUFF_WHOLESIZE (0x30000*4) // 320*240*2 + some more\r
-#define FRAMEBUFF_ADDR0 (0x4000000-FRAMEBUFF_WHOLESIZE)\r
-#define FRAMEBUFF_ADDR1 (FRAMEBUFF_ADDR0+0x30000)\r
-#define FRAMEBUFF_ADDR2 (FRAMEBUFF_ADDR1+0x30000)\r
-#define FRAMEBUFF_ADDR3 (FRAMEBUFF_ADDR2+0x30000)\r
-\r
-static const int gp2x_screenaddrs[4] = { FRAMEBUFF_ADDR0, FRAMEBUFF_ADDR1, FRAMEBUFF_ADDR2, FRAMEBUFF_ADDR3 };\r
-static int gp2x_screenaddrs_use[4];\r
-static unsigned short gp2x_screenaddr_old[4];\r
-\r
-\r
-/* video stuff */\r
-void gp2x_video_flip(void)\r
-{\r
-       unsigned short lsw = (unsigned short) gp2x_screenaddrs_use[screensel&3];\r
-       unsigned short msw = (unsigned short)(gp2x_screenaddrs_use[screensel&3] >> 16);\r
-\r
-       gp2x_memregs[0x2910>>1] = msw;\r
-       gp2x_memregs[0x2914>>1] = msw;\r
-       gp2x_memregs[0x290E>>1] = lsw;\r
-       gp2x_memregs[0x2912>>1] = lsw;\r
-\r
-       // jump to other buffer:\r
-       g_screen_ptr = gp2x_screens[++screensel&3];\r
-}\r
-\r
-/* doulblebuffered flip */\r
-void gp2x_video_flip2(void)\r
-{\r
-       unsigned short msw = (unsigned short)(gp2x_screenaddrs_use[screensel&1] >> 16);\r
-\r
-       gp2x_memregs[0x2910>>1] = msw;\r
-       gp2x_memregs[0x2914>>1] = msw;\r
-       gp2x_memregs[0x290E>>1] = 0;\r
-       gp2x_memregs[0x2912>>1] = 0;\r
-\r
-       // jump to other buffer:\r
-       g_screen_ptr = gp2x_screens[++screensel&1];\r
-}\r
-\r
-\r
-void gp2x_video_changemode2(int bpp)\r
-{\r
-       gp2x_memregs[0x28DA>>1]=(((bpp+1)/8)<<9)|0xAB; /*8/15/16/24bpp...*/\r
-       gp2x_memregs[0x290C>>1]=320*((bpp+1)/8); /*line width in bytes*/\r
-}\r
-\r
-\r
-void gp2x_video_changemode(int bpp)\r
-{\r
-       gp2x_video_changemode2(bpp);\r
-\r
-       gp2x_memset_all_buffers(0, 0, 320*240*2);\r
-       gp2x_video_flip();\r
-}\r
-\r
-\r
-void gp2x_video_setpalette(int *pal, int len)\r
-{\r
-       unsigned short *g=(unsigned short *)pal;\r
-       volatile unsigned short *memreg = &gp2x_memregs[0x295A>>1];\r
-       gp2x_memregs[0x2958>>1] = 0;\r
-\r
-       len *= 2;\r
-       while(len--) *memreg=*g++;\r
-}\r
-\r
-\r
-// TV Compatible function //\r
-void gp2x_video_RGB_setscaling(int ln_offs, int W, int H)\r
-{\r
-       float escalaw, escalah;\r
-       int bpp = (gp2x_memregs[0x28DA>>1]>>9)&0x3;\r
-       unsigned short scalw;\r
-\r
-       // set offset\r
-       gp2x_screenaddrs_use[0] = gp2x_screenaddrs[0] + ln_offs * 320 * bpp;\r
-       gp2x_screenaddrs_use[1] = gp2x_screenaddrs[1] + ln_offs * 320 * bpp;\r
-       gp2x_screenaddrs_use[2] = gp2x_screenaddrs[2] + ln_offs * 320 * bpp;\r
-       gp2x_screenaddrs_use[3] = gp2x_screenaddrs[3] + ln_offs * 320 * bpp;\r
-\r
-       escalaw = 1024.0; // RGB Horiz LCD\r
-       escalah = 320.0; // RGB Vert LCD\r
-\r
-       if(gp2x_memregs[0x2800>>1]&0x100) //TV-Out\r
-       {\r
-               escalaw=489.0; // RGB Horiz TV (PAL, NTSC)\r
-               if (gp2x_memregs[0x2818>>1]  == 287) //PAL\r
-                       escalah=274.0; // RGB Vert TV PAL\r
-               else if (gp2x_memregs[0x2818>>1]  == 239) //NTSC\r
-                       escalah=331.0; // RGB Vert TV NTSC\r
-       }\r
-\r
-       // scale horizontal\r
-       scalw = (unsigned short)((float)escalaw *(W/320.0));\r
-       /* if there is no horizontal scaling, vertical doesn't work. Here is a nasty wrokaround... */\r
-       if (H != 240 && W == 320) scalw--;\r
-       gp2x_memregs[0x2906>>1]=scalw;\r
-       // scale vertical\r
-       gp2x_memregl[0x2908>>2]=(unsigned long)((float)escalah *bpp *(H/240.0));\r
-}\r
-\r
-\r
-void gp2x_video_wait_vsync(void)\r
-{\r
-       unsigned short v = gp2x_memregs[0x1182>>1];\r
-       while (!((v ^ gp2x_memregs[0x1182>>1]) & 0x10)) spend_cycles(1024);\r
-}\r
-\r
-\r
-void gp2x_video_flush_cache(void)\r
-{\r
-       // since we are using the mmu hack, we must flush the cache first\r
-       cache_flush_d_inval_i(g_screen_ptr, (char *)g_screen_ptr + 320*240*2);\r
-}\r
-\r
-\r
-void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)\r
-{\r
-       char *dst;\r
-       if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }\r
-       if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }\r
-       if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }\r
-       if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }\r
-}\r
-\r
-\r
-void gp2x_memcpy_all_buffers(void *data, int offset, int len)\r
-{\r
-       gp2x_memcpy_buffers(0xf, data, offset, len);\r
-}\r
-\r
-\r
-void gp2x_memset_all_buffers(int offset, int byte, int len)\r
-{\r
-       memset((char *)gp2x_screens[0] + offset, byte, len);\r
-       memset((char *)gp2x_screens[1] + offset, byte, len);\r
-       memset((char *)gp2x_screens[2] + offset, byte, len);\r
-       memset((char *)gp2x_screens[3] + offset, byte, len);\r
-}\r
-\r
-\r
-void gp2x_pd_clone_buffer2(void)\r
-{\r
-       memcpy(g_screen_ptr, gp2x_screens[2], 320*240*2);\r
-}\r
-\r
-\r
-typedef struct ucb1x00_ts_event\r
-{\r
-       unsigned short pressure;\r
-       unsigned short x;\r
-       unsigned short y;\r
-       unsigned short pad;\r
-       struct timeval stamp;\r
-} UCB1X00_TS_EVENT;\r
-\r
-int gp2x_touchpad_read(int *x, int *y)\r
-{\r
-       UCB1X00_TS_EVENT event;\r
-       static int zero_seen = 0;\r
-       int retval;\r
-\r
-       if (touchdev < 0) return -1;\r
-\r
-       retval = read(touchdev, &event, sizeof(event));\r
-       if (retval <= 0) {\r
-               printf("touch read failed %i %i\n", retval, errno);\r
-               return -1;\r
-       }\r
-       // this is to ignore the messed-up 4.1.x driver\r
-       if (event.pressure == 0) zero_seen = 1;\r
-\r
-       if (x) *x = (event.x * touchcal[0] + touchcal[2]) >> 16;\r
-       if (y) *y = (event.y * touchcal[4] + touchcal[5]) >> 16;\r
-       // printf("read %i %i %i\n", event.pressure, *x, *y);\r
-\r
-       return zero_seen ? event.pressure : 0;\r
-}\r
-\r
-\r
-/* 940 */\r
-void Pause940(int yes)\r
-{\r
-       if(yes)\r
-               gp2x_memregs[0x0904>>1] &= 0xFFFE;\r
-       else\r
-               gp2x_memregs[0x0904>>1] |= 1;\r
-}\r
-\r
-\r
-void Reset940(int yes, int bank)\r
-{\r
-       gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03);\r
-}\r
-\r
-static void proc_set(const char *path, const char *val)\r
-{\r
-       FILE *f;\r
-       char tmp[16];\r
-\r
-       f = fopen(path, "w");\r
-       if (f == NULL) {\r
-               printf("failed to open: %s\n", path);\r
-               return;\r
-       }\r
-\r
-       fprintf(f, "0\n");\r
-       fclose(f);\r
-\r
-       printf("\"%s\" is set to: ", path);\r
-       f = fopen(path, "r");\r
-       if (f == NULL) {\r
-               printf("(open failed)\n");\r
-               return;\r
-       }\r
-\r
-       fgets(tmp, sizeof(tmp), f);\r
-       printf("%s", tmp);\r
-       fclose(f);\r
-}\r
-\r
-\r
-/* common */\r
-void gp2x_init(void)\r
-{\r
-       printf("entering init()\n"); fflush(stdout);\r
-\r
-       memdev = open("/dev/mem", O_RDWR);\r
-       if (memdev == -1)\r
-       {\r
-               perror("open(\"/dev/mem\")");\r
-               exit(1);\r
-       }\r
-\r
-       gp2x_memregs = mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0xc0000000);\r
-       printf("memregs are @ %p\n", gp2x_memregs);\r
-       if(gp2x_memregs == MAP_FAILED)\r
-       {\r
-               perror("mmap(memregs)");\r
-               exit(1);\r
-       }\r
-       gp2x_memregl = (unsigned long *) gp2x_memregs;\r
-\r
-       gp2x_memregs[0x2880>>1] &= ~0x383; // disable cursor, subpict, osd, video layers\r
-\r
-       gp2x_screens[0] = mmap(0, FRAMEBUFF_WHOLESIZE, PROT_WRITE, MAP_SHARED, memdev, FRAMEBUFF_ADDR0);\r
-       if(gp2x_screens[0] == MAP_FAILED)\r
-       {\r
-               perror("mmap(g_screen_ptr)");\r
-               exit(1);\r
-       }\r
-       printf("framebuffers point to %p\n", gp2x_screens[0]);\r
-       gp2x_screens[1] = (char *) gp2x_screens[0]+0x30000;\r
-       gp2x_screens[2] = (char *) gp2x_screens[1]+0x30000;\r
-       gp2x_screens[3] = (char *) gp2x_screens[2]+0x30000;\r
-\r
-       g_screen_ptr = gp2x_screens[0];\r
-       screensel = 0;\r
-\r
-       gp2x_screenaddr_old[0] = gp2x_memregs[0x290E>>1];\r
-       gp2x_screenaddr_old[1] = gp2x_memregs[0x2910>>1];\r
-       gp2x_screenaddr_old[2] = gp2x_memregs[0x2912>>1];\r
-       gp2x_screenaddr_old[3] = gp2x_memregs[0x2914>>1];\r
-\r
-       memcpy(gp2x_screenaddrs_use, gp2x_screenaddrs, sizeof(gp2x_screenaddrs));\r
-       gp2x_memset_all_buffers(0, 0, 320*240*2);\r
-\r
-       // snd\r
-       sndout_oss_init();\r
-\r
-       // touchscreen\r
-       touchdev = open("/dev/touchscreen/wm97xx", O_RDONLY);\r
-       if (touchdev >= 0) {\r
-               FILE *pcf = fopen("/etc/pointercal", "r");\r
-               if (pcf) {\r
-                       fscanf(pcf, "%d %d %d %d %d %d %d", &touchcal[0], &touchcal[1],\r
-                               &touchcal[2], &touchcal[3], &touchcal[4], &touchcal[5], &touchcal[6]);\r
-                       fclose(pcf);\r
-               }\r
-               printf("found touchscreen/wm97xx\n");\r
-       }\r
-\r
-       /* disable Linux read-ahead */\r
-       proc_set("/proc/sys/vm/max-readahead", "0\n");\r
-       proc_set("/proc/sys/vm/min-readahead", "0\n");\r
-\r
-       printf("exitting init()\n"); fflush(stdout);\r
-}\r
-\r
-char *ext_menu = 0, *ext_state = 0;\r
-\r
-void gp2x_deinit(void)\r
-{\r
-       Reset940(1, 3);\r
-       Pause940(1);\r
-\r
-       gp2x_video_changemode(15);\r
-       gp2x_memregs[0x290E>>1] = gp2x_screenaddr_old[0];\r
-       gp2x_memregs[0x2910>>1] = gp2x_screenaddr_old[1];\r
-       gp2x_memregs[0x2912>>1] = gp2x_screenaddr_old[2];\r
-       gp2x_memregs[0x2914>>1] = gp2x_screenaddr_old[3];\r
-\r
-       munmap(gp2x_screens[0], FRAMEBUFF_WHOLESIZE);\r
-       munmap((void *)gp2x_memregs, 0x10000);\r
-       close(memdev);\r
-       if (touchdev >= 0) close(touchdev);\r
-\r
-       sndout_oss_exit();\r
-\r
-       printf("all done, running ");\r
-\r
-       // Zaq121's alternative frontend support from MAME\r
-       if (ext_menu && ext_state) {\r
-               printf("%s -state %s\n", ext_menu, ext_state);\r
-               execl(ext_menu, ext_menu, "-state", ext_state, NULL);\r
-       } else if(ext_menu) {\r
-               printf("%s\n", ext_menu);\r
-               execl(ext_menu, ext_menu, NULL);\r
-       } else {\r
-               printf("gp2xmenu\n");\r
-               chdir("/usr/gp2x");\r
-               execl("gp2xmenu", "gp2xmenu", NULL);\r
-       }\r
-}\r
-\r
-/* lprintf */\r
-void lprintf(const char *fmt, ...)\r
-{\r
-       va_list vl;\r
-\r
-       va_start(vl, fmt);\r
-       vprintf(fmt, vl);\r
-       va_end(vl);\r
-}\r
-\r
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "soc.h"
+#include "soc_mmsp2.h"
+#include "gp2x.h"
+#include "../common/emu.h"
+#include "../common/arm_utils.h"
+
+volatile unsigned short *gp2x_memregs;
+volatile unsigned long  *gp2x_memregl;
+extern void *gp2x_screens[4];
+static int screensel = 0;
+
+int memdev = 0;        /* used by code940 */
+static int touchdev = -1;
+static int touchcal[7] = { 6203, 0, -1501397, 0, -4200, 16132680, 65536 };
+
+#define FRAMEBUFF_SIZE  0x30000
+#define FRAMEBUFF_WHOLESIZE (FRAMEBUFF_SIZE*4) // 320*240*2 + some more
+#define FRAMEBUFF_ADDR0 (0x4000000 - FRAMEBUFF_WHOLESIZE)
+#define FRAMEBUFF_ADDR1 (FRAMEBUFF_ADDR0 + FRAMEBUFF_SIZE)
+#define FRAMEBUFF_ADDR2 (FRAMEBUFF_ADDR1 + FRAMEBUFF_SIZE)
+#define FRAMEBUFF_ADDR3 (FRAMEBUFF_ADDR2 + FRAMEBUFF_SIZE)
+
+static const int gp2x_screenaddrs[4] = { FRAMEBUFF_ADDR0, FRAMEBUFF_ADDR1, FRAMEBUFF_ADDR2, FRAMEBUFF_ADDR3 };
+static int gp2x_screenaddrs_use[4];
+static unsigned short gp2x_screenaddr_old[4];
+
+
+/* video stuff */
+void gp2x_video_flip(void)
+{
+       unsigned short lsw = (unsigned short) gp2x_screenaddrs_use[screensel&3];
+       unsigned short msw = (unsigned short)(gp2x_screenaddrs_use[screensel&3] >> 16);
+
+       gp2x_memregs[0x2910>>1] = msw;
+       gp2x_memregs[0x2914>>1] = msw;
+       gp2x_memregs[0x290E>>1] = lsw;
+       gp2x_memregs[0x2912>>1] = lsw;
+
+       // jump to other buffer:
+       g_screen_ptr = gp2x_screens[++screensel&3];
+}
+
+/* doulblebuffered flip */
+void gp2x_video_flip2(void)
+{
+       unsigned short msw = (unsigned short)(gp2x_screenaddrs_use[screensel&1] >> 16);
+
+       gp2x_memregs[0x2910>>1] = msw;
+       gp2x_memregs[0x2914>>1] = msw;
+       gp2x_memregs[0x290E>>1] = 0;
+       gp2x_memregs[0x2912>>1] = 0;
+
+       // jump to other buffer:
+       g_screen_ptr = gp2x_screens[++screensel&1];
+}
+
+void gp2x_video_changemode_ll(int bpp)
+{
+       gp2x_memregs[0x28DA>>1] = (((bpp+1)/8)<<9)|0xAB; /*8/15/16/24bpp...*/
+       gp2x_memregs[0x290C>>1] = 320*((bpp+1)/8); /*line width in bytes*/
+}
+
+void gp2x_video_setpalette(int *pal, int len)
+{
+       unsigned short *g = (unsigned short *)pal;
+       volatile unsigned short *memreg = &gp2x_memregs[0x295A>>1];
+
+       gp2x_memregs[0x2958>>1] = 0;
+
+       len *= 2;
+       while (len--)
+               *memreg = *g++;
+}
+
+// TV Compatible function //
+void gp2x_video_RGB_setscaling(int ln_offs, int W, int H)
+{
+       float escalaw, escalah;
+       int bpp = (gp2x_memregs[0x28DA>>1]>>9)&0x3;
+       unsigned short scalw;
+
+       // set offset
+       gp2x_screenaddrs_use[0] = gp2x_screenaddrs[0] + ln_offs * 320 * bpp;
+       gp2x_screenaddrs_use[1] = gp2x_screenaddrs[1] + ln_offs * 320 * bpp;
+       gp2x_screenaddrs_use[2] = gp2x_screenaddrs[2] + ln_offs * 320 * bpp;
+       gp2x_screenaddrs_use[3] = gp2x_screenaddrs[3] + ln_offs * 320 * bpp;
+
+       escalaw = 1024.0; // RGB Horiz LCD
+       escalah = 320.0; // RGB Vert LCD
+
+       if(gp2x_memregs[0x2800>>1]&0x100) //TV-Out
+       {
+               escalaw=489.0; // RGB Horiz TV (PAL, NTSC)
+               if (gp2x_memregs[0x2818>>1]  == 287) //PAL
+                       escalah=274.0; // RGB Vert TV PAL
+               else if (gp2x_memregs[0x2818>>1]  == 239) //NTSC
+                       escalah=331.0; // RGB Vert TV NTSC
+       }
+
+       // scale horizontal
+       scalw = (unsigned short)((float)escalaw *(W/320.0));
+       /* if there is no horizontal scaling, vertical doesn't work. Here is a nasty wrokaround... */
+       if (H != 240 && W == 320) scalw--;
+       gp2x_memregs[0x2906>>1]=scalw;
+       // scale vertical
+       gp2x_memregl[0x2908>>2]=(unsigned long)((float)escalah *bpp *(H/240.0));
+}
+
+void gp2x_video_wait_vsync(void)
+{
+       unsigned short v = gp2x_memregs[0x1182>>1];
+       while (!((v ^ gp2x_memregs[0x1182>>1]) & 0x10))
+               spend_cycles(1024);
+}
+
+/* 940 */
+void pause940(int yes)
+{
+       if (yes)
+               gp2x_memregs[0x0904>>1] &= 0xFFFE;
+       else
+               gp2x_memregs[0x0904>>1] |= 1;
+}
+
+void reset940(int yes, int bank)
+{
+       gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03);
+}
+
+
+/* these are not quite MMSP2 related,
+ * more to GP2X F100/F200 consoles themselves. */
+typedef struct ucb1x00_ts_event
+{
+       unsigned short pressure;
+       unsigned short x;
+       unsigned short y;
+       unsigned short pad;
+       struct timeval stamp;
+} UCB1X00_TS_EVENT;
+
+int gp2x_touchpad_read(int *x, int *y)
+{
+       UCB1X00_TS_EVENT event;
+       static int zero_seen = 0;
+       int retval;
+
+       if (touchdev < 0) return -1;
+
+       retval = read(touchdev, &event, sizeof(event));
+       if (retval <= 0) {
+               perror("touch read failed");
+               return -1;
+       }
+       // this is to ignore the messed-up 4.1.x driver
+       if (event.pressure == 0) zero_seen = 1;
+
+       if (x) *x = (event.x * touchcal[0] + touchcal[2]) >> 16;
+       if (y) *y = (event.y * touchcal[4] + touchcal[5]) >> 16;
+       // printf("read %i %i %i\n", event.pressure, *x, *y);
+
+       return zero_seen ? event.pressure : 0;
+}
+
+static void proc_set(const char *path, const char *val)
+{
+       FILE *f;
+       char tmp[16];
+
+       f = fopen(path, "w");
+       if (f == NULL) {
+               printf("failed to open: %s\n", path);
+               return;
+       }
+
+       fprintf(f, "0\n");
+       fclose(f);
+
+       printf("\"%s\" is set to: ", path);
+       f = fopen(path, "r");
+       if (f == NULL) {
+               printf("(open failed)\n");
+               return;
+       }
+
+       fgets(tmp, sizeof(tmp), f);
+       printf("%s", tmp);
+       fclose(f);
+}
+
+
+void mmsp2_init(void)
+{
+       int i;
+
+       memdev = open("/dev/mem", O_RDWR);
+       if (memdev == -1)
+       {
+               perror("open(\"/dev/mem\")");
+               exit(1);
+       }
+
+       gp2x_memregs = mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0xc0000000);
+       if (gp2x_memregs == MAP_FAILED)
+       {
+               perror("mmap(memregs)");
+               exit(1);
+       }
+       gp2x_memregl = (unsigned long *) gp2x_memregs;
+
+       gp2x_memregs[0x2880>>1] &= ~0x383; // disable cursor, subpict, osd, video layers
+
+       gp2x_screens[0] = mmap(0, FRAMEBUFF_WHOLESIZE, PROT_WRITE, MAP_SHARED,
+               memdev, gp2x_screenaddrs[0]);
+       if (gp2x_screens[0] == MAP_FAILED)
+       {
+               perror("mmap(g_screen_ptr)");
+               exit(1);
+       }
+       printf("framebuffers:\n");
+       printf("  %08x -> %p\n", gp2x_screenaddrs[0], gp2x_screens[0]);
+       for (i = 1; i < 4; i++)
+       {
+               gp2x_screens[i] = (char *) gp2x_screens[i - 1] + FRAMEBUFF_SIZE;
+               printf("  %08x -> %p\n", gp2x_screenaddrs[i], gp2x_screens[i]);
+       }
+
+       g_screen_ptr = gp2x_screens[0];
+       screensel = 0;
+
+       gp2x_screenaddr_old[0] = gp2x_memregs[0x290E>>1];
+       gp2x_screenaddr_old[1] = gp2x_memregs[0x2910>>1];
+       gp2x_screenaddr_old[2] = gp2x_memregs[0x2912>>1];
+       gp2x_screenaddr_old[3] = gp2x_memregs[0x2914>>1];
+
+       memcpy(gp2x_screenaddrs_use, gp2x_screenaddrs, sizeof(gp2x_screenaddrs));
+
+       // touchscreen
+       touchdev = open("/dev/touchscreen/wm97xx", O_RDONLY);
+       if (touchdev >= 0) {
+               FILE *pcf = fopen("/etc/pointercal", "r");
+               if (pcf) {
+                       fscanf(pcf, "%d %d %d %d %d %d %d", &touchcal[0], &touchcal[1],
+                               &touchcal[2], &touchcal[3], &touchcal[4], &touchcal[5], &touchcal[6]);
+                       fclose(pcf);
+               }
+               printf("found touchscreen/wm97xx\n");
+       }
+
+       /* disable Linux read-ahead */
+       proc_set("/proc/sys/vm/max-readahead", "0\n");
+       proc_set("/proc/sys/vm/min-readahead", "0\n");
+}
+
+void mmsp2_finish(void)
+{
+       reset940(1, 3);
+       pause940(1);
+
+       gp2x_memregs[0x290E>>1] = gp2x_screenaddr_old[0];
+       gp2x_memregs[0x2910>>1] = gp2x_screenaddr_old[1];
+       gp2x_memregs[0x2912>>1] = gp2x_screenaddr_old[2];
+       gp2x_memregs[0x2914>>1] = gp2x_screenaddr_old[3];
+
+       munmap(gp2x_screens[0], FRAMEBUFF_WHOLESIZE);
+       munmap((void *)gp2x_memregs, 0x10000);
+       close(memdev);
+       if (touchdev >= 0)
+               close(touchdev);
+}
+
diff --git a/gp2x/soc_mmsp2.h b/gp2x/soc_mmsp2.h
new file mode 100644 (file)
index 0000000..493bf9f
--- /dev/null
@@ -0,0 +1,9 @@
+
+extern int memdev;
+extern volatile unsigned short *gp2x_memregs;
+extern volatile unsigned long  *gp2x_memregl;
+
+/* 940 core */
+void pause940(int yes);
+void reset940(int yes, int bank);
+
diff --git a/gp2x/soc_pollux.c b/gp2x/soc_pollux.c
new file mode 100644 (file)
index 0000000..c8ca1b8
--- /dev/null
@@ -0,0 +1,9 @@
+
+void pollux_init(void)
+{
+}
+
+void pollux_finish(void)
+{
+}
+
index a22e079..a58b451 100644 (file)
@@ -1,4 +1,4 @@
-/* faking/emulating gp2x.c by using gtk */
+/* faking/emulating gp2x by using gtk */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -27,7 +27,6 @@ static const char *verstring = "PicoDrive " VERSION;
 static int scr_changed = 0, scr_w = SCREEN_WIDTH, scr_h = SCREEN_HEIGHT;
 
 // dummies
-char *ext_menu = 0, *ext_state = 0;
 int mix_32_to_16l_level;
 
 /* gtk */
@@ -211,7 +210,7 @@ static void realloc_screen(void)
        scr_changed = 0;
 }
 
-void gp2x_init(void)
+void plat_init(void)
 {
        printf("entering init()\n"); fflush(stdout);
 
@@ -226,7 +225,7 @@ void gp2x_init(void)
        printf("exitting init()\n"); fflush(stdout);
 }
 
-void gp2x_deinit(void)
+void plat_finish(void)
 {
        free(g_screen_ptr);
        sndout_oss_exit();
@@ -309,36 +308,15 @@ void gp2x_video_setpalette(int *pal, int len)
        memcpy(current_pal, pal, len*4);
 }
 
-void gp2x_video_flush_cache(void)
-{
-}
-
 void gp2x_video_RGB_setscaling(int v_offs, int W, int H)
 {
 }
 
-void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
-{
-       if ((char *)g_screen_ptr + offset != data)
-               memcpy((char *)g_screen_ptr + offset, data, len);
-}
-
-void gp2x_memcpy_all_buffers(void *data, int offset, int len)
-{
-       memcpy((char *)g_screen_ptr + offset, data, len);
-}
-
-
 void gp2x_memset_all_buffers(int offset, int byte, int len)
 {
        memset((char *)g_screen_ptr + offset, byte, len);
 }
 
-void gp2x_pd_clone_buffer2(void)
-{
-       memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);
-}
-
 /* joy */
 int gp2x_touchpad_read(int *x, int *y)
 {
@@ -347,11 +325,11 @@ int gp2x_touchpad_read(int *x, int *y)
 
 /* 940 */
 int crashed_940 = 0;
-void Pause940(int yes)
+void pause940(int yes)
 {
 }
 
-void Reset940(int yes, int bank)
+void reset940(int yes, int bank)
 {
 }
 
index 16fc7cd..a6f990a 100644 (file)
@@ -39,8 +39,6 @@
 #endif\r
 \r
 \r
-int select_exits = 0;\r
-\r
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];\r
 static struct timeval noticeMsgTime = { 0, 0 };        // when started showing\r
 static int osd_fps_x;\r