void (*PicoCartLoadProgressCB)(int percent) = NULL;\r
void (*PicoCDLoadProgressCB)(const char *fname, int percent) = NULL; // handled in Pico/cd/cd_file.c\r
\r
-static void PicoCartDetect(void);\r
+static void PicoCartDetect(const char *carthw_cfg);\r
\r
/* cso struct */\r
typedef struct _cso_struct\r
return ret;\r
}\r
\r
-\r
-static void Byteswap(unsigned char *data,int len)\r
+// byteswap, data needs to be int aligned, src can match dst\r
+void Byteswap(void *dst, const void *src, int len)\r
{\r
- int i=0;\r
-\r
- if (len<2) return; // Too short\r
+ const unsigned int *ps = src;\r
+ unsigned int *pd = dst;\r
+ int i, m;\r
\r
- do\r
- {\r
- unsigned short *pd=(unsigned short *)(data+i);\r
- int value=*pd; // Get 2 bytes\r
+ if (len < 2)\r
+ return;\r
\r
- value=(value<<8)|(value>>8); // Byteswap it\r
- *pd=(unsigned short)value; // Put 2b ytes\r
- i+=2;\r
+ m = 0x00ff00ff;\r
+ for (i = 0; i < len / 4; i++) {\r
+ unsigned int t = ps[i];\r
+ pd[i] = ((t & m) << 8) | ((t & ~m) >> 8);\r
}\r
- while (i+2<=len);\r
}\r
\r
// Interleve a 16k block and byteswap\r
elprintf(EL_STATUS, "SMD format detected.");\r
DecodeSmd(rom,size); size-=0x200; // Decode and byteswap SMD\r
}\r
- else Byteswap(rom,size); // Just byteswap\r
+ else Byteswap(rom, rom, size); // Just byteswap\r
}\r
else\r
{\r
}\r
\r
// Insert a cartridge:\r
-int PicoCartInsert(unsigned char *rom,unsigned int romsize)\r
+int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_cfg)\r
{\r
// notaz: add a 68k "jump one op back" opcode to the end of ROM.\r
// This will hang the emu, but will prevent nasty crashes.\r
carthw_chunks = NULL;\r
\r
if (!(PicoAHW & (PAHW_MCD|PAHW_SMS)))\r
- PicoCartDetect();\r
+ PicoCartDetect(carthw_cfg);\r
\r
// setup correct memory map for loaded ROM\r
switch (PicoAHW) {\r
PicoCartUnloadHook = NULL;\r
}\r
\r
+ if (PicoAHW & PAHW_32X)\r
+ PicoUnload32x();\r
+\r
if (Pico.rom != NULL) {\r
SekFinishIdleDet();\r
free(Pico.rom);\r
elprintf(EL_STATUS, "caclulating CRC32..");\r
\r
// have to unbyteswap for calculation..\r
- Byteswap(Pico.rom, Pico.romsize);\r
+ Byteswap(Pico.rom, Pico.rom, Pico.romsize);\r
crc = crc32(0, Pico.rom, Pico.romsize);\r
- Byteswap(Pico.rom, Pico.romsize);\r
+ Byteswap(Pico.rom, Pico.rom, Pico.romsize);\r
return crc;\r
}\r
\r
return 1;\r
}\r
\r
-static void parse_carthw(int *fill_sram)\r
+static void parse_carthw(const char *carthw_cfg, int *fill_sram)\r
{\r
int line = 0, any_checks_passed = 0, skip_sect = 0;\r
int tmp, rom_crc = 0;\r
char buff[256], *p, *r;\r
FILE *f;\r
\r
- f = fopen("carthw.cfg", "r");\r
+ f = fopen(carthw_cfg, "r");\r
if (f == NULL) {\r
- elprintf(EL_STATUS, "couldn't open carthw.txt!");\r
+ elprintf(EL_STATUS, "couldn't open carthw.cfg!");\r
return;\r
}\r
\r
/*\r
* various cart-specific things, which can't be handled by generic code\r
*/\r
-static void PicoCartDetect(void)\r
+static void PicoCartDetect(const char *carthw_cfg)\r
{\r
int fill_sram = 0;\r
\r
SRam.eeprom_bit_in = 0;\r
SRam.eeprom_bit_out= 0;\r
\r
- parse_carthw(&fill_sram);\r
+ if (carthw_cfg != NULL)\r
+ parse_carthw(carthw_cfg, &fill_sram);\r
\r
if (SRam.flags & SRF_ENABLED)\r
{\r