fonts, buffer aligment, save progress
[libpicofe.git] / gp2x / gp2x.c
index 0d0017b..552318c 100644 (file)
@@ -46,10 +46,11 @@ static int sounddev = 0, mixerdev = 0;
 \r
 void *gp2x_screen;\r
 \r
-#define FRAMEBUFF_ADDR0 0x4000000-640*480\r
-#define FRAMEBUFF_ADDR1 0x4000000-640*480*2\r
-#define FRAMEBUFF_ADDR2 0x4000000-640*480*3\r
-#define FRAMEBUFF_ADDR3 0x4000000-640*480*4\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[] = { FRAMEBUFF_ADDR0, FRAMEBUFF_ADDR1, FRAMEBUFF_ADDR2, FRAMEBUFF_ADDR3 };\r
 static unsigned short gp2x_screenaddr_old[4];\r
@@ -58,14 +59,12 @@ static unsigned short gp2x_screenaddr_old[4];
 /* video stuff */\r
 void gp2x_video_flip(void)\r
 {\r
-       unsigned int address = gp2x_screenaddrs[screensel&3];\r
-       unsigned short msb16 = (unsigned short)(address >> 16);\r
-       unsigned short lsb16 = (unsigned short)(address);\r
+       unsigned short msw = (unsigned short)(gp2x_screenaddrs[screensel&3] >> 16);\r
 \r
-       gp2x_memregs[0x290E>>1] = lsb16;\r
-       gp2x_memregs[0x2910>>1] = msb16;\r
-       gp2x_memregs[0x2912>>1] = lsb16;\r
-       gp2x_memregs[0x2914>>1] = msb16;\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
        gp2x_screen = gp2x_screens[++screensel&3];\r
@@ -74,14 +73,12 @@ void gp2x_video_flip(void)
 /* doulblebuffered flip */\r
 void gp2x_video_flip2(void)\r
 {\r
-       unsigned int address = gp2x_screenaddrs[screensel&1];\r
-       unsigned short msb16 = (unsigned short)(address >> 16);\r
-       unsigned short lsb16 = (unsigned short)(address);\r
+       unsigned short msw = (unsigned short)(gp2x_screenaddrs[screensel&1] >> 16);\r
 \r
-       gp2x_memregs[0x290E>>1] = lsb16;\r
-       gp2x_memregs[0x2910>>1] = msb16;\r
-       gp2x_memregs[0x2912>>1] = lsb16;\r
-       gp2x_memregs[0x2914>>1] = msb16;\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
        gp2x_screen = gp2x_screens[++screensel&1];\r
@@ -99,7 +96,7 @@ void gp2x_video_changemode(int bpp)
 {\r
        gp2x_video_changemode2(bpp);\r
 \r
-       gp2x_memset_all_buffers(0, 0, 640*480);\r
+       gp2x_memset_all_buffers(0, 0, 320*240*2);\r
        gp2x_video_flip();\r
 }\r
 \r
@@ -256,7 +253,7 @@ void Pause940(int yes)
 \r
 void Reset940(int yes, int bank)\r
 {\r
-       gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03); /* bank=3 */\r
+       gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03);\r
 }\r
 \r
 \r
@@ -282,16 +279,16 @@ void gp2x_init(void)
        }\r
        gp2x_memregl = (unsigned long *) gp2x_memregs;\r
 \r
-       gp2x_screens[3] = mmap(0, 640*480*4, PROT_WRITE, MAP_SHARED, memdev, FRAMEBUFF_ADDR3);\r
-       if(gp2x_screens[3] == MAP_FAILED)\r
+       gp2x_screens[0] = mmap(0, FRAMEBUFF_WHOLESIZE, PROT_WRITE, MAP_SHARED, memdev, FRAMEBUFF_ADDR0);\r
+       if(gp2x_screens[0] == MAP_FAILED)\r
        {\r
                printf("mmap(gp2x_screen) failed with %i\n", errno);\r
                exit(1);\r
        }\r
-       printf("framebuffers point to %p\n", gp2x_screens[3]);\r
-       gp2x_screens[2] = (char *) gp2x_screens[3]+640*480;\r
-       gp2x_screens[1] = (char *) gp2x_screens[2]+640*480;\r
-       gp2x_screens[0] = (char *) gp2x_screens[1]+640*480;\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
        gp2x_screen = gp2x_screens[0];\r
        screensel = 0;\r
@@ -301,6 +298,8 @@ void gp2x_init(void)
        gp2x_screenaddr_old[2] = gp2x_memregs[0x2912>>1];\r
        gp2x_screenaddr_old[3] = gp2x_memregs[0x2914>>1];\r
 \r
+       gp2x_memset_all_buffers(0, 0, 320*240*2);\r
+\r
        // snd\r
        mixerdev = open("/dev/mixer", O_RDWR);\r
        if (mixerdev == -1)\r
@@ -325,7 +324,7 @@ void gp2x_deinit(void)
        gp2x_memregs[0x2912>>1] = gp2x_screenaddr_old[2];\r
        gp2x_memregs[0x2914>>1] = gp2x_screenaddr_old[3];\r
 \r
-       munmap(gp2x_screens[0], 640*480*4);\r
+       munmap(gp2x_screens[0], FRAMEBUFF_WHOLESIZE);\r
        munmap((void *)gp2x_memregs, 0x10000);\r
        close(memdev);\r
        close(mixerdev);\r