diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 8825218..a25c458 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -30,6 +30,14 @@ #include "libretro-common/include/streams/memory_stream.h" #include "libretro_dipswitch.h" + +#ifdef HAVE_NTSC_FILTER +#define NTSC_SCANLINES /* enables scanline effect and doubles height(required) */ +#if defined(VITA) /* do no disable double-height for these devices */ +#undef NTSC_SCANLINES +#endif +#endif + #include "libretro_core_options.h" #define MAX_PLAYERS 4 /* max supported players */ @@ -279,299 +287,299 @@ extern int ipalette; static uint8_t base_palette[192]; struct st_palettes { - char name[32]; - char desc[32]; - unsigned int data[64]; + char name[32]; + char desc[32]; + unsigned int data[64]; }; struct st_palettes palettes[] = { { "asqrealc", "AspiringSquire's Real palette", { 0x6c6c6c, 0x00268e, 0x0000a8, 0x400094, - 0x700070, 0x780040, 0x700000, 0x621600, - 0x442400, 0x343400, 0x005000, 0x004444, - 0x004060, 0x000000, 0x101010, 0x101010, - 0xbababa, 0x205cdc, 0x3838ff, 0x8020f0, - 0xc000c0, 0xd01474, 0xd02020, 0xac4014, - 0x7c5400, 0x586400, 0x008800, 0x007468, - 0x00749c, 0x202020, 0x101010, 0x101010, - 0xffffff, 0x4ca0ff, 0x8888ff, 0xc06cff, - 0xff50ff, 0xff64b8, 0xff7878, 0xff9638, - 0xdbab00, 0xa2ca20, 0x4adc4a, 0x2ccca4, - 0x1cc2ea, 0x585858, 0x101010, 0x101010, - 0xffffff, 0xb0d4ff, 0xc4c4ff, 0xe8b8ff, - 0xffb0ff, 0xffb8e8, 0xffc4c4, 0xffd4a8, - 0xffe890, 0xf0f4a4, 0xc0ffc0, 0xacf4f0, - 0xa0e8ff, 0xc2c2c2, 0x202020, 0x101010 } - }, + 0x700070, 0x780040, 0x700000, 0x621600, + 0x442400, 0x343400, 0x005000, 0x004444, + 0x004060, 0x000000, 0x101010, 0x101010, + 0xbababa, 0x205cdc, 0x3838ff, 0x8020f0, + 0xc000c0, 0xd01474, 0xd02020, 0xac4014, + 0x7c5400, 0x586400, 0x008800, 0x007468, + 0x00749c, 0x202020, 0x101010, 0x101010, + 0xffffff, 0x4ca0ff, 0x8888ff, 0xc06cff, + 0xff50ff, 0xff64b8, 0xff7878, 0xff9638, + 0xdbab00, 0xa2ca20, 0x4adc4a, 0x2ccca4, + 0x1cc2ea, 0x585858, 0x101010, 0x101010, + 0xffffff, 0xb0d4ff, 0xc4c4ff, 0xe8b8ff, + 0xffb0ff, 0xffb8e8, 0xffc4c4, 0xffd4a8, + 0xffe890, 0xf0f4a4, 0xc0ffc0, 0xacf4f0, + 0xa0e8ff, 0xc2c2c2, 0x202020, 0x101010 } + }, { "nintendo-vc", "Virtual Console palette", - { 0x494949, 0x00006a, 0x090063, 0x290059, - 0x42004a, 0x490000, 0x420000, 0x291100, - 0x182700, 0x003010, 0x003000, 0x002910, - 0x012043, 0x000000, 0x000000, 0x000000, - 0x747174, 0x003084, 0x3101ac, 0x4b0194, - 0x64007b, 0x6b0039, 0x6b2101, 0x5a2f00, - 0x424900, 0x185901, 0x105901, 0x015932, - 0x01495a, 0x101010, 0x000000, 0x000000, - 0xadadad, 0x4a71b6, 0x6458d5, 0x8450e6, - 0xa451ad, 0xad4984, 0xb5624a, 0x947132, - 0x7b722a, 0x5a8601, 0x388e31, 0x318e5a, - 0x398e8d, 0x383838, 0x000000, 0x000000, - 0xb6b6b6, 0x8c9db5, 0x8d8eae, 0x9c8ebc, - 0xa687bc, 0xad8d9d, 0xae968c, 0x9c8f7c, - 0x9c9e72, 0x94a67c, 0x84a77b, 0x7c9d84, - 0x73968d, 0xdedede, 0x000000, 0x000000 } + { 0x494949, 0x00006a, 0x090063, 0x290059, + 0x42004a, 0x490000, 0x420000, 0x291100, + 0x182700, 0x003010, 0x003000, 0x002910, + 0x012043, 0x000000, 0x000000, 0x000000, + 0x747174, 0x003084, 0x3101ac, 0x4b0194, + 0x64007b, 0x6b0039, 0x6b2101, 0x5a2f00, + 0x424900, 0x185901, 0x105901, 0x015932, + 0x01495a, 0x101010, 0x000000, 0x000000, + 0xadadad, 0x4a71b6, 0x6458d5, 0x8450e6, + 0xa451ad, 0xad4984, 0xb5624a, 0x947132, + 0x7b722a, 0x5a8601, 0x388e31, 0x318e5a, + 0x398e8d, 0x383838, 0x000000, 0x000000, + 0xb6b6b6, 0x8c9db5, 0x8d8eae, 0x9c8ebc, + 0xa687bc, 0xad8d9d, 0xae968c, 0x9c8f7c, + 0x9c9e72, 0x94a67c, 0x84a77b, 0x7c9d84, + 0x73968d, 0xdedede, 0x000000, 0x000000 } }, { "rgb", "Nintendo RGB PPU palette", - { 0x6D6D6D, 0x002492, 0x0000DB, 0x6D49DB, - 0x92006D, 0xB6006D, 0xB62400, 0x924900, - 0x6D4900, 0x244900, 0x006D24, 0x009200, - 0x004949, 0x000000, 0x000000, 0x000000, - 0xB6B6B6, 0x006DDB, 0x0049FF, 0x9200FF, - 0xB600FF, 0xFF0092, 0xFF0000, 0xDB6D00, - 0x926D00, 0x249200, 0x009200, 0x00B66D, - 0x009292, 0x242424, 0x000000, 0x000000, - 0xFFFFFF, 0x6DB6FF, 0x9292FF, 0xDB6DFF, - 0xFF00FF, 0xFF6DFF, 0xFF9200, 0xFFB600, - 0xDBDB00, 0x6DDB00, 0x00FF00, 0x49FFDB, - 0x00FFFF, 0x494949, 0x000000, 0x000000, - 0xFFFFFF, 0xB6DBFF, 0xDBB6FF, 0xFFB6FF, - 0xFF92FF, 0xFFB6B6, 0xFFDB92, 0xFFFF49, - 0xFFFF6D, 0xB6FF49, 0x92FF6D, 0x49FFDB, - 0x92DBFF, 0x929292, 0x000000, 0x000000 } + { 0x6D6D6D, 0x002492, 0x0000DB, 0x6D49DB, + 0x92006D, 0xB6006D, 0xB62400, 0x924900, + 0x6D4900, 0x244900, 0x006D24, 0x009200, + 0x004949, 0x000000, 0x000000, 0x000000, + 0xB6B6B6, 0x006DDB, 0x0049FF, 0x9200FF, + 0xB600FF, 0xFF0092, 0xFF0000, 0xDB6D00, + 0x926D00, 0x249200, 0x009200, 0x00B66D, + 0x009292, 0x242424, 0x000000, 0x000000, + 0xFFFFFF, 0x6DB6FF, 0x9292FF, 0xDB6DFF, + 0xFF00FF, 0xFF6DFF, 0xFF9200, 0xFFB600, + 0xDBDB00, 0x6DDB00, 0x00FF00, 0x49FFDB, + 0x00FFFF, 0x494949, 0x000000, 0x000000, + 0xFFFFFF, 0xB6DBFF, 0xDBB6FF, 0xFFB6FF, + 0xFF92FF, 0xFFB6B6, 0xFFDB92, 0xFFFF49, + 0xFFFF6D, 0xB6FF49, 0x92FF6D, 0x49FFDB, + 0x92DBFF, 0x929292, 0x000000, 0x000000 } }, { "yuv-v3", "FBX's YUV-V3 palette", - { 0x666666, 0x002A88, 0x1412A7, 0x3B00A4, - 0x5C007E, 0x6E0040, 0x6C0700, 0x561D00, - 0x333500, 0x0C4800, 0x005200, 0x004C18, - 0x003E5B, 0x000000, 0x000000, 0x000000, - 0xADADAD, 0x155FD9, 0x4240FF, 0x7527FE, - 0xA01ACC, 0xB71E7B, 0xB53120, 0x994E00, - 0x6B6D00, 0x388700, 0x0D9300, 0x008C47, - 0x007AA0, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x64B0FF, 0x9290FF, 0xC676FF, - 0xF26AFF, 0xFF6ECC, 0xFF8170, 0xEA9E22, - 0xBCBE00, 0x88D800, 0x5CE430, 0x45E082, - 0x48CDDE, 0x4F4F4F, 0x000000, 0x000000, - 0xFFFFFF, 0xC0DFFF, 0xD3D2FF, 0xE8C8FF, - 0xFAC2FF, 0xFFC4EA, 0xFFCCC5, 0xF7D8A5, - 0xE4E594, 0xCFEF96, 0xBDF4AB, 0xB3F3CC, - 0xB5EBF2, 0xB8B8B8, 0x000000, 0x000000 } + { 0x666666, 0x002A88, 0x1412A7, 0x3B00A4, + 0x5C007E, 0x6E0040, 0x6C0700, 0x561D00, + 0x333500, 0x0C4800, 0x005200, 0x004C18, + 0x003E5B, 0x000000, 0x000000, 0x000000, + 0xADADAD, 0x155FD9, 0x4240FF, 0x7527FE, + 0xA01ACC, 0xB71E7B, 0xB53120, 0x994E00, + 0x6B6D00, 0x388700, 0x0D9300, 0x008C47, + 0x007AA0, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x64B0FF, 0x9290FF, 0xC676FF, + 0xF26AFF, 0xFF6ECC, 0xFF8170, 0xEA9E22, + 0xBCBE00, 0x88D800, 0x5CE430, 0x45E082, + 0x48CDDE, 0x4F4F4F, 0x000000, 0x000000, + 0xFFFFFF, 0xC0DFFF, 0xD3D2FF, 0xE8C8FF, + 0xFAC2FF, 0xFFC4EA, 0xFFCCC5, 0xF7D8A5, + 0xE4E594, 0xCFEF96, 0xBDF4AB, 0xB3F3CC, + 0xB5EBF2, 0xB8B8B8, 0x000000, 0x000000 } }, { "unsaturated-final", "FBX's Unsaturated-Final palette", - { 0x676767, 0x001F8E, 0x23069E, 0x40008E, - 0x600067, 0x67001C, 0x5B1000, 0x432500, - 0x313400, 0x074800, 0x004F00, 0x004622, - 0x003A61, 0x000000, 0x000000, 0x000000, - 0xB3B3B3, 0x205ADF, 0x5138FB, 0x7A27EE, - 0xA520C2, 0xB0226B, 0xAD3702, 0x8D5600, - 0x6E7000, 0x2E8A00, 0x069200, 0x008A47, - 0x037B9B, 0x101010, 0x000000, 0x000000, - 0xFFFFFF, 0x62AEFF, 0x918BFF, 0xBC78FF, - 0xE96EFF, 0xFC6CCD, 0xFA8267, 0xE29B26, - 0xC0B901, 0x84D200, 0x58DE38, 0x46D97D, - 0x49CED2, 0x494949, 0x000000, 0x000000, - 0xFFFFFF, 0xC1E3FF, 0xD5D4FF, 0xE7CCFF, - 0xFBC9FF, 0xFFC7F0, 0xFFD0C5, 0xF8DAAA, - 0xEBE69A, 0xD1F19A, 0xBEF7AF, 0xB6F4CD, - 0xB7F0EF, 0xB2B2B2, 0x000000, 0x000000 } + { 0x676767, 0x001F8E, 0x23069E, 0x40008E, + 0x600067, 0x67001C, 0x5B1000, 0x432500, + 0x313400, 0x074800, 0x004F00, 0x004622, + 0x003A61, 0x000000, 0x000000, 0x000000, + 0xB3B3B3, 0x205ADF, 0x5138FB, 0x7A27EE, + 0xA520C2, 0xB0226B, 0xAD3702, 0x8D5600, + 0x6E7000, 0x2E8A00, 0x069200, 0x008A47, + 0x037B9B, 0x101010, 0x000000, 0x000000, + 0xFFFFFF, 0x62AEFF, 0x918BFF, 0xBC78FF, + 0xE96EFF, 0xFC6CCD, 0xFA8267, 0xE29B26, + 0xC0B901, 0x84D200, 0x58DE38, 0x46D97D, + 0x49CED2, 0x494949, 0x000000, 0x000000, + 0xFFFFFF, 0xC1E3FF, 0xD5D4FF, 0xE7CCFF, + 0xFBC9FF, 0xFFC7F0, 0xFFD0C5, 0xF8DAAA, + 0xEBE69A, 0xD1F19A, 0xBEF7AF, 0xB6F4CD, + 0xB7F0EF, 0xB2B2B2, 0x000000, 0x000000 } }, { "sony-cxa2025as-us", "Sony CXA2025AS US palette", - { 0x585858, 0x00238C, 0x00139B, 0x2D0585, - 0x5D0052, 0x7A0017, 0x7A0800, 0x5F1800, - 0x352A00, 0x093900, 0x003F00, 0x003C22, - 0x00325D, 0x000000, 0x000000, 0x000000, - 0xA1A1A1, 0x0053EE, 0x153CFE, 0x6028E4, - 0xA91D98, 0xD41E41, 0xD22C00, 0xAA4400, - 0x6C5E00, 0x2D7300, 0x007D06, 0x007852, - 0x0069A9, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x1FA5FE, 0x5E89FE, 0xB572FE, - 0xFE65F6, 0xFE6790, 0xFE773C, 0xFE9308, - 0xC4B200, 0x79CA10, 0x3AD54A, 0x11D1A4, - 0x06BFFE, 0x424242, 0x000000, 0x000000, - 0xFFFFFF, 0xA0D9FE, 0xBDCCFE, 0xE1C2FE, - 0xFEBCFB, 0xFEBDD0, 0xFEC5A9, 0xFED18E, - 0xE9DE86, 0xC7E992, 0xA8EEB0, 0x95ECD9, - 0x91E4FE, 0xACACAC, 0x000000, 0x000000 } + { 0x585858, 0x00238C, 0x00139B, 0x2D0585, + 0x5D0052, 0x7A0017, 0x7A0800, 0x5F1800, + 0x352A00, 0x093900, 0x003F00, 0x003C22, + 0x00325D, 0x000000, 0x000000, 0x000000, + 0xA1A1A1, 0x0053EE, 0x153CFE, 0x6028E4, + 0xA91D98, 0xD41E41, 0xD22C00, 0xAA4400, + 0x6C5E00, 0x2D7300, 0x007D06, 0x007852, + 0x0069A9, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x1FA5FE, 0x5E89FE, 0xB572FE, + 0xFE65F6, 0xFE6790, 0xFE773C, 0xFE9308, + 0xC4B200, 0x79CA10, 0x3AD54A, 0x11D1A4, + 0x06BFFE, 0x424242, 0x000000, 0x000000, + 0xFFFFFF, 0xA0D9FE, 0xBDCCFE, 0xE1C2FE, + 0xFEBCFB, 0xFEBDD0, 0xFEC5A9, 0xFED18E, + 0xE9DE86, 0xC7E992, 0xA8EEB0, 0x95ECD9, + 0x91E4FE, 0xACACAC, 0x000000, 0x000000 } }, { "pal", "PAL palette", - { 0x808080, 0x0000BA, 0x3700BF, 0x8400A6, - 0xBB006A, 0xB7001E, 0xB30000, 0x912600, - 0x7B2B00, 0x003E00, 0x00480D, 0x003C22, - 0x002F66, 0x000000, 0x050505, 0x050505, - 0xC8C8C8, 0x0059FF, 0x443CFF, 0xB733CC, - 0xFE33AA, 0xFE375E, 0xFE371A, 0xD54B00, - 0xC46200, 0x3C7B00, 0x1D8415, 0x009566, - 0x0084C4, 0x111111, 0x090909, 0x090909, - 0xFEFEFE, 0x0095FF, 0x6F84FF, 0xD56FFF, - 0xFE77CC, 0xFE6F99, 0xFE7B59, 0xFE915F, - 0xFEA233, 0xA6BF00, 0x51D96A, 0x4DD5AE, - 0x00D9FF, 0x666666, 0x0D0D0D, 0x0D0D0D, - 0xFEFEFE, 0x84BFFF, 0xBBBBFF, 0xD0BBFF, - 0xFEBFEA, 0xFEBFCC, 0xFEC4B7, 0xFECCAE, - 0xFED9A2, 0xCCE199, 0xAEEEB7, 0xAAF8EE, - 0xB3EEFF, 0xDDDDDD, 0x111111, 0x111111 } + { 0x808080, 0x0000BA, 0x3700BF, 0x8400A6, + 0xBB006A, 0xB7001E, 0xB30000, 0x912600, + 0x7B2B00, 0x003E00, 0x00480D, 0x003C22, + 0x002F66, 0x000000, 0x050505, 0x050505, + 0xC8C8C8, 0x0059FF, 0x443CFF, 0xB733CC, + 0xFE33AA, 0xFE375E, 0xFE371A, 0xD54B00, + 0xC46200, 0x3C7B00, 0x1D8415, 0x009566, + 0x0084C4, 0x111111, 0x090909, 0x090909, + 0xFEFEFE, 0x0095FF, 0x6F84FF, 0xD56FFF, + 0xFE77CC, 0xFE6F99, 0xFE7B59, 0xFE915F, + 0xFEA233, 0xA6BF00, 0x51D96A, 0x4DD5AE, + 0x00D9FF, 0x666666, 0x0D0D0D, 0x0D0D0D, + 0xFEFEFE, 0x84BFFF, 0xBBBBFF, 0xD0BBFF, + 0xFEBFEA, 0xFEBFCC, 0xFEC4B7, 0xFECCAE, + 0xFED9A2, 0xCCE199, 0xAEEEB7, 0xAAF8EE, + 0xB3EEFF, 0xDDDDDD, 0x111111, 0x111111 } }, { "bmf-final2", "BMF's Final 2 palette", - { 0x525252, 0x000080, 0x08008A, 0x2C007E, - 0x4A004E, 0x500006, 0x440000, 0x260800, - 0x0A2000, 0x002E00, 0x003200, 0x00260A, - 0x001C48, 0x000000, 0x000000, 0x000000, - 0xA4A4A4, 0x0038CE, 0x3416EC, 0x5E04DC, - 0x8C00B0, 0x9A004C, 0x901800, 0x703600, - 0x4C5400, 0x0E6C00, 0x007400, 0x006C2C, - 0x005E84, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x4C9CFF, 0x7C78FF, 0xA664FF, - 0xDA5AFF, 0xF054C0, 0xF06A56, 0xD68610, - 0xBAA400, 0x76C000, 0x46CC1A, 0x2EC866, - 0x34C2BE, 0x3A3A3A, 0x000000, 0x000000, - 0xFFFFFF, 0xB6DAFF, 0xC8CAFF, 0xDAC2FF, - 0xF0BEFF, 0xFCBCEE, 0xFAC2C0, 0xF2CCA2, - 0xE6DA92, 0xCCE68E, 0xB8EEA2, 0xAEEABE, - 0xAEE8E2, 0xB0B0B0, 0x000000, 0x000000 } + { 0x525252, 0x000080, 0x08008A, 0x2C007E, + 0x4A004E, 0x500006, 0x440000, 0x260800, + 0x0A2000, 0x002E00, 0x003200, 0x00260A, + 0x001C48, 0x000000, 0x000000, 0x000000, + 0xA4A4A4, 0x0038CE, 0x3416EC, 0x5E04DC, + 0x8C00B0, 0x9A004C, 0x901800, 0x703600, + 0x4C5400, 0x0E6C00, 0x007400, 0x006C2C, + 0x005E84, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x4C9CFF, 0x7C78FF, 0xA664FF, + 0xDA5AFF, 0xF054C0, 0xF06A56, 0xD68610, + 0xBAA400, 0x76C000, 0x46CC1A, 0x2EC866, + 0x34C2BE, 0x3A3A3A, 0x000000, 0x000000, + 0xFFFFFF, 0xB6DAFF, 0xC8CAFF, 0xDAC2FF, + 0xF0BEFF, 0xFCBCEE, 0xFAC2C0, 0xF2CCA2, + 0xE6DA92, 0xCCE68E, 0xB8EEA2, 0xAEEABE, + 0xAEE8E2, 0xB0B0B0, 0x000000, 0x000000 } }, { "bmf-final3", "BMF's Final 3 palette", - { 0x686868, 0x001299, 0x1A08AA, 0x51029A, - 0x7E0069, 0x8E001C, 0x7E0301, 0x511800, - 0x1F3700, 0x014E00, 0x005A00, 0x00501C, - 0x004061, 0x000000, 0x000000, 0x000000, - 0xB9B9B9, 0x0C5CD7, 0x5035F0, 0x8919E0, - 0xBB0CB3, 0xCE0C61, 0xC02B0E, 0x954D01, - 0x616F00, 0x1F8B00, 0x01980C, 0x00934B, - 0x00819B, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x63B4FF, 0x9B91FF, 0xD377FF, - 0xEF6AFF, 0xF968C0, 0xF97D6C, 0xED9B2D, - 0xBDBD16, 0x7CDA1C, 0x4BE847, 0x35E591, - 0x3FD9DD, 0x606060, 0x000000, 0x000000, - 0xFFFFFF, 0xACE7FF, 0xD5CDFF, 0xEDBAFF, - 0xF8B0FF, 0xFEB0EC, 0xFDBDB5, 0xF9D28E, - 0xE8EB7C, 0xBBF382, 0x99F7A2, 0x8AF5D0, - 0x92F4F1, 0xBEBEBE, 0x000000, 0x000000 } + { 0x686868, 0x001299, 0x1A08AA, 0x51029A, + 0x7E0069, 0x8E001C, 0x7E0301, 0x511800, + 0x1F3700, 0x014E00, 0x005A00, 0x00501C, + 0x004061, 0x000000, 0x000000, 0x000000, + 0xB9B9B9, 0x0C5CD7, 0x5035F0, 0x8919E0, + 0xBB0CB3, 0xCE0C61, 0xC02B0E, 0x954D01, + 0x616F00, 0x1F8B00, 0x01980C, 0x00934B, + 0x00819B, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x63B4FF, 0x9B91FF, 0xD377FF, + 0xEF6AFF, 0xF968C0, 0xF97D6C, 0xED9B2D, + 0xBDBD16, 0x7CDA1C, 0x4BE847, 0x35E591, + 0x3FD9DD, 0x606060, 0x000000, 0x000000, + 0xFFFFFF, 0xACE7FF, 0xD5CDFF, 0xEDBAFF, + 0xF8B0FF, 0xFEB0EC, 0xFDBDB5, 0xF9D28E, + 0xE8EB7C, 0xBBF382, 0x99F7A2, 0x8AF5D0, + 0x92F4F1, 0xBEBEBE, 0x000000, 0x000000 } }, { "smooth-fbx", "FBX's Smooth palette", - { 0x6A6D6A, 0x001380, 0x1E008A, 0x39007A, - 0x550056, 0x5A0018, 0x4F1000, 0x3D1C00, - 0x253200, 0x003D00, 0x004000, 0x003924, - 0x002E55, 0x000000, 0x000000, 0x000000, - 0xB9BCB9, 0x1850C7, 0x4B30E3, 0x7322D6, - 0x951FA9, 0x9D285C, 0x983700, 0x7F4C00, - 0x5E6400, 0x227700, 0x027E02, 0x007645, - 0x006E8A, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x68A6FF, 0x8C9CFF, 0xB586FF, - 0xD975FD, 0xE377B9, 0xE58D68, 0xD49D29, - 0xB3AF0C, 0x7BC211, 0x55CA47, 0x46CB81, - 0x47C1C5, 0x4A4D4A, 0x000000, 0x000000, - 0xFFFFFF, 0xCCEAFF, 0xDDDEFF, 0xECDAFF, - 0xF8D7FE, 0xFCD6F5, 0xFDDBCF, 0xF9E7B5, - 0xF1F0AA, 0xDAFAA9, 0xC9FFBC, 0xC3FBD7, - 0xC4F6F6, 0xBEC1BE, 0x000000, 0x000000 } + { 0x6A6D6A, 0x001380, 0x1E008A, 0x39007A, + 0x550056, 0x5A0018, 0x4F1000, 0x3D1C00, + 0x253200, 0x003D00, 0x004000, 0x003924, + 0x002E55, 0x000000, 0x000000, 0x000000, + 0xB9BCB9, 0x1850C7, 0x4B30E3, 0x7322D6, + 0x951FA9, 0x9D285C, 0x983700, 0x7F4C00, + 0x5E6400, 0x227700, 0x027E02, 0x007645, + 0x006E8A, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x68A6FF, 0x8C9CFF, 0xB586FF, + 0xD975FD, 0xE377B9, 0xE58D68, 0xD49D29, + 0xB3AF0C, 0x7BC211, 0x55CA47, 0x46CB81, + 0x47C1C5, 0x4A4D4A, 0x000000, 0x000000, + 0xFFFFFF, 0xCCEAFF, 0xDDDEFF, 0xECDAFF, + 0xF8D7FE, 0xFCD6F5, 0xFDDBCF, 0xF9E7B5, + 0xF1F0AA, 0xDAFAA9, 0xC9FFBC, 0xC3FBD7, + 0xC4F6F6, 0xBEC1BE, 0x000000, 0x000000 } }, { "composite-direct-fbx", "FBX's Composite Direct palette", - { 0x656565, 0x00127D, 0x18008E, 0x360082, - 0x56005D, 0x5A0018, 0x4F0500, 0x381900, - 0x1D3100, 0x003D00, 0x004100, 0x003B17, - 0x002E55, 0x000000, 0x000000, 0x000000, - 0xAFAFAF, 0x194EC8, 0x472FE3, 0x6B1FD7, - 0x931BAE, 0x9E1A5E, 0x993200, 0x7B4B00, - 0x5B6700, 0x267A00, 0x008200, 0x007A3E, - 0x006E8A, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x64A9FF, 0x8E89FF, 0xB676FF, - 0xE06FFF, 0xEF6CC4, 0xF0806A, 0xD8982C, - 0xB9B40A, 0x83CB0C, 0x5BD63F, 0x4AD17E, - 0x4DC7CB, 0x4C4C4C, 0x000000, 0x000000, - 0xFFFFFF, 0xC7E5FF, 0xD9D9FF, 0xE9D1FF, - 0xF9CEFF, 0xFFCCF1, 0xFFD4CB, 0xF8DFB1, - 0xEDEAA4, 0xD6F4A4, 0xC5F8B8, 0xBEF6D3, - 0xBFF1F1, 0xB9B9B9, 0x000000, 0x000000 } + { 0x656565, 0x00127D, 0x18008E, 0x360082, + 0x56005D, 0x5A0018, 0x4F0500, 0x381900, + 0x1D3100, 0x003D00, 0x004100, 0x003B17, + 0x002E55, 0x000000, 0x000000, 0x000000, + 0xAFAFAF, 0x194EC8, 0x472FE3, 0x6B1FD7, + 0x931BAE, 0x9E1A5E, 0x993200, 0x7B4B00, + 0x5B6700, 0x267A00, 0x008200, 0x007A3E, + 0x006E8A, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x64A9FF, 0x8E89FF, 0xB676FF, + 0xE06FFF, 0xEF6CC4, 0xF0806A, 0xD8982C, + 0xB9B40A, 0x83CB0C, 0x5BD63F, 0x4AD17E, + 0x4DC7CB, 0x4C4C4C, 0x000000, 0x000000, + 0xFFFFFF, 0xC7E5FF, 0xD9D9FF, 0xE9D1FF, + 0xF9CEFF, 0xFFCCF1, 0xFFD4CB, 0xF8DFB1, + 0xEDEAA4, 0xD6F4A4, 0xC5F8B8, 0xBEF6D3, + 0xBFF1F1, 0xB9B9B9, 0x000000, 0x000000 } }, { "pvm-style-d93-fbx", "FBX's PVM Style D93 palette", - { 0x696B63, 0x001774, 0x1E0087, 0x340073, - 0x560057, 0x5E0013, 0x531A00, 0x3B2400, - 0x243000, 0x063A00, 0x003F00, 0x003B1E, - 0x00334E, 0x000000, 0x000000, 0x000000, - 0xB9BBB3, 0x1453B9, 0x4D2CDA, 0x671EDE, - 0x98189C, 0x9D2344, 0xA03E00, 0x8D5500, - 0x656D00, 0x2C7900, 0x008100, 0x007D42, - 0x00788A, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x69A8FF, 0x9691FF, 0xB28AFA, - 0xEA7DFA, 0xF37BC7, 0xF28E59, 0xE6AD27, - 0xD7C805, 0x90DF07, 0x64E53C, 0x45E27D, - 0x48D5D9, 0x4E5048, 0x000000, 0x000000, - 0xFFFFFF, 0xD2EAFF, 0xE2E2FF, 0xE9D8FF, - 0xF5D2FF, 0xF8D9EA, 0xFADEB9, 0xF9E89B, - 0xF3F28C, 0xD3FA91, 0xB8FCA8, 0xAEFACA, - 0xCAF3F3, 0xBEC0B8, 0x000000, 0x000000 } + { 0x696B63, 0x001774, 0x1E0087, 0x340073, + 0x560057, 0x5E0013, 0x531A00, 0x3B2400, + 0x243000, 0x063A00, 0x003F00, 0x003B1E, + 0x00334E, 0x000000, 0x000000, 0x000000, + 0xB9BBB3, 0x1453B9, 0x4D2CDA, 0x671EDE, + 0x98189C, 0x9D2344, 0xA03E00, 0x8D5500, + 0x656D00, 0x2C7900, 0x008100, 0x007D42, + 0x00788A, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x69A8FF, 0x9691FF, 0xB28AFA, + 0xEA7DFA, 0xF37BC7, 0xF28E59, 0xE6AD27, + 0xD7C805, 0x90DF07, 0x64E53C, 0x45E27D, + 0x48D5D9, 0x4E5048, 0x000000, 0x000000, + 0xFFFFFF, 0xD2EAFF, 0xE2E2FF, 0xE9D8FF, + 0xF5D2FF, 0xF8D9EA, 0xFADEB9, 0xF9E89B, + 0xF3F28C, 0xD3FA91, 0xB8FCA8, 0xAEFACA, + 0xCAF3F3, 0xBEC0B8, 0x000000, 0x000000 } }, { "ntsc-hardware-fbx", "FBX's NTSC Hardware palette", - { 0x6A6D6A, 0x001380, 0x1E008A, 0x39007A, - 0x550056, 0x5A0018, 0x4F1000, 0x382100, - 0x213300, 0x003D00, 0x004000, 0x003924, - 0x002E55, 0x000000, 0x000000, 0x000000, - 0xB9BCB9, 0x1850C7, 0x4B30E3, 0x7322D6, - 0x951FA9, 0x9D285C, 0x963C00, 0x7A5100, - 0x5B6700, 0x227700, 0x027E02, 0x007645, - 0x006E8A, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x68A6FF, 0x9299FF, 0xB085FF, - 0xD975FD, 0xE377B9, 0xE58D68, 0xCFA22C, - 0xB3AF0C, 0x7BC211, 0x55CA47, 0x46CB81, - 0x47C1C5, 0x4A4D4A, 0x000000, 0x000000, - 0xFFFFFF, 0xCCEAFF, 0xDDDEFF, 0xECDAFF, - 0xF8D7FE, 0xFCD6F5, 0xFDDBCF, 0xF9E7B5, - 0xF1F0AA, 0xDAFAA9, 0xC9FFBC, 0xC3FBD7, - 0xC4F6F6, 0xBEC1BE, 0x000000, 0x000000 } + { 0x6A6D6A, 0x001380, 0x1E008A, 0x39007A, + 0x550056, 0x5A0018, 0x4F1000, 0x382100, + 0x213300, 0x003D00, 0x004000, 0x003924, + 0x002E55, 0x000000, 0x000000, 0x000000, + 0xB9BCB9, 0x1850C7, 0x4B30E3, 0x7322D6, + 0x951FA9, 0x9D285C, 0x963C00, 0x7A5100, + 0x5B6700, 0x227700, 0x027E02, 0x007645, + 0x006E8A, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x68A6FF, 0x9299FF, 0xB085FF, + 0xD975FD, 0xE377B9, 0xE58D68, 0xCFA22C, + 0xB3AF0C, 0x7BC211, 0x55CA47, 0x46CB81, + 0x47C1C5, 0x4A4D4A, 0x000000, 0x000000, + 0xFFFFFF, 0xCCEAFF, 0xDDDEFF, 0xECDAFF, + 0xF8D7FE, 0xFCD6F5, 0xFDDBCF, 0xF9E7B5, + 0xF1F0AA, 0xDAFAA9, 0xC9FFBC, 0xC3FBD7, + 0xC4F6F6, 0xBEC1BE, 0x000000, 0x000000 } }, { "nes-classic-fbx-fs", "FBX's NES-Classic FS palette", - { 0x60615F, 0x000083, 0x1D0195, 0x340875, - 0x51055E, 0x56000F, 0x4C0700, 0x372308, - 0x203A0B, 0x0F4B0E, 0x194C16, 0x02421E, - 0x023154, 0x000000, 0x000000, 0x000000, - 0xA9AAA8, 0x104BBF, 0x4712D8, 0x6300CA, - 0x8800A9, 0x930B46, 0x8A2D04, 0x6F5206, - 0x5C7114, 0x1B8D12, 0x199509, 0x178448, - 0x206B8E, 0x000000, 0x000000, 0x000000, - 0xFBFBFB, 0x6699F8, 0x8974F9, 0xAB58F8, - 0xD557EF, 0xDE5FA9, 0xDC7F59, 0xC7A224, - 0xA7BE03, 0x75D703, 0x60E34F, 0x3CD68D, - 0x56C9CC, 0x414240, 0x000000, 0x000000, - 0xFBFBFB, 0xBED4FA, 0xC9C7F9, 0xD7BEFA, - 0xE8B8F9, 0xF5BAE5, 0xF3CAC2, 0xDFCDA7, - 0xD9E09C, 0xC9EB9E, 0xC0EDB8, 0xB5F4C7, - 0xB9EAE9, 0xABABAB, 0x000000, 0x000000 } + { 0x60615F, 0x000083, 0x1D0195, 0x340875, + 0x51055E, 0x56000F, 0x4C0700, 0x372308, + 0x203A0B, 0x0F4B0E, 0x194C16, 0x02421E, + 0x023154, 0x000000, 0x000000, 0x000000, + 0xA9AAA8, 0x104BBF, 0x4712D8, 0x6300CA, + 0x8800A9, 0x930B46, 0x8A2D04, 0x6F5206, + 0x5C7114, 0x1B8D12, 0x199509, 0x178448, + 0x206B8E, 0x000000, 0x000000, 0x000000, + 0xFBFBFB, 0x6699F8, 0x8974F9, 0xAB58F8, + 0xD557EF, 0xDE5FA9, 0xDC7F59, 0xC7A224, + 0xA7BE03, 0x75D703, 0x60E34F, 0x3CD68D, + 0x56C9CC, 0x414240, 0x000000, 0x000000, + 0xFBFBFB, 0xBED4FA, 0xC9C7F9, 0xD7BEFA, + 0xE8B8F9, 0xF5BAE5, 0xF3CAC2, 0xDFCDA7, + 0xD9E09C, 0xC9EB9E, 0xC0EDB8, 0xB5F4C7, + 0xB9EAE9, 0xABABAB, 0x000000, 0x000000 } }, { "nescap", "RGBSource's NESCAP palette", - { 0x646365, 0x001580, 0x1D0090, 0x380082, - 0x56005D, 0x5A001A, 0x4F0900, 0x381B00, - 0x1E3100, 0x003D00, 0x004100, 0x003A1B, - 0x002F55, 0x000000, 0x000000, 0x000000, - 0xAFADAF, 0x164BCA, 0x472AE7, 0x6B1BDB, - 0x9617B0, 0x9F185B, 0x963001, 0x7B4800, - 0x5A6600, 0x237800, 0x017F00, 0x00783D, - 0x006C8C, 0x000000, 0x000000, 0x000000, - 0xFFFFFF, 0x60A6FF, 0x8F84FF, 0xB473FF, - 0xE26CFF, 0xF268C3, 0xEF7E61, 0xD89527, - 0xBAB307, 0x81C807, 0x57D43D, 0x47CF7E, - 0x4BC5CD, 0x4C4B4D, 0x000000, 0x000000, - 0xFFFFFF, 0xC2E0FF, 0xD5D2FF, 0xE3CBFF, - 0xF7C8FF, 0xFEC6EE, 0xFECEC6, 0xF6D7AE, - 0xE9E49F, 0xD3ED9D, 0xC0F2B2, 0xB9F1CC, - 0xBAEDED, 0xBAB9BB, 0x000000, 0x000000 } + { 0x646365, 0x001580, 0x1D0090, 0x380082, + 0x56005D, 0x5A001A, 0x4F0900, 0x381B00, + 0x1E3100, 0x003D00, 0x004100, 0x003A1B, + 0x002F55, 0x000000, 0x000000, 0x000000, + 0xAFADAF, 0x164BCA, 0x472AE7, 0x6B1BDB, + 0x9617B0, 0x9F185B, 0x963001, 0x7B4800, + 0x5A6600, 0x237800, 0x017F00, 0x00783D, + 0x006C8C, 0x000000, 0x000000, 0x000000, + 0xFFFFFF, 0x60A6FF, 0x8F84FF, 0xB473FF, + 0xE26CFF, 0xF268C3, 0xEF7E61, 0xD89527, + 0xBAB307, 0x81C807, 0x57D43D, 0x47CF7E, + 0x4BC5CD, 0x4C4B4D, 0x000000, 0x000000, + 0xFFFFFF, 0xC2E0FF, 0xD5D2FF, 0xE3CBFF, + 0xF7C8FF, 0xFEC6EE, 0xFECEC6, 0xF6D7AE, + 0xE9E49F, 0xD3ED9D, 0xC0F2B2, 0xB9F1CC, + 0xBAEDED, 0xBAB9BB, 0x000000, 0x000000 } }, { "wavebeam", "nakedarthur's Wavebeam palette", - { 0X6B6B6B, 0X001B88, 0X21009A, 0X40008C, - 0X600067, 0X64001E, 0X590800, 0X481600, - 0X283600, 0X004500, 0X004908, 0X00421D, - 0X003659, 0X000000, 0X000000, 0X000000, - 0XB4B4B4, 0X1555D3, 0X4337EF, 0X7425DF, - 0X9C19B9, 0XAC0F64, 0XAA2C00, 0X8A4B00, - 0X666B00, 0X218300, 0X008A00, 0X008144, - 0X007691, 0X000000, 0X000000, 0X000000, - 0XFFFFFF, 0X63B2FF, 0X7C9CFF, 0XC07DFE, - 0XE977FF, 0XF572CD, 0XF4886B, 0XDDA029, - 0XBDBD0A, 0X89D20E, 0X5CDE3E, 0X4BD886, - 0X4DCFD2, 0X525252, 0X000000, 0X000000, - 0XFFFFFF, 0XBCDFFF, 0XD2D2FF, 0XE1C8FF, - 0XEFC7FF, 0XFFC3E1, 0XFFCAC6, 0XF2DAAD, - 0XEBE3A0, 0XD2EDA2, 0XBCF4B4, 0XB5F1CE, - 0XB6ECF1, 0XBFBFBF, 0X000000, 0X000000 } + { 0X6B6B6B, 0X001B88, 0X21009A, 0X40008C, + 0X600067, 0X64001E, 0X590800, 0X481600, + 0X283600, 0X004500, 0X004908, 0X00421D, + 0X003659, 0X000000, 0X000000, 0X000000, + 0XB4B4B4, 0X1555D3, 0X4337EF, 0X7425DF, + 0X9C19B9, 0XAC0F64, 0XAA2C00, 0X8A4B00, + 0X666B00, 0X218300, 0X008A00, 0X008144, + 0X007691, 0X000000, 0X000000, 0X000000, + 0XFFFFFF, 0X63B2FF, 0X7C9CFF, 0XC07DFE, + 0XE977FF, 0XF572CD, 0XF4886B, 0XDDA029, + 0XBDBD0A, 0X89D20E, 0X5CDE3E, 0X4BD886, + 0X4DCFD2, 0X525252, 0X000000, 0X000000, + 0XFFFFFF, 0XBCDFFF, 0XD2D2FF, 0XE1C8FF, + 0XEFC7FF, 0XFFC3E1, 0XFFCAC6, 0XF2DAAD, + 0XEBE3A0, 0XD2EDA2, 0XBCF4B4, 0XB5F1CE, + 0XB6ECF1, 0XBFBFBF, 0X000000, 0X000000 } } }; @@ -587,10 +595,11 @@ struct st_palettes palettes[] = { #define NTSC_WIDTH 602 static unsigned use_ntsc = 0; +static unsigned use_ntsc_scanlines = 0; static unsigned burst_phase; static nes_ntsc_t nes_ntsc; static nes_ntsc_setup_t ntsc_setup; -static uint8_t *ntsc_video_out = NULL; /* for ntsc blit buffer */ +static uint16_t *ntsc_video_out = NULL; /* for ntsc blit buffer */ static void NTSCFilter_Cleanup(void) { @@ -603,7 +612,7 @@ static void NTSCFilter_Init(void) { memset(&nes_ntsc, 0, sizeof(nes_ntsc)); memset(&ntsc_setup, 0, sizeof(ntsc_setup)); - ntsc_video_out = (uint8_t*)malloc(NTSC_WIDTH * NES_HEIGHT * sizeof(uint16_t)); + ntsc_video_out = (uint16_t *)malloc(NTSC_WIDTH * NES_HEIGHT * sizeof(uint16_t)); } static void NTSCFilter_Setup(void) @@ -917,7 +926,7 @@ void retro_get_system_info(struct retro_system_info *info) void retro_get_system_av_info(struct retro_system_av_info *info) { - unsigned width, height, maxwidth; + unsigned width, height, maxwidth, maxheight; #ifdef PSP width = NES_WIDTH - (use_overscan ? 16 : 0); height = NES_HEIGHT - (use_overscan ? 16 : 0); @@ -927,13 +936,18 @@ void retro_get_system_av_info(struct retro_system_av_info *info) #endif #ifdef HAVE_NTSC_FILTER maxwidth = NTSC_WIDTH; + maxheight = NES_HEIGHT; +#ifdef NTSC_SCANLINES + maxheight = NES_HEIGHT * 2; +#endif #else maxwidth = NES_WIDTH; + maxheight = NES_HEIGHT; #endif info->geometry.base_width = width; info->geometry.base_height = height; info->geometry.max_width = maxwidth; - info->geometry.max_height = NES_HEIGHT; + info->geometry.max_height = maxheight; info->geometry.aspect_ratio = (float)(use_par ? NES_8_7_PAR : NES_4_3); info->timing.sample_rate = (float)sndsamplerate; if (FSettings.PAL || dendy) @@ -1134,7 +1148,7 @@ static void check_variables(bool startup) #ifdef HAVE_NTSC_FILTER var.key = "fceumm_ntsc_filter"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { unsigned orig_value = use_ntsc; if (strcmp(var.value, "disabled") == 0) @@ -1150,7 +1164,20 @@ static void check_variables(bool startup) if (use_ntsc != orig_value) palette_updated = true; } -#endif + +#ifdef NTSC_SCANLINES + var.key = "fceumm_ntsc_scanlines"; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + unsigned orig_value = use_ntsc_scanlines; + if (strcmp(var.value, "enabled") == 0) + use_ntsc_scanlines = 1; + else + use_ntsc_scanlines = 0; + } +#endif /* NTSC_SCANLINES */ +#endif /* HAVE_NTSC_FILTER */ var.key = "fceumm_palette"; @@ -1807,7 +1834,7 @@ static void retro_run_blit(uint8_t *gfx) if (!environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&ps2) || !ps2) { printf("Failed to get HW rendering interface!\n"); return; - } + } if (ps2->interface_version != RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION) { printf("HW render interface mismatch, expected %u, got %u!\n", @@ -1835,49 +1862,62 @@ static void retro_run_blit(uint8_t *gfx) #ifdef HAVE_NTSC_FILTER if (use_ntsc) { - uint8_t *deemp; - unsigned out_width, out_height, out_pitch; - int y; + int h_offset, v_offset; burst_phase ^= 1; - if (ntsc_setup.merge_fields) burst_phase = 0; + if (ntsc_setup.merge_fields) + burst_phase = 0; - width = overscan_h ? 240 : 256; - height = overscan_v ? 224 : 240; - out_width = overscan_h ? 560 : 602; - out_height = height; - out_pitch = out_width * sizeof(uint16_t); - gfx += (overscan_v ? ((overscan_h ? 8 : 0) + 256 * 8) : (overscan_h ? 8 : 0)); - deemp = XDBuf + (gfx - XBuf); /* get colour emphasis */ + nes_ntsc_blit(&nes_ntsc, (NES_NTSC_IN_T *)gfx, (NES_NTSC_IN_T *)XDBuf, + NES_WIDTH, burst_phase, NES_WIDTH, NES_HEIGHT, + ntsc_video_out, NTSC_WIDTH * sizeof(uint16)); - nes_ntsc_blit(&nes_ntsc, (unsigned char const*)gfx, (unsigned char const*)deemp, NES_WIDTH, burst_phase, width, height, ntsc_video_out, out_pitch); -#if 0 - if (!retain_height) + h_offset = overscan_h ? NES_NTSC_OUT_WIDTH(8) : 0; + v_offset = overscan_v ? 8 : 0; + width = overscan_h ? 560 : 602; + height = overscan_v ? 224 : 240; + pitch = width * sizeof(uint16_t); + +#ifdef NTSC_SCANLINES + if (use_ntsc_scanlines == 0) +#endif { - /* this doubles the height for proper scaling, disabled for performance reasons. - * NOTE: buffer height needs to be doubled as well */ - out_height <<= 1; - for (y = out_height / 2; --y >= 0;) + const uint16_t *in = ntsc_video_out + h_offset + NTSC_WIDTH * v_offset; + uint16_t *out = fceu_video_out; + int y; + + for (y = 0; y < height; y++) { - uint8_t const *in = ntsc_video_out + y * out_pitch; - uint8_t *out = ntsc_video_out + y * 2 * out_pitch; + memcpy(out, in, width * sizeof(uint16_t)); + in += NTSC_WIDTH; + out += width; + } + } +#ifdef NTSC_SCANLINES + else + { + int y; + height <<= 1; + for (y = (NES_HEIGHT - v_offset); --y >= v_offset;) + { + uint16_t const *in = ntsc_video_out + y * NTSC_WIDTH; + uint16_t *out = fceu_video_out + (y - v_offset) * 2 * width; int n; - for (n = out_width; n; --n) + for (n = width; n; --n) { - unsigned prev = *(uint16_t *)in; - unsigned next = *(uint16_t *)(in + out_pitch); + unsigned prev = *(in + h_offset); + unsigned next = *(in + h_offset + NTSC_WIDTH); /* mix 16-bit rgb without losing low bits */ unsigned mixed = prev + next + ((prev ^ next) & 0x0821); /* darken by 12% */ - *(uint16_t *)out = prev; - *(uint16_t *)(out + out_pitch) = (mixed >> 1) - (mixed >> 4 & 0x18E3); - in += 2; - out += 2; + *out = prev; + *(out + width) = (mixed >> 1) - (mixed >> 4 & 0x18E3); + in++; + out++; } } } -#endif - video_cb(ntsc_video_out, out_width, out_height, out_pitch); +#endif /* NTSC_SCANLINES */ } else #endif /* HAVE_NTSC_FILTER */ @@ -1901,9 +1941,8 @@ static void retro_run_blit(uint8_t *gfx) for (x = 0; x < width; x++, gfx++) fceu_video_out[y * width + x] = retro_palette[*gfx]; } - video_cb(fceu_video_out, width, height, pitch); } - + video_cb(fceu_video_out, width, height, pitch); #endif } @@ -2342,7 +2381,18 @@ bool retro_load_game(const struct retro_game_info *game) #if defined(_3DS) fceu_video_out = (uint16_t*)linearMemAlign(256 * 240 * sizeof(uint16_t), 128); #elif !defined(PSP) - fceu_video_out = (uint16_t*)malloc(256 * 240 * sizeof(uint16_t)); +#ifdef HAVE_NTSC_FILTER +#define FB_WIDTH 602 +#ifdef NTSC_SCANLINES +#define FB_HEIGHT 480 +#else +#define FB_HEIGHT 240 +#endif +#else /* !HAVE_NTSC_FILTER */ +#define FB_WIDTH 256 +#define FB_HEIGHT 240 +#endif + fceu_video_out = (uint16_t*)malloc(FB_WIDTH * FB_HEIGHT * sizeof(uint16_t)); #endif environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); diff --git a/src/drivers/libretro/libretro_core_options.h b/src/drivers/libretro/libretro_core_options.h index 35ce4c9..3d37d07 100644 --- a/src/drivers/libretro/libretro_core_options.h +++ b/src/drivers/libretro/libretro_core_options.h @@ -92,6 +92,19 @@ struct retro_core_option_definition option_defs_common[] = { }, "disabled" }, +#ifdef NTSC_SCANLINES + { + "fceumm_ntsc_scanlines", + "NTSC Scanlines", + "Enable scanlines when using NTSC filters.", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, +#endif /* NTSC_SCANLINES */ #endif { "fceumm_palette", diff --git a/src/ppu.c b/src/ppu.c index 187a96c..cc44e7b 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -702,7 +702,7 @@ static void DoLine(void) for (x = 63; x >= 0; x--) *(uint32*)&target[x << 2] = ((*(uint32*)&target[x << 2]) & 0x3f3f3f3f) | 0x80808080; - //write the actual colour emphasis + /* write the actual colour emphasis */ colour_emphasis = ((PPU[1] >> 5) << 24) | ((PPU[1] >> 5) << 16) | ((PPU[1] >> 5) << 8) | ((PPU[1] >> 5) << 0); for (x = 63; x >= 0; x--) *(uint32*)&dtarget[x << 2] = colour_emphasis;