diff --git a/NEO.emu/res/gngeo_data.zip b/NEO.emu/res/gngeo_data.zip index 3111c7644..a0b71b04f 100644 Binary files a/NEO.emu/res/gngeo_data.zip and b/NEO.emu/res/gngeo_data.zip differ diff --git a/NEO.emu/res/romsets/pnyaa.drv b/NEO.emu/res/romsets/pnyaa.drv index 85bb57da2..a8b1fcd65 100644 Binary files a/NEO.emu/res/romsets/pnyaa.drv and b/NEO.emu/res/romsets/pnyaa.drv differ diff --git a/NEO.emu/res/romsets/samsh5sp.drv b/NEO.emu/res/romsets/samsh5sp.drv index 86dfda34a..e3aa5744e 100644 Binary files a/NEO.emu/res/romsets/samsh5sp.drv and b/NEO.emu/res/romsets/samsh5sp.drv differ diff --git a/NEO.emu/res/romsets/samsh5sph.drv b/NEO.emu/res/romsets/samsh5sph.drv index 8fffeeb89..19715e296 100644 Binary files a/NEO.emu/res/romsets/samsh5sph.drv and b/NEO.emu/res/romsets/samsh5sph.drv differ diff --git a/NEO.emu/res/romsets/samsh5spn.drv b/NEO.emu/res/romsets/samsh5spn.drv index b8ccb79bd..7149df8e6 100644 Binary files a/NEO.emu/res/romsets/samsh5spn.drv and b/NEO.emu/res/romsets/samsh5spn.drv differ diff --git a/NEO.emu/src/gngeo/cyclone_interf.c b/NEO.emu/src/gngeo/cyclone_interf.c index 420de9e39..49f46390c 100644 --- a/NEO.emu/src/gngeo/cyclone_interf.c +++ b/NEO.emu/src/gngeo/cyclone_interf.c @@ -381,11 +381,6 @@ void cpu_68k_interrupt(int a) { MyCyclone.irq=a; } -void cpu_68k_bankswitch(Uint32 address) { - //printf("Bankswitch %08x\n",address); - bankaddress = address; -} - void cpu_68k_disassemble(int pc, int nb_instr) { /* TODO */ } diff --git a/NEO.emu/src/gngeo/emu.c b/NEO.emu/src/gngeo/emu.c index 4cb3b9183..844be1651 100644 --- a/NEO.emu/src/gngeo/emu.c +++ b/NEO.emu/src/gngeo/emu.c @@ -80,6 +80,7 @@ void neogeo_reset(void) { memset(memory.ram, 0 , sizeof(memory.ram)); memset(memory.z80_ram, 0 , sizeof(memory.z80_ram)); memcpy(memory.rom.cpu_m68k.p, memory.rom.bios_m68k.p, 0x80); + memset(pvcMem, 0 , sizeof(pvcMem)); memory.current_vector=0; memory.vid.current_line = 0; init_timer(); @@ -87,11 +88,6 @@ void neogeo_reset(void) { sound_code = 0; pending_command = 0; result_code = 0; -#ifdef ENABLE_940T - shared_ctl->sound_code = sound_code; - shared_ctl->pending_command = pending_command; - shared_ctl->result_code = result_code; -#endif if (memory.rom.cpu_m68k.size > 0x100000) cpu_68k_bankswitch(0x100000); else @@ -107,16 +103,8 @@ void init_sound(void) } void init_neo(void) { -#ifdef ENABLE_940T - int z80_overclk = CF_VAL(cf_get_item_by_name("z80clock")); -#endif - //neogeo_init_save_state(); -#ifdef GP2X - gp2x_ram_ptr_reset(); -#endif - cpu_68k_init(); // neogeo_reset(); pd4990a_init(); diff --git a/NEO.emu/src/gngeo/memory.c b/NEO.emu/src/gngeo/memory.c index d4ae16a70..3bb211609 100644 --- a/NEO.emu/src/gngeo/memory.c +++ b/NEO.emu/src/gngeo/memory.c @@ -16,20 +16,13 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef HAVE_CONFIG_H #include -#endif - #include "emu.h" #include "video.h" #include "memory.h" #include "pd4990a.h" #include -#ifdef GP2X -#include "ym2610-940/940shared.h" -#endif - Uint8 (*mem68k_fetch_bksw_byte)(Uint32); Uint16 (*mem68k_fetch_bksw_word)(Uint32); Uint32 (*mem68k_fetch_bksw_long)(Uint32); @@ -38,6 +31,9 @@ void (*mem68k_store_bksw_word)(Uint32,Uint16); void (*mem68k_store_bksw_long)(Uint32,Uint32); neo_mem memory; +uint8_t pvcMem[0x2000]; +bool hasPvc = 0; +uint16_t neogeo_rng = 0x2345; Uint8 *current_pal; Uint32 *current_pc_pal; @@ -105,7 +101,6 @@ void write_irq2pos(Uint32 data) { } } -#ifndef ENABLE_940T /* Z80 IO port handler */ Uint8 z80_port_read(Uint16 PortNo) { @@ -189,7 +184,6 @@ void z80_port_write(Uint16 PortNb, Uint8 Value) break; } } -#endif /* Protection hack */ Uint16 protection_9a37(Uint32 addr) { @@ -199,14 +193,17 @@ Uint16 protection_9a37(Uint32 addr) { /* fetching function */ /**** INVALID FETCHING ****/ Uint8 mem68k_fetch_invalid_byte(Uint32 addr) { + logWarn("Invalid read byte @ %X", addr); return 0xF0; } Uint16 mem68k_fetch_invalid_word(Uint32 addr) { + logWarn("Invalid read word @ %X", addr); return 0xF0F0; } Uint32 mem68k_fetch_invalid_long(Uint32 addr) { + logWarn("Invalid read long @ %X", addr); return 0xF0F0F0F0; } @@ -308,26 +305,19 @@ Uint8 mem68k_fetch_video_byte(Uint32 addr) { break; } } -// addr &= 0xFFFF; -// if (addr == 0xe) -// return 0xff; - return 0xFF; + return mem68k_fetch_invalid_byte(addr); } Uint16 mem68k_fetch_video_word(Uint32 addr) { //printf("mem68k_fetch_video_word %08x\n",addr); addr &= 0x7; - /* - if (addr==0x00) - return vptr; - */ if (addr == 0x00 || addr == 0x02 || addr == 0x0a) return memory.vid.rbuf;//READ_WORD(&memory.vid.ram[memory.vid.vptr << 1]); if (addr == 0x04) return memory.vid.modulo; if (addr == 0x06) return read_neo_control(); - return 0; + return mem68k_fetch_invalid_word(addr); } LONG_FETCH(mem68k_fetch_video) ; @@ -344,17 +334,17 @@ Uint8 mem68k_fetch_ctl1_byte(Uint32 addr) { return (conf.test_switch ? 0x00 : 0x80); } - return 0; + return mem68k_fetch_invalid_byte(addr); } Uint16 mem68k_fetch_ctl1_word(Uint32 addr) { // printf("mem68k_fetch_ctl1_word\n"); - return 0; + return mem68k_fetch_invalid_word(addr);; } Uint32 mem68k_fetch_ctl1_long(Uint32 addr) { // printf("mem68k_fetch_ctl1_long\n"); - return 0; + return mem68k_fetch_invalid_long(addr); } Uint8 mem68k_fetch_ctl2_byte(Uint32 addr) { @@ -362,15 +352,15 @@ Uint8 mem68k_fetch_ctl2_byte(Uint32 addr) { return memory.intern_p2; if ((addr & 0xFFFF) == 0x01) return 0xFF; - return 0; + return mem68k_fetch_invalid_byte(addr); } Uint16 mem68k_fetch_ctl2_word(Uint32 addr) { - return 0; + return mem68k_fetch_invalid_word(addr); } Uint32 mem68k_fetch_ctl2_long(Uint32 addr) { - return 0; + return mem68k_fetch_invalid_long(addr); } Uint8 mem68k_fetch_ctl3_byte(Uint32 addr) { @@ -386,11 +376,11 @@ Uint16 mem68k_fetch_ctl3_word(Uint32 addr) { if ((addr & 0xFFFF) == 0x0) return memory.intern_start | 0xFF00; */ - return 0; + return mem68k_fetch_invalid_word(addr); } Uint32 mem68k_fetch_ctl3_long(Uint32 addr) { - return 0; + return mem68k_fetch_invalid_long(addr); } Uint8 mem68k_fetch_coin_byte(Uint32 addr) { @@ -409,15 +399,15 @@ Uint8 mem68k_fetch_coin_byte(Uint32 addr) { res &= 0x7f; return res; } - return 0; + return mem68k_fetch_invalid_byte(addr); } Uint16 mem68k_fetch_coin_word(Uint32 addr) { - return 0; + return mem68k_fetch_invalid_word(addr); } Uint32 mem68k_fetch_coin_long(Uint32 addr) { - return 0; + return mem68k_fetch_invalid_long(addr); } /**** MEMCARD ****/ @@ -766,12 +756,21 @@ void mem68k_store_memcrd_long(Uint32 addr, Uint32 data) { } /**** bankswitchers ****/ -static Uint16 neogeo_rng = 0x2345; -Uint16 sma_random(void) { - Uint16 old = neogeo_rng; +void cpu_68k_bankswitch(uint32_t addr) +{ + if(bankaddress != addr) + { + //logMsg("bank switch:%X", addr); + } + bankaddress = addr; +} + +static uint16_t sma_random() +{ + uint16_t old = neogeo_rng; - Uint16 newbit = ((neogeo_rng >> 2) ^ (neogeo_rng >> 3) ^ (neogeo_rng >> 5) + uint16_t newbit = ((neogeo_rng >> 2) ^ (neogeo_rng >> 3) ^ (neogeo_rng >> 5) ^ (neogeo_rng >> 6) ^ (neogeo_rng >> 7) ^ (neogeo_rng >> 11) ^ (neogeo_rng >> 12) ^ (neogeo_rng >> 15)) & 1; @@ -781,70 +780,145 @@ Uint16 sma_random(void) { } /* Normal bankswitcher */ -Uint8 mem68k_fetch_bk_normal_byte(Uint32 addr) { - addr &= 0xFFFFF; - if (memory.bksw_unscramble) { /* SMA prot & random number generator */ - Uint32 a=addr&0xFFFFE; - if (a == 0xfe446) { +Uint8 mem68k_fetch_bk_normal_byte(uint32_t addr) +{ + addr &= 0xfffff; + if(hasPvc && addr >= 0xfe000) + { + //logMsg("PVC RB:%X", addr); + return READ_BYTE_ROM((uint8_t*)pvcMem + (addr & 0x1fff)); + } + else if(memory.bksw_unscramble) + { /* SMA prot & random number generator */ + uint32_t a = addr & 0xffffe; + if(a == 0xfe446) + { //printf("Prot reading B %08x\n", addr); - return (addr&0x1?0x9a:0x37); + return addr & 0x1 ? 0x9a : 0x37; + } + if(memory.sma_rng_addr && addr >= 0xfff00 && + (((a & 0xff) == (memory.sma_rng_addr & 0xff)) || + ((a & 0xff) == memory.sma_rng_addr >> 8))) + { + //printf("SMA_Random B %08x\n",addr); + return addr & 0x1 ? sma_random() >> 8 : sma_random() & 0xff; } - if (memory.sma_rng_addr && addr>=0xfff00 && - (((a & 0xFF) == (memory.sma_rng_addr & 0xFF)) || - ((a & 0xFF) == memory.sma_rng_addr >> 8))) { - //printf("SMA_Random B %08x\n",addr); - return (addr&0x1?sma_random()>>8:sma_random()&0xFF); - } } - return (READ_BYTE_ROM(memory.rom.cpu_m68k.p + bankaddress + addr)); + return READ_BYTE_ROM(memory.rom.cpu_m68k.p + bankaddress + addr); } -Uint16 mem68k_fetch_bk_normal_word(Uint32 addr) { +uint16_t mem68k_fetch_bk_normal_word(uint32_t addr) +{ addr &= 0xFFFFF; - if (memory.bksw_unscramble) { /* SMA prot & random number generator */ - if (addr == 0xfe446) { + if(hasPvc && addr >= 0xFE000) + { + //logMsg("PVC RW:%X", addr); + return READ_WORD_ROM((uint8_t*)pvcMem + (addr & 0x1FFE)); + } + else if(memory.bksw_unscramble) + { /* SMA prot & random number generator */ + if(addr == 0xfe446) + { //printf("Prot reading W %08x\n", addr); return 0x9a37; } - if (memory.sma_rng_addr && addr>=0xfff00 && - (((addr & 0xFF) == (memory.sma_rng_addr & 0xFF)) || - ((addr & 0xFF) == memory.sma_rng_addr >> 8))) { - //printf("SMA_Random W %08x\n",addr); + if(memory.sma_rng_addr && addr>=0xfff00 && + (((addr & 0xff) == (memory.sma_rng_addr & 0xff)) || + ((addr & 0xff) == memory.sma_rng_addr >> 8))) + { + //printf("SMA_Random W %08x\n",addr); return sma_random(); - } + } } - return (READ_WORD_ROM(memory.rom.cpu_m68k.p + bankaddress + addr)); + return READ_WORD_ROM(memory.rom.cpu_m68k.p + bankaddress + addr); } LONG_FETCH(mem68k_fetch_bk_normal) ; -static void bankswitch(Uint32 address, Uint8 data) { - - if (memory.rom.cpu_m68k.size <= 0x100000) +static void bankswitch(uint32_t address, uint8_t data) +{ + if(address < 0x2ffff0 || memory.rom.cpu_m68k.size <= 0x100000) return; + data = data & 0x7; + uint32_t newBank = (data + 1) * 0x100000; + if(newBank >= memory.rom.cpu_m68k.size) + newBank = 0x100000; + cpu_68k_bankswitch(newBank); +} - if (address >= 0x2FFFF0) { - data = data & 0x7; - bankaddress = (data + 1) * 0x100000; - } else - return; +void pvcPalletteUnpack() +{ + //logMsg("pal unpack"); + uint8_t b1 = pvcMem[0x1fe1]; + uint8_t b2 = pvcMem[0x1fe0]; + pvcMem[0x1fe2] = ((b2 & 0xf) << 1) | ((b1 >> 4) & 1); + pvcMem[0x1fe3] = (((b2 >> 4) & 0xf) << 1) | ((b1 >> 5) & 1); + pvcMem[0x1fe4] = ((b1 & 0xf) << 1) | ((b1 >> 6) & 1); + pvcMem[0x1fe5] = b1 >> 7; +} - if (bankaddress >= memory.rom.cpu_m68k.size) - bankaddress = 0x100000; - cpu_68k_bankswitch(bankaddress); +void pvcPallettePack() +{ + //logMsg("pal pack"); + uint8_t b1 = pvcMem[0x1fe9]; + uint8_t b2 = pvcMem[0x1fe8]; + uint8_t b3 = pvcMem[0x1feb]; + uint8_t b4 = pvcMem[0x1fea]; + pvcMem[0x1fec] = (b2 >> 1) | ((b1 >> 1) << 4); + pvcMem[0x1fed] = (b4 >> 1) | ((b2 & 1) << 4) | ((b1 & 1) << 5) | ((b4 & 1) << 6) | ((b3 & 1) << 7); } -void mem68k_store_bk_normal_byte(Uint32 addr, Uint8 data) { - //if (addr<0x2FFFF0) - //printf("bankswitch_b %x %x\n", addr, data); - bankswitch(addr, data); +static void pvcBankswitch() +{ + uint32_t newBank = (pvcMem[0x1ff3] << 16) | (pvcMem[0x1ff2] << 8) | pvcMem[0x1ff1]; + newBank += 0x100000; + cpu_68k_bankswitch(newBank); + pvcMem[0x1ff0] = 0xa0; + pvcMem[0x1ff1] &= 0xfe; + pvcMem[0x1ff3] &= 0x7f; } -void mem68k_store_bk_normal_word(Uint32 addr, Uint16 data) { - //if (addr<0x2FFFF0) - //printf("bankswitch_w %x %x\n",addr,data); - if (memory.bksw_unscramble && (addr & 0xFF) == memory.bksw_unscramble[0]) { +static void handlePvcWrite(uint32_t addr) +{ + if(addr >= 0x2fffe0 && addr <= 0x2fffe1) + pvcPalletteUnpack(); + else if(addr >= 0x2fffe8 && addr <= 0x2fffeb) + pvcPallettePack(); + else if(addr >= 0x2ffff0 && addr <= 0x2ffff3) + pvcBankswitch(); +} + +void mem68k_store_bk_normal_byte(uint32_t addr, uint8_t data) +{ + if(hasPvc) + { + if(addr < 0x2fe000) + return; + //logMsg("PVC WB:%X:%X", addr, data); + WRITE_BYTE_ROM((uint8_t*)pvcMem + (addr & 0x1fff), data); + handlePvcWrite(addr); + } + else + { + bankswitch(addr, data); + } +} + +void mem68k_store_bk_normal_word(uint32_t addr, uint16_t data) +{ + if(hasPvc) + { + if(addr < 0x2fe000) + return; + //logMsg("PVC WW:%X:%X", addr, data); + WRITE_WORD_ROM((uint8_t*)pvcMem + (addr & 0x1ffe), data); + handlePvcWrite(addr); + } + else if(memory.bksw_unscramble) + { + if(addr < 0x2ffc00 || (addr & 0xff) != memory.bksw_unscramble[0]) + return; /* unscramble bank number */ data = (((data >> memory.bksw_unscramble[1]) & 1) << 0) + @@ -853,11 +927,12 @@ void mem68k_store_bk_normal_word(Uint32 addr, Uint16 data) { (((data >> memory.bksw_unscramble[4]) & 1) << 3) + (((data >> memory.bksw_unscramble[5]) & 1) << 4) + (((data >> memory.bksw_unscramble[6]) & 1) << 5); - - bankaddress = 0x100000 + memory.bksw_offset[data]; - cpu_68k_bankswitch(bankaddress); - } else + cpu_68k_bankswitch(0x100000 + memory.bksw_offset[data]); + } + else + { bankswitch(addr, data); + } } LONG_STORE(mem68k_store_bk_normal) diff --git a/NEO.emu/src/gngeo/memory.h b/NEO.emu/src/gngeo/memory.h index 18982d515..39a29b896 100644 --- a/NEO.emu/src/gngeo/memory.h +++ b/NEO.emu/src/gngeo/memory.h @@ -107,6 +107,9 @@ typedef struct neo_mem { } neo_mem; extern neo_mem memory; +extern uint8_t pvcMem[0x2000]; +extern bool hasPvc; +extern uint16_t neogeo_rng; /* video related */ //extern int irq2start, irq2control; diff --git a/NEO.emu/src/gngeo/musashi_interf.cc b/NEO.emu/src/gngeo/musashi_interf.cc index 236640aea..f2a56c21e 100644 --- a/NEO.emu/src/gngeo/musashi_interf.cc +++ b/NEO.emu/src/gngeo/musashi_interf.cc @@ -106,6 +106,7 @@ CLINK void cpu_68k_init(void) return mem68k_fetch_bk_normal_word(addr)&0xFFFF; }; } + mm68k.memory_map[0x2f].write8 = [](unsigned int addr, unsigned int data) { @@ -321,12 +322,6 @@ CLINK void cpu_68k_reset(void) m68k_pulse_reset(mm68k); } -CLINK void cpu_68k_bankswitch(Uint32 address) -{ - //logMsg("bank switch:0x%X", address); - bankaddress = address; -} - CLINK int cpu_68k_run(Uint32 nb_cycle) { if(conf.raster) diff --git a/NEO.emu/src/gngeo/neocrypt.c b/NEO.emu/src/gngeo/neocrypt.c index 3e4a0cd4a..3bfbaac01 100644 --- a/NEO.emu/src/gngeo/neocrypt.c +++ b/NEO.emu/src/gngeo/neocrypt.c @@ -51,6 +51,7 @@ #include "mame_layer.h" #include "menu.h" #include "neocrypt.h" +#include "memory.h" /*************************************************************************** @@ -1294,90 +1295,81 @@ void samsh5sp_decrypt_68k(running_machine *machine) /* kf2k3pcb, kof2003, kof2003h, mslug5 and svc have updated P rom scramble */ void mslug5_decrypt_68k(running_machine *machine) { - static const UINT8 xor1[ 0x20 ] = { 0xc2, 0x4b, 0x74, 0xfd, 0x0b, 0x34, 0xeb, 0xd7, 0x10, 0x6d, 0xf9, 0xce, 0x5d, 0xd5, 0x61, 0x29, 0xf5, 0xbe, 0x0d, 0x82, 0x72, 0x45, 0x0f, 0x24, 0xb3, 0x34, 0x1b, 0x99, 0xea, 0x09, 0xf3, 0x03 }; - static const UINT8 xor2[ 0x20 ] = { 0x36, 0x09, 0xb0, 0x64, 0x95, 0x0f, 0x90, 0x42, 0x6e, 0x0f, 0x30, 0xf6, 0xe5, 0x08, 0x30, 0x64, 0x08, 0x04, 0x00, 0x2f, 0x72, 0x09, 0xa0, 0x13, 0xc9, 0x0b, 0xa0, 0x3e, 0xc2, 0x00, 0x40, 0x2b }; - int i; - int ofst; + static const uint8_t xor1[0x20] = { 0xc2, 0x4b, 0x74, 0xfd, 0x0b, 0x34, 0xeb, 0xd7, 0x10, 0x6d, 0xf9, 0xce, 0x5d, 0xd5, 0x61, 0x29, 0xf5, 0xbe, 0x0d, 0x82, 0x72, 0x45, 0x0f, 0x24, 0xb3, 0x34, 0x1b, 0x99, 0xea, 0x09, 0xf3, 0x03 }; + static const uint8_t xor2[0x20] = { 0x36, 0x09, 0xb0, 0x64, 0x95, 0x0f, 0x90, 0x42, 0x6e, 0x0f, 0x30, 0xf6, 0xe5, 0x08, 0x30, 0x64, 0x08, 0x04, 0x00, 0x2f, 0x72, 0x09, 0xa0, 0x13, 0xc9, 0x0b, 0xa0, 0x3e, 0xc2, 0x00, 0x40, 0x2b }; int rom_size = 0x800000; - UINT8 *rom = memory_region( machine, "maincpu" ); - UINT8 *buf = alloc_array_or_die(UINT8, rom_size ); + uint8_t *rom = memory_region( machine, "maincpu" ); + uint8_t *buf = alloc_array_or_die(UINT8, rom_size ); - for( i = 0; i < 0x100000; i++ ) - { - rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; - } - for( i = 0x100000; i < 0x800000; i++ ) - { - rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; - } + for (int i = 0; i < 0x100000; i++) + rom[i] ^= xor1[(BYTE_XOR_LE(i) % 0x20)]; - for( i = 0x100000; i < 0x0800000; i += 4 ) + for (int i = 0x100000; i < 0x800000; i++) + rom[i] ^= xor2[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x0800000; i += 4) { - UINT16 rom16; - rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; - rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); - rom[BYTE_XOR_LE(i+1)] = rom16&0xff; - rom[BYTE_XOR_LE(i+2)] = rom16>>8; + uint16_t rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)] << 8; + rom16 = BITSWAP16(rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0); + rom[BYTE_XOR_LE(i+1)] = rom16 & 0xff; + rom[BYTE_XOR_LE(i+2)] = rom16 >> 8; } - memcpy( buf, rom, rom_size ); - for( i = 0; i < 0x0100000 / 0x10000; i++ ) + + memcpy(&buf[0], rom, rom_size); + for (int i = 0; i < 0x0100000 / 0x10000; i++) { - ofst = (i & 0xf0) + BITSWAP8( (i & 0x0f), 7, 6, 5, 4, 1, 0, 3, 2 ); - memcpy( &rom[ i * 0x10000 ], &buf[ ofst * 0x10000 ], 0x10000 ); + int ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 1, 0, 3, 2); + memcpy(&rom[i * 0x10000], &buf[ofst * 0x10000], 0x10000); } - for( i = 0x100000; i < 0x800000; i += 0x100 ) + for (int i = 0x100000; i < 0x800000; i += 0x100) { - ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00700) + (BITSWAP8( ((i & 0x0ff000) >> 12), 5, 4, 7, 6, 1, 0, 3, 2 ) << 12); - memcpy( &rom[ i ], &buf[ ofst ], 0x100 ); + int ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00700) + (BITSWAP8(((i & 0x0ff000) >> 12), 5, 4, 7, 6, 1, 0, 3, 2) << 12); + memcpy(&rom[i], &buf[ofst], 0x100); } - memcpy( buf, rom, rom_size ); - memcpy( &rom[ 0x100000 ], &buf[ 0x700000 ], 0x100000 ); - memcpy( &rom[ 0x200000 ], &buf[ 0x100000 ], 0x600000 ); - free( buf ); -} + memcpy(&buf[0], rom, rom_size); + memcpy(&rom[0x100000], &buf[0x700000], 0x100000); + memcpy(&rom[0x200000], &buf[0x100000], 0x600000); + free(buf); +} void svc_px_decrypt(running_machine *machine) { - static const UINT8 xor1[ 0x20 ] = { 0x3b, 0x6a, 0xf7, 0xb7, 0xe8, 0xa9, 0x20, 0x99, 0x9f, 0x39, 0x34, 0x0c, 0xc3, 0x9a, 0xa5, 0xc8, 0xb8, 0x18, 0xce, 0x56, 0x94, 0x44, 0xe3, 0x7a, 0xf7, 0xdd, 0x42, 0xf0, 0x18, 0x60, 0x92, 0x9f }; - static const UINT8 xor2[ 0x20 ] = { 0x69, 0x0b, 0x60, 0xd6, 0x4f, 0x01, 0x40, 0x1a, 0x9f, 0x0b, 0xf0, 0x75, 0x58, 0x0e, 0x60, 0xb4, 0x14, 0x04, 0x20, 0xe4, 0xb9, 0x0d, 0x10, 0x89, 0xeb, 0x07, 0x30, 0x90, 0x50, 0x0e, 0x20, 0x26 }; - int i; - int ofst; + static const uint8_t xor1[0x20] = { 0x3b, 0x6a, 0xf7, 0xb7, 0xe8, 0xa9, 0x20, 0x99, 0x9f, 0x39, 0x34, 0x0c, 0xc3, 0x9a, 0xa5, 0xc8, 0xb8, 0x18, 0xce, 0x56, 0x94, 0x44, 0xe3, 0x7a, 0xf7, 0xdd, 0x42, 0xf0, 0x18, 0x60, 0x92, 0x9f }; + static const uint8_t xor2[0x20] = { 0x69, 0x0b, 0x60, 0xd6, 0x4f, 0x01, 0x40, 0x1a, 0x9f, 0x0b, 0xf0, 0x75, 0x58, 0x0e, 0x60, 0xb4, 0x14, 0x04, 0x20, 0xe4, 0xb9, 0x0d, 0x10, 0x89, 0xeb, 0x07, 0x30, 0x90, 0x50, 0x0e, 0x20, 0x26 }; int rom_size = 0x800000; - UINT8 *rom = memory_region( machine, "maincpu" ); - UINT8 *buf = alloc_array_or_die(UINT8, rom_size ); + uint8_t *rom = memory_region( machine, "maincpu" ); + uint8_t *buf = alloc_array_or_die(UINT8, rom_size ); - for( i = 0; i < 0x100000; i++ ) - { - rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; - } - for( i = 0x100000; i < 0x800000; i++ ) - { - rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; - } + for (int i = 0; i < 0x100000; i++) + rom[i] ^= xor1[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x800000; i++) + rom[i] ^= xor2[(BYTE_XOR_LE(i) % 0x20)]; - for( i = 0x100000; i < 0x0800000; i += 4 ) + for (int i = 0x100000; i < 0x0800000; i += 4) { - UINT16 rom16; - rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; - rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); - rom[BYTE_XOR_LE(i+1)] = rom16&0xff; - rom[BYTE_XOR_LE(i+2)] = rom16>>8; + uint16_t rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)] << 8; + rom16 = BITSWAP16(rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0); + rom[BYTE_XOR_LE(i+1)] = rom16 & 0xff; + rom[BYTE_XOR_LE(i+2)] = rom16 >> 8; } - memcpy( buf, rom, rom_size ); - for( i = 0; i < 0x0100000 / 0x10000; i++ ) + + memcpy(&buf[0], rom, rom_size); + for (int i = 0; i < 0x0100000 / 0x10000; i++) { - ofst = (i & 0xf0) + BITSWAP8( (i & 0x0f), 7, 6, 5, 4, 2, 3, 0, 1 ); - memcpy( &rom[ i * 0x10000 ], &buf[ ofst * 0x10000 ], 0x10000 ); + int ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 2, 3, 0, 1); + memcpy(&rom[i * 0x10000], &buf[ofst * 0x10000], 0x10000); } - for( i = 0x100000; i < 0x800000; i += 0x100 ) + + for (int i = 0x100000; i < 0x800000; i += 0x100) { - ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00a00) + (BITSWAP8( ((i & 0x0ff000) >> 12), 4, 5, 6, 7, 1, 0, 3, 2 ) << 12); - memcpy( &rom[ i ], &buf[ ofst ], 0x100 ); + int ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00a00) + (BITSWAP8(((i & 0x0ff000) >> 12), 4, 5, 6, 7, 1, 0, 3, 2) << 12); + memcpy(&rom[i], &buf[ofst], 0x100); } - memcpy( buf, rom, rom_size ); - memcpy( &rom[ 0x100000 ], &buf[ 0x700000 ], 0x100000 ); - memcpy( &rom[ 0x200000 ], &buf[ 0x100000 ], 0x600000 ); + memcpy(&buf[0], rom, rom_size ); + memcpy(&rom[0x100000], &buf[0x700000], 0x100000); + memcpy(&rom[0x200000], &buf[0x100000], 0x600000); free( buf ); } @@ -1426,96 +1418,87 @@ void kf2k3pcb_decrypt_68k(running_machine *machine) void kof2003_decrypt_68k(running_machine *machine) { - static const UINT8 xor1[0x20] = { 0x3b, 0x6a, 0xf7, 0xb7, 0xe8, 0xa9, 0x20, 0x99, 0x9f, 0x39, 0x34, 0x0c, 0xc3, 0x9a, 0xa5, 0xc8, 0xb8, 0x18, 0xce, 0x56, 0x94, 0x44, 0xe3, 0x7a, 0xf7, 0xdd, 0x42, 0xf0, 0x18, 0x60, 0x92, 0x9f }; - static const UINT8 xor2[0x20] = { 0x2f, 0x02, 0x60, 0xbb, 0x77, 0x01, 0x30, 0x08, 0xd8, 0x01, 0xa0, 0xdf, 0x37, 0x0a, 0xf0, 0x65, 0x28, 0x03, 0xd0, 0x23, 0xd3, 0x03, 0x70, 0x42, 0xbb, 0x06, 0xf0, 0x28, 0xba, 0x0f, 0xf0, 0x7a }; - int i; - int ofst; + static const uint8_t xor1[0x20] = { 0x3b, 0x6a, 0xf7, 0xb7, 0xe8, 0xa9, 0x20, 0x99, 0x9f, 0x39, 0x34, 0x0c, 0xc3, 0x9a, 0xa5, 0xc8, 0xb8, 0x18, 0xce, 0x56, 0x94, 0x44, 0xe3, 0x7a, 0xf7, 0xdd, 0x42, 0xf0, 0x18, 0x60, 0x92, 0x9f }; + static const uint8_t xor2[0x20] = { 0x2f, 0x02, 0x60, 0xbb, 0x77, 0x01, 0x30, 0x08, 0xd8, 0x01, 0xa0, 0xdf, 0x37, 0x0a, 0xf0, 0x65, 0x28, 0x03, 0xd0, 0x23, 0xd3, 0x03, 0x70, 0x42, 0xbb, 0x06, 0xf0, 0x28, 0xba, 0x0f, 0xf0, 0x7a }; int rom_size = 0x900000; - UINT8 *rom = memory_region( machine, "maincpu" ); - UINT8 *buf = alloc_array_or_die(UINT8, rom_size ); + uint8_t *rom = memory_region( machine, "maincpu" ); + uint8_t *buf = malloc(rom_size); - for (i = 0; i < 0x100000; i++) - { - rom[ 0x800000 + i ] ^= rom[ 0x100002 | BYTE_XOR_LE(i) ]; - } - for( i = 0; i < 0x100000; i++) - { - rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; - } - for( i = 0x100000; i < 0x800000; i++) - { - rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; - } - for( i = 0x100000; i < 0x800000; i += 4) + for (int i = 0; i < 0x100000; i++) + rom[0x800000 + i] ^= rom[0x100002 | i]; + + for (int i = 0; i < 0x100000; i++) + rom[i] ^= xor1[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x800000; i++) + rom[i] ^= xor2[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x800000; i += 4) { - UINT16 rom16; - rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; - rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 5, 4, 7, 6, 9, 8, 11, 10, 3, 2, 1, 0 ); - rom[BYTE_XOR_LE(i+1)] = rom16&0xff; - rom[BYTE_XOR_LE(i+2)] = rom16>>8; + uint16_t rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)] << 8; + rom16 = BITSWAP16(rom16, 15, 14, 13, 12, 5, 4, 7, 6, 9, 8, 11, 10, 3, 2, 1, 0); + rom[BYTE_XOR_LE(i+1)] = rom16 & 0xff; + rom[BYTE_XOR_LE(i+2)] = rom16 >> 8; } - for( i = 0; i < 0x0100000 / 0x10000; i++ ) + + for (int i = 0; i < 0x0100000 / 0x10000; i++) { - ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 0, 1, 2, 3); - memcpy( &buf[ i * 0x10000 ], &rom[ ofst * 0x10000 ], 0x10000 ); + int ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 0, 1, 2, 3); + memcpy(&buf[i * 0x10000], &rom[ofst * 0x10000], 0x10000); } - for( i = 0x100000; i < 0x900000; i += 0x100) + + for (int i = 0x100000; i < 0x900000; i += 0x100) { - ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00800) + (BITSWAP8( ((i & 0x0ff000) >> 12), 4, 5, 6, 7, 1, 0, 3, 2 ) << 12); - memcpy( &buf[ i ], &rom[ ofst ], 0x100 ); + int ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00800) + (BITSWAP8(((i & 0x0ff000) >> 12), 4, 5, 6, 7, 1, 0, 3, 2) << 12); + memcpy(&buf[i], &rom[ofst], 0x100); } - memcpy (&rom[0x000000], &buf[0x000000], 0x100000); - memcpy (&rom[0x100000], &buf[0x800000], 0x100000); - memcpy (&rom[0x200000], &buf[0x100000], 0x700000); - free( buf ); + memcpy(&rom[0x000000], &buf[0x000000], 0x100000); + memcpy(&rom[0x100000], &buf[0x800000], 0x100000); + memcpy(&rom[0x200000], &buf[0x100000], 0x700000); + free(buf); } // Thanks to IQ_132 for the info void kof2003h_decrypt_68k(running_machine *machine) { - static const UINT8 xor1[0x20] = { 0xc2, 0x4b, 0x74, 0xfd, 0x0b, 0x34, 0xeb, 0xd7, 0x10, 0x6d, 0xf9, 0xce, 0x5d, 0xd5, 0x61, 0x29, 0xf5, 0xbe, 0x0d, 0x82, 0x72, 0x45, 0x0f, 0x24, 0xb3, 0x34, 0x1b, 0x99, 0xea, 0x09, 0xf3, 0x03 }; - static const UINT8 xor2[0x20] = { 0x2b, 0x09, 0xd0, 0x7f, 0x51, 0x0b, 0x10, 0x4c, 0x5b, 0x07, 0x70, 0x9d, 0x3e, 0x0b, 0xb0, 0xb6, 0x54, 0x09, 0xe0, 0xcc, 0x3d, 0x0d, 0x80, 0x99, 0x87, 0x03, 0x90, 0x82, 0xfe, 0x04, 0x20, 0x18 }; - int i; - int ofst; + static const uint8_t xor1[0x20] = { 0xc2, 0x4b, 0x74, 0xfd, 0x0b, 0x34, 0xeb, 0xd7, 0x10, 0x6d, 0xf9, 0xce, 0x5d, 0xd5, 0x61, 0x29, 0xf5, 0xbe, 0x0d, 0x82, 0x72, 0x45, 0x0f, 0x24, 0xb3, 0x34, 0x1b, 0x99, 0xea, 0x09, 0xf3, 0x03 }; + static const uint8_t xor2[0x20] = { 0x2b, 0x09, 0xd0, 0x7f, 0x51, 0x0b, 0x10, 0x4c, 0x5b, 0x07, 0x70, 0x9d, 0x3e, 0x0b, 0xb0, 0xb6, 0x54, 0x09, 0xe0, 0xcc, 0x3d, 0x0d, 0x80, 0x99, 0x87, 0x03, 0x90, 0x82, 0xfe, 0x04, 0x20, 0x18 }; int rom_size = 0x900000; - UINT8 *rom = memory_region( machine, "maincpu" ); - UINT8 *buf = alloc_array_or_die(UINT8, rom_size ); + uint8_t *rom = memory_region( machine, "maincpu" ); + uint8_t *buf = alloc_array_or_die(UINT8, rom_size ); - for (i = 0; i < 0x100000; i++) - { - rom[ 0x800000 + i ] ^= rom[ 0x100002 | BYTE_XOR_LE(i) ]; - } - for( i = 0; i < 0x100000; i++) - { - rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; - } - for( i = 0x100000; i < 0x800000; i++) + for (int i = 0; i < 0x100000; i++) + rom[0x800000 + i] ^= rom[0x100002 | i]; + + for (int i = 0; i < 0x100000; i++) + rom[i] ^= xor1[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x800000; i++) + rom[i] ^= xor2[(BYTE_XOR_LE(i) % 0x20)]; + + for (int i = 0x100000; i < 0x800000; i += 4) { - rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; + uint16_t rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)] << 8; + rom16 = BITSWAP16(rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0); + rom[BYTE_XOR_LE(i+1)] = rom16 & 0xff; + rom[BYTE_XOR_LE(i+2)] = rom16 >> 8; } - for( i = 0x100000; i < 0x800000; i += 4) - { - UINT16 rom16; - rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; - rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); - rom[BYTE_XOR_LE(i+1)] = rom16&0xff; - rom[BYTE_XOR_LE(i+2)] = rom16>>8; - } - for( i = 0; i < 0x0100000 / 0x10000; i++ ) + + for (int i = 0; i < 0x0100000 / 0x10000; i++) { - ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 1, 0, 3, 2); - memcpy( &buf[ i * 0x10000 ], &rom[ ofst * 0x10000 ], 0x10000 ); + int ofst = (i & 0xf0) + BITSWAP8((i & 0x0f), 7, 6, 5, 4, 1, 0, 3, 2); + memcpy(&buf[i * 0x10000], &rom[ofst * 0x10000], 0x10000); } - for( i = 0x100000; i < 0x900000; i += 0x100) + for (int i = 0x100000; i < 0x900000; i += 0x100) { - ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00400) + (BITSWAP8( ((i & 0x0ff000) >> 12), 6, 7, 4, 5, 0, 1, 2, 3 ) << 12); - memcpy( &buf[ i ], &rom[ ofst ], 0x100 ); + int ofst = (i & 0xf000ff) + ((i & 0x000f00) ^ 0x00400) + (BITSWAP8(((i & 0x0ff000) >> 12), 6, 7, 4, 5, 0, 1, 2, 3) << 12); + memcpy(&buf[i], &rom[ofst], 0x100); } - memcpy (&rom[0x000000], &buf[0x000000], 0x100000); - memcpy (&rom[0x100000], &buf[0x800000], 0x100000); - memcpy (&rom[0x200000], &buf[0x100000], 0x700000); - free( buf ); + memcpy(&rom[0x000000], &buf[0x000000], 0x100000); + memcpy(&rom[0x100000], &buf[0x800000], 0x100000); + memcpy(&rom[0x200000], &buf[0x100000], 0x700000); + free(buf); } diff --git a/NEO.emu/src/gngeo/neocrypt.h b/NEO.emu/src/gngeo/neocrypt.h index 5185932f9..825d7b84e 100644 --- a/NEO.emu/src/gngeo/neocrypt.h +++ b/NEO.emu/src/gngeo/neocrypt.h @@ -14,9 +14,11 @@ void matrim_decrypt_68k(GAME_ROMS *r); void samsho5_decrypt_68k(GAME_ROMS *r); void samsh5sp_decrypt_68k(GAME_ROMS *r); void mslug5_decrypt_68k(GAME_ROMS *r); +void svc_px_decrypt(GAME_ROMS *r); void kf2k3pcb_decrypt_s1data(GAME_ROMS *r); void kf2k3pcb_decrypt_68k(GAME_ROMS *r); void kof2003_decrypt_68k(GAME_ROMS *r); +void kof2003h_decrypt_68k(GAME_ROMS *r); void kof99_neogeo_gfx_decrypt(void *contextPtr, GAME_ROMS *r, int extra_xor); void kof2000_neogeo_gfx_decrypt(void *contextPtr, GAME_ROMS *r, int extra_xor); void cmc50_neogeo_gfx_decrypt(void *contextPtr, GAME_ROMS *r, int extra_xor); @@ -29,4 +31,6 @@ void neo_pcm2_swap(GAME_ROMS *r, int value); void neo_pcm2_snk_1999(GAME_ROMS *r, int value); void neogeo_cmc50_m1_decrypt(void *contextPtr, GAME_ROMS *r); +void kof2002b_gfx_decrypt(GAME_ROMS *machine, uint8_t *src, int size); + #endif diff --git a/NEO.emu/src/gngeo/roms.c b/NEO.emu/src/gngeo/roms.c index 008b7b4cf..964b6d52b 100644 --- a/NEO.emu/src/gngeo/roms.c +++ b/NEO.emu/src/gngeo/roms.c @@ -167,7 +167,6 @@ static int init_kof99(void *contextPtr, GAME_ROMS *r) { kof99_decrypt_68k(r); kof99_neogeo_gfx_decrypt(contextPtr, r, 0x00); } - neogeo_fix_bank_type = 0; memory.bksw_offset = bankoffset_kof99; memory.bksw_unscramble = scramblecode_kof99; memory.sma_rng_addr = 0xF8FA; @@ -283,7 +282,6 @@ static int init_kof2000n(void *contextPtr, GAME_ROMS *r) { } static int init_kof2001(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) { kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x1e); neogeo_cmc50_m1_decrypt(contextPtr, r); @@ -341,51 +339,42 @@ static int init_ms4plus(void *contextPtr, GAME_ROMS *r) { } static int init_ganryu(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0x07); return 0; } static int init_s1945p(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0x05); return 0; } static int init_preisle2(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0x9f); return 0; } static int init_bangbead(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0xf8); return 0; } static int init_nitd(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0xff); return 0; } static int init_zupapa(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0xbd); return 0; } static int init_sengoku3(void *contextPtr, GAME_ROMS *r) { - neogeo_fix_bank_type = 1; if (need_decrypt) kof99_neogeo_gfx_decrypt(contextPtr, r, 0xfe); return 0; } static int init_kof98(void *contextPtr, GAME_ROMS *r) { if (need_decrypt) kof98_decrypt_68k(r); - - //install_kof98_protection(r); return 0; } @@ -395,7 +384,6 @@ static int init_rotd(void *contextPtr, GAME_ROMS *r) { neogeo_cmc50_m1_decrypt(contextPtr, r); kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x3f); } - neogeo_fix_bank_type = 0; return 0; } @@ -415,8 +403,8 @@ static int init_kof2002b(void *contextPtr, GAME_ROMS *r) { kof2002_decrypt_68k(r); neo_pcm2_swap(r, 0); neogeo_cmc50_m1_decrypt(contextPtr, r); - //kof2002b_gfx_decrypt(r, r->tiles.p,0x4000000); - //kof2002b_gfx_decrypt(r, r->game_sfix.p,0x20000); + kof2002b_gfx_decrypt(r, r->tiles.p,0x4000000); + kof2002b_gfx_decrypt(r, r->game_sfix.p,0x20000); } return 0; } @@ -509,7 +497,6 @@ static int init_pnyaa(void *contextPtr, GAME_ROMS *r) { neogeo_cmc50_m1_decrypt(contextPtr, r); kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x2e); } - neogeo_fix_bank_type = 1; return 0; } @@ -520,8 +507,7 @@ static int init_mslug5(void *contextPtr, GAME_ROMS *r) { neogeo_cmc50_m1_decrypt(contextPtr, r); kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x19); } - neogeo_fix_bank_type = 1; - //install_pvc_protection(r); + hasPvc = true; return 0; } @@ -548,8 +534,7 @@ static int init_ms5pcb(void *contextPtr, GAME_ROMS *r) { svcpcb_s1data_decrypt(r); neo_pcm2_swap(r, 2); } - neogeo_fix_bank_type = 2; - //install_pvc_protection(r); + hasPvc = true; return 0; } @@ -557,12 +542,10 @@ static int init_ms5plus(void *contextPtr, GAME_ROMS *r) { /* TODO: Bootleg */ if (need_decrypt) { cmc50_neogeo_gfx_decrypt(contextPtr, r, 0x19); + neogeo_cmc50_m1_decrypt(contextPtr, r); neo_pcm2_swap(r, 2); - //neogeo_bootleg_sx_decrypt(r, 1); + neogeo_bootleg_sx_decrypt(r, 1); } - neogeo_fix_bank_type = 1; - - //install_ms5plus_protection(r); return 0; } @@ -573,7 +556,6 @@ static int init_samsho5(void *contextPtr, GAME_ROMS *r) { neogeo_cmc50_m1_decrypt(contextPtr, r); kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x0f); } - neogeo_fix_bank_type = 0; return 0; } @@ -584,7 +566,42 @@ static int init_samsh5sp(void *contextPtr, GAME_ROMS *r) { neogeo_cmc50_m1_decrypt(contextPtr, r); kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x0d); } - neogeo_fix_bank_type = 0; + return 0; +} + +static int init_svc(void *contextPtr, GAME_ROMS *r) { + if (need_decrypt) { + svc_px_decrypt(r); + neo_pcm2_swap(r, 3); + neogeo_cmc50_m1_decrypt(contextPtr, r); + kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x57); + } + neogeo_fix_bank_type = 2; + hasPvc = true; + return 0; +} + +static int init_kof2003(void *contextPtr, GAME_ROMS *r) { + if (need_decrypt) { + kof2003_decrypt_68k(r); + neo_pcm2_swap(r, 5); + neogeo_cmc50_m1_decrypt(contextPtr, r); + kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x9d); + } + neogeo_fix_bank_type = 2; + hasPvc = true; + return 0; +} + +static int init_kof2003h(void *contextPtr, GAME_ROMS *r) { + if (need_decrypt) { + kof2003h_decrypt_68k(r); + neo_pcm2_swap(r, 5); + neogeo_cmc50_m1_decrypt(contextPtr, r); + kof2000_neogeo_gfx_decrypt(contextPtr, r, 0x9d); + } + neogeo_fix_bank_type = 2; + hasPvc = true; return 0; } @@ -613,16 +630,6 @@ static DRIVER_INIT(svcpcb) { install_pvc_protection(machine); } -static DRIVER_INIT(svc) { - svc_px_decrypt(machine); - neo_pcm2_swap(machine, 3); - neogeo_fixed_layer_bank_type = 2; - neogeo_cmc50_m1_decrypt(machine); - kof2000_neogeo_gfx_decrypt(machine, 0x57); - DRIVER_INIT_CALL(neogeo); - install_pvc_protection(machine); -} - static DRIVER_INIT(svcboot) { svcboot_px_decrypt(machine); svcboot_cx_decrypt(machine); @@ -654,15 +661,6 @@ static DRIVER_INIT(svcsplus) { install_pvc_protection(machine); } -static DRIVER_INIT(samsho5) { - samsho5_decrypt_68k(machine); - neo_pcm2_swap(machine, 4); - neogeo_fixed_layer_bank_type = 1; - neogeo_cmc50_m1_decrypt(machine); - kof2000_neogeo_gfx_decrypt(machine, 0x0f); - DRIVER_INIT_CALL(neogeo); -} - static DRIVER_INIT(samsho5b) { samsho5b_px_decrypt(machine); samsho5b_vx_decrypt(machine); @@ -700,26 +698,6 @@ static DRIVER_INIT(kf2k3pcb) { (read16_space_func) SMH_BANK(6)); // 512k bios } -static DRIVER_INIT(kof2003) { - kof2003_decrypt_68k(machine); - neo_pcm2_swap(machine, 5); - neogeo_fixed_layer_bank_type = 2; - neogeo_cmc50_m1_decrypt(machine); - kof2000_neogeo_gfx_decrypt(machine, 0x9d); - DRIVER_INIT_CALL(neogeo); - install_pvc_protection(machine); -} - -static DRIVER_INIT(kof2003h) { - kof2003h_decrypt_68k(machine); - neo_pcm2_swap(machine, 5); - neogeo_fixed_layer_bank_type = 2; - neogeo_cmc50_m1_decrypt(machine); - kof2000_neogeo_gfx_decrypt(machine, 0x9d); - DRIVER_INIT_CALL(neogeo); - install_pvc_protection(machine); -} - static DRIVER_INIT(kf2k3bl) { cmc50_neogeo_gfx_decrypt(machine, 0x9d); neo_pcm2_swap(machine, 5); @@ -746,15 +724,6 @@ static DRIVER_INIT(kf2k3upl) { kf2k3upl_install_protection(machine); } -static DRIVER_INIT(samsh5sp) { - samsh5sp_decrypt_68k(machine); - neo_pcm2_swap(machine, 6); - neogeo_fixed_layer_bank_type = 1; - neogeo_cmc50_m1_decrypt(machine); - kof2000_neogeo_gfx_decrypt(machine, 0x0d); - DRIVER_INIT_CALL(neogeo); -} - static DRIVER_INIT(jockeygp) { UINT16* extra_ram; @@ -837,6 +806,7 @@ struct roms_init_func { { "kof2000", init_kof2000}, { "kof2000n", init_kof2000n}, { "kof2001", init_kof2001}, + { "kof2001h", init_kof2001}, { "mslug4", init_mslug4}, { "ms4plus", init_ms4plus}, { "ganryu", init_ganryu}, @@ -853,13 +823,18 @@ struct roms_init_func { { "kf2k2pls", init_kf2k2pls}, { "kf2k2mp", init_kf2k2mp}, { "kof2km2", init_kof2km2}, + { "kof2003", init_kof2003}, + { "kof2003h", init_kof2003h}, { "matrim", init_matrim}, { "pnyaa", init_pnyaa}, { "mslug5", init_mslug5}, + { "mslug5h", init_mslug5}, { "ms5pcb", init_ms5pcb}, { "ms5plus", init_ms5plus}, { "samsho5", init_samsho5}, + { "samsho5h", init_samsho5}, { "samsh5sp", init_samsh5sp}, + { "svc", init_svc}, { NULL, NULL} }; @@ -942,20 +917,22 @@ static int zip_seek_current_file(struct ZFILE *gz, Uint32 offset) { static int read_counter; -static int read_data_i(struct ZFILE *gz, ROM_REGION *r, Uint32 dest, Uint32 size) { - Uint8 *p = r->p + dest; +static int read_data_i(struct ZFILE *gz, ROM_REGION *r, uint32_t dest, uint32_t size) { + uint8_t *p = r->p + dest; if (r->p == NULL || r->size < (dest & ~0x1) + (size * 2)) { logMsg("Region not allocated or not big enough %08x %08x", r->size, dest + (size * 2)); return -1; } - Uint8 *buf = malloc(size); - Uint32 c = gn_unzip_fread(gz, buf, size); - if (c <= 0) { + uint8_t *buf = malloc(size); + int c = gn_unzip_fread(gz, buf, size); + if (c <= 0) + { free(buf); return 0; } - for (Uint32 i = 0; i < c; i++) { + for(size_t i = 0; i < c; i++) + { //printf("%d %d\n",i,c); *p = buf[i]; p += 2; @@ -966,6 +943,27 @@ static int read_data_i(struct ZFILE *gz, ROM_REGION *r, Uint32 dest, Uint32 size return 0; } +static int read_data_i16(struct ZFILE *gz, ROM_REGION *r, uint32_t dest, uint32_t size) +{ + uint16_t *p = (uint16_t*)(r->p + dest); + uint16_t *buf = malloc(size); + int c = gn_unzip_fread(gz, (uint8_t*)buf, size); + if (c <= 0) + { + free(buf); + return 0; + } + for(size_t i = 0; i < c / 2; i++) + { + *p = buf[i]; + p += 2; + } + free(buf); + read_counter += c; + gn_update_pbar(read_counter); + return 0; +} + static int read_data_p(struct ZFILE *gz, ROM_REGION *r, Uint32 dest, Uint32 size) { if (r->p == NULL || r->size < dest + size) { logMsg("Region not allocated or not big enough"); @@ -981,7 +979,7 @@ static int read_data_p(struct ZFILE *gz, ROM_REGION *r, Uint32 dest, Uint32 size } static int load_region(struct PKZIP *pz, GAME_ROMS *r, int region, Uint32 src, - Uint32 dest, Uint32 size, Uint32 crc, char *filename) { + Uint32 dest, Uint32 size, Uint32 crc, char *filename, bool interleaved68kRom) { int rc; int badcrc = 0; struct ZFILE *gz; @@ -1016,7 +1014,13 @@ static int load_region(struct PKZIP *pz, GAME_ROMS *r, int region, Uint32 src, read_data_p(gz, &r->cpu_z80c, dest, size); break; case REGION_MAIN_CPU_CARTRIDGE: - read_data_p(gz, &r->cpu_m68k, dest, size); + if(interleaved68kRom && dest <= 2) + { + logMsg("loading interleaved 68K ROM"); + read_data_i16(gz, &r->cpu_m68k, dest, size); + } + else + read_data_p(gz, &r->cpu_m68k, dest, size); break; case REGION_FIXED_LAYER_CARTRIDGE: read_data_p(gz, &r->game_sfix, dest, size); @@ -1163,6 +1167,7 @@ static int init_roms(void *contextPtr, GAME_ROMS *r) { memory.bksw_unscramble = NULL; memory.bksw_offset = NULL; memory.sma_rng_addr = 0; + hasPvc = false; while (init_func_table[i].name) { //printf("INIT ROM ? %s %s\n",init_func_table[i].name,r->info.name); @@ -1221,7 +1226,6 @@ bool dr_load_bios(void *contextPtr, GAME_ROMS *r, char romerror[1024]) { r->bios_sfix.p = gn_unzip_file_malloc(pz, "sfix.sfix", 0xc2ea0cfd, &r->bios_sfix.size); if (r->bios_sfix.p == NULL) { - //sprintf(romerror, "Couldn't find sfix.sfx nor sfix.sfix, please check your bios"); sprintf(romerror, "sfix.sfix missing or invalid, make sure it's in your neogeo.zip"); return false; } @@ -1231,6 +1235,7 @@ bool dr_load_bios(void *contextPtr, GAME_ROMS *r, char romerror[1024]) { convert_all_char(memory.rom.bios_sfix.p, 0x20000, memory.fix_board_usage); if (!(r->info.flags & HAS_CUSTOM_CPU_BIOS)) { + logMsg("opening 68K BIOS"); if (conf.system == SYS_UNIBIOS) { if(!loadUnibios(r, "uni-bios_2_3.rom", 0x27664eb5, pz, rpath, romerror)) { @@ -1368,6 +1373,7 @@ int dr_load_roms(void *contextPtr, GAME_ROMS *r, char *rom_path, char *name, cha //printf("year %d\n",drv->year); //return; + bool interleaved68kRom = drv->rom[1].region == 8 && drv->rom[1].dest == 2; strcpy(r->info.name, drv->name); strcpy(r->info.longname, drv->longname); r->info.year = drv->year; @@ -1410,11 +1416,11 @@ int dr_load_roms(void *contextPtr, GAME_ROMS *r, char *rom_path, char *name, cha allocate_region(&r->bios_audio, drv->romsize[REGION_AUDIO_CPU_BIOS], REGION_AUDIO_CPU_BIOS); } - if (drv->romsize[REGION_FIXED_LAYER_BIOS] != 0) { - r->info.flags |= HAS_CUSTOM_SFIX_BIOS; - allocate_region(&r->bios_sfix, drv->romsize[REGION_FIXED_LAYER_BIOS], - REGION_FIXED_LAYER_BIOS); - } +// if (drv->romsize[REGION_FIXED_LAYER_BIOS] != 0) { +// r->info.flags |= HAS_CUSTOM_SFIX_BIOS; +// allocate_region(&r->bios_sfix, drv->romsize[REGION_FIXED_LAYER_BIOS], +// REGION_FIXED_LAYER_BIOS); +// } /* Now, load the roms */ read_counter = 0; @@ -1423,17 +1429,21 @@ int dr_load_roms(void *contextPtr, GAME_ROMS *r, char *rom_path, char *name, cha romsize += drv->rom[i].size; gn_init_pbar(PBAR_ACTION_LOADROM, romsize); for (i = 0; i < (int)drv->nb_romfile; i++) { - // gn_update_pbar(i, drv->nb_romfile); + if(drv->rom[i].region == REGION_FIXED_LAYER_BIOS) + { + logMsg("skipping BIOS SFIX defined in driver"); + continue; + } if (load_region(gz, r, drv->rom[i].region, drv->rom[i].src, drv->rom[i].dest, drv->rom[i].size, drv->rom[i].crc, - drv->rom[i].filename) != 0) { + drv->rom[i].filename, interleaved68kRom) != 0) { /* File not found in the roms, try the parent */ if (gzp) { int region = drv->rom[i].region; int pi; pi = load_region(gzp, r, drv->rom[i].region, drv->rom[i].src, drv->rom[i].dest, drv->rom[i].size, drv->rom[i].crc, - drv->rom[i].filename); + drv->rom[i].filename, interleaved68kRom); DEBUG_LOG("From parent %d", pi); if (pi && (region != 5 && region != 0 && region != 7)) { sprintf(romerror, "File check for %s failed, ROM set not compatible", @@ -1461,11 +1471,6 @@ int dr_load_roms(void *contextPtr, GAME_ROMS *r, char *rom_path, char *name, cha if (r->adpcmb.size == 0) { r->adpcmb.p = r->adpcma.p; r->adpcmb.size = r->adpcma.size; -#ifdef ENABLE_940T - shared_data->pcmbufb = (Uint8*) (r->adpcmb.p - gp2x_ram); - logMsg("SOUND2 code: %08x\n", (Uint32) shared_data->pcmbufb); - shared_data->pcmbufb_size = r->adpcmb.size; -#endif } memory.fix_game_usage = r->gfix_usage.p; //malloc(r->game_sfix.size >> 5); @@ -1873,7 +1878,6 @@ void dr_free_roms(GAME_ROMS *r) { } free_region(&r->game_sfix); -#ifndef ENABLE_940T free_region(&r->cpu_z80); free_region(&r->bios_audio); if (r->adpcmb.p != r->adpcma.p) @@ -1884,7 +1888,6 @@ void dr_free_roms(GAME_ROMS *r) { } free_region(&r->adpcma); -#endif free_region(&r->bios_m68k); free_region(&r->bios_sfix); diff --git a/NEO.emu/src/main/EmuMenuViews.cc b/NEO.emu/src/main/EmuMenuViews.cc index 261c92ee4..ecc65bbea 100644 --- a/NEO.emu/src/main/EmuMenuViews.cc +++ b/NEO.emu/src/main/EmuMenuViews.cc @@ -289,12 +289,12 @@ constexpr RomListEntry romlist[] { "kof10th", 1 }, { "kof2000", 0 }, { "kof2000n", 0 }, - { "kof2001", 1 }, - { "kof2001h", 1 }, - { "kof2002", 1 }, + { "kof2001", 0 }, + { "kof2001h", 0 }, + { "kof2002", 0 }, { "kof2002b", 1 }, - { "kof2003", 1 }, - { "kof2003h", 1 }, + { "kof2003", 0 }, + { "kof2003h", 0 }, { "kof2k4se", 1 }, { "kof94", 0 }, { "kof95", 0 }, @@ -344,8 +344,8 @@ constexpr RomListEntry romlist[] { "mslug3b6", 0 }, { "mslug3h", 0 }, { "mslug4", 0 }, - { "mslug5", 1 }, - { "mslug5h", 1 }, + { "mslug5", 0 }, + { "mslug5h", 0 }, { "mslugx", 0 }, { "mutnat", 0 }, { "nam1975", 0 }, @@ -365,9 +365,9 @@ constexpr RomListEntry romlist[] { "pbobblen", 0 }, { "pbobblena", 0 }, { "pgoal", 0 }, - { "pnyaa", 1 }, + { "pnyaa", 0 }, { "popbounc", 0 }, - { "preisle2", 1 }, + { "preisle2", 0 }, { "pspikes2", 0 }, { "pulstar", 0 }, { "puzzldpr", 0 }, @@ -386,7 +386,7 @@ constexpr RomListEntry romlist[] { "ridheroh", 1 }, { "roboarmy", 0 }, { "rotd", 1 }, - { "s1945p", 1 }, + { "s1945p", 0 }, { "samsh5sp", 0 }, { "samsh5sph", 0 }, { "samsh5spn", 0 }, @@ -397,14 +397,14 @@ constexpr RomListEntry romlist[] { "samsho4", 0 }, { "samsho5", 0 }, { "samsho5b", 1 }, - { "samsho5h", 1 }, + { "samsho5h", 0 }, { "samshoh", 0 }, { "savagere", 0 }, { "sdodgeb", 0 }, { "sengokh", 0 }, { "sengoku", 0 }, { "sengoku2", 0 }, - { "sengoku3", 1 }, + { "sengoku3", 0 }, { "shocktr2", 0 }, { "shocktra", 0 }, { "shocktro", 0 }, @@ -421,7 +421,7 @@ constexpr RomListEntry romlist[] { "stakwin2", 0 }, { "strhoop", 0 }, { "superspy", 0 }, - { "svc", 1 }, + { "svc", 0 }, { "svcboot", 1 }, { "svcpcb", 1 }, { "svcpcba", 1 }, diff --git a/NEO.emu/src/main/Main.cc b/NEO.emu/src/main/Main.cc index 92c899f60..5fe20758a 100755 --- a/NEO.emu/src/main/Main.cc +++ b/NEO.emu/src/main/Main.cc @@ -414,7 +414,10 @@ CLINK ROM_DEF *res_load_drv(void *contextPtr, const char *name) io.read(drv->longname, 128); drv->year = io.get(); // TODO: LE byte-swap on uint32_t reads for(auto i : iotaCount(10)) + { drv->romsize[i] = io.get(); + //EmuEx::log.debug("ROM region:{} size:{:X}", i, drv->romsize[i]); + } drv->nb_romfile = io.get(); for(auto i : iotaCount(drv->nb_romfile)) { @@ -424,6 +427,8 @@ CLINK ROM_DEF *res_load_drv(void *contextPtr, const char *name) drv->rom[i].dest = io.get(); drv->rom[i].size = io.get(); drv->rom[i].crc = io.get(); + //EmuEx::log.debug("ROM file:{} region:{}, src:{:X} dest:{:X} size:{:X} crc:{:X}", drv->rom[i].filename, + // drv->rom[i].region, drv->rom[i].src, drv->rom[i].dest, drv->rom[i].size, drv->rom[i].crc); } return drv; } diff --git a/NEO.emu/src/main/state.cc b/NEO.emu/src/main/state.cc index daff549c6..d60732ac1 100644 --- a/NEO.emu/src/main/state.cc +++ b/NEO.emu/src/main/state.cc @@ -123,6 +123,10 @@ void makeState(MapIO &io, int mode) ym2610_mkstate(&io, mode); timer_mkstate(&io, mode); pd4990a_mkstate(&io, mode); + if(hasPvc) + { + mkstate_data(io, pvcMem, sizeof(pvcMem), mode); + } } }