diff options
Diffstat (limited to 'source/memmap.c')
-rw-r--r-- | source/memmap.c | 7229 |
1 files changed, 3620 insertions, 3609 deletions
diff --git a/source/memmap.c b/source/memmap.c index 38411c2..682b98d 100644 --- a/source/memmap.c +++ b/source/memmap.c @@ -1,6 +1,6 @@ /******************************************************************************* Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and Jerremy Koot (jkoot@snes9x.com) @@ -43,46 +43,46 @@ S-DD1 C emulator code (c) Copyright 2003 Brad Jorsch with research by Andreas Naive and John Weidman - + S-RTC C emulator code (c) Copyright 2001 John Weidman - + ST010 C++ emulator code (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - Super FX C emulator code + Super FX C emulator code (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + - Specific ports contains the works of other authors. See headers in individual files. - + Snes9x homepage: http://www.snes9x.com - + Permission to use, copy, modify and distribute Snes9x in both binary and source form, for non-commercial purposes, is hereby granted without fee, providing that this license information and copyright notice appear with all copies and any derived work. - + This software is provided 'as-is', without any express or implied warranty. In no event shall the authors be held liable for any damages arising from the use of this software. - + Snes9x is freeware for PERSONAL USE only. Commercial users should seek permission of the copyright holders first. Commercial use includes charging money for Snes9x or software derived from Snes9x. - + The copyright holders request that bug fixes and improvements to the code should be forwarded to them so everyone can benefit from the modifications in future versions. - + Super NES and Super Nintendo Entertainment System are trademarks of Nintendo Co., Limited and its subsidiary companies. *******************************************************************************/ @@ -125,7 +125,7 @@ #include "fxemu.h" extern struct FxInit_s SuperFX; #else -extern uint8 *SFXPlotTable; +extern uint8* SFXPlotTable; #endif #ifndef SET_UI_COLOR @@ -142,440 +142,443 @@ extern uint8 *SFXPlotTable; #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif -static int retry_count=0; +static int retry_count = 0; static uint8 bytes0x2000 [0x2000]; -int is_bsx(unsigned char *); -int bs_name(unsigned char *); +int is_bsx(unsigned char*); +int bs_name(unsigned char*); int check_char(unsigned); -void S9xDeinterleaveType2 (bool8 reset); -uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32); - -extern char *rom_filename; - -const uint32 crc32Table[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +void S9xDeinterleaveType2(bool8 reset); +uint32 caCRC32(uint8* array, uint32 size, register uint32 crc32); + +extern char* rom_filename; + +const uint32 crc32Table[256] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -void S9xDeinterleaveType1(int TotalFileSize, uint8 * base) +void S9xDeinterleaveType1(int TotalFileSize, uint8* base) { - if(Settings.DisplayColor==0xffff) - { - Settings.DisplayColor=BUILD_PIXEL(0,31,0); - SET_UI_COLOR(0,255,0); - } - - int i; - int nblocks = TotalFileSize >> 16; - uint8 blocks [256]; - for (i = 0; i < nblocks; i++) - { - blocks [i * 2] = i + nblocks; - blocks [i * 2 + 1] = i; - } - // DS2 DMA notes: base may or may not be 32-byte aligned - uint8 *tmp = (uint8 *) malloc (0x8000); - if (tmp) - { - for (i = 0; i < nblocks * 2; i++) - { + if (Settings.DisplayColor == 0xffff) + { + Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); + SET_UI_COLOR(0, 255, 0); + } + + int i; + int nblocks = TotalFileSize >> 16; + uint8 blocks [256]; + for (i = 0; i < nblocks; i++) + { + blocks [i * 2] = i + nblocks; + blocks [i * 2 + 1] = i; + } + // DS2 DMA notes: base may or may not be 32-byte aligned + uint8* tmp = (uint8*) malloc(0x8000); + if (tmp) + { + for (i = 0; i < nblocks * 2; i++) + { int j; for (j = i; j < nblocks * 2; j++) - { - if (blocks [j] == i) - { - // memmove converted: Different mallocs [Neb] - memcpy (tmp, &base [blocks [j] * 0x8000], 0x8000); - // memmove converted: Different addresses, or identical for blocks[i] == blocks[j] [Neb] - // DS2 DMA notes: Don't do DMA at all if blocks[i] == blocks[j] - memcpy (&base [blocks [j] * 0x8000], - &base [blocks [i] * 0x8000], 0x8000); - // memmove converted: Different mallocs [Neb] - memcpy (&base [blocks [i] * 0x8000], tmp, 0x8000); - uint8 b = blocks [j]; - blocks [j] = blocks [i]; - blocks [i] = b; - break; - } - } - } - free ((char *) tmp); - } + { + if (blocks [j] == i) + { + // memmove converted: Different mallocs [Neb] + memcpy(tmp, &base [blocks [j] * 0x8000], 0x8000); + // memmove converted: Different addresses, or identical for blocks[i] == blocks[j] [Neb] + // DS2 DMA notes: Don't do DMA at all if blocks[i] == blocks[j] + memcpy(&base [blocks [j] * 0x8000], + &base [blocks [i] * 0x8000], 0x8000); + // memmove converted: Different mallocs [Neb] + memcpy(&base [blocks [i] * 0x8000], tmp, 0x8000); + uint8 b = blocks [j]; + blocks [j] = blocks [i]; + blocks [i] = b; + break; + } + } + } + free((char*) tmp); + } } -void S9xDeinterleaveGD24(int TotalFileSize, uint8 * base) +void S9xDeinterleaveGD24(int TotalFileSize, uint8* base) { - if(TotalFileSize!=0x300000) - return; - - if(Settings.DisplayColor==0xffff) - { - Settings.DisplayColor=BUILD_PIXEL(0,31,31); - SET_UI_COLOR(0,255,255); - } - - // DS2 DMA notes: base may or may not be 32-byte aligned - uint8 *tmp = (uint8 *) malloc (0x80000); - if (tmp) - { - // memmove converted: Different mallocs [Neb] - memcpy(tmp, &base[0x180000], 0x80000); - // memmove converted: Different addresses [Neb] - memcpy(&base[0x180000], &base[0x200000], 0x80000); - // memmove converted: Different addresses [Neb] - memcpy(&base[0x200000], &base[0x280000], 0x80000); - // memmove converted: Different mallocs [Neb] - memcpy(&base[0x280000], tmp, 0x80000); - free ((char *) tmp); - - S9xDeinterleaveType1(TotalFileSize, base); - } + if (TotalFileSize != 0x300000) + return; + + if (Settings.DisplayColor == 0xffff) + { + Settings.DisplayColor = BUILD_PIXEL(0, 31, 31); + SET_UI_COLOR(0, 255, 255); + } + + // DS2 DMA notes: base may or may not be 32-byte aligned + uint8* tmp = (uint8*) malloc(0x80000); + if (tmp) + { + // memmove converted: Different mallocs [Neb] + memcpy(tmp, &base[0x180000], 0x80000); + // memmove converted: Different addresses [Neb] + memcpy(&base[0x180000], &base[0x200000], 0x80000); + // memmove converted: Different addresses [Neb] + memcpy(&base[0x200000], &base[0x280000], 0x80000); + // memmove converted: Different mallocs [Neb] + memcpy(&base[0x280000], tmp, 0x80000); + free((char*) tmp); + + S9xDeinterleaveType1(TotalFileSize, base); + } } -bool8 AllASCII (uint8 *b, int size) +bool8 AllASCII(uint8* b, int size) { int i; - for (i = 0; i < size; i++) - { - if (b[i] < 32 || b[i] > 126) - return (FALSE); - } - return (TRUE); + for (i = 0; i < size; i++) + { + if (b[i] < 32 || b[i] > 126) + return (FALSE); + } + return (TRUE); } -int ScoreHiROM (bool8 skip_header, int32 romoff) +int ScoreHiROM(bool8 skip_header, int32 romoff) { - int score = 0; - int o = skip_header ? 0xff00 + 0x200 : 0xff00; - - o+=romoff; - - if(Memory.ROM [o + 0xd5] & 0x1) - score+=2; - - //Mode23 is SA-1 - if(Memory.ROM [o + 0xd5] == 0x23) - score-=2; - - if(Memory.ROM [o+0xd4] == 0x20) - score +=2; - - if ((Memory.ROM [o + 0xdc] + (Memory.ROM [o + 0xdd] << 8) + - Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8)) == 0xffff) - { - score += 2; - if(0!=(Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8))) - score++; - } - - if (Memory.ROM [o + 0xda] == 0x33) - score += 2; - if ((Memory.ROM [o + 0xd5] & 0xf) < 4) - score += 2; - if (!(Memory.ROM [o + 0xfd] & 0x80)) - score -= 6; - if ((Memory.ROM [o + 0xfc]|(Memory.ROM [o + 0xfd]<<8))>0xFFB0) - score -= 2; //reduced after looking at a scan by Cowering - if (Memory.CalculatedSize > 1024 * 1024 * 3) - score += 4; - if ((1 << (Memory.ROM [o + 0xd7] - 7)) > 48) - score -= 1; - if (!AllASCII (&Memory.ROM [o + 0xb0], 6)) - score -= 1; - if (!AllASCII (&Memory.ROM [o + 0xc0], ROM_NAME_LEN - 1)) - score -= 1; - - return (score); -} - -int ScoreLoROM (bool8 skip_header, int32 romoff) + int score = 0; + int o = skip_header ? 0xff00 + 0x200 : 0xff00; + + o += romoff; + + if (Memory.ROM [o + 0xd5] & 0x1) + score += 2; + + //Mode23 is SA-1 + if (Memory.ROM [o + 0xd5] == 0x23) + score -= 2; + + if (Memory.ROM [o + 0xd4] == 0x20) + score += 2; + + if ((Memory.ROM [o + 0xdc] + (Memory.ROM [o + 0xdd] << 8) + + Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8)) == 0xffff) + { + score += 2; + if (0 != (Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8))) + score++; + } + + if (Memory.ROM [o + 0xda] == 0x33) + score += 2; + if ((Memory.ROM [o + 0xd5] & 0xf) < 4) + score += 2; + if (!(Memory.ROM [o + 0xfd] & 0x80)) + score -= 6; + if ((Memory.ROM [o + 0xfc] | (Memory.ROM [o + 0xfd] << 8)) > 0xFFB0) + score -= 2; //reduced after looking at a scan by Cowering + if (Memory.CalculatedSize > 1024 * 1024 * 3) + score += 4; + if ((1 << (Memory.ROM [o + 0xd7] - 7)) > 48) + score -= 1; + if (!AllASCII(&Memory.ROM [o + 0xb0], 6)) + score -= 1; + if (!AllASCII(&Memory.ROM [o + 0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); +} + +int ScoreLoROM(bool8 skip_header, int32 romoff) { - int score = 0; - int o = skip_header ? 0x7f00 + 0x200 : 0x7f00; - - o+=romoff; - - if(!(Memory.ROM [o + 0xd5] & 0x1)) - score+=3; - - //Mode23 is SA-1 - if(Memory.ROM [o + 0xd5] == 0x23) - score+=2; - - if ((Memory.ROM [o + 0xdc] + (Memory.ROM [o + 0xdd] << 8) + - Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8)) == 0xffff) - { - score += 2; - if(0!=(Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8))) - score++; - } - - if (Memory.ROM [o + 0xda] == 0x33) - score += 2; - if ((Memory.ROM [o + 0xd5] & 0xf) < 4) - score += 2; - if (Memory.CalculatedSize <= 1024 * 1024 * 16) - score += 2; - if (!(Memory.ROM [o + 0xfd] & 0x80)) - score -= 6; - if ((Memory.ROM [o + 0xfc]|(Memory.ROM [o + 0xfd]<<8))>0xFFB0) - score -= 2;//reduced per Cowering suggestion - if ((1 << (Memory.ROM [o + 0xd7] - 7)) > 48) - score -= 1; - if (!AllASCII (&Memory.ROM [o + 0xb0], 6)) - score -= 1; - if (!AllASCII (&Memory.ROM [o + 0xc0], ROM_NAME_LEN - 1)) - score -= 1; - - return (score); + int score = 0; + int o = skip_header ? 0x7f00 + 0x200 : 0x7f00; + + o += romoff; + + if (!(Memory.ROM [o + 0xd5] & 0x1)) + score += 3; + + //Mode23 is SA-1 + if (Memory.ROM [o + 0xd5] == 0x23) + score += 2; + + if ((Memory.ROM [o + 0xdc] + (Memory.ROM [o + 0xdd] << 8) + + Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8)) == 0xffff) + { + score += 2; + if (0 != (Memory.ROM [o + 0xde] + (Memory.ROM [o + 0xdf] << 8))) + score++; + } + + if (Memory.ROM [o + 0xda] == 0x33) + score += 2; + if ((Memory.ROM [o + 0xd5] & 0xf) < 4) + score += 2; + if (Memory.CalculatedSize <= 1024 * 1024 * 16) + score += 2; + if (!(Memory.ROM [o + 0xfd] & 0x80)) + score -= 6; + if ((Memory.ROM [o + 0xfc] | (Memory.ROM [o + 0xfd] << 8)) > 0xFFB0) + score -= 2;//reduced per Cowering suggestion + if ((1 << (Memory.ROM [o + 0xd7] - 7)) > 48) + score -= 1; + if (!AllASCII(&Memory.ROM [o + 0xb0], 6)) + score -= 1; + if (!AllASCII(&Memory.ROM [o + 0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); } -char *Safe (const char *s) +char* Safe(const char* s) { - static char *safe; - static int safe_len = 0; - - if(s==NULL) - { - if(safe!=NULL) - { - free((char*)safe); - safe = NULL; - } - return NULL; - } - int len = strlen (s); - if (!safe || len + 1 > safe_len) - { - if (safe) - free ((char *) safe); - safe = (char *) malloc (safe_len = len + 1); - } - - int i; - for (i = 0; i < len; i++) - { - if (s [i] >= 32 && s [i] < 127) - safe [i] = s[i]; - else - safe [i] = '?'; - } - safe [len] = 0; - return (safe); + static char* safe; + static int safe_len = 0; + + if (s == NULL) + { + if (safe != NULL) + { + free((char*)safe); + safe = NULL; + } + return NULL; + } + int len = strlen(s); + if (!safe || len + 1 > safe_len) + { + if (safe) + free((char*) safe); + safe = (char*) malloc(safe_len = len + 1); + } + + int i; + for (i = 0; i < len; i++) + { + if (s [i] >= 32 && s [i] < 127) + safe [i] = s[i]; + else + safe [i] = '?'; + } + safe [len] = 0; + return (safe); } /**********************************************************************************************/ /* Init() */ /* This function allocates and zeroes all the memory needed by the emulator */ /**********************************************************************************************/ -bool8 Init () +bool8 Init() { - // DS2 DMA notes: These would do well to be allocated with 32 extra bytes - // so they can be 32-byte aligned. [Neb] - Memory.RAM = (uint8 *) malloc (0x20000); - Memory.SRAM = (uint8 *) malloc (0x20000); - Memory.VRAM = (uint8 *) malloc (0x10000); + // DS2 DMA notes: These would do well to be allocated with 32 extra bytes + // so they can be 32-byte aligned. [Neb] + Memory.RAM = (uint8*) malloc(0x20000); + Memory.SRAM = (uint8*) malloc(0x20000); + Memory.VRAM = (uint8*) malloc(0x10000); #ifdef DS2_DMA - ROM = (uint8 *) AlignedMalloc (MAX_ROM_SIZE + 0x200 + 0x8000, 32, &PtrAdj.ROM); + ROM = (uint8*) AlignedMalloc(MAX_ROM_SIZE + 0x200 + 0x8000, 32, + &PtrAdj.ROM); #else - Memory.ROM = (uint8 *) malloc (MAX_ROM_SIZE + 0x200 + 0x8000); + Memory.ROM = (uint8*) malloc(MAX_ROM_SIZE + 0x200 + 0x8000); #endif - memset (Memory.RAM, 0, 0x20000); - memset (Memory.SRAM, 0, 0x20000); - memset (Memory.VRAM, 0, 0x10000); - // This needs to be initialised with a ROM first anyway, so don't - // bother memsetting. [Neb] - // memset (ROM, 0, MAX_ROM_SIZE + 0x200 + 0x8000); - - Memory.BSRAM = (uint8 *) malloc (0x80000); - memset (Memory.BSRAM, 0, 0x80000); + memset(Memory.RAM, 0, 0x20000); + memset(Memory.SRAM, 0, 0x20000); + memset(Memory.VRAM, 0, 0x10000); + // This needs to be initialised with a ROM first anyway, so don't + // bother memsetting. [Neb] + // memset (ROM, 0, MAX_ROM_SIZE + 0x200 + 0x8000); + + Memory.BSRAM = (uint8*) malloc(0x80000); + memset(Memory.BSRAM, 0, 0x80000); Memory.FillRAM = NULL; - - IPPU.TileCache [TILE_2BIT] = (uint8 *) malloc (MAX_2BIT_TILES * 128); - IPPU.TileCache [TILE_4BIT] = (uint8 *) malloc (MAX_4BIT_TILES * 128); - IPPU.TileCache [TILE_8BIT] = (uint8 *) malloc (MAX_8BIT_TILES * 128); - - IPPU.TileCached [TILE_2BIT] = (uint8 *) malloc (MAX_2BIT_TILES); - IPPU.TileCached [TILE_4BIT] = (uint8 *) malloc (MAX_4BIT_TILES); - IPPU.TileCached [TILE_8BIT] = (uint8 *) malloc (MAX_8BIT_TILES); - - if (!Memory.RAM || !Memory.SRAM || !Memory.VRAM || !Memory.ROM || !Memory.BSRAM || - !IPPU.TileCache [TILE_2BIT] || !IPPU.TileCache [TILE_4BIT] || - !IPPU.TileCache [TILE_8BIT] || !IPPU.TileCached [TILE_2BIT] || - !IPPU.TileCached [TILE_4BIT] || !IPPU.TileCached [TILE_8BIT]) - { - Deinit (); - return (FALSE); - } - - // FillRAM uses first 32K of ROM image area, otherwise space just - // wasted. Might be read by the SuperFX code. - - Memory.FillRAM = Memory.ROM; - - // Add 0x8000 to ROM image pointer to stop SuperFX code accessing - // unallocated memory (can cause crash on some ports). - Memory.ROM += 0x8000; // still 32-byte aligned - - Memory.C4RAM = Memory.ROM + 0x400000 + 8192 * 8; // still 32-byte aligned - Memory.ROM = Memory.ROM; - Memory.SRAM = Memory.SRAM; - + + IPPU.TileCache [TILE_2BIT] = (uint8*) malloc(MAX_2BIT_TILES * 128); + IPPU.TileCache [TILE_4BIT] = (uint8*) malloc(MAX_4BIT_TILES * 128); + IPPU.TileCache [TILE_8BIT] = (uint8*) malloc(MAX_8BIT_TILES * 128); + + IPPU.TileCached [TILE_2BIT] = (uint8*) malloc(MAX_2BIT_TILES); + IPPU.TileCached [TILE_4BIT] = (uint8*) malloc(MAX_4BIT_TILES); + IPPU.TileCached [TILE_8BIT] = (uint8*) malloc(MAX_8BIT_TILES); + + if (!Memory.RAM || !Memory.SRAM || !Memory.VRAM || !Memory.ROM || !Memory.BSRAM + || + !IPPU.TileCache [TILE_2BIT] || !IPPU.TileCache [TILE_4BIT] || + !IPPU.TileCache [TILE_8BIT] || !IPPU.TileCached [TILE_2BIT] || + !IPPU.TileCached [TILE_4BIT] || !IPPU.TileCached [TILE_8BIT]) + { + Deinit(); + return (FALSE); + } + + // FillRAM uses first 32K of ROM image area, otherwise space just + // wasted. Might be read by the SuperFX code. + + Memory.FillRAM = Memory.ROM; + + // Add 0x8000 to ROM image pointer to stop SuperFX code accessing + // unallocated memory (can cause crash on some ports). + Memory.ROM += 0x8000; // still 32-byte aligned + + Memory.C4RAM = Memory.ROM + 0x400000 + 8192 * 8; // still 32-byte aligned + Memory.ROM = Memory.ROM; + Memory.SRAM = Memory.SRAM; + #ifdef ZSNES_FX - SFXPlotTable = ROM + 0x400000; + SFXPlotTable = ROM + 0x400000; #else - SuperFX.pvRegisters = &Memory.FillRAM [0x3000]; - SuperFX.nRamBanks = 2; // Most only use 1. 1=64KB, 2=128KB=1024Mb - SuperFX.pvRam = Memory.SRAM; - SuperFX.nRomBanks = (2 * 1024 * 1024) / (32 * 1024); - SuperFX.pvRom = (uint8 *) Memory.ROM; + SuperFX.pvRegisters = &Memory.FillRAM [0x3000]; + SuperFX.nRamBanks = 2; // Most only use 1. 1=64KB, 2=128KB=1024Mb + SuperFX.pvRam = Memory.SRAM; + SuperFX.nRomBanks = (2 * 1024 * 1024) / (32 * 1024); + SuperFX.pvRom = (uint8*) Memory.ROM; #endif - ZeroMemory (IPPU.TileCache [TILE_2BIT], MAX_2BIT_TILES * 128); - ZeroMemory (IPPU.TileCache [TILE_4BIT], MAX_4BIT_TILES * 128); - ZeroMemory (IPPU.TileCache [TILE_8BIT], MAX_8BIT_TILES * 128); - - ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); - ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); - ZeroMemory (IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); - - Memory.SDD1Data = NULL; - Memory.SDD1Index = NULL; - - return (TRUE); + ZeroMemory(IPPU.TileCache [TILE_2BIT], MAX_2BIT_TILES * 128); + ZeroMemory(IPPU.TileCache [TILE_4BIT], MAX_4BIT_TILES * 128); + ZeroMemory(IPPU.TileCache [TILE_8BIT], MAX_8BIT_TILES * 128); + + ZeroMemory(IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory(IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory(IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); + + Memory.SDD1Data = NULL; + Memory.SDD1Index = NULL; + + return (TRUE); } -void Deinit () +void Deinit() { #ifdef __W32_HEAP - if(_HEAPOK!=_heapchk()) + if (_HEAPOK != _heapchk()) MessageBox(GUI.hWnd, "Deinit", "Heap Corrupt", MB_OK); #endif - if (Memory.RAM) - { - free ((char *) Memory.RAM); + if (Memory.RAM) + { + free((char*) Memory.RAM); Memory.RAM = NULL; - } - if (Memory.SRAM) - { - free ((char *) Memory.SRAM); + } + if (Memory.SRAM) + { + free((char*) Memory.SRAM); Memory.SRAM = NULL; - } - if (Memory.VRAM) - { - free ((char *) Memory.VRAM); + } + if (Memory.VRAM) + { + free((char*) Memory.VRAM); Memory.VRAM = NULL; - } - if (Memory.ROM) - { + } + if (Memory.ROM) + { Memory.ROM -= 0x8000; #ifdef DS2_RAM - AlignedFree ((char *) ROM, PtrAdj.ROM); + AlignedFree((char*) ROM, PtrAdj.ROM); #else - free ((char *) Memory.ROM); + free((char*) Memory.ROM); #endif Memory.ROM = NULL; - } - - if(Memory.BSRAM) - { + } + + if (Memory.BSRAM) + { free((char*) Memory.BSRAM); - Memory.BSRAM=NULL; - } - - if (IPPU.TileCache [TILE_2BIT]) - { - free ((char *) IPPU.TileCache [TILE_2BIT]); - IPPU.TileCache [TILE_2BIT] = NULL; - } - if (IPPU.TileCache [TILE_4BIT]) - { - free ((char *) IPPU.TileCache [TILE_4BIT]); - IPPU.TileCache [TILE_4BIT] = NULL; - } - if (IPPU.TileCache [TILE_8BIT]) - { - free ((char *) IPPU.TileCache [TILE_8BIT]); - IPPU.TileCache [TILE_8BIT] = NULL; - } - - if (IPPU.TileCached [TILE_2BIT]) - { - free ((char *) IPPU.TileCached [TILE_2BIT]); - IPPU.TileCached [TILE_2BIT] = NULL; - } - if (IPPU.TileCached [TILE_4BIT]) - { - free ((char *) IPPU.TileCached [TILE_4BIT]); - IPPU.TileCached [TILE_4BIT] = NULL; - } - if (IPPU.TileCached [TILE_8BIT]) - { - free ((char *) IPPU.TileCached [TILE_8BIT]); - IPPU.TileCached [TILE_8BIT] = NULL; - } - FreeSDD1Data (); - Safe(NULL); + Memory.BSRAM = NULL; + } + + if (IPPU.TileCache [TILE_2BIT]) + { + free((char*) IPPU.TileCache [TILE_2BIT]); + IPPU.TileCache [TILE_2BIT] = NULL; + } + if (IPPU.TileCache [TILE_4BIT]) + { + free((char*) IPPU.TileCache [TILE_4BIT]); + IPPU.TileCache [TILE_4BIT] = NULL; + } + if (IPPU.TileCache [TILE_8BIT]) + { + free((char*) IPPU.TileCache [TILE_8BIT]); + IPPU.TileCache [TILE_8BIT] = NULL; + } + + if (IPPU.TileCached [TILE_2BIT]) + { + free((char*) IPPU.TileCached [TILE_2BIT]); + IPPU.TileCached [TILE_2BIT] = NULL; + } + if (IPPU.TileCached [TILE_4BIT]) + { + free((char*) IPPU.TileCached [TILE_4BIT]); + IPPU.TileCached [TILE_4BIT] = NULL; + } + if (IPPU.TileCached [TILE_8BIT]) + { + free((char*) IPPU.TileCached [TILE_8BIT]); + IPPU.TileCached [TILE_8BIT] = NULL; + } + FreeSDD1Data(); + Safe(NULL); } -void FreeSDD1Data () +void FreeSDD1Data() { - if (Memory.SDD1Index) - { - free ((char *) Memory.SDD1Index); + if (Memory.SDD1Index) + { + free((char*) Memory.SDD1Index); Memory.SDD1Index = NULL; - } - if (Memory.SDD1Data) - { - free ((char *) Memory.SDD1Data); + } + if (Memory.SDD1Data) + { + free((char*) Memory.SDD1Data); Memory.SDD1Data = NULL; - } + } } /**********************************************************************************************/ @@ -583,351 +586,360 @@ void FreeSDD1Data () /* This function loads a Snes-Backup image */ /**********************************************************************************************/ -bool8 LoadROM (const char *filename) +bool8 LoadROM(const char* filename) { - int32 TotalFileSize = 0; - bool8 Interleaved = FALSE; - bool8 Tales = FALSE; - - uint8* RomHeader=Memory.ROM; - - Memory.ExtendedFormat=NOPE; - - - if(CleanUp7110!=NULL) - (*CleanUp7110)(); - - memset (&SNESGameFixes, 0, sizeof(SNESGameFixes)); - SNESGameFixes.SRAMInitialValue = 0x60; - - memset (bytes0x2000, 0, 0x2000); - CPU.TriedInterleavedMode2 = FALSE; - - Memory.CalculatedSize = 0; - retry_count =0; + int32 TotalFileSize = 0; + bool8 Interleaved = FALSE; + bool8 Tales = FALSE; + + uint8* RomHeader = Memory.ROM; + + Memory.ExtendedFormat = NOPE; + + + if (CleanUp7110 != NULL) + (*CleanUp7110)(); + + memset(&SNESGameFixes, 0, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; + + memset(bytes0x2000, 0, 0x2000); + CPU.TriedInterleavedMode2 = FALSE; + + Memory.CalculatedSize = 0; + retry_count = 0; again: - Settings.DisplayColor=0xffff; - SET_UI_COLOR(255,255,255); + Settings.DisplayColor = 0xffff; + SET_UI_COLOR(255, 255, 255); TotalFileSize = FileLoader(Memory.ROM, filename, MAX_ROM_SIZE); - if (!TotalFileSize) - return FALSE; // it ends here - else if(!Settings.NoPatch) - CheckForIPSPatch (filename, Memory.HeaderCount != 0, &TotalFileSize); - - //fix hacked games here. - if((strncmp("HONKAKUHA IGO GOSEI", (char*)&Memory.ROM[0x7FC0],19)==0)&&(Memory.ROM[0x7FD5]!=0x31)) - { - Memory.ROM[0x7FD5]=0x31; - Memory.ROM[0x7FD6]=0x02; - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); - } - - if((strncmp("HONKAKUHA IGO GOSEI", (char*)&Memory.ROM[0xFFC0],19)==0)&&(Memory.ROM[0xFFD5]!=0x31)) - { - Memory.ROM[0xFFD5]=0x31; - Memory.ROM[0xFFD6]=0x02; - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); - } - - if((Memory.ROM[0x7FD5]==0x42)&&(Memory.ROM[0x7FD6]==0x13)&&(strncmp("METAL COMBAT",(char*)&Memory.ROM[0x7FC0],12)==0)) - { - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); - } - - int orig_hi_score, orig_lo_score; - int hi_score, lo_score; - - orig_hi_score = hi_score = ScoreHiROM (FALSE, 0); - orig_lo_score = lo_score = ScoreLoROM (FALSE, 0); - - if (Memory.HeaderCount == 0 && !Settings.ForceNoHeader && - ((hi_score > lo_score && ScoreHiROM (TRUE, 0) > hi_score) || - (hi_score <= lo_score && ScoreLoROM (TRUE, 0) > lo_score))) - { + if (!TotalFileSize) + return FALSE; // it ends here + else if (!Settings.NoPatch) + CheckForIPSPatch(filename, Memory.HeaderCount != 0, &TotalFileSize); + + //fix hacked games here. + if ((strncmp("HONKAKUHA IGO GOSEI", (char*)&Memory.ROM[0x7FC0], 19) == 0) + && (Memory.ROM[0x7FD5] != 0x31)) + { + Memory.ROM[0x7FD5] = 0x31; + Memory.ROM[0x7FD6] = 0x02; + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + if ((strncmp("HONKAKUHA IGO GOSEI", (char*)&Memory.ROM[0xFFC0], 19) == 0) + && (Memory.ROM[0xFFD5] != 0x31)) + { + Memory.ROM[0xFFD5] = 0x31; + Memory.ROM[0xFFD6] = 0x02; + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + if ((Memory.ROM[0x7FD5] == 0x42) && (Memory.ROM[0x7FD6] == 0x13) + && (strncmp("METAL COMBAT", (char*)&Memory.ROM[0x7FC0], 12) == 0)) + { + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + int orig_hi_score, orig_lo_score; + int hi_score, lo_score; + + orig_hi_score = hi_score = ScoreHiROM(FALSE, 0); + orig_lo_score = lo_score = ScoreLoROM(FALSE, 0); + + if (Memory.HeaderCount == 0 && !Settings.ForceNoHeader && + ((hi_score > lo_score && ScoreHiROM(TRUE, 0) > hi_score) || + (hi_score <= lo_score && ScoreLoROM(TRUE, 0) > lo_score))) + { #ifdef DS2_DMA - __dcache_writeback_all(); - { - unsigned int i; - for (i = 0; i < TotalFileSize; i += 512) - { - ds2_DMAcopy_32Byte (2 /* channel: emu internal */, Memory.ROM + i, Memory.ROM + i + 512, 512); - ds2_DMA_wait(2); - ds2_DMA_stop(2); - } - } + __dcache_writeback_all(); + { + unsigned int i; + for (i = 0; i < TotalFileSize; i += 512) + { + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, Memory.ROM + i, + Memory.ROM + i + 512, 512); + ds2_DMA_wait(2); + ds2_DMA_stop(2); + } + } #else - // memmove required: Overlapping addresses [Neb] - memmove (Memory.ROM, Memory.ROM + 512, TotalFileSize - 512); + // memmove required: Overlapping addresses [Neb] + memmove(Memory.ROM, Memory.ROM + 512, TotalFileSize - 512); #endif - TotalFileSize -= 512; - S9xMessage (S9X_INFO, S9X_HEADER_WARNING, - "Try specifying the -nhd command line option if the game doesn't work\n"); - //modifying ROM, so we need to rescore - orig_hi_score = hi_score = ScoreHiROM (FALSE, 0); - orig_lo_score = lo_score = ScoreLoROM (FALSE, 0); - } - - Memory.CalculatedSize = TotalFileSize & ~0x1FFF; // round down to lower 0x2000 - ZeroMemory (Memory.ROM + Memory.CalculatedSize, MAX_ROM_SIZE - Memory.CalculatedSize); - - if(Memory.CalculatedSize >0x400000&& - !(Memory.ROM[0x7FD5]==0x32&&((Memory.ROM[0x7FD6]&0xF0)==0x40)) && //exclude S-DD1 - !(Memory.ROM[0xFFD5]==0x3A&&((Memory.ROM[0xFFD6]&0xF0)==0xF0))) //exclude SPC7110 - { - //you might be a Jumbo! - Memory.ExtendedFormat=YEAH; - } - - //If both vectors are invalid, it's type 1 LoROM - - if(Memory.ExtendedFormat==NOPE&&((Memory.ROM[0x7FFC]|(Memory.ROM[0x7FFD]<<8))<0x8000)&&((Memory.ROM[0xFFFC]|(Memory.ROM[0xFFFD]<<8)) <0x8000)) - { - if(Settings.DisplayColor==0xffff) - { - Settings.DisplayColor=BUILD_PIXEL(0,31,0); - SET_UI_COLOR(0,255,0); - } - if(!Settings.ForceInterleaved) + TotalFileSize -= 512; + S9xMessage(S9X_INFO, S9X_HEADER_WARNING, + "Try specifying the -nhd command line option if the game doesn't work\n"); + //modifying ROM, so we need to rescore + orig_hi_score = hi_score = ScoreHiROM(FALSE, 0); + orig_lo_score = lo_score = ScoreLoROM(FALSE, 0); + } + + Memory.CalculatedSize = TotalFileSize & ~0x1FFF; // round down to lower 0x2000 + ZeroMemory(Memory.ROM + Memory.CalculatedSize, + MAX_ROM_SIZE - Memory.CalculatedSize); + + if (Memory.CalculatedSize > 0x400000 && + !(Memory.ROM[0x7FD5] == 0x32 && ((Memory.ROM[0x7FD6] & 0xF0) == 0x40)) + && //exclude S-DD1 + !(Memory.ROM[0xFFD5] == 0x3A + && ((Memory.ROM[0xFFD6] & 0xF0) == 0xF0))) //exclude SPC7110 + { + //you might be a Jumbo! + Memory.ExtendedFormat = YEAH; + } + + //If both vectors are invalid, it's type 1 LoROM + + if (Memory.ExtendedFormat == NOPE + && ((Memory.ROM[0x7FFC] | (Memory.ROM[0x7FFD] << 8)) < 0x8000) + && ((Memory.ROM[0xFFFC] | (Memory.ROM[0xFFFD] << 8)) < 0x8000)) + { + if (Settings.DisplayColor == 0xffff) + { + Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); + SET_UI_COLOR(0, 255, 0); + } + if (!Settings.ForceInterleaved) S9xDeinterleaveType1(TotalFileSize, Memory.ROM); - } + } - //CalculatedSize is now set, so rescore - orig_hi_score = hi_score = ScoreHiROM (FALSE, 0); - orig_lo_score = lo_score = ScoreLoROM (FALSE, 0); + //CalculatedSize is now set, so rescore + orig_hi_score = hi_score = ScoreHiROM(FALSE, 0); + orig_lo_score = lo_score = ScoreLoROM(FALSE, 0); - if(Memory.ExtendedFormat != NOPE) - { - int loromscore, hiromscore, swappedlorom, swappedhirom; - loromscore=ScoreLoROM(FALSE, 0); - hiromscore=ScoreHiROM(FALSE, 0); - swappedlorom=ScoreLoROM(FALSE, 0x400000); - swappedhirom=ScoreHiROM(FALSE, 0x400000); + if (Memory.ExtendedFormat != NOPE) + { + int loromscore, hiromscore, swappedlorom, swappedhirom; + loromscore = ScoreLoROM(FALSE, 0); + hiromscore = ScoreHiROM(FALSE, 0); + swappedlorom = ScoreLoROM(FALSE, 0x400000); + swappedhirom = ScoreHiROM(FALSE, 0x400000); - //set swapped here. + //set swapped here. - if(max(swappedlorom, swappedhirom) >= max(loromscore, hiromscore)) - { + if (max(swappedlorom, swappedhirom) >= max(loromscore, hiromscore)) + { Memory.ExtendedFormat = BIGFIRST; - hi_score=swappedhirom; - lo_score=swappedlorom; - RomHeader=Memory.ROM+0x400000; - } - else - { + hi_score = swappedhirom; + lo_score = swappedlorom; + RomHeader = Memory.ROM + 0x400000; + } + else + { Memory.ExtendedFormat = SMALLFIRST; - lo_score=loromscore; - hi_score=hiromscore; - RomHeader=Memory.ROM; - } + lo_score = loromscore; + hi_score = hiromscore; + RomHeader = Memory.ROM; + } - } + } - Interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2; - if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score)) - { + Interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2; + if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score)) + { Memory.LoROM = TRUE; Memory.HiROM = FALSE; - - // Ignore map type byte if not 0x2x or 0x3x - if ((RomHeader [0x7fd5] & 0xf0) == 0x20 || (RomHeader [0x7fd5] & 0xf0) == 0x30) - { - switch (RomHeader [0x7fd5] & 0xf) - { - case 1: - Interleaved = TRUE; - break; - case 5: - Interleaved = TRUE; - Tales = TRUE; - break; - } - } - } - else - { - if ((RomHeader [0xffd5] & 0xf0) == 0x20 || (RomHeader [0xffd5] & 0xf0) == 0x30) - { - switch (RomHeader [0xffd5] & 0xf) - { - case 0: - case 3: - Interleaved = TRUE; - break; - } - } + + // Ignore map type byte if not 0x2x or 0x3x + if ((RomHeader [0x7fd5] & 0xf0) == 0x20 || (RomHeader [0x7fd5] & 0xf0) == 0x30) + { + switch (RomHeader [0x7fd5] & 0xf) + { + case 1: + Interleaved = TRUE; + break; + case 5: + Interleaved = TRUE; + Tales = TRUE; + break; + } + } + } + else + { + if ((RomHeader [0xffd5] & 0xf0) == 0x20 || (RomHeader [0xffd5] & 0xf0) == 0x30) + { + switch (RomHeader [0xffd5] & 0xf) + { + case 0: + case 3: + Interleaved = TRUE; + break; + } + } Memory.LoROM = FALSE; Memory.HiROM = TRUE; - } - - // More - if (!Settings.ForceHiROM && !Settings.ForceLoROM && - !Settings.ForceInterleaved && !Settings.ForceInterleaved2 && - !Settings.ForceNotInterleaved && !Settings.ForcePAL && - !Settings.ForceSuperFX && !Settings.ForceDSP1 && - !Settings.ForceSA1 && !Settings.ForceC4 && - !Settings.ForceSDD1) - { + } + + // More + if (!Settings.ForceHiROM && !Settings.ForceLoROM && + !Settings.ForceInterleaved && !Settings.ForceInterleaved2 && + !Settings.ForceNotInterleaved && !Settings.ForcePAL && + !Settings.ForceSuperFX && !Settings.ForceDSP1 && + !Settings.ForceSA1 && !Settings.ForceC4 && + !Settings.ForceSDD1) + { #ifdef DETECT_NASTY_FX_INTERLEAVE -//MK: Damn. YI trips a BRK currently. Maybe even on a real cart. + //MK: Damn. YI trips a BRK currently. Maybe even on a real cart. -#ifdef LSB_FIRST - if(strncmp((char *) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(*(uint16*)&ROM[0x7FDE])==57611&&ROM[0x10002]==0xA9) +#ifdef LSB_FIRST + if (strncmp((char*) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0 + && (*(uint16*)&ROM[0x7FDE]) == 57611 && ROM[0x10002] == 0xA9) #else - if(strncmp((char *) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(ROM[0x7FDE]+(ROM[0x7FDF]<<8))==57611&&ROM[0x10002]==0xA9) + if (strncmp((char*) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0 + && (ROM[0x7FDE] + (ROM[0x7FDF] << 8)) == 57611 && ROM[0x10002] == 0xA9) #endif - { - Interleaved=true; - Settings.ForceInterleaved2=true; - } + { + Interleaved = true; + Settings.ForceInterleaved2 = true; + } #endif - if (strncmp ((char *) &Memory.ROM [0x7fc0], "YUYU NO QUIZ DE GO!GO!", 22) == 0) - { + if (strncmp((char*) &Memory.ROM [0x7fc0], "YUYU NO QUIZ DE GO!GO!", 22) == 0) + { Memory.LoROM = TRUE; Memory.HiROM = FALSE; - Interleaved = FALSE; - } - } - - if (!Settings.ForceNotInterleaved && Interleaved) - { - CPU.TriedInterleavedMode2 = TRUE; - S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO, - "ROM image is in interleaved format - converting..."); - - if (Tales) - { - if(Memory.ExtendedFormat==BIGFIRST) - { + Interleaved = FALSE; + } + } + + if (!Settings.ForceNotInterleaved && Interleaved) + { + CPU.TriedInterleavedMode2 = TRUE; + S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, + "ROM image is in interleaved format - converting..."); + + if (Tales) + { + if (Memory.ExtendedFormat == BIGFIRST) + { S9xDeinterleaveType1(0x400000, Memory.ROM); - S9xDeinterleaveType1(Memory.CalculatedSize-0x400000, Memory.ROM+0x400000); - } - else - { - S9xDeinterleaveType1(Memory.CalculatedSize-0x400000, Memory.ROM); - S9xDeinterleaveType1(0x400000, Memory.ROM + Memory.CalculatedSize-0x400000); - - } - + S9xDeinterleaveType1(Memory.CalculatedSize - 0x400000, Memory.ROM + 0x400000); + } + else + { + S9xDeinterleaveType1(Memory.CalculatedSize - 0x400000, Memory.ROM); + S9xDeinterleaveType1(0x400000, Memory.ROM + Memory.CalculatedSize - 0x400000); + + } + Memory.LoROM = FALSE; Memory.HiROM = TRUE; - - - } - else if (Settings.ForceInterleaved2) - { - S9xDeinterleaveType2(FALSE); - } - else if (Settings.ForceInterleaveGD24 && Memory.CalculatedSize ==0x300000) - { + + + } + else if (Settings.ForceInterleaved2) + S9xDeinterleaveType2(FALSE); + else if (Settings.ForceInterleaveGD24 && Memory.CalculatedSize == 0x300000) + { bool8 t = Memory.LoROM; - + Memory.LoROM = Memory.HiROM; Memory.HiROM = t; S9xDeinterleaveGD24(Memory.CalculatedSize, Memory.ROM); - } - else - { - if(Settings.DisplayColor==0xffff) - { - Settings.DisplayColor=BUILD_PIXEL(0,31,0); - SET_UI_COLOR(0,255,0); - } + } + else + { + if (Settings.DisplayColor == 0xffff) + { + Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); + SET_UI_COLOR(0, 255, 0); + } bool8 t = Memory.LoROM; - + Memory.LoROM = Memory.HiROM; Memory.HiROM = t; - + S9xDeinterleaveType1(Memory.CalculatedSize, Memory.ROM); - } + } + + hi_score = ScoreHiROM(FALSE, 0); + lo_score = ScoreLoROM(FALSE, 0); - hi_score = ScoreHiROM (FALSE, 0); - lo_score = ScoreLoROM (FALSE, 0); - if ((Memory.HiROM && - (lo_score >= hi_score || hi_score < 0)) || - (Memory.LoROM && - (hi_score > lo_score || lo_score < 0))) - { - if (retry_count == 0) - { - S9xMessage (S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, - "ROM lied about its type! Trying again."); - Settings.ForceNotInterleaved = TRUE; - Settings.ForceInterleaved = FALSE; - retry_count++; - goto again; - } - } - } - - if(Memory.ExtendedFormat==SMALLFIRST) - Tales=true; - - FreeSDD1Data (); - InitROM (Tales); - S9xLoadCheatFile (S9xGetFilename(".cht")); - S9xInitCheatData (); - S9xApplyCheats (); - - S9xReset (); - - return (TRUE); + (lo_score >= hi_score || hi_score < 0)) || + (Memory.LoROM && + (hi_score > lo_score || lo_score < 0))) + { + if (retry_count == 0) + { + S9xMessage(S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, + "ROM lied about its type! Trying again."); + Settings.ForceNotInterleaved = TRUE; + Settings.ForceInterleaved = FALSE; + retry_count++; + goto again; + } + } + } + + if (Memory.ExtendedFormat == SMALLFIRST) + Tales = true; + + FreeSDD1Data(); + InitROM(Tales); + S9xLoadCheatFile(S9xGetFilename(".cht")); + S9xInitCheatData(); + S9xApplyCheats(); + + S9xReset(); + + return (TRUE); } -uint32 FileLoader (uint8* buffer, const char* filename, int32 maxsize) +uint32 FileLoader(uint8* buffer, const char* filename, int32 maxsize) { - - FILE* ROMFile; - int32 TotalFileSize = 0; + + FILE* ROMFile; + int32 TotalFileSize = 0; int len = 0; - - char dir [_MAX_DIR + 1]; - char drive [_MAX_DRIVE + 1]; - char name [_MAX_FNAME + 1]; - char ext [_MAX_EXT + 1]; - char fname [_MAX_PATH + 1]; - - unsigned long FileSize = 0; - - _splitpath (filename, drive, dir, name, ext); - _makepath (fname, drive, dir, name, ext); - + + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char fname [_MAX_PATH + 1]; + + unsigned long FileSize = 0; + + _splitpath(filename, drive, dir, name, ext); + _makepath(fname, drive, dir, name, ext); + #ifdef __WIN32__ - // memmove required: Overlapping addresses [Neb] - memmove (&ext [0], &ext[1], 4); + // memmove required: Overlapping addresses [Neb] + memmove(&ext [0], &ext[1], 4); #endif if ((ROMFile = fopen(fname, "rb")) == NULL) return (0); - strcpy (Memory.ROMFilename, fname); + strcpy(Memory.ROMFilename, fname); Memory.HeaderCount = 0; - uint8 *ptr = buffer; + uint8* ptr = buffer; bool8 more = FALSE; do { - FileSize = fread (ptr, 1, maxsize + 0x200 - (ptr - Memory.ROM), ROMFile); - fclose (ROMFile); + FileSize = fread(ptr, 1, maxsize + 0x200 - (ptr - Memory.ROM), ROMFile); + fclose(ROMFile); int calc_size = FileSize & ~0x1FFF; // round to the lower 0x2000 if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) || - Settings.ForceHeader) + Settings.ForceHeader) { // memmove required: Overlapping addresses [Neb] // DS2 DMA notes: Can be split into 512-byte DMA blocks [Neb] @@ -937,13 +949,13 @@ uint32 FileLoader (uint8* buffer, const char* filename, int32 maxsize) unsigned int i; for (i = 0; i < calc_size; i += 512) { - ds2_DMAcopy_32Byte (2 /* channel: emu internal */, ptr + i, ptr + i + 512, 512); + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, ptr + i, ptr + i + 512, 512); ds2_DMA_wait(2); ds2_DMA_stop(2); } } #else - memmove (ptr, ptr + 512, calc_size); + memmove(ptr, ptr + 512, calc_size); #endif Memory.HeaderCount++; FileSize -= 512; @@ -956,52 +968,53 @@ uint32 FileLoader (uint8* buffer, const char* filename, int32 maxsize) // check for multi file roms if ((ptr - Memory.ROM) < (maxsize + 0x200) && - (isdigit (ext [0]) && ext [1] == 0 && ext [0] < '9')) + (isdigit(ext [0]) && ext [1] == 0 && ext [0] < '9')) { more = TRUE; ext [0]++; #ifdef __WIN32__ // memmove required: Overlapping addresses [Neb] - memmove (&ext [1], &ext [0], 4); - ext [0] = '.'; + memmove(&ext [1], &ext [0], 4); + ext [0] = '.'; #endif - _makepath (fname, drive, dir, name, ext); + _makepath(fname, drive, dir, name, ext); } else if (ptr - Memory.ROM < maxsize + 0x200 && - (((len = strlen (name)) == 7 || len == 8) && - strncasecmp (name, "sf", 2) == 0 && - isdigit (name [2]) && isdigit (name [3]) && isdigit (name [4]) && - isdigit (name [5]) && isalpha (name [len - 1]))) + (((len = strlen(name)) == 7 || len == 8) && + strncasecmp(name, "sf", 2) == 0 && + isdigit(name [2]) && isdigit(name [3]) && isdigit(name [4]) && + isdigit(name [5]) && isalpha(name [len - 1]))) { more = TRUE; name [len - 1]++; #ifdef __WIN32__ // memmove required: Overlapping addresses [Neb] - memmove (&ext [1], &ext [0], 4); + memmove(&ext [1], &ext [0], 4); ext [0] = '.'; #endif - _makepath (fname, drive, dir, name, ext); + _makepath(fname, drive, dir, name, ext); } else more = FALSE; - } while (more && (ROMFile = fopen (fname, "rb")) != NULL); - + } + while (more && (ROMFile = fopen(fname, "rb")) != NULL); + - if (Memory.HeaderCount == 0) - S9xMessage (S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); - else - { + if (Memory.HeaderCount == 0) + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); + else + { if (Memory.HeaderCount == 1) - S9xMessage (S9X_INFO, S9X_HEADERS_INFO, - "Found ROM file header (and ignored it)."); - else - S9xMessage (S9X_INFO, S9X_HEADERS_INFO, - "Found multiple ROM file headers (and ignored them)."); - } + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, + "Found ROM file header (and ignored it)."); + else + S9xMessage(S9X_INFO, S9X_HEADERS_INFO, + "Found multiple ROM file headers (and ignored them)."); + } - return TotalFileSize; + return TotalFileSize; } @@ -1011,810 +1024,803 @@ uint32 FileLoader (uint8* buffer, const char* filename, int32 maxsize) /* This function loads a Slotted SNES-Backup image and fills the slot. */ /**********************************************************************************************/ -bool8 LoadMulti (const char *basename, const char *slot1name, const char *slot2name) +bool8 LoadMulti(const char* basename, const char* slot1name, + const char* slot2name) { - unsigned long FileSize = 0; - - if(*basename=='\0') - return FALSE; - - SufamiTurbo=TRUE; - - int32 offset; - - memset (&SNESGameFixes, 0, sizeof(SNESGameFixes)); - SNESGameFixes.SRAMInitialValue = 0x60; - - memset (bytes0x2000, 0, 0x2000); - - CalculatedSize = 0; - - Settings.DisplayColor=0xffff; - SET_UI_COLOR(255,255,255); - - int32 TotalFileSize = FileLoader(ROM, basename, MAX_ROM_SIZE); - - if(0== TotalFileSize) - return FALSE; - else CheckForIPSPatch (basename, HeaderCount != 0, TotalFileSize); - - CalculatedSize=TotalFileSize; - - for(offset=0; offset<TotalFileSize; offset+=0x100000); - - //insert base type test here. - - if(slot1name[0]!='\0') - { - - TotalFileSize = FileLoader(ROM+offset, slot1name, MAX_ROM_SIZE); - - if(0== TotalFileSize) - return FALSE; - else CheckForIPSPatch (slot1name, HeaderCount != 0, TotalFileSize); - ROMOffset1=&ROM[offset]; - Slot1Size=TotalFileSize; - } - int32 temp=offset; - for(; offset<temp+TotalFileSize; offset+=0x100000); - - if(slot2name[0]!='\0') - { - TotalFileSize = FileLoader(ROM+offset, slot2name, MAX_ROM_SIZE); - - if(0== TotalFileSize) - return FALSE; - else CheckForIPSPatch (slot2name, HeaderCount != 0, TotalFileSize); - ROMOffset2=&ROM[offset]; - Slot2Size=TotalFileSize; - } - - InitROM (FALSE); - S9xLoadCheatFile (S9xGetFilename(".cht")); - S9xInitCheatData (); - S9xApplyCheats (); - - S9xReset (); - - return (TRUE); + unsigned long FileSize = 0; + + if (*basename == '\0') + return FALSE; + + SufamiTurbo = TRUE; + + int32 offset; + + memset(&SNESGameFixes, 0, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; + + memset(bytes0x2000, 0, 0x2000); + + CalculatedSize = 0; + + Settings.DisplayColor = 0xffff; + SET_UI_COLOR(255, 255, 255); + + int32 TotalFileSize = FileLoader(ROM, basename, MAX_ROM_SIZE); + + if (0 == TotalFileSize) + return FALSE; + else CheckForIPSPatch(basename, HeaderCount != 0, TotalFileSize); + + CalculatedSize = TotalFileSize; + + for (offset = 0; offset < TotalFileSize; offset += 0x100000); + + //insert base type test here. + + if (slot1name[0] != '\0') + { + + TotalFileSize = FileLoader(ROM + offset, slot1name, MAX_ROM_SIZE); + + if (0 == TotalFileSize) + return FALSE; + else CheckForIPSPatch(slot1name, HeaderCount != 0, TotalFileSize); + ROMOffset1 = &ROM[offset]; + Slot1Size = TotalFileSize; + } + int32 temp = offset; + for (; offset < temp + TotalFileSize; offset += 0x100000); + + if (slot2name[0] != '\0') + { + TotalFileSize = FileLoader(ROM + offset, slot2name, MAX_ROM_SIZE); + + if (0 == TotalFileSize) + return FALSE; + else CheckForIPSPatch(slot2name, HeaderCount != 0, TotalFileSize); + ROMOffset2 = &ROM[offset]; + Slot2Size = TotalFileSize; + } + + InitROM(FALSE); + S9xLoadCheatFile(S9xGetFilename(".cht")); + S9xInitCheatData(); + S9xApplyCheats(); + + S9xReset(); + + return (TRUE); } bool8 SufamiTurboBIOSSig(uint8* file, int32 size) { - if(!strcmp((char*)file, "BANDAI SFC-ADX")&&!strcmp((char*)(file+0x10), "SFC-ADX BACKUP")) - { - //possible match. - //check size - if(size!=0x40000) - return FALSE; - //and CRC32 - if(0x9B4CA911==caCRC32(file, size, 0xFFFFFFFF)) - { - return TRUE; - } - - } - return FALSE; + if (!strcmp((char*)file, "BANDAI SFC-ADX") + && !strcmp((char*)(file + 0x10), "SFC-ADX BACKUP")) + { + //possible match. + //check size + if (size != 0x40000) + return FALSE; + //and CRC32 + if (0x9B4CA911 == caCRC32(file, size, 0xFFFFFFFF)) + return TRUE; + + } + return FALSE; } bool8 SufamiTurboCartSig(uint8* file, int32 size) { - //test not a BIOS - if(!strcmp((char*)file, "BANDAI SFC-ADX")&&strcmp((char*)(file+0x10), "SFC-ADX BACKUP")) - { - //possible match. - //check size - if(size>0x100000||size <0x80000) - return FALSE; - //probably a minicart - return TRUE; - } - return FALSE; + //test not a BIOS + if (!strcmp((char*)file, "BANDAI SFC-ADX") + && strcmp((char*)(file + 0x10), "SFC-ADX BACKUP")) + { + //possible match. + //check size + if (size > 0x100000 || size < 0x80000) + return FALSE; + //probably a minicart + return TRUE; + } + return FALSE; } bool8 SameGameSig(uint8* file, int32 size) { - //preheader sig - if(strcmp((char*)(file+0xFFA0),"1995/12/16 10:2018ZS5J")) - return FALSE; - if(size!=0x100000) - return FALSE; - if(0x133E1C5B==caCRC32(file, size, 0xFFFFFFFF)) - return TRUE; - return FALSE; + //preheader sig + if (strcmp((char*)(file + 0xFFA0), "1995/12/16 10:2018ZS5J")) + return FALSE; + if (size != 0x100000) + return FALSE; + if (0x133E1C5B == caCRC32(file, size, 0xFFFFFFFF)) + return TRUE; + return FALSE; } bool8 GNextSig(uint8* file, int32 size) { - //preheader sig - if(strcmp((char*)(file+0xFFAA),"GNEXT B2ZX3J")) - return FALSE; - if(size!=0x180000) - return FALSE; - if(0x845E420D==caCRC32(file, size, 0xFFFFFFFF)) - return TRUE; - return FALSE; + //preheader sig + if (strcmp((char*)(file + 0xFFAA), "GNEXT B2ZX3J")) + return FALSE; + if (size != 0x180000) + return FALSE; + if (0x845E420D == caCRC32(file, size, 0xFFFFFFFF)) + return TRUE; + return FALSE; } int MultiType(uint8* file, int32 size) { - //check for ST signiture - if(SufamiTurboBIOSSig(file, size)) - return 1; - //check for Same Game signiture - if(SameGameSig(file, size)) - return 2; - //check for G-Next signiture - if(GNextSig(file, size)) - return 3; - return 0; + //check for ST signiture + if (SufamiTurboBIOSSig(file, size)) + return 1; + //check for Same Game signiture + if (SameGameSig(file, size)) + return 2; + //check for G-Next signiture + if (GNextSig(file, size)) + return 3; + return 0; } #endif //compatibility wrapper -void S9xDeinterleaveMode2 () +void S9xDeinterleaveMode2() { S9xDeinterleaveType2(TRUE); } -void S9xDeinterleaveType2 (bool8 reset) +void S9xDeinterleaveType2(bool8 reset) { - if(Settings.DisplayColor==0xffff||Settings.DisplayColor==BUILD_PIXEL(0,31,0)) - { - Settings.DisplayColor=BUILD_PIXEL(31,14,6); - SET_UI_COLOR(255,119,25); - - } - S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO, - "ROM image is in interleaved format - converting..."); - - int nblocks = Memory.CalculatedSize >> 16; - int step = 64; - - while (nblocks <= step) - step >>= 1; - - nblocks = step; - uint8 blocks [256]; - int i; - - for (i = 0; i < nblocks * 2; i++) - { - blocks [i] = (i & ~0xF) | ((i & 3) << 2) | - ((i & 12) >> 2); - } + if (Settings.DisplayColor == 0xffff + || Settings.DisplayColor == BUILD_PIXEL(0, 31, 0)) + { + Settings.DisplayColor = BUILD_PIXEL(31, 14, 6); + SET_UI_COLOR(255, 119, 25); + + } + S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, + "ROM image is in interleaved format - converting..."); + + int nblocks = Memory.CalculatedSize >> 16; + int step = 64; + + while (nblocks <= step) + step >>= 1; + + nblocks = step; + uint8 blocks [256]; + int i; + + for (i = 0; i < nblocks * 2; i++) + { + blocks [i] = (i & ~0xF) | ((i & 3) << 2) | + ((i & 12) >> 2); + } #ifdef DS2_DMA - unsigned int TmpAdj; - uint8 *tmp = (uint8 *) AlignedMalloc (0x10000, 32, &TmpAdj); + unsigned int TmpAdj; + uint8* tmp = (uint8*) AlignedMalloc(0x10000, 32, &TmpAdj); #else - uint8 *tmp = (uint8 *) malloc (0x10000); + uint8* tmp = (uint8*) malloc(0x10000); #endif - - if (tmp) - { + + if (tmp) + { #ifdef DS2_DMA - __dcache_writeback_all(); + __dcache_writeback_all(); #endif - for (i = 0; i < nblocks * 2; i++) - { + for (i = 0; i < nblocks * 2; i++) + { int j; for (j = i; j < nblocks * 2; j++) - { - if (blocks [j] == i) - { + { + if (blocks [j] == i) + { #ifdef DS2_DMA - ds2_DMAcopy_32Byte (2 /* channel: emu internal */, tmp, &Memory.ROM [blocks [j] * 0x10000], 0x10000); - ds2_DMA_wait(2); - ds2_DMA_stop(2); - - ds2_DMAcopy_32Byte (2 /* channel: emu internal */, &Memory.ROM [blocks [j] * 0x10000], - &Memory.ROM [blocks [i] * 0x10000], 0x10000); - ds2_DMA_wait(2); - ds2_DMA_stop(2); - - ds2_DMAcopy_32Byte (2 /* channel: emu internal */, &Memory.ROM [blocks [i] * 0x10000], tmp, 0x10000); - ds2_DMA_wait(2); - ds2_DMA_stop(2); + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, tmp, + &Memory.ROM [blocks [j] * 0x10000], 0x10000); + ds2_DMA_wait(2); + ds2_DMA_stop(2); + + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, + &Memory.ROM [blocks [j] * 0x10000], + &Memory.ROM [blocks [i] * 0x10000], 0x10000); + ds2_DMA_wait(2); + ds2_DMA_stop(2); + + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, + &Memory.ROM [blocks [i] * 0x10000], tmp, 0x10000); + ds2_DMA_wait(2); + ds2_DMA_stop(2); #else - // memmove converted: Different mallocs [Neb] - memcpy (tmp, &Memory.ROM [blocks [j] * 0x10000], 0x10000); - - // memmove converted: Different addresses, or identical if blocks[i] == blocks[j] [Neb] - memcpy (&Memory.ROM [blocks [j] * 0x10000], - &Memory.ROM [blocks [i] * 0x10000], 0x10000); - // memmove converted: Different mallocs [Neb] - memcpy (&Memory.ROM [blocks [i] * 0x10000], tmp, 0x10000); + // memmove converted: Different mallocs [Neb] + memcpy(tmp, &Memory.ROM [blocks [j] * 0x10000], 0x10000); + + // memmove converted: Different addresses, or identical if blocks[i] == blocks[j] [Neb] + memcpy(&Memory.ROM [blocks [j] * 0x10000], + &Memory.ROM [blocks [i] * 0x10000], 0x10000); + // memmove converted: Different mallocs [Neb] + memcpy(&Memory.ROM [blocks [i] * 0x10000], tmp, 0x10000); #endif - uint8 b = blocks [j]; - blocks [j] = blocks [i]; - blocks [i] = b; - break; - } - } - } - free ((char *) tmp); - tmp=NULL; - } - if(reset) - { - InitROM (FALSE); - S9xReset (); - } + uint8 b = blocks [j]; + blocks [j] = blocks [i]; + blocks [i] = b; + break; + } + } + } + free((char*) tmp); + tmp = NULL; + } + if (reset) + { + InitROM(FALSE); + S9xReset(); + } } //CRC32 for char arrays -uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32) +uint32 caCRC32(uint8* array, uint32 size, register uint32 crc32) { register uint32 i; - for (i = 0; i < size; i++) - { - crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ array[i]) & 0xFF]; - } - return ~crc32; + for (i = 0; i < size; i++) + crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ array[i]) & 0xFF]; + return ~crc32; } -void InitROM (bool8 Interleaved) +void InitROM(bool8 Interleaved) { #ifndef ZSNES_FX - SuperFX.nRomBanks = Memory.CalculatedSize >> 15; + SuperFX.nRomBanks = Memory.CalculatedSize >> 15; #endif - Settings.MultiPlayer5Master = Settings.MultiPlayer5; - Settings.MouseMaster = Settings.Mouse; - Settings.SuperScopeMaster = Settings.SuperScope; - Settings.DSP1Master = Settings.ForceDSP1; - Settings.SuperFX = FALSE; - Settings.SA1 = FALSE; - Settings.C4 = FALSE; - Settings.SDD1 = FALSE; - Settings.SRTC = FALSE; - Settings.SPC7110=FALSE; - Settings.SPC7110RTC=FALSE; - Settings.BS=FALSE; - Settings.OBC1=FALSE; - Settings.SETA=FALSE; - s7r.DataRomSize = 0; - Memory.CalculatedChecksum=0; - uint8* RomHeader; - - RomHeader=Memory.ROM+0x7FB0; - - if(Memory.ExtendedFormat==BIGFIRST) - RomHeader+=0x400000; - - if(Memory.HiROM) - RomHeader+=0x8000; - - if(!Settings.BS) - { - Settings.BS=(-1!=is_bsx(Memory.ROM+0x7FC0)); - - if(Settings.BS) - { - Memory.LoROM=TRUE; - Memory.HiROM=FALSE; - } - - else - { - Settings.BS=(-1!=is_bsx(Memory.ROM+0xFFC0)); - if(Settings.BS) - { - Memory.HiROM=TRUE; - Memory.LoROM=FALSE; - } - } - } - - ZeroMemory (Memory.BlockIsRAM, MEMMAP_NUM_BLOCKS); - ZeroMemory (Memory.BlockIsROM, MEMMAP_NUM_BLOCKS); - - Memory.SRAM = Memory.SRAM; - memset (Memory.ROMId, 0, 5); - memset (Memory.CompanyId, 0, 3); - - ParseSNESHeader(RomHeader); - - // Try to auto-detect the DSP1 chip - if (!Settings.ForceNoDSP1 && + Settings.MultiPlayer5Master = Settings.MultiPlayer5; + Settings.MouseMaster = Settings.Mouse; + Settings.SuperScopeMaster = Settings.SuperScope; + Settings.DSP1Master = Settings.ForceDSP1; + Settings.SuperFX = FALSE; + Settings.SA1 = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + Settings.SRTC = FALSE; + Settings.SPC7110 = FALSE; + Settings.SPC7110RTC = FALSE; + Settings.BS = FALSE; + Settings.OBC1 = FALSE; + Settings.SETA = FALSE; + s7r.DataRomSize = 0; + Memory.CalculatedChecksum = 0; + uint8* RomHeader; + + RomHeader = Memory.ROM + 0x7FB0; + + if (Memory.ExtendedFormat == BIGFIRST) + RomHeader += 0x400000; + + if (Memory.HiROM) + RomHeader += 0x8000; + + if (!Settings.BS) + { + Settings.BS = (-1 != is_bsx(Memory.ROM + 0x7FC0)); + + if (Settings.BS) + { + Memory.LoROM = TRUE; + Memory.HiROM = FALSE; + } + + else + { + Settings.BS = (-1 != is_bsx(Memory.ROM + 0xFFC0)); + if (Settings.BS) + { + Memory.HiROM = TRUE; + Memory.LoROM = FALSE; + } + } + } + + ZeroMemory(Memory.BlockIsRAM, MEMMAP_NUM_BLOCKS); + ZeroMemory(Memory.BlockIsROM, MEMMAP_NUM_BLOCKS); + + Memory.SRAM = Memory.SRAM; + memset(Memory.ROMId, 0, 5); + memset(Memory.CompanyId, 0, 3); + + ParseSNESHeader(RomHeader); + + // Try to auto-detect the DSP1 chip + if (!Settings.ForceNoDSP1 && (Memory.ROMType & 0xf) >= 3 && (Memory.ROMType & 0xf0) == 0) - Settings.DSP1Master = TRUE; - - if (Memory.HiROM) - { - // Enable S-RTC (Real Time Clock) emulation for Dai Kaijyu Monogatari 2 - Settings.SRTC = ((Memory.ROMType & 0xf0) >> 4) == 5; - - if(((Memory.ROMSpeed&0x0F)==0x0A)&&((Memory.ROMType&0xF0)==0xF0)) - { - Settings.SPC7110=true; - if((Memory.ROMType&0x0F)==0x09) - Settings.SPC7110RTC=true; - } - - if (Settings.BS) - BSHiROMMap (); - else if(Settings.SPC7110) - { - SPC7110HiROMMap(); - } + Settings.DSP1Master = TRUE; + + if (Memory.HiROM) + { + // Enable S-RTC (Real Time Clock) emulation for Dai Kaijyu Monogatari 2 + Settings.SRTC = ((Memory.ROMType & 0xf0) >> 4) == 5; + + if (((Memory.ROMSpeed & 0x0F) == 0x0A) && ((Memory.ROMType & 0xF0) == 0xF0)) + { + Settings.SPC7110 = true; + if ((Memory.ROMType & 0x0F) == 0x09) + Settings.SPC7110RTC = true; + } + + if (Settings.BS) + BSHiROMMap(); + else if (Settings.SPC7110) + SPC7110HiROMMap(); else if ((Memory.ROMSpeed & ~0x10) == 0x25) - { - TalesROMMap (Interleaved); - } - else HiROMMap (); - } - else - { - Settings.SuperFX = Settings.ForceSuperFX; - - if(Memory.ROMType==0x25) - { - Settings.OBC1=TRUE; - } - - //BS-X BIOS - if(Memory.ROMType==0xE5) - { - Settings.BS=TRUE; - } + TalesROMMap(Interleaved); + else HiROMMap(); + } + else + { + Settings.SuperFX = Settings.ForceSuperFX; + + if (Memory.ROMType == 0x25) + Settings.OBC1 = TRUE; + + //BS-X BIOS + if (Memory.ROMType == 0xE5) + Settings.BS = TRUE; if ((Memory.ROMType & 0xf0) == 0x10) - Settings.SuperFX = !Settings.ForceNoSuperFX; - - Settings.SDD1 = Settings.ForceSDD1; + Settings.SuperFX = !Settings.ForceNoSuperFX; + + Settings.SDD1 = Settings.ForceSDD1; if ((Memory.ROMType & 0xf0) == 0x40) - Settings.SDD1 = !Settings.ForceNoSDD1; - - if (Settings.SDD1) - S9xLoadSDD1Data (); - - if(((Memory.ROMType &0xF0) == 0xF0)&((Memory.ROMSpeed&0x0F)!=5)) - { - Memory.SRAMSize=2; - SNESGameFixes.SRAMInitialValue = 0x00; - if((Memory.ROMType &0x0F)==6) - { - if(Memory.ROM[0x7FD7]==0x09) - { - Settings.SETA=ST_011; - SetSETA=&S9xSetST011; - GetSETA=&S9xGetST011; - } - else - { - Settings.SETA=ST_010; - SetSETA=&S9xSetST010; - GetSETA=&S9xGetST010; - } - } - else - { - Settings.SETA=ST_018; - Memory.SRAMSize=2; - } - } - Settings.C4 = Settings.ForceC4; + Settings.SDD1 = !Settings.ForceNoSDD1; + + if (Settings.SDD1) + S9xLoadSDD1Data(); + + if (((Memory.ROMType & 0xF0) == 0xF0) & ((Memory.ROMSpeed & 0x0F) != 5)) + { + Memory.SRAMSize = 2; + SNESGameFixes.SRAMInitialValue = 0x00; + if ((Memory.ROMType & 0x0F) == 6) + { + if (Memory.ROM[0x7FD7] == 0x09) + { + Settings.SETA = ST_011; + SetSETA = &S9xSetST011; + GetSETA = &S9xGetST011; + } + else + { + Settings.SETA = ST_010; + SetSETA = &S9xSetST010; + GetSETA = &S9xGetST010; + } + } + else + { + Settings.SETA = ST_018; + Memory.SRAMSize = 2; + } + } + Settings.C4 = Settings.ForceC4; if ((Memory.ROMType & 0xf0) == 0xf0 && - (strncmp (Memory.ROMName, "MEGAMAN X", 9) == 0 || - strncmp (Memory.ROMName, "ROCKMAN X", 9) == 0)) - { - Settings.C4 = !Settings.ForceNoC4; - } - - if(Settings.SETA&&Settings.SETA!=ST_018) - { - SetaDSPMap(); - } - else if (Settings.SuperFX) - { - //::SRAM = ROM + 1024 * 1024 * 4; - SuperFXROMMap (); - Settings.MultiPlayer5Master = FALSE; - //Settings.MouseMaster = FALSE; - //Settings.SuperScopeMaster = FALSE; - Settings.DSP1Master = FALSE; - Settings.SA1 = FALSE; - Settings.C4 = FALSE; - Settings.SDD1 = FALSE; - } - else if (Settings.ForceSA1 || - (!Settings.ForceNoSA1 && (Memory.ROMSpeed & ~0x10) == 0x23 && - (Memory.ROMType & 0xf) > 3 && (Memory.ROMType & 0xf0) == 0x30)) - { - Settings.SA1 = TRUE; -// Settings.MultiPlayer5Master = FALSE; - //Settings.MouseMaster = FALSE; - //Settings.SuperScopeMaster = FALSE; - Settings.DSP1Master = FALSE; - Settings.C4 = FALSE; - Settings.SDD1 = FALSE; - SA1ROMMap (); - } + (strncmp(Memory.ROMName, "MEGAMAN X", 9) == 0 || + strncmp(Memory.ROMName, "ROCKMAN X", 9) == 0)) + Settings.C4 = !Settings.ForceNoC4; + + if (Settings.SETA && Settings.SETA != ST_018) + SetaDSPMap(); + else if (Settings.SuperFX) + { + //::SRAM = ROM + 1024 * 1024 * 4; + SuperFXROMMap(); + Settings.MultiPlayer5Master = FALSE; + //Settings.MouseMaster = FALSE; + //Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + Settings.SA1 = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + } + else if (Settings.ForceSA1 || + (!Settings.ForceNoSA1 && (Memory.ROMSpeed & ~0x10) == 0x23 && + (Memory.ROMType & 0xf) > 3 && (Memory.ROMType & 0xf0) == 0x30)) + { + Settings.SA1 = TRUE; + // Settings.MultiPlayer5Master = FALSE; + //Settings.MouseMaster = FALSE; + //Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + SA1ROMMap(); + } else if ((Memory.ROMSpeed & ~0x10) == 0x25) - TalesROMMap (Interleaved); - else if(Memory.ExtendedFormat!=NOPE) - JumboLoROMMap(Interleaved); - else if (strncmp ((char *) &Memory.ROM [0x7fc0], "SOUND NOVEL-TCOOL", 17) == 0 || - strncmp ((char *) &Memory.ROM [0x7fc0], "DERBY STALLION 96", 17) == 0) - { - LoROM24MBSMap (); - Settings.DSP1Master = FALSE; - } - - else if (strncmp ((char *) &Memory.ROM [0x7fc0], "THOROUGHBRED BREEDER3", 21) == 0 || - strncmp ((char *) &Memory.ROM [0x7fc0], "RPG-TCOOL 2", 11) == 0) - { - SRAM512KLoROMMap (); - Settings.DSP1Master = FALSE; - } - else if (strncmp ((char *) &Memory.ROM [0x7fc0], "ADD-ON BASE CASSETE", 19) == 0) - { - Settings.MultiPlayer5Master = FALSE; - Settings.MouseMaster = FALSE; - Settings.SuperScopeMaster = FALSE; - Settings.DSP1Master = FALSE; - SufamiTurboLoROMMap(); - Memory.SRAMSize = 3; - } + TalesROMMap(Interleaved); + else if (Memory.ExtendedFormat != NOPE) + JumboLoROMMap(Interleaved); + else if (strncmp((char*) &Memory.ROM [0x7fc0], "SOUND NOVEL-TCOOL", 17) == 0 || + strncmp((char*) &Memory.ROM [0x7fc0], "DERBY STALLION 96", 17) == 0) + { + LoROM24MBSMap(); + Settings.DSP1Master = FALSE; + } + + else if (strncmp((char*) &Memory.ROM [0x7fc0], "THOROUGHBRED BREEDER3", + 21) == 0 || + strncmp((char*) &Memory.ROM [0x7fc0], "RPG-TCOOL 2", 11) == 0) + { + SRAM512KLoROMMap(); + Settings.DSP1Master = FALSE; + } + else if (strncmp((char*) &Memory.ROM [0x7fc0], "ADD-ON BASE CASSETE", 19) == 0) + { + Settings.MultiPlayer5Master = FALSE; + Settings.MouseMaster = FALSE; + Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + SufamiTurboLoROMMap(); + Memory.SRAMSize = 3; + } else if ((Memory.ROMSpeed & ~0x10) == 0x22 && - strncmp (Memory.ROMName, "Super Street Fighter", 20) != 0) - { - AlphaROMMap (); - } - else if (Settings.BS) - BSLoROMMap(); - else LoROMMap (); - } - - if(Settings.BS) - { - Memory.ROMRegion=0; - } - - uint32 sum1 = 0; - uint32 sum2 = 0; - if(0==Memory.CalculatedChecksum) - { - int power2 = 0; + strncmp(Memory.ROMName, "Super Street Fighter", 20) != 0) + AlphaROMMap(); + else if (Settings.BS) + BSLoROMMap(); + else LoROMMap(); + } + + if (Settings.BS) + Memory.ROMRegion = 0; + + uint32 sum1 = 0; + uint32 sum2 = 0; + if (0 == Memory.CalculatedChecksum) + { + int power2 = 0; int size = Memory.CalculatedSize; - - while (size >>= 1) - power2++; - - size = 1 << power2; + + while (size >>= 1) + power2++; + + size = 1 << power2; uint32 remainder = Memory.CalculatedSize - size; - - - int i; - - for (i = 0; i < size; i++) + + + int i; + + for (i = 0; i < size; i++) sum1 += Memory.ROM [i]; - - for (i = 0; i < (int) remainder; i++) + + for (i = 0; i < (int) remainder; i++) sum2 += Memory.ROM [size + i]; - - int sub = 0; - if (Settings.BS&& Memory.ROMType!=0xE5) - { - if (Memory.HiROM) - { - for (i = 0; i < 48; i++) + + int sub = 0; + if (Settings.BS && Memory.ROMType != 0xE5) + { + if (Memory.HiROM) + { + for (i = 0; i < 48; i++) sub += Memory.ROM[0xffb0 + i]; - } - else if (Memory.LoROM) - { - for (i = 0; i < 48; i++) + } + else if (Memory.LoROM) + { + for (i = 0; i < 48; i++) sub += Memory.ROM[0x7fb0 + i]; - } - sum1 -= sub; - } - - - if (remainder) - { - sum1 += sum2 * (size / remainder); - } - - - sum1 &= 0xffff; - Memory.CalculatedChecksum=sum1; - } - //now take a CRC32 - Memory.ROMCRC32 = caCRC32(Memory.ROM, Memory.CalculatedSize, 0xFFFFFFFF); - - if (Settings.ForceNTSC) - Settings.PAL = FALSE; - else if (Settings.ForcePAL) - Settings.PAL = TRUE; - else - { - //Korea refers to South Korea, which uses NTSC - switch(Memory.ROMRegion) - { - case 13: - case 1: - case 0: - Settings.PAL=FALSE; - break; - default: Settings.PAL=TRUE; - break; - } - } - if (Settings.PAL) - { - Settings.FrameTime = Settings.FrameTimePAL; - Memory.ROMFramesPerSecond = 50; - } - else - { - Settings.FrameTime = Settings.FrameTimeNTSC; - Memory.ROMFramesPerSecond = 60; - } - + } + sum1 -= sub; + } + + + if (remainder) + sum1 += sum2 * (size / remainder); + + + sum1 &= 0xffff; + Memory.CalculatedChecksum = sum1; + } + //now take a CRC32 + Memory.ROMCRC32 = caCRC32(Memory.ROM, Memory.CalculatedSize, 0xFFFFFFFF); + + if (Settings.ForceNTSC) + Settings.PAL = FALSE; + else if (Settings.ForcePAL) + Settings.PAL = TRUE; + else + { + //Korea refers to South Korea, which uses NTSC + switch (Memory.ROMRegion) + { + case 13: + case 1: + case 0: + Settings.PAL = FALSE; + break; + default: + Settings.PAL = TRUE; + break; + } + } + if (Settings.PAL) + { + Settings.FrameTime = Settings.FrameTimePAL; + Memory.ROMFramesPerSecond = 50; + } + else + { + Settings.FrameTime = Settings.FrameTimeNTSC; + Memory.ROMFramesPerSecond = 60; + } + Memory.ROMName[ROM_NAME_LEN - 1] = 0; - if (strlen (Memory.ROMName)) - { - char *p = Memory.ROMName + strlen (Memory.ROMName) - 1; - + if (strlen(Memory.ROMName)) + { + char* p = Memory.ROMName + strlen(Memory.ROMName) - 1; + while (p > Memory.ROMName && *(p - 1) == ' ') - p--; - *p = 0; - } - - { + p--; + *p = 0; + } + + { Memory.SRAMMask = Memory.SRAMSize ? - ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; - } - if((Memory.ROMChecksum + Memory.ROMComplementChecksum != 0xffff) || Memory.ROMChecksum != Memory.CalculatedChecksum || ((uint32)Memory.CalculatedSize > (uint32)(((1<<(Memory.ROMSize-7))*128)*1024))) - { - if(Settings.DisplayColor==0xffff || Settings.DisplayColor!=BUILD_PIXEL(31,0,0)) - { - Settings.DisplayColor=BUILD_PIXEL(31,31,0); - SET_UI_COLOR(255,255,0); - } - } - - IAPU.OneCycle = ONE_APU_CYCLE; - Settings.Shutdown = Settings.ShutdownMaster; - - SetDSP=&DSP1SetByte; - GetDSP=&DSP1GetByte; - - ResetSpeedMap(); - ApplyROMFixes (); - sprintf (Memory.ROMName, "%s", Safe (Memory.ROMName)); - sprintf (Memory.ROMId, "%s", Safe (Memory.ROMId)); - sprintf (Memory.CompanyId, "%s", Safe (Memory.CompanyId)); - - sprintf (String, "\"%s\" [%s] %s, %s, Type: %s, Mode: %s, TV: %s, S-RAM: %s, ROMId: %s Company: %2.2s CRC32: %08X", - Memory.ROMName, - (Memory.ROMChecksum + Memory.ROMComplementChecksum != 0xffff || - Memory.ROMChecksum != Memory.CalculatedChecksum) ? "bad checksum" : "checksum ok", - MapType (), - Size (), - KartContents (), - MapMode (), - TVStandard (), - StaticRAMSize (), - Memory.ROMId, - Memory.CompanyId, - Memory.ROMCRC32); - - S9xMessage (S9X_INFO, S9X_ROM_INFO, String); + ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; + } + if ((Memory.ROMChecksum + Memory.ROMComplementChecksum != 0xffff) + || Memory.ROMChecksum != Memory.CalculatedChecksum + || ((uint32)Memory.CalculatedSize > (uint32)(((1 << (Memory.ROMSize - 7)) * 128) + * 1024))) + { + if (Settings.DisplayColor == 0xffff + || Settings.DisplayColor != BUILD_PIXEL(31, 0, 0)) + { + Settings.DisplayColor = BUILD_PIXEL(31, 31, 0); + SET_UI_COLOR(255, 255, 0); + } + } + + IAPU.OneCycle = ONE_APU_CYCLE; + Settings.Shutdown = Settings.ShutdownMaster; + + SetDSP = &DSP1SetByte; + GetDSP = &DSP1GetByte; + + ResetSpeedMap(); + ApplyROMFixes(); + sprintf(Memory.ROMName, "%s", Safe(Memory.ROMName)); + sprintf(Memory.ROMId, "%s", Safe(Memory.ROMId)); + sprintf(Memory.CompanyId, "%s", Safe(Memory.CompanyId)); + + sprintf(String, + "\"%s\" [%s] %s, %s, Type: %s, Mode: %s, TV: %s, S-RAM: %s, ROMId: %s Company: %2.2s CRC32: %08X", + Memory.ROMName, + (Memory.ROMChecksum + Memory.ROMComplementChecksum != 0xffff || + Memory.ROMChecksum != Memory.CalculatedChecksum) ? "bad checksum" : + "checksum ok", + MapType(), + Size(), + KartContents(), + MapMode(), + TVStandard(), + StaticRAMSize(), + Memory.ROMId, + Memory.CompanyId, + Memory.ROMCRC32); + + S9xMessage(S9X_INFO, S9X_ROM_INFO, String); #ifdef __WIN32__ - #ifndef _XBOX - EnableMenuItem(GUI.hMenu, IDM_ROM_INFO, MF_ENABLED); - #endif - #ifdef RTC_DEBUGGER - if(Settings.SPC7110RTC) - EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_ENABLED); - else EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_GRAYED); - #endif +#ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_ROM_INFO, MF_ENABLED); +#endif +#ifdef RTC_DEBUGGER + if (Settings.SPC7110RTC) + EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_ENABLED); + else EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_GRAYED); #endif - Settings.ForceHeader = Settings.ForceHiROM = Settings.ForceLoROM = - Settings.ForceInterleaved = Settings.ForceNoHeader = Settings.ForceNotInterleaved = - Settings.ForceInterleaved2=false; +#endif + Settings.ForceHeader = Settings.ForceHiROM = Settings.ForceLoROM = + Settings.ForceInterleaved = Settings.ForceNoHeader = + Settings.ForceNotInterleaved = + Settings.ForceInterleaved2 = false; } -bool8 LoadSRAM (const char *filename) +bool8 LoadSRAM(const char* filename) { - int size = Memory.SRAMSize ? - (1 << (Memory.SRAMSize + 3)) * 128 : 0; - - memset (Memory.SRAM, SNESGameFixes.SRAMInitialValue, 0x20000); - - if (size > 0x20000) - size = 0x20000; - - if (size) - { - FILE *file; - if ((file = fopen (filename, "rb"))) - { - int len = fread ((unsigned char*) Memory.SRAM, 1, 0x20000, file); - fclose (file); - if (len - size == 512) - { - // S-RAM file has a header - remove it - // memmove required: Overlapping addresses [Neb] - memmove (Memory.SRAM, Memory.SRAM + 512, size); - } - if (len == size + SRTC_SRAM_PAD) - { - S9xSRTCPostLoadState (); - S9xResetSRTC (); - rtc.index = -1; - rtc.mode = MODE_READ; - } - else - S9xHardResetSRTC (); - - if(Settings.SPC7110RTC) - { - S9xLoadSPC7110RTC (&rtc_f9); - } - - return (TRUE); - } - S9xHardResetSRTC (); - return (FALSE); - } - if (Settings.SDD1) - S9xSDD1LoadLoggedData (); - - return (TRUE); + int size = Memory.SRAMSize ? + (1 << (Memory.SRAMSize + 3)) * 128 : 0; + + memset(Memory.SRAM, SNESGameFixes.SRAMInitialValue, 0x20000); + + if (size > 0x20000) + size = 0x20000; + + if (size) + { + FILE* file; + if ((file = fopen(filename, "rb"))) + { + int len = fread((unsigned char*) Memory.SRAM, 1, 0x20000, file); + fclose(file); + if (len - size == 512) + { + // S-RAM file has a header - remove it + // memmove required: Overlapping addresses [Neb] + memmove(Memory.SRAM, Memory.SRAM + 512, size); + } + if (len == size + SRTC_SRAM_PAD) + { + S9xSRTCPostLoadState(); + S9xResetSRTC(); + rtc.index = -1; + rtc.mode = MODE_READ; + } + else + S9xHardResetSRTC(); + + if (Settings.SPC7110RTC) + S9xLoadSPC7110RTC(&rtc_f9); + + return (TRUE); + } + S9xHardResetSRTC(); + return (FALSE); + } + if (Settings.SDD1) + S9xSDD1LoadLoggedData(); + + return (TRUE); } -bool8 SaveSRAM (const char *filename) +bool8 SaveSRAM(const char* filename) { - if(Settings.SuperFX && Memory.ROMType < 0x15) - return TRUE; - if(Settings.SA1 && Memory.ROMType == 0x34) - return TRUE; - - int size = Memory.SRAMSize ? - (1 << (Memory.SRAMSize + 3)) * 128 : 0; - if (Settings.SRTC) - { - size += SRTC_SRAM_PAD; - S9xSRTCPreSaveState (); - } - - if (Settings.SDD1) - S9xSDD1SaveLoggedData (); - - if (size > 0x20000) - size = 0x20000; - - if (size && *Memory.ROMFilename) - { - - FILE *file= fopen(filename, "w"); - if (file) - { - fwrite((unsigned char *) Memory.SRAM, size, 1, file); - fclose(file); - if(Settings.SPC7110RTC) - { - S9xSaveSPC7110RTC (&rtc_f9); - } - - return (TRUE); - } - } - return (FALSE); + if (Settings.SuperFX && Memory.ROMType < 0x15) + return TRUE; + if (Settings.SA1 && Memory.ROMType == 0x34) + return TRUE; + + int size = Memory.SRAMSize ? + (1 << (Memory.SRAMSize + 3)) * 128 : 0; + if (Settings.SRTC) + { + size += SRTC_SRAM_PAD; + S9xSRTCPreSaveState(); + } + + if (Settings.SDD1) + S9xSDD1SaveLoggedData(); + + if (size > 0x20000) + size = 0x20000; + + if (size && *Memory.ROMFilename) + { + + FILE* file = fopen(filename, "w"); + if (file) + { + fwrite((unsigned char*) Memory.SRAM, size, 1, file); + fclose(file); + if (Settings.SPC7110RTC) + S9xSaveSPC7110RTC(&rtc_f9); + + return (TRUE); + } + } + return (FALSE); } -void FixROMSpeed () +void FixROMSpeed() { - int c; + int c; - if(CPU.FastROMSpeed==0) - CPU.FastROMSpeed=SLOW_ONE_CYCLE; - + if (CPU.FastROMSpeed == 0) + CPU.FastROMSpeed = SLOW_ONE_CYCLE; - for (c = 0x800; c < 0x1000; c++) - { - if (c&0x8 || c&0x400) + + for (c = 0x800; c < 0x1000; c++) + { + if (c & 0x8 || c & 0x400) Memory.MemorySpeed [c] = (uint8) CPU.FastROMSpeed; - } + } } void ResetSpeedMap() { - int i; + int i; memset(Memory.MemorySpeed, SLOW_ONE_CYCLE, 0x1000); - for(i=0;i<0x400;i+=0x10) - { - Memory.MemorySpeed[i+2]=Memory.MemorySpeed[0x800+i+2]= ONE_CYCLE; - Memory.MemorySpeed[i+3]=Memory.MemorySpeed[0x800+i+3]= ONE_CYCLE; - Memory.MemorySpeed[i+4]=Memory.MemorySpeed[0x800+i+4]= ONE_CYCLE; - Memory.MemorySpeed[i+5]=Memory.MemorySpeed[0x800+i+5]= ONE_CYCLE; - } - FixROMSpeed (); + for (i = 0; i < 0x400; i += 0x10) + { + Memory.MemorySpeed[i + 2] = Memory.MemorySpeed[0x800 + i + 2] = ONE_CYCLE; + Memory.MemorySpeed[i + 3] = Memory.MemorySpeed[0x800 + i + 3] = ONE_CYCLE; + Memory.MemorySpeed[i + 4] = Memory.MemorySpeed[0x800 + i + 4] = ONE_CYCLE; + Memory.MemorySpeed[i + 5] = Memory.MemorySpeed[0x800 + i + 5] = ONE_CYCLE; + } + FixROMSpeed(); } -void WriteProtectROM () +void WriteProtectROM() { - // memmove converted: Different mallocs [Neb] - memcpy ((void *) Memory.WriteMap, (void *) Memory.Map, sizeof (Memory.Map)); - int c; - for (c = 0; c < 0x1000; c++) - { + // memmove converted: Different mallocs [Neb] + memcpy((void*) Memory.WriteMap, (void*) Memory.Map, sizeof(Memory.Map)); + int c; + for (c = 0; c < 0x1000; c++) + { if (Memory.BlockIsROM [c]) - Memory.WriteMap [c] = (uint8 *) MAP_NONE; - } + Memory.WriteMap [c] = (uint8*) MAP_NONE; + } } -void MapRAM () +void MapRAM() { - int c; + int c; - if(Memory.LoROM&&!Settings.SDD1) - { - // Banks 70->77, S-RAM - for (c = 0; c < 0x0f; c++) - { + if (Memory.LoROM && !Settings.SDD1) + { + // Banks 70->77, S-RAM + for (c = 0; c < 0x0f; c++) + { int i; - for(i=0;i<8;i++) - { - Memory.Map [(c<<4) + 0xF00+i]=Memory.Map [(c<<4) + 0x700+i] = (uint8 *) MAP_LOROM_SRAM; - Memory.BlockIsRAM [(c<<4) + 0xF00+i] =Memory.BlockIsRAM [(c<<4) + 0x700+i] = TRUE; - Memory.BlockIsROM [(c<<4) + 0xF00+i] =Memory.BlockIsROM [(c<<4) + 0x700+i] = FALSE; - } - } - } - else if(Memory.LoROM&&Settings.SDD1) - { - // Banks 70->77, S-RAM - for (c = 0; c < 0x0f; c++) - { + for (i = 0; i < 8; i++) + { + Memory.Map [(c << 4) + 0xF00 + i] = Memory.Map [(c << 4) + 0x700 + i] = + (uint8*) MAP_LOROM_SRAM; + Memory.BlockIsRAM [(c << 4) + 0xF00 + i] = Memory.BlockIsRAM [(c << 4) + 0x700 + + i] = TRUE; + Memory.BlockIsROM [(c << 4) + 0xF00 + i] = Memory.BlockIsROM [(c << 4) + 0x700 + + i] = FALSE; + } + } + } + else if (Memory.LoROM && Settings.SDD1) + { + // Banks 70->77, S-RAM + for (c = 0; c < 0x0f; c++) + { int i; - for(i=0;i<8;i++) - { - Memory.Map [(c<<4) + 0x700+i] = (uint8 *) MAP_LOROM_SRAM; - Memory.BlockIsRAM [(c<<4) + 0x700+i] = TRUE; - Memory.BlockIsROM [(c<<4) + 0x700+i] = FALSE; - } - } - } - // Banks 7e->7f, RAM - for (c = 0; c < 16; c++) - { + for (i = 0; i < 8; i++) + { + Memory.Map [(c << 4) + 0x700 + i] = (uint8*) MAP_LOROM_SRAM; + Memory.BlockIsRAM [(c << 4) + 0x700 + i] = TRUE; + Memory.BlockIsROM [(c << 4) + 0x700 + i] = FALSE; + } + } + } + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = Memory.RAM; Memory.Map [c + 0x7f0] = Memory.RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; Memory.BlockIsROM [c + 0x7e0] = FALSE; Memory.BlockIsROM [c + 0x7f0] = FALSE; - } - WriteProtectROM (); + } + WriteProtectROM(); } -void MapExtraRAM () +void MapExtraRAM() { - int c; - - // Banks 7e->7f, RAM - for (c = 0; c < 16; c++) - { + int c; + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = Memory.RAM; Memory.Map [c + 0x7f0] = Memory.RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; Memory.BlockIsROM [c + 0x7e0] = FALSE; Memory.BlockIsROM [c + 0x7f0] = FALSE; - } - - // Banks 70->73, S-RAM - for (c = 0; c < 16; c++) - { + } + + // Banks 70->73, S-RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x700] = Memory.SRAM; Memory.Map [c + 0x710] = Memory.SRAM + 0x8000; Memory.Map [c + 0x720] = Memory.SRAM + 0x10000; Memory.Map [c + 0x730] = Memory.SRAM + 0x18000; - + Memory.BlockIsRAM [c + 0x700] = TRUE; Memory.BlockIsROM [c + 0x700] = FALSE; Memory.BlockIsRAM [c + 0x710] = TRUE; @@ -1823,2631 +1829,2636 @@ void MapExtraRAM () Memory.BlockIsROM [c + 0x720] = FALSE; Memory.BlockIsRAM [c + 0x730] = TRUE; Memory.BlockIsROM [c + 0x730] = FALSE; - } + } } -void LoROMMap () +void LoROMMap() { - int c; - int i; - int j; - int mask[4]; - for (j=0; j<4; j++) - mask[j]=0x00ff; - - mask[0]=(Memory.CalculatedSize/0x8000)-1; - - int x; - bool foundZeros; - bool pastZeros; - - for(j=0;j<3;j++) - { - x=1; - foundZeros=false; - pastZeros=false; - - mask[j+1]=mask[j]; - - while (x>0x100&&!pastZeros) - { - if(mask[j]&x) - { - x<<=1; - if(foundZeros) - pastZeros=true; - } - else - { - foundZeros=true; - pastZeros=false; - mask[j+1]|=x; - x<<=1; - } - } - } - - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + int j; + int mask[4]; + for (j = 0; j < 4; j++) + mask[j] = 0x00ff; + + mask[0] = (Memory.CalculatedSize / 0x8000) - 1; + + int x; + bool foundZeros; + bool pastZeros; + + for (j = 0; j < 3; j++) + { + x = 1; + foundZeros = false; + pastZeros = false; + + mask[j + 1] = mask[j]; + + while (x > 0x100 && !pastZeros) + { + if (mask[j]&x) + { + x <<= 1; + if (foundZeros) + pastZeros = true; + } + else + { + foundZeros = true; + pastZeros = false; + mask[j + 1] |= x; + x <<= 1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - if(Settings.SETA==ST_018) - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_SETA_RISC; - else Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - if (Settings.DSP1Master) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_DSP; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_DSP; - } - else if (Settings.C4) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_C4; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_C4; - } - else if(Settings.OBC1) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_OBC_RAM; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_OBC_RAM; - } - else - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; - } - - for (i = c + 8; i < c + 16; i++) - { - int e=3; - int d=c>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (((d)-1)*0x8000); + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + if (Settings.SETA == ST_018) + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_SETA_RISC; + else Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + if (Settings.DSP1Master) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_DSP; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_DSP; + } + else if (Settings.C4) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_C4; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_C4; + } + else if (Settings.OBC1) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_OBC_RAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_OBC_RAM; + } + else + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) bytes0x2000 - 0x6000; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) bytes0x2000 - 0x6000; + } + + for (i = c + 8; i < c + 16; i++) + { + int e = 3; + int d = c >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (((d) - 1) * 0x8000); Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - if (Settings.DSP1Master) - { - // Banks 30->3f and b0->bf - for (c = 0x300; c < 0x400; c += 16) - { - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = Memory.Map [i + 0x800] = (uint8 *) MAP_DSP; + } + } + + if (Settings.DSP1Master) + { + // Banks 30->3f and b0->bf + for (c = 0x300; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = Memory.Map [i + 0x800] = (uint8*) MAP_DSP; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = FALSE; - } - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) % Memory.CalculatedSize]; - - for (i = c + 8; i < c + 16; i++) - { - int e=3; - int d=(c+0x400)>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + (((d)-1)*0x8000); - } - - for (i = c; i < c + 16; i++) - { + } + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) % + Memory.CalculatedSize]; + + for (i = c + 8; i < c + 16; i++) + { + int e = 3; + int d = (c + 0x400) >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + ((( + d) - 1) * 0x8000); + } + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - if (Settings.DSP1Master) - { - for (c = 0; c < 0x100; c++) - { - Memory.Map [c + 0xe00] = (uint8 *) MAP_DSP; + } + + if (Settings.DSP1Master) + { + for (c = 0; c < 0x100; c++) + { + Memory.Map [c + 0xe00] = (uint8*) MAP_DSP; Memory.BlockIsROM [c + 0xe00] = FALSE; - } - } - - int sum=0, k,l, bankcount; - bankcount=1<<(Memory.ROMSize-7);//Mbits - - //safety for corrupt headers - if(bankcount > 128) - bankcount = (Memory.CalculatedSize/0x8000)/4; - bankcount*=4;//to banks - bankcount<<=4;//Map banks - bankcount+=0x800;//normalize - for(k=0x800;k<(bankcount);k+=16) - { - uint8* bank=0x8000+Memory.Map[k+8]; - for(l=0;l<0x8000;l++) - sum+=bank[l]; - } - Memory.CalculatedChecksum=sum&0xFFFF; - - MapRAM (); - WriteProtectROM (); + } + } + + int sum = 0, k, l, bankcount; + bankcount = 1 << (Memory.ROMSize - 7); //Mbits + + //safety for corrupt headers + if (bankcount > 128) + bankcount = (Memory.CalculatedSize / 0x8000) / 4; + bankcount *= 4; //to banks + bankcount <<= 4; //Map banks + bankcount += 0x800; //normalize + for (k = 0x800; k < (bankcount); k += 16) + { + uint8* bank = 0x8000 + Memory.Map[k + 8]; + for (l = 0; l < 0x8000; l++) + sum += bank[l]; + } + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } -void SetaDSPMap () +void SetaDSPMap() { - int c; - int i; - int j; - int mask[4]; - for (j=0; j<4; j++) - mask[j]=0x00ff; - - mask[0]=(Memory.CalculatedSize/0x8000)-1; - - int x; - bool foundZeros; - bool pastZeros; - - for(j=0;j<3;j++) - { - x=1; - foundZeros=false; - pastZeros=false; - - mask[j+1]=mask[j]; - - while (x>0x100&&!pastZeros) - { - if(mask[j]&x) - { - x<<=1; - if(foundZeros) - pastZeros=true; - } - else - { - foundZeros=true; - pastZeros=false; - mask[j+1]|=x; - x<<=1; - } - } - } - - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + int j; + int mask[4]; + for (j = 0; j < 4; j++) + mask[j] = 0x00ff; + + mask[0] = (Memory.CalculatedSize / 0x8000) - 1; + + int x; + bool foundZeros; + bool pastZeros; + + for (j = 0; j < 3; j++) + { + x = 1; + foundZeros = false; + pastZeros = false; + + mask[j + 1] = mask[j]; + + while (x > 0x100 && !pastZeros) + { + if (mask[j]&x) + { + x <<= 1; + if (foundZeros) + pastZeros = true; + } + else + { + foundZeros = true; + pastZeros = false; + mask[j + 1] |= x; + x <<= 1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; - - for (i = c + 8; i < c + 16; i++) - { - int e=3; - int d=c>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (((d)-1)*0x8000); + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) bytes0x2000 - 0x6000; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) bytes0x2000 - 0x6000; + + for (i = c + 8; i < c + 16; i++) + { + int e = 3; + int d = c >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (((d) - 1) * 0x8000); Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c + 8; i < c + 16; i++) - { - int e=3; - int d=(c+0x400)>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + (((d)-1)*0x8000); - } - - //only upper half is ROM - for (i = c+8; i < c + 16; i++) - { + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + int e = 3; + int d = (c + 0x400) >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + ((( + d) - 1) * 0x8000); + } + + //only upper half is ROM + for (i = c + 8; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - + } + memset(Memory.SRAM, 0, 0x1000); - for (c=0x600;c<0x680;c+=0x10) - { - for(i=0;i<0x08;i++) - { - //where does the SETA chip access, anyway? - //please confirm this? - Memory.Map[c+0x80+i]=(uint8*)MAP_SETA_DSP; - Memory.BlockIsROM [c+0x80+i] = FALSE; - Memory.BlockIsRAM [c+0x80+i] = TRUE; - } - - for(i=0;i<0x04;i++) - { - //and this! - Memory.Map[c+i]=(uint8*)MAP_SETA_DSP; - Memory.BlockIsROM [c+i] = FALSE; - } - } - - int sum=0, k,l, bankcount; - bankcount=1<<(Memory.ROMSize-7);//Mbits - //safety for corrupt headers - if(bankcount > 128) - bankcount = (Memory.CalculatedSize/0x8000)/4; - bankcount*=4;//to banks - bankcount<<=4;//Map banks - bankcount+=0x800;//normalize - for(k=0x800;k<(bankcount);k+=16) - { - uint8* bank=0x8000+Memory.Map[k+8]; - for(l=0;l<0x8000;l++) - sum+=bank[l]; - } - Memory.CalculatedChecksum=sum&0xFFFF; - - MapRAM (); - WriteProtectROM (); + for (c = 0x600; c < 0x680; c += 0x10) + { + for (i = 0; i < 0x08; i++) + { + //where does the SETA chip access, anyway? + //please confirm this? + Memory.Map[c + 0x80 + i] = (uint8*)MAP_SETA_DSP; + Memory.BlockIsROM [c + 0x80 + i] = FALSE; + Memory.BlockIsRAM [c + 0x80 + i] = TRUE; + } + + for (i = 0; i < 0x04; i++) + { + //and this! + Memory.Map[c + i] = (uint8*)MAP_SETA_DSP; + Memory.BlockIsROM [c + i] = FALSE; + } + } + + int sum = 0, k, l, bankcount; + bankcount = 1 << (Memory.ROMSize - 7); //Mbits + //safety for corrupt headers + if (bankcount > 128) + bankcount = (Memory.CalculatedSize / 0x8000) / 4; + bankcount *= 4; //to banks + bankcount <<= 4; //Map banks + bankcount += 0x800; //normalize + for (k = 0x800; k < (bankcount); k += 16) + { + uint8* bank = 0x8000 + Memory.Map[k + 8]; + for (l = 0; l < 0x8000; l++) + sum += bank[l]; + } + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } -void BSLoROMMap () +void BSLoROMMap() { - int c; - int i; - - if(Settings.BS) - Memory.SRAMSize=5; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + if (Settings.BS) + Memory.SRAMSize = 5; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; Memory.BlockIsRAM [c + 5] = Memory.BlockIsRAM [c + 0x805] = TRUE; - -// Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *)MAP_NONE; -// Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *)MAP_NONE; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; + + // Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *)MAP_NONE; + // Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *)MAP_NONE; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; Memory.BlockIsRAM [c + 6] = Memory.BlockIsRAM [c + 0x806] = TRUE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; Memory.BlockIsRAM [c + 7] = Memory.BlockIsRAM [c + 0x807] = TRUE; - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 11) % Memory.CalculatedSize] - 0x8000; + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 11) % + Memory.CalculatedSize] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - for(c=0;c<8;c++) - { - Memory.Map[(c<<4)+0x105]=(uint8*)MAP_LOROM_SRAM; - Memory.BlockIsROM [(c<<4)+0x105] = FALSE; - Memory.BlockIsRAM [(c<<4)+0x105] = TRUE; - } - - - /* // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) % CalculatedSize]; - - for (i = c + 8; i < c + 16; i++) - Map [i + 0x400] = Map [i + 0xc00] = &ROM [((c << 11) + 0x200000) % CalculatedSize - 0x8000]; - - for (i = c; i < c + 16; i++) - { - BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE; - } - } - */ - for(c=1;c<=4;c++) - { - for(i=0;i<16; i++) - { - Memory.Map[0x400+i+(c<<4)]=(uint8*)MAP_LOROM_SRAM; - Memory.BlockIsRAM[0x400+i+(c<<4)]=TRUE; - Memory.BlockIsROM[0x400+i+(c<<4)]=FALSE; - } - } - - for(i=0;i<0x80;i++) - { - Memory.Map[0x700+i]=&Memory.BSRAM[0x10000*(i/16)]; - Memory.BlockIsRAM[0x700+i]=TRUE; - Memory.BlockIsROM[0x700+i]=FALSE; - } - for (i=0; i<8;i++) - { - Memory.Map[0x205+(i<<4)]=Memory.Map[0x285+(i<<4)]=Memory.Map[0x305+(i<<4)]=Memory.Map[0x385+(i<<4)]=Memory.Map[0x705+(i<<4)]; - Memory.BlockIsRAM[0x205+(i<<4)]=Memory.BlockIsRAM[0x285+(i<<4)]=Memory.BlockIsRAM[0x305+(i<<4)]=Memory.BlockIsRAM[0x385+(i<<4)]=TRUE; - Memory.BlockIsROM[0x205+(i<<4)]=Memory.BlockIsROM[0x285+(i<<4)]=Memory.BlockIsROM[0x305+(i<<4)]=Memory.BlockIsROM[0x385+(i<<4)]=FALSE; - } - for(c=0;c<8;c++) - { - Memory.Map[(c<<4)+0x005]=Memory.BSRAM-0x5000; - Memory.BlockIsROM [(c<<4)+0x005] = FALSE; - Memory.BlockIsRAM [(c<<4)+0x005] = TRUE; - } - MapRAM (); - WriteProtectROM (); + } + } + + for (c = 0; c < 8; c++) + { + Memory.Map[(c << 4) + 0x105] = (uint8*)MAP_LOROM_SRAM; + Memory.BlockIsROM [(c << 4) + 0x105] = FALSE; + Memory.BlockIsRAM [(c << 4) + 0x105] = TRUE; + } + + + /* // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) % CalculatedSize]; + + for (i = c + 8; i < c + 16; i++) + Map [i + 0x400] = Map [i + 0xc00] = &ROM [((c << 11) + 0x200000) % CalculatedSize - 0x8000]; + + for (i = c; i < c + 16; i++) + { + BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE; + } + } + */ + for (c = 1; c <= 4; c++) + { + for (i = 0; i < 16; i++) + { + Memory.Map[0x400 + i + (c << 4)] = (uint8*)MAP_LOROM_SRAM; + Memory.BlockIsRAM[0x400 + i + (c << 4)] = TRUE; + Memory.BlockIsROM[0x400 + i + (c << 4)] = FALSE; + } + } + + for (i = 0; i < 0x80; i++) + { + Memory.Map[0x700 + i] = &Memory.BSRAM[0x10000 * (i / 16)]; + Memory.BlockIsRAM[0x700 + i] = TRUE; + Memory.BlockIsROM[0x700 + i] = FALSE; + } + for (i = 0; i < 8; i++) + { + Memory.Map[0x205 + (i << 4)] = Memory.Map[0x285 + (i << 4)] = Memory.Map[0x305 + + (i << 4)] = Memory.Map[0x385 + (i << 4)] = Memory.Map[0x705 + (i << 4)]; + Memory.BlockIsRAM[0x205 + (i << 4)] = Memory.BlockIsRAM[0x285 + + (i << 4)] = Memory.BlockIsRAM[0x305 + (i << 4)] = Memory.BlockIsRAM[0x385 + + (i << 4)] = TRUE; + Memory.BlockIsROM[0x205 + (i << 4)] = Memory.BlockIsROM[0x285 + + (i << 4)] = Memory.BlockIsROM[0x305 + (i << 4)] = Memory.BlockIsROM[0x385 + + (i << 4)] = FALSE; + } + for (c = 0; c < 8; c++) + { + Memory.Map[(c << 4) + 0x005] = Memory.BSRAM - 0x5000; + Memory.BlockIsROM [(c << 4) + 0x005] = FALSE; + Memory.BlockIsRAM [(c << 4) + 0x005] = TRUE; + } + MapRAM(); + WriteProtectROM(); } -void HiROMMap () +void HiROMMap() { - int i; - int c; - int j; + int i; + int c; + int j; - int mask[4]; - for (j=0; j<4; j++) - mask[j]=0x00ff; + int mask[4]; + for (j = 0; j < 4; j++) + mask[j] = 0x00ff; - mask[0]=(Memory.CalculatedSize/0x10000)-1; + mask[0] = (Memory.CalculatedSize / 0x10000) - 1; - if (Settings.ForceSA1 || + if (Settings.ForceSA1 || (!Settings.ForceNoSA1 && (Memory.ROMSpeed & ~0x10) == 0x23 && - (Memory.ROMType & 0xf) > 3 && (Memory.ROMType & 0xf0) == 0x30)) - { - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - } - - - int x; - bool foundZeros; - bool pastZeros; - - for(j=0;j<3;j++) - { - x=1; - foundZeros=false; - pastZeros=false; - - mask[j+1]=mask[j]; - - while (x>0x100&&!pastZeros) - { - if(mask[j]&x) - { - x<<=1; - if(foundZeros) - pastZeros=true; - } - else - { - foundZeros=true; - pastZeros=false; - mask[j+1]|=x; - x<<=1; - } - } - } - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + (Memory.ROMType & 0xf) > 3 && (Memory.ROMType & 0xf0) == 0x30)) + { + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + } + + + int x; + bool foundZeros; + bool pastZeros; + + for (j = 0; j < 3; j++) + { + x = 1; + foundZeros = false; + pastZeros = false; + + mask[j + 1] = mask[j]; + + while (x > 0x100 && !pastZeros) + { + if (mask[j]&x) + { + x <<= 1; + if (foundZeros) + pastZeros = true; + } + else + { + foundZeros = true; + pastZeros = false; + mask[j + 1] |= x; + x <<= 1; + } + } + } + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - - if (Settings.DSP1Master) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_DSP; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_DSP; - } - else - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - } - - for (i = c + 8; i < c + 16; i++) - { - int e=3; - int d=c>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (d*0x10000); + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + + if (Settings.DSP1Master) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_DSP; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_DSP; + } + else + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + } + + for (i = c + 8; i < c + 16; i++) + { + int e = 3; + int d = c >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + Memory.Map [i] = Memory.Map [i + 0x800] = Memory.ROM + (d * 0x10000); Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. - for (c = 0; c < 16; c++) - { - Memory.Map [0x306 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0x307 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0xb06 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0xb07 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; + } + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + Memory.Map [0x306 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0x307 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0xb06 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0xb07 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; Memory.BlockIsRAM [0x306 + (c << 4)] = TRUE; Memory.BlockIsRAM [0x307 + (c << 4)] = TRUE; Memory.BlockIsRAM [0xb06 + (c << 4)] = TRUE; Memory.BlockIsRAM [0xb07 + (c << 4)] = TRUE; - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { - int e=3; - int d=(c)>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + (d*0x10000); + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + int e = 3; + int d = (c) >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = Memory.ROM + (d * 0x10000); Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - int bankmax=0x40+ (1<<(Memory.ROMSize-6)); - //safety for corrupt headers - if(bankmax > 128) - bankmax = 0x80; - int sum=0; - for(i=0x40;i<bankmax; i++) - { - uint8 * bank_low=(uint8*)Memory.Map[i<<4]; - for (c=0;c<0x10000; c++) - { - sum+=bank_low[c]; - } - } - Memory.CalculatedChecksum=sum&0xFFFF; - - MapRAM (); - WriteProtectROM (); + } + } + + int bankmax = 0x40 + (1 << (Memory.ROMSize - 6)); + //safety for corrupt headers + if (bankmax > 128) + bankmax = 0x80; + int sum = 0; + for (i = 0x40; i < bankmax; i++) + { + uint8* bank_low = (uint8*)Memory.Map[i << 4]; + for (c = 0; c < 0x10000; c++) + sum += bank_low[c]; + } + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } -void TalesROMMap (bool8 Interleaved) +void TalesROMMap(bool8 Interleaved) { - int c; - int i; - - if(Interleaved) - { - if(Settings.DisplayColor==0xffff) - { - Settings.DisplayColor=BUILD_PIXEL(0,31,0); - SET_UI_COLOR(0,255,0); - } - } - uint32 OFFSET0 = 0x400000; - uint32 OFFSET1 = 0x400000; - uint32 OFFSET2 = 0x000000; - - if (Interleaved) - { - OFFSET0 = 0x000000; - OFFSET1 = 0x000000; - OFFSET2 = Memory.CalculatedSize-0x400000; //changed to work with interleaved DKJM2. - } - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + if (Interleaved) + { + if (Settings.DisplayColor == 0xffff) + { + Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); + SET_UI_COLOR(0, 255, 0); + } + } + uint32 OFFSET0 = 0x400000; + uint32 OFFSET1 = 0x400000; + uint32 OFFSET2 = 0x000000; + + if (Interleaved) + { + OFFSET0 = 0x000000; + OFFSET1 = 0x000000; + OFFSET2 = Memory.CalculatedSize - + 0x400000; //changed to work with interleaved DKJM2. + } + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - - //makes more sense to map the range here. - //ToP seems to use sram to skip intro??? - if(c>=0x300) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_HIROM_SRAM; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + + //makes more sense to map the range here. + //ToP seems to use sram to skip intro??? + if (c >= 0x300) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_HIROM_SRAM; Memory.BlockIsRAM [6 + c] = Memory.BlockIsRAM [7 + c] = - Memory.BlockIsRAM [0x806 + c]= Memory.BlockIsRAM [0x807 + c] = TRUE; - } - else - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - } - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize-0x400000)) + OFFSET0]; + Memory.BlockIsRAM [0x806 + c] = Memory.BlockIsRAM [0x807 + c] = TRUE; + } + else + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + } + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize - 0x400000)) + + OFFSET0]; Memory.Map [i + 0x800] = &Memory.ROM [((c << 12) % 0x400000) + OFFSET2]; Memory.BlockIsROM [i] = TRUE; Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - { - Memory.Map [i + 0x400] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize-0x400000)) + OFFSET1]; - Memory.Map [i + 0x408] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize-0x400000)) + OFFSET1]; - Memory.Map [i + 0xc00] = &Memory.ROM [((c << 12) %0x400000)+ OFFSET2]; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + { + Memory.Map [i + 0x400] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize - + 0x400000)) + OFFSET1]; + Memory.Map [i + 0x408] = &Memory.ROM [((c << 12) % (Memory.CalculatedSize - + 0x400000)) + OFFSET1]; + Memory.Map [i + 0xc00] = &Memory.ROM [((c << 12) % 0x400000) + OFFSET2]; Memory.Map [i + 0xc08] = &Memory.ROM [((c << 12) % 0x400000) + OFFSET2]; Memory.BlockIsROM [i + 0x400] = TRUE; Memory.BlockIsROM [i + 0x408] = TRUE; Memory.BlockIsROM [i + 0xc00] = TRUE; Memory.BlockIsROM [i + 0xc08] = TRUE; - } - } - - if((strncmp("TALES",(char*)Memory.Map[8]+0xFFC0, 5)==0)) - { - if(((*(Memory.Map[8]+0xFFDE))==(*(Memory.Map[0x808]+0xFFDE)))) - { - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - } - } - - Memory.ROMChecksum = *(Memory.Map[8]+0xFFDE) + (*(Memory.Map[8]+0xFFDF) << 8); - Memory.ROMComplementChecksum = *(Memory.Map[8]+0xFFDC) + (*(Memory.Map[8]+0xFFDD) << 8); - -int sum=0; -for(i=0x40;i<0x80; i++) -{ - uint8 * bank_low=(uint8*)Memory.Map[i<<4]; - uint8 * bank_high=(uint8*)Memory.Map[(i<<4)+0x800]; - for (c=0;c<0x10000; c++) - { - sum+=bank_low[c]; - sum+=bank_high[c]; - } -} + } + } + + if ((strncmp("TALES", (char*)Memory.Map[8] + 0xFFC0, 5) == 0)) + { + if (((*(Memory.Map[8] + 0xFFDE)) == (*(Memory.Map[0x808] + 0xFFDE)))) + { + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + } + } -Memory.CalculatedChecksum=sum&0xFFFF; + Memory.ROMChecksum = *(Memory.Map[8] + 0xFFDE) + (*(Memory.Map[8] + 0xFFDF) << + 8); + Memory.ROMComplementChecksum = *(Memory.Map[8] + 0xFFDC) + (* + (Memory.Map[8] + 0xFFDD) << 8); - MapRAM (); - WriteProtectROM (); + int sum = 0; + for (i = 0x40; i < 0x80; i++) + { + uint8* bank_low = (uint8*)Memory.Map[i << 4]; + uint8* bank_high = (uint8*)Memory.Map[(i << 4) + 0x800]; + for (c = 0; c < 0x10000; c++) + { + sum += bank_low[c]; + sum += bank_high[c]; + } + } + + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } -void AlphaROMMap () +void AlphaROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = TRUE; - } - } - - // Banks 40->7f and c0->ff - - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { + } + } + + // Banks 40->7f and c0->ff + + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { Memory.Map [i + 0x400] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - MapRAM (); - WriteProtectROM (); + } + } + + MapRAM(); + WriteProtectROM(); } void DetectSuperFxRamSize() { - if(Memory.ROM[0x7FDA]==0x33) - { - Memory.SRAMSize=Memory.ROM[0x7FBD]; - } - else - { - if(strncmp(Memory.ROMName, "STAR FOX 2", 10)==0) - { - Memory.SRAMSize=6; - } - else Memory.SRAMSize=5; - } + if (Memory.ROM[0x7FDA] == 0x33) + Memory.SRAMSize = Memory.ROM[0x7FBD]; + else + { + if (strncmp(Memory.ROMName, "STAR FOX 2", 10) == 0) + Memory.SRAMSize = 6; + else Memory.SRAMSize = 5; + } } -void SuperFXROMMap () +void SuperFXROMMap() { - int c; - int i; - - DetectSuperFxRamSize(); - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + DetectSuperFxRamSize(); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [0x006 + c] = Memory.Map [0x806 + c] = (uint8 *) Memory.SRAM - 0x6000; - Memory.Map [0x007 + c] = Memory.Map [0x807 + c] = (uint8 *) Memory.SRAM - 0x6000; - Memory.BlockIsRAM [0x006 + c] = Memory.BlockIsRAM [0x007 + c] = Memory.BlockIsRAM [0x806 + c] = Memory.BlockIsRAM [0x807 + c] = TRUE; - - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [0x006 + c] = Memory.Map [0x806 + c] = (uint8*) Memory.SRAM - 0x6000; + Memory.Map [0x007 + c] = Memory.Map [0x807 + c] = (uint8*) Memory.SRAM - 0x6000; + Memory.BlockIsRAM [0x006 + c] = Memory.BlockIsRAM [0x007 + c] = + Memory.BlockIsRAM [0x806 + c] = Memory.BlockIsRAM [0x807 + c] = TRUE; + + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % + Memory.CalculatedSize]; Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - // Banks 7e->7f, RAM - for (c = 0; c < 16; c++) - { + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = Memory.RAM; Memory.Map [c + 0x7f0] = Memory.RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; Memory.BlockIsROM [c + 0x7e0] = FALSE; Memory.BlockIsROM [c + 0x7f0] = FALSE; - } - - // Banks 70->71, S-RAM - for (c = 0; c < 32; c++) - { + } + + // Banks 70->71, S-RAM + for (c = 0; c < 32; c++) + { Memory.Map [c + 0x700] = Memory.SRAM + (((c >> 4) & 1) << 16); Memory.BlockIsRAM [c + 0x700] = TRUE; Memory.BlockIsROM [c + 0x700] = FALSE; - } - - // Replicate the first 2Mb of the ROM at ROM + 2MB such that each 32K - // block is repeated twice in each 64K block. + } + + // Replicate the first 2Mb of the ROM at ROM + 2MB such that each 32K + // block is repeated twice in each 64K block. #ifdef DS2_DMA - __dcache_writeback_all(); + __dcache_writeback_all(); #endif - for (c = 0; c < 64; c++) - { + for (c = 0; c < 64; c++) + { #ifdef DS2_DMA - ds2_DMAcopy_32Byte(2 /* channel: emu internal */, &ROM [0x200000 + c * 0x10000], &ROM [c * 0x8000], 0x8000); - ds2_DMAcopy_32Byte(3 /* channel: emu internal 2 */, &ROM [0x208000 + c * 0x10000], &ROM [c * 0x8000], 0x8000); - ds2_DMA_wait(2); - ds2_DMA_wait(3); - ds2_DMA_stop(2); - ds2_DMA_stop(3); + ds2_DMAcopy_32Byte(2 /* channel: emu internal */, &ROM [0x200000 + c * 0x10000], + &ROM [c * 0x8000], 0x8000); + ds2_DMAcopy_32Byte(3 /* channel: emu internal 2 */, + &ROM [0x208000 + c * 0x10000], &ROM [c * 0x8000], 0x8000); + ds2_DMA_wait(2); + ds2_DMA_wait(3); + ds2_DMA_stop(2); + ds2_DMA_stop(3); #else - // memmove converted: Different addresses [Neb] - memcpy (&Memory.ROM [0x200000 + c * 0x10000], &Memory.ROM [c * 0x8000], 0x8000); - // memmove converted: Different addresses [Neb] - memcpy (&Memory.ROM [0x208000 + c * 0x10000], &Memory.ROM [c * 0x8000], 0x8000); + // memmove converted: Different addresses [Neb] + memcpy(&Memory.ROM [0x200000 + c * 0x10000], &Memory.ROM [c * 0x8000], 0x8000); + // memmove converted: Different addresses [Neb] + memcpy(&Memory.ROM [0x208000 + c * 0x10000], &Memory.ROM [c * 0x8000], 0x8000); #endif - } - - WriteProtectROM (); + } + + WriteProtectROM(); } -void SA1ROMMap () +void SA1ROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) &Memory.FillRAM [0x3000] - 0x3000; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_BWRAM; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_BWRAM; - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) &Memory.FillRAM [0x3000] + - 0x3000; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_BWRAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_BWRAM; + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - Memory.Map [i + 0x400] = (uint8 *) &Memory.SRAM [(c << 12) & 0x1ffff]; - - for (i = c; i < c + 16; i++) - { + } + } + + // Banks 40->7f + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + Memory.Map [i + 0x400] = (uint8*) &Memory.SRAM [(c << 12) & 0x1ffff]; + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = FALSE; - } - } - - // c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { + } + + // c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - for (c = 0; c < 16; c++) - { + } + } + + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = Memory.RAM; Memory.Map [c + 0x7f0] = Memory.RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; Memory.BlockIsROM [c + 0x7e0] = FALSE; Memory.BlockIsROM [c + 0x7f0] = FALSE; - } - WriteProtectROM (); - - // Now copy the map and correct it for the SA1 CPU. - // memmove converted: Different mallocs [Neb] - memcpy ((void *) SA1.WriteMap, (void *) Memory.WriteMap, sizeof (Memory.WriteMap)); - // memmove converted: Different mallocs [Neb] - memcpy ((void *) SA1.Map, (void *) Memory.Map, sizeof (Memory.Map)); - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { - SA1.Map [c + 0] = SA1.Map [c + 0x800] = &Memory.FillRAM [0x3000]; - SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8 *) MAP_NONE; - SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &Memory.FillRAM [0x3000]; - SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8 *) MAP_NONE; - } - - // Banks 60->6f - for (c = 0; c < 0x100; c++) - SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8 *) MAP_BWRAM_BITMAP; - - Memory.BWRAM = Memory.SRAM; + } + WriteProtectROM(); + + // Now copy the map and correct it for the SA1 CPU. + // memmove converted: Different mallocs [Neb] + memcpy((void*) SA1.WriteMap, (void*) Memory.WriteMap, sizeof(Memory.WriteMap)); + // memmove converted: Different mallocs [Neb] + memcpy((void*) SA1.Map, (void*) Memory.Map, sizeof(Memory.Map)); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 0] = SA1.Map [c + 0x800] = &Memory.FillRAM [0x3000]; + SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8*) MAP_NONE; + SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &Memory.FillRAM [0x3000]; + SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8*) MAP_NONE; + } + + // Banks 60->6f + for (c = 0; c < 0x100; c++) + SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8*) MAP_BWRAM_BITMAP; + + Memory.BWRAM = Memory.SRAM; } -void LoROM24MBSMap () +void LoROM24MBSMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x200; c += 16) - { + } + } + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x200; c += 16) + { Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000 + 0x200000; Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000]; - - for (i = c + 8; i < c + 16; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000 - 0x8000]; - - for (i = c; i < c + 16; i++) - { + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - MapExtraRAM (); - WriteProtectROM (); + } + + MapExtraRAM(); + WriteProtectROM(); } -void SufamiTurboLoROMMap () +void SufamiTurboLoROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000]; - - for (i = c + 8; i < c + 16; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000 - 0x8000]; - - for (i = c; i < c + 16; i++) - { + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - if (Settings.DSP1Master) - { - for (c = 0; c < 0x100; c++) - { - Memory.Map [c + 0xe00] = (uint8 *) MAP_DSP; + } + + if (Settings.DSP1Master) + { + for (c = 0; c < 0x100; c++) + { + Memory.Map [c + 0xe00] = (uint8*) MAP_DSP; Memory.BlockIsROM [c + 0xe00] = FALSE; - } - } - - // Banks 7e->7f, RAM - for (c = 0; c < 16; c++) - { + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = Memory.RAM; Memory.Map [c + 0x7f0] = Memory.RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; Memory.BlockIsROM [c + 0x7e0] = FALSE; Memory.BlockIsROM [c + 0x7f0] = FALSE; - } - - // Banks 60->67, S-RAM - for (c = 0; c < 0x80; c++) - { - Memory.Map [c + 0x600] = (uint8 *) MAP_LOROM_SRAM; + } + + // Banks 60->67, S-RAM + for (c = 0; c < 0x80; c++) + { + Memory.Map [c + 0x600] = (uint8*) MAP_LOROM_SRAM; Memory.BlockIsRAM [c + 0x600] = TRUE; Memory.BlockIsROM [c + 0x600] = FALSE; - } - - WriteProtectROM (); + } + + WriteProtectROM(); } #if 0 //untested!! -void SameGameMap () +void SameGameMap() { - int i; - int c; - int j; - - int mask[4]; - int mask2[4]; - for (j=0; j<4; j++) - mask[j]=mask2[j]=0x00ff; - - mask[0]=(CalculatedSize/0x10000)-1; - mask2[0]=(Slot1Size/0x10000)-1; - - int x; - bool foundZeros; - bool pastZeros; - - for(j=0;j<3;j++) - { - x=1; - foundZeros=false; - pastZeros=false; - - mask[j+1]=mask[j]; - - while (x>0x100&&!pastZeros) - { - if(mask[j]&x) - { - x<<=1; - if(foundZeros) - pastZeros=true; - } - else - { - foundZeros=true; - pastZeros=false; - mask[j+1]|=x; - x<<=1; - } - } - } - - for(j=0;j<3;j++) - { - x=1; - foundZeros=false; - pastZeros=false; - - mask2[j+1]=mask2[j]; - - while (x>0x100&&!pastZeros) - { - if(mask2[j]&x) - { - x<<=1; - if(foundZeros) - pastZeros=true; - } - else - { - foundZeros=true; - pastZeros=false; - mask2[j+1]|=x; - x<<=1; - } - } - } - - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int i; + int c; + int j; + + int mask[4]; + int mask2[4]; + for (j = 0; j < 4; j++) + mask[j] = mask2[j] = 0x00ff; + + mask[0] = (CalculatedSize / 0x10000) - 1; + mask2[0] = (Slot1Size / 0x10000) - 1; + + int x; + bool foundZeros; + bool pastZeros; + + for (j = 0; j < 3; j++) + { + x = 1; + foundZeros = false; + pastZeros = false; + + mask[j + 1] = mask[j]; + + while (x > 0x100 && !pastZeros) + { + if (mask[j]&x) + { + x <<= 1; + if (foundZeros) + pastZeros = true; + } + else + { + foundZeros = true; + pastZeros = false; + mask[j + 1] |= x; + x <<= 1; + } + } + } + + for (j = 0; j < 3; j++) + { + x = 1; + foundZeros = false; + pastZeros = false; + + mask2[j + 1] = mask2[j]; + + while (x > 0x100 && !pastZeros) + { + if (mask2[j]&x) + { + x <<= 1; + if (foundZeros) + pastZeros = true; + } + else + { + foundZeros = true; + pastZeros = false; + mask2[j + 1] |= x; + x <<= 1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.Map [c + 1] = Memory.Map [c + 0x801] = RAM; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - } - - // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. - for (c = 0; c < 16; c++) - { - Memory.Map [0x306 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0x307 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0xb06 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0xb07 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + Memory.Map [0x306 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0x307 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0xb06 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0xb07 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; Memory.BlockIsRAM [0x306 + (c << 4)] = TRUE; Memory.BlockIsRAM [0x307 + (c << 4)] = TRUE; Memory.BlockIsRAM [0xb06 + (c << 4)] = TRUE; Memory.BlockIsRAM [0xb07 + (c << 4)] = TRUE; - } - - for c=0; c<0x200; c+=16) - { - for(i=0;i<8;i++) - { - int e=3; - int d=c>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - - int f=3; - int g=c>>4; - while(g>mask2[0]) - { - g&=mask2[f]; - f--; - } - - //stuff in HiROM areas - Memory.Map[c+0x400+i]=&ROM[d*0x10000]; - Memory.Map[c+0xC00+i]=&ROM[d*0x10000]; - //MINI - Memory.Map[c+0x600+i]=&ROMOffset1[g*0x10000]; - Memory.Map[c+0xE00+i]=&ROMOffset1[g*0x10000]; - - } - for(i=8;i<16;i++) - { - int e=3; - int d=c>>4; - while(d>mask[0]) - { - d&=mask[e]; - e--; - } - - int f=3; - int g=c>>4; - while(g>mask2[0]) - { - g&=mask2[f]; - f--; - } - - - //all stuff - //BASE - Memory.Map[c+i]=&ROM[d*0x10000]; - Memory.Map[c+0x800+i]=&ROM[d*0x10000]; - Memory.Map[c+0x400+i]=&ROM[d*0x10000]; - Memory.Map[c+0xC00+i]=&ROM[d*0x10000]; - //MINI - Memory.Map[c+0x200+i]=&ROMOffset1[g*0x10000]; - Memory.Map[c+0xA00+i]=&ROMOffset1[g*0x10000]; - Memory.Map[c+0x600+i]=&ROMOffset1[g*0x10000]; - Memory.Map[c+0xE00+i]=&ROMOffset1[g*0x10000]; - } - - } - - int bankmax=0x40+ (1<<(ROMSize-6)); - //safety for corrupt headers - if(bankmax > 128) - bankmax = 0x80; - int sum=0; - for(i=0x40;i<bankmax; i++) - { - uint8 * bank_low=(uint8*)Memory.Map[i<<4]; - for (c=0;c<0x10000; c++) - { - sum+=bank_low[c]; - } - } - CalculatedChecksum=sum&0xFFFF; - - MapRAM (); - WriteProtectROM (); + } + + for c = 0; +c < 0x200; +c += 16) +{ + for (i = 0; i < 8; i++) + { + int e = 3; + int d = c >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + + int f = 3; + int g = c >> 4; + while (g > mask2[0]) + { + g &= mask2[f]; + f--; + } + + //stuff in HiROM areas + Memory.Map[c + 0x400 + i] = &ROM[d * 0x10000]; + Memory.Map[c + 0xC00 + i] = &ROM[d * 0x10000]; + //MINI + Memory.Map[c + 0x600 + i] = &ROMOffset1[g * 0x10000]; + Memory.Map[c + 0xE00 + i] = &ROMOffset1[g * 0x10000]; + + } + for (i = 8; i < 16; i++) + { + int e = 3; + int d = c >> 4; + while (d > mask[0]) + { + d &= mask[e]; + e--; + } + + int f = 3; + int g = c >> 4; + while (g > mask2[0]) + { + g &= mask2[f]; + f--; + } + + + //all stuff + //BASE + Memory.Map[c + i] = &ROM[d * 0x10000]; + Memory.Map[c + 0x800 + i] = &ROM[d * 0x10000]; + Memory.Map[c + 0x400 + i] = &ROM[d * 0x10000]; + Memory.Map[c + 0xC00 + i] = &ROM[d * 0x10000]; + //MINI + Memory.Map[c + 0x200 + i] = &ROMOffset1[g * 0x10000]; + Memory.Map[c + 0xA00 + i] = &ROMOffset1[g * 0x10000]; + Memory.Map[c + 0x600 + i] = &ROMOffset1[g * 0x10000]; + Memory.Map[c + 0xE00 + i] = &ROMOffset1[g * 0x10000]; + } + + } + + int bankmax = 0x40 + (1 << (ROMSize - 6)); + //safety for corrupt headers + if (bankmax > 128) + bankmax = 0x80; + int sum = 0; + for (i = 0x40; i < bankmax; i++) +{ + uint8* bank_low = (uint8*)Memory.Map[i << 4]; + for (c = 0; c < 0x10000; c++) + sum += bank_low[c]; + } + CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } //Untested!! -void GNextROMMap () +void GNextROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) &Memory.FillRAM [0x3000] - 0x3000; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_BWRAM; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_BWRAM; - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) &Memory.FillRAM [0x3000] + - 0x3000; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_BWRAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_BWRAM; + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &ROM [c << 11] - 0x8000; - BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; - } - } - - - // Banks 40->4f (was 7f, but SNES docs and GNext overdumping shows nothing here.) - for (c = 0; c < 0x100; c += 16) - { - for (i = c; i < c + 16; i++) - Memory.Map [i + 0x400] = (uint8 *) &SRAM [(c << 12) & 0x1ffff]; - - for (i = c; i < c + 16; i++) - { - BlockIsROM [i + 0x400] = FALSE; - } - } - - for (c = 0; c < 0x100; c += 16) - { - for (i = c; i < c + 16; i++) - Memory.Map [i + 0x700] = (uint8 *) &ROMOffset1 [(c << 12) & (Slot1Size-1)]; - } - - // c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { + BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + } + } + + + // Banks 40->4f (was 7f, but SNES docs and GNext overdumping shows nothing here.) + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 16; i++) + Memory.Map [i + 0x400] = (uint8*) &SRAM [(c << 12) & 0x1ffff]; + + for (i = c; i < c + 16; i++) + BlockIsROM [i + 0x400] = FALSE; + } + + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 16; i++) + Memory.Map [i + 0x700] = (uint8*) &ROMOffset1 [(c << 12) & (Slot1Size - 1)]; + } + + // c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { Memory.Map [i + 0xc00] = &ROM [(c << 12) % CalculatedSize]; - BlockIsROM [i + 0xc00] = TRUE; - } - } - - for (c = 0; c < 16; c++) - { + BlockIsROM [i + 0xc00] = TRUE; + } + } + + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = RAM; Memory.Map [c + 0x7f0] = RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; - BlockIsROM [c + 0x7e0] = FALSE; - BlockIsROM [c + 0x7f0] = FALSE; - } - WriteProtectROM (); - - // Now copy the map and correct it for the SA1 CPU. - // memmove converted: Different mallocs [Neb] - memcpy ((void *) SA1.WriteMap, (void *) WriteMap, sizeof (WriteMap)); - // memmove converted: Different mallocs [Neb] - memcpy ((void *) SA1.Map, (void *) Memory.Map, sizeof (Memory.Map)); - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { - SA1.Map [c + 0] = SA1.Map [c + 0x800] = &Memory.FillRAM [0x3000]; - SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8 *) MAP_NONE; - SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &Memory.FillRAM [0x3000]; - SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8 *) MAP_NONE; - } - - // Banks 60->6f - for (c = 0; c < 0x100; c++) - SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8 *) MAP_BWRAM_BITMAP; - - BWRAM = SRAM; + BlockIsROM [c + 0x7e0] = FALSE; + BlockIsROM [c + 0x7f0] = FALSE; + } + WriteProtectROM(); + + // Now copy the map and correct it for the SA1 CPU. + // memmove converted: Different mallocs [Neb] + memcpy((void*) SA1.WriteMap, (void*) WriteMap, sizeof(WriteMap)); + // memmove converted: Different mallocs [Neb] + memcpy((void*) SA1.Map, (void*) Memory.Map, sizeof(Memory.Map)); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 0] = SA1.Map [c + 0x800] = &Memory.FillRAM [0x3000]; + SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8*) MAP_NONE; + SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &Memory.FillRAM [0x3000]; + SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8*) MAP_NONE; + } + + // Banks 60->6f + for (c = 0; c < 0x100; c++) + SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8*) MAP_BWRAM_BITMAP; + + BWRAM = SRAM; } -void SufamiTurboAltROMMap () +void SufamiTurboAltROMMap() { - int c; - int i; - - if(Slot1Size!=0) - Slot1SRAMSize=(1<<((uint8)ROMOffset1[0x32]))*1024; - else Slot1Size=0x8000; - if(Slot2Size!=0) - Slot2SRAMSize=(1<<((uint8)ROMOffset2[0x32]))*1024; -else Slot2Size=0x8000; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + if (Slot1Size != 0) + Slot1SRAMSize = (1 << ((uint8)ROMOffset1[0x32])) * 1024; + else Slot1Size = 0x8000; + if (Slot2Size != 0) + Slot2SRAMSize = (1 << ((uint8)ROMOffset2[0x32])) * 1024; + else Slot2Size = 0x8000; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - -// for (i = c + 8; i < c + 16; i++) -// { -// Memory.Map [i] = Memory.Map [i + 0x800] = &ROM [c << 11] - 0x8000; -// BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; -// } - - } - - //Map Bios - - for (c=0; c<0x200; c+=16) - { - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &ROM [((c>>4)*0x8000)%CalculatedSize] - 0x8000; - BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; - } - - } - - - for (c=0x200; c<0x400; c+=16) - { - for (i = c + 8; i < c + 16; i++) - { - if(Slot1Size!=0) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset1 [(((c>>4)*0x8000)%Slot1Size)] - 0x8000; - BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; - } - else Memory.Map [i] = Memory.Map [i + 0x800] = (uint8*)MAP_NONE; - } - - } - - for (c=0x400; c<0x600; c+=16) - { - for (i = c; i < c + 8; i++) - { - if(Slot2Size!=0) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset2[(((c>>4)*0x8000)%Slot2Size)]; - BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; - } + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + // for (i = c + 8; i < c + 16; i++) + // { + // Memory.Map [i] = Memory.Map [i + 0x800] = &ROM [c << 11] - 0x8000; + // BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + // } + + } + + //Map Bios + + for (c = 0; c < 0x200; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &ROM [((c >> 4) * 0x8000) % + CalculatedSize] - 0x8000; + BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + } + + } + + + for (c = 0x200; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + if (Slot1Size != 0) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset1 [((( + c >> 4) * 0x8000) % Slot1Size)] - 0x8000; + BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + } + else Memory.Map [i] = Memory.Map [i + 0x800] = (uint8*)MAP_NONE; + } + + } + + for (c = 0x400; c < 0x600; c += 16) + { + for (i = c; i < c + 8; i++) + { + if (Slot2Size != 0) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset2[((( + c >> 4) * 0x8000) % Slot2Size)]; + BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + } else Memory.Map [i] = Memory.Map [i + 0x800] = (uint8*)MAP_NONE; - } - for (i = c + 8; i < c + 16; i++) - { - if(Slot2Size!=0) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset2[(((c>>4)*0x8000)%Slot2Size)] - 0x8000; - BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; - } + } + for (i = c + 8; i < c + 16; i++) + { + if (Slot2Size != 0) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &ROMOffset2[((( + c >> 4) * 0x8000) % Slot2Size)] - 0x8000; + BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; + } else Memory.Map [i] = Memory.Map [i + 0x800] = (uint8*)MAP_NONE; - } + } } - // Banks 60->67 (7F?), S-RAM - if(Slot1SRAMSize!=0) - { - for (c = 0; c < 0x100; c++) - { - Memory.Map [c + 0xE00] = Memory.Map [c + 0x600] = (uint8 *) MAP_LOROM_SRAM; + // Banks 60->67 (7F?), S-RAM + if (Slot1SRAMSize != 0) + { + for (c = 0; c < 0x100; c++) + { + Memory.Map [c + 0xE00] = Memory.Map [c + 0x600] = (uint8*) MAP_LOROM_SRAM; Memory.BlockIsRAM [c + 0xE00] = Memory.BlockIsRAM [c + 0x600] = TRUE; - BlockIsROM [c + 0xE00] = BlockIsROM [c + 0x600] = FALSE; - } - } - if(Slot2SRAMSize!=0) - { - for (c = 0; c < 0x100; c++) - { - Memory.Map [c + 0xF00] = Memory.Map [c + 0x700] = (uint8 *) MAP_LOROM_SRAM; + BlockIsROM [c + 0xE00] = BlockIsROM [c + 0x600] = FALSE; + } + } + if (Slot2SRAMSize != 0) + { + for (c = 0; c < 0x100; c++) + { + Memory.Map [c + 0xF00] = Memory.Map [c + 0x700] = (uint8*) MAP_LOROM_SRAM; Memory.BlockIsRAM [c + 0xF00] = Memory.BlockIsRAM [c + 0x700] = TRUE; - BlockIsROM [c + 0xF00] = BlockIsROM [c + 0x700] = FALSE; - } - } - - // Banks 7e->7f, RAM - for (c = 0; c < 16; c++) - { + BlockIsROM [c + 0xF00] = BlockIsROM [c + 0x700] = FALSE; + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { Memory.Map [c + 0x7e0] = RAM; Memory.Map [c + 0x7f0] = RAM + 0x10000; Memory.BlockIsRAM [c + 0x7e0] = TRUE; Memory.BlockIsRAM [c + 0x7f0] = TRUE; - BlockIsROM [c + 0x7e0] = FALSE; - BlockIsROM [c + 0x7f0] = FALSE; - } - - WriteProtectROM (); + BlockIsROM [c + 0x7e0] = FALSE; + BlockIsROM [c + 0x7f0] = FALSE; + } + + WriteProtectROM(); } #endif -void SRAM512KLoROMMap () +void SRAM512KLoROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - for (i = c + 8; i < c + 16; i++) - { + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_NONE; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [c << 11] - 0x8000; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 8; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000]; - - for (i = c + 8; i < c + 16; i++) - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + 0x200000 - 0x8000]; - - for (i = c; i < c + 16; i++) - { + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 11) + + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - MapExtraRAM (); - WriteProtectROM (); + } + + MapExtraRAM(); + WriteProtectROM(); } -void BSHiROMMap () +void BSHiROMMap() { - int c; - int i; - - Memory.SRAMSize=5; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + Memory.SRAMSize = 5; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - // XXX: How large is SRAM?? - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + // XXX: How large is SRAM?? + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; Memory.BlockIsRAM [c + 5] = Memory.BlockIsRAM [c + 0x805] = TRUE; -// Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; -// Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; - - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; + // Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_NONE; + // Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_NONE; + + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) SRAM; Memory.BlockIsRAM [c + 6] = Memory.BlockIsRAM [c + 0x806] = TRUE; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) Memory.RAM; -// Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) Memory.RAM; + // Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) Memory.SRAM; Memory.BlockIsRAM [c + 7] = Memory.BlockIsRAM [c + 0x807] = TRUE; - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 12) % + Memory.CalculatedSize]; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 60->7d offset 0000->7fff & 60->7f offset 8000->ffff PSRAM - // XXX: How large is PSRAM? - - //not adjusted, but The Dumper says "4 Mbits" - for (c = 0x600; c < 0x7e0; c += 16) - { - for (i = c; i < c + 8; i++) - { + } + } + + // Banks 60->7d offset 0000->7fff & 60->7f offset 8000->ffff PSRAM + // XXX: How large is PSRAM? + + //not adjusted, but The Dumper says "4 Mbits" + for (c = 0x600; c < 0x7e0; c += 16) + { + for (i = c; i < c + 8; i++) + { Memory.Map [i] = &Memory.ROM [0x400000 + (c << 11)]; Memory.BlockIsRAM [i] = TRUE; - } - for (i = c + 8; i < c + 16; i++) - { + } + for (i = c + 8; i < c + 16; i++) + { Memory.Map [i] = &Memory.ROM [0x400000 + (c << 11) - 0x8000]; Memory.BlockIsRAM [i] = TRUE; - } - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % + Memory.CalculatedSize]; Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - for(i=0;i<0x80;i++) - { - Memory.Map[0x700+i]=&Memory.BSRAM[0x10000*(i/16)]; - Memory.BlockIsRAM[0x700+i]=TRUE; - Memory.BlockIsROM[0x700+i]=FALSE; - } - for (i=0; i<8;i++) - { - Memory.Map[0x205+(i<<4)]=Memory.Map[0x285+(i<<4)]=Memory.Map[0x305+(i<<4)]=Memory.Map[0x385+(i<<4)]=Memory.Map[0x705+(i<<4)]; - Memory.BlockIsRAM[0x205+(i<<4)]=Memory.BlockIsRAM[0x285+(i<<4)]=Memory.BlockIsRAM[0x305+(i<<4)]=Memory.BlockIsRAM[0x385+(i<<4)]=TRUE; - Memory.BlockIsROM[0x205+(i<<4)]=Memory.BlockIsROM[0x285+(i<<4)]=Memory.BlockIsROM[0x305+(i<<4)]=Memory.BlockIsROM[0x385+(i<<4)]=FALSE; - } - - MapRAM (); - WriteProtectROM (); + } + } + for (i = 0; i < 0x80; i++) + { + Memory.Map[0x700 + i] = &Memory.BSRAM[0x10000 * (i / 16)]; + Memory.BlockIsRAM[0x700 + i] = TRUE; + Memory.BlockIsROM[0x700 + i] = FALSE; + } + for (i = 0; i < 8; i++) + { + Memory.Map[0x205 + (i << 4)] = Memory.Map[0x285 + (i << 4)] = Memory.Map[0x305 + + (i << 4)] = Memory.Map[0x385 + (i << 4)] = Memory.Map[0x705 + (i << 4)]; + Memory.BlockIsRAM[0x205 + (i << 4)] = Memory.BlockIsRAM[0x285 + + (i << 4)] = Memory.BlockIsRAM[0x305 + (i << 4)] = Memory.BlockIsRAM[0x385 + + (i << 4)] = TRUE; + Memory.BlockIsROM[0x205 + (i << 4)] = Memory.BlockIsROM[0x285 + + (i << 4)] = Memory.BlockIsROM[0x305 + (i << 4)] = Memory.BlockIsROM[0x385 + + (i << 4)] = FALSE; + } + + MapRAM(); + WriteProtectROM(); } -void JumboLoROMMap (bool8 Interleaved) +void JumboLoROMMap(bool8 Interleaved) { - int c; - int i; - - uint32 OFFSET0 = 0x400000; - uint32 OFFSET1 = 0x400000; - uint32 OFFSET2 = 0x000000; - - if (Interleaved) - { - OFFSET0 = 0x000000; - OFFSET1 = 0x000000; - OFFSET2 = Memory.CalculatedSize-0x400000; //changed to work with interleaved DKJM2. - } - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + uint32 OFFSET0 = 0x400000; + uint32 OFFSET1 = 0x400000; + uint32 OFFSET2 = 0x000000; + + if (Interleaved) + { + OFFSET0 = 0x000000; + OFFSET1 = 0x000000; + OFFSET2 = Memory.CalculatedSize - + 0x400000; //changed to work with interleaved DKJM2. + } + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - if (Settings.DSP1Master) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_DSP; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_DSP; - } - else if (Settings.C4) - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) MAP_C4; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) MAP_C4; - } - else - { - Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; - Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; - } - - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i]= &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + OFFSET0] - 0x8000; - Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % (0x400000)) + OFFSET2] - 0x8000; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + if (Settings.DSP1Master) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_DSP; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_DSP; + } + else if (Settings.C4) + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) MAP_C4; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) MAP_C4; + } + else + { + Memory.Map [c + 6] = Memory.Map [c + 0x806] = (uint8*) bytes0x2000 - 0x6000; + Memory.Map [c + 7] = Memory.Map [c + 0x807] = (uint8*) bytes0x2000 - 0x6000; + } + + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + + OFFSET0] - 0x8000; + Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % (0x400000)) + OFFSET2] - + 0x8000; Memory.BlockIsROM [i + 0x800] = Memory.BlockIsROM [i] = TRUE; - } - } - - if (Settings.DSP1Master) - { - // Banks 30->3f and b0->bf - for (c = 0x300; c < 0x400; c += 16) - { - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i + 0x800] = (uint8 *) MAP_DSP; + } + } + + if (Settings.DSP1Master) + { + // Banks 30->3f and b0->bf + for (c = 0x300; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i + 0x800] = (uint8*) MAP_DSP; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = FALSE; - } - } - } - - // Banks 40->7f and c0->ff - for (c = 0x400; c < 0x800; c += 16) - { - //updated mappings to correct A15 mirroring - for (i = c; i < c + 8; i++) - { - Memory.Map [i]= &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + OFFSET0]; - Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % 0x400000) +OFFSET2]; - } - - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i]= &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + OFFSET0] - 0x8000; - Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % 0x400000) + OFFSET2 ] - 0x8000; - } - - for (i = c; i < c + 16; i++) - { + } + } + } + + // Banks 40->7f and c0->ff + for (c = 0x400; c < 0x800; c += 16) + { + //updated mappings to correct A15 mirroring + for (i = c; i < c + 8; i++) + { + Memory.Map [i] = &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + + OFFSET0]; + Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % 0x400000) + OFFSET2]; + } + + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = &Memory.ROM [((c << 11) % (Memory.CalculatedSize - 0x400000)) + + OFFSET0] - 0x8000; + Memory.Map [i + 0x800] = &Memory.ROM [((c << 11) % 0x400000) + OFFSET2 ] - + 0x8000; + } + + for (i = c; i < c + 16; i++) Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - //ROM type has to be 64 Mbit header! - int sum=0, k,l; - for(k=0;k<256;k++) - { - uint8* bank=0x8000+Memory.Map[8+(k<<4)];//use upper half of the banks, and adjust for LoROM. - for(l=0;l<0x8000;l++) - sum+=bank[l]; - } - Memory.CalculatedChecksum=sum&0xFFFF; - - MapRAM (); - WriteProtectROM (); + } + + //ROM type has to be 64 Mbit header! + int sum = 0, k, l; + for (k = 0; k < 256; k++) + { + uint8* bank = 0x8000 + Memory.Map[8 + (k << + 4)]; //use upper half of the banks, and adjust for LoROM. + for (l = 0; l < 0x8000; l++) + sum += bank[l]; + } + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } -void SPC7110HiROMMap () +void SPC7110HiROMMap() { - int c; - int i; - - // Banks 00->3f and 80->bf - for (c = 0; c < 0x400; c += 16) - { + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 0] = Memory.Map [c + 0x800] = Memory.RAM; Memory.BlockIsRAM [c + 0] = Memory.BlockIsRAM [c + 0x800] = TRUE; Memory.Map [c + 1] = Memory.Map [c + 0x801] = Memory.RAM; Memory.BlockIsRAM [c + 1] = Memory.BlockIsRAM [c + 0x801] = TRUE; - - Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8 *) MAP_PPU; - Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8 *) MAP_PPU; - Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8 *) MAP_CPU; - Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8 *) MAP_CPU; - - Memory.Map [c + 6] /*= Memory.Map [c + 0x806]*/ = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [c + 7] /*= Memory.Map [c + 0x807]*/ = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [c + 0x806]=Memory.Map [c + 0x807]= (uint8 *) MAP_NONE; - - for (i = c + 8; i < c + 16; i++) - { - Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; + + Memory.Map [c + 2] = Memory.Map [c + 0x802] = (uint8*) MAP_PPU; + Memory.Map [c + 3] = Memory.Map [c + 0x803] = (uint8*) MAP_PPU; + Memory.Map [c + 4] = Memory.Map [c + 0x804] = (uint8*) MAP_CPU; + Memory.Map [c + 5] = Memory.Map [c + 0x805] = (uint8*) MAP_CPU; + + Memory.Map [c + 6] /*= Memory.Map [c + 0x806]*/ = (uint8*) MAP_HIROM_SRAM; + Memory.Map [c + 7] /*= Memory.Map [c + 0x807]*/ = (uint8*) MAP_HIROM_SRAM; + Memory.Map [c + 0x806] = Memory.Map [c + 0x807] = (uint8*) MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + Memory.Map [i] = Memory.Map [i + 0x800] = &Memory.ROM [(c << 12) % + Memory.CalculatedSize]; Memory.BlockIsROM [i] = Memory.BlockIsROM [i + 0x800] = TRUE; - } - } - - // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. - for (c = 0; c < 16; c++) - { - Memory.Map [0x306 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0x307 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; - Memory.Map [0xb06 + (c << 4)] = (uint8 *) MAP_NONE; - Memory.Map [0xb07 + (c << 4)] = (uint8 *) MAP_NONE; + } + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + Memory.Map [0x306 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0x307 + (c << 4)] = (uint8*) MAP_HIROM_SRAM; + Memory.Map [0xb06 + (c << 4)] = (uint8*) MAP_NONE; + Memory.Map [0xb07 + (c << 4)] = (uint8*) MAP_NONE; Memory.BlockIsRAM [0x306 + (c << 4)] = TRUE; Memory.BlockIsRAM [0x307 + (c << 4)] = TRUE; - // Memory.BlockIsRAM [0xb06 + (c << 4)] = TRUE; - // Memory.BlockIsRAM [0xb07 + (c << 4)] = TRUE; - } - - // Banks 40->7f and c0->ff - for (c = 0; c < 0x400; c += 16) - { - for (i = c; i < c + 16; i++) - { - Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % Memory.CalculatedSize]; + // Memory.BlockIsRAM [0xb06 + (c << 4)] = TRUE; + // Memory.BlockIsRAM [0xb07 + (c << 4)] = TRUE; + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &Memory.ROM [(c << 12) % + Memory.CalculatedSize]; Memory.BlockIsROM [i + 0x400] = Memory.BlockIsROM [i + 0xc00] = TRUE; - } - } - - for (c=0;c<0x10;c++) - { - Memory.Map [0x500+c]=(uint8 *)MAP_SPC7110_DRAM; - Memory.BlockIsROM [0x500+c]=TRUE; - } - - for (c=0;c<0x100;c++) - { - Memory.Map [0xD00+c] = (uint8 *) MAP_SPC7110_ROM; - Memory.Map [0xE00+c] = (uint8 *) MAP_SPC7110_ROM; - Memory.Map [0xF00+c] = (uint8 *) MAP_SPC7110_ROM; - Memory.BlockIsROM [0xD00+c] = Memory.BlockIsROM [0xE00+c] = Memory.BlockIsROM [0xF00+c] = TRUE; - - } - S9xSpc7110Init(); - -int sum=0; -for(i=0;i<(int)Memory.CalculatedSize; i++) -{ - sum+=Memory.ROM[i]; -} + } + } -if(Memory.CalculatedSize==0x300000) - sum<<=1; -Memory.CalculatedChecksum=sum&0xFFFF; + for (c = 0; c < 0x10; c++) + { + Memory.Map [0x500 + c] = (uint8*)MAP_SPC7110_DRAM; + Memory.BlockIsROM [0x500 + c] = TRUE; + } + + for (c = 0; c < 0x100; c++) + { + Memory.Map [0xD00 + c] = (uint8*) MAP_SPC7110_ROM; + Memory.Map [0xE00 + c] = (uint8*) MAP_SPC7110_ROM; + Memory.Map [0xF00 + c] = (uint8*) MAP_SPC7110_ROM; + Memory.BlockIsROM [0xD00 + c] = Memory.BlockIsROM [0xE00 + c] = + Memory.BlockIsROM [0xF00 + c] = TRUE; - MapRAM (); - WriteProtectROM (); + } + S9xSpc7110Init(); + + int sum = 0; + for (i = 0; i < (int)Memory.CalculatedSize; i++) + sum += Memory.ROM[i]; + + if (Memory.CalculatedSize == 0x300000) + sum <<= 1; + Memory.CalculatedChecksum = sum & 0xFFFF; + + MapRAM(); + WriteProtectROM(); } void SPC7110Sram(uint8 newstate) { - if(newstate&0x80) - { - Memory.Map[6]=(uint8 *)MAP_HIROM_SRAM; - Memory.Map[7]=(uint8 *)MAP_HIROM_SRAM; - Memory.Map[0x306]=(uint8 *)MAP_HIROM_SRAM; - Memory.Map[0x307]=(uint8 *)MAP_HIROM_SRAM; - - - } - else - { - Memory.Map[6]=(uint8 *)MAP_RONLY_SRAM; - Memory.Map[7]=(uint8 *)MAP_RONLY_SRAM; - Memory.Map[0x306]=(uint8 *)MAP_RONLY_SRAM; - Memory.Map[0x307]=(uint8 *)MAP_RONLY_SRAM; - } + if (newstate & 0x80) + { + Memory.Map[6] = (uint8*)MAP_HIROM_SRAM; + Memory.Map[7] = (uint8*)MAP_HIROM_SRAM; + Memory.Map[0x306] = (uint8*)MAP_HIROM_SRAM; + Memory.Map[0x307] = (uint8*)MAP_HIROM_SRAM; + + + } + else + { + Memory.Map[6] = (uint8*)MAP_RONLY_SRAM; + Memory.Map[7] = (uint8*)MAP_RONLY_SRAM; + Memory.Map[0x306] = (uint8*)MAP_RONLY_SRAM; + Memory.Map[0x307] = (uint8*)MAP_RONLY_SRAM; + } } -const char *TVStandard () +const char* TVStandard() { - return (Settings.PAL ? "PAL" : "NTSC"); + return (Settings.PAL ? "PAL" : "NTSC"); } -const char *Speed () +const char* Speed() { - return (Memory.ROMSpeed & 0x10 ? "120ns" : "200ns"); + return (Memory.ROMSpeed & 0x10 ? "120ns" : "200ns"); } -const char *MapType () +const char* MapType() { - return (Memory.HiROM ? "HiROM" : "LoROM"); + return (Memory.HiROM ? "HiROM" : "LoROM"); } -const char *StaticRAMSize () +const char* StaticRAMSize() { - static char tmp [20]; - - if (Memory.SRAMSize > 16) - return ("Corrupt"); - sprintf (tmp, "%dKB", (Memory.SRAMMask + 1) / 1024); - return (tmp); + static char tmp [20]; + + if (Memory.SRAMSize > 16) + return ("Corrupt"); + sprintf(tmp, "%dKB", (Memory.SRAMMask + 1) / 1024); + return (tmp); } -const char *Size () +const char* Size() { - static char tmp [20]; - - if (Memory.ROMSize < 7 || Memory.ROMSize - 7 > 23) - return ("Corrupt"); - sprintf (tmp, "%dMbits", 1 << (Memory.ROMSize - 7)); - return (tmp); + static char tmp [20]; + + if (Memory.ROMSize < 7 || Memory.ROMSize - 7 > 23) + return ("Corrupt"); + sprintf(tmp, "%dMbits", 1 << (Memory.ROMSize - 7)); + return (tmp); } -const char *KartContents () +const char* KartContents() { - static char tmp [30]; - static const char *CoPro [16] = { - "DSP1", "SuperFX", "OBC1", "SA-1", "S-DD1", "S-RTC", "CoPro#6", - "CoPro#7", "CoPro#8", "CoPro#9", "CoPro#10", "CoPro#11", "CoPro#12", - "CoPro#13", "CoPro#14", "CoPro-Custom" - }; - static const char *Contents [3] = { - "ROM", "ROM+RAM", "ROM+RAM+BAT" - }; - if (Memory.ROMType == 0&&!Settings.BS) - return ("ROM only"); - - sprintf (tmp, "%s", Contents [(Memory.ROMType & 0xf) % 3]); - - - if(Settings.BS) - sprintf (tmp, "%s+%s", tmp, "BSX"); - else if(Settings.SPC7110&&Settings.SPC7110RTC) - sprintf (tmp, "%s+%s", tmp, "SPC7110+RTC"); - else if(Settings.SPC7110) - sprintf (tmp, "%s+%s", tmp, "SPC7110"); - else if(Settings.SETA!=0) - { - switch(Settings.SETA) - { - case ST_010: - sprintf (tmp, "%s+%s", tmp, "ST-010"); - break; - case ST_011: - sprintf (tmp, "%s+%s", tmp, "ST-011"); - break; - - case ST_018: - sprintf (tmp, "%s+%s", tmp, "ST-018"); - break; - - } - } - else if ((Memory.ROMType & 0xf) >= 3) - sprintf (tmp, "%s+%s", tmp, CoPro [(Memory.ROMType & 0xf0) >> 4]); - - return (tmp); + static char tmp [30]; + static const char* CoPro [16] = + { + "DSP1", "SuperFX", "OBC1", "SA-1", "S-DD1", "S-RTC", "CoPro#6", + "CoPro#7", "CoPro#8", "CoPro#9", "CoPro#10", "CoPro#11", "CoPro#12", + "CoPro#13", "CoPro#14", "CoPro-Custom" + }; + static const char* Contents [3] = + { + "ROM", "ROM+RAM", "ROM+RAM+BAT" + }; + if (Memory.ROMType == 0 && !Settings.BS) + return ("ROM only"); + + sprintf(tmp, "%s", Contents [(Memory.ROMType & 0xf) % 3]); + + + if (Settings.BS) + sprintf(tmp, "%s+%s", tmp, "BSX"); + else if (Settings.SPC7110 && Settings.SPC7110RTC) + sprintf(tmp, "%s+%s", tmp, "SPC7110+RTC"); + else if (Settings.SPC7110) + sprintf(tmp, "%s+%s", tmp, "SPC7110"); + else if (Settings.SETA != 0) + { + switch (Settings.SETA) + { + case ST_010: + sprintf(tmp, "%s+%s", tmp, "ST-010"); + break; + case ST_011: + sprintf(tmp, "%s+%s", tmp, "ST-011"); + break; + + case ST_018: + sprintf(tmp, "%s+%s", tmp, "ST-018"); + break; + + } + } + else if ((Memory.ROMType & 0xf) >= 3) + sprintf(tmp, "%s+%s", tmp, CoPro [(Memory.ROMType & 0xf0) >> 4]); + + return (tmp); } -const char *MapMode () +const char* MapMode() { - static char tmp [4]; - sprintf (tmp, "%02x", Memory.ROMSpeed & ~0x10); - return (tmp); + static char tmp [4]; + sprintf(tmp, "%02x", Memory.ROMSpeed & ~0x10); + return (tmp); } -const char *ROMID () +const char* ROMID() { - return (Memory.ROMId); + return (Memory.ROMId); } -void ApplyROMFixes () +void ApplyROMFixes() { #ifdef __W32_HEAP - if(_HEAPOK!=_heapchk()) + if (_HEAPOK != _heapchk()) MessageBox(GUI.hWnd, "ApplyROMFixes", "Heap Corrupt", MB_OK); #endif - //don't steal my work! -MK - if(Memory.ROMCRC32 == 0x1B4A5616 && strncmp(Memory.ROMName, "RUDORA NO HIHOU", 15)==0) - { + //don't steal my work! -MK + if (Memory.ROMCRC32 == 0x1B4A5616 + && strncmp(Memory.ROMName, "RUDORA NO HIHOU", 15) == 0) + { strncpy(Memory.ROMName, "THIS SCRIPT WAS STOLEN", 22); - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - } - - /* - HACKS NSRT can fix that we hadn't detected before. -[14:25:13] <@Nach> case 0x0c572ef0: //So called Hook (US)(2648) -[14:25:13] <@Nach> case 0x6810aa95: //Bazooka Blitzkreig swapped sizes hack -handled -[14:25:17] <@Nach> case 0x61E29C06: //The Tick region hack -[14:25:19] <@Nach> case 0x1EF90F74: //Jikkyou Keiba Simulation Stable Star PAL hack -[14:25:23] <@Nach> case 0x4ab225b5: //So called Krusty's Super Fun House (E) -[14:25:25] <@Nach> case 0x77fd806a: //Donkey Kong Country 2 (E) v1.1 bad dump -handled -[14:25:27] <@Nach> case 0x340f23e5: //Donkey Kong Country 3 (U) copier hack - handled - */ - - if(Memory.ROMCRC32==0x6810aa95 || Memory.ROMCRC32==0x340f23e5 || Memory.ROMCRC32==0x77fd806a || - strncmp (Memory.ROMName, "HIGHWAY BATTLE 2", 16)==0 || - (strcmp (Memory.ROMName, "FX SKIING NINTENDO 96") == 0 && Memory.ROM[0x7FDA]==0)) - { - Settings.DisplayColor=BUILD_PIXEL(31,0,0); - SET_UI_COLOR(255,0,0); - } - - //Ambiguous chip function pointer assignments - - //DSP switching: - if(strncmp(Memory.ROMName, "DUNGEON MASTER", 14)==0) - { - //Set DSP-2 - SetDSP=&DSP2SetByte; - GetDSP=&DSP2GetByte; - } + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + } + + /* + HACKS NSRT can fix that we hadn't detected before. + [14:25:13] <@Nach> case 0x0c572ef0: //So called Hook (US)(2648) + [14:25:13] <@Nach> case 0x6810aa95: //Bazooka Blitzkreig swapped sizes hack -handled + [14:25:17] <@Nach> case 0x61E29C06: //The Tick region hack + [14:25:19] <@Nach> case 0x1EF90F74: //Jikkyou Keiba Simulation Stable Star PAL hack + [14:25:23] <@Nach> case 0x4ab225b5: //So called Krusty's Super Fun House (E) + [14:25:25] <@Nach> case 0x77fd806a: //Donkey Kong Country 2 (E) v1.1 bad dump -handled + [14:25:27] <@Nach> case 0x340f23e5: //Donkey Kong Country 3 (U) copier hack - handled + */ + + if (Memory.ROMCRC32 == 0x6810aa95 || Memory.ROMCRC32 == 0x340f23e5 + || Memory.ROMCRC32 == 0x77fd806a || + strncmp(Memory.ROMName, "HIGHWAY BATTLE 2", 16) == 0 || + (strcmp(Memory.ROMName, "FX SKIING NINTENDO 96") == 0 + && Memory.ROM[0x7FDA] == 0)) + { + Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); + SET_UI_COLOR(255, 0, 0); + } + + //Ambiguous chip function pointer assignments + + //DSP switching: + if (strncmp(Memory.ROMName, "DUNGEON MASTER", 14) == 0) + { + //Set DSP-2 + SetDSP = &DSP2SetByte; + GetDSP = &DSP2GetByte; + } #ifdef DSP_DUMMY_LOOPS - if(strncmp(ROMName, "SD\x0b6\x0de\x0dd\x0c0\x0de\x0d1GX", 10)==0) - { - //Set DSP-3 - SetDSP=&DSP3SetByte; - GetDSP=&DSP3GetByte; - } + if (strncmp(ROMName, "SD\x0b6\x0de\x0dd\x0c0\x0de\x0d1GX", 10) == 0) + { + //Set DSP-3 + SetDSP = &DSP3SetByte; + GetDSP = &DSP3GetByte; + } #endif - if(strncmp(Memory.ROMName, "TOP GEAR 3000", 13)==0 - ||strncmp(Memory.ROMName, "PLANETS CHAMP TG3000", 20)==0) - { - //Set DSP-4 - SetDSP=&DSP4SetByte; - GetDSP=&DSP4GetByte; - } - - //memory map corrections - if(strncmp(Memory.ROMName, "XBAND",5)==0) - { + if (strncmp(Memory.ROMName, "TOP GEAR 3000", 13) == 0 + || strncmp(Memory.ROMName, "PLANETS CHAMP TG3000", 20) == 0) + { + //Set DSP-4 + SetDSP = &DSP4SetByte; + GetDSP = &DSP4GetByte; + } + + //memory map corrections + if (strncmp(Memory.ROMName, "XBAND", 5) == 0) + { int c; - for (c=0xE00;c<0xE10;c++) - { - Memory.Map [c] = (uint8 *) MAP_LOROM_SRAM; + for (c = 0xE00; c < 0xE10; c++) + { + Memory.Map [c] = (uint8*) MAP_LOROM_SRAM; Memory.BlockIsRAM [c] = TRUE; Memory.BlockIsROM [c] = FALSE; - } - WriteProtectROM (); - } + } + WriteProtectROM(); + } - //not MAD-1 compliant - if(strcmp (Memory.ROMName, "WANDERERS FROM YS") == 0) - { + //not MAD-1 compliant + if (strcmp(Memory.ROMName, "WANDERERS FROM YS") == 0) + { int c; - for(c=0;c<0xE0;c++) - { - Memory.Map[c+0x700]=(uint8*)MAP_LOROM_SRAM; - Memory.BlockIsROM[c+0x700]=FALSE; - Memory.BlockIsRAM[c+0x700]=TRUE; - } - WriteProtectROM(); - } - - if (strcmp (Memory.ROMName, "GOGO ACKMAN3") == 0 || - strcmp (Memory.ROMName, "HOME ALONE") == 0) - { - // Banks 00->3f and 80->bf + for (c = 0; c < 0xE0; c++) + { + Memory.Map[c + 0x700] = (uint8*)MAP_LOROM_SRAM; + Memory.BlockIsROM[c + 0x700] = FALSE; + Memory.BlockIsRAM[c + 0x700] = TRUE; + } + WriteProtectROM(); + } + + if (strcmp(Memory.ROMName, "GOGO ACKMAN3") == 0 || + strcmp(Memory.ROMName, "HOME ALONE") == 0) + { + // Banks 00->3f and 80->bf int c; for (c = 0; c < 0x400; c += 16) - { + { Memory.Map [c + 6] = Memory.Map [c + 0x806] = Memory.SRAM; Memory.Map [c + 7] = Memory.Map [c + 0x807] = Memory.SRAM; Memory.BlockIsROM [c + 6] = Memory.BlockIsROM [c + 0x806] = FALSE; Memory.BlockIsROM [c + 7] = Memory.BlockIsROM [c + 0x807] = FALSE; Memory.BlockIsRAM [c + 6] = Memory.BlockIsRAM [c + 0x806] = TRUE; Memory.BlockIsRAM [c + 7] = Memory.BlockIsRAM [c + 0x807] = TRUE; - } - WriteProtectROM (); - } - - if (strcmp (Memory.ROMName, "RADICAL DREAMERS") == 0 || - strcmp (Memory.ROMName, "TREASURE CONFLIX") == 0) - { - int c; - - for (c = 0; c < 0x80; c++) - { + } + WriteProtectROM(); + } + + if (strcmp(Memory.ROMName, "RADICAL DREAMERS") == 0 || + strcmp(Memory.ROMName, "TREASURE CONFLIX") == 0) + { + int c; + + for (c = 0; c < 0x80; c++) + { Memory.Map [c + 0x700] = Memory.ROM + 0x200000 + 0x1000 * (c & 0xf0); Memory.BlockIsRAM [c + 0x700] = TRUE; Memory.BlockIsROM [c + 0x700] = FALSE; - } - for (c = 0; c < 0x400; c += 16) - { + } + for (c = 0; c < 0x400; c += 16) + { Memory.Map [c + 5] = Memory.Map [c + 0x805] = Memory.ROM + 0x300000; Memory.BlockIsRAM [c + 5] = Memory.BlockIsRAM [c + 0x805] = TRUE; - } - WriteProtectROM (); - } + } + WriteProtectROM(); + } - if(strncmp(Memory.ROMName, "WAR 2410", 8)==0) - { - Memory.Map [0x005] = (uint8 *) Memory.RAM; + if (strncmp(Memory.ROMName, "WAR 2410", 8) == 0) + { + Memory.Map [0x005] = (uint8*) Memory.RAM; Memory.BlockIsRAM [0x005] = TRUE; Memory.BlockIsROM [0x005] = FALSE; - } - - if (strcmp (Memory.ROMName, "BATMAN--REVENGE JOKER") == 0) - { - Memory.HiROM = FALSE; - Memory.LoROM = TRUE; - LoROMMap (); - } - - - //NMI hacks - CPU.NMITriggerPoint = 4; - if (strcmp (Memory.ROMName, "CACOMA KNIGHT") == 0) - CPU.NMITriggerPoint = 25; - - //Disabling a speed-up - // Games which spool sound samples between the SNES and sound CPU using - // H-DMA as the sample is playing. - if (strcmp (Memory.ROMName, "EARTHWORM JIM 2") == 0 || - strcmp (Memory.ROMName, "PRIMAL RAGE") == 0 || - strcmp (Memory.ROMName, "CLAY FIGHTER") == 0 || - strcmp (Memory.ROMName, "ClayFighter 2") == 0 || - strncasecmp (Memory.ROMName, "MADDEN", 6) == 0 || - strncmp (Memory.ROMName, "NHL", 3) == 0 || - strcmp (Memory.ROMName, "WeaponLord") == 0|| - strncmp(Memory.ROMName, "WAR 2410", 8)==0) - { - Settings.Shutdown = FALSE; - } - - - //APU timing hacks - - // Stunt Racer FX - if (strcmp (Memory.ROMId, "CQ ") == 0 || - // Illusion of Gaia - strncmp (Memory.ROMId, "JG", 2) == 0 || - strcmp (Memory.ROMName, "GAIA GENSOUKI 1 JPN") == 0) - { - IAPU.OneCycle = 13; - } - - // RENDERING RANGER R2 - if (strcmp (Memory.ROMId, "AVCJ") == 0 || - //Mark Davis - strncmp(Memory.ROMName, "THE FISHING MASTER", 18)==0 || //needs >= actual APU timing. (21 is .002 Mhz slower) - // Star Ocean - strncmp (Memory.ROMId, "ARF", 3) == 0 || - // Tales of Phantasia - strncmp (Memory.ROMId, "ATV", 3) == 0 || - // Act Raiser 1 & 2 - strncasecmp (Memory.ROMName, "ActRaiser", 9) == 0 || - // Soulblazer - strcmp (Memory.ROMName, "SOULBLAZER - 1 USA") == 0 || - strcmp (Memory.ROMName, "SOULBLADER - 1") == 0 || - - // Terranigma - strncmp (Memory.ROMId, "AQT", 3) == 0 || - // Robotrek - strncmp (Memory.ROMId, "E9 ", 3) == 0 || - strcmp (Memory.ROMName, "SLAP STICK 1 JPN") == 0 || - // ZENNIHON PURORESU2 - strncmp (Memory.ROMId, "APR", 3) == 0 || - // Bomberman 4 - strncmp (Memory.ROMId, "A4B", 3) == 0 || - // UFO KAMEN YAKISOBAN - strncmp (Memory.ROMId, "Y7 ", 3) == 0 || - strncmp (Memory.ROMId, "Y9 ", 3) == 0 || - // Panic Bomber World - strncmp (Memory.ROMId, "APB", 3) == 0 || - ((strncmp (Memory.ROMName, "Parlor", 6) == 0 || - strcmp (Memory.ROMName, "HEIWA Parlor!Mini8") == 0 || - strncmp (Memory.ROMName, "SANKYO Fever! ̨°ÊÞ°!", 21) == 0) && - strcmp (Memory.CompanyId, "A0") == 0) || - strcmp (Memory.ROMName, "DARK KINGDOM") == 0 || - strcmp (Memory.ROMName, "ZAN3 SFC") == 0 || - strcmp (Memory.ROMName, "HIOUDEN") == 0 || - strcmp (Memory.ROMName, "ÃݼɳÀ") == 0 || //Tenshi no Uta - strcmp (Memory.ROMName, "FORTUNE QUEST") == 0 || - strcmp (Memory.ROMName, "FISHING TO BASSING") == 0 || - strncmp (Memory.ROMName, "TokyoDome '95Battle 7", 21) == 0 || - strcmp (Memory.ROMName, "OHMONO BLACKBASS") == 0 || - strncmp (Memory.ROMName, "SWORD WORLD SFC", 15) == 0 || - strcmp (Memory.ROMName, "MASTERS") ==0 || //Augusta 2 J - strcmp (Memory.ROMName, "SFC ¶ÒÝײÀÞ°") == 0 || //Kamen Rider - strncmp (Memory.ROMName, "LETs PACHINKO(", 14) == 0) //A set of BS games - { - IAPU.OneCycle = 15; - } - - - //Specific game fixes - - Settings.StarfoxHack = strcmp (Memory.ROMName, "STAR FOX") == 0 || - strcmp (Memory.ROMName, "STAR WING") == 0; - Settings.WinterGold = strcmp (Memory.ROMName, "FX SKIING NINTENDO 96") == 0 || - strcmp (Memory.ROMName, "DIRT RACER") == 0 || - Settings.StarfoxHack; - - - if((strcmp(Memory.ROMName, "LEGEND")==0&&!Settings.PAL)|| - strcmp(Memory.ROMName, "King Arthurs World")==0) - { - SNESGameFixes.EchoOnlyOutput=TRUE; - } - - - Settings.DaffyDuck = (strcmp (Memory.ROMName, "DAFFY DUCK: MARV MISS") == 0) || - (strcmp (Memory.ROMName, "ROBOCOP VS THE TERMIN") == 0) || - (strcmp (Memory.ROMName, "ROBOCOP VS TERMINATOR") == 0); //ROBOCOP VS THE TERMIN - Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX; - - //OAM hacks because we don't fully understand the - //behavior of the SNES. - - //Totally wacky display... - //seems to need a disproven behavior, so - //we're definitely overlooking some other bug? - if(strncmp(Memory.ROMName, "UNIRACERS", 9)==0) - SNESGameFixes.Uniracers=true; - - - //is this even useful now? - if (strcmp (Memory.ROMName, "ALIENS vs. PREDATOR") == 0) - SNESGameFixes.alienVSpredetorFix = TRUE; - - if (strcmp (Memory.ROMName, "½°Ȩ̂߰нÀ") == 0 || //Super Famista - strcmp (Memory.ROMName, "½°Ȩ̂߰нÀ 2") == 0 || //Super Famista 2 - strcmp (Memory.ROMName, "ZENKI TENCHIMEIDOU") == 0 || - strcmp (Memory.ROMName, "GANBA LEAGUE") == 0) - { - SNESGameFixes.APU_OutPorts_ReturnValueFix = TRUE; - } - - if (strcmp (Memory.ROMName, "FURAI NO SIREN") == 0) - SNESGameFixes.SoundEnvelopeHeightReading2 = TRUE; - - //CPU timing hacks - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * - Settings.CyclesPercentage) / 100; - - //no need to ifdef for right now... -//#ifdef HDMA_HACKS - - // A Couple of HDMA related hacks - Lantus - if ((strcmp(Memory.ROMName, "SFX SUPERBUTOUDEN2")==0) || - (strcmp(Memory.ROMName, "ALIEN vs. PREDATOR")==0) || - (strcmp(Memory.ROMName, "STONE PROTECTORS")==0) || - (strcmp(Memory.ROMName, "SUPER BATTLETANK 2")==0)) - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 130) / 100; - - if(strcmp(Memory.ROMName, "HOME IMPROVEMENT")==0) - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 200) / 100; - - // End HDMA hacks -//#endif - - - if (strcmp (Memory.ROMId, "ASRJ") == 0 && Settings.CyclesPercentage == 100) - // Street Racer - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 95) / 100; - - // Power Rangers Fight - if (strncmp (Memory.ROMId, "A3R", 3) == 0 || - // Clock Tower - strncmp (Memory.ROMId, "AJE", 3) == 0) - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 103) / 100; - - - if (strncmp (Memory.ROMId, "A3M", 3) == 0 && Settings.CyclesPercentage == 100) - // Mortal Kombat 3. Fixes cut off speech sample - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; - - //Darkness Beyond Twilight - //Crimson beyond blood that flows - //buried in the stream of time - //is where your power grows - //I pledge myself to conquer - //all the foes who stand - //before the might gift betsowed - //in my unworthy hand - if (strcmp (Memory.ROMName, "\x0bd\x0da\x0b2\x0d4\x0b0\x0bd\x0de") == 0 && - Settings.CyclesPercentage == 100) - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 101) / 100; + } + + if (strcmp(Memory.ROMName, "BATMAN--REVENGE JOKER") == 0) + { + Memory.HiROM = FALSE; + Memory.LoROM = TRUE; + LoROMMap(); + } + + + //NMI hacks + CPU.NMITriggerPoint = 4; + if (strcmp(Memory.ROMName, "CACOMA KNIGHT") == 0) + CPU.NMITriggerPoint = 25; + + //Disabling a speed-up + // Games which spool sound samples between the SNES and sound CPU using + // H-DMA as the sample is playing. + if (strcmp(Memory.ROMName, "EARTHWORM JIM 2") == 0 || + strcmp(Memory.ROMName, "PRIMAL RAGE") == 0 || + strcmp(Memory.ROMName, "CLAY FIGHTER") == 0 || + strcmp(Memory.ROMName, "ClayFighter 2") == 0 || + strncasecmp(Memory.ROMName, "MADDEN", 6) == 0 || + strncmp(Memory.ROMName, "NHL", 3) == 0 || + strcmp(Memory.ROMName, "WeaponLord") == 0 || + strncmp(Memory.ROMName, "WAR 2410", 8) == 0) + Settings.Shutdown = FALSE; + + + //APU timing hacks + + // Stunt Racer FX + if (strcmp(Memory.ROMId, "CQ ") == 0 || + // Illusion of Gaia + strncmp(Memory.ROMId, "JG", 2) == 0 || + strcmp(Memory.ROMName, "GAIA GENSOUKI 1 JPN") == 0) + IAPU.OneCycle = 13; + + // RENDERING RANGER R2 + if (strcmp(Memory.ROMId, "AVCJ") == 0 || + //Mark Davis + strncmp(Memory.ROMName, "THE FISHING MASTER", 18) == 0 + || //needs >= actual APU timing. (21 is .002 Mhz slower) + // Star Ocean + strncmp(Memory.ROMId, "ARF", 3) == 0 || + // Tales of Phantasia + strncmp(Memory.ROMId, "ATV", 3) == 0 || + // Act Raiser 1 & 2 + strncasecmp(Memory.ROMName, "ActRaiser", 9) == 0 || + // Soulblazer + strcmp(Memory.ROMName, "SOULBLAZER - 1 USA") == 0 || + strcmp(Memory.ROMName, "SOULBLADER - 1") == 0 || + + // Terranigma + strncmp(Memory.ROMId, "AQT", 3) == 0 || + // Robotrek + strncmp(Memory.ROMId, "E9 ", 3) == 0 || + strcmp(Memory.ROMName, "SLAP STICK 1 JPN") == 0 || + // ZENNIHON PURORESU2 + strncmp(Memory.ROMId, "APR", 3) == 0 || + // Bomberman 4 + strncmp(Memory.ROMId, "A4B", 3) == 0 || + // UFO KAMEN YAKISOBAN + strncmp(Memory.ROMId, "Y7 ", 3) == 0 || + strncmp(Memory.ROMId, "Y9 ", 3) == 0 || + // Panic Bomber World + strncmp(Memory.ROMId, "APB", 3) == 0 || + ((strncmp(Memory.ROMName, "Parlor", 6) == 0 || + strcmp(Memory.ROMName, "HEIWA Parlor!Mini8") == 0 || + strncmp(Memory.ROMName, "SANKYO Fever! ̨��ް!", 21) == 0) && + strcmp(Memory.CompanyId, "A0") == 0) || + strcmp(Memory.ROMName, "DARK KINGDOM") == 0 || + strcmp(Memory.ROMName, "ZAN3 SFC") == 0 || + strcmp(Memory.ROMName, "HIOUDEN") == 0 || + strcmp(Memory.ROMName, "�ݼɳ�") == 0 || //Tenshi no Uta + strcmp(Memory.ROMName, "FORTUNE QUEST") == 0 || + strcmp(Memory.ROMName, "FISHING TO BASSING") == 0 || + strncmp(Memory.ROMName, "TokyoDome '95Battle 7", 21) == 0 || + strcmp(Memory.ROMName, "OHMONO BLACKBASS") == 0 || + strncmp(Memory.ROMName, "SWORD WORLD SFC", 15) == 0 || + strcmp(Memory.ROMName, "MASTERS") == 0 || //Augusta 2 J + strcmp(Memory.ROMName, "SFC ���ײ�ް") == 0 + || //Kamen Rider + strncmp(Memory.ROMName, "LETs PACHINKO(", 14) == 0) //A set of BS games + IAPU.OneCycle = 15; + + + //Specific game fixes + + Settings.StarfoxHack = strcmp(Memory.ROMName, "STAR FOX") == 0 || + strcmp(Memory.ROMName, "STAR WING") == 0; + Settings.WinterGold = strcmp(Memory.ROMName, "FX SKIING NINTENDO 96") == 0 || + strcmp(Memory.ROMName, "DIRT RACER") == 0 || + Settings.StarfoxHack; + + + if ((strcmp(Memory.ROMName, "LEGEND") == 0 && !Settings.PAL) || + strcmp(Memory.ROMName, "King Arthurs World") == 0) + SNESGameFixes.EchoOnlyOutput = TRUE; + + + Settings.DaffyDuck = (strcmp(Memory.ROMName, "DAFFY DUCK: MARV MISS") == 0) || + (strcmp(Memory.ROMName, "ROBOCOP VS THE TERMIN") == 0) || + (strcmp(Memory.ROMName, "ROBOCOP VS TERMINATOR") == 0); //ROBOCOP VS THE TERMIN + Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX; + + //OAM hacks because we don't fully understand the + //behavior of the SNES. + + //Totally wacky display... + //seems to need a disproven behavior, so + //we're definitely overlooking some other bug? + if (strncmp(Memory.ROMName, "UNIRACERS", 9) == 0) + SNESGameFixes.Uniracers = true; + + + //is this even useful now? + if (strcmp(Memory.ROMName, "ALIENS vs. PREDATOR") == 0) + SNESGameFixes.alienVSpredetorFix = TRUE; + + if (strcmp(Memory.ROMName, "���̧߰н�") == 0 + || //Super Famista + strcmp(Memory.ROMName, "���̧߰н� 2") == 0 + || //Super Famista 2 + strcmp(Memory.ROMName, "ZENKI TENCHIMEIDOU") == 0 || + strcmp(Memory.ROMName, "GANBA LEAGUE") == 0) + SNESGameFixes.APU_OutPorts_ReturnValueFix = TRUE; + + if (strcmp(Memory.ROMName, "FURAI NO SIREN") == 0) + SNESGameFixes.SoundEnvelopeHeightReading2 = TRUE; + + //CPU timing hacks + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * + Settings.CyclesPercentage) / 100; + + //no need to ifdef for right now... + //#ifdef HDMA_HACKS + + // A Couple of HDMA related hacks - Lantus + if ((strcmp(Memory.ROMName, "SFX SUPERBUTOUDEN2") == 0) || + (strcmp(Memory.ROMName, "ALIEN vs. PREDATOR") == 0) || + (strcmp(Memory.ROMName, "STONE PROTECTORS") == 0) || + (strcmp(Memory.ROMName, "SUPER BATTLETANK 2") == 0)) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 130) / 100; + + if (strcmp(Memory.ROMName, "HOME IMPROVEMENT") == 0) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 200) / 100; + + // End HDMA hacks + //#endif + + + if (strcmp(Memory.ROMId, "ASRJ") == 0 && Settings.CyclesPercentage == 100) + // Street Racer + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 95) / 100; + + // Power Rangers Fight + if (strncmp(Memory.ROMId, "A3R", 3) == 0 || + // Clock Tower + strncmp(Memory.ROMId, "AJE", 3) == 0) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 103) / 100; + + + if (strncmp(Memory.ROMId, "A3M", 3) == 0 && Settings.CyclesPercentage == 100) + // Mortal Kombat 3. Fixes cut off speech sample + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; + + //Darkness Beyond Twilight + //Crimson beyond blood that flows + //buried in the stream of time + //is where your power grows + //I pledge myself to conquer + //all the foes who stand + //before the might gift betsowed + //in my unworthy hand + if (strcmp(Memory.ROMName, "\x0bd\x0da\x0b2\x0d4\x0b0\x0bd\x0de") == 0 && + Settings.CyclesPercentage == 100) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 101) / 100; #ifdef DETECT_NASTY_FX_INTERLEAVE -//XXX: Test without these. Win32 port indicates they aren't needed? -//Apparently are needed! - if (strcmp (Memory.ROMName, "WILD TRAX") == 0 || - strcmp (Memory.ROMName, "STAR FOX 2") == 0 || - strcmp (Memory.ROMName, "YOSSY'S ISLAND") == 0 || - strcmp (Memory.ROMName, "YOSHI'S ISLAND") == 0) - CPU.TriedInterleavedMode2 = TRUE; + //XXX: Test without these. Win32 port indicates they aren't needed? + //Apparently are needed! + if (strcmp(Memory.ROMName, "WILD TRAX") == 0 || + strcmp(Memory.ROMName, "STAR FOX 2") == 0 || + strcmp(Memory.ROMName, "YOSSY'S ISLAND") == 0 || + strcmp(Memory.ROMName, "YOSHI'S ISLAND") == 0) + CPU.TriedInterleavedMode2 = TRUE; #endif - // Start Trek: Deep Sleep 9 - if (strncmp (Memory.ROMId, "A9D", 3) == 0 && Settings.CyclesPercentage == 100) - Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; + // Start Trek: Deep Sleep 9 + if (strncmp(Memory.ROMId, "A9D", 3) == 0 && Settings.CyclesPercentage == 100) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; - //SA-1 Speedup settings - SA1.WaitAddress = NULL; - SA1.WaitByteAddress1 = NULL; - SA1.WaitByteAddress2 = NULL; - - /* Bass Fishing */ - if (strcmp (Memory.ROMId, "ZBPJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x0093f1 >> MEMMAP_SHIFT] + 0x93f1; + //SA-1 Speedup settings + SA1.WaitAddress = NULL; + SA1.WaitByteAddress1 = NULL; + SA1.WaitByteAddress2 = NULL; + + /* Bass Fishing */ + if (strcmp(Memory.ROMId, "ZBPJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0093f1 >> MEMMAP_SHIFT] + 0x93f1; SA1.WaitByteAddress1 = Memory.FillRAM + 0x304a; - } - /* DAISENRYAKU EXPERTWW2 */ - if (strcmp (Memory.ROMId, "AEVJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x0ed18d >> MEMMAP_SHIFT] + 0xd18d; + } + /* DAISENRYAKU EXPERTWW2 */ + if (strcmp(Memory.ROMId, "AEVJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0ed18d >> MEMMAP_SHIFT] + 0xd18d; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3000; - } - /* debjk2 */ - if (strcmp (Memory.ROMId, "A2DJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x008b62 >> MEMMAP_SHIFT] + 0x8b62; - } - /* Dragon Ballz HD */ - if (strcmp (Memory.ROMId, "AZIJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x008083 >> MEMMAP_SHIFT] + 0x8083; + } + /* debjk2 */ + if (strcmp(Memory.ROMId, "A2DJ") == 0) + SA1.WaitAddress = SA1.Map [0x008b62 >> MEMMAP_SHIFT] + 0x8b62; + /* Dragon Ballz HD */ + if (strcmp(Memory.ROMId, "AZIJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x008083 >> MEMMAP_SHIFT] + 0x8083; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3020; - } - /* SFC SDGUNDAMGNEXT */ - if (strcmp (Memory.ROMId, "ZX3J") == 0) - { - SA1.WaitAddress = SA1.Map [0x0087f2 >> MEMMAP_SHIFT] + 0x87f2; + } + /* SFC SDGUNDAMGNEXT */ + if (strcmp(Memory.ROMId, "ZX3J") == 0) + { + SA1.WaitAddress = SA1.Map [0x0087f2 >> MEMMAP_SHIFT] + 0x87f2; SA1.WaitByteAddress1 = Memory.FillRAM + 0x30c4; - } - /* ShougiNoHanamichi */ - if (strcmp (Memory.ROMId, "AARJ") == 0) - { - SA1.WaitAddress = SA1.Map [0xc1f85a >> MEMMAP_SHIFT] + 0xf85a; + } + /* ShougiNoHanamichi */ + if (strcmp(Memory.ROMId, "AARJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc1f85a >> MEMMAP_SHIFT] + 0xf85a; SA1.WaitByteAddress1 = Memory.SRAM + 0x0c64; SA1.WaitByteAddress2 = Memory.SRAM + 0x0c66; - } - /* KATO HIFUMI9DAN SYOGI */ - if (strcmp (Memory.ROMId, "A23J") == 0) - { - SA1.WaitAddress = SA1.Map [0xc25037 >> MEMMAP_SHIFT] + 0x5037; + } + /* KATO HIFUMI9DAN SYOGI */ + if (strcmp(Memory.ROMId, "A23J") == 0) + { + SA1.WaitAddress = SA1.Map [0xc25037 >> MEMMAP_SHIFT] + 0x5037; SA1.WaitByteAddress1 = Memory.SRAM + 0x0c06; SA1.WaitByteAddress2 = Memory.SRAM + 0x0c08; - } - /* idaten */ - if (strcmp (Memory.ROMId, "AIIJ") == 0) - { - SA1.WaitAddress = SA1.Map [0xc100be >> MEMMAP_SHIFT] + 0x00be; + } + /* idaten */ + if (strcmp(Memory.ROMId, "AIIJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc100be >> MEMMAP_SHIFT] + 0x00be; SA1.WaitByteAddress1 = Memory.SRAM + 0x1002; SA1.WaitByteAddress2 = Memory.SRAM + 0x1004; - } - /* igotais */ - if (strcmp (Memory.ROMId, "AITJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x0080b7 >> MEMMAP_SHIFT] + 0x80b7; - } - /* J96 DREAM STADIUM */ - if (strcmp (Memory.ROMId, "AJ6J") == 0) - { - SA1.WaitAddress = SA1.Map [0xc0f74a >> MEMMAP_SHIFT] + 0xf74a; - } - /* JumpinDerby */ - if (strcmp (Memory.ROMId, "AJUJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x00d926 >> MEMMAP_SHIFT] + 0xd926; - } - /* JKAKINOKI SHOUGI */ - if (strcmp (Memory.ROMId, "AKAJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x00f070 >> MEMMAP_SHIFT] + 0xf070; - } - /* HOSHI NO KIRBY 3 & KIRBY'S DREAM LAND 3 JAP & US */ - if (strcmp (Memory.ROMId, "AFJJ") == 0 || strcmp (Memory.ROMId, "AFJE") == 0) - { - SA1.WaitAddress = SA1.Map [0x0082d4 >> MEMMAP_SHIFT] + 0x82d4; + } + /* igotais */ + if (strcmp(Memory.ROMId, "AITJ") == 0) + SA1.WaitAddress = SA1.Map [0x0080b7 >> MEMMAP_SHIFT] + 0x80b7; + /* J96 DREAM STADIUM */ + if (strcmp(Memory.ROMId, "AJ6J") == 0) + SA1.WaitAddress = SA1.Map [0xc0f74a >> MEMMAP_SHIFT] + 0xf74a; + /* JumpinDerby */ + if (strcmp(Memory.ROMId, "AJUJ") == 0) + SA1.WaitAddress = SA1.Map [0x00d926 >> MEMMAP_SHIFT] + 0xd926; + /* JKAKINOKI SHOUGI */ + if (strcmp(Memory.ROMId, "AKAJ") == 0) + SA1.WaitAddress = SA1.Map [0x00f070 >> MEMMAP_SHIFT] + 0xf070; + /* HOSHI NO KIRBY 3 & KIRBY'S DREAM LAND 3 JAP & US */ + if (strcmp(Memory.ROMId, "AFJJ") == 0 || strcmp(Memory.ROMId, "AFJE") == 0) + { + SA1.WaitAddress = SA1.Map [0x0082d4 >> MEMMAP_SHIFT] + 0x82d4; SA1.WaitByteAddress1 = Memory.SRAM + 0x72a4; - } - /* KIRBY SUPER DELUXE JAP */ - if (strcmp (Memory.ROMId, "AKFJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x008c93 >> MEMMAP_SHIFT] + 0x8c93; + } + /* KIRBY SUPER DELUXE JAP */ + if (strcmp(Memory.ROMId, "AKFJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x008c93 >> MEMMAP_SHIFT] + 0x8c93; SA1.WaitByteAddress1 = Memory.FillRAM + 0x300a; SA1.WaitByteAddress2 = Memory.FillRAM + 0x300e; - } - /* KIRBY SUPER DELUXE US */ - if (strcmp (Memory.ROMId, "AKFE") == 0) - { - SA1.WaitAddress = SA1.Map [0x008cb8 >> MEMMAP_SHIFT] + 0x8cb8; + } + /* KIRBY SUPER DELUXE US */ + if (strcmp(Memory.ROMId, "AKFE") == 0) + { + SA1.WaitAddress = SA1.Map [0x008cb8 >> MEMMAP_SHIFT] + 0x8cb8; SA1.WaitByteAddress1 = Memory.FillRAM + 0x300a; SA1.WaitByteAddress2 = Memory.FillRAM + 0x300e; - } - /* SUPER MARIO RPG JAP & US */ - if (strcmp (Memory.ROMId, "ARWJ") == 0 || strcmp (Memory.ROMId, "ARWE") == 0) - { - SA1.WaitAddress = SA1.Map [0xc0816f >> MEMMAP_SHIFT] + 0x816f; + } + /* SUPER MARIO RPG JAP & US */ + if (strcmp(Memory.ROMId, "ARWJ") == 0 || strcmp(Memory.ROMId, "ARWE") == 0) + { + SA1.WaitAddress = SA1.Map [0xc0816f >> MEMMAP_SHIFT] + 0x816f; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3000; - } - /* marvelous.zip */ - if (strcmp (Memory.ROMId, "AVRJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x0085f2 >> MEMMAP_SHIFT] + 0x85f2; + } + /* marvelous.zip */ + if (strcmp(Memory.ROMId, "AVRJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0085f2 >> MEMMAP_SHIFT] + 0x85f2; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3024; - } - /* AUGUSTA3 MASTERS NEW */ - if (strcmp (Memory.ROMId, "AO3J") == 0) - { - SA1.WaitAddress = SA1.Map [0x00dddb >> MEMMAP_SHIFT] + 0xdddb; + } + /* AUGUSTA3 MASTERS NEW */ + if (strcmp(Memory.ROMId, "AO3J") == 0) + { + SA1.WaitAddress = SA1.Map [0x00dddb >> MEMMAP_SHIFT] + 0xdddb; SA1.WaitByteAddress1 = Memory.FillRAM + 0x37b4; - } - /* OSHABERI PARODIUS */ - if (strcmp (Memory.ROMId, "AJOJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x8084e5 >> MEMMAP_SHIFT] + 0x84e5; - } - /* PANIC BOMBER WORLD */ - if (strcmp (Memory.ROMId, "APBJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x00857a >> MEMMAP_SHIFT] + 0x857a; - } - /* PEBBLE BEACH NEW */ - if (strcmp (Memory.ROMId, "AONJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x00df33 >> MEMMAP_SHIFT] + 0xdf33; + } + /* OSHABERI PARODIUS */ + if (strcmp(Memory.ROMId, "AJOJ") == 0) + SA1.WaitAddress = SA1.Map [0x8084e5 >> MEMMAP_SHIFT] + 0x84e5; + /* PANIC BOMBER WORLD */ + if (strcmp(Memory.ROMId, "APBJ") == 0) + SA1.WaitAddress = SA1.Map [0x00857a >> MEMMAP_SHIFT] + 0x857a; + /* PEBBLE BEACH NEW */ + if (strcmp(Memory.ROMId, "AONJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00df33 >> MEMMAP_SHIFT] + 0xdf33; SA1.WaitByteAddress1 = Memory.FillRAM + 0x37b4; - } - /* PGA EUROPEAN TOUR */ - if (strcmp (Memory.ROMId, "AEPE") == 0) - { - SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; + } + /* PGA EUROPEAN TOUR */ + if (strcmp(Memory.ROMId, "AEPE") == 0) + { + SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3102; - } - /* PGA TOUR 96 */ - if (strcmp (Memory.ROMId, "A3GE") == 0) - { - SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; + } + /* PGA TOUR 96 */ + if (strcmp(Memory.ROMId, "A3GE") == 0) + { + SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3102; - } - /* POWER RANGERS 4 */ - if (strcmp (Memory.ROMId, "A4RE") == 0) - { - SA1.WaitAddress = SA1.Map [0x009899 >> MEMMAP_SHIFT] + 0x9899; + } + /* POWER RANGERS 4 */ + if (strcmp(Memory.ROMId, "A4RE") == 0) + { + SA1.WaitAddress = SA1.Map [0x009899 >> MEMMAP_SHIFT] + 0x9899; SA1.WaitByteAddress1 = Memory.FillRAM + 0x3000; - } - /* PACHISURO PALUSUPE */ - if (strcmp (Memory.ROMId, "AGFJ") == 0) - { - // Never seems to turn on the SA-1! - } - /* SD F1 GRAND PRIX */ - if (strcmp (Memory.ROMId, "AGFJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x0181bc >> MEMMAP_SHIFT] + 0x81bc; - } - /* SHOUGI MARJONG */ - if (strcmp (Memory.ROMId, "ASYJ") == 0) - { - SA1.WaitAddress = SA1.Map [0x00f2cc >> MEMMAP_SHIFT] + 0xf2cc; + } + /* PACHISURO PALUSUPE */ + if (strcmp(Memory.ROMId, "AGFJ") == 0) + { + // Never seems to turn on the SA-1! + } + /* SD F1 GRAND PRIX */ + if (strcmp(Memory.ROMId, "AGFJ") == 0) + SA1.WaitAddress = SA1.Map [0x0181bc >> MEMMAP_SHIFT] + 0x81bc; + /* SHOUGI MARJONG */ + if (strcmp(Memory.ROMId, "ASYJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00f2cc >> MEMMAP_SHIFT] + 0xf2cc; SA1.WaitByteAddress1 = Memory.SRAM + 0x7ffe; SA1.WaitByteAddress2 = Memory.SRAM + 0x7ffc; - } - /* shogisai2 */ - if (strcmp (Memory.ROMId, "AX2J") == 0) - { - SA1.WaitAddress = SA1.Map [0x00d675 >> MEMMAP_SHIFT] + 0xd675; - } - - /* SHINING SCORPION */ - if (strcmp (Memory.ROMId, "A4WJ") == 0) - { - SA1.WaitAddress = SA1.Map [0xc048be >> MEMMAP_SHIFT] + 0x48be; - } - /* SHIN SHOUGI CLUB */ - if (strcmp (Memory.ROMId, "AHJJ") == 0) - { - SA1.WaitAddress = SA1.Map [0xc1002a >> MEMMAP_SHIFT] + 0x002a; + } + /* shogisai2 */ + if (strcmp(Memory.ROMId, "AX2J") == 0) + SA1.WaitAddress = SA1.Map [0x00d675 >> MEMMAP_SHIFT] + 0xd675; + + /* SHINING SCORPION */ + if (strcmp(Memory.ROMId, "A4WJ") == 0) + SA1.WaitAddress = SA1.Map [0xc048be >> MEMMAP_SHIFT] + 0x48be; + /* SHIN SHOUGI CLUB */ + if (strcmp(Memory.ROMId, "AHJJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc1002a >> MEMMAP_SHIFT] + 0x002a; SA1.WaitByteAddress1 = Memory.SRAM + 0x0806; SA1.WaitByteAddress2 = Memory.SRAM + 0x0808; - } - - - //Other - - // Additional game fixes by sanmaiwashi ... - if (strcmp (Memory.ROMName, "SFX ŲĶÞÝÀÞÑÓɶÞÀØ 1") == 0) //Gundam Knight Story - { - bytes0x2000 [0xb18] = 0x4c; - bytes0x2000 [0xb19] = 0x4b; - bytes0x2000 [0xb1a] = 0xea; - SNESGameFixes.SRAMInitialValue = 0x6b; - } - - - // HITOMI3 - if (strcmp (Memory.ROMName, "HITOMI3") == 0) - { - Memory.SRAMSize = 1; + } + + + //Other + + // Additional game fixes by sanmaiwashi ... + if (strcmp(Memory.ROMName, + "SFX ŲĶ������ɶ��� 1") == + 0) //Gundam Knight Story + { + bytes0x2000 [0xb18] = 0x4c; + bytes0x2000 [0xb19] = 0x4b; + bytes0x2000 [0xb1a] = 0xea; + SNESGameFixes.SRAMInitialValue = 0x6b; + } + + + // HITOMI3 + if (strcmp(Memory.ROMName, "HITOMI3") == 0) + { + Memory.SRAMSize = 1; Memory.SRAMMask = Memory.SRAMSize ? - ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; - } + ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; + } - //sram value fixes - if (strcmp (Memory.ROMName, "SUPER DRIFT OUT") == 0 || - strcmp(Memory.ROMName, "SATAN IS OUR FATHER!") == 0 || - strcmp (Memory.ROMName, "goemon 4") == 0) - SNESGameFixes.SRAMInitialValue = 0x00; + //sram value fixes + if (strcmp(Memory.ROMName, "SUPER DRIFT OUT") == 0 || + strcmp(Memory.ROMName, "SATAN IS OUR FATHER!") == 0 || + strcmp(Memory.ROMName, "goemon 4") == 0) + SNESGameFixes.SRAMInitialValue = 0x00; #if 0 - if(strcmp (Memory.ROMName, "XBAND JAPANESE MODEM") == 0) - { - for (c = 0x200; c < 0x400; c += 16) - { - for (int i = c; i < c + 16; i++) - { + if (strcmp(Memory.ROMName, "XBAND JAPANESE MODEM") == 0) + { + for (c = 0x200; c < 0x400; c += 16) + { + for (int i = c; i < c + 16; i++) + { Memory.Map [i + 0x400] = Memory.Map [i + 0xc00] = &ROM[c * 0x1000]; Memory.BlockIsRAM [i + 0x400] = Memory.BlockIsRAM [i + 0xc00] = TRUE; - BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = FALSE; - } - } - WriteProtectROM (); - } + BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = FALSE; + } + } + WriteProtectROM(); + } #endif - + #define RomPatch(adr,ov,nv) \ if (Memory.ROM [adr] == ov) \ Memory.ROM [adr] = nv - - - // Love Quest - if (strcmp (Memory.ROMName, "LOVE QUEST") == 0) - { - RomPatch (0x1385ec, 0xd0, 0xea); - RomPatch (0x1385ed, 0xb2, 0xea); - } - //BNE D0 into nops - - //seems like the next instruction is a BRA - //otherwise, this one's too complex for MKendora - // Nangoku Syonen Papuwa Kun - if (strcmp (Memory.ROMName, "NANGOKUSYONEN PAPUWA") == 0) - RomPatch (0x1f0d1, 0xa0, 0x6b); - //turns an LDY into an RTL? - - //this is a cmp on $00:2140 - // Super Batter Up - if (strcmp (Memory.ROMName, "Super Batter Up") == 0) - { - RomPatch (0x27ae0, 0xd0, 0xea); - RomPatch (0x27ae1, 0xfa, 0xea); - } - //BNE + + + // Love Quest + if (strcmp(Memory.ROMName, "LOVE QUEST") == 0) + { + RomPatch(0x1385ec, 0xd0, 0xea); + RomPatch(0x1385ed, 0xb2, 0xea); + } + //BNE D0 into nops + + //seems like the next instruction is a BRA + //otherwise, this one's too complex for MKendora + // Nangoku Syonen Papuwa Kun + if (strcmp(Memory.ROMName, "NANGOKUSYONEN PAPUWA") == 0) + RomPatch(0x1f0d1, 0xa0, 0x6b); + //turns an LDY into an RTL? + + //this is a cmp on $00:2140 + // Super Batter Up + if (strcmp(Memory.ROMName, "Super Batter Up") == 0) + { + RomPatch(0x27ae0, 0xd0, 0xea); + RomPatch(0x27ae1, 0xfa, 0xea); + } + //BNE } // Read variable size MSB int from a file -static long ReadInt (FILE *f, unsigned nbytes) +static long ReadInt(FILE* f, unsigned nbytes) { - long v = 0; - while (nbytes--) - { - int c = fgetc(f); - if (c == EOF) - return -1; - v = (v << 8) | (c & 0xFF); - } - return (v); + long v = 0; + while (nbytes--) + { + int c = fgetc(f); + if (c == EOF) + return -1; + v = (v << 8) | (c & 0xFF); + } + return (v); } #define IPS_EOF 0x00454F46l -void CheckForIPSPatch (const char *rom_filename, bool8 header, - int32* rom_size) +void CheckForIPSPatch(const char* rom_filename, bool8 header, + int32* rom_size) { - char dir [_MAX_DIR + 1]; - char drive [_MAX_DRIVE + 1]; - char name [_MAX_FNAME + 1]; - char ext [_MAX_EXT + 1]; - char fname [_MAX_PATH + 1]; - FILE *patch_file = NULL; - long offset = header ? 512 : 0; - - _splitpath (rom_filename, drive, dir, name, ext); - _makepath (fname, drive, dir, name, "ips"); - - if (!(patch_file = fopen (fname, "rb"))) - { - if (!(patch_file = fopen (S9xGetFilename (".ips"), "rb"))) - return; - } - - if (fread ((unsigned char*)fname, 1, 5, patch_file) != 5 || - strncmp (fname, "PATCH", 5) != 0) - { - fclose (patch_file); - return; - } - - int32 ofs; - - for (;;) - { - long len; - long rlen; - int rchar; - - ofs = ReadInt (patch_file, 3); - if (ofs == -1) - goto err_eof; - - if (ofs == IPS_EOF) - break; - - ofs -= offset; - - len = ReadInt (patch_file, 2); - if (len == -1) - goto err_eof; - - /* Apply patch block */ - if (len) - { - if (ofs + len > MAX_ROM_SIZE) - goto err_eof; - - while (len--) - { - rchar = fgetc (patch_file); - if (rchar == EOF) - goto err_eof; + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char fname [_MAX_PATH + 1]; + FILE* patch_file = NULL; + long offset = header ? 512 : 0; + + _splitpath(rom_filename, drive, dir, name, ext); + _makepath(fname, drive, dir, name, "ips"); + + if (!(patch_file = fopen(fname, "rb"))) + { + if (!(patch_file = fopen(S9xGetFilename(".ips"), "rb"))) + return; + } + + if (fread((unsigned char*)fname, 1, 5, patch_file) != 5 || + strncmp(fname, "PATCH", 5) != 0) + { + fclose(patch_file); + return; + } + + int32 ofs; + + for (;;) + { + long len; + long rlen; + int rchar; + + ofs = ReadInt(patch_file, 3); + if (ofs == -1) + goto err_eof; + + if (ofs == IPS_EOF) + break; + + ofs -= offset; + + len = ReadInt(patch_file, 2); + if (len == -1) + goto err_eof; + + /* Apply patch block */ + if (len) + { + if (ofs + len > MAX_ROM_SIZE) + goto err_eof; + + while (len--) + { + rchar = fgetc(patch_file); + if (rchar == EOF) + goto err_eof; Memory.ROM [ofs++] = (uint8) rchar; - } + } if (ofs > *rom_size) *rom_size = ofs; - } - else - { - rlen = ReadInt (patch_file, 2); - if (rlen == -1) - goto err_eof; - - rchar = fgetc (patch_file); - if (rchar == EOF) - goto err_eof; - - if (ofs + rlen > MAX_ROM_SIZE) - goto err_eof; - - while (rlen--) + } + else + { + rlen = ReadInt(patch_file, 2); + if (rlen == -1) + goto err_eof; + + rchar = fgetc(patch_file); + if (rchar == EOF) + goto err_eof; + + if (ofs + rlen > MAX_ROM_SIZE) + goto err_eof; + + while (rlen--) Memory.ROM [ofs++] = (uint8) rchar; - + if (ofs > *rom_size) *rom_size = ofs; - } - } - - // Check if ROM image needs to be truncated - ofs = ReadInt (patch_file, 3); - if (ofs != -1 && ofs - offset < *rom_size) - { - // Need to truncate ROM image + } + } + + // Check if ROM image needs to be truncated + ofs = ReadInt(patch_file, 3); + if (ofs != -1 && ofs - offset < *rom_size) + { + // Need to truncate ROM image *rom_size = ofs - offset; - } - fclose (patch_file); - return; - + } + fclose(patch_file); + return; + err_eof: - if (patch_file) - fclose (patch_file); + if (patch_file) + fclose(patch_file); } -int is_bsx(unsigned char *p) +int is_bsx(unsigned char* p) { - unsigned c; - - if ( p[0x19] & 0x4f ) - goto notbsx; - c = p[0x1a]; - if ( (c != 0x33) && (c != 0xff) ) // 0x33 = Manufacturer: Nintendo - goto notbsx; - c = (p[0x17] << 8) | p[0x16]; - if ( (c != 0x0000) && (c != 0xffff) ) - { - if ( (c & 0x040f) != 0 ) - goto notbsx; - if ( (c & 0xff) > 0xc0 ) - goto notbsx; - } - c = p[0x18]; - if ( (c & 0xce) || ((c & 0x30)==0) ) - goto notbsx; - if ( (p[0x15] & 0x03) != 0 ) - goto notbsx; - c = p[0x13]; - if ( (c != 0x00) && (c != 0xff) ) - goto notbsx; - if ( p[0x14] != 0x00 ) - goto notbsx; - if ( bs_name(p) != 0 ) - goto notbsx; - return 0; // It's a Satellaview ROM! + unsigned c; + + if (p[0x19] & 0x4f) + goto notbsx; + c = p[0x1a]; + if ((c != 0x33) && (c != 0xff)) // 0x33 = Manufacturer: Nintendo + goto notbsx; + c = (p[0x17] << 8) | p[0x16]; + if ((c != 0x0000) && (c != 0xffff)) + { + if ((c & 0x040f) != 0) + goto notbsx; + if ((c & 0xff) > 0xc0) + goto notbsx; + } + c = p[0x18]; + if ((c & 0xce) || ((c & 0x30) == 0)) + goto notbsx; + if ((p[0x15] & 0x03) != 0) + goto notbsx; + c = p[0x13]; + if ((c != 0x00) && (c != 0xff)) + goto notbsx; + if (p[0x14] != 0x00) + goto notbsx; + if (bs_name(p) != 0) + goto notbsx; + return 0; // It's a Satellaview ROM! notbsx: - return -1; + return -1; } -int bs_name(unsigned char *p) +int bs_name(unsigned char* p) { - unsigned c; - int lcount; - int numv; // number of valid name characters seen so far - numv = 0; - for ( lcount = 16; lcount > 0; lcount-- ) - { - if ( check_char( c = *p++ ) != 0 ) - { - c = *p++; - if ( c < 0x20 ) - { - if ( (numv != 0x0b) || (c != 0) ) // Dr. Mario Hack - goto notBsName; - } - - numv++; - lcount--; - continue; - } - else - { - if ( c == 0 ) - { - if ( numv == 0 ) - goto notBsName; - continue; - } - - if ( c < 0x20 ) - goto notBsName; - if ( c >= 0x80 ) - { - if ( (c < 0xa0) || ( c >= 0xf0 ) ) - goto notBsName; - } - numv++; - } - } - if ( numv > 0 ) - return 0; + unsigned c; + int lcount; + int numv; // number of valid name characters seen so far + numv = 0; + for (lcount = 16; lcount > 0; lcount--) + { + if (check_char(c = *p++) != 0) + { + c = *p++; + if (c < 0x20) + { + if ((numv != 0x0b) || (c != 0)) // Dr. Mario Hack + goto notBsName; + } + + numv++; + lcount--; + continue; + } + else + { + if (c == 0) + { + if (numv == 0) + goto notBsName; + continue; + } + + if (c < 0x20) + goto notBsName; + if (c >= 0x80) + { + if ((c < 0xa0) || (c >= 0xf0)) + goto notBsName; + } + numv++; + } + } + if (numv > 0) + return 0; notBsName: - return -1; + return -1; } int check_char(unsigned c) { - if ( ( c & 0x80 ) == 0 ) - return 0; - if ( ( c - 0x20 ) & 0x40 ) - return 1; - else - return 0; + if ((c & 0x80) == 0) + return 0; + if ((c - 0x20) & 0x40) + return 1; + else + return 0; } void ParseSNESHeader(uint8* RomHeader) { - Memory.SRAMSize = RomHeader [0x28]; - strncpy (Memory.ROMName, (char *) &RomHeader[0x10], ROM_NAME_LEN - 1); - Memory.ROMSpeed = RomHeader [0x25]; - Memory.ROMType = RomHeader [0x26]; - Memory.ROMSize = RomHeader [0x27]; - Memory.ROMChecksum = RomHeader [0x2e] + (RomHeader [0x2f] << 8); - Memory.ROMComplementChecksum = RomHeader [0x2c] + (RomHeader [0x2d] << 8); - Memory.ROMRegion= RomHeader[0x29]; - // memmove converted: Different mallocs [Neb] - memcpy (Memory.ROMId, &RomHeader [0x2], 4); - if(RomHeader[0x2A]==0x33) - // memmove converted: Different mallocs [Neb] - memcpy (Memory.CompanyId, &RomHeader [0], 2); - else sprintf(Memory.CompanyId, "%02X", RomHeader[0x2A]); + Memory.SRAMSize = RomHeader [0x28]; + strncpy(Memory.ROMName, (char*) &RomHeader[0x10], ROM_NAME_LEN - 1); + Memory.ROMSpeed = RomHeader [0x25]; + Memory.ROMType = RomHeader [0x26]; + Memory.ROMSize = RomHeader [0x27]; + Memory.ROMChecksum = RomHeader [0x2e] + (RomHeader [0x2f] << 8); + Memory.ROMComplementChecksum = RomHeader [0x2c] + (RomHeader [0x2d] << 8); + Memory.ROMRegion = RomHeader[0x29]; + // memmove converted: Different mallocs [Neb] + memcpy(Memory.ROMId, &RomHeader [0x2], 4); + if (RomHeader[0x2A] == 0x33) + // memmove converted: Different mallocs [Neb] + memcpy(Memory.CompanyId, &RomHeader [0], 2); + else sprintf(Memory.CompanyId, "%02X", RomHeader[0x2A]); } #undef INLINE |