+static int EmuScanBegin16_ld(unsigned int num)\r
+{\r
+ if ((signed int)(ld_counter - num) > 100)\r
+ ld_counter = 0;\r
+\r
+ if (emu_scan_begin)\r
+ return emu_scan_begin(ld_counter);\r
+ else\r
+ DrawLineDest = (char *)g_screen_ptr + 320 * ld_counter * gp2x_current_bpp / 8;\r
+\r
+ return 0;\r
+}\r
+\r
+static int EmuScanEnd16_ld(unsigned int num)\r
+{\r
+ void *oldline = DrawLineDest;\r
+\r
+ if (emu_scan_end)\r
+ emu_scan_end(ld_counter);\r
+\r
+ ld_counter++;\r
+ ld_left--;\r
+ if (ld_left <= 0) {\r
+ ld_left = ld_lines;\r
+\r
+ EmuScanBegin16_ld(num);\r
+ memcpy32(DrawLineDest, oldline, 320 * gp2x_current_bpp / 8 / 4);\r
+ if (emu_scan_end)\r
+ emu_scan_end(ld_counter);\r
+\r
+ ld_counter++;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int localPal[0x100];\r
+static void (*vidcpyM2)(void *dest, void *src, int m32col, int with_32c_border);\r
+static int (*make_local_pal)(int fast_mode);\r
+\r
+static int make_local_pal_md(int fast_mode)\r
+{\r
+ int pallen = 0xc0;\r
+\r
+ bgr444_to_rgb32(localPal, Pico.cram);\r
+ if (fast_mode)\r
+ return 0x40;\r
+\r
+ if (Pico.video.reg[0xC] & 8) { // shadow/hilight mode\r
+ bgr444_to_rgb32_sh(localPal, Pico.cram);\r
+ localPal[0xc0] = 0x0000c000;\r
+ localPal[0xd0] = 0x00c00000;\r
+ localPal[0xe0] = 0x00000000; // reserved pixels for OSD\r
+ localPal[0xf0] = 0x00ffffff;\r
+ pallen = 0x100;\r
+ }\r
+ else if (Pico.est.rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes\r
+ bgr444_to_rgb32(localPal+0x40, HighPal);\r
+ bgr444_to_rgb32(localPal+0x80, HighPal+0x40);\r
+ }\r
+ else\r
+ memcpy32(localPal+0x80, localPal, 0x40); // for spr prio mess\r
+\r
+ return pallen;\r
+}\r
+\r
+static int make_local_pal_sms(int fast_mode)\r
+{\r
+ unsigned short *spal = Pico.cram;\r
+ unsigned int *dpal = (void *)localPal;\r
+ unsigned int i, t;\r
+\r
+ for (i = 0x40; i > 0; i--) {\r
+ t = *spal++;\r
+ t = ((t & 0x0003) << 22) | ((t & 0x000c) << 12) | ((t & 0x0030) << 2);\r
+ t |= t >> 2;\r
+ t |= t >> 4;\r
+ *dpal++ = t;\r
+ }\r
+\r
+ return 0x40;\r
+}\r
+\r
+void pemu_finalize_frame(const char *fps, const char *notice)\r