From d03409681a6f3a421626db1d42b8722ea144d2e7 Mon Sep 17 00:00:00 2001 From: dinkc64 Date: Fri, 8 Nov 2024 20:27:14 -0500 Subject: [PATCH 1/5] galpani3, oops, stating --- src/burn/drv/pst90s/d_galpani3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/burn/drv/pst90s/d_galpani3.cpp b/src/burn/drv/pst90s/d_galpani3.cpp index 640055b1a..c2efa2ec7 100644 --- a/src/burn/drv/pst90s/d_galpani3.cpp +++ b/src/burn/drv/pst90s/d_galpani3.cpp @@ -163,6 +163,7 @@ static void do_rle(INT32 which, INT32 data) case 0x3000: // data = framebuffer destination address "x" offset // c1c = framebuffer destination address "y" offset -dink Nov, 2024 + //bprintf(0, _T("do_rle, data/c1c: %x %x\n"), data, c1c[which]); dstaddress += (data & 0x1ff) | ((c1c[which] & 0x1ff) * 0x200); break; } @@ -785,6 +786,7 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin) SCAN_VAR(fbbright1); SCAN_VAR(fbbright2); SCAN_VAR(regs1_address); + SCAN_VAR(c1c); SCAN_VAR(prio_scrollx); SCAN_VAR(prio_scrolly); SCAN_VAR(regs1); From 51e811175e474baafacc09cfffabf0679bd7959f Mon Sep 17 00:00:00 2001 From: dinkc64 Date: Fri, 8 Nov 2024 20:58:27 -0500 Subject: [PATCH 2/5] glob sound --- src/burn/drv/pre90s/d_epos.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/burn/drv/pre90s/d_epos.cpp b/src/burn/drv/pre90s/d_epos.cpp index 8ed4deadf..c108ef273 100644 --- a/src/burn/drv/pre90s/d_epos.cpp +++ b/src/burn/drv/pre90s/d_epos.cpp @@ -33,6 +33,7 @@ static UINT8 *DealerInputMultiplex; static UINT8 dealer_hw = 0; static UINT8 game_prot; +static INT32 is_theglob = 0; static int watchdog; @@ -539,6 +540,7 @@ static void init_prot() if (!strcmp(BurnDrvGetTextA(DRV_NAME), gamelist[i].set[setnum])) { bprintf(0, _T("*** found prot for %S\n"), gamelist[i].set[setnum]); game_prot = gamelist[i].prot; + is_theglob = (game_prot == 0x80); break; } } @@ -643,7 +645,7 @@ static INT32 DrvInit() ZetSetOutHandler(epos_write_port); ZetClose(); - AY8910Init(0, 687500, 0); + AY8910Init(0, (is_theglob) ? 2750000 : 687500, 0); AY8910SetAllRoutes(0, 0.35, BURN_SND_ROUTE_BOTH); AY8910SetBuffered(ZetTotalCycles, 2750000); @@ -718,6 +720,7 @@ static INT32 DrvExit() BurnFreeMemIndex(); dealer_hw = 0; + is_theglob = 0; return 0; } From b5f0ed3005a41c2093a1b1445faa4c537642b797 Mon Sep 17 00:00:00 2001 From: dinkc64 Date: Sat, 9 Nov 2024 00:51:51 -0500 Subject: [PATCH 3/5] add new driver --- makefile.burn_rules | 5 +- src/burn/burn.h | 3 + src/burn/drv/snes/apu.cpp | 242 + src/burn/drv/snes/apu.h | 49 + src/burn/drv/snes/cart.cpp | 604 + src/burn/drv/snes/cart.h | 42 + src/burn/drv/snes/cpu.cpp | 4255 ++++ src/burn/drv/snes/cpu.h | 32 + src/burn/drv/snes/cpu_sa1.cpp | 2598 +++ src/burn/drv/snes/cpu_sa1.h | 29 + src/burn/drv/snes/cx4.cpp | 859 + src/burn/drv/snes/cx4.h | 12 + src/burn/drv/snes/d_snes.cpp | 31827 +++++++++++++++++++++++++++ src/burn/drv/snes/dma.cpp | 404 + src/burn/drv/snes/dma.h | 52 + src/burn/drv/snes/dsp.cpp | 601 + src/burn/drv/snes/dsp.h | 99 + src/burn/drv/snes/input.cpp | 107 + src/burn/drv/snes/input.h | 39 + src/burn/drv/snes/license.txt | 21 + src/burn/drv/snes/ppu.cpp | 1371 ++ src/burn/drv/snes/ppu.h | 56 + src/burn/drv/snes/sa1.cpp | 1000 + src/burn/drv/snes/sa1.h | 15 + src/burn/drv/snes/sdd1.cpp | 594 + src/burn/drv/snes/sdd1.h | 6 + src/burn/drv/snes/snes.cpp | 696 + src/burn/drv/snes/snes.h | 102 + src/burn/drv/snes/snes_other.cpp | 398 + src/burn/drv/snes/spc.cpp | 1937 ++ src/burn/drv/snes/spc.h | 59 + src/burn/drv/snes/statehandler.cpp | 259 + src/burn/drv/snes/statehandler.h | 33 + src/burner/burner.h | 7 +- src/burner/dat.cpp | 14 + src/burner/gami.cpp | 18 +- src/burner/win32/app.rc | 1 + src/burner/win32/drv.cpp | 2 +- src/burner/win32/inpd.cpp | 2 +- src/burner/win32/main.cpp | 6 + src/burner/win32/neocdlist.cpp | 2 + src/burner/win32/resource.h | 5 +- src/burner/win32/resource_string.h | 4 +- src/burner/win32/scrn.cpp | 14 +- src/burner/win32/sel.cpp | 53 +- src/burner/win32/string.rc | 2 +- 46 files changed, 48503 insertions(+), 33 deletions(-) create mode 100644 src/burn/drv/snes/apu.cpp create mode 100644 src/burn/drv/snes/apu.h create mode 100644 src/burn/drv/snes/cart.cpp create mode 100644 src/burn/drv/snes/cart.h create mode 100644 src/burn/drv/snes/cpu.cpp create mode 100644 src/burn/drv/snes/cpu.h create mode 100644 src/burn/drv/snes/cpu_sa1.cpp create mode 100644 src/burn/drv/snes/cpu_sa1.h create mode 100644 src/burn/drv/snes/cx4.cpp create mode 100644 src/burn/drv/snes/cx4.h create mode 100644 src/burn/drv/snes/d_snes.cpp create mode 100644 src/burn/drv/snes/dma.cpp create mode 100644 src/burn/drv/snes/dma.h create mode 100644 src/burn/drv/snes/dsp.cpp create mode 100644 src/burn/drv/snes/dsp.h create mode 100644 src/burn/drv/snes/input.cpp create mode 100644 src/burn/drv/snes/input.h create mode 100644 src/burn/drv/snes/license.txt create mode 100644 src/burn/drv/snes/ppu.cpp create mode 100644 src/burn/drv/snes/ppu.h create mode 100644 src/burn/drv/snes/sa1.cpp create mode 100644 src/burn/drv/snes/sa1.h create mode 100644 src/burn/drv/snes/sdd1.cpp create mode 100644 src/burn/drv/snes/sdd1.h create mode 100644 src/burn/drv/snes/snes.cpp create mode 100644 src/burn/drv/snes/snes.h create mode 100644 src/burn/drv/snes/snes_other.cpp create mode 100644 src/burn/drv/snes/spc.cpp create mode 100644 src/burn/drv/snes/spc.h create mode 100644 src/burn/drv/snes/statehandler.cpp create mode 100644 src/burn/drv/snes/statehandler.h diff --git a/makefile.burn_rules b/makefile.burn_rules index a3d89a62a..80802a7e1 100644 --- a/makefile.burn_rules +++ b/makefile.burn_rules @@ -1,5 +1,5 @@ alldir = burn burn/devices burn/snd burn/drv burn/drv/atari burn/drv/capcom burn/drv/cave burn/drv/channelf burn/drv/coleco burn/drv/cps3 burn/drv/dataeast \ - burn/drv/galaxian burn/drv/irem burn/drv/konami burn/drv/megadrive burn/drv/midway burn/drv/pce burn/drv/pst90s burn/drv/pre90s burn/drv/neogeo burn/drv/nes \ + burn/drv/galaxian burn/drv/irem burn/drv/konami burn/drv/megadrive burn/drv/midway burn/drv/pce burn/drv/pst90s burn/drv/pre90s burn/drv/neogeo burn/drv/nes burn/drv/snes \ burn/drv/pgm burn/drv/psikyo burn/drv/sega burn/drv/sg1000 burn/drv/sms burn/drv/msx burn/drv/spectrum burn/drv/taito \ burn/drv/toaplan cpu cpu/a68k cpu/arm cpu/arm7 cpu/e132xs cpu/f8 cpu/h6280 cpu/hd6309 cpu/i386 cpu/i8039 cpu/i8x41 cpu/i8051 cpu/adsp2100 cpu/konami cpu/m377 cpu/mips3 cpu/m68k \ cpu/mb88xx cpu/m6502 cpu/m6800 cpu/m6805 cpu/m6809 cpu/nec cpu/pic16c5x cpu/s2650 cpu/tlcs90 cpu/tlcs900 cpu/sh2 cpu/sh4 cpu/tms32010 cpu/tms34 cpu/upd7725 cpu/upd7810 \ @@ -40,6 +40,9 @@ drvsrc = d_akkaarrh.o d_arcadecl.o d_atarig1.o d_badlands.o d_batman.o d_blstro \ d_nes.o \ \ + d_snes.o apu.o cart.o cpu.o cx4.o dma.o dsp.o input.o ppu.o snes.o \ + snes_other.o spc.o sa1.o sdd1.o cpu_sa1.o statehandler.o \ + \ d_pgm.o \ \ d_psikyo.o d_psikyo4.o d_psikyosh.o \ diff --git a/src/burn/burn.h b/src/burn/burn.h index bf37d4198..fa2fd4fff 100644 --- a/src/burn/burn.h +++ b/src/burn/burn.h @@ -526,6 +526,7 @@ void IpsApplyPatches(UINT8* base, char* rom_name, UINT32 rom_crc, bool readonly #define HARDWARE_PREFIX_FDS (0x1F000000) #define HARDWARE_PREFIX_NGP (0x20000000) #define HARDWARE_PREFIX_CHANNELF (0x21000000) +#define HARDWARE_PREFIX_SNES (0x22000000) #define HARDWARE_SNK_NGP (HARDWARE_PREFIX_NGP | 0x00000000) #define HARDWARE_SNK_NGPC (HARDWARE_PREFIX_NGP | 0x00000001) // must not be 0x10000 @@ -765,6 +766,8 @@ void IpsApplyPatches(UINT8* base, char* rom_name, UINT32 rom_crc, bool readonly #define HARDWARE_NES (HARDWARE_PREFIX_NES) #define HARDWARE_FDS (HARDWARE_PREFIX_FDS) +#define HARDWARE_SNES (HARDWARE_PREFIX_SNES) +#define HARDWARE_SNES_ZAPPER (HARDWARE_PREFIX_SNES | 0x0000001) #define HARDWARE_CHANNELF (HARDWARE_PREFIX_CHANNELF) diff --git a/src/burn/drv/snes/apu.cpp b/src/burn/drv/snes/apu.cpp new file mode 100644 index 000000000..25d9dd140 --- /dev/null +++ b/src/burn/drv/snes/apu.cpp @@ -0,0 +1,242 @@ + +#include +#include +#include +#include +#include + +#include "apu.h" +#include "snes.h" +#include "spc.h" +#include "dsp.h" +#include "statehandler.h" + +static uint8_t bootRom[0x40]; // algorithmically constructed + +static const uint8_t iplDeltas[0x40] = { + 0x18, 0x45, 0xeb, 0x61, 0x1c, 0x9a, 0xdc, 0x06, 0xa1, 0x26, 0x15, 0x07, 0x89, 0x96, 0xb8, 0xe2, + 0xf5, 0xe1, 0x1e, 0xf1, 0xeb, 0x0a, 0xd2, 0xc0, 0xf7, 0x83, 0x7e, 0x60, 0x93, 0x40, 0x15, 0x46, + 0x18, 0xf4, 0xdc, 0x7a, 0x31, 0x3d, 0x2d, 0x64, 0x30, 0xf8, 0x00, 0xcc, 0xa3, 0x67, 0x67, 0x23, + 0xdc, 0xa2, 0x2f, 0xd7, 0xa6, 0x06, 0xd3, 0x84, 0xc4, 0xdc, 0xb8, 0x7f, 0x02, 0x86, 0x47, 0x6a, +}; + +static const double apuCyclesPerMaster = (32040 * 32) / (1364 * 262 * 60.0); +static const double apuCyclesPerMasterPal = (32040 * 32) / (1364 * 312 * 50.0); + +static void apu_cycle(Apu* apu); + +static uint8_t ipl_lfsr(uint32_t posTo, int32_t arrayPos) { + uint32_t seed = 0xa5; // it's magic! (tm) + uint32_t pos = 0; + do { + if ((pos ^ arrayPos) == posTo) break; + seed = (seed * 1664525 + 1013904223) % 256; + pos++; + } while (1); + return seed; +} + +static void ipl_create() { + uint8_t prev = 0; + for (int i = 0; i < 0x40; i++) { + prev = (prev - iplDeltas[i]) & 0xff; + bootRom[i] = ipl_lfsr(prev, i); + prev = iplDeltas[i]; + } +} + +Apu* apu_init(Snes* snes) { + Apu* apu = (Apu*)BurnMalloc(sizeof(Apu)); + apu->snes = snes; + apu->spc = spc_init(apu, apu_spcRead, apu_spcWrite, apu_spcIdle); + apu->dsp = dsp_init(apu); + ipl_create(); + + return apu; +} + +void apu_free(Apu* apu) { + spc_free(apu->spc); + dsp_free(apu->dsp); + BurnFree(apu); +} + +uint64_t apu_cycles(Apu* apu) { + return apu->cycles; +} + +void apu_reset(Apu* apu) { + // TODO: hard reset for apu + spc_reset(apu->spc, true); + dsp_reset(apu->dsp); + memset(apu->ram, 0, sizeof(apu->ram)); + apu->dspAdr = 0; + apu->romReadable = true; + apu->cycles = 0; + memset(apu->inPorts, 0, sizeof(apu->inPorts)); + memset(apu->outPorts, 0, sizeof(apu->outPorts)); + for(int i = 0; i < 3; i++) { + apu->timer[i].cycles = 0; + apu->timer[i].divider = 0; + apu->timer[i].target = 0; + apu->timer[i].counter = 0; + apu->timer[i].enabled = false; + } +} + +void apu_handleState(Apu* apu, StateHandler* sh) { + sh_handleBools(sh, &apu->romReadable, NULL); + sh_handleBytes(sh, + &apu->dspAdr, &apu->inPorts[0], &apu->inPorts[1], &apu->inPorts[2], &apu->inPorts[3], &apu->inPorts[4], + &apu->inPorts[5], &apu->outPorts[0], &apu->outPorts[1], &apu->outPorts[2], &apu->outPorts[3], NULL + ); + sh_handleLongLongs(sh, &apu->cycles, NULL); + for(int i = 0; i < 3; i++) { + sh_handleBools(sh, &apu->timer[i].enabled, NULL); + sh_handleBytes(sh, &apu->timer[i].cycles, &apu->timer[i].divider, &apu->timer[i].target, &apu->timer[i].counter, NULL); + } + sh_handleByteArray(sh, apu->ram, 0x10000); + // components + spc_handleState(apu->spc, sh); + dsp_handleState(apu->dsp, sh); +} + +void apu_runCycles(Apu* apu) { + uint64_t sync_to = (uint64_t)apu->snes->cycles * (apu->snes->palTiming ? apuCyclesPerMasterPal : apuCyclesPerMaster); + while (apu->cycles < sync_to) { + spc_runOpcode(apu->spc); + } +} + +static void apu_cycle(Apu* apu) { + if((apu->cycles & 0x1f) == 0) { + // every 32 cycles + dsp_cycle(apu->dsp); + } + + // handle timers + for(int i = 0; i < 3; i++) { + if(apu->timer[i].cycles == 0) { + apu->timer[i].cycles = i == 2 ? 16 : 128; + if(apu->timer[i].enabled) { + apu->timer[i].divider++; + if(apu->timer[i].divider == apu->timer[i].target) { + apu->timer[i].divider = 0; + apu->timer[i].counter++; + apu->timer[i].counter &= 0xf; + } + } + } + apu->timer[i].cycles--; + } + + apu->cycles++; +} + +uint8_t apu_read(Apu* apu, uint16_t adr) { + switch(adr) { + case 0xf0: + case 0xf1: + case 0xfa: + case 0xfb: + case 0xfc: { + return 0; + } + case 0xf2: { + return apu->dspAdr; + } + case 0xf3: { + return dsp_read(apu->dsp, apu->dspAdr & 0x7f); + } + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: { + return apu->inPorts[adr - 0xf4]; + } + case 0xfd: + case 0xfe: + case 0xff: { + uint8_t ret = apu->timer[adr - 0xfd].counter; + apu->timer[adr - 0xfd].counter = 0; + return ret; + } + } + if(apu->romReadable && adr >= 0xffc0) { + return bootRom[adr - 0xffc0]; + } + return apu->ram[adr]; +} + +void apu_write(Apu* apu, uint16_t adr, uint8_t val) { + switch(adr) { + case 0xf0: { + break; // test register + } + case 0xf1: { + for(int i = 0; i < 3; i++) { + if(!apu->timer[i].enabled && (val & (1 << i))) { + apu->timer[i].divider = 0; + apu->timer[i].counter = 0; + } + apu->timer[i].enabled = val & (1 << i); + } + if(val & 0x10) { + apu->inPorts[0] = 0; + apu->inPorts[1] = 0; + } + if(val & 0x20) { + apu->inPorts[2] = 0; + apu->inPorts[3] = 0; + } + apu->romReadable = val & 0x80; + break; + } + case 0xf2: { + apu->dspAdr = val; + break; + } + case 0xf3: { + if(apu->dspAdr < 0x80) dsp_write(apu->dsp, apu->dspAdr, val); + break; + } + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: { + apu->outPorts[adr - 0xf4] = val; + break; + } + case 0xf8: + case 0xf9: { + apu->inPorts[adr - 0xf4] = val; + break; + } + case 0xfa: + case 0xfb: + case 0xfc: { + apu->timer[adr - 0xfa].target = val; + break; + } + } + apu->ram[adr] = val; +} + +uint8_t apu_spcRead(void* mem, uint16_t adr) { + Apu* apu = (Apu*) mem; + apu_cycle(apu); + return apu_read(apu, adr); +} + +void apu_spcWrite(void* mem, uint16_t adr, uint8_t val) { + Apu* apu = (Apu*) mem; + apu_cycle(apu); + apu_write(apu, adr, val); +} + +void apu_spcIdle(void* mem, bool waiting) { + Apu* apu = (Apu*) mem; + apu_cycle(apu); +} diff --git a/src/burn/drv/snes/apu.h b/src/burn/drv/snes/apu.h new file mode 100644 index 000000000..c1b2fb3bb --- /dev/null +++ b/src/burn/drv/snes/apu.h @@ -0,0 +1,49 @@ + +#ifndef APU_H +#define APU_H + +#include +#include +#include "burnint.h" + +typedef struct Apu Apu; + +#include "snes.h" +#include "spc.h" +#include "dsp.h" +#include "statehandler.h" + +typedef struct Timer { + uint8_t cycles; + uint8_t divider; + uint8_t target; + uint8_t counter; + bool enabled; +} Timer; + +struct Apu { + Snes* snes; + Spc* spc; + Dsp* dsp; + uint8_t ram[0x10000]; + bool romReadable; + uint8_t dspAdr; + uint64_t cycles; + uint8_t inPorts[6]; // includes 2 bytes of ram + uint8_t outPorts[4]; + Timer timer[3]; +}; + +Apu* apu_init(Snes* snes); +void apu_free(Apu* apu); +void apu_reset(Apu* apu); +uint64_t apu_cycles(Apu* apu); +void apu_handleState(Apu* apu, StateHandler* sh); +void apu_runCycles(Apu* apu); +uint8_t apu_read(Apu* apu, uint16_t adr); +void apu_write(Apu* apu, uint16_t adr, uint8_t val); +uint8_t apu_spcRead(void* mem, uint16_t adr); +void apu_spcWrite(void* mem, uint16_t adr, uint8_t val); +void apu_spcIdle(void* mem, bool waiting); + +#endif diff --git a/src/burn/drv/snes/cart.cpp b/src/burn/drv/snes/cart.cpp new file mode 100644 index 000000000..406e5b347 --- /dev/null +++ b/src/burn/drv/snes/cart.cpp @@ -0,0 +1,604 @@ + +#include +#include +#include +#include +#include + +#include "cart.h" +#include "snes.h" +#include "statehandler.h" +#include "cx4.h" +#include "upd7725.h" +#include "sa1.h" +#include "sdd1.h" + +static uint8_t cart_readDummy(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeDummy(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readLorom(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLorom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readExLorom(Cart* cart, uint8_t bank, uint16_t adr); +static uint8_t cart_readLoromSeta(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLoromSeta(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readLoromDSP(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLoromDSP(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readHirom(Cart* cart, uint8_t bank, uint16_t adr); +static uint8_t cart_readExHirom(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeHirom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readHiromDSP(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeHiromDSP(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readCX4(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeCX4(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readLoromSA1(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLoromSA1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readLoromOBC1(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLoromOBC1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readLoromSDD1(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLoromSDD1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); + +uint8_t (*cart_read)(Cart* cart, uint8_t bank, uint16_t adr) = NULL; +void (*cart_write)(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) = NULL; +void (*cart_run)() = NULL; +void cart_run_dummy() { } +void cart_mapRun(Cart* cart); + +static void cart_mapRwHandlers(Cart* cart) { + switch(cart->type) { + case CART_NONE: cart_read = cart_readDummy; cart_write = cart_writeDummy; break; + case CART_LOROM: cart_read = cart_readLorom; cart_write = cart_writeLorom; break; + case CART_HIROM: cart_read = cart_readHirom; cart_write = cart_writeHirom; break; + case CART_EXLOROM: cart_read = cart_readExLorom; cart_write = cart_writeLorom; break; + case CART_EXHIROM: cart_read = cart_readExHirom; cart_write = cart_writeHirom; break; + case CART_CX4: cart_read = cart_readCX4; cart_write = cart_writeCX4; break; + + case CART_LOROMDSP: cart_read = cart_readLoromDSP; cart_write = cart_writeLoromDSP; break; + case CART_HIROMDSP: cart_read = cart_readHiromDSP; cart_write = cart_writeHiromDSP; break; + case CART_LOROMSETA: cart_read = cart_readLoromSeta; cart_write = cart_writeLoromSeta; break; + case CART_LOROMSA1: cart_read = cart_readLoromSA1; cart_write = cart_writeLoromSA1; break; + case CART_LOROMOBC1: cart_read = cart_readLoromOBC1; cart_write = cart_writeLoromOBC1; break; + case CART_LOROMSDD1: cart_read = cart_readLoromSDD1; cart_write = cart_writeLoromSDD1; break; + default: + bprintf(0, _T("cart_mapRwHandlers(): invalid type specified: %x\n"), cart->type); break; + } +} + +Cart* cart_init(Snes* snes) { + Cart* cart = (Cart*)BurnMalloc(sizeof(Cart)); + cart->snes = snes; + cart->type = CART_NONE; + cart_mapRwHandlers(cart); + cart_mapRun(cart); + cart->hasBattery = 0; + cart->rom = NULL; + cart->romSize = 0; + cart->ram = NULL; + cart->ramSize = 0; + return cart; +} + +// upd (dsp 1, 1b, 2, 3, 4) note, 1a and 1 are the same firmware +// Seta st010, st011 +// TODO: put upd/dsp stuff into upd.cpp/h +static double upd_CyclesPerMaster; +static uint64_t upd_cycles; +static uint8_t *upd_ram = NULL; +static Snes *upd_snes_ctx; + +void cart_free(Cart* cart) { + switch (cart->type) { + case CART_LOROMSA1: snes_sa1_exit(); break; + case CART_LOROMSDD1: snes_sdd1_exit(); break; + } + + if(cart->rom != NULL) BurnFree(cart->rom); + if(cart->ram != NULL) BurnFree(cart->ram); + if(cart->bios != NULL) BurnFree(cart->bios); + if(upd_ram != NULL) BurnFree(upd_ram); + + BurnFree(cart); +} + +void upd_run() { + const uint64_t upd_sync_to = (uint64_t)upd_snes_ctx->cycles * upd_CyclesPerMaster; + + int to_run = (int)((uint64_t)upd_sync_to - upd_cycles); + if (to_run > 0) { + upd_cycles += upd96050Run(to_run); + } +} + +void cart_mapRun(Cart* cart) { + switch (cart->type) { + case CART_CX4: cart_run = cx4_run; break; + + case CART_LOROMSA1: cart_run = snes_sa1_run; cart->heavySync = true; break; + + case CART_LOROMDSP: + case CART_HIROMDSP: + case CART_LOROMSETA: cart_run = upd_run; break; + + default: cart_run = cart_run_dummy; cart->heavySync = false; break; + } +} + +void cart_reset(Cart* cart) { + // do not reset ram, assumed to be battery backed + bprintf(0, _T("cart reset! type %x\n"), cart->type); + switch (cart->type) { + case CART_LOROMSA1: + snes_sa1_init(cart->snes, cart->rom, cart->romSize, cart->ram, cart->ramSize); + snes_sa1_reset(); + bprintf(0, _T("init/reset sa-1\n")); + break; + case CART_LOROMSDD1: + snes_sdd1_init(cart->rom, cart->romSize, cart->ram, cart->ramSize); + snes_sdd1_reset(); + bprintf(0, _T("init/reset sdd-1\n")); + break; + case CART_CX4: // capcom cx4 + cx4_init(cart->snes); + cx4_reset(); + bprintf(0, _T("init/reset cx4\n")); + break; + case CART_LOROMDSP: // dsp lorom + case CART_HIROMDSP: // dsp hirom + upd_snes_ctx = cart->snes; + memset(upd_ram, 0, 0x200); + upd96050Init(7725, cart->bios, cart->bios + 0x2000, upd_ram, NULL, NULL); + upd96050Reset(); + upd_CyclesPerMaster = (double)8000000 / ((cart->snes->palTiming) ? (1364 * 312 * 50.0) : (1364 * 262 * 60.0)); + upd_cycles = 0; + bprintf(0, _T("init/reset dsp\n")); + break; + case CART_LOROMSETA: // Seta ST010/ST011 LoROM + upd_snes_ctx = cart->snes; + memset(upd_ram, 0, 0x1000); + upd96050Init(96050, cart->bios, cart->bios + 0x10000, upd_ram, NULL, NULL); + upd96050Reset(); + upd_CyclesPerMaster = (double)11000000 / ((cart->snes->palTiming) ? (1364 * 312 * 50.0) : (1364 * 262 * 60.0)); + upd_cycles = 0; + bprintf(0, _T("init/reset seta-dsp\n")); + break; + case CART_LOROMOBC1: + //? + break; + } +} + +bool cart_handleTypeState(Cart* cart, StateHandler* sh) { + // when loading, return if values match + if(sh->saving) { + sh_handleBytes(sh, &cart->type, NULL); + sh_handleInts(sh, &cart->romSize, &cart->ramSize, NULL); + return true; + } else { + uint8_t type = 0; + uint32_t romSize = 0; + uint32_t ramSize = 0; + sh_handleBytes(sh, &type, NULL); + sh_handleInts(sh, &romSize, &ramSize, NULL); + return !(type != cart->type || romSize != cart->romSize || ramSize != cart->ramSize); + } +} + +void upd_handleState(StateHandler* sh, int cart_type) { + void *upd_data = NULL; + int32_t upd_data_size = upd96050ExportRegs(&upd_data); + + sh_handleByteArray(sh, (uint8_t*)upd_data, upd_data_size); // from upd7725 cpu core + sh_handleByteArray(sh, upd_ram, (cart_type == CART_LOROMSETA) ? 0x1000 : 0x200); // from upd7725 cpu core + + sh_handleLongLongs(sh, &upd_cycles, NULL); +} + +void cart_handleState(Cart* cart, StateHandler* sh) { + if(cart->ram != NULL) sh_handleByteArray(sh, cart->ram, cart->ramSize); + + switch(cart->type) { + case CART_CX4: cx4_handleState(sh); break; + case CART_LOROMSA1: snes_sa1_handleState(sh); break; + case CART_LOROMDSP: + case CART_HIROMDSP: + case CART_LOROMSETA: upd_handleState(sh, cart->type); break; + case CART_LOROMSDD1: snes_sdd1_handleState(sh); break; + } +} + +static void dsp_bios_reform(uint8_t *ori_bios, uint8_t *new_bios, int is_seta) { + const int bios_sizes[2] = { 0x2000, 0x10000 }; + const int data_sizes[2] = { 0x800, 0x1000 }; + + bprintf(0, _T("bios_reform: seta? %x\n"), is_seta); + + int bios_size = bios_sizes[is_seta]; + int data_size = data_sizes[is_seta]; + bprintf(0, _T("bios size / data size: %x %x\n"), bios_size, data_size); + UINT32 *newbios = (UINT32*)new_bios; + for (int i = 0; i < bios_size; i += 4) { + *newbios = (ori_bios[i + 0] << 24) | (ori_bios[i + 1] << 16) | (ori_bios[i + 2] << 8); // only uses 24bits! + newbios++; + } + + UINT16 *newbios_data = (UINT16*)&new_bios[bios_size]; + for (int i = 0; i < data_size; i += 2) { + *newbios_data = (ori_bios[bios_size + i + 0] << 8) | (ori_bios[bios_size + i + 1] << 0); + newbios_data++; + } +} + +void cart_load(Cart* cart, int type, uint8_t* rom, int romSize, uint8_t* biosrom, int biosromSize, int ramSize, bool hasBattery) { + cart->type = type; + cart_mapRwHandlers(cart); + cart_mapRun(cart); + cart->hasBattery = hasBattery; + if(cart->rom != NULL) BurnFree(cart->rom); + if(cart->ram != NULL) BurnFree(cart->ram); + if(cart->bios != NULL) BurnFree(cart->bios); + cart->rom = BurnMalloc(romSize); + cart->romSize = romSize; + if(ramSize > 0) { + cart->ram = BurnMalloc(ramSize); + } else { + cart->ram = NULL; + } + // dsp[1-4] & seta st010/st011 bios memory init/re-format + if (biosromSize > 0 && (type == CART_LOROMDSP || type == CART_HIROMDSP || type == CART_LOROMSETA)) { + cart->bios = BurnMalloc(0x18000); // dsp 0x2800, Seta st010/st011: 0x11000 + cart->biosSize = biosromSize; + dsp_bios_reform(biosrom, cart->bios, (type == CART_LOROMSETA)); + upd_ram = (uint8_t*)BurnMalloc(0x2000); // 0x200 dsp, 0x800 seta + } + cart->ramSize = ramSize; + memcpy(cart->rom, rom, romSize); +} + +bool cart_handleBattery(Cart* cart, bool save, uint8_t* data, int* size) { + if(cart->hasBattery == false) return false; + if(save) { + *size = cart->ramSize; + if(data == NULL) return true; + // assumes data is correct size + if(cart->ram != NULL) memcpy(data, cart->ram, cart->ramSize); + return true; + } else { + if(*size != cart->ramSize) return false; + if(cart->ram != NULL) memcpy(cart->ram, data, cart->ramSize); + return true; + } +} + +static uint8_t cart_readDummy(Cart* cart, uint8_t bank, uint16_t adr) { + return cart->snes->openBus; +} + +static void cart_writeDummy(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { +} + +#if 0 +uint8_t cart_read_switched(Cart* cart, uint8_t bank, uint16_t adr) { + switch(cart->type) { + case CART_NONE: return cart->snes->openBus; + case CART_LOROM: return cart_readLorom(cart, bank, adr); + case CART_HIROM: return cart_readHirom(cart, bank, adr); + case CART_EXLOROM: return cart_readExLorom(cart, bank, adr); + case CART_EXHIROM: return cart_readExHirom(cart, bank, adr); + case CART_CX4: return cart_readCX4(cart, bank, adr); + case CART_LOROMDSP: return cart_readLoromDSP(cart, bank, adr); + case CART_HIROMDSP: return cart_readHiromDSP(cart, bank, adr); + case CART_LOROMSETA: return cart_readLoromSeta(cart, bank, adr); + case CART_LOROMSA1: return cart_readLoromSA1(cart, bank, adr); + case CART_LOROMOBC1: return cart_readLoromOBC1(cart, bank, adr); + case CART_LOROMSDD1: return cart_readLoromSDD1(cart, bank, adr); + } + return cart->snes->openBus; +} + +void cart_write_switched(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + switch(cart->type) { + case CART_NONE: break; + case CART_LOROM: cart_writeLorom(cart, bank, adr, val); break; + case CART_HIROM: cart_writeHirom(cart, bank, adr, val); break; + case CART_EXLOROM: cart_writeLorom(cart, bank, adr, val); break; + case CART_EXHIROM: cart_writeHirom(cart, bank, adr, val); break; + case CART_CX4: cart_writeCX4(cart, bank, adr, val); break; + case CART_LOROMDSP: cart_writeLoromDSP(cart, bank, adr, val); break; + case CART_HIROMDSP: cart_writeHiromDSP(cart, bank, adr, val); break; + case CART_LOROMSETA: cart_writeLoromSeta(cart, bank, adr, val); break; + case CART_LOROMSA1: cart_writeLoromSA1(cart, bank, adr, val); break; + case CART_LOROMOBC1: cart_writeLoromOBC1(cart, bank, adr, val); break; + case CART_LOROMSDD1: cart_writeLoromSDD1(cart, bank, adr, val); break; + } +} +#endif + +static uint8_t cart_readLorom(Cart* cart, uint8_t bank, uint16_t adr) { + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + bank &= 0x7f; + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + + return cart->snes->openBus; +} + +static void cart_writeLorom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } +} + +static uint8_t cart_readExLorom(Cart* cart, uint8_t bank, uint16_t adr) { + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + const bool secondHalf = bank < 0x80; + bank &= 0x7f; + if(adr >= 0x8000) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (secondHalf ? 0x400000 : 0) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static uint8_t cart_readLoromSeta(Cart* cart, uint8_t bank, uint16_t adr) { + + if ((bank & 0x78) == 0x60 && (adr & 0xc000) == 0x0000) { // 60-67,0-3fff + cart_run(); + return snesdsp_read(~adr & 0x01); + } + + if ((bank & 0x78) == 0x68 && (adr & 0x8000) == 0x0000) { // 68-6f,0-7fff + cart_run(); + return upd_ram[adr & 0xfff]; + } + + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + bank &= 0x7f; + if(adr >= 0x8000) { + // adr 8000-ffff in all other banks + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + + return cart->snes->openBus; +} + +static void cart_writeLoromSeta(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + if ((bank & 0x78) == 0x60 && (adr & 0xc000) == 0x0000) { + cart_run(); + snesdsp_write(~adr & 0x01, val); + return; + } + + if ((bank & 0x78) == 0x68 && (adr & 0x8000) == 0x0000) { + cart_run(); + upd_ram[adr & 0xfff] = val; + return; + } + + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } +} + +static uint8_t cart_readLoromDSP(Cart* cart, uint8_t bank, uint16_t adr) { + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + bank &= 0x7f; + if ( ((bank & 0x70) == 0x30 && adr & 0x8000) || // 30-3f,b0-bf 8000-ffff + ((bank & 0x70) == 0x60 && ~adr & 0x8000) ) { // super bases loaded 60-6f,e0-ef,0-7fff + cart_run(); + return snesdsp_read(!(adr & 0x4000)); + } + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + //bprintf(0, _T("missed.r %x.%x\n"), bank,adr); + + return cart->snes->openBus; +} + +static void cart_writeLoromDSP(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } + + // bprintf(0, _T("missed.w %x.%x %x\n"), bank,adr, val); + + if ( ((bank & 0x70) == 0x30 && adr & 0x8000) || // 30-3f,b0-bf 8000-ffff + ((bank & 0x70) == 0x60 && ~adr & 0x8000) ) { // super bases loaded 60-6f,e0-ef,0-7fff + cart_run(); + snesdsp_write(!(adr & 0x4000), val); + } +} + +static uint8_t cart_readCX4(Cart* cart, uint8_t bank, uint16_t adr) { + // cx4 mapper + if((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000) { + // banks 00-3f and 80-bf, adr 6000-7fff + return cx4_read(adr); + } + // save ram + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + bank &= 0x7f; + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static void cart_writeCX4(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + // cx4 mapper + if((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000) { + // banks 00-3f and 80-bf, adr 6000-7fff + cx4_write(adr, val); + } + // save ram + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } +} + +static uint8_t cart_readHirom(Cart* cart, uint8_t bank, uint16_t adr) { + bank &= 0x7f; + if(bank >= 0x20 && bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + return cart->ram[(((bank & 0x1f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)]; + } + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[(((bank & 0x3f) << 16) | adr) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static void cart_writeHirom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + bank &= 0x7f; + if(bank >= 0x20 && bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + cart->ram[(((bank & 0x1f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)] = val; + } +} + +// HiROM w/DSP +static uint8_t cart_readHiromDSP(Cart* cart, uint8_t bank, uint16_t adr) { + bank &= 0x7f; + + if (bank < 0x20 && adr >= 0x6000 && adr < 0x8000) { + cart_run(); + return snesdsp_read(!(adr & 0x1000)); + } + + if(bank >= 0x20 && bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + return cart->ram[(((bank & 0x1f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)]; + } + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[(((bank & 0x3f) << 16) | adr) & (cart->romSize - 1)]; + } + // bprintf(0, _T("missed.r %x.%x\n"), bank,adr); + return cart->snes->openBus; +} + +static void cart_writeHiromDSP(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + bank &= 0x7f; + if (bank < 0x20 && adr >= 0x6000 && adr < 0x8000) { + cart_run(); + snesdsp_write(!(adr & 0x1000), val); + return; + } + + // bprintf(0, _T("missed.w %x.%x %x\n"), bank,adr, val); + if(bank >= 0x20 && bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + cart->ram[(((bank & 0x1f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)] = val; + } +} + +static uint8_t cart_readExHirom(Cart* cart, uint8_t bank, uint16_t adr) { + if((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + return cart->ram[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)]; + } + bool secondHalf = bank < 0x80; + bank &= 0x7f; + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[(((bank & 0x3f) << 16) | (secondHalf ? 0x400000 : 0) | adr) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static uint8_t cart_readLoromSA1(Cart* cart, uint8_t bank, uint16_t adr) { + return snes_sa1_cart_read(bank << 16 | adr); +} + +static void cart_writeLoromSA1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + snes_sa1_cart_write(bank << 16 | adr, val); +} + +#define obc1_offset (0x1800 | (~cart->ram[0x1ff5] & 0x01) << 10) +#define obc1_offset2 ((cart->ram[0x1ff6] & 0x7f) << 2) + +static uint8_t cart_readLoromOBC1(Cart* cart, uint8_t bank, uint16_t adr) { + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + bank &= 0x7f; + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + + if(bank < 0x40 && adr >= 0x6fff && adr <= 0x7fff) { // 00-3f,80-bf,6fff-7fff + adr &= 0x1fff; + switch (adr) { + case 0x1ff0: + case 0x1ff1: + case 0x1ff2: + case 0x1ff3: + return cart->ram[obc1_offset + obc1_offset2 + (adr & 0x03)]; + case 0x1ff4: + return cart->ram[obc1_offset + (obc1_offset2 >> 4) + 0x200]; + default: + return cart->ram[adr]; + } + } + + return cart->snes->openBus; +} + +static void cart_writeLoromOBC1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && ((cart->romSize >= 0x200000 && adr < 0x8000) || (cart->romSize < 0x200000)) && cart->ramSize > 0) { + // banks 70-7d and f0-ff, adr 0000-7fff & rom >= 2MB || adr 0000-ffff & rom < 2MB + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } + + bank &= 0x7f; + + if(bank < 0x40 && adr >= 0x6fff && adr <= 0x7fff) { // 00-3f,80-bf,6fff-7fff + adr &= 0x1fff; + switch (adr) { + case 0x1ff0: + case 0x1ff1: + case 0x1ff2: + case 0x1ff3: + cart->ram[obc1_offset + obc1_offset2 + (adr & 0x03)] = val; + break; + case 0x1ff4: + cart->ram[obc1_offset + (obc1_offset2 >> 4) + 0x200] = (cart->ram[obc1_offset + (obc1_offset2 >> 4) + 0x200] & ~(3 << ((cart->ram[0x1ff6] & 0x03) << 1))) | ((val & 0x03) << ((cart->ram[0x1ff6] & 0x03) << 1)); + break; + default: + cart->ram[adr] = val; + break; + } + } +} + +static uint8_t cart_readLoromSDD1(Cart* cart, uint8_t bank, uint16_t adr) { + return snes_sdd1_cart_read(bank << 16 | adr); +} + +static void cart_writeLoromSDD1(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + snes_sdd1_cart_write(bank << 16 | adr, val); +} diff --git a/src/burn/drv/snes/cart.h b/src/burn/drv/snes/cart.h new file mode 100644 index 000000000..e78a7c3da --- /dev/null +++ b/src/burn/drv/snes/cart.h @@ -0,0 +1,42 @@ + +#ifndef CART_H +#define CART_H + +#include +#include + +typedef struct Cart Cart; + +#include "snes.h" +#include "statehandler.h" + +//const char* typeNames[12] = {"(none)", "LoROM", "HiROM", "ExLoROM", "ExHiROM", "CX4", "LoROM-DSP", "HiROM-DSP", "LoROM-SeTa", "LoROM-SA1", "LoROM-OBC1", "LoROM-SDD1"}; +enum { CART_NONE = 0, CART_LOROM, CART_HIROM, CART_EXLOROM, CART_EXHIROM, CART_CX4, CART_LOROMDSP, CART_HIROMDSP, CART_LOROMSETA, CART_LOROMSA1, CART_LOROMOBC1, CART_LOROMSDD1 }; + +struct Cart { + Snes* snes; + uint8_t type; + bool hasBattery; + bool heavySync; + uint8_t* rom; + uint32_t romSize; + uint8_t* ram; + uint32_t ramSize; + uint8_t* bios; + uint32_t biosSize; +}; + +// TODO: how to handle reset & load? + +Cart* cart_init(Snes* snes); +void cart_free(Cart* cart); +void cart_reset(Cart* cart); // will reset special chips etc, general reading is set up in load +bool cart_handleTypeState(Cart* cart, StateHandler* sh); +void cart_handleState(Cart* cart, StateHandler* sh); +void cart_load(Cart* cart, int type, uint8_t* rom, int romSize, uint8_t* biosrom, int biosromSize, int ramSize, bool hasBattery); // loads rom, sets up ram buffer +bool cart_handleBattery(Cart* cart, bool save, uint8_t* data, int* size); // saves/loads ram +extern uint8_t (*cart_read)(Cart* cart, uint8_t bank, uint16_t adr); +extern void (*cart_write)(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +extern void (*cart_run)(); // runs special co-processor chips, if avail + +#endif diff --git a/src/burn/drv/snes/cpu.cpp b/src/burn/drv/snes/cpu.cpp new file mode 100644 index 000000000..f6af406da --- /dev/null +++ b/src/burn/drv/snes/cpu.cpp @@ -0,0 +1,4255 @@ + +#include +#include +#include +#include +#include + +#include "cpu.h" +#include "snes.h" +#include "statehandler.h" + +static uint8_t cpu_read(uint32_t adr); +static void cpu_write(uint32_t adr, uint8_t val); +static void cpu_idle(); +static void cpu_idleWait(); +static void cpu_checkInt(); +static uint8_t cpu_readOpcode(); +static uint16_t cpu_readOpcodeWord(bool intCheck); +static uint8_t cpu_getFlags(); +static void cpu_setFlags(uint8_t value); +static void cpu_setZN(uint16_t value, bool byte); +static void cpu_doBranch(bool check); +static uint8_t cpu_pullByte(); +static void cpu_pushByte(uint8_t value); +static uint16_t cpu_pullWord(bool intCheck); +static void cpu_pushWord(uint16_t value, bool intCheck); +static uint16_t cpu_readWord(uint32_t adrl, uint32_t adrh, bool intCheck); +static void cpu_writeWord(uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed, bool intCheck); +static void cpu_doInterrupt(); +static void cpu_doOpcode(uint8_t opcode); + +// reference to memory handler, pointers to read/write/idle handlers +static void* c_mem; +#if 0 +static CpuReadHandler c_read; +static CpuWriteHandler c_write; +static CpuIdleHandler c_idle; +#endif +// registers +static uint16_t a; +static uint16_t x; +static uint16_t y; +static uint16_t sp; +static uint16_t pc; +static uint16_t dp; // direct page (D) +static uint8_t k; // program bank (PB) +static uint8_t db; // data bank (B) +// flags +static bool c; +static bool z; +static bool v; +static bool n; +static bool i; +static bool d; +static bool xf; +static bool mf; +static bool e; +// power state (WAI/STP) +static bool waiting; +static bool stopped; +// interrupts +static bool irqWanted; +static bool nmiWanted; +static bool intWanted; +static bool intDelay; +static bool resetWanted; + +static bool readVector; // no need to state - true when reading vectors + +bool cpu_isVector() { + return readVector; +} + +void cpu_setIntDelay() { + intDelay = true; +} +// addressing modes and opcode functions not declared, only used after defintions + +void cpu_init(void* mem) {//, CpuReadHandler read, CpuWriteHandler write, CpuIdleHandler idle) { + //Cpu* cpu = (Cpu*)BurnMalloc(sizeof(Cpu)); + c_mem = mem; +#if 0 + c_read = read; + c_write = write; + c_idle = idle; +#endif +} + +void cpu_free() { + //BurnFree(); +} + +void cpu_reset(bool hard) { + if(hard) { + a = 0; + x = 0; + y = 0; + sp = 0; + pc = 0; + dp = 0; + k = 0; + db = 0; + c = false; + z = false; + v = false; + n = false; + i = false; + d = false; + xf = false; + mf = false; + e = false; + irqWanted = false; + } + waiting = false; + stopped = false; + nmiWanted = false; + intWanted = false; + intDelay = false; + resetWanted = true; +} + +void cpu_handleState(StateHandler* sh) { + sh_handleBools(sh, + &c, &z, &v, &n, &i, &d, &xf, &mf, &e, &waiting, &stopped, + &irqWanted, &nmiWanted, &intWanted, &intDelay, &resetWanted, NULL + ); + sh_handleBytes(sh, &k, &db, NULL); + sh_handleWords(sh, &a, &x, &y, &sp, &pc, &dp, NULL); +} + +void cpu_runOpcode() { + if(resetWanted) { + resetWanted = false; + // reset: brk/interrupt without writes + cpu_read((k << 16) | pc); + cpu_idle(); + cpu_read(0x100 | (sp-- & 0xff)); + cpu_read(0x100 | (sp-- & 0xff)); + cpu_read(0x100 | (sp-- & 0xff)); + sp = (sp & 0xff) | 0x100; + e = true; + i = true; + d = false; + cpu_setFlags(cpu_getFlags()); // updates x and m flags, clears upper half of x and y if needed + k = 0; + readVector = true; + pc = cpu_readWord(0xfffc, 0xfffd, false); + readVector = false; + return; + } + if(stopped) { + cpu_idleWait(); + return; + } + if(waiting) { + if(irqWanted || nmiWanted) { + waiting = false; + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + return; + } else { + cpu_idleWait(); + return; + } + } + // not stopped or waiting, execute a opcode or go to interrupt + if(intWanted) { + cpu_read((k << 16) | pc); + cpu_doInterrupt(); + } else { + uint8_t opcode = cpu_readOpcode(); + cpu_doOpcode(opcode); + } +} + +void cpu_nmi() { + nmiWanted = true; +} + +void cpu_setIrq(bool state) { + irqWanted = state; +} + +static uint8_t cpu_read(uint32_t adr) { + intDelay = false; + return snes_cpuRead(c_mem, adr); +} + +static void cpu_write(uint32_t adr, uint8_t val) { + intDelay = false; + snes_cpuWrite(c_mem, adr, val); +} + +static void cpu_idle() { + snes_cpuIdle(c_mem, false); + intDelay = false; +} + +static void cpu_idleWait() { + snes_cpuIdle(c_mem, true); + intDelay = false; +} + +static void cpu_checkInt() { + intWanted = (nmiWanted || (irqWanted && !i)) && !intDelay; + intDelay = false; +} + +static uint8_t cpu_readOpcode() { + return cpu_read((k << 16) | pc++); +} + +static uint16_t cpu_readOpcodeWord(bool intCheck) { + uint8_t low = cpu_readOpcode(); + if(intCheck) cpu_checkInt(); + return low | (cpu_readOpcode() << 8); +} + +static uint8_t cpu_getFlags() { + uint8_t val = n << 7; + val |= v << 6; + val |= mf << 5; + val |= xf << 4; + val |= d << 3; + val |= i << 2; + val |= z << 1; + val |= c; + return val; +} + +static void cpu_setFlags(uint8_t val) { + n = val & 0x80; + v = val & 0x40; + mf = val & 0x20; + xf = val & 0x10; + d = val & 8; + i = val & 4; + z = val & 2; + c = val & 1; + if(e) { + mf = true; + xf = true; + sp = (sp & 0xff) | 0x100; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } +} + +static void cpu_setZN(uint16_t value, bool byte) { + if(byte) { + z = (value & 0xff) == 0; + n = value & 0x80; + } else { + z = value == 0; + n = value & 0x8000; + } +} + +static void cpu_doBranch(bool check) { + if(!check) cpu_checkInt(); + uint8_t value = cpu_readOpcode(); + if(check) { + cpu_checkInt(); + cpu_idle(); // taken branch: 1 extra cycle + pc += (int8_t) value; + } +} + +static uint8_t cpu_pullByte() { + sp++; + if(e) sp = (sp & 0xff) | 0x100; + return cpu_read(sp); +} + +static void cpu_pushByte(uint8_t value) { + cpu_write(sp, value); + sp--; + if(e) sp = (sp & 0xff) | 0x100; +} + +static uint16_t cpu_pullWord(bool intCheck) { + uint8_t value = cpu_pullByte(); + if(intCheck) cpu_checkInt(); + return value | (cpu_pullByte() << 8); +} + +static void cpu_pushWord(uint16_t value, bool intCheck) { + cpu_pushByte(value >> 8); + if(intCheck) cpu_checkInt(); + cpu_pushByte(value & 0xff); +} + +static uint16_t cpu_readWord(uint32_t adrl, uint32_t adrh, bool intCheck) { + uint8_t value = cpu_read(adrl); + if(intCheck) cpu_checkInt(); + return value | (cpu_read(adrh) << 8); +} + +static void cpu_writeWord(uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed, bool intCheck) { + if(reversed) { + cpu_write(adrh, value >> 8); + if(intCheck) cpu_checkInt(); + cpu_write(adrl, value & 0xff); + } else { + cpu_write(adrl, value & 0xff); + if(intCheck) cpu_checkInt(); + cpu_write(adrh, value >> 8); + } +} + +static void cpu_doInterrupt() { + cpu_idle(); + cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + intWanted = false; + readVector = true; + if(nmiWanted) { + nmiWanted = false; + pc = cpu_readWord(0xffea, 0xffeb, false); + } else { // irq + pc = cpu_readWord(0xffee, 0xffef, false); + } + readVector = false; +} + +// addressing modes + +static void cpu_adrImp() { + // only for 2-cycle implied opcodes + cpu_checkInt(); + if(intWanted) { + // if interrupt detected in 2-cycle implied/accumulator opcode, + // idle cycle turns into read from pc + cpu_read((k << 16) | pc); + } else { + cpu_idle(); + } +} + +static uint32_t cpu_adrImm(uint32_t* low, bool xFlag) { + if((xFlag && xf) || (!xFlag && mf)) { + *low = (k << 16) | pc++; + return 0; + } else { + *low = (k << 16) | pc++; + return (k << 16) | pc++; + } +} + +static uint32_t cpu_adrDp(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + *low = (dp + adr) & 0xffff; + return (dp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrDpx(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + *low = (dp + adr + x) & 0xffff; + return (dp + adr + x + 1) & 0xffff; +} + +static uint32_t cpu_adrDpy(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + *low = (dp + adr + y) & 0xffff; + return (dp + adr + y + 1) & 0xffff; +} + +static uint32_t cpu_adrIdp(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + *low = (db << 16) + pointer; + return ((db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdx(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + uint16_t pointer = cpu_readWord((dp + adr + x) & 0xffff, (dp + adr + x + 1) & 0xffff, false); + *low = (db << 16) + pointer; + return ((db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdy(uint32_t* low, bool write) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((pointer >> 8) != ((pointer + y) >> 8))) cpu_idle(); + *low = ((db << 16) + pointer + y) & 0xffffff; + return ((db << 16) + pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdl(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + pointer |= cpu_read((dp + adr + 2) & 0xffff) << 16; + *low = pointer; + return (pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIly(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + pointer |= cpu_read((dp + adr + 2) & 0xffff) << 16; + *low = (pointer + y) & 0xffffff; + return (pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrSr(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + cpu_idle(); + *low = (sp + adr) & 0xffff; + return (sp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrIsy(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + cpu_idle(); + uint16_t pointer = cpu_readWord((sp + adr) & 0xffff, (sp + adr + 1) & 0xffff, false); + cpu_idle(); + *low = ((db << 16) + pointer + y) & 0xffffff; + return ((db << 16) + pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbs(uint32_t* low) { + uint16_t adr = cpu_readOpcodeWord(false); + *low = (db << 16) + adr; + return ((db << 16) + adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbx(uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((adr >> 8) != ((adr + x) >> 8))) cpu_idle(); + *low = ((db << 16) + adr + x) & 0xffffff; + return ((db << 16) + adr + x + 1) & 0xffffff; +} + +static uint32_t cpu_adrAby(uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((adr >> 8) != ((adr + y) >> 8))) cpu_idle(); + *low = ((db << 16) + adr + y) & 0xffffff; + return ((db << 16) + adr + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbl(uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(false); + adr |= cpu_readOpcode() << 16; + *low = adr; + return (adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAlx(uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(false); + adr |= cpu_readOpcode() << 16; + *low = (adr + x) & 0xffffff; + return (adr + x + 1) & 0xffffff; +} + +// opcode functions + +static void cpu_and(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a & value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a &= value; + } + cpu_setZN(a, mf); +} + +static void cpu_ora(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a | value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a |= value; + } + cpu_setZN(a, mf); +} + +static void cpu_eor(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a ^ value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a ^= value; + } + cpu_setZN(a, mf); +} + +static void cpu_adc(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (a & 0xf0) + (value & 0xf0) + result; + } else { + result = (a & 0xff) + value + c; + } + v = (a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(d && result > 0x9f) result += 0x60; + c = result > 0xff; + a = (a & 0xff00) | (result & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (a & 0xf0) + (value & 0xf0) + result; + if(result > 0x9f) result = ((result + 0x60) & 0xff) + 0x100; + result = (a & 0xf00) + (value & 0xf00) + result; + if(result > 0x9ff) result = ((result + 0x600) & 0xfff) + 0x1000; + result = (a & 0xf000) + (value & 0xf000) + result; + } else { + result = a + value + c; + } + v = (a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(d && result > 0x9fff) result += 0x6000; + c = result > 0xffff; + a = result; + } + cpu_setZN(a, mf); +} + +static void cpu_sbc(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (a & 0xf0) + (value & 0xf0) + result; + } else { + result = (a & 0xff) + value + c; + } + v = (a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(d && result < 0x100) result -= 0x60; + c = result > 0xff; + a = (a & 0xff00) | (result & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (a & 0xf0) + (value & 0xf0) + result; + if(result < 0x100) result = (result - 0x60) & ((result - 0x60 < 0) ? 0xff : 0x1ff); + result = (a & 0xf00) + (value & 0xf00) + result; + if(result < 0x1000) result = (result - 0x600) & ((result - 0x600 < 0) ? 0xfff : 0x1fff); + result = (a & 0xf000) + (value & 0xf000) + result; + } else { + result = a + value + c; + } + v = (a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(d && result < 0x10000) result -= 0x6000; + c = result > 0xffff; + a = result; + } + cpu_setZN(a, mf); +} + +static void cpu_cmp(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (a & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = a + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, mf); +} + +static void cpu_cpx(uint32_t low, uint32_t high) { + int result = 0; + if(xf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (x & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = x + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, xf); +} + +static void cpu_cpy(uint32_t low, uint32_t high) { + int result = 0; + if(xf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (y & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = y + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, xf); +} + +static void cpu_bit(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + uint8_t result = (a & 0xff) & value; + z = result == 0; + n = value & 0x80; + v = value & 0x40; + } else { + uint16_t value = cpu_readWord(low, high, true); + uint16_t result = a & value; + z = result == 0; + n = value & 0x8000; + v = value & 0x4000; + } +} + +static void cpu_lda(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + a = (a & 0xff00) | cpu_read(low); + } else { + a = cpu_readWord(low, high, true); + } + cpu_setZN(a, mf); +} + +static void cpu_ldx(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + x = cpu_read(low); + } else { + x = cpu_readWord(low, high, true); + } + cpu_setZN(x, xf); +} + +static void cpu_ldy(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + y = cpu_read(low); + } else { + y = cpu_readWord(low, high, true); + } + cpu_setZN(y, xf); +} + +static void cpu_sta(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + cpu_write(low, a); + } else { + cpu_writeWord(low, high, a, false, true); + } +} + +static void cpu_stx(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + cpu_write(low, x); + } else { + cpu_writeWord(low, high, x, false, true); + } +} + +static void cpu_sty(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + cpu_write(low, y); + } else { + cpu_writeWord(low, high, y, false, true); + } +} + +static void cpu_stz(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + cpu_write(low, 0); + } else { + cpu_writeWord(low, high, 0, false, true); + } +} + +static void cpu_ror(uint32_t low, uint32_t high) { + bool carry = false; + int result = 0; + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + carry = value & 1; + result = (value >> 1) | (c << 7); + cpu_checkInt(); + cpu_write(low, result); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + carry = value & 1; + result = (value >> 1) | (c << 15); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); + c = carry; +} + +static void cpu_rol(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = (cpu_read(low) << 1) | c; + cpu_idle(); + c = result & 0x100; + cpu_checkInt(); + cpu_write(low, result); + } else { + result = (cpu_readWord(low, high, false) << 1) | c; + cpu_idle(); + c = result & 0x10000; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_lsr(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + c = value & 1; + result = value >> 1; + cpu_checkInt(); + cpu_write(low, result); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + c = value & 1; + result = value >> 1; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_asl(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) << 1; + cpu_idle(); + c = result & 0x100; + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) << 1; + cpu_idle(); + c = result & 0x10000; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_inc(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) + 1; + cpu_idle(); + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) + 1; + cpu_idle(); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_dec(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) - 1; + cpu_idle(); + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) - 1; + cpu_idle(); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_tsb(uint32_t low, uint32_t high) { + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + z = ((a & 0xff) & value) == 0; + cpu_checkInt(); + cpu_write(low, value | (a & 0xff)); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + z = (a & value) == 0; + cpu_writeWord(low, high, value | a, true, true); + } +} + +static void cpu_trb(uint32_t low, uint32_t high) { + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + z = ((a & 0xff) & value) == 0; + cpu_checkInt(); + cpu_write(low, value & ~(a & 0xff)); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + z = (a & value) == 0; + cpu_writeWord(low, high, value & ~a, true, true); + } +} +#if 0 +static void cpu_doOpcode(uint8_t opcode) { + switch(opcode) { + case 0x00: { // brk imm(s) + uint32_t vector = (e) ? 0xfffe : 0xffe6; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + break; + } + case 0x01: { // ora idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_ora(low, high); + break; + } + case 0x02: { // cop imm(s) + uint32_t vector = (e) ? 0xfff4 : 0xffe4; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + break; + } + case 0x03: { // ora sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_ora(low, high); + break; + } + case 0x04: { // tsb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_tsb(low, high); + break; + } + case 0x05: { // ora dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ora(low, high); + break; + } + case 0x06: { // asl dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_asl(low, high); + break; + } + case 0x07: { // ora idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_ora(low, high); + break; + } + case 0x08: { // php imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(cpu_getFlags()); + break; + } + case 0x09: { // ora imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_ora(low, high); + break; + } + case 0x0a: { // asla imp + cpu_adrImp(); + if(mf) { + c = a & 0x80; + a = (a & 0xff00) | ((a << 1) & 0xff); + } else { + c = a & 0x8000; + a <<= 1; + } + cpu_setZN(a, mf); + break; + } + case 0x0b: { // phd imp + cpu_idle(); + cpu_pushWord(dp, true); + break; + } + case 0x0c: { // tsb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_tsb(low, high); + break; + } + case 0x0d: { // ora abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ora(low, high); + break; + } + case 0x0e: { // asl abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_asl(low, high); + break; + } + case 0x0f: { // ora abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_ora(low, high); + break; + } + case 0x10: { // bpl rel + cpu_doBranch(!n); + break; + } + case 0x11: { // ora idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_ora(low, high); + break; + } + case 0x12: { // ora idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_ora(low, high); + break; + } + case 0x13: { // ora isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_ora(low, high); + break; + } + case 0x14: { // trb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_trb(low, high); + break; + } + case 0x15: { // ora dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ora(low, high); + break; + } + case 0x16: { // asl dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_asl(low, high); + break; + } + case 0x17: { // ora ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_ora(low, high); + break; + } + case 0x18: { // clc imp + cpu_adrImp(); + c = false; + break; + } + case 0x19: { // ora aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ora(low, high); + break; + } + case 0x1a: { // inca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a + 1) & 0xff); + } else { + a++; + } + cpu_setZN(a, mf); + break; + } + case 0x1b: { // tcs imp + cpu_adrImp(); + sp = (e) ? (a & 0xff) | 0x100 : a; + break; + } + case 0x1c: { // trb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_trb(low, high); + break; + } + case 0x1d: { // ora abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ora(low, high); + break; + } + case 0x1e: { // asl abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_asl(low, high); + break; + } + case 0x1f: { // ora alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_ora(low, high); + break; + } + case 0x20: { // jsr abs + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc - 1, true); + pc = value; + break; + } + case 0x21: { // and idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_and(low, high); + break; + } + case 0x22: { // jsl abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_pushByte(k); + cpu_idle(); + uint8_t newK = cpu_readOpcode(); + cpu_pushWord(pc - 1, true); + pc = value; + k = newK; + break; + } + case 0x23: { // and sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_and(low, high); + break; + } + case 0x24: { // bit dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_bit(low, high); + break; + } + case 0x25: { // and dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_and(low, high); + break; + } + case 0x26: { // rol dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_rol(low, high); + break; + } + case 0x27: { // and idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_and(low, high); + break; + } + case 0x28: { // plp imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_pullByte()); + break; + } + case 0x29: { // and imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_and(low, high); + break; + } + case 0x2a: { // rola imp + cpu_adrImp(); + int result = (a << 1) | c; + if(mf) { + c = result & 0x100; + a = (a & 0xff00) | (result & 0xff); + } else { + c = result & 0x10000; + a = result; + } + cpu_setZN(a, mf); + break; + } + case 0x2b: { // pld imp + cpu_idle(); + cpu_idle(); + dp = cpu_pullWord(true); + cpu_setZN(dp, false); + break; + } + case 0x2c: { // bit abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_bit(low, high); + break; + } + case 0x2d: { // and abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_and(low, high); + break; + } + case 0x2e: { // rol abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_rol(low, high); + break; + } + case 0x2f: { // and abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_and(low, high); + break; + } + case 0x30: { // bmi rel + cpu_doBranch(n); + break; + } + case 0x31: { // and idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_and(low, high); + break; + } + case 0x32: { // and idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_and(low, high); + break; + } + case 0x33: { // and isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_and(low, high); + break; + } + case 0x34: { // bit dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_bit(low, high); + break; + } + case 0x35: { // and dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_and(low, high); + break; + } + case 0x36: { // rol dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_rol(low, high); + break; + } + case 0x37: { // and ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_and(low, high); + break; + } + case 0x38: { // sec imp + cpu_adrImp(); + c = true; + break; + } + case 0x39: { // and aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_and(low, high); + break; + } + case 0x3a: { // deca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a - 1) & 0xff); + } else { + a--; + } + cpu_setZN(a, mf); + break; + } + case 0x3b: { // tsc imp + cpu_adrImp(); + a = sp; + cpu_setZN(a, false); + break; + } + case 0x3c: { // bit abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_bit(low, high); + break; + } + case 0x3d: { // and abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_and(low, high); + break; + } + case 0x3e: { // rol abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_rol(low, high); + break; + } + case 0x3f: { // and alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_and(low, high); + break; + } + case 0x40: { // rti imp + cpu_idle(); + cpu_idle(); + cpu_setFlags(cpu_pullByte()); + pc = cpu_pullWord(false); + cpu_checkInt(); + k = cpu_pullByte(); + break; + } + case 0x41: { // eor idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_eor(low, high); + break; + } + case 0x42: { // wdm imm(s) + cpu_checkInt(); + cpu_readOpcode(); + break; + } + case 0x43: { // eor sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_eor(low, high); + break; + } + case 0x44: { // mvp bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x--; + y--; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + break; + } + case 0x45: { // eor dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_eor(low, high); + break; + } + case 0x46: { // lsr dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lsr(low, high); + break; + } + case 0x47: { // eor idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_eor(low, high); + break; + } + case 0x48: { // pha imp + cpu_idle(); + if(mf) { + cpu_checkInt(); + cpu_pushByte(a); + } else { + cpu_pushWord(a, true); + } + break; + } + case 0x49: { // eor imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_eor(low, high); + break; + } + case 0x4a: { // lsra imp + cpu_adrImp(); + c = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f); + } else { + a >>= 1; + } + cpu_setZN(a, mf); + break; + } + case 0x4b: { // phk imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(k); + break; + } + case 0x4c: { // jmp abs + pc = cpu_readOpcodeWord(true); + break; + } + case 0x4d: { // eor abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_eor(low, high); + break; + } + case 0x4e: { // lsr abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lsr(low, high); + break; + } + case 0x4f: { // eor abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_eor(low, high); + break; + } + case 0x50: { // bvc rel + cpu_doBranch(!v); + break; + } + case 0x51: { // eor idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_eor(low, high); + break; + } + case 0x52: { // eor idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_eor(low, high); + break; + } + case 0x53: { // eor isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_eor(low, high); + break; + } + case 0x54: { // mvn bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x++; + y++; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + break; + } + case 0x55: { // eor dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_eor(low, high); + break; + } + case 0x56: { // lsr dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lsr(low, high); + break; + } + case 0x57: { // eor ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_eor(low, high); + break; + } + case 0x58: { // cli imp + cpu_adrImp(); + i = false; + break; + } + case 0x59: { // eor aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_eor(low, high); + break; + } + case 0x5a: { // phy imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(y); + } else { + cpu_pushWord(y, true); + } + break; + } + case 0x5b: { // tcd imp + cpu_adrImp(); + dp = a; + cpu_setZN(dp, false); + break; + } + case 0x5c: { // jml abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_checkInt(); + k = cpu_readOpcode(); + pc = value; + break; + } + case 0x5d: { // eor abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_eor(low, high); + break; + } + case 0x5e: { // lsr abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_lsr(low, high); + break; + } + case 0x5f: { // eor alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_eor(low, high); + break; + } + case 0x60: { // rts imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_idle(); + cpu_checkInt(); + break; + } + case 0x61: { // adc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_adc(low, high); + break; + } + case 0x62: { // per rll + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc + (int16_t) value, true); + break; + } + case 0x63: { // adc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_adc(low, high); + break; + } + case 0x64: { // stz dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stz(low, high); + break; + } + case 0x65: { // adc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_adc(low, high); + break; + } + case 0x66: { // ror dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ror(low, high); + break; + } + case 0x67: { // adc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_adc(low, high); + break; + } + case 0x68: { // pla imp + cpu_idle(); + cpu_idle(); + if(mf) { + cpu_checkInt(); + a = (a & 0xff00) | cpu_pullByte(); + } else { + a = cpu_pullWord(true); + } + cpu_setZN(a, mf); + break; + } + case 0x69: { // adc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_adc(low, high); + break; + } + case 0x6a: { // rora imp + cpu_adrImp(); + bool carry = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f) | (c << 7); + } else { + a = (a >> 1) | (c << 15); + } + c = carry; + cpu_setZN(a, mf); + break; + } + case 0x6b: { // rtl imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_checkInt(); + k = cpu_pullByte(); + break; + } + case 0x6c: { // jmp ind + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, true); + break; + } + case 0x6d: { // adc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_adc(low, high); + break; + } + case 0x6e: { // ror abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ror(low, high); + break; + } + case 0x6f: { // adc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_adc(low, high); + break; + } + case 0x70: { // bvs rel + cpu_doBranch(v); + break; + } + case 0x71: { // adc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_adc(low, high); + break; + } + case 0x72: { // adc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_adc(low, high); + break; + } + case 0x73: { // adc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_adc(low, high); + break; + } + case 0x74: { // stz dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_stz(low, high); + break; + } + case 0x75: { // adc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_adc(low, high); + break; + } + case 0x76: { // ror dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ror(low, high); + break; + } + case 0x77: { // adc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_adc(low, high); + break; + } + case 0x78: { // sei imp + cpu_adrImp(); + i = true; + break; + } + case 0x79: { // adc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_adc(low, high); + break; + } + case 0x7a: { // ply imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + y = cpu_pullByte(); + } else { + y = cpu_pullWord(true); + } + cpu_setZN(y, xf); + break; + } + case 0x7b: { // tdc imp + cpu_adrImp(); + a = dp; + cpu_setZN(a, false); + break; + } + case 0x7c: { // jmp iax + uint16_t adr = cpu_readOpcodeWord(false); + cpu_idle(); + pc = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + break; + } + case 0x7d: { // adc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_adc(low, high); + break; + } + case 0x7e: { // ror abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_ror(low, high); + break; + } + case 0x7f: { // adc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_adc(low, high); + break; + } + case 0x80: { // bra rel + cpu_doBranch(true); + break; + } + case 0x81: { // sta idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sta(low, high); + break; + } + case 0x82: { // brl rll + pc += (int16_t) cpu_readOpcodeWord(false); + cpu_checkInt(); + cpu_idle(); + break; + } + case 0x83: { // sta sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sta(low, high); + break; + } + case 0x84: { // sty dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sty(low, high); + break; + } + case 0x85: { // sta dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sta(low, high); + break; + } + case 0x86: { // stx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stx(low, high); + break; + } + case 0x87: { // sta idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sta(low, high); + break; + } + case 0x88: { // dey imp + cpu_adrImp(); + if(xf) { + y = (y - 1) & 0xff; + } else { + y--; + } + cpu_setZN(y, xf); + break; + } + case 0x89: { // biti imm(m) + if(mf) { + cpu_checkInt(); + uint8_t result = (a & 0xff) & cpu_readOpcode(); + z = result == 0; + } else { + uint16_t result = a & cpu_readOpcodeWord(true); + z = result == 0; + } + break; + } + case 0x8a: { // txa imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (x & 0xff); + } else { + a = x; + } + cpu_setZN(a, mf); + break; + } + case 0x8b: { // phb imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(db); + break; + } + case 0x8c: { // sty abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sty(low, high); + break; + } + case 0x8d: { // sta abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sta(low, high); + break; + } + case 0x8e: { // stx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stx(low, high); + break; + } + case 0x8f: { // sta abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sta(low, high); + break; + } + case 0x90: { // bcc rel + cpu_doBranch(!c); + break; + } + case 0x91: { // sta idy + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, true); + cpu_sta(low, high); + break; + } + case 0x92: { // sta idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sta(low, high); + break; + } + case 0x93: { // sta isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sta(low, high); + break; + } + case 0x94: { // sty dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sty(low, high); + break; + } + case 0x95: { // sta dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sta(low, high); + break; + } + case 0x96: { // stx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_stx(low, high); + break; + } + case 0x97: { // sta ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sta(low, high); + break; + } + case 0x98: { // tya imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (y & 0xff); + } else { + a = y; + } + cpu_setZN(a, mf); + break; + } + case 0x99: { // sta aby + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, true); + cpu_sta(low, high); + break; + } + case 0x9a: { // txs imp + cpu_adrImp(); + sp = (e) ? (x & 0xff) | 0x100 : x; + break; + } + case 0x9b: { // txy imp + cpu_adrImp(); + if(xf) { + y = x & 0xff; + } else { + y = x; + } + cpu_setZN(y, xf); + break; + } + case 0x9c: { // stz abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stz(low, high); + break; + } + case 0x9d: { // sta abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_sta(low, high); + break; + } + case 0x9e: { // stz abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_stz(low, high); + break; + } + case 0x9f: { // sta alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sta(low, high); + break; + } + case 0xa0: { // ldy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldy(low, high); + break; + } + case 0xa1: { // lda idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_lda(low, high); + break; + } + case 0xa2: { // ldx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldx(low, high); + break; + } + case 0xa3: { // lda sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_lda(low, high); + break; + } + case 0xa4: { // ldy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldy(low, high); + break; + } + case 0xa5: { // lda dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lda(low, high); + break; + } + case 0xa6: { // ldx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldx(low, high); + break; + } + case 0xa7: { // lda idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_lda(low, high); + break; + } + case 0xa8: { // tay imp + cpu_adrImp(); + if(xf) { + y = a & 0xff; + } else { + y = a; + } + cpu_setZN(y, xf); + break; + } + case 0xa9: { // lda imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_lda(low, high); + break; + } + case 0xaa: { // tax imp + cpu_adrImp(); + if(xf) { + x = a & 0xff; + } else { + x = a; + } + cpu_setZN(x, xf); + break; + } + case 0xab: { // plb imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + db = cpu_pullByte(); + cpu_setZN(db, true); + break; + } + case 0xac: { // ldy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldy(low, high); + break; + } + case 0xad: { // lda abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lda(low, high); + break; + } + case 0xae: { // ldx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldx(low, high); + break; + } + case 0xaf: { // lda abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_lda(low, high); + break; + } + case 0xb0: { // bcs rel + cpu_doBranch(c); + break; + } + case 0xb1: { // lda idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_lda(low, high); + break; + } + case 0xb2: { // lda idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_lda(low, high); + break; + } + case 0xb3: { // lda isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_lda(low, high); + break; + } + case 0xb4: { // ldy dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ldy(low, high); + break; + } + case 0xb5: { // lda dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lda(low, high); + break; + } + case 0xb6: { // ldx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_ldx(low, high); + break; + } + case 0xb7: { // lda ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_lda(low, high); + break; + } + case 0xb8: { // clv imp + cpu_adrImp(); + v = false; + break; + } + case 0xb9: { // lda aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_lda(low, high); + break; + } + case 0xba: { // tsx imp + cpu_adrImp(); + if(xf) { + x = sp & 0xff; + } else { + x = sp; + } + cpu_setZN(x, xf); + break; + } + case 0xbb: { // tyx imp + cpu_adrImp(); + if(xf) { + x = y & 0xff; + } else { + x = y; + } + cpu_setZN(x, xf); + break; + } + case 0xbc: { // ldy abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ldy(low, high); + break; + } + case 0xbd: { // lda abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_lda(low, high); + break; + } + case 0xbe: { // ldx aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ldx(low, high); + break; + } + case 0xbf: { // lda alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_lda(low, high); + break; + } + case 0xc0: { // cpy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpy(low, high); + break; + } + case 0xc1: { // cmp idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_cmp(low, high); + break; + } + case 0xc2: { // rep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() & ~val); + break; + } + case 0xc3: { // cmp sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_cmp(low, high); + break; + } + case 0xc4: { // cpy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpy(low, high); + break; + } + case 0xc5: { // cmp dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cmp(low, high); + break; + } + case 0xc6: { // dec dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_dec(low, high); + break; + } + case 0xc7: { // cmp idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_cmp(low, high); + break; + } + case 0xc8: { // iny imp + cpu_adrImp(); + if(xf) { + y = (y + 1) & 0xff; + } else { + y++; + } + cpu_setZN(y, xf); + break; + } + case 0xc9: { // cmp imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_cmp(low, high); + break; + } + case 0xca: { // dex imp + cpu_adrImp(); + if(xf) { + x = (x - 1) & 0xff; + } else { + x--; + } + cpu_setZN(x, xf); + break; + } + case 0xcb: { // wai imp + waiting = true; + cpu_idle(); + intDelay = false; + cpu_idle(); + break; + } + case 0xcc: { // cpy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpy(low, high); + break; + } + case 0xcd: { // cmp abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cmp(low, high); + break; + } + case 0xce: { // dec abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_dec(low, high); + break; + } + case 0xcf: { // cmp abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_cmp(low, high); + break; + } + case 0xd0: { // bne rel + cpu_doBranch(!z); + break; + } + case 0xd1: { // cmp idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_cmp(low, high); + break; + } + case 0xd2: { // cmp idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_cmp(low, high); + break; + } + case 0xd3: { // cmp isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_cmp(low, high); + break; + } + case 0xd4: { // pei dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_pushWord(cpu_readWord(low, high, false), true); + break; + } + case 0xd5: { // cmp dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_cmp(low, high); + break; + } + case 0xd6: { // dec dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_dec(low, high); + break; + } + case 0xd7: { // cmp ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_cmp(low, high); + break; + } + case 0xd8: { // cld imp + cpu_adrImp(); + d = false; + break; + } + case 0xd9: { // cmp aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_cmp(low, high); + break; + } + case 0xda: { // phx imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(x); + } else { + cpu_pushWord(x, true); + } + break; + } + case 0xdb: { // stp imp + stopped = true; + cpu_idle(); + cpu_idle(); + break; + } + case 0xdc: { // jml ial + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, false); + cpu_checkInt(); + k = cpu_read((adr + 2) & 0xffff); + break; + } + case 0xdd: { // cmp abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_cmp(low, high); + break; + } + case 0xde: { // dec abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_dec(low, high); + break; + } + case 0xdf: { // cmp alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_cmp(low, high); + break; + } + case 0xe0: { // cpx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpx(low, high); + break; + } + case 0xe1: { // sbc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sbc(low, high); + break; + } + case 0xe2: { // sep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() | val); + break; + } + case 0xe3: { // sbc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sbc(low, high); + break; + } + case 0xe4: { // cpx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpx(low, high); + break; + } + case 0xe5: { // sbc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sbc(low, high); + break; + } + case 0xe6: { // inc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_inc(low, high); + break; + } + case 0xe7: { // sbc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sbc(low, high); + break; + } + case 0xe8: { // inx imp + cpu_adrImp(); + if(xf) { + x = (x + 1) & 0xff; + } else { + x++; + } + cpu_setZN(x, xf); + break; + } + case 0xe9: { // sbc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_sbc(low, high); + break; + } + case 0xea: { // nop imp + cpu_adrImp(); + // no operation + break; + } + case 0xeb: { // xba imp + uint8_t low = a & 0xff; + uint8_t high = a >> 8; + a = (low << 8) | high; + cpu_setZN(high, true); + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + break; + } + case 0xec: { // cpx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpx(low, high); + break; + } + case 0xed: { // sbc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sbc(low, high); + break; + } + case 0xee: { // inc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_inc(low, high); + break; + } + case 0xef: { // sbc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sbc(low, high); + break; + } + case 0xf0: { // beq rel + cpu_doBranch(z); + break; + } + case 0xf1: { // sbc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_sbc(low, high); + break; + } + case 0xf2: { // sbc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sbc(low, high); + break; + } + case 0xf3: { // sbc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sbc(low, high); + break; + } + case 0xf4: { // pea imm(l) + cpu_pushWord(cpu_readOpcodeWord(false), true); + break; + } + case 0xf5: { // sbc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sbc(low, high); + break; + } + case 0xf6: { // inc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_inc(low, high); + break; + } + case 0xf7: { // sbc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sbc(low, high); + break; + } + case 0xf8: { // sed imp + cpu_adrImp(); + d = true; + break; + } + case 0xf9: { // sbc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_sbc(low, high); + break; + } + case 0xfa: { // plx imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + x = cpu_pullByte(); + } else { + x = cpu_pullWord(true); + } + cpu_setZN(x, xf); + break; + } + case 0xfb: { // xce imp + cpu_adrImp(); + bool temp = c; + c = e; + e = temp; + cpu_setFlags(cpu_getFlags()); // updates x and m flags, clears upper half of x and y if needed + break; + } + case 0xfc: { // jsr iax + uint8_t adrl = cpu_readOpcode(); + cpu_pushWord(pc, false); + uint16_t adr = adrl | (cpu_readOpcode() << 8); + cpu_idle(); + uint16_t value = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + pc = value; + break; + } + case 0xfd: { // sbc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_sbc(low, high); + break; + } + case 0xfe: { // inc abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_inc(low, high); + break; + } + case 0xff: { // sbc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sbc(low, high); + break; + } + } +} + +#else + +static void case_0x00() { // brk imm(s) + uint32_t vector = (e) ? 0xfffe : 0xffe6; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + } +static void case_0x01() { // ora idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_ora(low, high); + + } +static void case_0x02() { // cop imm(s) + uint32_t vector = (e) ? 0xfff4 : 0xffe4; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + + } +static void case_0x03() { // ora sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_ora(low, high); + + } +static void case_0x04() { // tsb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_tsb(low, high); + + } +static void case_0x05() { // ora dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ora(low, high); + + } +static void case_0x06() { // asl dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_asl(low, high); + + } +static void case_0x07() { // ora idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_ora(low, high); + + } +static void case_0x08() { // php imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(cpu_getFlags()); + + } +static void case_0x09() { // ora imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_ora(low, high); + + } +static void case_0x0a() { // asla imp + cpu_adrImp(); + if(mf) { + c = a & 0x80; + a = (a & 0xff00) | ((a << 1) & 0xff); + } else { + c = a & 0x8000; + a <<= 1; + } + cpu_setZN(a, mf); + + } +static void case_0x0b() { // phd imp + cpu_idle(); + cpu_pushWord(dp, true); + + } +static void case_0x0c() { // tsb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_tsb(low, high); + + } +static void case_0x0d() { // ora abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ora(low, high); + + } +static void case_0x0e() { // asl abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_asl(low, high); + + } +static void case_0x0f() { // ora abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_ora(low, high); + + } +static void case_0x10() { // bpl rel + cpu_doBranch(!n); + + } +static void case_0x11() { // ora idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_ora(low, high); + + } +static void case_0x12() { // ora idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_ora(low, high); + + } +static void case_0x13() { // ora isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_ora(low, high); + + } +static void case_0x14() { // trb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_trb(low, high); + + } +static void case_0x15() { // ora dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ora(low, high); + + } +static void case_0x16() { // asl dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_asl(low, high); + + } +static void case_0x17() { // ora ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_ora(low, high); + + } +static void case_0x18() { // clc imp + cpu_adrImp(); + c = false; + + } +static void case_0x19() { // ora aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ora(low, high); + + } +static void case_0x1a() { // inca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a + 1) & 0xff); + } else { + a++; + } + cpu_setZN(a, mf); + + } +static void case_0x1b() { // tcs imp + cpu_adrImp(); + sp = (e) ? (a & 0xff) | 0x100 : a; + + } +static void case_0x1c() { // trb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_trb(low, high); + + } +static void case_0x1d() { // ora abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ora(low, high); + + } +static void case_0x1e() { // asl abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_asl(low, high); + + } +static void case_0x1f() { // ora alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_ora(low, high); + + } +static void case_0x20() { // jsr abs + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc - 1, true); + pc = value; + + } +static void case_0x21() { // and idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_and(low, high); + + } +static void case_0x22() { // jsl abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_pushByte(k); + cpu_idle(); + uint8_t newK = cpu_readOpcode(); + cpu_pushWord(pc - 1, true); + pc = value; + k = newK; + + } +static void case_0x23() { // and sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_and(low, high); + + } +static void case_0x24() { // bit dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_bit(low, high); + + } +static void case_0x25() { // and dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_and(low, high); + + } +static void case_0x26() { // rol dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_rol(low, high); + + } +static void case_0x27() { // and idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_and(low, high); + + } +static void case_0x28() { // plp imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_pullByte()); + + } +static void case_0x29() { // and imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_and(low, high); + + } +static void case_0x2a() { // rola imp + cpu_adrImp(); + int result = (a << 1) | c; + if(mf) { + c = result & 0x100; + a = (a & 0xff00) | (result & 0xff); + } else { + c = result & 0x10000; + a = result; + } + cpu_setZN(a, mf); + + } +static void case_0x2b() { // pld imp + cpu_idle(); + cpu_idle(); + dp = cpu_pullWord(true); + cpu_setZN(dp, false); + + } +static void case_0x2c() { // bit abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_bit(low, high); + + } +static void case_0x2d() { // and abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_and(low, high); + + } +static void case_0x2e() { // rol abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_rol(low, high); + + } +static void case_0x2f() { // and abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_and(low, high); + + } +static void case_0x30() { // bmi rel + cpu_doBranch(n); + + } +static void case_0x31() { // and idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_and(low, high); + + } +static void case_0x32() { // and idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_and(low, high); + + } +static void case_0x33() { // and isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_and(low, high); + + } +static void case_0x34() { // bit dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_bit(low, high); + + } +static void case_0x35() { // and dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_and(low, high); + + } +static void case_0x36() { // rol dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_rol(low, high); + + } +static void case_0x37() { // and ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_and(low, high); + + } +static void case_0x38() { // sec imp + cpu_adrImp(); + c = true; + + } +static void case_0x39() { // and aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_and(low, high); + + } +static void case_0x3a() { // deca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a - 1) & 0xff); + } else { + a--; + } + cpu_setZN(a, mf); + + } +static void case_0x3b() { // tsc imp + cpu_adrImp(); + a = sp; + cpu_setZN(a, false); + + } +static void case_0x3c() { // bit abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_bit(low, high); + + } +static void case_0x3d() { // and abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_and(low, high); + + } +static void case_0x3e() { // rol abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_rol(low, high); + + } +static void case_0x3f() { // and alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_and(low, high); + + } +static void case_0x40() { // rti imp + cpu_idle(); + cpu_idle(); + cpu_setFlags(cpu_pullByte()); + pc = cpu_pullWord(false); + cpu_checkInt(); + k = cpu_pullByte(); + + } +static void case_0x41() { // eor idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_eor(low, high); + + } +static void case_0x42() { // wdm imm(s) + cpu_checkInt(); + cpu_readOpcode(); + + } +static void case_0x43() { // eor sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_eor(low, high); + + } +static void case_0x44() { // mvp bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x--; + y--; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x45() { // eor dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_eor(low, high); + + } +static void case_0x46() { // lsr dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lsr(low, high); + + } +static void case_0x47() { // eor idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_eor(low, high); + + } +static void case_0x48() { // pha imp + cpu_idle(); + if(mf) { + cpu_checkInt(); + cpu_pushByte(a); + } else { + cpu_pushWord(a, true); + } + + } +static void case_0x49() { // eor imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_eor(low, high); + + } +static void case_0x4a() { // lsra imp + cpu_adrImp(); + c = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f); + } else { + a >>= 1; + } + cpu_setZN(a, mf); + + } +static void case_0x4b() { // phk imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(k); + + } +static void case_0x4c() { // jmp abs + pc = cpu_readOpcodeWord(true); + + } +static void case_0x4d() { // eor abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_eor(low, high); + + } +static void case_0x4e() { // lsr abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lsr(low, high); + + } +static void case_0x4f() { // eor abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_eor(low, high); + + } +static void case_0x50() { // bvc rel + cpu_doBranch(!v); + + } +static void case_0x51() { // eor idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_eor(low, high); + + } +static void case_0x52() { // eor idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_eor(low, high); + + } +static void case_0x53() { // eor isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_eor(low, high); + + } +static void case_0x54() { // mvn bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x++; + y++; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x55() { // eor dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_eor(low, high); + + } +static void case_0x56() { // lsr dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lsr(low, high); + + } +static void case_0x57() { // eor ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_eor(low, high); + + } +static void case_0x58() { // cli imp + cpu_adrImp(); + i = false; + + } +static void case_0x59() { // eor aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_eor(low, high); + + } +static void case_0x5a() { // phy imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(y); + } else { + cpu_pushWord(y, true); + } + + } +static void case_0x5b() { // tcd imp + cpu_adrImp(); + dp = a; + cpu_setZN(dp, false); + + } +static void case_0x5c() { // jml abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_checkInt(); + k = cpu_readOpcode(); + pc = value; + + } +static void case_0x5d() { // eor abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_eor(low, high); + + } +static void case_0x5e() { // lsr abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_lsr(low, high); + + } +static void case_0x5f() { // eor alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_eor(low, high); + + } +static void case_0x60() { // rts imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x61() { // adc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_adc(low, high); + + } +static void case_0x62() { // per rll + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc + (int16_t) value, true); + + } +static void case_0x63() { // adc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_adc(low, high); + + } +static void case_0x64() { // stz dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stz(low, high); + + } +static void case_0x65() { // adc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_adc(low, high); + + } +static void case_0x66() { // ror dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ror(low, high); + + } +static void case_0x67() { // adc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_adc(low, high); + + } +static void case_0x68() { // pla imp + cpu_idle(); + cpu_idle(); + if(mf) { + cpu_checkInt(); + a = (a & 0xff00) | cpu_pullByte(); + } else { + a = cpu_pullWord(true); + } + cpu_setZN(a, mf); + + } +static void case_0x69() { // adc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_adc(low, high); + + } +static void case_0x6a() { // rora imp + cpu_adrImp(); + bool carry = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f) | (c << 7); + } else { + a = (a >> 1) | (c << 15); + } + c = carry; + cpu_setZN(a, mf); + + } +static void case_0x6b() { // rtl imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_checkInt(); + k = cpu_pullByte(); + + } +static void case_0x6c() { // jmp ind + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, true); + + } +static void case_0x6d() { // adc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_adc(low, high); + + } +static void case_0x6e() { // ror abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ror(low, high); + + } +static void case_0x6f() { // adc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_adc(low, high); + + } +static void case_0x70() { // bvs rel + cpu_doBranch(v); + + } +static void case_0x71() { // adc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_adc(low, high); + + } +static void case_0x72() { // adc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_adc(low, high); + + } +static void case_0x73() { // adc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_adc(low, high); + + } +static void case_0x74() { // stz dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_stz(low, high); + + } +static void case_0x75() { // adc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_adc(low, high); + + } +static void case_0x76() { // ror dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ror(low, high); + + } +static void case_0x77() { // adc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_adc(low, high); + + } +static void case_0x78() { // sei imp + cpu_adrImp(); + i = true; + + } +static void case_0x79() { // adc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_adc(low, high); + + } +static void case_0x7a() { // ply imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + y = cpu_pullByte(); + } else { + y = cpu_pullWord(true); + } + cpu_setZN(y, xf); + + } +static void case_0x7b() { // tdc imp + cpu_adrImp(); + a = dp; + cpu_setZN(a, false); + + } +static void case_0x7c() { // jmp iax + uint16_t adr = cpu_readOpcodeWord(false); + cpu_idle(); + pc = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + + } +static void case_0x7d() { // adc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_adc(low, high); + + } +static void case_0x7e() { // ror abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_ror(low, high); + + } +static void case_0x7f() { // adc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_adc(low, high); + + } +static void case_0x80() { // bra rel + cpu_doBranch(true); + + } +static void case_0x81() { // sta idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sta(low, high); + + } +static void case_0x82() { // brl rll + pc += (int16_t) cpu_readOpcodeWord(false); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x83() { // sta sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sta(low, high); + + } +static void case_0x84() { // sty dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sty(low, high); + + } +static void case_0x85() { // sta dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sta(low, high); + + } +static void case_0x86() { // stx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stx(low, high); + + } +static void case_0x87() { // sta idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sta(low, high); + + } +static void case_0x88() { // dey imp + cpu_adrImp(); + if(xf) { + y = (y - 1) & 0xff; + } else { + y--; + } + cpu_setZN(y, xf); + + } +static void case_0x89() { // biti imm(m) + if(mf) { + cpu_checkInt(); + uint8_t result = (a & 0xff) & cpu_readOpcode(); + z = result == 0; + } else { + uint16_t result = a & cpu_readOpcodeWord(true); + z = result == 0; + } + + } +static void case_0x8a() { // txa imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (x & 0xff); + } else { + a = x; + } + cpu_setZN(a, mf); + + } +static void case_0x8b() { // phb imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(db); + + } +static void case_0x8c() { // sty abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sty(low, high); + + } +static void case_0x8d() { // sta abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sta(low, high); + + } +static void case_0x8e() { // stx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stx(low, high); + + } +static void case_0x8f() { // sta abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sta(low, high); + + } +static void case_0x90() { // bcc rel + cpu_doBranch(!c); + + } +static void case_0x91() { // sta idy + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, true); + cpu_sta(low, high); + + } +static void case_0x92() { // sta idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sta(low, high); + + } +static void case_0x93() { // sta isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sta(low, high); + + } +static void case_0x94() { // sty dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sty(low, high); + + } +static void case_0x95() { // sta dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sta(low, high); + + } +static void case_0x96() { // stx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_stx(low, high); + + } +static void case_0x97() { // sta ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sta(low, high); + + } +static void case_0x98() { // tya imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (y & 0xff); + } else { + a = y; + } + cpu_setZN(a, mf); + + } +static void case_0x99() { // sta aby + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, true); + cpu_sta(low, high); + + } +static void case_0x9a() { // txs imp + cpu_adrImp(); + sp = (e) ? (x & 0xff) | 0x100 : x; + + } +static void case_0x9b() { // txy imp + cpu_adrImp(); + if(xf) { + y = x & 0xff; + } else { + y = x; + } + cpu_setZN(y, xf); + + } +static void case_0x9c() { // stz abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stz(low, high); + + } +static void case_0x9d() { // sta abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_sta(low, high); + + } +static void case_0x9e() { // stz abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_stz(low, high); + + } +static void case_0x9f() { // sta alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sta(low, high); + + } +static void case_0xa0() { // ldy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldy(low, high); + + } +static void case_0xa1() { // lda idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_lda(low, high); + + } +static void case_0xa2() { // ldx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldx(low, high); + + } +static void case_0xa3() { // lda sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_lda(low, high); + + } +static void case_0xa4() { // ldy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldy(low, high); + + } +static void case_0xa5() { // lda dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lda(low, high); + + } +static void case_0xa6() { // ldx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldx(low, high); + + } +static void case_0xa7() { // lda idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_lda(low, high); + + } +static void case_0xa8() { // tay imp + cpu_adrImp(); + if(xf) { + y = a & 0xff; + } else { + y = a; + } + cpu_setZN(y, xf); + + } +static void case_0xa9() { // lda imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_lda(low, high); + + } +static void case_0xaa() { // tax imp + cpu_adrImp(); + if(xf) { + x = a & 0xff; + } else { + x = a; + } + cpu_setZN(x, xf); + + } +static void case_0xab() { // plb imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + db = cpu_pullByte(); + cpu_setZN(db, true); + + } +static void case_0xac() { // ldy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldy(low, high); + + } +static void case_0xad() { // lda abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lda(low, high); + + } +static void case_0xae() { // ldx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldx(low, high); + + } +static void case_0xaf() { // lda abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_lda(low, high); + + } +static void case_0xb0() { // bcs rel + cpu_doBranch(c); + + } +static void case_0xb1() { // lda idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_lda(low, high); + + } +static void case_0xb2() { // lda idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_lda(low, high); + + } +static void case_0xb3() { // lda isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_lda(low, high); + + } +static void case_0xb4() { // ldy dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ldy(low, high); + + } +static void case_0xb5() { // lda dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lda(low, high); + + } +static void case_0xb6() { // ldx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_ldx(low, high); + + } +static void case_0xb7() { // lda ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_lda(low, high); + + } +static void case_0xb8() { // clv imp + cpu_adrImp(); + v = false; + + } +static void case_0xb9() { // lda aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_lda(low, high); + + } +static void case_0xba() { // tsx imp + cpu_adrImp(); + if(xf) { + x = sp & 0xff; + } else { + x = sp; + } + cpu_setZN(x, xf); + + } +static void case_0xbb() { // tyx imp + cpu_adrImp(); + if(xf) { + x = y & 0xff; + } else { + x = y; + } + cpu_setZN(x, xf); + + } +static void case_0xbc() { // ldy abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ldy(low, high); + + } +static void case_0xbd() { // lda abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_lda(low, high); + + } +static void case_0xbe() { // ldx aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ldx(low, high); + + } +static void case_0xbf() { // lda alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_lda(low, high); + + } +static void case_0xc0() { // cpy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpy(low, high); + + } +static void case_0xc1() { // cmp idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_cmp(low, high); + + } +static void case_0xc2() { // rep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() & ~val); + cpu_idle(); + + } +static void case_0xc3() { // cmp sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_cmp(low, high); + + } +static void case_0xc4() { // cpy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpy(low, high); + + } +static void case_0xc5() { // cmp dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cmp(low, high); + + } +static void case_0xc6() { // dec dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_dec(low, high); + + } +static void case_0xc7() { // cmp idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_cmp(low, high); + + } +static void case_0xc8() { // iny imp + cpu_adrImp(); + if(xf) { + y = (y + 1) & 0xff; + } else { + y++; + } + cpu_setZN(y, xf); + + } +static void case_0xc9() { // cmp imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_cmp(low, high); + + } +static void case_0xca() { // dex imp + cpu_adrImp(); + if(xf) { + x = (x - 1) & 0xff; + } else { + x--; + } + cpu_setZN(x, xf); + + } +static void case_0xcb() { // wai imp + waiting = true; + cpu_idle(); + intDelay = false; + cpu_idle(); + + } +static void case_0xcc() { // cpy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpy(low, high); + + } +static void case_0xcd() { // cmp abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cmp(low, high); + + } +static void case_0xce() { // dec abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_dec(low, high); + + } +static void case_0xcf() { // cmp abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_cmp(low, high); + + } +static void case_0xd0() { // bne rel + cpu_doBranch(!z); + + } +static void case_0xd1() { // cmp idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_cmp(low, high); + + } +static void case_0xd2() { // cmp idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_cmp(low, high); + + } +static void case_0xd3() { // cmp isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_cmp(low, high); + + } +static void case_0xd4() { // pei dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_pushWord(cpu_readWord(low, high, false), true); + + } +static void case_0xd5() { // cmp dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_cmp(low, high); + + } +static void case_0xd6() { // dec dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_dec(low, high); + + } +static void case_0xd7() { // cmp ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_cmp(low, high); + + } +static void case_0xd8() { // cld imp + cpu_adrImp(); + d = false; + + } +static void case_0xd9() { // cmp aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_cmp(low, high); + + } +static void case_0xda() { // phx imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(x); + } else { + cpu_pushWord(x, true); + } + + } +static void case_0xdb() { // stp imp + stopped = true; + cpu_idle(); + cpu_idle(); + + } +static void case_0xdc() { // jml ial + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, false); + cpu_checkInt(); + k = cpu_read((adr + 2) & 0xffff); + + } +static void case_0xdd() { // cmp abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_cmp(low, high); + + } +static void case_0xde() { // dec abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_dec(low, high); + + } +static void case_0xdf() { // cmp alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_cmp(low, high); + + } +static void case_0xe0() { // cpx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpx(low, high); + + } +static void case_0xe1() { // sbc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sbc(low, high); + + } +static void case_0xe2() { // sep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() | val); + + } +static void case_0xe3() { // sbc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sbc(low, high); + + } +static void case_0xe4() { // cpx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpx(low, high); + + } +static void case_0xe5() { // sbc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sbc(low, high); + + } +static void case_0xe6() { // inc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_inc(low, high); + + } +static void case_0xe7() { // sbc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sbc(low, high); + + } +static void case_0xe8() { // inx imp + cpu_adrImp(); + if(xf) { + x = (x + 1) & 0xff; + } else { + x++; + } + cpu_setZN(x, xf); + + } +static void case_0xe9() { // sbc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_sbc(low, high); + + } +static void case_0xea() { // nop imp + cpu_adrImp(); + // no operation + + } +static void case_0xeb() { // xba imp + uint8_t low = a & 0xff; + uint8_t high = a >> 8; + a = (low << 8) | high; + cpu_setZN(high, true); + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0xec() { // cpx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpx(low, high); + + } +static void case_0xed() { // sbc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sbc(low, high); + + } +static void case_0xee() { // inc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_inc(low, high); + + } +static void case_0xef() { // sbc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sbc(low, high); + + } +static void case_0xf0() { // beq rel + cpu_doBranch(z); + + } +static void case_0xf1() { // sbc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_sbc(low, high); + + } +static void case_0xf2() { // sbc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sbc(low, high); + + } +static void case_0xf3() { // sbc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sbc(low, high); + + } +static void case_0xf4() { // pea imm(l) + cpu_pushWord(cpu_readOpcodeWord(false), true); + + } +static void case_0xf5() { // sbc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sbc(low, high); + + } +static void case_0xf6() { // inc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_inc(low, high); + + } +static void case_0xf7() { // sbc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sbc(low, high); + + } +static void case_0xf8() { // sed imp + cpu_adrImp(); + d = true; + + } +static void case_0xf9() { // sbc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_sbc(low, high); + + } +static void case_0xfa() { // plx imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + x = cpu_pullByte(); + } else { + x = cpu_pullWord(true); + } + cpu_setZN(x, xf); + + } +static void case_0xfb() { // xce imp + cpu_adrImp(); + bool temp = c; + c = e; + e = temp; + cpu_setFlags(cpu_getFlags()); // updates x and m flags, clears upper half of x and y if needed + + } +static void case_0xfc() { // jsr iax + uint8_t adrl = cpu_readOpcode(); + cpu_pushWord(pc, false); + uint16_t adr = adrl | (cpu_readOpcode() << 8); + cpu_idle(); + uint16_t value = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + pc = value; + + } +static void case_0xfd() { // sbc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_sbc(low, high); + + } +static void case_0xfe() { // inc abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_inc(low, high); + + } +static void case_0xff() { // sbc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sbc(low, high); + + } +static void (*const mOpcodes[0x100])() = { +case_0x00, case_0x01, case_0x02, case_0x03, case_0x04, case_0x05, case_0x06, case_0x07, case_0x08, case_0x09, case_0x0a, case_0x0b, case_0x0c, case_0x0d, case_0x0e, case_0x0f, +case_0x10, case_0x11, case_0x12, case_0x13, case_0x14, case_0x15, case_0x16, case_0x17, case_0x18, case_0x19, case_0x1a, case_0x1b, case_0x1c, case_0x1d, case_0x1e, case_0x1f, +case_0x20, case_0x21, case_0x22, case_0x23, case_0x24, case_0x25, case_0x26, case_0x27, case_0x28, case_0x29, case_0x2a, case_0x2b, case_0x2c, case_0x2d, case_0x2e, case_0x2f, +case_0x30, case_0x31, case_0x32, case_0x33, case_0x34, case_0x35, case_0x36, case_0x37, case_0x38, case_0x39, case_0x3a, case_0x3b, case_0x3c, case_0x3d, case_0x3e, case_0x3f, +case_0x40, case_0x41, case_0x42, case_0x43, case_0x44, case_0x45, case_0x46, case_0x47, case_0x48, case_0x49, case_0x4a, case_0x4b, case_0x4c, case_0x4d, case_0x4e, case_0x4f, +case_0x50, case_0x51, case_0x52, case_0x53, case_0x54, case_0x55, case_0x56, case_0x57, case_0x58, case_0x59, case_0x5a, case_0x5b, case_0x5c, case_0x5d, case_0x5e, case_0x5f, +case_0x60, case_0x61, case_0x62, case_0x63, case_0x64, case_0x65, case_0x66, case_0x67, case_0x68, case_0x69, case_0x6a, case_0x6b, case_0x6c, case_0x6d, case_0x6e, case_0x6f, +case_0x70, case_0x71, case_0x72, case_0x73, case_0x74, case_0x75, case_0x76, case_0x77, case_0x78, case_0x79, case_0x7a, case_0x7b, case_0x7c, case_0x7d, case_0x7e, case_0x7f, +case_0x80, case_0x81, case_0x82, case_0x83, case_0x84, case_0x85, case_0x86, case_0x87, case_0x88, case_0x89, case_0x8a, case_0x8b, case_0x8c, case_0x8d, case_0x8e, case_0x8f, +case_0x90, case_0x91, case_0x92, case_0x93, case_0x94, case_0x95, case_0x96, case_0x97, case_0x98, case_0x99, case_0x9a, case_0x9b, case_0x9c, case_0x9d, case_0x9e, case_0x9f, +case_0xa0, case_0xa1, case_0xa2, case_0xa3, case_0xa4, case_0xa5, case_0xa6, case_0xa7, case_0xa8, case_0xa9, case_0xaa, case_0xab, case_0xac, case_0xad, case_0xae, case_0xaf, +case_0xb0, case_0xb1, case_0xb2, case_0xb3, case_0xb4, case_0xb5, case_0xb6, case_0xb7, case_0xb8, case_0xb9, case_0xba, case_0xbb, case_0xbc, case_0xbd, case_0xbe, case_0xbf, +case_0xc0, case_0xc1, case_0xc2, case_0xc3, case_0xc4, case_0xc5, case_0xc6, case_0xc7, case_0xc8, case_0xc9, case_0xca, case_0xcb, case_0xcc, case_0xcd, case_0xce, case_0xcf, +case_0xd0, case_0xd1, case_0xd2, case_0xd3, case_0xd4, case_0xd5, case_0xd6, case_0xd7, case_0xd8, case_0xd9, case_0xda, case_0xdb, case_0xdc, case_0xdd, case_0xde, case_0xdf, +case_0xe0, case_0xe1, case_0xe2, case_0xe3, case_0xe4, case_0xe5, case_0xe6, case_0xe7, case_0xe8, case_0xe9, case_0xea, case_0xeb, case_0xec, case_0xed, case_0xee, case_0xef, +case_0xf0, case_0xf1, case_0xf2, case_0xf3, case_0xf4, case_0xf5, case_0xf6, case_0xf7, case_0xf8, case_0xf9, case_0xfa, case_0xfb, case_0xfc, case_0xfd, case_0xfe, case_0xff +}; + +static void cpu_doOpcode(uint8_t opcode) { + + (*mOpcodes[opcode])(); + +} +#endif diff --git a/src/burn/drv/snes/cpu.h b/src/burn/drv/snes/cpu.h new file mode 100644 index 000000000..664d5d095 --- /dev/null +++ b/src/burn/drv/snes/cpu.h @@ -0,0 +1,32 @@ + +#ifndef CPU_H +#define CPU_H + +#include +#include + +#include "statehandler.h" + +#if 0 +typedef uint8_t (*CpuReadHandler)(void* mem, uint32_t adr); +typedef void (*CpuWriteHandler)(void* mem, uint32_t adr, uint8_t val); +typedef void (*CpuIdleHandler)(void* mem, bool waiting); +#endif + +typedef struct Cpu Cpu; + +struct Cpu { +}; + +void cpu_init(void* mem); +void cpu_free(); +void cpu_reset(bool hard); +void cpu_handleState(StateHandler* sh); +void cpu_runOpcode(); +void cpu_nmi(); +void cpu_setIrq(bool state); +void cpu_setIntDelay(); +bool cpu_isVector(); +uint32_t cpu_getPC(); + +#endif diff --git a/src/burn/drv/snes/cpu_sa1.cpp b/src/burn/drv/snes/cpu_sa1.cpp new file mode 100644 index 000000000..04d272f41 --- /dev/null +++ b/src/burn/drv/snes/cpu_sa1.cpp @@ -0,0 +1,2598 @@ + +#include +#include +#include +#include +#include + +#include "cpu_sa1.h" +#include "sa1.h" +#include "statehandler.h" + +static uint8_t cpu_read(uint32_t adr); +static void cpu_write(uint32_t adr, uint8_t val); +static void cpu_idle(); +static void cpu_idleWait(); +static void cpu_checkInt(); +static uint8_t cpu_readOpcode(); +static uint16_t cpu_readOpcodeWord(bool intCheck); +static uint8_t cpu_getFlags(); +static void cpu_setFlags(uint8_t value); +static void cpu_setZN(uint16_t value, bool byte); +static void cpu_doBranch(bool check); +static uint8_t cpu_pullByte(); +static void cpu_pushByte(uint8_t value); +static uint16_t cpu_pullWord(bool intCheck); +static void cpu_pushWord(uint16_t value, bool intCheck); +static uint16_t cpu_readWord(uint32_t adrl, uint32_t adrh, bool intCheck); +static void cpu_writeWord(uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed, bool intCheck); +static void cpu_doInterrupt(); +static void cpu_doOpcode(uint8_t opcode); + +#if 0 +// reference to memory handler, pointers to read/write/idle handlers +static void* c_mem; +static CpuReadHandler c_read; +static CpuWriteHandler c_write; +static CpuIdleHandler c_idle; +#endif +// registers +static uint16_t a; +static uint16_t x; +static uint16_t y; +static uint16_t sp; +static uint16_t pc; +static uint16_t dp; // direct page (D) +static uint8_t k; // program bank (PB) +static uint8_t db; // data bank (B) +// flags +static bool c; +static bool z; +static bool v; +static bool n; +static bool i; +static bool d; +static bool xf; +static bool mf; +static bool e; +// power state (WAI/STP) +static bool waiting; +static bool stopped; +// interrupts +static bool irqWanted; +static bool nmiWanted; +static bool intWanted; +static bool intDelay; +static bool resetWanted; + +static bool readVector; // no need to state - true when reading vectors + +bool cpusa1_isVector() { + return readVector; +} + +void cpusa1_setHalt(bool haltValue) { + stopped = haltValue; +} + +void cpusa1_setIntDelay() { + intDelay = true; +} +// addressing modes and opcode functions not declared, only used after defintions + +void cpusa1_init() { +#if 0 + //Cpu* cpu = (Cpu*)BurnMalloc(sizeof(Cpu)); + c_mem = mem; + c_read = read; + c_write = write; + c_idle = idle; +#endif +} + +void cpusa1_free() { + //BurnFree(); +} + +void cpusa1_reset(bool hard) { + if(hard) { + a = 0; + x = 0; + y = 0; + sp = 0; + pc = 0; + dp = 0; + k = 0; + db = 0; + c = false; + z = false; + v = false; + n = false; + i = false; + d = false; + xf = false; + mf = false; + e = false; + irqWanted = false; + } + waiting = false; + stopped = false; + nmiWanted = false; + intWanted = false; + intDelay = false; + resetWanted = true; +} + +uint32_t cpusa1_getPC() { + return (k << 16) | pc; +} + +void cpusa1_handleState(StateHandler* sh) { + sh_handleBools(sh, + &c, &z, &v, &n, &i, &d, &xf, &mf, &e, &waiting, &stopped, + &irqWanted, &nmiWanted, &intWanted, &intDelay, &resetWanted, NULL + ); + sh_handleBytes(sh, &k, &db, NULL); + sh_handleWords(sh, &a, &x, &y, &sp, &pc, &dp, NULL); +} + +void cpusa1_runOpcode() { + if(resetWanted) { + resetWanted = false; + // reset: brk/interrupt without writes + cpu_read((k << 16) | pc); + cpu_idle(); + cpu_read(0x100 | (sp-- & 0xff)); + cpu_read(0x100 | (sp-- & 0xff)); + cpu_read(0x100 | (sp-- & 0xff)); + sp = (sp & 0xff) | 0x100; + e = true; + i = true; + d = false; + cpu_setFlags(cpu_getFlags()); // updates x and m flags, clears upper half of x and y if needed + k = 0; + readVector = true; + pc = cpu_readWord(0xfffc, 0xfffd, false); + readVector = false; + return; + } + if(stopped) { + cpu_idleWait(); + return; + } + if(waiting) { + if(irqWanted || nmiWanted) { + waiting = false; + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + return; + } else { + cpu_idleWait(); + return; + } + } + // not stopped or waiting, execute a opcode or go to interrupt + if(intWanted) { + cpu_read((k << 16) | pc); + cpu_doInterrupt(); + } else { + uint8_t opcode = cpu_readOpcode(); + cpu_doOpcode(opcode); + } +} + +void cpusa1_nmi() { + nmiWanted = true; +} + +void cpusa1_setIrq(bool state) { + irqWanted = state; +} + +static uint8_t cpu_read(uint32_t adr) { + intDelay = false; + return sa1_cpuRead(adr); +} + +static void cpu_write(uint32_t adr, uint8_t val) { + intDelay = false; + sa1_cpuWrite(adr, val); +} + +static void cpu_idle() { + sa1_cpuIdle(); + intDelay = false; +} + +static void cpu_idleWait() { + sa1_cpuIdle(); + intDelay = false; +} + +static void cpu_checkInt() { + intWanted = (nmiWanted || (irqWanted && !i)) && !intDelay; + intDelay = false; +} + +static inline void idle_jump() { + if (sa1_isrom_address((k << 16) | pc)) { + cpu_idle(); // sa1 only + if (sa1_snes_rom_conflict()) { + cpu_idle(); + } + } +} +static inline void idle_branch() { + if (pc & 0x01 && sa1_isrom_address((k << 16) | pc)) { + cpu_idle(); // sa1 only + } +} + +static uint8_t cpu_readOpcode() { + return cpu_read((k << 16) | pc++); +} + +static uint16_t cpu_readOpcodeWord(bool intCheck) { + uint8_t low = cpu_readOpcode(); + if(intCheck) cpu_checkInt(); + return low | (cpu_readOpcode() << 8); +} + +static uint8_t cpu_getFlags() { + uint8_t val = n << 7; + val |= v << 6; + val |= mf << 5; + val |= xf << 4; + val |= d << 3; + val |= i << 2; + val |= z << 1; + val |= c; + return val; +} + +static void cpu_setFlags(uint8_t val) { + n = val & 0x80; + v = val & 0x40; + mf = val & 0x20; + xf = val & 0x10; + d = val & 8; + i = val & 4; + z = val & 2; + c = val & 1; + if(e) { + mf = true; + xf = true; + sp = (sp & 0xff) | 0x100; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } +} + +static void cpu_setZN(uint16_t value, bool byte) { + if(byte) { + z = (value & 0xff) == 0; + n = value & 0x80; + } else { + z = value == 0; + n = value & 0x8000; + } +} + +static void cpu_doBranch(bool check) { + if(!check) cpu_checkInt(); + uint8_t value = cpu_readOpcode(); + if(check) { + cpu_checkInt(); + cpu_idle(); // taken branch: 1 extra cycle + pc += (int8_t) value; + + idle_branch(); + } +} + +static uint8_t cpu_pullByte() { + sp++; + if(e) sp = (sp & 0xff) | 0x100; + return cpu_read(sp); +} + +static void cpu_pushByte(uint8_t value) { + cpu_write(sp, value); + sp--; + if(e) sp = (sp & 0xff) | 0x100; +} + +static uint16_t cpu_pullWord(bool intCheck) { + uint8_t value = cpu_pullByte(); + if(intCheck) cpu_checkInt(); + return value | (cpu_pullByte() << 8); +} + +static void cpu_pushWord(uint16_t value, bool intCheck) { + cpu_pushByte(value >> 8); + if(intCheck) cpu_checkInt(); + cpu_pushByte(value & 0xff); +} + +static uint16_t cpu_readWord(uint32_t adrl, uint32_t adrh, bool intCheck) { + uint8_t value = cpu_read(adrl); + if(intCheck) cpu_checkInt(); + return value | (cpu_read(adrh) << 8); +} + +static void cpu_writeWord(uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed, bool intCheck) { + if(reversed) { + cpu_write(adrh, value >> 8); + if(intCheck) cpu_checkInt(); + cpu_write(adrl, value & 0xff); + } else { + cpu_write(adrl, value & 0xff); + if(intCheck) cpu_checkInt(); + cpu_write(adrh, value >> 8); + } +} + +static void cpu_doInterrupt() { + cpu_idle(); + cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + intWanted = false; + readVector = true; + if(nmiWanted) { + nmiWanted = false; + pc = cpu_readWord(0xffea, 0xffeb, false); + } else { // irq + pc = cpu_readWord(0xffee, 0xffef, false); + } + readVector = false; +} + +// addressing modes + +static void cpu_adrImp() { + // only for 2-cycle implied opcodes + cpu_checkInt(); + if(intWanted) { + // if interrupt detected in 2-cycle implied/accumulator opcode, + // idle cycle turns into read from pc + cpu_read((k << 16) | pc); + } else { + cpu_idle(); + } +} + +static uint32_t cpu_adrImm(uint32_t* low, bool xFlag) { + if((xFlag && xf) || (!xFlag && mf)) { + *low = (k << 16) | pc++; + return 0; + } else { + *low = (k << 16) | pc++; + return (k << 16) | pc++; + } +} + +static uint32_t cpu_adrDp(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + *low = (dp + adr) & 0xffff; + return (dp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrDpx(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + *low = (dp + adr + x) & 0xffff; + return (dp + adr + x + 1) & 0xffff; +} + +static uint32_t cpu_adrDpy(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + *low = (dp + adr + y) & 0xffff; + return (dp + adr + y + 1) & 0xffff; +} + +static uint32_t cpu_adrIdp(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + *low = (db << 16) + pointer; + return ((db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdx(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + cpu_idle(); + uint16_t pointer = cpu_readWord((dp + adr + x) & 0xffff, (dp + adr + x + 1) & 0xffff, false); + *low = (db << 16) + pointer; + return ((db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdy(uint32_t* low, bool write) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((pointer >> 8) != ((pointer + y) >> 8))) cpu_idle(); + *low = ((db << 16) + pointer + y) & 0xffffff; + return ((db << 16) + pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdl(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + pointer |= cpu_read((dp + adr + 2) & 0xffff) << 16; + *low = pointer; + return (pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIly(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + if(dp & 0xff) cpu_idle(); // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord((dp + adr) & 0xffff, (dp + adr + 1) & 0xffff, false); + pointer |= cpu_read((dp + adr + 2) & 0xffff) << 16; + *low = (pointer + y) & 0xffffff; + return (pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrSr(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + cpu_idle(); + *low = (sp + adr) & 0xffff; + return (sp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrIsy(uint32_t* low) { + uint8_t adr = cpu_readOpcode(); + cpu_idle(); + uint16_t pointer = cpu_readWord((sp + adr) & 0xffff, (sp + adr + 1) & 0xffff, false); + cpu_idle(); + *low = ((db << 16) + pointer + y) & 0xffffff; + return ((db << 16) + pointer + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbs(uint32_t* low) { + uint16_t adr = cpu_readOpcodeWord(false); + *low = (db << 16) + adr; + return ((db << 16) + adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbx(uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((adr >> 8) != ((adr + x) >> 8))) cpu_idle(); + *low = ((db << 16) + adr + x) & 0xffffff; + return ((db << 16) + adr + x + 1) & 0xffffff; +} + +static uint32_t cpu_adrAby(uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(false); + // writing opcode or x = 0 or page crossed: 1 extra cycle + if(write || !xf || ((adr >> 8) != ((adr + y) >> 8))) cpu_idle(); + *low = ((db << 16) + adr + y) & 0xffffff; + return ((db << 16) + adr + y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbl(uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(false); + adr |= cpu_readOpcode() << 16; + *low = adr; + return (adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAlx(uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(false); + adr |= cpu_readOpcode() << 16; + *low = (adr + x) & 0xffffff; + return (adr + x + 1) & 0xffffff; +} + +// opcode functions + +static void cpu_and(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a & value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a &= value; + } + cpu_setZN(a, mf); +} + +static void cpu_ora(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a | value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a |= value; + } + cpu_setZN(a, mf); +} + +static void cpu_eor(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + a = (a & 0xff00) | ((a ^ value) & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + a ^= value; + } + cpu_setZN(a, mf); +} + +static void cpu_adc(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (a & 0xf0) + (value & 0xf0) + result; + } else { + result = (a & 0xff) + value + c; + } + v = (a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(d && result > 0x9f) result += 0x60; + c = result > 0xff; + a = (a & 0xff00) | (result & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true); + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (a & 0xf0) + (value & 0xf0) + result; + if(result > 0x9f) result = ((result + 0x60) & 0xff) + 0x100; + result = (a & 0xf00) + (value & 0xf00) + result; + if(result > 0x9ff) result = ((result + 0x600) & 0xfff) + 0x1000; + result = (a & 0xf000) + (value & 0xf000) + result; + } else { + result = a + value + c; + } + v = (a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(d && result > 0x9fff) result += 0x6000; + c = result > 0xffff; + a = result; + } + cpu_setZN(a, mf); +} + +static void cpu_sbc(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (a & 0xf0) + (value & 0xf0) + result; + } else { + result = (a & 0xff) + value + c; + } + v = (a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(d && result < 0x100) result -= 0x60; + c = result > 0xff; + a = (a & 0xff00) | (result & 0xff); + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + int result = 0; + if(d) { + result = (a & 0xf) + (value & 0xf) + c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (a & 0xf0) + (value & 0xf0) + result; + if(result < 0x100) result = (result - 0x60) & ((result - 0x60 < 0) ? 0xff : 0x1ff); + result = (a & 0xf00) + (value & 0xf00) + result; + if(result < 0x1000) result = (result - 0x600) & ((result - 0x600 < 0) ? 0xfff : 0x1fff); + result = (a & 0xf000) + (value & 0xf000) + result; + } else { + result = a + value + c; + } + v = (a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(d && result < 0x10000) result -= 0x6000; + c = result > 0xffff; + a = result; + } + cpu_setZN(a, mf); +} + +static void cpu_cmp(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (a & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = a + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, mf); +} + +static void cpu_cpx(uint32_t low, uint32_t high) { + int result = 0; + if(xf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (x & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = x + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, xf); +} + +static void cpu_cpy(uint32_t low, uint32_t high) { + int result = 0; + if(xf) { + cpu_checkInt(); + uint8_t value = cpu_read(low) ^ 0xff; + result = (y & 0xff) + value + 1; + c = result > 0xff; + } else { + uint16_t value = cpu_readWord(low, high, true) ^ 0xffff; + result = y + value + 1; + c = result > 0xffff; + } + cpu_setZN(result, xf); +} + +static void cpu_bit(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + uint8_t value = cpu_read(low); + uint8_t result = (a & 0xff) & value; + z = result == 0; + n = value & 0x80; + v = value & 0x40; + } else { + uint16_t value = cpu_readWord(low, high, true); + uint16_t result = a & value; + z = result == 0; + n = value & 0x8000; + v = value & 0x4000; + } +} + +static void cpu_lda(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + a = (a & 0xff00) | cpu_read(low); + } else { + a = cpu_readWord(low, high, true); + } + cpu_setZN(a, mf); +} + +static void cpu_ldx(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + x = cpu_read(low); + } else { + x = cpu_readWord(low, high, true); + } + cpu_setZN(x, xf); +} + +static void cpu_ldy(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + y = cpu_read(low); + } else { + y = cpu_readWord(low, high, true); + } + cpu_setZN(y, xf); +} + +static void cpu_sta(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + cpu_write(low, a); + } else { + cpu_writeWord(low, high, a, false, true); + } +} + +static void cpu_stx(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + cpu_write(low, x); + } else { + cpu_writeWord(low, high, x, false, true); + } +} + +static void cpu_sty(uint32_t low, uint32_t high) { + if(xf) { + cpu_checkInt(); + cpu_write(low, y); + } else { + cpu_writeWord(low, high, y, false, true); + } +} + +static void cpu_stz(uint32_t low, uint32_t high) { + if(mf) { + cpu_checkInt(); + cpu_write(low, 0); + } else { + cpu_writeWord(low, high, 0, false, true); + } +} + +static void cpu_ror(uint32_t low, uint32_t high) { + bool carry = false; + int result = 0; + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + carry = value & 1; + result = (value >> 1) | (c << 7); + cpu_checkInt(); + cpu_write(low, result); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + carry = value & 1; + result = (value >> 1) | (c << 15); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); + c = carry; +} + +static void cpu_rol(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = (cpu_read(low) << 1) | c; + cpu_idle(); + c = result & 0x100; + cpu_checkInt(); + cpu_write(low, result); + } else { + result = (cpu_readWord(low, high, false) << 1) | c; + cpu_idle(); + c = result & 0x10000; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_lsr(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + c = value & 1; + result = value >> 1; + cpu_checkInt(); + cpu_write(low, result); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + c = value & 1; + result = value >> 1; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_asl(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) << 1; + cpu_idle(); + c = result & 0x100; + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) << 1; + cpu_idle(); + c = result & 0x10000; + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_inc(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) + 1; + cpu_idle(); + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) + 1; + cpu_idle(); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_dec(uint32_t low, uint32_t high) { + int result = 0; + if(mf) { + result = cpu_read(low) - 1; + cpu_idle(); + cpu_checkInt(); + cpu_write(low, result); + } else { + result = cpu_readWord(low, high, false) - 1; + cpu_idle(); + cpu_writeWord(low, high, result, true, true); + } + cpu_setZN(result, mf); +} + +static void cpu_tsb(uint32_t low, uint32_t high) { + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + z = ((a & 0xff) & value) == 0; + cpu_checkInt(); + cpu_write(low, value | (a & 0xff)); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + z = (a & value) == 0; + cpu_writeWord(low, high, value | a, true, true); + } +} + +static void cpu_trb(uint32_t low, uint32_t high) { + if(mf) { + uint8_t value = cpu_read(low); + cpu_idle(); + z = ((a & 0xff) & value) == 0; + cpu_checkInt(); + cpu_write(low, value & ~(a & 0xff)); + } else { + uint16_t value = cpu_readWord(low, high, false); + cpu_idle(); + z = (a & value) == 0; + cpu_writeWord(low, high, value & ~a, true, true); + } +} + +static void case_0x00() { // brk imm(s) + uint32_t vector = (e) ? 0xfffe : 0xffe6; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + } +static void case_0x01() { // ora idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_ora(low, high); + + } +static void case_0x02() { // cop imm(s) + uint32_t vector = (e) ? 0xfff4 : 0xffe4; + cpu_readOpcode(); + if (!e) cpu_pushByte(k); + cpu_pushWord(pc, false); + cpu_pushByte(cpu_getFlags()); + i = true; + d = false; + k = 0; + readVector = true; + pc = cpu_readWord(vector, vector + 1, true); + readVector = false; + + } +static void case_0x03() { // ora sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_ora(low, high); + + } +static void case_0x04() { // tsb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_tsb(low, high); + + } +static void case_0x05() { // ora dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ora(low, high); + + } +static void case_0x06() { // asl dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_asl(low, high); + + } +static void case_0x07() { // ora idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_ora(low, high); + + } +static void case_0x08() { // php imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(cpu_getFlags()); + + } +static void case_0x09() { // ora imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_ora(low, high); + + } +static void case_0x0a() { // asla imp + cpu_adrImp(); + if(mf) { + c = a & 0x80; + a = (a & 0xff00) | ((a << 1) & 0xff); + } else { + c = a & 0x8000; + a <<= 1; + } + cpu_setZN(a, mf); + + } +static void case_0x0b() { // phd imp + cpu_idle(); + cpu_pushWord(dp, true); + + } +static void case_0x0c() { // tsb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_tsb(low, high); + + } +static void case_0x0d() { // ora abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ora(low, high); + + } +static void case_0x0e() { // asl abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_asl(low, high); + + } +static void case_0x0f() { // ora abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_ora(low, high); + + } +static void case_0x10() { // bpl rel + cpu_doBranch(!n); + + } +static void case_0x11() { // ora idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_ora(low, high); + + } +static void case_0x12() { // ora idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_ora(low, high); + + } +static void case_0x13() { // ora isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_ora(low, high); + + } +static void case_0x14() { // trb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_trb(low, high); + + } +static void case_0x15() { // ora dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ora(low, high); + + } +static void case_0x16() { // asl dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_asl(low, high); + + } +static void case_0x17() { // ora ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_ora(low, high); + + } +static void case_0x18() { // clc imp + cpu_adrImp(); + c = false; + + } +static void case_0x19() { // ora aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ora(low, high); + + } +static void case_0x1a() { // inca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a + 1) & 0xff); + } else { + a++; + } + cpu_setZN(a, mf); + + } +static void case_0x1b() { // tcs imp + cpu_adrImp(); + sp = (e) ? (a & 0xff) | 0x100 : a; + + } +static void case_0x1c() { // trb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_trb(low, high); + + } +static void case_0x1d() { // ora abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ora(low, high); + + } +static void case_0x1e() { // asl abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_asl(low, high); + + } +static void case_0x1f() { // ora alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_ora(low, high); + + } +static void case_0x20() { // jsr abs + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc - 1, true); + pc = value; + + idle_jump(); + } +static void case_0x21() { // and idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_and(low, high); + + } +static void case_0x22() { // jsl abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_pushByte(k); + cpu_idle(); + uint8_t newK = cpu_readOpcode(); + cpu_pushWord(pc - 1, true); + pc = value; + k = newK; + + idle_jump(); + } +static void case_0x23() { // and sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_and(low, high); + + } +static void case_0x24() { // bit dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_bit(low, high); + + } +static void case_0x25() { // and dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_and(low, high); + + } +static void case_0x26() { // rol dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_rol(low, high); + + } +static void case_0x27() { // and idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_and(low, high); + + } +static void case_0x28() { // plp imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + cpu_setFlags(cpu_pullByte()); + + } +static void case_0x29() { // and imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_and(low, high); + + } +static void case_0x2a() { // rola imp + cpu_adrImp(); + int result = (a << 1) | c; + if(mf) { + c = result & 0x100; + a = (a & 0xff00) | (result & 0xff); + } else { + c = result & 0x10000; + a = result; + } + cpu_setZN(a, mf); + + } +static void case_0x2b() { // pld imp + cpu_idle(); + cpu_idle(); + dp = cpu_pullWord(true); + cpu_setZN(dp, false); + + } +static void case_0x2c() { // bit abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_bit(low, high); + + } +static void case_0x2d() { // and abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_and(low, high); + + } +static void case_0x2e() { // rol abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_rol(low, high); + + } +static void case_0x2f() { // and abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_and(low, high); + + } +static void case_0x30() { // bmi rel + cpu_doBranch(n); + + } +static void case_0x31() { // and idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_and(low, high); + + } +static void case_0x32() { // and idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_and(low, high); + + } +static void case_0x33() { // and isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_and(low, high); + + } +static void case_0x34() { // bit dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_bit(low, high); + + } +static void case_0x35() { // and dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_and(low, high); + + } +static void case_0x36() { // rol dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_rol(low, high); + + } +static void case_0x37() { // and ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_and(low, high); + + } +static void case_0x38() { // sec imp + cpu_adrImp(); + c = true; + + } +static void case_0x39() { // and aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_and(low, high); + + } +static void case_0x3a() { // deca imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | ((a - 1) & 0xff); + } else { + a--; + } + cpu_setZN(a, mf); + + } +static void case_0x3b() { // tsc imp + cpu_adrImp(); + a = sp; + cpu_setZN(a, false); + + } +static void case_0x3c() { // bit abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_bit(low, high); + + } +static void case_0x3d() { // and abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_and(low, high); + + } +static void case_0x3e() { // rol abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_rol(low, high); + + } +static void case_0x3f() { // and alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_and(low, high); + + } +static void case_0x40() { // rti imp + cpu_idle(); + cpu_idle(); + cpu_setFlags(cpu_pullByte()); + pc = cpu_pullWord(false); + cpu_checkInt(); + k = cpu_pullByte(); + + idle_jump(); + } +static void case_0x41() { // eor idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_eor(low, high); + + } +static void case_0x42() { // wdm imm(s) + cpu_checkInt(); + cpu_readOpcode(); + + } +static void case_0x43() { // eor sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_eor(low, high); + + } +static void case_0x44() { // mvp bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x--; + y--; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x45() { // eor dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_eor(low, high); + + } +static void case_0x46() { // lsr dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lsr(low, high); + + } +static void case_0x47() { // eor idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_eor(low, high); + + } +static void case_0x48() { // pha imp + cpu_idle(); + if(mf) { + cpu_checkInt(); + cpu_pushByte(a); + } else { + cpu_pushWord(a, true); + } + + } +static void case_0x49() { // eor imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_eor(low, high); + + } +static void case_0x4a() { // lsra imp + cpu_adrImp(); + c = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f); + } else { + a >>= 1; + } + cpu_setZN(a, mf); + + } +static void case_0x4b() { // phk imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(k); + + } +static void case_0x4c() { // jmp abs + pc = cpu_readOpcodeWord(true); + + idle_jump(); + } +static void case_0x4d() { // eor abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_eor(low, high); + + } +static void case_0x4e() { // lsr abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lsr(low, high); + + } +static void case_0x4f() { // eor abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_eor(low, high); + + } +static void case_0x50() { // bvc rel + cpu_doBranch(!v); + + } +static void case_0x51() { // eor idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_eor(low, high); + + } +static void case_0x52() { // eor idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_eor(low, high); + + } +static void case_0x53() { // eor isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_eor(low, high); + + } +static void case_0x54() { // mvn bm + uint8_t dest = cpu_readOpcode(); + uint8_t src = cpu_readOpcode(); + db = dest; + cpu_write((dest << 16) | y, cpu_read((src << 16) | x)); + a--; + x++; + y++; + if(a != 0xffff) { + pc -= 3; + } + if(xf) { + x &= 0xff; + y &= 0xff; + } + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0x55() { // eor dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_eor(low, high); + + } +static void case_0x56() { // lsr dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lsr(low, high); + + } +static void case_0x57() { // eor ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_eor(low, high); + + } +static void case_0x58() { // cli imp + cpu_adrImp(); + i = false; + + } +static void case_0x59() { // eor aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_eor(low, high); + + } +static void case_0x5a() { // phy imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(y); + } else { + cpu_pushWord(y, true); + } + + } +static void case_0x5b() { // tcd imp + cpu_adrImp(); + dp = a; + cpu_setZN(dp, false); + + } +static void case_0x5c() { // jml abl + uint16_t value = cpu_readOpcodeWord(false); + cpu_checkInt(); + k = cpu_readOpcode(); + pc = value; + + idle_jump(); + } +static void case_0x5d() { // eor abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_eor(low, high); + + } +static void case_0x5e() { // lsr abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_lsr(low, high); + + } +static void case_0x5f() { // eor alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_eor(low, high); + + } +static void case_0x60() { // rts imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_checkInt(); + cpu_idle(); + + idle_jump(); + } +static void case_0x61() { // adc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_adc(low, high); + + } +static void case_0x62() { // per rll + uint16_t value = cpu_readOpcodeWord(false); + cpu_idle(); + cpu_pushWord(pc + (int16_t) value, true); + + } +static void case_0x63() { // adc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_adc(low, high); + + } +static void case_0x64() { // stz dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stz(low, high); + + } +static void case_0x65() { // adc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_adc(low, high); + + } +static void case_0x66() { // ror dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ror(low, high); + + } +static void case_0x67() { // adc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_adc(low, high); + + } +static void case_0x68() { // pla imp + cpu_idle(); + cpu_idle(); + if(mf) { + cpu_checkInt(); + a = (a & 0xff00) | cpu_pullByte(); + } else { + a = cpu_pullWord(true); + } + cpu_setZN(a, mf); + + } +static void case_0x69() { // adc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_adc(low, high); + + } +static void case_0x6a() { // rora imp + cpu_adrImp(); + bool carry = a & 1; + if(mf) { + a = (a & 0xff00) | ((a >> 1) & 0x7f) | (c << 7); + } else { + a = (a >> 1) | (c << 15); + } + c = carry; + cpu_setZN(a, mf); + + } +static void case_0x6b() { // rtl imp + cpu_idle(); + cpu_idle(); + pc = cpu_pullWord(false) + 1; + cpu_checkInt(); + k = cpu_pullByte(); + + idle_jump(); + } +static void case_0x6c() { // jmp ind + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, true); + + idle_jump(); + } +static void case_0x6d() { // adc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_adc(low, high); + + } +static void case_0x6e() { // ror abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ror(low, high); + + } +static void case_0x6f() { // adc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_adc(low, high); + + } +static void case_0x70() { // bvs rel + cpu_doBranch(v); + + } +static void case_0x71() { // adc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_adc(low, high); + + } +static void case_0x72() { // adc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_adc(low, high); + + } +static void case_0x73() { // adc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_adc(low, high); + + } +static void case_0x74() { // stz dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_stz(low, high); + + } +static void case_0x75() { // adc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_adc(low, high); + + } +static void case_0x76() { // ror dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ror(low, high); + + } +static void case_0x77() { // adc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_adc(low, high); + + } +static void case_0x78() { // sei imp + cpu_adrImp(); + i = true; + + } +static void case_0x79() { // adc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_adc(low, high); + + } +static void case_0x7a() { // ply imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + y = cpu_pullByte(); + } else { + y = cpu_pullWord(true); + } + cpu_setZN(y, xf); + + } +static void case_0x7b() { // tdc imp + cpu_adrImp(); + a = dp; + cpu_setZN(a, false); + + } +static void case_0x7c() { // jmp iax + uint16_t adr = cpu_readOpcodeWord(false); + cpu_idle(); + pc = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + + idle_jump(); + } +static void case_0x7d() { // adc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_adc(low, high); + + } +static void case_0x7e() { // ror abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_ror(low, high); + + } +static void case_0x7f() { // adc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_adc(low, high); + + } +static void case_0x80() { // bra rel + cpu_doBranch(true); + + } +static void case_0x81() { // sta idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sta(low, high); + + } +static void case_0x82() { // brl rll + pc += (int16_t) cpu_readOpcodeWord(false); + cpu_checkInt(); + cpu_idle(); + idle_branch(); + } +static void case_0x83() { // sta sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sta(low, high); + + } +static void case_0x84() { // sty dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sty(low, high); + + } +static void case_0x85() { // sta dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sta(low, high); + + } +static void case_0x86() { // stx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_stx(low, high); + + } +static void case_0x87() { // sta idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sta(low, high); + + } +static void case_0x88() { // dey imp + cpu_adrImp(); + if(xf) { + y = (y - 1) & 0xff; + } else { + y--; + } + cpu_setZN(y, xf); + + } +static void case_0x89() { // biti imm(m) + if(mf) { + cpu_checkInt(); + uint8_t result = (a & 0xff) & cpu_readOpcode(); + z = result == 0; + } else { + uint16_t result = a & cpu_readOpcodeWord(true); + z = result == 0; + } + + } +static void case_0x8a() { // txa imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (x & 0xff); + } else { + a = x; + } + cpu_setZN(a, mf); + + } +static void case_0x8b() { // phb imp + cpu_idle(); + cpu_checkInt(); + cpu_pushByte(db); + + } +static void case_0x8c() { // sty abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sty(low, high); + + } +static void case_0x8d() { // sta abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sta(low, high); + + } +static void case_0x8e() { // stx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stx(low, high); + + } +static void case_0x8f() { // sta abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sta(low, high); + + } +static void case_0x90() { // bcc rel + cpu_doBranch(!c); + + } +static void case_0x91() { // sta idy + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, true); + cpu_sta(low, high); + + } +static void case_0x92() { // sta idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sta(low, high); + + } +static void case_0x93() { // sta isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sta(low, high); + + } +static void case_0x94() { // sty dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sty(low, high); + + } +static void case_0x95() { // sta dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sta(low, high); + + } +static void case_0x96() { // stx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_stx(low, high); + + } +static void case_0x97() { // sta ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sta(low, high); + + } +static void case_0x98() { // tya imp + cpu_adrImp(); + if(mf) { + a = (a & 0xff00) | (y & 0xff); + } else { + a = y; + } + cpu_setZN(a, mf); + + } +static void case_0x99() { // sta aby + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, true); + cpu_sta(low, high); + + } +static void case_0x9a() { // txs imp + cpu_adrImp(); + sp = (e) ? (x & 0xff) | 0x100 : x; + + } +static void case_0x9b() { // txy imp + cpu_adrImp(); + if(xf) { + y = x & 0xff; + } else { + y = x; + } + cpu_setZN(y, xf); + + } +static void case_0x9c() { // stz abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_stz(low, high); + + } +static void case_0x9d() { // sta abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_sta(low, high); + + } +static void case_0x9e() { // stz abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_stz(low, high); + + } +static void case_0x9f() { // sta alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sta(low, high); + + } +static void case_0xa0() { // ldy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldy(low, high); + + } +static void case_0xa1() { // lda idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_lda(low, high); + + } +static void case_0xa2() { // ldx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_ldx(low, high); + + } +static void case_0xa3() { // lda sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_lda(low, high); + + } +static void case_0xa4() { // ldy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldy(low, high); + + } +static void case_0xa5() { // lda dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_lda(low, high); + + } +static void case_0xa6() { // ldx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_ldx(low, high); + + } +static void case_0xa7() { // lda idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_lda(low, high); + + } +static void case_0xa8() { // tay imp + cpu_adrImp(); + if(xf) { + y = a & 0xff; + } else { + y = a; + } + cpu_setZN(y, xf); + + } +static void case_0xa9() { // lda imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_lda(low, high); + + } +static void case_0xaa() { // tax imp + cpu_adrImp(); + if(xf) { + x = a & 0xff; + } else { + x = a; + } + cpu_setZN(x, xf); + + } +static void case_0xab() { // plb imp + cpu_idle(); + cpu_idle(); + cpu_checkInt(); + db = cpu_pullByte(); + cpu_setZN(db, true); + + } +static void case_0xac() { // ldy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldy(low, high); + + } +static void case_0xad() { // lda abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_lda(low, high); + + } +static void case_0xae() { // ldx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_ldx(low, high); + + } +static void case_0xaf() { // lda abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_lda(low, high); + + } +static void case_0xb0() { // bcs rel + cpu_doBranch(c); + + } +static void case_0xb1() { // lda idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_lda(low, high); + + } +static void case_0xb2() { // lda idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_lda(low, high); + + } +static void case_0xb3() { // lda isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_lda(low, high); + + } +static void case_0xb4() { // ldy dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_ldy(low, high); + + } +static void case_0xb5() { // lda dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_lda(low, high); + + } +static void case_0xb6() { // ldx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(&low); + cpu_ldx(low, high); + + } +static void case_0xb7() { // lda ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_lda(low, high); + + } +static void case_0xb8() { // clv imp + cpu_adrImp(); + v = false; + + } +static void case_0xb9() { // lda aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_lda(low, high); + + } +static void case_0xba() { // tsx imp + cpu_adrImp(); + if(xf) { + x = sp & 0xff; + } else { + x = sp; + } + cpu_setZN(x, xf); + + } +static void case_0xbb() { // tyx imp + cpu_adrImp(); + if(xf) { + x = y & 0xff; + } else { + x = y; + } + cpu_setZN(x, xf); + + } +static void case_0xbc() { // ldy abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_ldy(low, high); + + } +static void case_0xbd() { // lda abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_lda(low, high); + + } +static void case_0xbe() { // ldx aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_ldx(low, high); + + } +static void case_0xbf() { // lda alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_lda(low, high); + + } +static void case_0xc0() { // cpy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpy(low, high); + + } +static void case_0xc1() { // cmp idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_cmp(low, high); + + } +static void case_0xc2() { // rep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() & ~val); + cpu_idle(); + + } +static void case_0xc3() { // cmp sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_cmp(low, high); + + } +static void case_0xc4() { // cpy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpy(low, high); + + } +static void case_0xc5() { // cmp dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cmp(low, high); + + } +static void case_0xc6() { // dec dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_dec(low, high); + + } +static void case_0xc7() { // cmp idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_cmp(low, high); + + } +static void case_0xc8() { // iny imp + cpu_adrImp(); + if(xf) { + y = (y + 1) & 0xff; + } else { + y++; + } + cpu_setZN(y, xf); + + } +static void case_0xc9() { // cmp imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_cmp(low, high); + + } +static void case_0xca() { // dex imp + cpu_adrImp(); + if(xf) { + x = (x - 1) & 0xff; + } else { + x--; + } + cpu_setZN(x, xf); + + } +static void case_0xcb() { // wai imp + waiting = true; + cpu_idle(); + intDelay = false; + cpu_idle(); + + cpu_idle(); // sa1 + + } +static void case_0xcc() { // cpy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpy(low, high); + + } +static void case_0xcd() { // cmp abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cmp(low, high); + + } +static void case_0xce() { // dec abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_dec(low, high); + + } +static void case_0xcf() { // cmp abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_cmp(low, high); + + } +static void case_0xd0() { // bne rel + cpu_doBranch(!z); + + } +static void case_0xd1() { // cmp idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_cmp(low, high); + + } +static void case_0xd2() { // cmp idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_cmp(low, high); + + } +static void case_0xd3() { // cmp isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_cmp(low, high); + + } +static void case_0xd4() { // pei dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_pushWord(cpu_readWord(low, high, false), true); + + } +static void case_0xd5() { // cmp dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_cmp(low, high); + + } +static void case_0xd6() { // dec dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_dec(low, high); + + } +static void case_0xd7() { // cmp ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_cmp(low, high); + + } +static void case_0xd8() { // cld imp + cpu_adrImp(); + d = false; + + } +static void case_0xd9() { // cmp aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_cmp(low, high); + + } +static void case_0xda() { // phx imp + cpu_idle(); + if(xf) { + cpu_checkInt(); + cpu_pushByte(x); + } else { + cpu_pushWord(x, true); + } + + } +static void case_0xdb() { // stp imp + stopped = true; + cpu_idle(); + cpu_idle(); + + } +static void case_0xdc() { // jml ial + uint16_t adr = cpu_readOpcodeWord(false); + pc = cpu_readWord(adr, (adr + 1) & 0xffff, false); + cpu_checkInt(); + k = cpu_read((adr + 2) & 0xffff); + + idle_jump(); + } +static void case_0xdd() { // cmp abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_cmp(low, high); + + } +static void case_0xde() { // dec abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_dec(low, high); + + } +static void case_0xdf() { // cmp alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_cmp(low, high); + + } +static void case_0xe0() { // cpx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, true); + cpu_cpx(low, high); + + } +static void case_0xe1() { // sbc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(&low); + cpu_sbc(low, high); + + } +static void case_0xe2() { // sep imm(s) + uint8_t val = cpu_readOpcode(); + cpu_checkInt(); + cpu_setFlags(cpu_getFlags() | val); + cpu_idle(); + + } +static void case_0xe3() { // sbc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(&low); + cpu_sbc(low, high); + + } +static void case_0xe4() { // cpx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_cpx(low, high); + + } +static void case_0xe5() { // sbc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_sbc(low, high); + + } +static void case_0xe6() { // inc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(&low); + cpu_inc(low, high); + + } +static void case_0xe7() { // sbc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(&low); + cpu_sbc(low, high); + + } +static void case_0xe8() { // inx imp + cpu_adrImp(); + if(xf) { + x = (x + 1) & 0xff; + } else { + x++; + } + cpu_setZN(x, xf); + + } +static void case_0xe9() { // sbc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(&low, false); + cpu_sbc(low, high); + + } +static void case_0xea() { // nop imp + cpu_adrImp(); + // no operation + + } +static void case_0xeb() { // xba imp + uint8_t low = a & 0xff; + uint8_t high = a >> 8; + a = (low << 8) | high; + cpu_setZN(high, true); + cpu_idle(); + cpu_checkInt(); + cpu_idle(); + + } +static void case_0xec() { // cpx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_cpx(low, high); + + } +static void case_0xed() { // sbc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_sbc(low, high); + + } +static void case_0xee() { // inc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(&low); + cpu_inc(low, high); + + } +static void case_0xef() { // sbc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(&low); + cpu_sbc(low, high); + + } +static void case_0xf0() { // beq rel + cpu_doBranch(z); + + } +static void case_0xf1() { // sbc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(&low, false); + cpu_sbc(low, high); + + } +static void case_0xf2() { // sbc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(&low); + cpu_sbc(low, high); + + } +static void case_0xf3() { // sbc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(&low); + cpu_sbc(low, high); + + } +static void case_0xf4() { // pea imm(l) + cpu_pushWord(cpu_readOpcodeWord(false), true); + + } +static void case_0xf5() { // sbc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_sbc(low, high); + + } +static void case_0xf6() { // inc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(&low); + cpu_inc(low, high); + + } +static void case_0xf7() { // sbc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(&low); + cpu_sbc(low, high); + + } +static void case_0xf8() { // sed imp + cpu_adrImp(); + d = true; + + } +static void case_0xf9() { // sbc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(&low, false); + cpu_sbc(low, high); + + } +static void case_0xfa() { // plx imp + cpu_idle(); + cpu_idle(); + if(xf) { + cpu_checkInt(); + x = cpu_pullByte(); + } else { + x = cpu_pullWord(true); + } + cpu_setZN(x, xf); + + } +static void case_0xfb() { // xce imp + cpu_adrImp(); + bool temp = c; + c = e; + e = temp; + cpu_setFlags(cpu_getFlags()); // updates x and m flags, clears upper half of x and y if needed + + } +static void case_0xfc() { // jsr iax + uint8_t adrl = cpu_readOpcode(); + cpu_pushWord(pc, false); + uint16_t adr = adrl | (cpu_readOpcode() << 8); + cpu_idle(); + uint16_t value = cpu_readWord((k << 16) | ((adr + x) & 0xffff), (k << 16) | ((adr + x + 1) & 0xffff), true); + pc = value; + + idle_jump(); + } +static void case_0xfd() { // sbc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, false); + cpu_sbc(low, high); + + } +static void case_0xfe() { // inc abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(&low, true); + cpu_inc(low, high); + + } +static void case_0xff() { // sbc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(&low); + cpu_sbc(low, high); + + } +static void (*const mOpcodes[0x100])() = { +case_0x00, case_0x01, case_0x02, case_0x03, case_0x04, case_0x05, case_0x06, case_0x07, case_0x08, case_0x09, case_0x0a, case_0x0b, case_0x0c, case_0x0d, case_0x0e, case_0x0f, +case_0x10, case_0x11, case_0x12, case_0x13, case_0x14, case_0x15, case_0x16, case_0x17, case_0x18, case_0x19, case_0x1a, case_0x1b, case_0x1c, case_0x1d, case_0x1e, case_0x1f, +case_0x20, case_0x21, case_0x22, case_0x23, case_0x24, case_0x25, case_0x26, case_0x27, case_0x28, case_0x29, case_0x2a, case_0x2b, case_0x2c, case_0x2d, case_0x2e, case_0x2f, +case_0x30, case_0x31, case_0x32, case_0x33, case_0x34, case_0x35, case_0x36, case_0x37, case_0x38, case_0x39, case_0x3a, case_0x3b, case_0x3c, case_0x3d, case_0x3e, case_0x3f, +case_0x40, case_0x41, case_0x42, case_0x43, case_0x44, case_0x45, case_0x46, case_0x47, case_0x48, case_0x49, case_0x4a, case_0x4b, case_0x4c, case_0x4d, case_0x4e, case_0x4f, +case_0x50, case_0x51, case_0x52, case_0x53, case_0x54, case_0x55, case_0x56, case_0x57, case_0x58, case_0x59, case_0x5a, case_0x5b, case_0x5c, case_0x5d, case_0x5e, case_0x5f, +case_0x60, case_0x61, case_0x62, case_0x63, case_0x64, case_0x65, case_0x66, case_0x67, case_0x68, case_0x69, case_0x6a, case_0x6b, case_0x6c, case_0x6d, case_0x6e, case_0x6f, +case_0x70, case_0x71, case_0x72, case_0x73, case_0x74, case_0x75, case_0x76, case_0x77, case_0x78, case_0x79, case_0x7a, case_0x7b, case_0x7c, case_0x7d, case_0x7e, case_0x7f, +case_0x80, case_0x81, case_0x82, case_0x83, case_0x84, case_0x85, case_0x86, case_0x87, case_0x88, case_0x89, case_0x8a, case_0x8b, case_0x8c, case_0x8d, case_0x8e, case_0x8f, +case_0x90, case_0x91, case_0x92, case_0x93, case_0x94, case_0x95, case_0x96, case_0x97, case_0x98, case_0x99, case_0x9a, case_0x9b, case_0x9c, case_0x9d, case_0x9e, case_0x9f, +case_0xa0, case_0xa1, case_0xa2, case_0xa3, case_0xa4, case_0xa5, case_0xa6, case_0xa7, case_0xa8, case_0xa9, case_0xaa, case_0xab, case_0xac, case_0xad, case_0xae, case_0xaf, +case_0xb0, case_0xb1, case_0xb2, case_0xb3, case_0xb4, case_0xb5, case_0xb6, case_0xb7, case_0xb8, case_0xb9, case_0xba, case_0xbb, case_0xbc, case_0xbd, case_0xbe, case_0xbf, +case_0xc0, case_0xc1, case_0xc2, case_0xc3, case_0xc4, case_0xc5, case_0xc6, case_0xc7, case_0xc8, case_0xc9, case_0xca, case_0xcb, case_0xcc, case_0xcd, case_0xce, case_0xcf, +case_0xd0, case_0xd1, case_0xd2, case_0xd3, case_0xd4, case_0xd5, case_0xd6, case_0xd7, case_0xd8, case_0xd9, case_0xda, case_0xdb, case_0xdc, case_0xdd, case_0xde, case_0xdf, +case_0xe0, case_0xe1, case_0xe2, case_0xe3, case_0xe4, case_0xe5, case_0xe6, case_0xe7, case_0xe8, case_0xe9, case_0xea, case_0xeb, case_0xec, case_0xed, case_0xee, case_0xef, +case_0xf0, case_0xf1, case_0xf2, case_0xf3, case_0xf4, case_0xf5, case_0xf6, case_0xf7, case_0xf8, case_0xf9, case_0xfa, case_0xfb, case_0xfc, case_0xfd, case_0xfe, case_0xff +}; + +static void cpu_doOpcode(uint8_t opcode) { + + (*mOpcodes[opcode])(); + +} diff --git a/src/burn/drv/snes/cpu_sa1.h b/src/burn/drv/snes/cpu_sa1.h new file mode 100644 index 000000000..254d9a299 --- /dev/null +++ b/src/burn/drv/snes/cpu_sa1.h @@ -0,0 +1,29 @@ + +#ifndef CPU_SA1_H +#define CPU_SA1_H + +#include +#include + +#include "statehandler.h" + +#if 0 +typedef uint8_t (*CpuReadHandler)(void* mem, uint32_t adr); +typedef void (*CpuWriteHandler)(void* mem, uint32_t adr, uint8_t val); +typedef void (*CpuIdleHandler)(void* mem, bool waiting); + +void cpusa1_init(void* mem, CpuReadHandler read, CpuWriteHandler write, CpuIdleHandler idle); +#endif +void cpusa1_init(); +void cpusa1_free(); +void cpusa1_reset(bool hard); +void cpusa1_handleState(StateHandler* sh); +void cpusa1_runOpcode(); +void cpusa1_nmi(); +void cpusa1_setIrq(bool state); +void cpusa1_setIntDelay(); +void cpusa1_setHalt(bool haltValue); +uint32_t cpusa1_getPC(); +bool cpusa1_isVector(); + +#endif diff --git a/src/burn/drv/snes/cx4.cpp b/src/burn/drv/snes/cx4.cpp new file mode 100644 index 000000000..518fe2efa --- /dev/null +++ b/src/burn/drv/snes/cx4.cpp @@ -0,0 +1,859 @@ +// cx4 simulator for LakeSnes, (c) 2023 dink +// License: MIT + +// Big Thanks: +// Ikari, Nocash, Overload, Segher for all the CX4 research and documentation! +// Rupert Carmichael for help with degree interpolation +// Atan for pie recipe + +// Notes: +//1: Since neither X2 or X3 relies on: this core doesn't emulate +// 2 of the cache peculiarities documented by ikari: Roll over to +// second prg-cache on end of first & stop at end of second cache +//2: ~224-cycle/frame deficit +// Where does it come from? Possible cpu startup/stop latency? +// Related to cache population (7f48)? Somewhere else? + +#include +#include +#include +#include +#include +#include "snes.h" +#include "cx4.h" + +#include "burnint.h" + +#define DEBUG_STARTSTOP 0 +#define DEBUG_CACHE 0 +#define DEBUG_DMA 0 + +// CPU condition codes +enum { + cx4_CC_Z = 1 << 0, // Zero + cx4_CC_C = 1 << 1, // Carry + cx4_CC_N = 1 << 2, // Negative + cx4_CC_V = 1 << 3, // oVerflow + cx4_CC_I = 1 << 4 // Interrupt +}; + +// BUS state +enum { + B_IDLE = 0, + B_READ = 1, + B_WRITE = 2 +}; + +// IRQ config +enum { + IRQ_ACKNOWLEDGE = 1 << 0 +}; + +#define set_flg(flg, f) do { cx4.cc = (cx4.cc & ~flg) | ((f) ? flg : 0); } while (0) +#define get_flg(flg) (!!(cx4.cc & flg)) + +#define set_Z(f) set_flg(cx4_CC_Z, f) +#define get_Z() get_flg(cx4_CC_Z) +#define set_C(f) set_flg(cx4_CC_C, f) +#define get_C() get_flg(cx4_CC_C) +#define set_N(f) set_flg(cx4_CC_N, f) +#define get_N() get_flg(cx4_CC_N) +#define set_V(f) set_flg(cx4_CC_V, f) +#define get_V() get_flg(cx4_CC_V) +#define set_I(f) set_flg(cx4_CC_I, f) +#define get_I() get_flg(cx4_CC_I) +#define set_NZ(f) do { set_N(f & 0x800000); set_Z(!f); } while (0) + +#define set_A(f) do { cx4.A = (f) & 0xffffff; } while (0) +#define get_A() (cx4.A << ((0x10080100 >> (8 * sub_op)) & 0xff)) + +#define set_byte(var, data, offset) (var = (var & (~(0xff << (((offset) & 3) * 8)))) | (data << (((offset) & 3) * 8))) +#define get_byte(var, offset) (var >> ((offset) & 3) * 8) + +#define sign_extend(f, frombits) ((int32_t)((f) << (32 - (frombits))) >> (32 - (frombits))) + +#define struct_sizeto(type, member) offsetof(type, member) + sizeof(((type*)0)->member) + +struct Stack { + uint32_t PC; + uint32_t PB; +}; + +struct CX4 { + uint64_t cycles; + uint64_t cycles_start; + uint64_t suspend_timer; + uint32_t running; + + uint32_t prg_base_address; + uint16_t prg_startup_bank; + uint8_t prg_startup_pc; + uint8_t prg_cache_page; + uint8_t prg_cache_lock; + uint32_t prg_cache[2]; + uint16_t prg[2][0x100]; + int32_t prg_cache_timer; + + uint8_t PC; + uint16_t PB; + uint16_t PB_latch; + uint8_t cc; + uint32_t A; + uint32_t SP; + Stack stack[0x08]; + uint32_t reg[0x10]; + uint8_t vectors[0x20]; + uint8_t ram[0x400 * 3]; + + uint64_t multiplier; + + // bus + uint32_t bus_address; + uint32_t bus_mode; + uint32_t bus_data; + int32_t bus_timer; + + // cpu registers (bus) + uint32_t bus_address_pointer; + uint32_t ram_address_pointer; + uint32_t rom_data; + uint32_t ram_data; + + uint8_t irqcfg; + uint8_t unkcfg; + uint8_t waitstate; + + uint32_t dma_source; + uint32_t dma_dest; + uint16_t dma_length; + int32_t dma_timer; + + // - calculated @ init - + int32_t struct_data_length; + double CyclesPerMaster; + uint64_t sync_to; + uint32_t rom[0x400]; + Snes *snes; +}; + +static CX4 cx4; + +void cx4_init(void *mem) +{ + cx4.snes = (Snes *)mem; + + cx4.CyclesPerMaster = (double)20000000 / ((cx4.snes->palTiming) ? (1364 * 312 * 50.0) : (1364 * 262 * 60.0)); + + cx4.struct_data_length = struct_sizeto(CX4, dma_timer); + + double pi = atan(1) * 4; + + for (int i = 0; i < 0x100; i++) { + cx4.rom[0x000 + i] = (i == 0) ? 0xffffff : (0x800000 / i); + cx4.rom[0x100 + i] = 0x100000 * sqrt(i); + } + for (int i = 0; i < 0x80; i++) { + cx4.rom[0x200 + i] = 0x1000000 * sin(((i * 90.0) / 128.0) * pi / 180.0); + cx4.rom[0x280 + i] = 0x800000 / (90.0 * pi / 180.0) * asin(i / 128.0); + cx4.rom[0x300 + i] = 0x10000 * (tan(((i * 90.0) / 128.0) * pi / 180.0) + 0.00000001); // 0x340 needs a little push + cx4.rom[0x380 + i] = (i == 0) ? 0xffffff : (0x1000000 * cos(((double)(i * 90.0) / 128.0) * pi / 180.0)); + } + // test validity of generated rom + int64_t hash = 0; + for (int i = 0; i < 0x400; i++) { + hash += cx4.rom[i]; + } + if (hash != 0x169c91535) { + bprintf(PRINT_ERROR, _T("CX4 rom generation failed (bad hash, %I64x)\n"), hash); + } +} + +void cx4_reset() +{ + memset(&cx4, 0, cx4.struct_data_length); + cx4.A = 0xffffff; + cx4.cc = 0x00; + cx4.running = 0; + cx4.unkcfg = 1; + cx4.waitstate = 0x33; + cx4.bus_mode = B_IDLE; +} + +void cx4_handleState(StateHandler* sh) +{ + sh_handleByteArray(sh, (uint8_t*)&cx4, cx4.struct_data_length); +} + +#define CACHE_PAGE 0x100 + +static uint32_t resolve_cache_address() +{ + return cx4.prg_base_address + cx4.PB * (CACHE_PAGE << 1); +} + +static int find_cache(uint32_t address) +{ + for (int i = 0; i < 2; i++) { + if (cx4.prg_cache[i] == address) { + return i; + } + } + return -1; +} + +static void populate_cache(uint32_t address) +{ + cx4.prg_cache_timer = 224; // what is the source of this? (re: note at top of file) + + if (cx4.prg_cache[cx4.prg_cache_page] == address) return; +#if 0 + int temp = -1; + if ((temp = find_cache(address)) != -1) { + bprintf(0, _T("populate cache is already cached! %x\n"), address); + cx4.prg_cache_page = temp; + return; + } +#endif + +#if DEBUG_CACHE + bprintf(0, _T("caching bank %x @ cache pg. %x (prev: %x)\n"), cx4.PB, cx4.prg_cache_page, cx4.prg_cache[cx4.prg_cache_page]); +#endif + + cx4.prg_cache[cx4.prg_cache_page] = address; + + for (int i = 0; i < CACHE_PAGE; i++) { + cx4.prg[cx4.prg_cache_page][i] = (snes_read(cx4.snes, address++) << 0) | (snes_read(cx4.snes, address++) << 8); + } + + cx4.prg_cache_timer += ((cx4.waitstate & 0x07) * CACHE_PAGE) * 2; +#if DEBUG_CACHE + bprintf(0, _T("cache loaded, cycles %d\n"), cx4.prg_cache_timer); +#endif +} + +static void do_cache() +{ + int new_page; + +#if DEBUG_CACHE + bprintf(0, _T("cache list: %x %x\n"), cx4.prg_cache[0], cx4.prg_cache[1]); +#endif + + // is our page cached? + if ((new_page = find_cache(resolve_cache_address())) != -1) { + //bprintf(0, _T("our page is already cached, yay.\n")); + cx4.prg_cache_page = new_page; + return; + } else { + // not cached, go to next slot + cx4.prg_cache_page = (cx4.prg_cache_page + 1) & 1; +#if 0 + extern int counter; + if (counter) { + // Locked page issue: + // (X2) after boss battle, on the "You got ..." screen: the blue raster box + // flickers in for a frame or 2 before it fades in, because: + // Cache pg 0 is locked with bank 0, pg1 is unlocked + // pg 1 has to swap between pb 2 and 9 about 100 times per frame, and + // this eats a lot of cycles! + + // can we use this slot? + if (cx4.prg_cache_lock & (1 << cx4.prg_cache_page)) { + bprintf(0, _T("-> page %x is locked (with %x) ...\n"), cx4.prg_cache_page, cx4.prg_cache[cx4.prg_cache_page]); + cx4.prg_cache_page = (cx4.prg_cache_page + 1) & 1; + // how about the other one? + if (cx4.prg_cache_lock & (1 << cx4.prg_cache_page)) { + bprintf(0, _T("CX4: we can't cache, operations terminated.\n")); + cx4.running = 0; + return; // not cached, can't cache. uhoh! + } + } + } +#endif + } + + populate_cache(resolve_cache_address()); +} + +static void cycle_advance(int32_t cyc) +{ + if (cx4.bus_timer) { + cx4.bus_timer -= cyc; + + if (cx4.bus_timer < 1) { + switch (cx4.bus_mode) { + case B_READ: cx4.bus_data = snes_read(cx4.snes, cx4.bus_address); break; + case B_WRITE: snes_write(cx4.snes, cx4.bus_address, cx4.bus_data); break; + } + cx4.bus_mode = B_IDLE; + cx4.bus_timer = 0; + } + } + + cx4.cycles += cyc; +} + +static uint16_t fetch() +{ +#if 0 + // debug: bypass cache + uint16_t opcode = 0; + uint32_t address = (cx4.prg_base_address + (cx4.PB * (CACHE_PAGE << 1)) + (cx4.PC << 1)) & 0xffffff; + opcode = snes_read(cx4.snes, address++); + opcode |= snes_read(cx4.snes, address++) << 8; +#else + const uint16_t opcode = cx4.prg[cx4.prg_cache_page][cx4.PC]; +#endif + cx4.PC++; + if (cx4.PC == 0) { + bprintf(0, _T("PC == 0! PB / Next: %x %x\n"), cx4.PB, cx4.PB_latch); + cx4.PB = cx4.PB_latch; + + do_cache(); + } + + cycle_advance(1); + + return opcode; +} + +#define is_internal_ram(a) ((a & 0x40e000) == 0x6000) + +static uint32_t get_waitstate(uint32_t address) +{ + // assumptions: waitstate is always the same for cart ROM and RAM + // .waitstate 0x33 (boot) 0x44 (set by X2/X3) + return (is_internal_ram(address)) ? 0 : (cx4.waitstate & 0x07); +} + +static void do_dma() +{ + uint32_t dest = cx4.dma_dest; + uint32_t source = cx4.dma_source; + + uint32_t dest_cyc = get_waitstate(dest); + uint32_t source_cyc = get_waitstate(source); +#if DEBUG_DMA + bprintf(0, _T("dma\tsrc/dest/len: %x %x %x\n"), source, dest, cx4.dma_length); +#endif + for (int i = 0; i < cx4.dma_length; i++) { + snes_write(cx4.snes, dest++, snes_read(cx4.snes, source++)); + } + + cx4.dma_timer = cx4.dma_length * (1 + dest_cyc + source_cyc); +#if DEBUG_DMA + bprintf(0, _T("dma end, cycles %d\n"), cx4.dma_timer); +#endif +} + +uint8_t cx4_read(uint32_t address) +{ + cx4_run(); // get up-to-date + + if ((address & 0xfff) < 0xc00) { + return cx4.ram[address & 0xfff]; + } + + if (address >= 0x7f80 && (address & 0x3f) <= 0x2f) { + address &= 0x3f; + return get_byte(cx4.reg[address / 3], address % 3); + } + + switch (address) { + case 0x7f40: return (cx4.dma_source >> 0) & 0xff; + case 0x7f41: return (cx4.dma_source >> 8) & 0xff; + case 0x7f42: return (cx4.dma_source >> 16) & 0xff; + case 0x7f43: return (cx4.dma_length >> 0) & 0xff; + case 0x7f44: return (cx4.dma_length >> 8) & 0xff; + case 0x7f45: return (cx4.dma_dest >> 0) & 0xff; + case 0x7f46: return (cx4.dma_dest >> 8) & 0xff; + case 0x7f47: return (cx4.dma_dest >> 16) & 0xff; + case 0x7f48: return cx4.prg_cache_page; + case 0x7f49: return (cx4.prg_base_address >> 0) & 0xff; + case 0x7f4a: return (cx4.prg_base_address >> 8) & 0xff; + case 0x7f4b: return (cx4.prg_base_address >> 16) & 0xff; + case 0x7f4c: return cx4.prg_cache_lock; + case 0x7f4d: return (cx4.prg_startup_bank >> 0) & 0xff; + case 0x7f4e: return (cx4.prg_startup_bank >> 8) & 0xff; + case 0x7f4f: return cx4.prg_startup_pc; + case 0x7f50: return cx4.waitstate; + case 0x7f51: return cx4.irqcfg; + case 0x7f52: return cx4.unkcfg; + case 0x7f53: case 0x7f54: case 0x7f55: case 0x7f56: + case 0x7f57: case 0x7f59: case 0x7f5b: case 0x7f5c: + case 0x7f5d: case 0x7f5e: case 0x7f5f: { + // cx4 status (address 58 & 5a not mapped, returns 0) + // tr.. ..is + // t.transfer in-progress (bus, cache, dma) + // r.running or transfer in-progress + // i.irq flag + // s.processor suspended + const int transfer = (cx4.prg_cache_timer > 0) || (cx4.bus_timer > 0) || (cx4.dma_timer > 0); + const int running = transfer || cx4.running; + const uint8_t res = (transfer << 7) | (running << 6) | (get_I() << 1) | (cx4.suspend_timer != 0); + return res; + } + case 0x7f60: case 0x7f61: case 0x7f62: case 0x7f63: + case 0x7f64: case 0x7f65: case 0x7f66: case 0x7f67: + case 0x7f68: case 0x7f69: case 0x7f6a: case 0x7f6b: + case 0x7f6c: case 0x7f6d: case 0x7f6e: case 0x7f6f: + case 0x7f70: case 0x7f71: case 0x7f72: case 0x7f73: + case 0x7f74: case 0x7f75: case 0x7f76: case 0x7f77: + case 0x7f78: case 0x7f79: case 0x7f7a: case 0x7f7b: + case 0x7f7c: case 0x7f7d: case 0x7f7e: case 0x7f7f: + // this provides the vector table for when the cx4 chip disconnects + // the rom(s) from the bus during cpu/transfer operations + return cx4.vectors[address & 0x1f]; + } + + return 0; +} + +void cx4_write(uint32_t address, uint8_t data) +{ + cx4_run(); + + if ((address & 0xfff) < 0xc00) { + cx4.ram[address & 0xfff] = data; + return; + } + + if (address >= 0x7f80 && (address & 0x3f) <= 0x2f) { + address &= 0x3f; + set_byte(cx4.reg[address / 3], data, address % 3); + return; + } + + switch (address) { + case 0x7f40: cx4.dma_source = (cx4.dma_source & 0xffff00) | (data << 0); break; + case 0x7f41: cx4.dma_source = (cx4.dma_source & 0xff00ff) | (data << 8); break; + case 0x7f42: cx4.dma_source = (cx4.dma_source & 0x00ffff) | (data << 16); break; + case 0x7f43: cx4.dma_length = (cx4.dma_length & 0xff00) | (data << 0); break; + case 0x7f44: cx4.dma_length = (cx4.dma_length & 0x00ff) | (data << 8); break; + case 0x7f45: cx4.dma_dest = (cx4.dma_dest & 0xffff00) | (data << 0); break; + case 0x7f46: cx4.dma_dest = (cx4.dma_dest & 0xff00ff) | (data << 8); break; + case 0x7f47: cx4.dma_dest = (cx4.dma_dest & 0x00ffff) | (data << 16); do_dma(); break; + case 0x7f48: cx4.prg_cache_page = data & 0x01; populate_cache(resolve_cache_address()); break; + case 0x7f49: cx4.prg_base_address = (cx4.prg_base_address & 0xffff00) | (data << 0); break; + case 0x7f4a: cx4.prg_base_address = (cx4.prg_base_address & 0xff00ff) | (data << 8); break; + case 0x7f4b: cx4.prg_base_address = (cx4.prg_base_address & 0x00ffff) | (data << 16); break; + case 0x7f4c: cx4.prg_cache_lock = data & 0x03; break; + case 0x7f4d: cx4.prg_startup_bank = (cx4.prg_startup_bank & 0xff00) | data; break; + case 0x7f4e: cx4.prg_startup_bank = (cx4.prg_startup_bank & 0x00ff) | ((data & 0x7f) << 8); break; + case 0x7f4f: + cx4.prg_startup_pc = data; + if (cx4.running == 0) { + cx4.PB = cx4.prg_startup_bank; + cx4.PC = cx4.prg_startup_pc; + cx4.running = 1; + cx4.cycles_start = cx4.cycles; +#if DEBUG_STARTSTOP + bprintf(0, _T("cx4 start @ %I64u - "), cx4.cycles); + bprintf(0, _T("cache PB: %x\tPC: %x\tcache: %x\n"), cx4.PB, cx4.PC, resolve_cache_address()); +#endif + do_cache(); + } + break; + case 0x7f50: cx4.waitstate = data & 0x77; break; // oooo aaaa o.rom, a.ram + case 0x7f51: + cx4.irqcfg = data & 0x01; + if (cx4.irqcfg & IRQ_ACKNOWLEDGE) { + cpu_setIrq(false); + set_I(0); + } + break; + case 0x7f52: cx4.unkcfg = data & 0x01; break; // this is up for debate, previously thought to en/disable 2nd rom chip on certain carts + case 0x7f53: cx4.running = 0; bprintf(0, _T("7f53: CX4 - stop running!\n")); break; + case 0x7f55: case 0x7f56: case 0x7f57: case 0x7f58: + case 0x7f59: case 0x7f5a: case 0x7f5b: case 0x7f5c: { + const int32_t offset = (address - 0x7f55); + cx4.suspend_timer = (offset == 0) ? -1 : (offset << 5); + break; + } + case 0x7f5d: cx4.suspend_timer = 0; break; + case 0x7f5e: set_I(0); break; + case 0x7f60: case 0x7f61: case 0x7f62: case 0x7f63: + case 0x7f64: case 0x7f65: case 0x7f66: case 0x7f67: + case 0x7f68: case 0x7f69: case 0x7f6a: case 0x7f6b: + case 0x7f6c: case 0x7f6d: case 0x7f6e: case 0x7f6f: + case 0x7f70: case 0x7f71: case 0x7f72: case 0x7f73: + case 0x7f74: case 0x7f75: case 0x7f76: case 0x7f77: + case 0x7f78: case 0x7f79: case 0x7f7a: case 0x7f7b: + case 0x7f7c: case 0x7f7d: case 0x7f7e: case 0x7f7f: + cx4.vectors[address & 0x1f] = data; break; + } +} + +// special function (purpose?) registers + +static uint32_t get_sfr(uint8_t address) +{ + switch (address & 0x7f) { + case 0x01: return (cx4.multiplier >> 24) & 0xffffff; + case 0x02: return (cx4.multiplier >> 0) & 0xffffff; + case 0x03: return cx4.bus_data; + case 0x08: return cx4.rom_data; + case 0x0c: return cx4.ram_data; + case 0x13: return cx4.bus_address_pointer; + case 0x1c: return cx4.ram_address_pointer; + case 0x20: return cx4.PC; + case 0x28: return cx4.PB_latch; + case 0x2e: // rom + case 0x2f: // ram + cx4.bus_timer = ((cx4.waitstate >> ((~address & 1) << 2)) & 0x07) + 1; + cx4.bus_address = cx4.bus_address_pointer; + cx4.bus_mode = B_READ; + return 0; + case 0x50: return 0x000000; + case 0x51: return 0xffffff; + case 0x52: return 0x00ff00; + case 0x53: return 0xff0000; + case 0x54: return 0x00ffff; + case 0x55: return 0xffff00; + case 0x56: return 0x800000; + case 0x57: return 0x7fffff; + case 0x58: return 0x008000; + case 0x59: return 0x007fff; + case 0x5a: return 0xff7fff; + case 0x5b: return 0xffff7f; + case 0x5c: return 0x010000; + case 0x5d: return 0xfeffff; + case 0x5e: return 0x000100; + case 0x5f: return 0x00feff; + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + return cx4.reg[address & 0x0f]; + } + + bprintf(0, _T("get_sfr() - invalid %x\n"), address); + + return 0; +} + +static void set_sfr(uint8_t address, uint32_t data) +{ + switch (address & 0x7f) { + case 0x01: cx4.multiplier = (cx4.multiplier & 0x000000ffffff) | ((uint64_t)data << 24); break; + case 0x02: cx4.multiplier = (cx4.multiplier & 0xffffff000000) | ((uint64_t)data << 0); break; + case 0x03: cx4.bus_data = data; break; + case 0x08: cx4.rom_data = data; break; + case 0x0c: cx4.ram_data = data; break; + case 0x13: cx4.bus_address_pointer = data; break; + case 0x1c: cx4.ram_address_pointer = data; break; + case 0x20: cx4.PC = data; break; + case 0x28: cx4.PB_latch = (data & 0x7fff); break; + case 0x2e: // rom + case 0x2f: // ram + cx4.bus_timer = ((cx4.waitstate >> ((~address & 1) << 2)) & 0x07) + 1; + cx4.bus_address = cx4.bus_address_pointer; + cx4.bus_mode = B_WRITE; + break; + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + cx4.reg[address & 0x0f] = data; break; + + default: + bprintf(0, _T("set_sfr() - invalid %x (%x)\n"), address, data); + break; + } +} + +static void jmpjsr(bool is_jsr, bool take, uint8_t page, uint8_t address) { + if (take) { + if (is_jsr) { + cx4.stack[cx4.SP].PC = cx4.PC; + cx4.stack[cx4.SP].PB = cx4.PB; + cx4.SP = (cx4.SP + 1) & 0x07; + } + if (page) { + cx4.PB = cx4.PB_latch; + do_cache(); + } + cx4.PC = address; + cycle_advance(2); + } +} + +static uint32_t add(uint32_t a1, uint32_t a2) +{ + const uint32_t sum = a1 + a2; + + set_C(sum & 0xff000000); + set_V(((a1 ^ sum) & (a2 ^ sum)) & 0x800000); + set_N(sum & 0x800000); + set_Z(!(sum & 0xffffff)); + + return sum & 0xffffff; +} + +static uint32_t sub(uint32_t m, uint32_t s) +{ + const int32_t diff = m - s; + + set_C(!(diff < 0)); + set_V(((m ^ diff) & (s ^ diff)) & 0x800000); + set_NZ(diff); + + return diff & 0xffffff; +} + +#define DIRECT_IMM 0x0400 +#define get_immed() ((opcode & DIRECT_IMM) ? immed : get_sfr(immed)) + +static void run_insn() +{ + const uint16_t opcode = fetch(); + const uint8_t sub_op = (opcode & 0x0300) >> 8; + const uint8_t immed = (opcode & 0x00ff) >> 0; + uint32_t temp = 0; + + switch (opcode & 0xfc00) { + case 0x0000: // nop + break; + + case 0x0800: // jmp page,pc + jmpjsr(false, true, sub_op, immed); break; + case 0x0c00: // jmp if flag,page,pc + jmpjsr(false, get_Z(), sub_op, immed); break; + case 0x1000: + jmpjsr(false, get_C(), sub_op, immed); break; + case 0x1400: + jmpjsr(false, get_N(), sub_op, immed); break; + case 0x1800: + jmpjsr(false, get_V(), sub_op, immed); break; + case 0x2800: // jsr page,pc + jmpjsr(true, true, sub_op, immed); break; + case 0x2c00: // jsr if flag,page,pc + jmpjsr(true, get_Z(), sub_op, immed); break; + case 0x3000: + jmpjsr(true, get_C(), sub_op, immed); break; + case 0x3400: + jmpjsr(true, get_N(), sub_op, immed); break; + case 0x3800: + jmpjsr(true, get_V(), sub_op, immed); break; + + case 0x3c00: // return + cx4.SP = (cx4.SP - 1) & 0x07; + cx4.PC = cx4.stack[cx4.SP].PC; + cx4.PB = cx4.stack[cx4.SP].PB; + do_cache(); + cycle_advance(2); + break; + + case 0x1c00: // finish/execute bus transfer + cycle_advance(cx4.bus_timer); + break; + + case 0x2400: // skip cc,imm + if (!!(cx4.cc & (1 << ((0x13 >> sub_op) & 3))) == immed) { // note: re-indexes processor flags to match order of sub_op [O,C,Z,N] + fetch(); + } + break; + + case 0x4000: // inc bus address + cx4.bus_address_pointer = (cx4.bus_address_pointer + 1) & 0xffffff; + break; + + case 0x4800: // cmp imm,A + case 0x4c00: + sub(get_immed(), get_A()); + break; + + case 0x5000: // cmp A,imm + case 0x5400: + sub(get_A(), get_immed()); + break; + + case 0x5800: // sign_extend A[?,8,16,? bit] + cx4.A = sign_extend(cx4.A, sub_op << 3) & 0xffffff; + set_NZ(cx4.A); + break; + + case 0x6000: // mov x,imm + case 0x6400: + switch (sub_op) { + case 0: cx4.A = get_immed(); break; + case 1: cx4.bus_data = get_immed(); break; + case 2: cx4.bus_address_pointer = get_immed(); break; + case 3: cx4.PB_latch = get_immed() & 0x7fff; break; + } + break; + + case 0xe000: // mov sfr[imm],x + switch (sub_op) { + case 0: set_sfr(immed, cx4.A); break; + case 1: set_sfr(immed, cx4.bus_data); break; + case 2: set_sfr(immed, cx4.bus_address_pointer); break; + case 3: set_sfr(immed, cx4.PB_latch); break; + } + break; + + case 0x6800: // RDRAM subop,A + temp = cx4.A & 0xfff; + if (temp < 0xc00) { + set_byte(cx4.ram_data, cx4.ram[temp], sub_op); + } + break; + case 0x6c00: // RDRAM imm,A + temp = (cx4.ram_address_pointer + immed) & 0xfff; + if (temp < 0xc00) { + set_byte(cx4.ram_data, cx4.ram[temp], sub_op); + } + break; + + case 0xe800: // WRRAM subop,A + temp = cx4.A & 0xfff; + if (temp < 0xc00) { + cx4.ram[temp] = get_byte(cx4.ram_data, sub_op); + } + break; + case 0xec00: // WRRAM imm,A + temp = (cx4.ram_address_pointer + immed) & 0xfff; + if (temp < 0xc00) { + cx4.ram[temp] = get_byte(cx4.ram_data, sub_op); + } + break; + + case 0x7000: // RDROM + cx4.rom_data = cx4.rom[cx4.A & 0x3ff]; + break; + case 0x7400: + cx4.rom_data = cx4.rom[(sub_op << 8) | immed]; + break; + + case 0x7c00: // mov PB_latch[l/h],imm + set_byte(cx4.PB_latch, immed, sub_op); + cx4.PB_latch &= 0x7fff; + break; + + case 0x8000: // ADD A,imm + case 0x8400: + cx4.A = add(get_A(), get_immed()); + break; + + case 0x8800: // SUB imm,A + case 0x8c00: + cx4.A = sub(get_immed(), get_A()); + break; + + case 0x9000: // SUB A,imm + case 0x9400: + cx4.A = sub(get_A(), get_immed()); + break; + + case 0x9800: // MUL imm,A + case 0x9c00: + cx4.multiplier = ((int64_t)sign_extend(get_immed(), 24) * sign_extend(cx4.A, 24)) & 0xffffffffffff; + break; + + case 0xa000: // XNOR A,imm + case 0xa400: + set_A(~(get_A()) ^ get_immed()); + set_NZ(cx4.A); + break; + + case 0xa800: // XOR A,imm + case 0xac00: + set_A((get_A()) ^ get_immed()); + set_NZ(cx4.A); + break; + + case 0xb000: // AND A,imm + case 0xb400: + set_A((get_A()) & get_immed()); + set_NZ(cx4.A); + break; + + case 0xb800: // OR A,imm + case 0xbc00: + set_A((get_A()) | get_immed()); + set_NZ(cx4.A); + break; + + case 0xc000: // SHR A,imm + case 0xc400: + set_A(cx4.A >> (get_immed() & 0x1f)); + set_NZ(cx4.A); + break; + + case 0xc800: // ASR A,imm + case 0xcc00: + set_A(sign_extend(cx4.A, 24) >> (get_immed() & 0x1f)); + set_NZ(cx4.A); + break; + + case 0xd000: // ROR A,imm + case 0xd400: + temp = get_immed() & 0x1f; + set_A((cx4.A >> temp) | (cx4.A << (24 - temp))); + set_NZ(cx4.A); + break; + + case 0xd800: // SHL A,imm + case 0xdc00: + set_A(cx4.A << (get_immed() & 0x1f)); + set_NZ(cx4.A); + break; + + case 0xf000: // XCHG A,regs + temp = cx4.A; + cx4.A = cx4.reg[immed & 0xf]; + cx4.reg[immed & 0xf] = temp; + break; + + case 0xf800: // clear + cx4.A = cx4.ram_address_pointer = cx4.ram_data = cx4.PB_latch = 0x00; + break; + + case 0xfc00: // stop +#if DEBUG_STARTSTOP + bprintf(0, _T("cx4 OP-stop, cycles ran %d\n"), (int)((int64_t)cx4.cycles - cx4.cycles_start)); +#endif + cx4.running = 0; + if (~cx4.irqcfg & IRQ_ACKNOWLEDGE) { + set_I(1); + cpu_setIrq(true); + } + break; + } +} + +static void tally_cycles() +{ + cx4.sync_to = (uint64_t)cx4.snes->cycles * cx4.CyclesPerMaster; +} + +static inline int64_t cycles_left() +{ + return cx4.sync_to - cx4.cycles; +} + +void cx4_run() +{ + int tcyc = 0; + tally_cycles(); + + while (cx4.cycles < cx4.sync_to) { + if (cx4.prg_cache_timer) { + tcyc = (cycles_left() > cx4.prg_cache_timer) ? cx4.prg_cache_timer : 1; + cycle_advance(tcyc); + cx4.prg_cache_timer -= tcyc; + } else if (cx4.dma_timer) { + tcyc = (cycles_left() > cx4.dma_timer) ? cx4.dma_timer : 1; + cycle_advance(tcyc); + cx4.dma_timer -= tcyc; + } else if (cx4.suspend_timer) { + tcyc = (cycles_left() > cx4.suspend_timer) ? cx4.suspend_timer : 1; + cycle_advance(tcyc); + cx4.suspend_timer -= tcyc; + } else if (!cx4.running) { + cycle_advance(cycles_left()); + } else { + run_insn(); + } + } +} diff --git a/src/burn/drv/snes/cx4.h b/src/burn/drv/snes/cx4.h new file mode 100644 index 000000000..be9860aee --- /dev/null +++ b/src/burn/drv/snes/cx4.h @@ -0,0 +1,12 @@ + +#ifndef CX4_H +#define CX4_H + +void cx4_init(void *mem); +uint8_t cx4_read(uint32_t addr); +void cx4_write(uint32_t addr, uint8_t value); +void cx4_run(); +void cx4_reset(); +void cx4_handleState(StateHandler* sh); + +#endif diff --git a/src/burn/drv/snes/d_snes.cpp b/src/burn/drv/snes/d_snes.cpp new file mode 100644 index 000000000..112d6f4e6 --- /dev/null +++ b/src/burn/drv/snes/d_snes.cpp @@ -0,0 +1,31827 @@ +// FBNeo SNES driver / interface to LakeSnes +// By Kev, dink, Gab75 + +#include "tiles_generic.h" +#include "snes.h" +#include "burn_gun.h" // zapper games + +static UINT8 snesInputPort0[12]; +static UINT8 snesInputPort1[12]; +static INT16 Analog[4]; +static UINT8 snesMouseButtons[4]; + +static UINT8 DrvReset; +static UINT8 DrvDips[2]; // [0] ?, [1] controller config +static UINT8 DrvRecalc = 1; +static UINT8 LastControllerDip = 0; +static UINT8 LastControllerTimer = 0; + +static INT32 has_gun = 0; +static ButtonToggle scope_turbo; +static ButtonToggle scope_pause; + +static UINT8* rom; +static UINT8* rom_bios; +static Snes* snes = NULL; + +static INT32 snes_statesize = 0; // filled in DoReset() +static UINT8 *snes_statedata = NULL; +static INT32 snes_batterysize = 0; // filled-in DoReset() +static UINT8 *snes_batterydata = NULL; +static UINT32 *snes_framebuffer = NULL; + +static struct BurnInputInfo SNESInputList[] = { + {"P1 Up", BIT_DIGITAL, snesInputPort0 + 4, "p1 up" }, + {"P1 Down", BIT_DIGITAL, snesInputPort0 + 5, "p1 down" }, + {"P1 Left", BIT_DIGITAL, snesInputPort0 + 6, "p1 left" }, + {"P1 Right", BIT_DIGITAL, snesInputPort0 + 7, "p1 right" }, + {"P1 Button Y", BIT_DIGITAL, snesInputPort0 + 1, "p1 fire 1" }, + {"P1 Button X", BIT_DIGITAL, snesInputPort0 + 9, "p1 fire 2" }, + {"P1 Button B", BIT_DIGITAL, snesInputPort0 + 0, "p1 fire 3" }, + {"P1 Button A", BIT_DIGITAL, snesInputPort0 + 8, "p1 fire 4" }, + {"P1 Button L", BIT_DIGITAL, snesInputPort0 + 10, "p1 fire 5" }, + {"P1 Button R", BIT_DIGITAL, snesInputPort0 + 11, "p1 fire 6" }, + {"P1 Select", BIT_DIGITAL, snesInputPort0 + 2, "p1 select" }, + {"P1 Start", BIT_DIGITAL, snesInputPort0 + 3, "p1 start" }, + + {"P2 Up", BIT_DIGITAL, snesInputPort1 + 4, "p2 up" }, + {"P2 Down", BIT_DIGITAL, snesInputPort1 + 5, "p2 down" }, + {"P2 Left", BIT_DIGITAL, snesInputPort1 + 6, "p2 left" }, + {"P2 Right", BIT_DIGITAL, snesInputPort1 + 7, "p2 right" }, + {"P2 Button A", BIT_DIGITAL, snesInputPort1 + 8, "p2 fire 1" }, + {"P2 Button B", BIT_DIGITAL, snesInputPort1 + 0, "p2 fire 2" }, + {"P2 Button X", BIT_DIGITAL, snesInputPort1 + 9, "p2 fire 3" }, + {"P2 Button Y", BIT_DIGITAL, snesInputPort1 + 1, "p2 fire 4" }, + {"P2 Button L", BIT_DIGITAL, snesInputPort1 + 10, "p2 fire 5" }, + {"P2 Button R", BIT_DIGITAL, snesInputPort1 + 11, "p2 fire 6" }, + {"P2 Select", BIT_DIGITAL, snesInputPort1 + 2, "p2 select" }, + {"P2 Start", BIT_DIGITAL, snesInputPort1 + 3, "p2 start" }, + + {"Reset", BIT_DIGITAL, &DrvReset, "reset" }, + + {"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" }, + {"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" }, +}; + +STDINPUTINFO(SNES) + +#define A(a, b, c, d) {a, b, (UINT8*)(c), d} +static struct BurnInputInfo SNESMouseInputList[] = { + {"P1 Up", BIT_DIGITAL, snesInputPort0 + 4, "p1 up" }, + {"P1 Down", BIT_DIGITAL, snesInputPort0 + 5, "p1 down" }, + {"P1 Left", BIT_DIGITAL, snesInputPort0 + 6, "p1 left" }, + {"P1 Right", BIT_DIGITAL, snesInputPort0 + 7, "p1 right" }, + {"P1 Button Y", BIT_DIGITAL, snesInputPort0 + 1, "p1 fire 1" }, + {"P1 Button X", BIT_DIGITAL, snesInputPort0 + 9, "p1 fire 2" }, + {"P1 Button B", BIT_DIGITAL, snesInputPort0 + 0, "p1 fire 3" }, + {"P1 Button A", BIT_DIGITAL, snesInputPort0 + 8, "p1 fire 4" }, + {"P1 Button L", BIT_DIGITAL, snesInputPort0 + 10, "p1 fire 5" }, + {"P1 Button R", BIT_DIGITAL, snesInputPort0 + 11, "p1 fire 6" }, + {"P1 Select", BIT_DIGITAL, snesInputPort0 + 2, "p1 select" }, + {"P1 Start", BIT_DIGITAL, snesInputPort0 + 3, "p1 start" }, + A("P1 Mouse X", BIT_ANALOG_REL, &Analog[0], "p1_mouse x-axis" ), + A("P1 Mouse Y", BIT_ANALOG_REL, &Analog[1], "p1_mouse y-axis" ), + {"P1 Mouse Button A", BIT_DIGITAL,snesMouseButtons + 0, "p1_mouse button 1" }, + {"P1 Mouse Button B", BIT_DIGITAL,snesMouseButtons + 1, "p1_mouse button 2" }, + + {"P2 Up", BIT_DIGITAL, snesInputPort1 + 4, "p2 up" }, + {"P2 Down", BIT_DIGITAL, snesInputPort1 + 5, "p2 down" }, + {"P2 Left", BIT_DIGITAL, snesInputPort1 + 6, "p2 left" }, + {"P2 Right", BIT_DIGITAL, snesInputPort1 + 7, "p2 right" }, + {"P2 Button A", BIT_DIGITAL, snesInputPort1 + 8, "p2 fire 1" }, + {"P2 Button B", BIT_DIGITAL, snesInputPort1 + 0, "p2 fire 2" }, + {"P2 Button X", BIT_DIGITAL, snesInputPort1 + 9, "p2 fire 3" }, + {"P2 Button Y", BIT_DIGITAL, snesInputPort1 + 1, "p2 fire 4" }, + {"P2 Button L", BIT_DIGITAL, snesInputPort1 + 10, "p2 fire 5" }, + {"P2 Button R", BIT_DIGITAL, snesInputPort1 + 11, "p2 fire 6" }, + {"P2 Select", BIT_DIGITAL, snesInputPort1 + 2, "p2 select" }, + {"P2 Start", BIT_DIGITAL, snesInputPort1 + 3, "p2 start" }, + A("P2 Mouse X", BIT_ANALOG_REL, &Analog[2], "p2_mouse x-axis" ), + A("P2 Mouse Y", BIT_ANALOG_REL, &Analog[3], "p2_mouse y-axis" ), + {"P2 Mouse Button A", BIT_DIGITAL,snesMouseButtons + 2, "p2_mouse button 1" }, + {"P2 Mouse Button B", BIT_DIGITAL,snesMouseButtons + 3, "p2_mouse button 2" }, + + {"Reset", BIT_DIGITAL, &DrvReset, "reset" }, + + {"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" }, + {"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" }, +}; + +STDINPUTINFO(SNESMouse) + +static struct BurnInputInfo SNESZapperInputList[] = { + {"P1 Up", BIT_DIGITAL, snesInputPort0 + 4, "p1 up" }, + {"P1 Down", BIT_DIGITAL, snesInputPort0 + 5, "p1 down" }, + {"P1 Left", BIT_DIGITAL, snesInputPort0 + 6, "p1 left" }, + {"P1 Right", BIT_DIGITAL, snesInputPort0 + 7, "p1 right" }, + {"P1 Button Y", BIT_DIGITAL, snesInputPort0 + 1, "p1 fire 1" }, + {"P1 Button X", BIT_DIGITAL, snesInputPort0 + 9, "p1 fire 2" }, + {"P1 Button B", BIT_DIGITAL, snesInputPort0 + 0, "p1 fire 3" }, + {"P1 Button A", BIT_DIGITAL, snesInputPort0 + 8, "p1 fire 4" }, + {"P1 Button L", BIT_DIGITAL, snesInputPort0 + 10, "p1 fire 5" }, + {"P1 Button R", BIT_DIGITAL, snesInputPort0 + 11, "p1 fire 6" }, + {"P1 Select", BIT_DIGITAL, snesInputPort0 + 2, "p1 select" }, + {"P1 Start", BIT_DIGITAL, snesInputPort0 + 3, "p1 start" }, + + A("P2 Gun X", BIT_ANALOG_REL, &Analog[0], "p2 x-axis" ), + A("P2 Gun Y", BIT_ANALOG_REL, &Analog[1], "p2 y-axis" ), + {"P2 Fire", BIT_DIGITAL, snesInputPort1 + 0, "p2 fire 1" }, + {"P2 Cursor", BIT_DIGITAL, snesInputPort1 + 1, "p2 fire 2" }, + {"P2 Turbo", BIT_DIGITAL, snesInputPort1 + 2, "p2 fire 3" }, + {"P2 Pause", BIT_DIGITAL, snesInputPort1 + 3, "p2 fire 4" }, + {"P2 Reload", BIT_DIGITAL, snesInputPort1 + 6, "p2 fire 5" }, + + {"Reset", BIT_DIGITAL, &DrvReset, "reset" }, + + {"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" }, + {"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" }, +}; + +STDINPUTINFO(SNESZapper) + +static struct BurnDIPInfo SNESDIPList[] = +{ + DIP_OFFSET(0x19) + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x00, NULL }, +}; + +STDDIPINFO(SNES) + +static struct BurnDIPInfo SNESZapperDIPList[] = +{ + DIP_OFFSET(0x14) + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x00, NULL }, +}; + +STDDIPINFO(SNESZapper) + +static struct BurnDIPInfo SNESMouseBaseDIPList[] = +{ + DIP_OFFSET(0x21) + {0 , 0xfe, 0 , 2, "P1 Controller Type" }, + {0x01, 0x01, 0x01, 0x00, "GamePad" }, + {0x01, 0x01, 0x01, 0x01, "Mouse" }, + + {0 , 0xfe, 0 , 2, "P2 Controller Type" }, + {0x01, 0x01, 0x02, 0x00, "GamePad" }, + {0x01, 0x01, 0x02, 0x02, "Mouse" }, +}; + +static struct BurnDIPInfo SNESMouseP1GamepadP2GamepadDIPList[] = +{ + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x00, NULL }, +}; + +static struct BurnDIPInfo SNESMouseP1MouseP2GamepadDIPList[] = +{ + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x01, NULL }, +}; + +static struct BurnDIPInfo SNESMouseP1GamepadP2MouseDIPList[] = +{ + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x02, NULL }, +}; + +static struct BurnDIPInfo SNESMouseP1MouseP2MouseDIPList[] = +{ + {0x00, 0xff, 0xff, 0x00, NULL }, + {0x01, 0xff, 0xff, 0x03, NULL }, +}; + +STDDIPINFOEXT(SNESMouse, SNESMouseP1GamepadP2Gamepad, SNESMouseBase) // zoop +STDDIPINFOEXT(SNESMouseP1, SNESMouseP1MouseP2Gamepad, SNESMouseBase) // zoop +STDDIPINFOEXT(SNESMouseP2, SNESMouseP1GamepadP2Mouse, SNESMouseBase) // zoop +STDDIPINFOEXT(SNESMouseP1P2, SNESMouseP1MouseP2Mouse, SNESMouseBase) // zoop + +static UINT32 CheckControllerPlug() +{ + if (LastControllerDip ^ (DrvDips[1] & 0x03)) { + LastControllerDip = DrvDips[1] & 0x03; + bprintf(0, _T("*** snes: Controller Re-Plug initiated.\n")); + snes_setButtonState(snes, 1, 0, 0, DEVICE_NONE); + snes_setButtonState(snes, 2, 0, 0, DEVICE_NONE); + LastControllerTimer = 220; + } + + if (LastControllerTimer) { + // If controls are changed (controller <-> mouse etc), we leave + // them unplugged for a number of frames so the game can detect + // the re-plugged controllers. + LastControllerTimer--; + if (LastControllerTimer == 0) { + bprintf(0, _T("*** snes: Controller Re-Plug finished.\n")); + } + } + + return (LastControllerTimer != 0); +} + +static void DrvDoReset() +{ + snes_reset(snes, true); + + LastControllerDip = DrvDips[1]; + LastControllerTimer = 0; +} + +static INT32 DrvInit() +{ + struct BurnRomInfo ri; + BurnDrvGetRomInfo(&ri, 0); + UINT32 length = ri.nLen; + + rom = BurnMalloc(BurnRoundPowerOf2(length)); +// bprintf(0, _T("snes rom size: %x rounded: %x\n"), length, BurnRoundPowerOf2(length)); + if (BurnLoadRom(rom, 0, 0)) { + bprintf(0, _T("*** d_snes: BurnLoadRom(rom) failed!\n")); + return 1; + } + + char *bios = BurnDrvGetTextA(BDF_BOARDROM); + UINT32 bios_len = 0; + rom_bios = NULL; + if (bios) { + rom_bios = BurnMalloc(0x18000); // usually 0x2800 for dsp*, 0x11000 for Seta ST010/ST011 + + BurnDrvGetRomInfo(&ri, 0x80); + bios_len = ri.nLen; +// bprintf(0, _T("*** we have bios! [%S] len. %x crc. %x\n"), bios, ri.nLen, ri.nCrc); + + if (BurnLoadRom(rom_bios, 0x80, 1)) { + bprintf(0, _T("*** d_snes: BurnLoadRom(bios) failed!\n")); + return 1; + } + } + + GenericTilesInit(); + snes = snes_init(); + snes_loadRom(snes, rom, length, rom_bios, bios_len); + + BurnSetRefreshRate(snes_isPal(snes) ? 50.00 : 60.00); + bprintf(0, _T("*** snes running @ %dhz"), snes_isPal(snes) ? 50 : 60); + + // allocate memory for state, battery & framebuffer (for < 32bpp) + snes_statesize = snes_saveState(snes, NULL); + bprintf(0, _T(" - our statesize is %d\n"), snes_statesize); + snes_statedata = BurnMalloc(snes_statesize); + + snes_batterysize = snes_saveBattery(snes, NULL); + snes_batterydata = (snes_batterysize > 0) ? BurnMalloc(snes_batterysize) : NULL; + + snes_framebuffer = (UINT32*)BurnMalloc(512*480*4); + + if (BurnDrvGetHardwareCode() == HARDWARE_SNES_ZAPPER) { + bprintf(0, _T("*** SNES: With Zapper\n")); + has_gun = 1; + BurnGunInit(1, true); + } + + DrvDoReset(); + + return 0; +} + + +static INT32 DrvExit() +{ + GenericTilesExit(); + BurnFree(rom); + BurnFree(rom_bios); + if (snes) snes_free(snes); + snes = NULL; + + BurnFree(snes_statedata); + BurnFree(snes_batterydata); + BurnFree(snes_framebuffer); + + if (has_gun) { + BurnGunExit(); + has_gun = 0; + } + + return 0; +} + + +static INT32 DrvDraw() +{ + switch (nBurnBpp) { + case 4: + // 32bpp, no problem! + snes_setPixels(snes, (UINT8*)pBurnDraw, nScreenHeight); + break; + + default: + snes_setPixels(snes, (UINT8*)snes_framebuffer, nScreenHeight); + for (INT32 i = 0; i < nScreenWidth * nScreenHeight; i++) { + PutPix(pBurnDraw + (i * nBurnBpp), BurnHighCol(snes_framebuffer[i]>>16, (snes_framebuffer[i]>>8)&0xff, snes_framebuffer[i]&0xff, 0)); + } + break; + } + + if (has_gun) { + BurnGunDrawTargets(); + } + + return 0; +} + + +static INT32 DrvScan(INT32 nAction, INT32* pnMin) +{ + if (pnMin != NULL) { + *pnMin = 0x029698; + } + + if (nAction & ACB_VOLATILE) { + if (nAction & ACB_WRITE) { + ScanVar(snes_statedata, snes_statesize, "snes_machine"); + snes_loadState(snes, snes_statedata, snes_statesize); + } else { + snes_saveState(snes, snes_statedata); + ScanVar(snes_statedata, snes_statesize, "snes_machine"); + } + + SCAN_VAR(LastControllerDip); + SCAN_VAR(LastControllerTimer); + + if (has_gun) { + BurnGunScan(); + scope_turbo.Scan(); + scope_pause.Scan(); + } + } + + if (nAction & ACB_NVRAM && snes_batterysize > 0) { + if (nAction & ACB_WRITE) { + ScanVar(snes_batterydata, snes_batterysize, "snes_battery"); + snes_loadBattery(snes, snes_batterydata, snes_batterysize); + } else { + snes_saveBattery(snes, snes_batterydata); + ScanVar(snes_batterydata, snes_batterysize, "snes_battery"); + } + } + + return 0; +} + +static INT32 DrvFrame() +{ + if (DrvReset) { + DrvDoReset(); + } + + { + if (has_gun) { + BurnGunMakeInputs(0, Analog[0], Analog[1]); + + snesInputPort1[8] = BurnGunReturnX(0); + snesInputPort1[9] = BurnGunReturnY(0); + scope_turbo.Toggle(snesInputPort1[2]); + } + + if (CheckControllerPlug() == 0) { + for (INT32 i = 0; i < 12; i++) { + if ((DrvDips[1] & 0x01) == 0) { + snes_setButtonState(snes, 1, i, snesInputPort0[i], DEVICE_GAMEPAD); + } + if ((DrvDips[1] & 0x02) == 0) { // p2 controller or lightgun + snes_setButtonState(snes, 2, i, snesInputPort1[i], has_gun ? DEVICE_SUPERSCOPE : DEVICE_GAMEPAD); + } + } + if (DrvDips[1] & 0x01) { + snes_setMouseState(snes, 1, Analog[0], Analog[1], snesMouseButtons[0], snesMouseButtons[1]); + } + if (DrvDips[1] & 0x02) { + snes_setMouseState(snes, 2, Analog[2], Analog[3], snesMouseButtons[2], snesMouseButtons[3]); + } + } + } + + snes_runFrame(snes); + + if (pBurnDraw) { + DrvDraw(); + } + + if (pBurnSoundOut) { + snes_setSamples(snes, pBurnSoundOut, nBurnSoundLen); + } + + return 0; +} + +static INT32 SNESGetZipName(char** pszName, UINT32 i) +{ + static char szFilename[MAX_PATH]; + char* pszGameName = NULL; + + if (pszName == NULL) { + return 1; + } + + if (i == 0) { + pszGameName = BurnDrvGetTextA(DRV_NAME); + } else { + if (i == 1 && BurnDrvGetTextA(DRV_BOARDROM)) { + pszGameName = BurnDrvGetTextA(DRV_BOARDROM); + } else { + pszGameName = BurnDrvGetTextA(DRV_PARENT); + } + } + + if (pszGameName == NULL || i > 2) { + *pszName = NULL; + return 1; + } + + // remove nes_ + memset(szFilename, 0, MAX_PATH); + for (UINT32 j = 0; j < (strlen(pszGameName) - 5); j++) { + szFilename[j] = pszGameName[j+5]; + } + + *pszName = szFilename; + + return 0; +} + +// empty rom struct for bios loading support + +static struct BurnRomInfo emptyRomDesc[] = { + { "", 0, 0, 0 }, +}; + + +// Seta ST010 + +static struct BurnRomInfo snes_st010RomDesc[] = { + { "st010.bin", 0x11000, 0xaa11ee2d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_st010) +STD_ROM_FN(snes_st010) + +struct BurnDriver BurnDrvsnes_st010 = { + "snes_st010", NULL, NULL, NULL, "x", + "Seta ST010\0", NULL, "ST010 microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_st010RomInfo, snes_st010RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Seta ST011 + +static struct BurnRomInfo snes_st011RomDesc[] = { + { "st011.bin", 0x11000, 0x34d2952c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_st011) +STD_ROM_FN(snes_st011) + +struct BurnDriver BurnDrvsnes_st011 = { + "snes_st011", NULL, NULL, NULL, "x", + "Seta ST011\0", NULL, "ST011 microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_st011RomInfo, snes_st011RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + + +// DSP-1 + +static struct BurnRomInfo snes_dsp1RomDesc[] = { + { "dsp1.bin", 10240, 0x2838f9f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_dsp1) +STD_ROM_FN(snes_dsp1) + +struct BurnDriver BurnDrvsnes_dsp1 = { + "snes_dsp1", NULL, NULL, NULL, "x", + "DSP-1\0", NULL, "DSP microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_dsp1RomInfo, snes_dsp1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DSP-1B + +static struct BurnRomInfo snes_dsp1bRomDesc[] = { + { "dsp1b.bin", 10240, 0x453557e0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_dsp1b) +STD_ROM_FN(snes_dsp1b) + +struct BurnDriver BurnDrvsnes_dsp1b = { + "snes_dsp1b", NULL, NULL, NULL, "x", + "DSP-1B\0", NULL, "DSP microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_dsp1bRomInfo, snes_dsp1bRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DSP-2 + +static struct BurnRomInfo snes_dsp2RomDesc[] = { + { "dsp2.bin", 10240, 0x8e9fbd9b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_dsp2) +STD_ROM_FN(snes_dsp2) + +struct BurnDriver BurnDrvsnes_dsp2 = { + "snes_dsp2", NULL, NULL, NULL, "x", + "DSP-2\0", NULL, "DSP microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_dsp2RomInfo, snes_dsp2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DSP-3 + +static struct BurnRomInfo snes_dsp3RomDesc[] = { + { "dsp3.bin", 10240, 0x6b86728a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_dsp3) +STD_ROM_FN(snes_dsp3) + +struct BurnDriver BurnDrvsnes_dsp3 = { + "snes_dsp3", NULL, NULL, NULL, "x", + "DSP-3\0", NULL, "DSP microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_dsp3RomInfo, snes_dsp3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DSP-4 + +static struct BurnRomInfo snes_dsp4RomDesc[] = { + { "dsp4.bin", 10240, 0xce0c7783, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_dsp4) +STD_ROM_FN(snes_dsp4) + +struct BurnDriver BurnDrvsnes_dsp4 = { + "snes_dsp4", NULL, NULL, NULL, "x", + "DSP-4\0", NULL, "DSP microcode", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_BOARDROM, 1, HARDWARE_SNES, GBF_BIOS, 0, + SNESGetZipName, snes_dsp4RomInfo, snes_dsp4RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// CPU Test (HB) + +static struct BurnRomInfo snes_CputestRomDesc[] = { + { "cputest (2023)(HB).sfc", 262144, 0x4de40f6b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cputest) +STD_ROM_FN(snes_Cputest) + +struct BurnDriver BurnDrvsnes_Cputest = { + "snes_cputest", NULL, NULL, NULL, "2023", + "CPU Test (HB)\0", NULL, "", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_CputestRomInfo, snes_CputestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// CX4 Test (HB) + +static struct BurnRomInfo snes_Cx4testRomDesc[] = { + { "cx4test (2010)(Overload).sfc", 32768, 0xf56a03d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cx4test) +STD_ROM_FN(snes_Cx4test) + +struct BurnDriver BurnDrvsnes_Cx4test = { + "snes_cx4test", NULL, NULL, NULL, "2010", + "CX4 Test (HB)\0", NULL, "Overload", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_Cx4testRomInfo, snes_Cx4testRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mouse Check + +static struct BurnRomInfo snes_Mouse_checkRomDesc[] = { + { "Mouse Check (1992)(Nintendo).sfc", 131072, 0x514fa050, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mouse_check) +STD_ROM_FN(snes_Mouse_check) + +struct BurnDriver BurnDrvsnes_Mouse_check = { + "snes_mouse_check", NULL, NULL, NULL, "1992", + "Mouse Check\0", "Set Dipswitches", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_Mouse_checkRomInfo, snes_Mouse_checkRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseP1P2DIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 480, 4, 3 +}; + +// PPU bus act (HB) + +static struct BurnRomInfo snes_PpubusactRomDesc[] = { + { "ppubusact (2008)(lidnariq).sfc", 131072, 0x8bd2e33b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ppubusact) +STD_ROM_FN(snes_Ppubusact) + +struct BurnDriver BurnDrvsnes_Ppubusact = { + "snes_ppubusact", NULL, NULL, NULL, "2008", + "PPU bus act (HB)\0", NULL, "lidnariq", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_PpubusactRomInfo, snes_PpubusactRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SA-1 Speed Test (HB, v5.1) +// https://github.com/VitorVilela7/SnesSpeedTest +static struct BurnRomInfo snes_Sa1sptestRomDesc[] = { + { "SA-1 Speed Test v5.1 (2018)(Vitor Vilela).sfc", 65536, 0x8beffd94, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sa1sptest) +STD_ROM_FN(snes_Sa1sptest) + +struct BurnDriver BurnDrvsnes_Sa1sptest = { + "snes_sa1sptest", NULL, NULL, NULL, "2018", + "SA-1 Speed Test (HB, v5.1)\0", NULL, "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_Sa1sptestRomInfo, snes_Sa1sptestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SPC Test (HB) + +static struct BurnRomInfo snes_SpctestRomDesc[] = { + { "spctest (2023)(HB).sfc", 131072, 0x1a1efbd6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spctest) +STD_ROM_FN(snes_Spctest) + +struct BurnDriver BurnDrvsnes_Spctest = { + "snes_spctest", NULL, NULL, NULL, "2023", + "SPC Test (HB)\0", NULL, "", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_SpctestRomInfo, snes_SpctestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Window Shapes Single (HB, v2) + +static struct BurnRomInfo snes_WindowshapestestRomDesc[] = { + { "Window-Shapes-Single v2 (20xx)(undisbeliever).sfc", 131072, 0x959dc79c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Windowshapestest) +STD_ROM_FN(snes_Windowshapestest) + +struct BurnDriver BurnDrvsnes_Windowshapestest = { + "snes_windowshapestest", NULL, NULL, NULL, "20??", + "Window Shapes Single (HB, v2)\0", NULL, "undisbeliever", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_MISC, 0, + SNESGetZipName, snes_WindowshapestestRomInfo, snes_WindowshapestestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + + +// ------------------------------- +// Classic Games/Translation Hacks +// ------------------------------- + + +// 3-jigen Kakutou Ballz (Japan) + +static struct BurnRomInfo snes_3jkballzRomDesc[] = { + { "3-jigen Kakutou Ballz (J)(1995)(Media Rings Corp.).sfc", 1048576, 0xf0810694, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_3jkballz, snes_3jkballz, snes_dsp1b) +STD_ROM_FN(snes_3jkballz) + +struct BurnDriver BurnDrvsnes_3jkballz = { + "snes_3jkballz", "snes_ballz3d", "snes_dsp1b", NULL, "1995", + "3-jigen Kakutou Ballz (Japan)\0", "DSP-1B enhancement chip", "Media Rings Corporation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_3jkballzRomInfo, snes_3jkballzRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 3 Ninjas Kick Back (USA) + +static struct BurnRomInfo snes_3ninjaskbRomDesc[] = { + { "3 Ninjas Kick Back (U)(1994)(Sony Imagesoft).sfc", 2097152, 0xf2ee11f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_3ninjaskb) +STD_ROM_FN(snes_3ninjaskb) + +struct BurnDriver BurnDrvsnes_3ninjaskb = { + "snes_3ninjaskb", NULL, NULL, NULL, "1994", + "3 Ninjas Kick Back (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_3ninjaskbRomInfo, snes_3ninjaskbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 3x3 Eyes: Juuma Houkan (Japan) + +static struct BurnRomInfo snes_3x3eyesjRomDesc[] = { + { "3x3 Eyes - Juuma Houkan (J)(1995)(Banpresto).sfc", 2097152, 0xad4ad163, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_3x3eyesj) +STD_ROM_FN(snes_3x3eyesj) + +struct BurnDriver BurnDrvsnes_3x3eyesj = { + "snes_3x3eyesj", "snes_3x3eyeste", NULL, NULL, "1995", + "3x3 Eyes: Juuma Houkan (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_3x3eyesjRomInfo, snes_3x3eyesjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 3x3 Eyes: Beast Restoration (Hack, English v1.01) +// https://www.romhacking.net/translations/2835/ +static struct BurnRomInfo snes_3x3eyesteRomDesc[] = { + { "3x3 Eyes - Beast Restoration T-Eng v1.01 (2017)(Atomizer_Zero).sfc", 2097152, 0x42204f0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_3x3eyeste) +STD_ROM_FN(snes_3x3eyeste) + +struct BurnDriver BurnDrvsnes_3x3eyeste = { + "snes_3x3eyeste", NULL, NULL, NULL, "2017", + "3x3 Eyes: Beast Restoration (Hack, English v1.01)\0", NULL, "Atomizer_Zero", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_3x3eyesteRomInfo, snes_3x3eyesteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 7th Saga, The (USA) + +static struct BurnRomInfo snes_7thsagaRomDesc[] = { + { "7th Saga, The (U)(1993)(Enix).sfc", 1572864, 0xb3abdde6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_7thsaga) +STD_ROM_FN(snes_7thsaga) + +struct BurnDriver BurnDrvsnes_7thsaga = { + "snes_7thsaga", NULL, NULL, NULL, "1993", + "7th Saga, The (USA)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_7thsagaRomInfo, snes_7thsagaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 46 Okunen Monogatari - Harukanaru Eden e (Japan) + +static struct BurnRomInfo snes_46okunmonoRomDesc[] = { + { "46 Okunen Monogatari - Harukanaru Eden e (J)(1992)(Enix - Almanic).sfc", 1572864, 0xb090235a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_46okunmono) +STD_ROM_FN(snes_46okunmono) + +struct BurnDriver BurnDrvsnes_46okunmono = { + "snes_46okunmono", "snes_evo", NULL, NULL, "1992", + "46 Okunen Monogatari - Harukanaru Eden e (Japan)\0", NULL, "Enix/Almanic", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_46okunmonoRomInfo, snes_46okunmonoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 90 Minutes - European Prime Goal (Euro) + +static struct BurnRomInfo snes_90minepgRomDesc[] = { + { "90 Minutes - European Prime Goal (E)(1995)(Ocean - Namco).sfc", 2097152, 0x1ad61bd0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_90minepg) +STD_ROM_FN(snes_90minepg) + +struct BurnDriver BurnDrvsnes_90minepg = { + "snes_90minepg", NULL, NULL, NULL, "1995", + "90 Minutes - European Prime Goal (Euro)\0", NULL, "Ocean - Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_90minepgRomInfo, snes_90minepgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 2020 Super Baseball (Japan) + +static struct BurnRomInfo snes_2020sbRomDesc[] = { + { "2020 Super Baseball (J)(1993)(KAC).sfc", 1572864, 0xe95a3dd7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_2020sb) +STD_ROM_FN(snes_2020sb) + +struct BurnDriver BurnDrvsnes_2020sb = { + "snes_2020sb", "snes_sb2020", NULL, NULL, "1993", + "2020 Super Baseball (Japan)\0", NULL, "KAC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_2020sbRomInfo, snes_2020sbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aaahh!!! Real Monsters (USA) + +static struct BurnRomInfo snes_AaahhrmRomDesc[] = { + { "Aaahh!!! Real Monsters (U)(1995)(Viacom New Media).sfc", 2097152, 0x27ff5ba1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aaahhrm) +STD_ROM_FN(snes_Aaahhrm) + +struct BurnDriver BurnDrvsnes_Aaahhrm = { + "snes_aaahhrm", NULL, NULL, NULL, "1995", + "Aaahh!!! Real Monsters (USA)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AaahhrmRomInfo, snes_AaahhrmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Andre Agassi Tennis (USA) + +static struct BurnRomInfo snes_AatennisRomDesc[] = { + { "Andre Agassi Tennis (U)(1994)(TecMagik).sfc", 524288, 0xd1ae87be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aatennis) +STD_ROM_FN(snes_Aatennis) + +struct BurnDriver BurnDrvsnes_Aatennis = { + "snes_aatennis", NULL, NULL, NULL, "1994", + "Andre Agassi Tennis (USA)\0", NULL, "TecMagik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_AatennisRomInfo, snes_AatennisRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ABC Monday Night Football (USA) + +static struct BurnRomInfo snes_AbcmnfRomDesc[] = { + { "ABC Monday Night Football (U)(1993)(Data East).sfc", 1048576, 0xe0dc8ad7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Abcmnf) +STD_ROM_FN(snes_Abcmnf) + +struct BurnDriver BurnDrvsnes_Abcmnf = { + "snes_abcmnf", NULL, NULL, NULL, "1993", + "ABC Monday Night Football (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_AbcmnfRomInfo, snes_AbcmnfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ABC Monday Night Football (Japan) + +static struct BurnRomInfo snes_AbcmnfjRomDesc[] = { + { "ABC Monday Night Football (J)(1993)(Data East).sfc", 1048576, 0x24d4cfe9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Abcmnfj) +STD_ROM_FN(snes_Abcmnfj) + +struct BurnDriver BurnDrvsnes_Abcmnfj = { + "snes_abcmnfj", "snes_abcmnf", NULL, NULL, "1993", + "ABC Monday Night Football (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_AbcmnfjRomInfo, snes_AbcmnfjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Accele Brid (Japan) + +static struct BurnRomInfo snes_AccelebridjRomDesc[] = { + { "Accele Brid (J)(1993)(Tommy - Genki).sfc", 2097152, 0x4a736c38, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Accelebridj) +STD_ROM_FN(snes_Accelebridj) + +struct BurnDriver BurnDrvsnes_Accelebridj = { + "snes_accelebridj", "snes_accelebridte", NULL, NULL, "1993", + "Accele Brid (Japan)\0", NULL, "Tommy - Genki", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_AccelebridjRomInfo, snes_AccelebridjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Accele Brid (Hack, English) +// https://www.romhacking.net/translations/718/ +static struct BurnRomInfo snes_AccelebridteRomDesc[] = { + { "Accele Brid T-Eng (2016)(Aeon Genesis).sfc", 2097152, 0x1c4dc36c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Accelebridte) +STD_ROM_FN(snes_Accelebridte) + +struct BurnDriver BurnDrvsnes_Accelebridte = { + "snes_accelebridte", NULL, NULL, NULL, "2016", + "Accele Brid (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_AccelebridteRomInfo, snes_AccelebridteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ace wo Nerae! (Japan) + +static struct BurnRomInfo snes_AceneraejRomDesc[] = { + { "Ace wo Nerae! (J)(1993)(Nippon Telenet).sfc", 1048576, 0x6c5f1a18, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Aceneraej, snes_Aceneraej, snes_dsp1) +STD_ROM_FN(snes_Aceneraej) + +struct BurnDriver BurnDrvsnes_Aceneraej = { + "snes_aceneraej", "snes_aceneraete", "snes_dsp1", NULL, "1993", + "Ace wo Nerae! (Japan)\0", "DSP-1 enhancement chip", "Nippon Telenet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC | GBF_ADV, 0, + SNESGetZipName, snes_AceneraejRomInfo, snes_AceneraejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aim for the Ace! (Hack, English v1.3) +// https://www.romhacking.net/translations/688/ +static struct BurnRomInfo snes_AceneraeteRomDesc[] = { + { "Aim for the Ace! T-Eng v1.3 (2017)(RPGONE).sfc", 1048576, 0x5109e50a, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Aceneraete, snes_Aceneraete, snes_dsp1) +STD_ROM_FN(snes_Aceneraete) + +struct BurnDriver BurnDrvsnes_Aceneraete = { + "snes_aceneraete", NULL, "snes_dsp1", NULL, "2017", + "Aim for the Ace! (Hack, English v1.3)\0", "DSP-1 enhancement chip", "RPGONE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSMISC | GBF_ADV, 0, + SNESGetZipName, snes_AceneraeteRomInfo, snes_AceneraeteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aim for the Ace! (Hack, Spanish) +// https://www.romhacking.net/translations/5417/ +static struct BurnRomInfo snes_AceneraetsRomDesc[] = { + { "Aim for the Ace! T-Spa (2020)(Max1323).sfc", 1048576, 0xb2f1ba23, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Aceneraets, snes_Aceneraets, snes_dsp1) +STD_ROM_FN(snes_Aceneraets) + +struct BurnDriver BurnDrvsnes_Aceneraets = { + "snes_aceneraets", "snes_aceneraete", "snes_dsp1", NULL, "2020", + "Aim for the Ace! (Hack, Spanish)\0", "DSP-1 enhancement chip", "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSMISC | GBF_ADV, 0, + SNESGetZipName, snes_AceneraetsRomInfo, snes_AceneraetsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aero the Acro-Bat (USA) + +static struct BurnRomInfo snes_AcrobatRomDesc[] = { + { "Aero the Acro-Bat (U)(1993)(Sunsoft).sfc", 1048576, 0x919f23cb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Acrobat) +STD_ROM_FN(snes_Acrobat) + +struct BurnDriver BurnDrvsnes_Acrobat = { + "snes_acrobat", NULL, NULL, NULL, "1993", + "Aero the Acro-Bat (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AcrobatRomInfo, snes_AcrobatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aero the Acro-Bat 2 (USA) + +static struct BurnRomInfo snes_Acrobat2RomDesc[] = { + { "Aero the Acro-Bat 2 (U)(1994)(Sunsoft).sfc", 2097152, 0x8c05ed51, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Acrobat2) +STD_ROM_FN(snes_Acrobat2) + +struct BurnDriver BurnDrvsnes_Acrobat2 = { + "snes_acrobat2", NULL, NULL, NULL, "1994", + "Aero the Acro-Bat 2 (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Acrobat2RomInfo, snes_Acrobat2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aero the Acro-Bat 2 (Euro) + +static struct BurnRomInfo snes_Acrobat2eRomDesc[] = { + { "Aero the Acro-Bat 2 (E)(1994)(Sunsoft).sfc", 2097152, 0x242b8181, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Acrobat2e) +STD_ROM_FN(snes_Acrobat2e) + +struct BurnDriver BurnDrvsnes_Acrobat2e = { + "snes_acrobat2e", "snes_acrobat2", NULL, NULL, "1994", + "Aero the Acro-Bat 2 (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Acrobat2eRomInfo, snes_Acrobat2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aero the Acro-Bat (Euro) + +static struct BurnRomInfo snes_AcrobateRomDesc[] = { + { "Aero the Acro-Bat (E)(1993)(Sunsoft).sfc", 1048576, 0xfa0ce63a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Acrobate) +STD_ROM_FN(snes_Acrobate) + +struct BurnDriver BurnDrvsnes_Acrobate = { + "snes_acrobate", "snes_acrobat", NULL, NULL, "1993", + "Aero the Acro-Bat (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AcrobateRomInfo, snes_AcrobateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Acrobat Mission (Japan) + +static struct BurnRomInfo snes_AcromissionRomDesc[] = { + { "Acrobat Mission (J)(1992)(Teichiku).sfc", 1048576, 0x0da18a10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Acromission) +STD_ROM_FN(snes_Acromission) + +struct BurnDriver BurnDrvsnes_Acromission = { + "snes_acromission", NULL, NULL, NULL, "1992", + "Acrobat Mission (Japan)\0", NULL, "Teichiku Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_AcromissionRomInfo, snes_AcromissionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Action Pachio (Japan) + +static struct BurnRomInfo snes_ActionpachioRomDesc[] = { + { "Action Pachio (J)(1993)(Coconuts Japan).sfc", 1048576, 0xc752f5df, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actionpachio) +STD_ROM_FN(snes_Actionpachio) + +struct BurnDriver BurnDrvsnes_Actionpachio = { + "snes_actionpachio", NULL, NULL, NULL, "1993", + "Action Pachio (Japan)\0", NULL, "Coconuts Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ActionpachioRomInfo, snes_ActionpachioRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser (USA) + +static struct BurnRomInfo snes_ActraiserRomDesc[] = { + { "ActRaiser (U)(1991)(Enix - Quintet).sfc", 1048576, 0xeac3358d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiser) +STD_ROM_FN(snes_Actraiser) + +struct BurnDriver BurnDrvsnes_Actraiser = { + "snes_actraiser", NULL, NULL, NULL, "1991", + "ActRaiser (USA)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_ActraiserRomInfo, snes_ActraiserRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser 2 (USA) + +static struct BurnRomInfo snes_Actraiser2RomDesc[] = { + { "ActRaiser 2 (U)(1993)(Enix - Quintet).sfc", 1572864, 0x4901f718, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiser2) +STD_ROM_FN(snes_Actraiser2) + +struct BurnDriver BurnDrvsnes_Actraiser2 = { + "snes_actraiser2", NULL, NULL, NULL, "1993", + "ActRaiser 2 (USA)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Actraiser2RomInfo, snes_Actraiser2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser 2: Chinmoku e no Seisen (Japan) + +static struct BurnRomInfo snes_Actraiser2jRomDesc[] = { + { "ActRaiser 2 - Chinmoku e no Seisen (J)(1993)(Enix).sfc", 1572864, 0x3cbc264f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiser2j) +STD_ROM_FN(snes_Actraiser2j) + +struct BurnDriver BurnDrvsnes_Actraiser2j = { + "snes_actraiser2j", "snes_actraiser2", NULL, NULL, "1993", + "ActRaiser 2: Chinmoku e no Seisen (Japan)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Actraiser2jRomInfo, snes_Actraiser2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser (Euro, English) + +static struct BurnRomInfo snes_ActraisereRomDesc[] = { + { "ActRaiser (E)(1992)(Enix - Quintet).sfc", 1048576, 0x09097b2b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraisere) +STD_ROM_FN(snes_Actraisere) + +struct BurnDriver BurnDrvsnes_Actraisere = { + "snes_actraisere", "snes_actraiser", NULL, NULL, "1992", + "ActRaiser (Euro, English)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_ActraisereRomInfo, snes_ActraisereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser (Euro, French) + +static struct BurnRomInfo snes_ActraiserfRomDesc[] = { + { "ActRaiser (E, France)(1992)(Enix - Quintet).sfc", 1048576, 0xa27e2664, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiserf) +STD_ROM_FN(snes_Actraiserf) + +struct BurnDriver BurnDrvsnes_Actraiserf = { + "snes_actraiserf", "snes_actraiser", NULL, NULL, "1992", + "ActRaiser (Euro, French)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_ActraiserfRomInfo, snes_ActraiserfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ActRaiser (Euro, German) + +static struct BurnRomInfo snes_ActraisergRomDesc[] = { + { "ActRaiser (E, Germany)(1992)(Enix - Quintet).sfc", 1048576, 0x29a78af9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiserg) +STD_ROM_FN(snes_Actraiserg) + +struct BurnDriver BurnDrvsnes_Actraiserg = { + "snes_actraiserg", "snes_actraiser", NULL, NULL, "1992", + "ActRaiser (Euro, German)\0", NULL, "Enix/Quintet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_ActraisergRomInfo, snes_ActraisergRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Actraiser (Japan) + +static struct BurnRomInfo snes_ActraiserjRomDesc[] = { + { "Actraiser (J)(1990)(Enix).sfc", 1048576, 0xbee9b30c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Actraiserj) +STD_ROM_FN(snes_Actraiserj) + +struct BurnDriver BurnDrvsnes_Actraiserj = { + "snes_actraiserj", "snes_actraiser", NULL, NULL, "1990", + "Actraiser (Japan)\0", NULL, "Quintet/Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_ActraiserjRomInfo, snes_ActraiserjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The (USA) + +static struct BurnRomInfo snes_AddfamRomDesc[] = { + { "Addams Family, The (U)(1991)(Ocean).sfc", 1048576, 0x2e8034ab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfam) +STD_ROM_FN(snes_Addfam) + +struct BurnDriver BurnDrvsnes_Addfam = { + "snes_addfam", NULL, NULL, NULL, "1991", + "Addams Family, The (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AddfamRomInfo, snes_AddfamRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The (USA, Alt) + +static struct BurnRomInfo snes_AddfamaRomDesc[] = { + { "Addams Family, The (U, Alt)(1992)(Ocean).sfc", 1048576, 0x6f563adf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfama) +STD_ROM_FN(snes_Addfama) + +struct BurnDriver BurnDrvsnes_Addfama = { + "snes_addfama", "snes_addfam", NULL, NULL, "1992", + "Addams Family, The (USA, Alt)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AddfamaRomInfo, snes_AddfamaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The (Euro) + +static struct BurnRomInfo snes_AddfameRomDesc[] = { + { "Addams Family, The (E)(1991)(Ocean).sfc", 1048576, 0x82497f19, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfame) +STD_ROM_FN(snes_Addfame) + +struct BurnDriver BurnDrvsnes_Addfame = { + "snes_addfame", "snes_addfam", NULL, NULL, "1991", + "Addams Family, The (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AddfameRomInfo, snes_AddfameRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The (Japan) + +static struct BurnRomInfo snes_AddfamjRomDesc[] = { + { "Addams Family, The (J)(1992)(Misawa Ent. - Ocean).sfc", 1048576, 0xcd80351c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfamj) +STD_ROM_FN(snes_Addfamj) + +struct BurnDriver BurnDrvsnes_Addfamj = { + "snes_addfamj", "snes_addfam", NULL, NULL, "1991-92", + "Addams Family, The (Japan)\0", NULL, "Misawa Entertainment - Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AddfamjRomInfo, snes_AddfamjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family Values (USA) + +static struct BurnRomInfo snes_AddfamvaluesRomDesc[] = { + { "Addams Family Values (U)(1994)(Ocean).sfc", 2097152, 0x98b07db8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfamvalues) +STD_ROM_FN(snes_Addfamvalues) + +struct BurnDriver BurnDrvsnes_Addfamvalues = { + "snes_addfamvalues", NULL, NULL, NULL, "1994", + "Addams Family Values (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_AddfamvaluesRomInfo, snes_AddfamvaluesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family Values (Euro) + +static struct BurnRomInfo snes_AddfamvalueseRomDesc[] = { + { "Addams Family Values (E)(1994)(Ocean).sfc", 2097152, 0xae38adb6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfamvaluese) +STD_ROM_FN(snes_Addfamvaluese) + +struct BurnDriver BurnDrvsnes_Addfamvaluese = { + "snes_addfamvaluese", "snes_addfamvalues", NULL, NULL, "1994", + "Addams Family Values (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_AddfamvalueseRomInfo, snes_AddfamvalueseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family Values (Euro) (Hack, Italian) +// https://web.archive.org/web/20200216115336/http://www.berserkdarkness.altervista.org/the-addams-family-snes-trilogy-patch-ita/ +static struct BurnRomInfo snes_AddfamvaluestiRomDesc[] = { + { "Addams Family Values T-Ita (2014)(Wesker90).sfc", 2097152, 0xab82dbc1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Addfamvaluesti) +STD_ROM_FN(snes_Addfamvaluesti) + +struct BurnDriver BurnDrvsnes_Addfamvaluesti = { + "snes_addfamvaluesti", "snes_addfamvalues", NULL, NULL, "2014", + "Addams Family Values (Euro) (Hack, Italian)\0", "To play in Italian you must select it in the options", "Wesker90", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_AddfamvaluestiRomInfo, snes_AddfamvaluestiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of Batman & Robin, The (USA) + +static struct BurnRomInfo snes_AdvbatmanRomDesc[] = { + { "Adventures of Batman & Robin, The (U)(1994)(Konami).sfc", 2097152, 0xb3ef81f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advbatman) +STD_ROM_FN(snes_Advbatman) + +struct BurnDriver BurnDrvsnes_Advbatman = { + "snes_advbatman", NULL, NULL, NULL, "1994", + "Adventures of Batman & Robin, The (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_AdvbatmanRomInfo, snes_AdvbatmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of Dr. Franken, The (USA) + +static struct BurnRomInfo snes_AdvdrfrankRomDesc[] = { + { "Adventures of Dr. Franken, The (U)(1993)(DTMC).sfc", 1048576, 0xcfab3bba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advdrfrank) +STD_ROM_FN(snes_Advdrfrank) + +struct BurnDriver BurnDrvsnes_Advdrfrank = { + "snes_advdrfrank", NULL, NULL, NULL, "1993", + "Adventures of Dr. Franken, The (USA)\0", NULL, "DTMC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AdvdrfrankRomInfo, snes_AdvdrfrankRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hourai Gakuen no Bouken! (Japan) + +static struct BurnRomInfo snes_AdvhouraijRomDesc[] = { + { "Hourai Gakuen no Bouken! (J)(1996)(J-Wing).sfc", 2097152, 0x6299fb1c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advhouraij) +STD_ROM_FN(snes_Advhouraij) + +struct BurnDriver BurnDrvsnes_Advhouraij = { + "snes_advhouraij", "snes_advhouraite", NULL, NULL, "1996", + "Hourai Gakuen no Bouken! (Japan)\0", NULL, "J-Wing", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_AdvhouraijRomInfo, snes_AdvhouraijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of Hourai High, The (Hack, English) +// https://www.romhacking.net/translations/6651/ +static struct BurnRomInfo snes_AdvhouraiteRomDesc[] = { + { "Adventures of Hourai High, The - T-Eng (2022)(Aeon Genesis, advancedpillow).sfc", 3145728, 0x6fd6acdd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advhouraite) +STD_ROM_FN(snes_Advhouraite) + +struct BurnDriver BurnDrvsnes_Advhouraite = { + "snes_advhouraite", NULL, NULL, NULL, "2022", + "Adventures of Hourai High, The (Hack, English)\0", NULL, "Aeon Genesis, advancedpillow", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_AdvhouraiteRomInfo, snes_AdvhouraiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aventuras de Hourai High, Las (Hack, Spanish v1.1) +// https://traduccionessemco.blogspot.com/2021/08/traduccion-de-adventures-of-hourai-high.html +static struct BurnRomInfo snes_AdvhouraitsRomDesc[] = { + { "Adventures of Hourai High, The - T-Spa v1.1 (2022)(semco).sfc", 3145728, 0x9ff58dfa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advhouraits) +STD_ROM_FN(snes_Advhouraits) + +struct BurnDriver BurnDrvsnes_Advhouraits = { + "snes_advhouraits", "snes_advhouraite", NULL, NULL, "2022", + "Aventuras de Hourai High, Las (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_AdvhouraitsRomInfo, snes_AdvhouraitsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of Kid Kleets, The (USA) + +static struct BurnRomInfo snes_AdvkkleetsRomDesc[] = { + { "Adventures of Kid Kleets, The (U)(1994)(Ocean).sfc", 1310720, 0x1664ae48, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advkkleets) +STD_ROM_FN(snes_Advkkleets) + +struct BurnDriver BurnDrvsnes_Advkkleets = { + "snes_advkkleets", NULL, NULL, NULL, "1994", + "Adventures of Kid Kleets, The (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AdvkkleetsRomInfo, snes_AdvkkleetsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of Rocky and Bullwinkle and Friends, The (USA) + +static struct BurnRomInfo snes_AdvsrbfRomDesc[] = { + { "Adventures of Rocky and Bullwinkle and Friends, The (U)(1993)(THQ).sfc", 1048576, 0xdc8f5734, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Advsrbf) +STD_ROM_FN(snes_Advsrbf) + +struct BurnDriver BurnDrvsnes_Advsrbf = { + "snes_advsrbf", NULL, NULL, NULL, "1993", + "Adventures of Rocky and Bullwinkle and Friends, The (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_MINIGAMES, 0, + SNESGetZipName, snes_AdvsrbfRomInfo, snes_AdvsrbfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aerobiz (USA) + +static struct BurnRomInfo snes_AerobizRomDesc[] = { + { "Aerobiz (U)(1992)(Koei).sfc", 1048576, 0x54302a46, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aerobiz) +STD_ROM_FN(snes_Aerobiz) + +struct BurnDriver BurnDrvsnes_Aerobiz = { + "snes_aerobiz", NULL, NULL, NULL, "1992", + "Aerobiz (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_AerobizRomInfo, snes_AerobizRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aerobiz Supersonic (USA) + +static struct BurnRomInfo snes_Aerobiz2RomDesc[] = { + { "Aerobiz Supersonic (U)(1994)(Koei).sfc", 1048576, 0xefafab12, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aerobiz2) +STD_ROM_FN(snes_Aerobiz2) + +struct BurnDriver BurnDrvsnes_Aerobiz2 = { + "snes_aerobiz2", NULL, NULL, NULL, "1994", + "Aerobiz Supersonic (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Aerobiz2RomInfo, snes_Aerobiz2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Air Management II - Koukuu Ou o Mezase (Japan) + +static struct BurnRomInfo snes_Aerobiz2jRomDesc[] = { + { "Air Management II - Koukuu Ou o Mezase (J)(1993)(Koei).sfc", 1048576, 0x8d0b3c85, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aerobiz2j) +STD_ROM_FN(snes_Aerobiz2j) + +struct BurnDriver BurnDrvsnes_Aerobiz2j = { + "snes_aerobiz2j", "snes_aerobiz2", NULL, NULL, "1993", + "Air Management II - Koukuu Ou o Mezase (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Aerobiz2jRomInfo, snes_Aerobiz2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Air Management - Oozora ni Kakeru (Japan) + +static struct BurnRomInfo snes_AerobizjRomDesc[] = { + { "Air Management - Oozora ni Kakeru (J)(1992)(Koei).sfc", 1048576, 0xa533bc97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aerobizj) +STD_ROM_FN(snes_Aerobizj) + +struct BurnDriver BurnDrvsnes_Aerobizj = { + "snes_aerobizj", "snes_aerobiz", NULL, NULL, "1992", + "Air Management - Oozora ni Kakeru (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_AerobizjRomInfo, snes_AerobizjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aero Fighters (USA) + +static struct BurnRomInfo snes_AerofightRomDesc[] = { + { "Aero Fighters (U)(1993)(Mc O'River).sfc", 1310720, 0xf194d00a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aerofight) +STD_ROM_FN(snes_Aerofight) + +struct BurnDriver BurnDrvsnes_Aerofight = { + "snes_aerofight", NULL, NULL, NULL, "1993", + "Aero Fighters (USA)\0", NULL, "Mc O'River", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_AerofightRomInfo, snes_AerofightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Air Cavalry (USA) + +static struct BurnRomInfo snes_AircavarlyRomDesc[] = { + { "Air Cavalry (U)(1994)(Cybersoft).sfc", 1048576, 0x6b452801, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aircavarly) +STD_ROM_FN(snes_Aircavarly) + +struct BurnDriver BurnDrvsnes_Aircavarly = { + "snes_aircavarly", NULL, NULL, NULL, "1994", + "Air Cavalry (USA)\0", NULL, "Cybersoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_AircavarlyRomInfo, snes_AircavarlyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Akumajou Dracula (Japan) + +static struct BurnRomInfo snes_AkudraculaRomDesc[] = { + { "Akumajou Dracula (J)(1991)(Konami).sfc", 1048576, 0xeda59a2a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Akudracula) +STD_ROM_FN(snes_Akudracula) + +struct BurnDriver BurnDrvsnes_Akudracula = { + "snes_akudracula", "snes_supercastlevania4", NULL, NULL, "1991", + "Akumajou Dracula (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_AkudraculaRomInfo, snes_AkudraculaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Akumajou Dracula XX (Japan) + +static struct BurnRomInfo snes_AkudraculaxxRomDesc[] = { + { "Akumajou Dracula XX (J)(1995)(Konami).sfc", 2097152, 0x0aa75fa8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Akudraculaxx) +STD_ROM_FN(snes_Akudraculaxx) + +struct BurnDriver BurnDrvsnes_Akudraculaxx = { + "snes_akudraculaxx", "snes_castlevaniadx", NULL, NULL, "1995", + "Akumajou Dracula XX (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_AkudraculaxxRomInfo, snes_AkudraculaxxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Aladdin (USA) + +static struct BurnRomInfo snes_AladdinRomDesc[] = { + { "Disney's Aladdin (U)(1993)(Capcom).sfc", 1310720, 0x124d8e4d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aladdin) +STD_ROM_FN(snes_Aladdin) + +struct BurnDriver BurnDrvsnes_Aladdin = { + "snes_aladdin", NULL, NULL, NULL, "1993", + "Disney's Aladdin (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AladdinRomInfo, snes_AladdinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Aladdin (Japan) + +static struct BurnRomInfo snes_AladdinjRomDesc[] = { + { "Disney's Aladdin (J)(1993)(Capcom).sfc", 1310720, 0x1aeb696b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aladdinj) +STD_ROM_FN(snes_Aladdinj) + +struct BurnDriver BurnDrvsnes_Aladdinj = { + "snes_aladdinj", "snes_aladdin", NULL, NULL, "1993", + "Disney's Aladdin (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AladdinjRomInfo, snes_AladdinjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Albert Odyssey (Japan) + +static struct BurnRomInfo snes_AlbertodsjRomDesc[] = { + { "Albert Odyssey (J)(1993)(Sunsoft).sfc", 1048576, 0x46ca01a9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Albertodsj) +STD_ROM_FN(snes_Albertodsj) + +struct BurnDriver BurnDrvsnes_Albertodsj = { + "snes_albertodsj", "snes_albertodste", NULL, NULL, "1993", + "Albert Odyssey (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_AlbertodsjRomInfo, snes_AlbertodsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Albert Odyssey (Hack, English) +// https://github.com/PeterLemon/SNES/tree/master/Translate +static struct BurnRomInfo snes_AlbertodsteRomDesc[] = { + { "Albert Odyssey T-Eng (2018)(Peter Lemon).sfc", 1048576, 0x4da25b13, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Albertodste) +STD_ROM_FN(snes_Albertodste) + +struct BurnDriver BurnDrvsnes_Albertodste = { + "snes_albertodste", NULL, NULL, NULL, "2018", + "Albert Odyssey (Hack, English)\0", NULL, "Peter Lemon", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_AlbertodsteRomInfo, snes_AlbertodsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alcahest (Japan) + +static struct BurnRomInfo snes_AlcahestjRomDesc[] = { + { "Alcahest (J)(1993)(Squaresoft).sfc", 1048576, 0x870427d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alcahestj) +STD_ROM_FN(snes_Alcahestj) + +struct BurnDriver BurnDrvsnes_Alcahestj = { + "snes_alcahestj", "snes_alcahestte", NULL, NULL, "1993", + "Alcahest (Japan)\0", NULL, "Squaresoft - HAL Lab.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_AlcahestjRomInfo, snes_AlcahestjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alcahest (Hack, English) +// https://www.romhacking.net/translations/2286/ +static struct BurnRomInfo snes_AlcahestteRomDesc[] = { + { "Alcahest T-Eng (2014)(KingMike's Translations).sfc", 1179648, 0x5caed89c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alcahestte) +STD_ROM_FN(snes_Alcahestte) + +struct BurnDriver BurnDrvsnes_Alcahestte = { + "snes_alcahestte", NULL, NULL, NULL, "2014", + "Alcahest (Hack, English)\0", NULL, "KingMike's Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_AlcahestteRomInfo, snes_AlcahestteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alfred Chicken (Euro) + +static struct BurnRomInfo snes_AlfchickenRomDesc[] = { + { "Alfred Chicken (E)(1993)(Mindscape).sfc", 1048576, 0xe344627b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alfchicken) +STD_ROM_FN(snes_Alfchicken) + +struct BurnDriver BurnDrvsnes_Alfchicken = { + "snes_alfchicken", "snes_supalfchic", NULL, NULL, "1993", + "Alfred Chicken (Euro)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AlfchickenRomInfo, snes_AlfchickenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien 3 (USA) + +static struct BurnRomInfo snes_Alien3RomDesc[] = { + { "Alien 3 (U)(1993)(Acclaim Ent. - Probe).sfc", 1048576, 0x98e2ac15, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alien3) +STD_ROM_FN(snes_Alien3) + +struct BurnDriver BurnDrvsnes_Alien3 = { + "snes_alien3", NULL, NULL, NULL, "1993", + "Alien 3 (USA)\0", NULL, "Acclaim Entertainment - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Alien3RomInfo, snes_Alien3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien 3 (USA, Alt) + +static struct BurnRomInfo snes_Alien3aRomDesc[] = { + { "Alien 3 (U, Alt)(1993)(Ljn - Probe).sfc", 1048576, 0x9cce2eb7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alien3a) +STD_ROM_FN(snes_Alien3a) + +struct BurnDriver BurnDrvsnes_Alien3a = { + "snes_alien3a", "snes_alien3", NULL, NULL, "1993", + "Alien 3 (USA, Alt)\0", NULL, "Ljn - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Alien3aRomInfo, snes_Alien3aRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien 3 (Euro) + +static struct BurnRomInfo snes_Alien3eRomDesc[] = { + { "Alien 3 (E)(1993)(Acclaim Ent. - Probe).sfc", 1048576, 0x378613b0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alien3e) +STD_ROM_FN(snes_Alien3e) + +struct BurnDriver BurnDrvsnes_Alien3e = { + "snes_alien3e", "snes_alien3", NULL, NULL, "1993", + "Alien 3 (Euro)\0", NULL, "Acclaim Entertainment - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Alien3eRomInfo, snes_Alien3eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien 3 (Japan) + +static struct BurnRomInfo snes_Alien3jRomDesc[] = { + { "Alien 3 (J)(1993)(Acclaim Entertainment).sfc", 1048576, 0x8a21b63f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alien3j) +STD_ROM_FN(snes_Alien3j) + +struct BurnDriver BurnDrvsnes_Alien3j = { + "snes_alien3j", "snes_alien3", NULL, NULL, "1993", + "Alien 3 (Japan)\0", NULL, "Acclaim Entertainment - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Alien3jRomInfo, snes_Alien3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien vs. Predator (USA) + +static struct BurnRomInfo snes_AlienvspredRomDesc[] = { + { "Alien vs. Predator (U)(1993)(Activision).sfc", 1048576, 0x1803cf20, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alienvspred) +STD_ROM_FN(snes_Alienvspred) + +struct BurnDriver BurnDrvsnes_Alienvspred = { + "snes_alienvspred", NULL, NULL, NULL, "1993", + "Alien vs. Predator (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_AlienvspredRomInfo, snes_AlienvspredRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aliens vs. Predator (Japan) + +static struct BurnRomInfo snes_AlienvspredjRomDesc[] = { + { "Aliens vs. Predator (J)(1993)(IGS).sfc", 1048576, 0x2d5876ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alienvspredj) +STD_ROM_FN(snes_Alienvspredj) + +struct BurnDriver BurnDrvsnes_Alienvspredj = { + "snes_alienvspredj", "snes_alienvspred", NULL, NULL, "1993", + "Aliens vs. Predator (Japan)\0", NULL, "IGS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_AlienvspredjRomInfo, snes_AlienvspredjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Al Unser Jr.'s Road to the Top (USA) + +static struct BurnRomInfo snes_AlunserjrRomDesc[] = { + { "Al Unser Jr.'s Road to the Top (U)(1994)(Software Toolworks).sfc", 1048576, 0xd0550624, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alunserjr) +STD_ROM_FN(snes_Alunserjr) + +struct BurnDriver BurnDrvsnes_Alunserjr = { + "snes_alunserjr", NULL, NULL, NULL, "1994", + "Al Unser Jr.'s Road to the Top (USA)\0", NULL, "Software Toolworks", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_AlunserjrRomInfo, snes_AlunserjrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// American Battle Dome (Japan) + +static struct BurnRomInfo snes_AmebtldomeRomDesc[] = { + { "American Battle Dome (J)(1995)(Tsukuda Original).sfc", 1048576, 0x61753981, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Amebtldome) +STD_ROM_FN(snes_Amebtldome) + +struct BurnDriver BurnDrvsnes_Amebtldome = { + "snes_amebtldome", NULL, NULL, NULL, "1995", + "American Battle Dome (Japan)\0", NULL, "Tsukuda Original", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_ACTION | GBF_PINBALL, 0, + SNESGetZipName, snes_AmebtldomeRomInfo, snes_AmebtldomeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// American Gladiators (USA) + +static struct BurnRomInfo snes_AmergladsRomDesc[] = { + { "American Gladiators (U)(1992)(GameTek).sfc", 1048576, 0x76b151fd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Amerglads) +STD_ROM_FN(snes_Amerglads) + +struct BurnDriver BurnDrvsnes_Amerglads = { + "snes_amerglads", NULL, NULL, NULL, "1992", + "American Gladiators (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_AmergladsRomInfo, snes_AmergladsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Amazing Spider-Man, The - Lethal Foes (Japan) + +static struct BurnRomInfo snes_AmspidermanjRomDesc[] = { + { "Amazing Spider-Man, The - Lethal Foes (J)(1994)(Epoch).sfc", 1572864, 0x82f7f710, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Amspidermanj) +STD_ROM_FN(snes_Amspidermanj) + +struct BurnDriver BurnDrvsnes_Amspidermanj = { + "snes_amspidermanj", "snes_amspidermante", NULL, NULL, "1994", + "Amazing Spider-Man, The - Lethal Foes (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AmspidermanjRomInfo, snes_AmspidermanjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Amazing Spider-Man, The - Lethal Foes (Hack, English) +// https://www.romhacking.net/reviews/6327/ +static struct BurnRomInfo snes_AmspidermanteRomDesc[] = { + { "Amazing Spider-Man, The - Lethal Foes T-Eng (2016)(gorgyrip).sfc", 2097152, 0x27e59025, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Amspidermante) +STD_ROM_FN(snes_Amspidermante) + +struct BurnDriver BurnDrvsnes_Amspidermante = { + "snes_amspidermante", NULL, NULL, NULL, "2016", + "Amazing Spider-Man, The - Lethal Foes (Hack, English)\0", NULL, "gorgyrip", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AmspidermanteRomInfo, snes_AmspidermanteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Animaniacs (USA) + +static struct BurnRomInfo snes_AnimaniacsRomDesc[] = { + { "Animaniacs (U)(1994)(Konami).sfc", 1048576, 0xcf0f14d2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Animaniacs) +STD_ROM_FN(snes_Animaniacs) + +struct BurnDriver BurnDrvsnes_Animaniacs = { + "snes_animaniacs", NULL, NULL, NULL, "1994", + "Animaniacs (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AnimaniacsRomInfo, snes_AnimaniacsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Animaniacs (Japan) + +static struct BurnRomInfo snes_AnimaniacsjRomDesc[] = { + { "Animaniacs (J)(1997)(Konami).sfc", 1048576, 0xd93e07a8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Animaniacsj) +STD_ROM_FN(snes_Animaniacsj) + +struct BurnDriver BurnDrvsnes_Animaniacsj = { + "snes_animaniacsj", "snes_animaniacs", NULL, NULL, "1997", + "Animaniacs (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AnimaniacsjRomInfo, snes_AnimaniacsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Another World (Euro) + +static struct BurnRomInfo snes_AnotherworldRomDesc[] = { + { "Another World (E)(1992)(Interplay - Delphine Software).sfc", 1048576, 0x83b40af2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Anotherworld) +STD_ROM_FN(snes_Anotherworld) + +struct BurnDriver BurnDrvsnes_Anotherworld = { + "snes_anotherworld", "snes_outofthisworld", NULL, NULL, "1992", + "Another World (Euro)\0", NULL, "Interplay - Delphine Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_AnotherworldRomInfo, snes_AnotherworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Apocalypse II (E, Prototype) + +static struct BurnRomInfo snes_Apocalypse2protoRomDesc[] = { + { "Apocalypse II (E, Proto)(1997)(Tepco).sfc", 1048576, 0x93557c67, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Apocalypse2proto) +STD_ROM_FN(snes_Apocalypse2proto) + +struct BurnDriver BurnDrvsnes_Apocalypse2proto = { + "snes_apocalypse2proto", NULL, NULL, NULL, "1997", + "Apocalypse II (E, Prototype)\0", NULL, "Tepco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 4, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_Apocalypse2protoRomInfo, snes_Apocalypse2protoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Appleseed: Prometheus no Shintaku (Japan) + +static struct BurnRomInfo snes_AppleseedjRomDesc[] = { + { "Appleseed - Prometheus no Shintaku (J)(1994)(Visit).sfc", 2097152, 0xc0e62c02, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Appleseedj) +STD_ROM_FN(snes_Appleseedj) + +struct BurnDriver BurnDrvsnes_Appleseedj = { + "snes_appleseedj", NULL, NULL, NULL, "1994", + "Appleseed: Prometheus no Shintaku (Japan)\0", NULL, "Visit", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_AppleseedjRomInfo, snes_AppleseedjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aqutallion (Japan) + +static struct BurnRomInfo snes_AqutallionRomDesc[] = { + { "Aqutallion (J)(1993)(Tecmo).sfc", 1048576, 0x4ca1696f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aqutallion) +STD_ROM_FN(snes_Aqutallion) + +struct BurnDriver BurnDrvsnes_Aqutallion = { + "snes_aqutallion", "snes_secrstars", NULL, NULL, "1993", + "Aqutallion (Japan)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_AqutallionRomInfo, snes_AqutallionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arabian Nights - Sabaku no Seirei Ou (Japan) + +static struct BurnRomInfo snes_ArabnightsjRomDesc[] = { + { "Arabian Nights - Sabaku no Seirei Ou (J)(1996)(Takara - Pandora Box).sfc", 2621440, 0xb6dbf57b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arabnightsj) +STD_ROM_FN(snes_Arabnightsj) + +struct BurnDriver BurnDrvsnes_Arabnightsj = { + "snes_arabnightsj", "snes_arabnightste", NULL, NULL, "1996", + "Arabian Nights - Sabaku no Seirei Ou (Japan)\0", NULL, "Takara - Pandora Box", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArabnightsjRomInfo, snes_ArabnightsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arabian Nights - Desert Spirit King (Hack, English) +// https://www.romhacking.net/translations/1785/ +static struct BurnRomInfo snes_ArabnightsteRomDesc[] = { + { "Arabian Nights - Desert Spirit King T-Eng (2013)(LostTemplar).sfc", 3145728, 0xbe092358, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arabnightste) +STD_ROM_FN(snes_Arabnightste) + +struct BurnDriver BurnDrvsnes_Arabnightste = { + "snes_arabnightste", NULL, NULL, NULL, "2013", + "Arabian Nights - Desert Spirit King (Hack, English)\0", NULL, "LostTemplar", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArabnightsteRomInfo, snes_ArabnightsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Araiguma Rascal (Japan) + +static struct BurnRomInfo snes_ArarascalRomDesc[] = { + { "Araiguma Rascal (J)(1994)(NCS - Masaya).sfc", 1048576, 0xde13ec70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ararascal) +STD_ROM_FN(snes_Ararascal) + +struct BurnDriver BurnDrvsnes_Ararascal = { + "snes_ararascal", "snes_racrascal", NULL, NULL, "1994", + "Araiguma Rascal (Japan)\0", NULL, "NCS - Masaya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_ArarascalRomInfo, snes_ArarascalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arcana (USA) + +static struct BurnRomInfo snes_ArcanaRomDesc[] = { + { "Arcana (U)(1992)(HAL Laboratory).sfc", 1048576, 0xc891b297, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arcana) +STD_ROM_FN(snes_Arcana) + +struct BurnDriver BurnDrvsnes_Arcana = { + "snes_arcana", NULL, NULL, NULL, "1992", + "Arcana (USA)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_ArcanaRomInfo, snes_ArcanaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arcus Spirits (Japan) + +static struct BurnRomInfo snes_ArcusspiritsRomDesc[] = { + { "Arcus Spirits (J)(1993)(Sammy - Wolf Team).sfc", 1310720, 0xc9067671, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arcusspirits) +STD_ROM_FN(snes_Arcusspirits) + +struct BurnDriver BurnDrvsnes_Arcusspirits = { + "snes_arcusspirits", "snes_arcusspiritsp", NULL, NULL, "1993", + "Arcus Spirits (Japan)\0", NULL, "Sammy - Wolf Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_ArcusspiritsRomInfo, snes_ArcusspiritsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + + +// Arcus Spirits (USA, Prototype) + +static struct BurnRomInfo snes_ArcusspiritspRomDesc[] = { + { "Arcus Spirits (U, Proto)(1993)(Wolf Team).sfc", 1572864, 0x184ef398, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arcusspiritsp) +STD_ROM_FN(snes_Arcusspiritsp) + +struct BurnDriver BurnDrvsnes_Arcusspiritsp = { + "snes_arcusspiritsp", NULL, NULL, NULL, "1993", + "Arcus Spirits (USA, Prototype)\0", NULL, "Wolf Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_ArcusspiritspRomInfo, snes_ArcusspiritspRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ardy Lightfoot (USA) + +static struct BurnRomInfo snes_ArdylfootRomDesc[] = { + { "Ardy Lightfoot (U)(1994)(Titus - ASCII).sfc", 1048576, 0x51a5f489, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ardylfoot) +STD_ROM_FN(snes_Ardylfoot) + +struct BurnDriver BurnDrvsnes_Ardylfoot = { + "snes_ardylfoot", NULL, NULL, NULL, "1994", + "Ardy Lightfoot (USA)\0", NULL, "Titus - ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ArdylfootRomInfo, snes_ArdylfootRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ardy Lightfoot (Japan) + +static struct BurnRomInfo snes_ArdylfootjRomDesc[] = { + { "Ardy Lightfoot (J)(1993)(ASCII).sfc", 1048576, 0x2aa7777b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ardylfootj) +STD_ROM_FN(snes_Ardylfootj) + +struct BurnDriver BurnDrvsnes_Ardylfootj = { + "snes_ardylfootj", "snes_ardylfoot", NULL, NULL, "1993", + "Ardy Lightfoot (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ArdylfootjRomInfo, snes_ArdylfootjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Area 88 (Japan) + +static struct BurnRomInfo snes_Area88RomDesc[] = { + { "Area 88 (J)(1991)(Capcom).sfc", 1048576, 0x06388f71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Area88) +STD_ROM_FN(snes_Area88) + +struct BurnDriver BurnDrvsnes_Area88 = { + "snes_area88", "snes_unsquadron", NULL, NULL, "1991", + "Area 88 (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Area88RomInfo, snes_Area88RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Art of Fighting (USA) + +static struct BurnRomInfo snes_AofRomDesc[] = { + { "Art of Fighting (U)(1993)(Takara - Monolith).sfc", 2097152, 0x9fa74067, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aof) +STD_ROM_FN(snes_Aof) + +struct BurnDriver BurnDrvsnes_Aof = { + "snes_aof", NULL, NULL, NULL, "1993", + "Art of Fighting (USA)\0", NULL, "Takara Co. - Monolith", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_AofRomInfo, snes_AofRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aretha II: Ariel no Fushigi na Tabi (Japan) + +static struct BurnRomInfo snes_ArethaiijRomDesc[] = { + { "Aretha II - Ariel no Fushigi na Tabi (J)(1994)(Yanoman).sfc", 2097152, 0xff63ec26, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arethaiij) +STD_ROM_FN(snes_Arethaiij) + +struct BurnDriver BurnDrvsnes_Arethaiij = { + "snes_arethaiij", "snes_arethaiite", NULL, NULL, "1994", + "Aretha II: Ariel no Fushigi na Tabi (Japan)\0", NULL, "Yanoman", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArethaiijRomInfo, snes_ArethaiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aretha II: Ariel's Wonderful Adventure (Hack, English v0.91) +// https://www.romhacking.net/translations/5420/ +static struct BurnRomInfo snes_ArethaiiteRomDesc[] = { + { "Aretha II - Ariel's Wonderful Adventure T-Eng v0.91 (2020)(Dynamic-Designs).sfc", 3145728, 0x66e4f525, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arethaiite) +STD_ROM_FN(snes_Arethaiite) + +struct BurnDriver BurnDrvsnes_Arethaiite = { + "snes_arethaiite", NULL, NULL, NULL, "2020", + "Aretha II: Ariel's Wonderful Adventure (Hack, English v0.91)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArethaiiteRomInfo, snes_ArethaiiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aretha (Japan) + +static struct BurnRomInfo snes_ArethajRomDesc[] = { + { "Aretha (J)(1993)(Yanoman).sfc", 2097152, 0x395bade3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arethaj) +STD_ROM_FN(snes_Arethaj) + +struct BurnDriver BurnDrvsnes_Arethaj = { + "snes_arethaj", "snes_arethate", NULL, NULL, "1993", + "Aretha (Japan)\0", NULL, "Yanoman", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArethajRomInfo, snes_ArethajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Aretha (Hack, English) +// https://www.romhacking.net/translations/3836/ +static struct BurnRomInfo snes_ArethateRomDesc[] = { + { "Aretha T-Eng (2018)(Dynamic-Designs).sfc", 2621440, 0x69abc8d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arethate) +STD_ROM_FN(snes_Arethate) + +struct BurnDriver BurnDrvsnes_Arethate = { + "snes_arethate", NULL, NULL, NULL, "2018", + "Aretha (Hack, English)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ArethateRomInfo, snes_ArethateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arkanoid - Doh It Again (USA) + +static struct BurnRomInfo snes_Arkanoid2RomDesc[] = { + { "Arkanoid - Doh It Again (U)(1997)(Taito).sfc", 524288, 0xb50503a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arkanoid2) +STD_ROM_FN(snes_Arkanoid2) + +struct BurnDriver BurnDrvsnes_Arkanoid2 = { + "snes_arkanoid2", NULL, NULL, NULL, "1997", + "Arkanoid - Doh It Again (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_Arkanoid2RomInfo, snes_Arkanoid2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ashita no Joe (Japan) + +static struct BurnRomInfo snes_AshitanojoeRomDesc[] = { + { "Ashita no Joe (J)(1992)(K Amusement Leasing).sfc", 1048576, 0x6b54be97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ashitanojoe) +STD_ROM_FN(snes_Ashitanojoe) + +struct BurnDriver BurnDrvsnes_Ashitanojoe = { + "snes_ashitanojoe", "snes_tomorrowjoe", NULL, NULL, "1992", + "Ashita no Joe (Japan)\0", NULL, "K. Amusement Leasing", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_AshitanojoeRomInfo, snes_AshitanojoeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// A.S.P. - Air Strike Patrol (USA) + +static struct BurnRomInfo snes_AspRomDesc[] = { + { "A.S.P. - Air Strike Patrol (U)(1994)(Seta).sfc", 1048576, 0x05c0da54, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Asp) +STD_ROM_FN(snes_Asp) + +struct BurnDriver BurnDrvsnes_Asp = { + "snes_asp", NULL, NULL, NULL, "1994", + "A.S.P. - Air Strike Patrol (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_AspRomInfo, snes_AspRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Assault Suits Valken (Japan) + +static struct BurnRomInfo snes_AssaultsvjRomDesc[] = { + { "Assault Suits Valken (J)(1992)(NCS - Masaya).sfc", 1048576, 0xa5f63557, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Assaultsvj) +STD_ROM_FN(snes_Assaultsvj) + +struct BurnDriver BurnDrvsnes_Assaultsvj = { + "snes_assaultsvj", "snes_cybernator", NULL, NULL, "1992", + "Assault Suits Valken (Japan)\0", NULL, "NCS - Masaya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_AssaultsvjRomInfo, snes_AssaultsvjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Assault Suits Valken (Hack, English) +// https://aeongenesis.net/projects/asv +static struct BurnRomInfo snes_AssaultsvteRomDesc[] = { + { "Assault Suits Valken T-Eng (2004)(Aeon Genesis).sfc", 1049088, 0x878e3d48, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Assaultsvte) +STD_ROM_FN(snes_Assaultsvte) + +struct BurnDriver BurnDrvsnes_Assaultsvte = { + "snes_assaultsvte", "snes_cybernator", NULL, NULL, "2004", + "Assault Suits Valken (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_AssaultsvteRomInfo, snes_AssaultsvteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Asterix (Euro) + +static struct BurnRomInfo snes_AsterixRomDesc[] = { + { "Asterix (E)(1993)(Infogrames).sfc", 524288, 0x5ddedc28, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Asterix) +STD_ROM_FN(snes_Asterix) + +struct BurnDriver BurnDrvsnes_Asterix = { + "snes_asterix", NULL, NULL, NULL, "1993", + "Asterix (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AsterixRomInfo, snes_AsterixRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Asterix & Obelix (Euro) + +static struct BurnRomInfo snes_AsterixobelixRomDesc[] = { + { "Asterix & Obelix (E)(1995)(Infogrames).sfc", 1572864, 0x83af6152, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Asterixobelix) +STD_ROM_FN(snes_Asterixobelix) + +struct BurnDriver BurnDrvsnes_Asterixobelix = { + "snes_asterixobelix", NULL, NULL, NULL, "1995", + "Asterix & Obelix (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AsterixobelixRomInfo, snes_AsterixobelixRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Atmosfear (USA, Prototype) + +static struct BurnRomInfo snes_AtmosfearpRomDesc[] = { + { "Atmosfear (U, Proto)(1994)(Beam Software).sfc", 2097152, 0x22f9b260, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Atmosfearp) +STD_ROM_FN(snes_Atmosfearp) + +struct BurnDriver BurnDrvsnes_Atmosfearp = { + "snes_atmosfearp", NULL, NULL, NULL, "1994", + "Atmosfear (USA, Prototype)\0", NULL, "Beam Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_AtmosfearpRomInfo, snes_AtmosfearpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Astral Bout, Sougou Kakutougi (Japan) + +static struct BurnRomInfo snes_AstralboutjRomDesc[] = { + { "Astral Bout (J)(1992)(King Records).sfc", 1048576, 0xe87bd7ec, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Astralboutj) +STD_ROM_FN(snes_Astralboutj) + +struct BurnDriver BurnDrvsnes_Astralboutj = { + "snes_astralboutj", NULL, NULL, NULL, "1992", + "Astral Bout, Sougou Kakutougi (Japan)\0", NULL, "King Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_AstralboutjRomInfo, snes_AstralboutjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Uchuu Race - Astro Go! Go! (Japan) + +static struct BurnRomInfo snes_AstrogogoRomDesc[] = { + { "Uchuu Race - Astro Go! Go! (J)(1994)(Meldac - Kaze).sfc", 1048576, 0xe949d47f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Astrogogo) +STD_ROM_FN(snes_Astrogogo) + +struct BurnDriver BurnDrvsnes_Astrogogo = { + "snes_astrogogo", NULL, NULL, NULL, "1994", + "Uchuu Race - Astro Go! Go! (Japan)\0", NULL, "Meldac - Kaze", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_AstrogogoRomInfo, snes_AstrogogoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Axelay (USA) + +static struct BurnRomInfo snes_AxelayRomDesc[] = { + { "Axelay (U)(1992)(Konami).sfc", 1048576, 0xf812b533, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Axelay) +STD_ROM_FN(snes_Axelay) + +struct BurnDriver BurnDrvsnes_Axelay = { + "snes_axelay", NULL, NULL, NULL, "1992", + "Axelay (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_AxelayRomInfo, snes_AxelayRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Axelay (Euro) + +static struct BurnRomInfo snes_AxelayeRomDesc[] = { + { "Axelay (E)(1992)(Konami).sfc", 1048576, 0xf43f6743, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Axelaye) +STD_ROM_FN(snes_Axelaye) + +struct BurnDriver BurnDrvsnes_Axelaye = { + "snes_axelaye", "snes_axelay", NULL, NULL, "1992", + "Axelay (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_AxelayeRomInfo, snes_AxelayeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Axelay (Japan) + +static struct BurnRomInfo snes_AxelayjRomDesc[] = { + { "Axelay (J)(1992)(Konami).sfc", 1048576, 0xb0a02734, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Axelayj) +STD_ROM_FN(snes_Axelayj) + +struct BurnDriver BurnDrvsnes_Axelayj = { + "snes_axelayj", "snes_axelay", NULL, NULL, "1992", + "Axelay (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_AxelayjRomInfo, snes_AxelayjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bahamut Lagoon (Japan) + +static struct BurnRomInfo snes_BahalagoonjRomDesc[] = { + { "Bahamut Lagoon (Japan)(1996)(Squaresoft).sfc", 3145728, 0x1b83c440, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bahalagoonj) +STD_ROM_FN(snes_Bahalagoonj) + +struct BurnDriver BurnDrvsnes_Bahalagoonj = { + "snes_bahalagoonj", "snes_bahalagoonte", NULL, NULL, "1996", + "Bahamut Lagoon (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_BahalagoonjRomInfo, snes_BahalagoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bahamut Lagoon (Hack, English v1.3) +// https://dejap.eludevisibility.org/bl.php +static struct BurnRomInfo snes_BahalagoonteRomDesc[] = { + { "Bahamut Lagoon T-Eng v1.3 (2002)(DeJap Translations).sfc", 3145728, 0x48922837, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bahalagoonte) +STD_ROM_FN(snes_Bahalagoonte) + +struct BurnDriver BurnDrvsnes_Bahalagoonte = { + "snes_bahalagoonte", NULL, NULL, NULL, "2002", + "Bahamut Lagoon (Hack, English v1.3)\0", NULL, "DeJap Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_BahalagoonteRomInfo, snes_BahalagoonteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bahamut Lagoon (Hack, Spanish v1.03a) +// https://crackowia.com/bahamuts.html +static struct BurnRomInfo snes_BahalagoontsRomDesc[] = { + { "Bahamut Lagoon T-Spa v1.03a (2022)(Rod Merida).sfc", 8388608, 0x04a290fa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bahalagoonts) +STD_ROM_FN(snes_Bahalagoonts) + +struct BurnDriver BurnDrvsnes_Bahalagoonts = { + "snes_bahalagoonts", "snes_bahalagoonte", NULL, NULL, "2022", + "Bahamut Lagoon (Hack, Spanish v1.03a)\0", NULL, "Rod Merida", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_BahalagoontsRomInfo, snes_BahalagoontsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ballz 3D - Fighting at Its Ballziest (USA) + +static struct BurnRomInfo snes_Ballz3dRomDesc[] = { + { "Ballz 3D - Fighting at Its Ballziest (U)(1994)(Accolade).sfc", 1048576, 0x1c058b7d, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Ballz3d, snes_Ballz3d, snes_dsp1b) +STD_ROM_FN(snes_Ballz3d) + +struct BurnDriver BurnDrvsnes_Ballz3d = { + "snes_ballz3d", NULL, "snes_dsp1b", NULL, "1994", + "Ballz 3D - Fighting at Its Ballziest (USA)\0", "DSP-1B enhancement chip", "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ballz3dRomInfo, snes_Ballz3dRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Barkley Shut Up and Jam! (USA) + +static struct BurnRomInfo snes_BarkleyRomDesc[] = { + { "Barkley Shut Up and Jam! (U)(1994)(Accolade).sfc", 1572864, 0x726b6c5a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Barkley) +STD_ROM_FN(snes_Barkley) + +struct BurnDriver BurnDrvsnes_Barkley = { + "snes_barkley", NULL, NULL, NULL, "1994", + "Barkley Shut Up and Jam! (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BarkleyRomInfo, snes_BarkleyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Barkley no Power Dunk (Japan) + +static struct BurnRomInfo snes_BarkleyjRomDesc[] = { + { "Barkley no Power Dunk (J)(1994)(Den'Z).sfc", 1572864, 0x8aff96d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Barkleyj) +STD_ROM_FN(snes_Barkleyj) + +struct BurnDriver BurnDrvsnes_Barkleyj = { + "snes_barkleyj", "snes_barkley", NULL, NULL, "1994", + "Barkley no Power Dunk (Japan)\0", NULL, "Den'Z", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BarkleyjRomInfo, snes_BarkleyjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bassin's Black Bass (USA) + +static struct BurnRomInfo snes_BassinblackbassRomDesc[] = { + { "Bassin's Black Bass (U)(1994)(Hot-B).sfc", 2097152, 0x7dc5b7b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bassinblackbass) +STD_ROM_FN(snes_Bassinblackbass) + +struct BurnDriver BurnDrvsnes_Bassinblackbass = { + "snes_bassinblackbass", NULL, NULL, NULL, "1994", + "Bassin's Black Bass (USA)\0", NULL, "Hot-B", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BassinblackbassRomInfo, snes_BassinblackbassRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bastard!! - Ankoku no Hakai-shin (Japan) + +static struct BurnRomInfo snes_BastardjRomDesc[] = { + { "Bastard!! - Ankoku no Hakai-shin (J)(1994)(Cobra Team).sfc", 1572864, 0x6742d51c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bastardj) +STD_ROM_FN(snes_Bastardj) + +struct BurnDriver BurnDrvsnes_Bastardj = { + "snes_bastardj", "snes_bastardte", NULL, NULL, "1994", + "Bastard!! - Ankoku no Hakai-shin (Japan)\0", NULL, "Cobra Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_BastardjRomInfo, snes_BastardjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bastard!! - Dark God of Destruction (Hack, English - 'Easy Spells') +// https://www.romhacking.net/translations/3398/ +static struct BurnRomInfo snes_BastardteRomDesc[] = { + { "Bastard!! - Dark God of Destruction T-Eng 'Easy Spells' (2017)(DeJap Translations, Docrow).sfc", 2097664, 0x564504cf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bastardte) +STD_ROM_FN(snes_Bastardte) + +struct BurnDriver BurnDrvsnes_Bastardte = { + "snes_bastardte", NULL, NULL, NULL, "2017", + "Bastard!! - Dark God of Destruction (Hack, English - 'Easy Spells')\0", NULL, "DeJap Translations, Docrow", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_BastardteRomInfo, snes_BastardteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Batman Forever (USA) + +static struct BurnRomInfo snes_BatmanforeverRomDesc[] = { + { "Batman Forever (U)(1995)(Acclaim Entertainment).sfc", 3145728, 0xb9770c4d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Batmanforever) +STD_ROM_FN(snes_Batmanforever) + +struct BurnDriver BurnDrvsnes_Batmanforever = { + "snes_batmanforever", NULL, NULL, NULL, "1995", + "Batman Forever (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BatmanforeverRomInfo, snes_BatmanforeverRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Batman Returns (USA) + +static struct BurnRomInfo snes_BatmanreturnsRomDesc[] = { + { "Batman Returns (U)(1993)(Konami).sfc", 1048576, 0xe87dfdf6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Batmanreturns) +STD_ROM_FN(snes_Batmanreturns) + +struct BurnDriver BurnDrvsnes_Batmanreturns = { + "snes_batmanreturns", NULL, NULL, NULL, "1993", + "Batman Returns (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BatmanreturnsRomInfo, snes_BatmanreturnsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Batman - Revenge of the Joker (USA, Prototype) + +static struct BurnRomInfo snes_BatmanrjpRomDesc[] = { + { "Batman - Revenge of the Joker (U, Proto)(1992)(Sunsoft).sfc", 1048576, 0x205654dd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Batmanrjp) +STD_ROM_FN(snes_Batmanrjp) + +struct BurnDriver BurnDrvsnes_Batmanrjp = { + "snes_batmanrjp", NULL, NULL, NULL, "1992", + "Batman - Revenge of the Joker (USA, Prototype)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BatmanrjpRomInfo, snes_BatmanrjpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Cars (USA) + +static struct BurnRomInfo snes_BattlecarsRomDesc[] = { + { "Battle Cars (U)(1993)(Namco).sfc", 1048576, 0x46043454, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlecars) +STD_ROM_FN(snes_Battlecars) + +struct BurnDriver BurnDrvsnes_Battlecars = { + "snes_battlecars", NULL, NULL, NULL, "1993", + "Battle Cars (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BattlecarsRomInfo, snes_BattlecarsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Clash (USA) + +static struct BurnRomInfo snes_BattleclashRomDesc[] = { + { "Battle Clash (U)(1992)(Nintendo).sfc", 1048576, 0x59c00310, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battleclash) +STD_ROM_FN(snes_Battleclash) + +struct BurnDriver BurnDrvsnes_Battleclash = { + "snes_battleclash", NULL, NULL, NULL, "1992", + "Battle Clash (USA)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_BattleclashRomInfo, snes_BattleclashRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Clash (Euro) + +static struct BurnRomInfo snes_BattleclasheRomDesc[] = { + { "Battle Clash (E)(1992)(Nintendo).sfc", 1048576, 0x11e5bc5e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battleclashe) +STD_ROM_FN(snes_Battleclashe) + +struct BurnDriver BurnDrvsnes_Battleclashe = { + "snes_battleclashe", "snes_battleclash", NULL, NULL, "1992", + "Battle Clash (Euro)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_BattleclasheRomInfo, snes_BattleclasheRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Cross (Japan) + +static struct BurnRomInfo snes_BattlecrossRomDesc[] = { + { "Battle Cross (J)(1994)(Imagineer).sfc", 1048576, 0x5f5e9b0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlecross) +STD_ROM_FN(snes_Battlecross) + +struct BurnDriver BurnDrvsnes_Battlecross = { + "snes_battlecross", NULL, NULL, NULL, "1994", + "Battle Cross (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 5, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BattlecrossRomInfo, snes_BattlecrossRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Dodge Ball II (Japan) + +static struct BurnRomInfo snes_Battledb2jRomDesc[] = { + { "Battle Dodge Ball II (J)(1993)(Banpresto).sfc", 1572864, 0x43d3f2b2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battledb2j) +STD_ROM_FN(snes_Battledb2j) + +struct BurnDriver BurnDrvsnes_Battledb2j = { + "snes_battledb2j", NULL, NULL, NULL, "1993", + "Battle Dodge Ball II (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Battledb2jRomInfo, snes_Battledb2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Dodge Ball (Japan) + +static struct BurnRomInfo snes_BattledbjRomDesc[] = { + { "Battle Dodge Ball (J)(1991)(Banpresto).sfc", 1048576, 0x99a1f158, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battledbj) +STD_ROM_FN(snes_Battledbj) + +struct BurnDriver BurnDrvsnes_Battledbj = { + "snes_battledbj", NULL, NULL, NULL, "1991", + "Battle Dodge Ball (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BattledbjRomInfo, snes_BattledbjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Grand Prix (USA) + +static struct BurnRomInfo snes_BattlegrandprixRomDesc[] = { + { "Battle Grand Prix (U)(1993)(Hudson Soft).sfc", 1048576, 0x190ff436, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlegrandprix) +STD_ROM_FN(snes_Battlegrandprix) + +struct BurnDriver BurnDrvsnes_Battlegrandprix = { + "snes_battlegrandprix", NULL, NULL, NULL, "1993", + "Battle Grand Prix (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BattlegrandprixRomInfo, snes_BattlegrandprixRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Master - Kyuukyoku no Senshi-tachi (Japan) + +static struct BurnRomInfo snes_BattlemastRomDesc[] = { + { "Battle Master - Kyuukyoku no Senshi-tachi (J)(1993)(Toshiba EMI).sfc", 2097152, 0xdbf76bfd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlemast) +STD_ROM_FN(snes_Battlemast) + +struct BurnDriver BurnDrvsnes_Battlemast = { + "snes_battlemast", NULL, NULL, NULL, "1993", + "Battle Master - Kyuukyoku no Senshi-tachi (Japan)\0", NULL, "Toshiba EMI", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BattlemastRomInfo, snes_BattlemastRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Pinball (Japan) + +static struct BurnRomInfo snes_BattlepinballRomDesc[] = { + { "Battle Pinball (J)(1995)(Banpresto).sfc", 1310720, 0x54901522, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlepinball) +STD_ROM_FN(snes_Battlepinball) + +struct BurnDriver BurnDrvsnes_Battlepinball = { + "snes_battlepinball", NULL, NULL, NULL, "1995", + "Battle Pinball (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PINBALL, 0, + SNESGetZipName, snes_BattlepinballRomInfo, snes_BattlepinballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Racers (Japan) + +static struct BurnRomInfo snes_BattleracersRomDesc[] = { + { "Battle Racers (J)(1995)(Banpresto).sfc", 1048576, 0x64b76ceb, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Battleracers, snes_Battleracers, snes_dsp1) +STD_ROM_FN(snes_Battleracers) + +struct BurnDriver BurnDrvsnes_Battleracers = { + "snes_battleracers", NULL, "snes_dsp1", NULL, "1995", + "Battle Racers (Japan)\0", "DSP-1 enhancement chip", "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BattleracersRomInfo, snes_BattleracersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Soccer 2 (Japan) + +static struct BurnRomInfo snes_Battlesoccer2jRomDesc[] = { + { "Battle Soccer 2 (J)(1994)(Banpresto).sfc", 1310720, 0x5316dd26, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlesoccer2j) +STD_ROM_FN(snes_Battlesoccer2j) + +struct BurnDriver BurnDrvsnes_Battlesoccer2j = { + "snes_battlesoccer2j", NULL, NULL, NULL, "1994", + "Battle Soccer 2 (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Battlesoccer2jRomInfo, snes_Battlesoccer2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Soccer 2 (Hack, Italian) +// https://romhacking.it/project/view/id/417 +static struct BurnRomInfo snes_Battlesoccer2tiRomDesc[] = { + { "Battle Soccer 2 T-Ita (2011)(Rulez Translation).sfc", 1572864, 0xe83d70f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlesoccer2ti) +STD_ROM_FN(snes_Battlesoccer2ti) + +struct BurnDriver BurnDrvsnes_Battlesoccer2ti = { + "snes_battlesoccer2ti", "snes_battlesoccer2j", NULL, NULL, "2011", + "Battle Soccer 2 (Hack, Italian)\0", NULL, "Rulez Translation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Battlesoccer2tiRomInfo, snes_Battlesoccer2tiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Soccer - Field no Hasha (Japan) + +static struct BurnRomInfo snes_BattlesoccerjRomDesc[] = { + { "Battle Soccer - Field no Hasha (J)(1992)(Banpresto).sfc", 1048576, 0xc54ae0f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlesoccerj) +STD_ROM_FN(snes_Battlesoccerj) + +struct BurnDriver BurnDrvsnes_Battlesoccerj = { + "snes_battlesoccerj", "snes_battlesoccerte", NULL, NULL, "1992", + "Battle Soccer - Field no Hasha (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_BattlesoccerjRomInfo, snes_BattlesoccerjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Soccer (Hack, English) +// https://www.romhacking.net/translations/568/ +static struct BurnRomInfo snes_BattlesoccerteRomDesc[] = { + { "Battle Soccer T-Eng (2002)(Hurkey!! Translations).sfc", 1048576, 0x21b6a036, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlesoccerte) +STD_ROM_FN(snes_Battlesoccerte) + +struct BurnDriver BurnDrvsnes_Battlesoccerte = { + "snes_battlesoccerte", NULL, NULL, NULL, "2002", + "Battle Soccer (Hack, English)\0", NULL, "Hurkey!? Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_BattlesoccerteRomInfo, snes_BattlesoccerteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battletoads in Battlemaniacs (USA) + +static struct BurnRomInfo snes_BattletoadsRomDesc[] = { + { "Battletoads in Battlemaniacs (U)(1993)(Tradewest - Rare).sfc", 1048576, 0x617ac925, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battletoads) +STD_ROM_FN(snes_Battletoads) + +struct BurnDriver BurnDrvsnes_Battletoads = { + "snes_battletoads", NULL, NULL, NULL, "1993", + "Battletoads in Battlemaniacs (USA)\0", NULL, "Tradewest - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BattletoadsRomInfo, snes_BattletoadsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battletoads in Battlemaniacs (Japan) + +static struct BurnRomInfo snes_BattletoadsjRomDesc[] = { + { "Battletoads in Battlemaniacs (J)(1993)(Masaya - Rare).sfc", 1048576, 0x48f15b03, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battletoadsj) +STD_ROM_FN(snes_Battletoadsj) + +struct BurnDriver BurnDrvsnes_Battletoadsj = { + "snes_battletoadsj", "snes_battletoads", NULL, NULL, "1993", + "Battletoads in Battlemaniacs (Japan)\0", NULL, "Masaya - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BattletoadsjRomInfo, snes_BattletoadsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Zeque-Den (Japan) + +static struct BurnRomInfo snes_BattlezdjRomDesc[] = { + { "Battle Zeque-Den (J)(1994)(Asmik).sfc", 1572864, 0x8cac063c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Battlezdj) +STD_ROM_FN(snes_Battlezdj) + +struct BurnDriver BurnDrvsnes_Battlezdj = { + "snes_battlezdj", NULL, NULL, NULL, "1994", + "Battle Zeque-Den (Japan)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_BattlezdjRomInfo, snes_BattlezdjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bazooka Blitzkrieg (USA) + +static struct BurnRomInfo snes_BazooblitzRomDesc[] = { + { "Bazooka Blitzkrieg (U)(1992)(Bandai).sfc", 524288, 0x6810aa95, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bazooblitz) +STD_ROM_FN(snes_Bazooblitz) + +struct BurnDriver BurnDrvsnes_Bazooblitz = { + "snes_bazooblitz", NULL, NULL, NULL, "1992", + "Bazooka Blitzkrieg (USA)\0", "'Super Scope' exclusive game", "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_BazooblitzRomInfo, snes_BazooblitzRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Bing Bing! Bingo (Japan) + +static struct BurnRomInfo snes_BbbingoRomDesc[] = { + { "Bing Bing! Bingo (J)(1993)(KSS).sfc", 1048576, 0xccd77b37, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bbbingo) +STD_ROM_FN(snes_Bbbingo) + +struct BurnDriver BurnDrvsnes_Bbbingo = { + "snes_bbbingo", NULL, NULL, NULL, "1993", + "Bing Bing! Bingo (Japan)\0", NULL, "KSS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_CASINO | GBF_MINIGAMES, 0, + SNESGetZipName, snes_BbbingoRomInfo, snes_BbbingoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bishin Densetsu Zoku ~ The Legend of Bishin Zoku (Japan) + +static struct BurnRomInfo snes_BdzokuRomDesc[] = { + { "Bishin Densetsu Zoku (J)(1993)(Magifact).sfc", 2097152, 0xf02dcb37, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bdzoku) +STD_ROM_FN(snes_Bdzoku) + +struct BurnDriver BurnDrvsnes_Bdzoku = { + "snes_bdzoku", NULL, NULL, NULL, "1993", + "Bishin Densetsu Zoku ~ The Legend of Bishin Zoku (Japan)\0", NULL, "Magifact", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING | GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BdzokuRomInfo, snes_BdzokuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Beavis and Butt-Head (USA) + +static struct BurnRomInfo snes_BeavisbuttRomDesc[] = { + { "Beavis and Butt-Head (U)(1994)(Viacom New Media).sfc", 1572864, 0x15cf4bd5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Beavisbutt) +STD_ROM_FN(snes_Beavisbutt) + +struct BurnDriver BurnDrvsnes_Beavisbutt = { + "snes_beavisbutt", NULL, NULL, NULL, "1994", + "Beavis and Butt-Head (USA)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_BeavisbuttRomInfo, snes_BeavisbuttRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Beauty and the Beast (USA) + +static struct BurnRomInfo snes_BeautyRomDesc[] = { + { "Disney's Beauty and the Beast (U)(1994)(Hudson Soft).sfc", 1048576, 0x956e183c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Beauty) +STD_ROM_FN(snes_Beauty) + +struct BurnDriver BurnDrvsnes_Beauty = { + "snes_beauty", NULL, NULL, NULL, "1994", + "Disney's Beauty and the Beast (USA)\0", NULL, "Hudson Soft - Disney Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BeautyRomInfo, snes_BeautyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Beethoven - The Ultimate Canine Caper! (USA) + +static struct BurnRomInfo snes_BeethovenRomDesc[] = { + { "Beethoven - The Ultimate Canine Caper! (U)(1993)(Hi Tech Expressions).sfc", 524288, 0xbeebafa2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Beethoven) +STD_ROM_FN(snes_Beethoven) + +struct BurnDriver BurnDrvsnes_Beethoven = { + "snes_beethoven", NULL, NULL, NULL, "1993", + "Beethoven - The Ultimate Canine Caper! (USA)\0", NULL, "Hi Tech Expressions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BeethovenRomInfo, snes_BeethovenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Best of the Best - Championship Karate (USA) + +static struct BurnRomInfo snes_BestofbestRomDesc[] = { + { "Best of the Best - Championship Karate (U)(1992)(Electro Brain).sfc", 1048576, 0x7f6ed86e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bestofbest) +STD_ROM_FN(snes_Bestofbest) + +struct BurnDriver BurnDrvsnes_Bestofbest = { + "snes_bestofbest", NULL, NULL, NULL, "1992", + "Best of the Best - Championship Karate (USA)\0", NULL, "Electro Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BestofbestRomInfo, snes_BestofbestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Big Sky Trooper (USA) + +static struct BurnRomInfo snes_BigskytroopRomDesc[] = { + { "Big Sky Trooper (U)(1995)(JVC Musical Industries).sfc", 1048576, 0x25c69316, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bigskytroop) +STD_ROM_FN(snes_Bigskytroop) + +struct BurnDriver BurnDrvsnes_Bigskytroop = { + "snes_bigskytroop", NULL, NULL, NULL, "1995", + "Big Sky Trooper (USA)\0", NULL, "JVC Musical Industries - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_BigskytroopRomInfo, snes_BigskytroopRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bike Daisuki! Hashiriya Tamashii (Japan) + +static struct BurnRomInfo snes_BikedaisukiRomDesc[] = { + { "Bike Daisuki! Hashiriya Tamashii (J)(1994)(NCS - Masaya).sfc", 524288, 0xb363fc99, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Bikedaisuki, snes_Bikedaisuki, snes_dsp1) +STD_ROM_FN(snes_Bikedaisuki) + +struct BurnDriver BurnDrvsnes_Bikedaisuki = { + "snes_bikedaisuki", NULL, "snes_dsp1", NULL, "1994", + "Bike Daisuki! Hashiriya Tamashii (Japan)\0", "DSP-1 enhancement chip", "NCS - Masaya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BikedaisukiRomInfo, snes_BikedaisukiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Biker Mice from Mars (USA) + +static struct BurnRomInfo snes_BikermiceRomDesc[] = { + { "Biker Mice from Mars (U)(1994)(Konami).sfc", 1048576, 0x4e8b2ecb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bikermice) +STD_ROM_FN(snes_Bikermice) + +struct BurnDriver BurnDrvsnes_Bikermice = { + "snes_bikermice", NULL, NULL, NULL, "1994", + "Biker Mice from Mars (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_BikermiceRomInfo, snes_BikermiceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// BioMetal (USA) + +static struct BurnRomInfo snes_BiometalRomDesc[] = { + { "BioMetal (U)(1993)(Activision - Athena).sfc", 1048576, 0x53d8410e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Biometal) +STD_ROM_FN(snes_Biometal) + +struct BurnDriver BurnDrvsnes_Biometal = { + "snes_biometal", NULL, NULL, NULL, "1993", + "BioMetal (USA)\0", NULL, "Activision - Athena Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_BiometalRomInfo, snes_BiometalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Serizawa Nobuo no Birdie Try (Japan) + +static struct BurnRomInfo snes_BirdietryRomDesc[] = { + { "Serizawa Nobuo no Birdie Try (J)(1992)(Toho Co.).sfc", 1048576, 0x987a96d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Birdietry) +STD_ROM_FN(snes_Birdietry) + +struct BurnDriver BurnDrvsnes_Birdietry = { + "snes_birdietry", "snes_mecagolf", NULL, NULL, "1992", + "Serizawa Nobuo no Birdie Try (Japan)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BirdietryRomInfo, snes_BirdietryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blackhawk (Euro) + +static struct BurnRomInfo snes_BlackhawkRomDesc[] = { + { "Blackhawk (E)(1994)(Interplay).sfc", 1048576, 0x2d1dd10a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blackhawk) +STD_ROM_FN(snes_Blackhawk) + +struct BurnDriver BurnDrvsnes_Blackhawk = { + "snes_blackhawk", "snes_blackthorne", NULL, NULL, "1994", + "Blackhawk (Euro)\0", NULL, "Interplay - Blizzard", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_BlackhawkRomInfo, snes_BlackhawkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blackthorne (USA) + +static struct BurnRomInfo snes_BlackthorneRomDesc[] = { + { "Blackthorne (U)(1994)(Interplay - Blizzard).sfc", 1048576, 0x856beab1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blackthorne) +STD_ROM_FN(snes_Blackthorne) + +struct BurnDriver BurnDrvsnes_Blackthorne = { + "snes_blackthorne", NULL, NULL, NULL, "1994", + "Blackthorne (USA)\0", NULL, "Interplay - Blizzard", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_BlackthorneRomInfo, snes_BlackthorneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blackthorne - Fukushuu no Kuroki Toge (Japan) + +static struct BurnRomInfo snes_BlackthornejRomDesc[] = { + { "Blackthorne - Fukushuu no Kuroki Toge (J)(1995)(Kemco).sfc", 1048576, 0xedf476b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blackthornej) +STD_ROM_FN(snes_Blackthornej) + +struct BurnDriver BurnDrvsnes_Blackthornej = { + "snes_blackthornej", "snes_blackthorne", NULL, NULL, "1995", + "Blackthorne - Fukushuu no Kuroki Toge (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_BlackthornejRomInfo, snes_BlackthornejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blazing Skies (Euro) + +static struct BurnRomInfo snes_BlazingskiesRomDesc[] = { + { "Blazing Skies (E)(1992)(Namco).sfc", 524288, 0xbeb16e2d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blazingskies) +STD_ROM_FN(snes_Blazingskies) + +struct BurnDriver BurnDrvsnes_Blazingskies = { + "snes_blazingskies", "snes_wings2ah", NULL, NULL, "1992", + "Blazing Skies (Euro)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_BlazingskiesRomInfo, snes_BlazingskiesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bill Laimbeer's Combat Basketball (USA) + +static struct BurnRomInfo snes_BlcbasketballRomDesc[] = { + { "Bill Laimbeer's Combat Basketball (U)(1991)(Hudson Soft).sfc", 524288, 0x468d8cdd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blcbasketball) +STD_ROM_FN(snes_Blcbasketball) + +struct BurnDriver BurnDrvsnes_Blcbasketball = { + "snes_blcbasketball", NULL, NULL, NULL, "1991", + "Bill Laimbeer's Combat Basketball (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_BlcbasketballRomInfo, snes_BlcbasketballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Block Kuzushi (Japan) + +static struct BurnRomInfo snes_BlockuzushiRomDesc[] = { + { "Block Kuzushi (J)(1995)(POW).sfc", 524288, 0x5cce2e55, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blockuzushi) +STD_ROM_FN(snes_Blockuzushi) + +struct BurnDriver BurnDrvsnes_Blockuzushi = { + "snes_blockuzushi", NULL, NULL, NULL, "1995", + "Block Kuzushi (Japan)\0", NULL, "POW", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BREAKOUT | GBF_BALLPADDLE, 0, + SNESGetZipName, snes_BlockuzushiRomInfo, snes_BlockuzushiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blues Brothers, The (USA) + +static struct BurnRomInfo snes_BluesbrosRomDesc[] = { + { "Blues Brothers, The (U)(1993)(Titus).sfc", 524288, 0x82b97464, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bluesbros) +STD_ROM_FN(snes_Bluesbros) + +struct BurnDriver BurnDrvsnes_Bluesbros = { + "snes_bluesbros", NULL, NULL, NULL, "1993", + "Blues Brothers, The (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BluesbrosRomInfo, snes_BluesbrosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Blues Brothers, The (Japan) + +static struct BurnRomInfo snes_BluesbrosjRomDesc[] = { + { "Blues Brothers, The (J)(1993)(Kemco).sfc", 524288, 0x362620d2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bluesbrosj) +STD_ROM_FN(snes_Bluesbrosj) + +struct BurnDriver BurnDrvsnes_Bluesbrosj = { + "snes_bluesbrosj", "snes_bluesbros", NULL, NULL, "1993", + "Blues Brothers, The (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BluesbrosjRomInfo, snes_BluesbrosjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// B.O.B. (USA) + +static struct BurnRomInfo snes_BobRomDesc[] = { + { "B.O.B. (U)(1993)(Electronic Arts).sfc", 1048576, 0x4f593c46, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bob) +STD_ROM_FN(snes_Bob) + +struct BurnDriver BurnDrvsnes_Bob = { + "snes_bob", NULL, NULL, NULL, "1993", + "B.O.B. (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_BobRomInfo, snes_BobRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire (USA) + +static struct BurnRomInfo snes_BofRomDesc[] = { + { "Breath of Fire (U)(1994)(Squaresoft - Capcom).sfc", 1572864, 0xc788b696, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bof) +STD_ROM_FN(snes_Bof) + +struct BurnDriver BurnDrvsnes_Bof = { + "snes_bof", NULL, NULL, NULL, "1994", + "Breath of Fire (USA)\0", NULL, "Squaresoft - Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_BofRomInfo, snes_BofRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire II (USA) + +static struct BurnRomInfo snes_Bof2RomDesc[] = { + { "Breath of Fire II (U)(1995)(Capcom).sfc", 3145728, 0x67cdacc5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bof2) +STD_ROM_FN(snes_Bof2) + +struct BurnDriver BurnDrvsnes_Bof2 = { + "snes_bof2", NULL, NULL, NULL, "1995", + "Breath of Fire II (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Bof2RomInfo, snes_Bof2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire II - Shimei no Ko (Japan) + +static struct BurnRomInfo snes_Bof2jRomDesc[] = { + { "Breath of Fire II - Shimei no Ko (J)(1994)(Capcom).sfc", 2621440, 0x1d8014f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bof2j) +STD_ROM_FN(snes_Bof2j) + +struct BurnDriver BurnDrvsnes_Bof2j = { + "snes_bof2j", "snes_bof2", NULL, NULL, "1994", + "Breath of Fire II - Shimei no Ko (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Bof2jRomInfo, snes_Bof2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire - Ryuu no Senshi (Japan) + +static struct BurnRomInfo snes_BofjRomDesc[] = { + { "Breath of Fire - Ryuu no Senshi (J)(1993)(Capcom).sfc", 1572864, 0xfd96a42f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bofj) +STD_ROM_FN(snes_Bofj) + +struct BurnDriver BurnDrvsnes_Bofj = { + "snes_bofj", "snes_bof", NULL, NULL, "1993", + "Breath of Fire - Ryuu no Senshi (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_BofjRomInfo, snes_BofjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bomberman B-Daman (Japan) + +static struct BurnRomInfo snes_BombdamanRomDesc[] = { + { "Bomberman B-Daman (J)(1996)(Hudson Soft).sfc", 1048576, 0x9fea854d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bombdaman) +STD_ROM_FN(snes_Bombdaman) + +struct BurnDriver BurnDrvsnes_Bombdaman = { + "snes_bombdaman", NULL, NULL, NULL, "1996", + "Bomberman B-Daman (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_BombdamanRomInfo, snes_BombdamanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bombuzal (Japan) + +static struct BurnRomInfo snes_BombuzalRomDesc[] = { + { "Bombuzal (J)(1990)(Kemco).sfc", 524288, 0x5d7b8bcb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bombuzal) +STD_ROM_FN(snes_Bombuzal) + +struct BurnDriver BurnDrvsnes_Bombuzal = { + "snes_bombuzal", "snes_kablooey", NULL, NULL, "1990", + "Bombuzal (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_BombuzalRomInfo, snes_BombuzalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Bonkers (USA) + +static struct BurnRomInfo snes_BonkersRomDesc[] = { + { "Disney's Bonkers (U)(1994)(Capcom).sfc", 1048576, 0x597aa981, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bonkers) +STD_ROM_FN(snes_Bonkers) + +struct BurnDriver BurnDrvsnes_Bonkers = { + "snes_bonkers", NULL, NULL, NULL, "1994", + "Disney's Bonkers (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BonkersRomInfo, snes_BonkersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Bonkers - Hollywood Daisakusen! (Japan) + +static struct BurnRomInfo snes_BonkersjRomDesc[] = { + { "Disney's Bonkers - Hollywood Daisakusen! (J)(1994)(Capcom).sfc", 1048576, 0x9401d956, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bonkersj) +STD_ROM_FN(snes_Bonkersj) + +struct BurnDriver BurnDrvsnes_Bonkersj = { + "snes_bonkersj", "snes_bonkers", NULL, NULL, "1994", + "Disney's Bonkers - Hollywood Daisakusen! (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BonkersjRomInfo, snes_BonkersjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Boogerman - A Pick and Flick Adventure (USA) + +static struct BurnRomInfo snes_BoogermanRomDesc[] = { + { "Boogerman - A Pick and Flick Adventure (U)(1995)(Interplay).sfc", 3145728, 0x1899aaff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Boogerman) +STD_ROM_FN(snes_Boogerman) + +struct BurnDriver BurnDrvsnes_Boogerman = { + "snes_boogerman", NULL, NULL, NULL, "1995", + "Boogerman - A Pick and Flick Adventure (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BoogermanRomInfo, snes_BoogermanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brainies, The (USA) + +static struct BurnRomInfo snes_BrainiesRomDesc[] = { + { "Brainies, The (U)(1992)(Titus).sfc", 524288, 0x718cb0df, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brainies) +STD_ROM_FN(snes_Brainies) + +struct BurnDriver BurnDrvsnes_Brainies = { + "snes_brainies", NULL, NULL, NULL, "1992", + "Brainies, The (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_BrainiesRomInfo, snes_BrainiesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brain Lord (USA) + +static struct BurnRomInfo snes_BrainlordRomDesc[] = { + { "Brain Lord (U)(1994)(Enix).sfc", 1572864, 0xac443d87, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brainlord) +STD_ROM_FN(snes_Brainlord) + +struct BurnDriver BurnDrvsnes_Brainlord = { + "snes_brainlord", NULL, NULL, NULL, "1994", + "Brain Lord (USA)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_BrainlordRomInfo, snes_BrainlordRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brain Lord (Japan) + +static struct BurnRomInfo snes_BrainlordjRomDesc[] = { + { "Brain Lord (J)(1994)(Enix).sfc", 1572864, 0x9540e59d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brainlordj) +STD_ROM_FN(snes_Brainlordj) + +struct BurnDriver BurnDrvsnes_Brainlordj = { + "snes_brainlordj", "snes_brainlord", NULL, NULL, "1994", + "Brain Lord (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_BrainlordjRomInfo, snes_BrainlordjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brandish (USA) + +static struct BurnRomInfo snes_BrandishRomDesc[] = { + { "Brandish (U)(1995)(Koei).sfc", 1572864, 0x74f70a0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brandish) +STD_ROM_FN(snes_Brandish) + +struct BurnDriver BurnDrvsnes_Brandish = { + "snes_brandish", NULL, NULL, NULL, "1995", + "Brandish (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_BrandishRomInfo, snes_BrandishRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brandish (Japan) + +static struct BurnRomInfo snes_BrandishjRomDesc[] = { + { "Brandish (J)(1994)(Koei).sfc", 1572864, 0xa087b6ad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brandishj) +STD_ROM_FN(snes_Brandishj) + +struct BurnDriver BurnDrvsnes_Brandishj = { + "snes_brandishj", "snes_brandish", NULL, NULL, "1994", + "Brandish (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_BrandishjRomInfo, snes_BrandishjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brawl Brothers (USA) + +static struct BurnRomInfo snes_BrawlbrosRomDesc[] = { + { "Brawl Brothers (U)(1993)(Jaleco).sfc", 1572864, 0xe822065c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brawlbros) +STD_ROM_FN(snes_Brawlbros) + +struct BurnDriver BurnDrvsnes_Brawlbros = { + "snes_brawlbros", NULL, NULL, NULL, "1993", + "Brawl Brothers (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_BrawlbrosRomInfo, snes_BrawlbrosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// BreakThru! (USA) + +static struct BurnRomInfo snes_BreakthruRomDesc[] = { + { "BreakThru! (U)(1994)(Spectrum HoloByte).sfc", 524288, 0xe6c0b5da, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Breakthru) +STD_ROM_FN(snes_Breakthru) + +struct BurnDriver BurnDrvsnes_Breakthru = { + "snes_breakthru", NULL, NULL, NULL, "1994", + "BreakThru! (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Spectrum HoloByte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_BreakthruRomInfo, snes_BreakthruRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Brutal - Paws of Fury (USA) + +static struct BurnRomInfo snes_BrutalRomDesc[] = { + { "Brutal - Paws of Fury (U)(1994)(GameTek).sfc", 2097152, 0x8fe49f80, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brutal) +STD_ROM_FN(snes_Brutal) + +struct BurnDriver BurnDrvsnes_Brutal = { + "snes_brutal", NULL, NULL, NULL, "1994", + "Brutal - Paws of Fury (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BrutalRomInfo, snes_BrutalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Animal Buranden - Brutal (Japan) + +static struct BurnRomInfo snes_BrutaljRomDesc[] = { + { "Animal Buranden - Brutal (J)(1994)(Kemco).sfc", 2097152, 0x78eca50d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Brutalj) +STD_ROM_FN(snes_Brutalj) + +struct BurnDriver BurnDrvsnes_Brutalj = { + "snes_brutalj", "snes_brutal", NULL, NULL, "1994", + "Animal Buranden - Brutal (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BrutaljRomInfo, snes_BrutaljRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// BattleTech 3050 (Japan) + +static struct BurnRomInfo snes_Bt3050RomDesc[] = { + { "BattleTech 3050 (J)(1996)(ask Kodansha - Activision).sfc", 1572864, 0x56c7eb66, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bt3050) +STD_ROM_FN(snes_Bt3050) + +struct BurnDriver BurnDrvsnes_Bt3050 = { + "snes_bt3050", "snes_mw3050", NULL, NULL, "1996", + "BattleTech 3050 (Japan)\0", NULL, "ask Kodansha - Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SIM | GBF_SHOOT, 0, + SNESGetZipName, snes_Bt3050RomInfo, snes_Bt3050RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battletoads & Double Dragon (USA) + +static struct BurnRomInfo snes_BtddRomDesc[] = { + { "Battletoads-Double Dragon (U)(1993)(Tradewest - Rare).sfc", 1048576, 0x8b18ac01, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Btdd) +STD_ROM_FN(snes_Btdd) + +struct BurnDriver BurnDrvsnes_Btdd = { + "snes_btdd", NULL, NULL, NULL, "1993", + "Battletoads & Double Dragon (USA)\0", NULL, "Tradewest - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_BtddRomInfo, snes_BtddRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Blaze (USA) + +static struct BurnRomInfo snes_BtlblazeRomDesc[] = { + { "Battle Blaze (U)(1993)(Sammy).sfc", 1048576, 0xd933bd8d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Btlblaze) +STD_ROM_FN(snes_Btlblaze) + +struct BurnDriver BurnDrvsnes_Btlblaze = { + "snes_btlblaze", NULL, NULL, NULL, "1993", + "Battle Blaze (USA)\0", NULL, "Sammy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BtlblazeRomInfo, snes_BtlblazeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Jockey (Japan) + +static struct BurnRomInfo snes_BtljockeyRomDesc[] = { + { "Battle Jockey (J)(1994)(Virgin Games).sfc", 1048576, 0xd79c1ec5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Btljockey) +STD_ROM_FN(snes_Btljockey) + +struct BurnDriver BurnDrvsnes_Btljockey = { + "snes_btljockey", NULL, NULL, NULL, "1994", + "Battle Jockey (Japan)\0", NULL, "Virgin Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC | GBF_CASINO, 0, + SNESGetZipName, snes_BtljockeyRomInfo, snes_BtljockeyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Submarine (Japan) + +static struct BurnRomInfo snes_BtlsubmarineRomDesc[] = { + { "Battle Submarine (J)(1995)(Pack-In-Video).sfc", 1048576, 0xda2ad2fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Btlsubmarine) +STD_ROM_FN(snes_Btlsubmarine) + +struct BurnDriver BurnDrvsnes_Btlsubmarine = { + "snes_btlsubmarine", NULL, NULL, NULL, "1995", + "Battle Submarine (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM, 0, + SNESGetZipName, snes_BtlsubmarineRomInfo, snes_BtlsubmarineRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Battle Tycoon - Flash Hiders SFX (Japan) + +static struct BurnRomInfo snes_BtltycoonjRomDesc[] = { + { "Battle Tycoon - Flash Hiders SFX (J)(1995)(Right Stuff).sfc", 3145728, 0x92afab02, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Btltycoonj) +STD_ROM_FN(snes_Btltycoonj) + +struct BurnDriver BurnDrvsnes_Btltycoonj = { + "snes_btltycoonj", NULL, NULL, NULL, "1995", + "Battle Tycoon - Flash Hiders SFX (Japan)\0", NULL, "Right Stuff", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BtltycoonjRomInfo, snes_BtltycoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bubsy in Claws Encounters of the Furred Kind (USA) + +static struct BurnRomInfo snes_BubsyRomDesc[] = { + { "Bubsy in Claws Encounters of the Furred Kind (U)(1992)(Accolade).sfc", 2097152, 0x444a52c1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bubsy) +STD_ROM_FN(snes_Bubsy) + +struct BurnDriver BurnDrvsnes_Bubsy = { + "snes_bubsy", NULL, NULL, NULL, "1992", + "Bubsy in Claws Encounters of the Furred Kind (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BubsyRomInfo, snes_BubsyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bubsy II (USA) + +static struct BurnRomInfo snes_BubsyiiRomDesc[] = { + { "Bubsy II (U)(1994)(Accolade).sfc", 2097152, 0xd0d172fa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bubsyii) +STD_ROM_FN(snes_Bubsyii) + +struct BurnDriver BurnDrvsnes_Bubsyii = { + "snes_bubsyii", NULL, NULL, NULL, "1994", + "Bubsy II (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BubsyiiRomInfo, snes_BubsyiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bugs Bunny - Rabbit Rampage (USA) + +static struct BurnRomInfo snes_BugsbunnyRomDesc[] = { + { "Bugs Bunny - Rabbit Rampage (U)(1993)(Sunsoft).sfc", 1572864, 0x832c0cb6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bugsbunny) +STD_ROM_FN(snes_Bugsbunny) + +struct BurnDriver BurnDrvsnes_Bugsbunny = { + "snes_bugsbunny", NULL, NULL, NULL, "1993", + "Bugs Bunny - Rabbit Rampage (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BugsbunnyRomInfo, snes_BugsbunnyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bugs Bunny - Hachamecha Daibouken (Japan) + +static struct BurnRomInfo snes_BugsbunnyjRomDesc[] = { + { "Bugs Bunny - Hachamecha Daibouken (J)(1994)(Sunsoft).sfc", 1572864, 0x528b029b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bugsbunnyj) +STD_ROM_FN(snes_Bugsbunnyj) + +struct BurnDriver BurnDrvsnes_Bugsbunnyj = { + "snes_bugsbunnyj", "snes_bugsbunny", NULL, NULL, "1994", + "Bugs Bunny - Hachamecha Daibouken (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_BugsbunnyjRomInfo, snes_BugsbunnyjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gekitou Burning Pro Wrestling (Japan) + +static struct BurnRomInfo snes_BurnprowresjRomDesc[] = { + { "Gekitou Burning Pro Wrestling (J)(1995)(Bullet Proof Software).sfc", 2621440, 0xb2e7fc76, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Burnprowresj) +STD_ROM_FN(snes_Burnprowresj) + +struct BurnDriver BurnDrvsnes_Burnprowresj = { + "snes_burnprowresj", "snes_burnprowreste", NULL, NULL, "1995", + "Gekitou Burning Pro Wrestling (Japan)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BurnprowresjRomInfo, snes_BurnprowresjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Burning Pro Wrestling (Hack, English) +// https://www.romhacking.net/translations/1243/ +static struct BurnRomInfo snes_BurnprowresteRomDesc[] = { + { "Burning Pro Wrestling T-Eng (2008)(Phil).sfc", 2621440, 0x91a36831, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Burnprowreste) +STD_ROM_FN(snes_Burnprowreste) + +struct BurnDriver BurnDrvsnes_Burnprowreste = { + "snes_burnprowreste", NULL, NULL, NULL, "2008", + "Burning Pro Wrestling (Hack, English)\0", NULL, "Phil", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_BurnprowresteRomInfo, snes_BurnprowresteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bushi Seiryuuden - Futari no Yuusha (Japan) + +static struct BurnRomInfo snes_BushiseiryuRomDesc[] = { + { "Bushi Seiryuuden - Futari no Yuusha (J)(1997)(T&E Soft).sfc", 3145728, 0x62d31295, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bushiseiryu) +STD_ROM_FN(snes_Bushiseiryu) + +struct BurnDriver BurnDrvsnes_Bushiseiryu = { + "snes_bushiseiryu", "snes_legbluedrag", NULL, NULL, "1997", + "Bushi Seiryuuden - Futari no Yuusha (Japan)\0", NULL, "T&E Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_BushiseiryuRomInfo, snes_BushiseiryuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bust-A-Move (USA) + +static struct BurnRomInfo snes_BustamoveRomDesc[] = { + { "Bust-A-Move (U)(1995)(Taito).sfc", 524288, 0x3266fd23, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bustamove) +STD_ROM_FN(snes_Bustamove) + +struct BurnDriver BurnDrvsnes_Bustamove = { + "snes_bustamove", NULL, NULL, NULL, "1995", + "Bust-A-Move (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_BustamoveRomInfo, snes_BustamoveRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cacoma Knight in Bizyland (USA) + +static struct BurnRomInfo snes_CacomakRomDesc[] = { + { "Cacoma Knight in Bizyland (U)(1993)(Seta).sfc", 524288, 0xba921443, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cacomak) +STD_ROM_FN(snes_Cacomak) + +struct BurnDriver BurnDrvsnes_Cacomak = { + "snes_cacomak", NULL, NULL, NULL, "1993", + "Cacoma Knight in Bizyland (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_CacomakRomInfo, snes_CacomakRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cacoma Knight (Japan) + +static struct BurnRomInfo snes_CacomakjRomDesc[] = { + { "Cacoma Knight (J)(1992)(Datam Polystar).sfc", 524288, 0x6b3b7b52, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cacomakj) +STD_ROM_FN(snes_Cacomakj) + +struct BurnDriver BurnDrvsnes_Cacomakj = { + "snes_cacomakj", "snes_cacomak", NULL, NULL, "1992", + "Cacoma Knight (Japan)\0", NULL, "Datam Polystar", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_CacomakjRomInfo, snes_CacomakjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// California Games II (USA) + +static struct BurnRomInfo snes_CalgamesiiRomDesc[] = { + { "California Games II (U)(1992)(DTMC).sfc", 1048576, 0x21392b00, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Calgamesii) +STD_ROM_FN(snes_Calgamesii) + +struct BurnDriver BurnDrvsnes_Calgamesii = { + "snes_calgamesii", NULL, NULL, NULL, "1992", + "California Games II (USA)\0", NULL, "DTMC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_CalgamesiiRomInfo, snes_CalgamesiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// California Games II (Euro) + +static struct BurnRomInfo snes_CalgamesiieRomDesc[] = { + { "California Games II (E)(1993)(Imagineer).sfc", 1048576, 0xdb0814c5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Calgamesiie) +STD_ROM_FN(snes_Calgamesiie) + +struct BurnDriver BurnDrvsnes_Calgamesiie = { + "snes_calgamesiie", "snes_calgamesii", NULL, NULL, "1993", + "California Games II (Euro)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_CalgamesiieRomInfo, snes_CalgamesiieRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// California Games II (Japan) + +static struct BurnRomInfo snes_CalgamesiijRomDesc[] = { + { "California Games II (J)(1992)(Hect).sfc", 1048576, 0x5fa9485c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Calgamesiij) +STD_ROM_FN(snes_Calgamesiij) + +struct BurnDriver BurnDrvsnes_Calgamesiij = { + "snes_calgamesiij", "snes_calgamesii", NULL, NULL, "1992", + "California Games II (Japan)\0", NULL, "Hect", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_CalgamesiijRomInfo, snes_CalgamesiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cameltry (Japan) + +static struct BurnRomInfo snes_CameltryRomDesc[] = { + { "Cameltry (J)(1992)(Taito Corp.).sfc", 1048576, 0xa95c1fff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cameltry) +STD_ROM_FN(snes_Cameltry) + +struct BurnDriver BurnDrvsnes_Cameltry = { + "snes_cameltry", "snes_ontheball", NULL, NULL, "1992", + "Cameltry (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_CameltryRomInfo, snes_CameltryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cannon Fodder (Euro) + +static struct BurnRomInfo snes_CannonfoderRomDesc[] = { + { "Cannon Fodder (E)(1994)(Virgin Interactive).sfc", 1572864, 0xf3b5cbb1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cannonfoder) +STD_ROM_FN(snes_Cannonfoder) + +struct BurnDriver BurnDrvsnes_Cannonfoder = { + "snes_cannonfoder", NULL, NULL, NULL, "1994", + "Cannon Fodder (Euro)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Virgin Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_CannonfoderRomInfo, snes_CannonfoderRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain America and the Avengers (USA) + +static struct BurnRomInfo snes_CapamericaRomDesc[] = { + { "Captain America and the Avengers (U)(1993)(Mindscape).sfc", 1048576, 0x456ab5c8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Capamerica) +STD_ROM_FN(snes_Capamerica) + +struct BurnDriver BurnDrvsnes_Capamerica = { + "snes_capamerica", NULL, NULL, NULL, "1993", + "Captain America and the Avengers (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_CapamericaRomInfo, snes_CapamericaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain Commando (USA) + +static struct BurnRomInfo snes_CapcommandoRomDesc[] = { + { "Captain Commando (U)(1995)(Capcom).sfc", 2097152, 0x81db73c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Capcommando) +STD_ROM_FN(snes_Capcommando) + +struct BurnDriver BurnDrvsnes_Capcommando = { + "snes_capcommando", NULL, NULL, NULL, "1995", + "Captain Commando (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_CapcommandoRomInfo, snes_CapcommandoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Capcom's Soccer Shootout (USA) + +static struct BurnRomInfo snes_CapsocshootRomDesc[] = { + { "Capcom's Soccer Shootout (U)(1994)(Capcom).sfc", 1572864, 0xee314ae5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Capsocshoot) +STD_ROM_FN(snes_Capsocshoot) + +struct BurnDriver BurnDrvsnes_Capsocshoot = { + "snes_capsocshoot", NULL, NULL, NULL, "1994", + "Capcom's Soccer Shootout (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_CapsocshootRomInfo, snes_CapsocshootRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain Tsubasa III - Koutei no Chousen (Japan) + +static struct BurnRomInfo snes_Captsubasa3jRomDesc[] = { + { "Captain Tsubasa III - Koutei no Chousen (J)(1992)(Tecmo).sfc", 1048576, 0x26b0cee3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Captsubasa3j) +STD_ROM_FN(snes_Captsubasa3j) + +struct BurnDriver BurnDrvsnes_Captsubasa3j = { + "snes_captsubasa3j", "snes_captsubasa3te", NULL, NULL, "1992", + "Captain Tsubasa III - Koutei no Chousen (Japan)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL | GBF_RPG, 0, + SNESGetZipName, snes_Captsubasa3jRomInfo, snes_Captsubasa3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain Tsubasa III - Challenge of the Kaiser (Hack, English v0.9) +// https://www.romhacking.net/translations/6862/ +static struct BurnRomInfo snes_Captsubasa3teRomDesc[] = { + { "Captain Tsubasa III - Challenge of the Kaiser T-Eng v0.9 (2023)(Morhamms357).sfc", 1048576, 0xa6c308f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Captsubasa3te) +STD_ROM_FN(snes_Captsubasa3te) + +struct BurnDriver BurnDrvsnes_Captsubasa3te = { + "snes_captsubasa3te", NULL, NULL, NULL, "2023", + "Captain Tsubasa III - Challenge of the Kaiser (Hack, English v0.9)\0", NULL, "Morhamms357", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL | GBF_RPG, 0, + SNESGetZipName, snes_Captsubasa3teRomInfo, snes_Captsubasa3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain Tsubasa III - Challenge of the Kaiser (Hack, Italian v0.9) +// https://romhacking.it/project/view/id/362 +static struct BurnRomInfo snes_Captsubasa3tiRomDesc[] = { + { "Captain Tsubasa III - Challenge of the Kaiser T-Ita v0.9 (2006)(Rulez Translation).sfc", 1049088, 0x9db9c51e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Captsubasa3ti) +STD_ROM_FN(snes_Captsubasa3ti) + +struct BurnDriver BurnDrvsnes_Captsubasa3ti = { + "snes_captsubasa3ti", "snes_captsubasa3te", NULL, NULL, "2006", + "Captain Tsubasa III - Challenge of the Kaiser (Hack, Italian v0.9)\0", NULL, "Rulez Translation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL | GBF_RPG, 0, + SNESGetZipName, snes_Captsubasa3tiRomInfo, snes_Captsubasa3tiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Captain Tsubasa III - El Desafio del Kaiser (Hack, Spanish v0.9) +// https://www.romhacking.net/translations/1655/ +static struct BurnRomInfo snes_Captsubasa3tsRomDesc[] = { + { "Captain Tsubasa III - El Desafio del Kaiser T-Spa v0.9 (2011)(Validus).sfc", 1048576, 0x1ad9ceb0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Captsubasa3ts) +STD_ROM_FN(snes_Captsubasa3ts) + +struct BurnDriver BurnDrvsnes_Captsubasa3ts = { + "snes_captsubasa3ts", "snes_captsubasa3te", NULL, NULL, "2011", + "Captain Tsubasa III - El Desafio del Kaiser (Hack, Spanish v0.9)\0", NULL, "Validus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL | GBF_RPG, 0, + SNESGetZipName, snes_Captsubasa3tsRomInfo, snes_Captsubasa3tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Card Master - Rimusaria no Fuuin (Japan) + +static struct BurnRomInfo snes_CardmasterRomDesc[] = { + { "Card Master - Rimusaria no Fuuin (J)(1992)(HAL Laboratory).sfc", 1048576, 0x9e772b8f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cardmaster) +STD_ROM_FN(snes_Cardmaster) + +struct BurnDriver BurnDrvsnes_Cardmaster = { + "snes_cardmaster", "snes_arcana", NULL, NULL, "1992", + "Card Master - Rimusaria no Fuuin (Japan)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_CardmasterRomInfo, snes_CardmasterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Carrier Aces (USA) + +static struct BurnRomInfo snes_CarrieracesRomDesc[] = { + { "Carrier Aces (U)(1994)(Cybersoft).sfc", 2097152, 0x8bc5b8de, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Carrieraces) +STD_ROM_FN(snes_Carrieraces) + +struct BurnDriver BurnDrvsnes_Carrieraces = { + "snes_carrieraces", NULL, NULL, NULL, "1994", + "Carrier Aces (USA)\0", NULL, "Cybersoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_CarrieracesRomInfo, snes_CarrieracesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Casper (USA) (Natsume) + +static struct BurnRomInfo snes_CasperRomDesc[] = { + { "Casper (U)(1996)(Natsume).sfc", 1048576, 0xa3b745bc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Casper) +STD_ROM_FN(snes_Casper) + +struct BurnDriver BurnDrvsnes_Casper = { + "snes_casper", NULL, NULL, NULL, "1996", + "Casper (USA) (Natsume)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_CasperRomInfo, snes_CasperRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Casper (Japan) (KSS) + +static struct BurnRomInfo snes_CasperkssRomDesc[] = { + { "Casper (J)(1997)(KSS).sfc", 1048576, 0x696458b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Casperkss) +STD_ROM_FN(snes_Casperkss) + +struct BurnDriver BurnDrvsnes_Casperkss = { + "snes_casperkss", NULL, NULL, NULL, "1997", + "Casper (Japan) (KSS)\0", NULL, "KSS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_CasperkssRomInfo, snes_CasperkssRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Castlevania Dracula X (USA) + +static struct BurnRomInfo snes_CastlevaniadxRomDesc[] = { + { "Castlevania Dracula X (U)(1995)(Konami).sfc", 2097152, 0x7c4887e1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Castlevaniadx) +STD_ROM_FN(snes_Castlevaniadx) + +struct BurnDriver BurnDrvsnes_Castlevaniadx = { + "snes_castlevaniadx", NULL, NULL, NULL, "1995", + "Castlevania Dracula X (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_CastlevaniadxRomInfo, snes_CastlevaniadxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Castlevania Vampire's Kiss (Euro) + +static struct BurnRomInfo snes_CastlevaniavkRomDesc[] = { + { "Castlevania - Vampire's Kiss (E)(1995)(Konami).sfc", 2097152, 0x4ee9ee99, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Castlevaniavk) +STD_ROM_FN(snes_Castlevaniavk) + +struct BurnDriver BurnDrvsnes_Castlevaniavk = { + "snes_castlevaniavk", "snes_castlevaniadx", NULL, NULL, "1995", + "Castlevania Vampire's Kiss (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_CastlevaniavkRomInfo, snes_CastlevaniavkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// CB Chara Wars: Ushinawareta Gag (Japan) + +static struct BurnRomInfo snes_CbwarsjRomDesc[] = { + { "CB Chara Wars - Ushinawareta Gag (J)(1992)(Banpresto).sfc", 1048576, 0x85ac87d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cbwarsj) +STD_ROM_FN(snes_Cbwarsj) + +struct BurnDriver BurnDrvsnes_Cbwarsj = { + "snes_cbwarsj", NULL, NULL, NULL, "1992", + "CB Chara Wars: Ushinawareta Gag (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_CbwarsjRomInfo, snes_CbwarsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Championship Pool (USA) + +static struct BurnRomInfo snes_ChampionpoolRomDesc[] = { + { "Championship Pool (U)(1993)(Mindscape).sfc", 1048576, 0x98ef8414, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Championpool) +STD_ROM_FN(snes_Championpool) + +struct BurnDriver BurnDrvsnes_Championpool = { + "snes_championpool", NULL, NULL, NULL, "1993", + "Championship Pool (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_ChampionpoolRomInfo, snes_ChampionpoolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chaos Engine, The (Euro) + +static struct BurnRomInfo snes_ChaosengineRomDesc[] = { + { "Chaos Engine, The (E)(1993)(MicroProse).sfc", 1572864, 0x8900f073, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chaosengine) +STD_ROM_FN(snes_Chaosengine) + +struct BurnDriver BurnDrvsnes_Chaosengine = { + "snes_chaosengine", "snes_soldfortune", NULL, NULL, "1993", + "Chaos Engine, The (Euro)\0", NULL, "MicroProse - The Bitmap Brothers", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_ChaosengineRomInfo, snes_ChaosengineRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chaos Seed: Fuusui Kairouki (Japan) + +static struct BurnRomInfo snes_ChaosseedjRomDesc[] = { + { "Chaos Seed - Fuusui Kairouki (J)(1996)(Taito Corp.).sfc", 2621440, 0x76e01ccb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chaosseedj) +STD_ROM_FN(snes_Chaosseedj) + +struct BurnDriver BurnDrvsnes_Chaosseedj = { + "snes_chaosseedj", "snes_chaosseedte", NULL, NULL, "1996", + "Chaos Seed: Fuusui Kairouki (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_ChaosseedjRomInfo, snes_ChaosseedjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chaos Seed (Hack, English v1.02) +// https://www.romhacking.net/translations/2181/ +static struct BurnRomInfo snes_ChaosseedteRomDesc[] = { + { "Chaos Seed T-Eng v1.02 (2014)(Dynamic-Designs).sfc", 3145728, 0x988a1fdf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chaosseedte) +STD_ROM_FN(snes_Chaosseedte) + +struct BurnDriver BurnDrvsnes_Chaosseedte = { + "snes_chaosseedte", NULL, NULL, NULL, "2014", + "Chaos Seed (Hack, English v1.02)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_ChaosseedteRomInfo, snes_ChaosseedteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chavez (USA, Spanish) + +static struct BurnRomInfo snes_ChavezRomDesc[] = { + { "Chavez (U, Es)(1993)(Extreme Entertainment).sfc", 524288, 0xa9d604ea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chavez) +STD_ROM_FN(snes_Chavez) + +struct BurnDriver BurnDrvsnes_Chavez = { + "snes_chavez", "snes_riddickbb", NULL, NULL, "1993", + "Chavez (USA, Spanish)\0", NULL, "Extreme Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_ChavezRomInfo, snes_ChavezRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chessmaster, The (USA) + +static struct BurnRomInfo snes_ChessmasterRomDesc[] = { + { "Chessmaster, The (U)(1991)(Mindscape).sfc", 524288, 0xbc671e15, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chessmaster) +STD_ROM_FN(snes_Chessmaster) + +struct BurnDriver BurnDrvsnes_Chessmaster = { + "snes_chessmaster", NULL, NULL, NULL, "1991", + "Chessmaster, The (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BOARD | GBF_STRATEGY, 0, + SNESGetZipName, snes_ChessmasterRomInfo, snes_ChessmasterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chessmaster, The (Japan) + +static struct BurnRomInfo snes_ChessmasterjRomDesc[] = { + { "Chessmaster, The (J)(1995)(Altron).sfc", 524288, 0x15c93942, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chessmasterj) +STD_ROM_FN(snes_Chessmasterj) + +struct BurnDriver BurnDrvsnes_Chessmasterj = { + "snes_chessmasterj", "snes_chessmaster", NULL, NULL, "1995", + "Chessmaster, The (Japan)\0", NULL, "Altron", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_BOARD | GBF_STRATEGY, 0, + SNESGetZipName, snes_ChessmasterjRomInfo, snes_ChessmasterjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chester Cheetah - Too Cool to Fool (USA) + +static struct BurnRomInfo snes_ChestercoolRomDesc[] = { + { "Chester Cheetah - Too Cool to Fool (U)(1992)(Kaneko).sfc", 1048576, 0x552bf16a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chestercool) +STD_ROM_FN(snes_Chestercool) + +struct BurnDriver BurnDrvsnes_Chestercool = { + "snes_chestercool", NULL, NULL, NULL, "1992", + "Chester Cheetah - Too Cool to Fool (USA)\0", NULL, "Kaneko", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ChestercoolRomInfo, snes_ChestercoolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chester Cheetah - Wild Wild Quest (USA) + +static struct BurnRomInfo snes_ChesterwildRomDesc[] = { + { "Chester Cheetah - Wild Wild Quest (U)(1993)(Kaneko).sfc", 1310720, 0x557fe962, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chesterwild) +STD_ROM_FN(snes_Chesterwild) + +struct BurnDriver BurnDrvsnes_Chesterwild = { + "snes_chesterwild", NULL, NULL, NULL, "1993", + "Chester Cheetah - Wild Wild Quest (USA)\0", NULL, "Kaneko", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ChesterwildRomInfo, snes_ChesterwildRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chinhai (Japan) + +static struct BurnRomInfo snes_ChinhaijRomDesc[] = { + { "Chinhai (J)(1995)(Banpresto).sfc", 524288, 0xd7452215, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chinhaij) +STD_ROM_FN(snes_Chinhaij) + +struct BurnDriver BurnDrvsnes_Chinhaij = { + "snes_chinhaij", NULL, NULL, NULL, "1995", + "Chinhai (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_MAHJONG | GBF_PUZZLE, 0, + SNESGetZipName, snes_ChinhaijRomInfo, snes_ChinhaijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cho Aniki - Buff Battle Ballad (Hack, English v1.01) +// https://www.romhacking.net/translations/7047/ +static struct BurnRomInfo snes_ChoanikiteRomDesc[] = { + { "Cho Aniki - Buff Battle Ballad T-Eng v1.01 (2023)(Stardust Crusaders).sfc", 2621440, 0xe6cbafe9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Choanikite) +STD_ROM_FN(snes_Choanikite) + +struct BurnDriver BurnDrvsnes_Choanikite = { + "snes_choanikite", NULL, NULL, NULL, "2023", + "Cho Aniki - Buff Battle Ballad (Hack, English v1.01)\0", NULL, "Stardust Crusaders", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_ChoanikiteRomInfo, snes_ChoanikiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Choplifter III - Rescue-Survive (USA) + +static struct BurnRomInfo snes_Choplift3RomDesc[] = { + { "Choplifter III - Rescue-Survive (U)(1993)(Beam Software).sfc", 524288, 0x1d2eae52, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Choplift3) +STD_ROM_FN(snes_Choplift3) + +struct BurnDriver BurnDrvsnes_Choplift3 = { + "snes_choplift3", NULL, NULL, NULL, "1993", + "Choplifter III - Rescue-Survive (USA)\0", NULL, "Beam Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Choplift3RomInfo, snes_Choplift3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chou Aniki - Bakuretsu Rantou Hen (Japan) + +static struct BurnRomInfo snes_ChouanikijRomDesc[] = { + { "Chou Aniki - Bakuretsu Rantou Hen (J)(1995)(NCS).sfc", 2097152, 0x70f5d440, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chouanikij) +STD_ROM_FN(snes_Chouanikij) + +struct BurnDriver BurnDrvsnes_Chouanikij = { + "snes_chouanikij", "snes_choanikite", NULL, NULL, "1995", + "Chou Aniki - Bakuretsu Rantou Hen (Japan)\0", NULL, "NCS - Masaya Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_ChouanikijRomInfo, snes_ChouanikijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chou Makaimura (Japan) + +static struct BurnRomInfo snes_ChoumakaimuraRomDesc[] = { + { "Chou Makaimura (J)(1991)(Capcom).sfc", 1048576, 0xcf8a8dba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Choumakaimura) +STD_ROM_FN(snes_Choumakaimura) + +struct BurnDriver BurnDrvsnes_Choumakaimura = { + "snes_choumakaimura", "snes_supergng", NULL, NULL, "1991", + "Chou Makaimura (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_ChoumakaimuraRomInfo, snes_ChoumakaimuraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chrono Trigger (USA) + +static struct BurnRomInfo snes_ChronotriggerRomDesc[] = { + { "Chrono Trigger (U)(1995)(Squaresoft).sfc", 4194304, 0x2d206bf7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chronotrigger) +STD_ROM_FN(snes_Chronotrigger) + +struct BurnDriver BurnDrvsnes_Chronotrigger = { + "snes_chronotrigger", NULL, NULL, NULL, "1995", + "Chrono Trigger (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ChronotriggerRomInfo, snes_ChronotriggerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chrono Trigger (Japan) + +static struct BurnRomInfo snes_ChronotriggerjRomDesc[] = { + { "Chrono Trigger (J)(1995)(Squaresoft).sfc", 4194304, 0x4d014c20, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chronotriggerj) +STD_ROM_FN(snes_Chronotriggerj) + +struct BurnDriver BurnDrvsnes_Chronotriggerj = { + "snes_chronotriggerj", "snes_chronotrigger", NULL, NULL, "1995", + "Chrono Trigger (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ChronotriggerjRomInfo, snes_ChronotriggerjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chuck Rock (USA) + +static struct BurnRomInfo snes_ChuckrockRomDesc[] = { + { "Chuck Rock (U)(1992)(Sony Imagesoft).sfc", 1048576, 0xe237ec45, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chuckrock) +STD_ROM_FN(snes_Chuckrock) + +struct BurnDriver BurnDrvsnes_Chuckrock = { + "snes_chuckrock", NULL, NULL, NULL, "1992", + "Chuck Rock (USA)\0", NULL, "Sony Imagesoft - Core Design", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ChuckrockRomInfo, snes_ChuckrockRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Circuit USA (Japan) + +static struct BurnRomInfo snes_CircuitusaRomDesc[] = { + { "Circuit USA (J)(1995)(Virgin Interactive).sfc", 2097152, 0x5a13366c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Circuitusa) +STD_ROM_FN(snes_Circuitusa) + +struct BurnDriver BurnDrvsnes_Circuitusa = { + "snes_circuitusa", "snes_kylepetty", NULL, NULL, "1995", + "Circuit USA (Japan)\0", NULL, "Virgin Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_CircuitusaRomInfo, snes_CircuitusaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sid Meier's Civilization (USA) + +static struct BurnRomInfo snes_CivilizationRomDesc[] = { + { "Sid Meier's Civilization (U)(1995)(Koei).sfc", 1572864, 0x41fdba82, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Civilization) +STD_ROM_FN(snes_Civilization) + +struct BurnDriver BurnDrvsnes_Civilization = { + "snes_civilization", NULL, NULL, NULL, "1995", + "Sid Meier's Civilization (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_CivilizationRomInfo, snes_CivilizationRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Civilization - Sekai Shichi Daibunmei (Japan) + +static struct BurnRomInfo snes_CivilizationjRomDesc[] = { + { "Civilization - Sekai Shichi Daibunmei (J)(1994)(Asmik).sfc", 1310720, 0x9d5ce088, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Civilizationj) +STD_ROM_FN(snes_Civilizationj) + +struct BurnDriver BurnDrvsnes_Civilizationj = { + "snes_civilizationj", "snes_civilization", NULL, NULL, "1994", + "Civilization - Sekai Shichi Daibunmei (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_CivilizationjRomInfo, snes_CivilizationjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clay Fighter (USA) + +static struct BurnRomInfo snes_ClayfightRomDesc[] = { + { "Clay Fighter (U)(1993)(Interplay).sfc", 2097152, 0xc814e3c2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clayfight) +STD_ROM_FN(snes_Clayfight) + +struct BurnDriver BurnDrvsnes_Clayfight = { + "snes_clayfight", NULL, NULL, NULL, "1993", + "Clay Fighter (USA)\0", NULL, "Inrerplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_ClayfightRomInfo, snes_ClayfightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clay Fighter 2 - Judgment Clay (USA) + +static struct BurnRomInfo snes_Clayfight2RomDesc[] = { + { "Clay Fighter 2 - Judgment Clay (U)(1994)(Interplay).sfc", 3145728, 0x20b5c364, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clayfight2) +STD_ROM_FN(snes_Clayfight2) + +struct BurnDriver BurnDrvsnes_Clayfight2 = { + "snes_clayfight2", NULL, NULL, NULL, "1994", + "Clay Fighter 2 - Judgment Clay (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Clayfight2RomInfo, snes_Clayfight2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clay Fighter - Tournament Edition (USA) + +static struct BurnRomInfo snes_ClayfightttRomDesc[] = { + { "Clay Fighter - Tournament Edition (U)(1994)(Interplay).sfc", 3145728, 0xb360f7af, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clayfighttt) +STD_ROM_FN(snes_Clayfighttt) + +struct BurnDriver BurnDrvsnes_Clayfighttt = { + "snes_clayfighttt", NULL, NULL, NULL, "1994", + "Clay Fighter - Tournament Edition (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_ClayfightttRomInfo, snes_ClayfightttRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Claymates (USA) + +static struct BurnRomInfo snes_ClaymatesRomDesc[] = { + { "Claymates (U)(1993)(Interplay).sfc", 1048576, 0x7ad5ccac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Claymates) +STD_ROM_FN(snes_Claymates) + +struct BurnDriver BurnDrvsnes_Claymates = { + "snes_claymates", NULL, NULL, NULL, "1993", + "Claymates (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ClaymatesRomInfo, snes_ClaymatesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cliffhanger (USA) + +static struct BurnRomInfo snes_CliffhangRomDesc[] = { + { "Cliffhanger (U)(1993)(Sony Imagesoft).sfc", 1048576, 0x12f8a26c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cliffhang) +STD_ROM_FN(snes_Cliffhang) + +struct BurnDriver BurnDrvsnes_Cliffhang = { + "snes_cliffhang", NULL, NULL, NULL, "1993", + "Cliffhanger (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_CliffhangRomInfo, snes_CliffhangRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clock Tower (Japan) + +static struct BurnRomInfo snes_ClocktowerjRomDesc[] = { + { "Clock Tower (J)(1995)(Human Entertainment).sfc", 3145728, 0xcbcd0dad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clocktowerj) +STD_ROM_FN(snes_Clocktowerj) + +struct BurnDriver BurnDrvsnes_Clocktowerj = { + "snes_clocktowerj", "snes_clocktowerte", NULL, NULL, "1995", + "Clock Tower (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_ClocktowerjRomInfo, snes_ClocktowerjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clock Tower (Hack, English v1.01) +// https://www.romhacking.net/translations/302/ +static struct BurnRomInfo snes_ClocktowerteRomDesc[] = { + { "Clock Tower T-Eng v1.01 (2001)(Aeon Genesis).sfc", 3277312, 0x08536497, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clocktowerte) +STD_ROM_FN(snes_Clocktowerte) + +struct BurnDriver BurnDrvsnes_Clocktowerte = { + "snes_clocktowerte", NULL, NULL, NULL, "2001", + "Clock Tower (Hack, English v1.01)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_ClocktowerteRomInfo, snes_ClocktowerteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clock Tower (Hack, Italian) +// https://romhacking.it/project/view/id/18 +static struct BurnRomInfo snes_ClocktowertiRomDesc[] = { + { "Clock Tower T-Ita (2004)(Fray83).sfc", 3277312, 0xca6f2508, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clocktowerti) +STD_ROM_FN(snes_Clocktowerti) + +struct BurnDriver BurnDrvsnes_Clocktowerti = { + "snes_clocktowerti", "snes_clocktowerte", NULL, NULL, "2004", + "Clock Tower (Hack, Italian)\0", NULL, "Fray83", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_ClocktowertiRomInfo, snes_ClocktowertiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clock Tower (Hack, Portuguese) +// https://romhackers.org/traducoes/console/super-nes/clock-tower-denver/ +static struct BurnRomInfo snes_ClocktowertpRomDesc[] = { + { "Clock Tower T-Por (2012)(Denver).sfc", 3276800, 0xe7389adb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clocktowertp) +STD_ROM_FN(snes_Clocktowertp) + +struct BurnDriver BurnDrvsnes_Clocktowertp = { + "snes_clocktowertp", "snes_clocktowerte", NULL, NULL, "2012", + "Clock Tower (Hack, Portuguese)\0", NULL, "Denver", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_ClocktowertpRomInfo, snes_ClocktowertpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clock Tower (Hack, Spanish) +// https://tiovictor.romhackhispano.org/clock-tower/descargar/ +static struct BurnRomInfo snes_ClocktowertsRomDesc[] = { + { "Clock Tower T-Spa (2018)(Victor IlDucci).sfc", 3277312, 0x0e7ee3de, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clocktowerts) +STD_ROM_FN(snes_Clocktowerts) + +struct BurnDriver BurnDrvsnes_Clocktowerts = { + "snes_clocktowerts", "snes_clocktowerte", NULL, NULL, "2018", + "Clock Tower (Hack, Spanish)\0", NULL, "Victor IlDucci", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_ClocktowertsRomInfo, snes_ClocktowertsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clockwerx (Japan) + +static struct BurnRomInfo snes_ClockwerxRomDesc[] = { + { "Clockwerx (J)(1995)(Tokuma Shoten).sfc", 524288, 0xa62b84ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clockwerx) +STD_ROM_FN(snes_Clockwerx) + +struct BurnDriver BurnDrvsnes_Clockwerx = { + "snes_clockwerx", NULL, NULL, NULL, "1995", + "Clockwerx (Japan)\0", NULL, "Tokuma Shoten", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_ClockwerxRomInfo, snes_ClockwerxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Clue (USA) + +static struct BurnRomInfo snes_ClueRomDesc[] = { + { "Clue (U)(1992)(Parker Brothers).sfc", 524288, 0xa4fbe827, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Clue) +STD_ROM_FN(snes_Clue) + +struct BurnDriver BurnDrvsnes_Clue = { + "snes_clue", NULL, NULL, NULL, "1992", + "Clue (USA)\0", NULL, "Parker Brothers", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 6, HARDWARE_SNES, GBF_BOARD, 0, + SNESGetZipName, snes_ClueRomInfo, snes_ClueRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// College Slam (USA) + +static struct BurnRomInfo snes_CollegeslamRomDesc[] = { + { "College Slam (U)(1996)(Acclaim Entertainment).sfc", 3145728, 0xce842c6d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Collegeslam) +STD_ROM_FN(snes_Collegeslam) + +struct BurnDriver BurnDrvsnes_Collegeslam = { + "snes_collegeslam", NULL, NULL, NULL, "1996", + "College Slam (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_CollegeslamRomInfo, snes_CollegeslamRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Congo's Caper (USA) + +static struct BurnRomInfo snes_CongocaperRomDesc[] = { + { "Congo's Caper (U)(1993)(Data East).sfc", 524288, 0x8a24fba8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Congocaper) +STD_ROM_FN(snes_Congocaper) + +struct BurnDriver BurnDrvsnes_Congocaper = { + "snes_congocaper", NULL, NULL, NULL, "1993", + "Congo's Caper (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_CongocaperRomInfo, snes_CongocaperRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Contra III - The Alien Wars (USA) + +static struct BurnRomInfo snes_ContraiiiRomDesc[] = { + { "Contra III - The Alien Wars (U)(1992)(Konami).sfc", 1048576, 0x84da7cfe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Contraiii) +STD_ROM_FN(snes_Contraiii) + +struct BurnDriver BurnDrvsnes_Contraiii = { + "snes_contraiii", NULL, NULL, NULL, "1992", + "Contra III - The Alien Wars (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_RUNGUN, 0, + SNESGetZipName, snes_ContraiiiRomInfo, snes_ContraiiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Contra Spirits (Japan) + +static struct BurnRomInfo snes_ContraiiijRomDesc[] = { + { "Contra Spirits (J)(1992)(Konami).sfc", 1048576, 0xb8cfe377, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Contraiiij) +STD_ROM_FN(snes_Contraiiij) + +struct BurnDriver BurnDrvsnes_Contraiiij = { + "snes_contraiiij", "snes_contraiii", NULL, NULL, "1992", + "Contra Spirits (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_ContraiiijRomInfo, snes_ContraiiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cool Spot (USA) + +static struct BurnRomInfo snes_CoolspotRomDesc[] = { + { "Cool Spot (U)(1993)(Virgin Games).sfc", 1048576, 0x44e60e58, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Coolspot) +STD_ROM_FN(snes_Coolspot) + +struct BurnDriver BurnDrvsnes_Coolspot = { + "snes_coolspot", NULL, NULL, NULL, "1993", + "Cool Spot (USA)\0", NULL, "Virgin Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_CoolspotRomInfo, snes_CoolspotRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cooly Skunk (Japan, Prototype) + +static struct BurnRomInfo snes_CoolyskunkjpRomDesc[] = { + { "Cooly Skunk (J, Proto)(1996)(Visit).sfc", 1048576, 0x90fd3134, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Coolyskunkjp) +STD_ROM_FN(snes_Coolyskunkjp) + +struct BurnDriver BurnDrvsnes_Coolyskunkjp = { + "snes_coolyskunkjp", "snes_coolyskunkte", NULL, NULL, "1996", + "Cooly Skunk (Japan, Prototype)\0", NULL, "Visit", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_CoolyskunkjpRomInfo, snes_CoolyskunkjpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cooly Skunk (Hack, English v1.1) +// https://www.romhacking.net/translations/5370/ +static struct BurnRomInfo snes_CoolyskunkteRomDesc[] = { + { "Cooly Skunk T-Eng v1.1 (2020)(Psyklax).sfc", 1048576, 0x585d33b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Coolyskunkte) +STD_ROM_FN(snes_Coolyskunkte) + +struct BurnDriver BurnDrvsnes_Coolyskunkte = { + "snes_coolyskunkte", NULL, NULL, NULL, "2020", + "Cooly Skunk (Hack, English v1.1)\0", NULL, "Psyklax", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_CoolyskunkteRomInfo, snes_CoolyskunkteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cool World (USA) + +static struct BurnRomInfo snes_CoolworldRomDesc[] = { + { "Cool World (U)(1992)(Ocean).sfc", 1048576, 0x0730c37c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Coolworld) +STD_ROM_FN(snes_Coolworld) + +struct BurnDriver BurnDrvsnes_Coolworld = { + "snes_coolworld", NULL, NULL, NULL, "1992", + "Cool World (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_CoolworldRomInfo, snes_CoolworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Corn Buster (Euro, Prototype) + +static struct BurnRomInfo snes_CornbustprotoRomDesc[] = { + { "Corn Buster (E, Proto)(1995)(Engine Software).sfc", 2031616, 0xb5fbad04, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cornbustproto) +STD_ROM_FN(snes_Cornbustproto) + +struct BurnDriver BurnDrvsnes_Cornbustproto = { + "snes_cornbustproto", NULL, NULL, NULL, "1995", + "Corn Buster (Euro, Prototype)\0", NULL, "Engine Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_CornbustprotoRomInfo, snes_CornbustprotoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Coron Land (Japan) + +static struct BurnRomInfo snes_CoronlandRomDesc[] = { + { "Coron Land (J)(1995)(Yumedia).sfc", 1048576, 0x236932e0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Coronland) +STD_ROM_FN(snes_Coronland) + +struct BurnDriver BurnDrvsnes_Coronland = { + "snes_coronland", NULL, NULL, NULL, "1995", + "Coron Land (Japan)\0", NULL, "Yumedia", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_CoronlandRomInfo, snes_CoronlandRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cosmo Gang - The Video (Japan) + +static struct BurnRomInfo snes_CosmogangRomDesc[] = { + { "Cosmo Gang - The Video (J)(1992)(Namco).sfc", 1048576, 0xa26dc1de, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cosmogang) +STD_ROM_FN(snes_Cosmogang) + +struct BurnDriver BurnDrvsnes_Cosmogang = { + "snes_cosmogang", NULL, NULL, NULL, "1992", + "Cosmo Gang - The Video (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_CosmogangRomInfo, snes_CosmogangRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cosmo Gang - The Puzzle (Japan) + +static struct BurnRomInfo snes_CosmogangpzljRomDesc[] = { + { "Cosmo Gang - The Puzzle (J)(1993)(Namco).sfc", 524288, 0x61b26167, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cosmogangpzlj) +STD_ROM_FN(snes_Cosmogangpzlj) + +struct BurnDriver BurnDrvsnes_Cosmogangpzlj = { + "snes_cosmogangpzlj", NULL, NULL, NULL, "1993", + "Cosmo Gang - The Puzzle (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_CosmogangpzljRomInfo, snes_CosmogangpzljRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Crayon Shin-chan - Arashi o Yobu Enji (Japan) + +static struct BurnRomInfo snes_CrayonshinchanRomDesc[] = { + { "Crayon Shin-chan - Arashi o Yobu Enji (J)(1993)(Bandai).sfc", 1572864, 0x36c23f9a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Crayonshinchan) +STD_ROM_FN(snes_Crayonshinchan) + +struct BurnDriver BurnDrvsnes_Crayonshinchan = { + "snes_crayonshinchan", NULL, NULL, NULL, "1993", + "Crayon Shin-chan - Arashi o Yobu Enji (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_CrayonshinchanRomInfo, snes_CrayonshinchanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Crayon Shin-chan 2 - Daimaou no Gyakushuu (Japan) + +static struct BurnRomInfo snes_Crayonshinchan2RomDesc[] = { + { "Crayon Shin-chan 2 - Daimaou no Gyakushuu (J)(1994)(Bandai).sfc", 524288, 0x24373cc6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Crayonshinchan2) +STD_ROM_FN(snes_Crayonshinchan2) + +struct BurnDriver BurnDrvsnes_Crayonshinchan2 = { + "snes_crayonshinchan2", NULL, NULL, NULL, "1994", + "Crayon Shin-chan 2 - Daimaou no Gyakushuu (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Crayonshinchan2RomInfo, snes_Crayonshinchan2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Crystal Beans From Dungeon Explorer (Japan) + +static struct BurnRomInfo snes_CrystalbeansjRomDesc[] = { + { "Crystal Beans From Dungeon Explorer (J)(1995)(Hudson Soft).sfc", 1572864, 0x79663a93, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Crystalbeansj) +STD_ROM_FN(snes_Crystalbeansj) + +struct BurnDriver BurnDrvsnes_Crystalbeansj = { + "snes_crystalbeansj", "snes_crystalbeanste", NULL, NULL, "1995", + "Crystal Beans From Dungeon Explorer\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_CrystalbeansjRomInfo, snes_CrystalbeansjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Crystal Beans From Dungeon Explorer (Hack, English) +// https://www.romhacking.net/translations/1710/ +static struct BurnRomInfo snes_CrystalbeansteRomDesc[] = { + { "Crystal Beans From Dungeon Explorer T-Eng (2012)(Hiei-, Neige).sfc", 2097152, 0x93c106fc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Crystalbeanste) +STD_ROM_FN(snes_Crystalbeanste) + +struct BurnDriver BurnDrvsnes_Crystalbeanste = { + "snes_crystalbeanste", NULL, NULL, NULL, "2012", + "Crystal Beans From Dungeon Explorer (Hack, English)\0", NULL, "Hiei-, Neige", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_CrystalbeansteRomInfo, snes_CrystalbeansteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Crystal Beans From Dungeon Explorer (Hack, Spanish) + +static struct BurnRomInfo snes_CrystalbeanstsRomDesc[] = { + { "Crystal Beans From Dungeon Explorer T-Spa (2012)(Lukas).sfc", 2097152, 0x8d542b04, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Crystalbeansts) +STD_ROM_FN(snes_Crystalbeansts) + +struct BurnDriver BurnDrvsnes_Crystalbeansts = { + "snes_crystalbeansts", "snes_crystalbeanste", NULL, NULL, "2012", + "Crystal Beans From Dungeon Explorer (Hack, Spanish)\0", NULL, "Lukas", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_CrystalbeanstsRomInfo, snes_CrystalbeanstsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Combatribes, The (USA) + +static struct BurnRomInfo snes_CtribesRomDesc[] = { + { "Combatribes, The (U)(1992)(Technos).sfc", 1572864, 0x9304044a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ctribes) +STD_ROM_FN(snes_Ctribes) + +struct BurnDriver BurnDrvsnes_Ctribes = { + "snes_ctribes", NULL, NULL, NULL, "1992", + "Combatribes, The (USA)\0", NULL, "Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_CtribesRomInfo, snes_CtribesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Combatribes, The (Japan) + +static struct BurnRomInfo snes_CtribesjRomDesc[] = { + { "Combatribes, The (J)(1992)(Technos).sfc", 1572864, 0x5e2c24f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ctribesj) +STD_ROM_FN(snes_Ctribesj) + +struct BurnDriver BurnDrvsnes_Ctribesj = { + "snes_ctribesj", "snes_ctribes", NULL, NULL, "1992", + "Combatribes, The (Japan)\0", NULL, "Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_CtribesjRomInfo, snes_CtribesjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cu-On-Pa SFC (Japan) + +static struct BurnRomInfo snes_CuonpajRomDesc[] = { + { "Cu-On-Pa SFC (J)(1996)(T&E Soft).sfc", 1048576, 0x42d0c418, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cuonpaj) +STD_ROM_FN(snes_Cuonpaj) + +struct BurnDriver BurnDrvsnes_Cuonpaj = { + "snes_cuonpaj", NULL, NULL, NULL, "1996", + "Cu-On-Pa SFC (Japan)\0", NULL, "T&E Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_CuonpajRomInfo, snes_CuonpajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// CutThroat Island (USA) + +static struct BurnRomInfo snes_CutthroatRomDesc[] = { + { "CutThroat Island (U)(1995)(Acclaim Entertainment).sfc", 2097152, 0x19ea457b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cutthroat) +STD_ROM_FN(snes_Cutthroat) + +struct BurnDriver BurnDrvsnes_Cutthroat = { + "snes_cutthroat", NULL, NULL, NULL, "1995", + "CutThroat Island (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_CutthroatRomInfo, snes_CutthroatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shinseiki GPX - Cyber Formula (Japan) + +static struct BurnRomInfo snes_CyberformulaRomDesc[] = { + { "Shinseiki GPX - Cyber Formula (J)(1992)(Takara).sfc", 1048576, 0x403ac1c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyberformula) +STD_ROM_FN(snes_Cyberformula) + +struct BurnDriver BurnDrvsnes_Cyberformula = { + "snes_cyberformula", "snes_cyberspin", NULL, NULL, "1992", + "Shinseiki GPX - Cyber Formula (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_CyberformulaRomInfo, snes_CyberformulaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyber Knight (Japan) + +static struct BurnRomInfo snes_CyberknightjRomDesc[] = { + { "Cyber Knight (J)(1992)(Tonkin House).sfc", 1048576, 0x64034b07, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyberknightj) +STD_ROM_FN(snes_Cyberknightj) + +struct BurnDriver BurnDrvsnes_Cyberknightj = { + "snes_cyberknightj", "snes_cyberknightte", NULL, NULL, "1992", + "Cyber Knight (Japan)\0", NULL, "1992", "Tonkin House", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_CyberknightjRomInfo, snes_CyberknightjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyber Knight II: Chikyuu Teikoku no Yabou (Japan) + +static struct BurnRomInfo snes_Cyberknight2jRomDesc[] = { + { "Cyber Knight II - Chikyuu Teikoku no Yabou (J)(1994)(Tonkin House).sfc", 2097152, 0xed8bcbf4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyberknight2j) +STD_ROM_FN(snes_Cyberknight2j) + +struct BurnDriver BurnDrvsnes_Cyberknight2j = { + "snes_cyberknight2j", "snes_cycberknight2te", NULL, NULL, "1994", + "Cyber Knight II: Chikyuu Teikoku no Yabou (Japan)\0", NULL, "Tonkin House", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Cyberknight2jRomInfo, snes_Cyberknight2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyber Knight II: Ambitions of the Terran Empire (Hack, English) +// https://aeongenesis.net/projects/ck2 +static struct BurnRomInfo snes_Cycberknight2teRomDesc[] = { + { "Cyber Knight II - Ambitions of the Terran Empire T-Eng (2005)(Aeon Genesis).sfc", 2097152, 0x1e147c70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cycberknight2te) +STD_ROM_FN(snes_Cycberknight2te) + +struct BurnDriver BurnDrvsnes_Cycberknight2te = { + "snes_cycberknight2te", NULL, NULL, NULL, "2005", + "Cyber Knight II: Ambitions of the Terran Empire (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Cycberknight2teRomInfo, snes_Cycberknight2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyber Knight (Hack, English v1.01) +// https://www.romhacking.net/translations/304/ +static struct BurnRomInfo snes_CyberknightteRomDesc[] = { + { "Cyber Knight T-Eng v1.01 (2001)(Aeon Genesis).sfc", 1049088, 0x6d4548ef, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyberknightte) +STD_ROM_FN(snes_Cyberknightte) + +struct BurnDriver BurnDrvsnes_Cyberknightte = { + "snes_cyberknightte", NULL, NULL, NULL, "2001", + "Cyber Knight (Hack, English v1.01)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_CyberknightteRomInfo, snes_CyberknightteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cybernator (USA) + +static struct BurnRomInfo snes_CybernatorRomDesc[] = { + { "Cybernator (U)(1993)(Konami).sfc", 1048576, 0x4dfa05b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cybernator) +STD_ROM_FN(snes_Cybernator) + +struct BurnDriver BurnDrvsnes_Cybernator = { + "snes_cybernator", NULL, NULL, NULL, "1993", + "Cybernator (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_CybernatorRomInfo, snes_CybernatorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyber Spin (USA) + +static struct BurnRomInfo snes_CyberspinRomDesc[] = { + { "Cyber Spin (U)(1992)(Takara).sfc", 524288, 0x44018650, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyberspin) +STD_ROM_FN(snes_Cyberspin) + +struct BurnDriver BurnDrvsnes_Cyberspin = { + "snes_cyberspin", NULL, NULL, NULL, "1992", + "Cyber Spin (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_CyberspinRomInfo, snes_CyberspinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyborg 009 (Japan) + +static struct BurnRomInfo snes_Cyborg009jRomDesc[] = { + { "Cyborg 009 (J)(1994)(Bec).sfc", 1048576, 0x4a5263db, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyborg009j) +STD_ROM_FN(snes_Cyborg009j) + +struct BurnDriver BurnDrvsnes_Cyborg009j = { + "snes_cyborg009j", "snes_cyborg009te", NULL, NULL, "1994", + "Cyborg 009 (Japan)\0", NULL, "Bec", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Cyborg009jRomInfo, snes_Cyborg009jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cyborg 009 (Hack, English) +// https://www.romhacking.net/translations/758/ +static struct BurnRomInfo snes_Cyborg009teRomDesc[] = { + { "Cyborg 009 T-Eng (2004)(Aeon Genesis).sfc", 1114112, 0x41ebe61b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cyborg009te) +STD_ROM_FN(snes_Cyborg009te) + +struct BurnDriver BurnDrvsnes_Cyborg009te = { + "snes_cyborg009te", NULL, NULL, NULL, "2004", + "Cyborg 009 (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Cyborg009teRomInfo, snes_Cyborg009teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Choujikuu Yousai Macross - Scrambled Valkyrie (Japan) + +static struct BurnRomInfo snes_CymacrossRomDesc[] = { + { "Choujikuu Yousai Macross - Scrambled Valkyrie (J)(1993)(Zamuse - Big West).sfc", 1048576, 0xa5db02e9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cymacross) +STD_ROM_FN(snes_Cymacross) + +struct BurnDriver BurnDrvsnes_Cymacross = { + "snes_cymacross", NULL, NULL, NULL, "1993", + "Choujikuu Yousai Macross - Scrambled Valkyrie (Japan)\0", NULL, "Zamuse - Big West", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_CymacrossRomInfo, snes_CymacrossRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Daffy Duck - The Marvin Missions (USA) + +static struct BurnRomInfo snes_DaffyducktmmRomDesc[] = { + { "Daffy Duck - The Marvin Missions (U)(1993)(Sunsoft).sfc", 1048576, 0x5f02a044, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daffyducktmm) +STD_ROM_FN(snes_Daffyducktmm) + +struct BurnDriver BurnDrvsnes_Daffyducktmm = { + "snes_daffyducktmm", NULL, NULL, NULL, "1993", + "Daffy Duck - The Marvin Missions (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DaffyducktmmRomInfo, snes_DaffyducktmmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dai-3-ji Super Robot Taisen (Japan) + +static struct BurnRomInfo snes_Dai3jisrtRomDesc[] = { + { "Dai-3-ji Super Robot Taisen (J)(1993)(Banpresto).sfc", 1572864, 0xdfe9cc90, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dai3jisrt) +STD_ROM_FN(snes_Dai3jisrt) + +struct BurnDriver BurnDrvsnes_Dai3jisrt = { + "snes_dai3jisrt", "snes_suprobwars3", NULL, NULL, "1993", + "Dai-3-ji Super Robot Taisen (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Dai3jisrtRomInfo, snes_Dai3jisrtRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Daikaijuu Monogatari (Japan) + +static struct BurnRomInfo snes_DaikaijuuRomDesc[] = { + { "Daikaijuu Monogatari (J)(1994)(Hudson Soft).sfc", 3145728, 0x39ca5291, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daikaijuu) +STD_ROM_FN(snes_Daikaijuu) + +struct BurnDriver BurnDrvsnes_Daikaijuu = { + "snes_daikaijuu", "snes_ssmste", NULL, NULL, "1994", + "Daikaijuu Monogatari (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DaikaijuuRomInfo, snes_DaikaijuuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Daikaijuu Monogatari II (Japan) + +static struct BurnRomInfo snes_Daikaijuu2RomDesc[] = { + { "Daikaijuu Monogatari II (J)(1996)(Hudson Soft).sfc", 5242880, 0xa6c98ffe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daikaijuu2) +STD_ROM_FN(snes_Daikaijuu2) + +struct BurnDriver BurnDrvsnes_Daikaijuu2 = { + "snes_daikaijuu2", "snes_ssms2te", NULL, NULL, "1996", + "Daikaijuu Monogatari II (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Daikaijuu2RomInfo, snes_Daikaijuu2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Daikoukai Jidai (Japan) + +static struct BurnRomInfo snes_DaikojidaiRomDesc[] = { + { "Super Daikoukai Jidai (J)(1991)(Koei).sfc", 1048576, 0x3a78fcd2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daikojidai) +STD_ROM_FN(snes_Daikojidai) + +struct BurnDriver BurnDrvsnes_Daikojidai = { + "snes_daikojidai", "snes_unchwaters", NULL, NULL, "1991", + "Super Daikoukai Jidai (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DaikojidaiRomInfo, snes_DaikojidaiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Daikoukai Jidai II (Japan) + +static struct BurnRomInfo snes_Daikojidai2RomDesc[] = { + { "Daikoukai Jidai II (J)(1994)(Koei).sfc", 2097152, 0xeebc4170, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daikojidai2) +STD_ROM_FN(snes_Daikojidai2) + +struct BurnDriver BurnDrvsnes_Daikojidai2 = { + "snes_daikojidai2", "snes_newhorizons", NULL, NULL, "1994", + "Daikoukai Jidai II (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Daikojidai2RomInfo, snes_Daikojidai2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganbare! Daiku no Gen-san (Japan) + +static struct BurnRomInfo snes_DaikugensanRomDesc[] = { + { "Ganbare! Daiku no Gen-san (J)(1993)(Irem Corp.).sfc", 1048576, 0x206bd866, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Daikugensan) +STD_ROM_FN(snes_Daikugensan) + +struct BurnDriver BurnDrvsnes_Daikugensan = { + "snes_daikugensan", NULL, NULL, NULL, "1993", + "Ganbare! Daiku no Gen-san (Japan)\0", NULL, "Irem Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DaikugensanRomInfo, snes_DaikugensanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Darius Force (Japan) + +static struct BurnRomInfo snes_DariusforceRomDesc[] = { + { "Darius Force (J)(1993)(Taito Corp.).sfc", 1048576, 0x3e828e49, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dariusforce) +STD_ROM_FN(snes_Dariusforce) + +struct BurnDriver BurnDrvsnes_Dariusforce = { + "snes_dariusforce", "snes_supernova", NULL, NULL, "1993", + "Darius Force (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_DariusforceRomInfo, snes_DariusforceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Darius Twin (USA) + +static struct BurnRomInfo snes_DariustwinRomDesc[] = { + { "Darius Twin (U)(1991)(Taito).sfc", 1048576, 0xc5341764, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dariustwin) +STD_ROM_FN(snes_Dariustwin) + +struct BurnDriver BurnDrvsnes_Dariustwin = { + "snes_dariustwin", NULL, NULL, NULL, "1991", + "Darius Twin (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_DariustwinRomInfo, snes_DariustwinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Darius Twin (Japan) + +static struct BurnRomInfo snes_DariustwinjRomDesc[] = { + { "Darius Twin (J)(1991)(Taito).sfc", 1048576, 0x299df5fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dariustwinj) +STD_ROM_FN(snes_Dariustwinj) + +struct BurnDriver BurnDrvsnes_Dariustwinj = { + "snes_dariustwinj", "snes_dariustwin", NULL, NULL, "1991", + "Darius Twin (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_DariustwinjRomInfo, snes_DariustwinjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dark Half (Japan) + +static struct BurnRomInfo snes_DarkhalfjRomDesc[] = { + { "Dark Half (J)(1996)(Enix).sfc", 3145728, 0x7b9793b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Darkhalfj) +STD_ROM_FN(snes_Darkhalfj) + +struct BurnDriver BurnDrvsnes_Darkhalfj = { + "snes_darkhalfj", "snes_darkhalfte", NULL, NULL, "1996", + "Dark Half (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DarkhalfjRomInfo, snes_DarkhalfjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dark Half (Hack, English) +// https://www.romhacking.net/translations/2344/ +static struct BurnRomInfo snes_DarkhalfteRomDesc[] = { + { "Dark Half T-Eng (2015)(Aeon Genesis).sfc", 4194304, 0x18877841, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Darkhalfte) +STD_ROM_FN(snes_Darkhalfte) + +struct BurnDriver BurnDrvsnes_Darkhalfte = { + "snes_darkhalfte", NULL, NULL, NULL, "2015", + "Dark Half (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DarkhalfteRomInfo, snes_DarkhalfteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dark Half (Hack, Spanish) +// https://www.romhacking.net/translations/7247/ +static struct BurnRomInfo snes_DarkhalftsRomDesc[] = { + { "Dark Half T-Spa (2024)(Max1323).sfc", 4194304, 0xa9d6e96f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Darkhalfts) +STD_ROM_FN(snes_Darkhalfts) + +struct BurnDriver BurnDrvsnes_Darkhalfts = { + "snes_darkhalfts", "snes_darkhalfte", NULL, NULL, "2024", + "Dark Half (Hack, Spanish)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DarkhalftsRomInfo, snes_DarkhalftsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dark Law: Meaning of Death (Japan) + +static struct BurnRomInfo snes_DarklawjRomDesc[] = { + { "Dark Law - Meaning of Death (J)(1997)(ASCII).sfc", 4194304, 0x125a0c22, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Darklawj) +STD_ROM_FN(snes_Darklawj) + +struct BurnDriver BurnDrvsnes_Darklawj = { + "snes_darklawj", "snes_darklawte", NULL, NULL, "1997", + "Dark Law: Meaning of Death (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DarklawjRomInfo, snes_DarklawjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dark Law: Meaning of Death (Hack, English) +// https://aeongenesis.net/projects/darklaw +static struct BurnRomInfo snes_DarklawteRomDesc[] = { + { "Dark Law - Meaning of Death T-Eng (2007)(Aeon Genesis).sfc", 4194304, 0xc383a51c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Darklawte) +STD_ROM_FN(snes_Darklawte) + +struct BurnDriver BurnDrvsnes_Darklawte = { + "snes_darklawte", NULL, NULL, NULL, "2007", + "Dark Law: Meaning of Death (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DarklawteRomInfo, snes_DarklawteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Daze Before Christmas (Euro) + +static struct BurnRomInfo snes_Dazeb4xmasRomDesc[] = { + { "Daze Before Christmas (E)(1994)(Sunsoft).sfc", 2097152, 0x59909eb5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dazeb4xmas) +STD_ROM_FN(snes_Dazeb4xmas) + +struct BurnDriver BurnDrvsnes_Dazeb4xmas = { + "snes_dazeb4xmas", NULL, NULL, NULL, "1994", + "Daze Before Christmas (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Dazeb4xmasRomInfo, snes_Dazeb4xmasRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// David Crane's Amazing Tennis (USA) + +static struct BurnRomInfo snes_DcatennisRomDesc[] = { + { "David Crane's Amazing Tennis (U)(1992)(Absolute Entertainment).sfc", 1048576, 0xcaad18dc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dcatennis) +STD_ROM_FN(snes_Dcatennis) + +struct BurnDriver BurnDrvsnes_Dcatennis = { + "snes_dcatennis", NULL, NULL, NULL, "1992", + "David Crane's Amazing Tennis (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_DcatennisRomInfo, snes_DcatennisRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Demon Child Zenki - Battle Raiden (Hack, English) +// https://www.romhacking.net/translations/2570/ +static struct BurnRomInfo snes_DczbrteRomDesc[] = { + { "Demon Child Zenki - Battle Raiden T-Eng (2016)(Dynamic-Designs).sfc", 2097152, 0x6bbcf578, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dczbrte) +STD_ROM_FN(snes_Dczbrte) + +struct BurnDriver BurnDrvsnes_Dczbrte = { + "snes_dczbrte", NULL, NULL, NULL, "2016", + "Demon Child Zenki - Battle Raiden (Hack, English)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_DczbrteRomInfo, snes_DczbrteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dharma Doujou (Japan) + +static struct BurnRomInfo snes_DdoujouRomDesc[] = { + { "Dharma Doujou (J)(1994)(Metro Corp.).sfc", 1048576, 0xb800a4fb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ddoujou) +STD_ROM_FN(snes_Ddoujou) + +struct BurnDriver BurnDrvsnes_Ddoujou = { + "snes_ddoujou", NULL, NULL, NULL, "1994", + "Dharma Doujou (Japan)\0", NULL, "Metro Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_DdoujouRomInfo, snes_DdoujouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dead Dance (Japan) + +static struct BurnRomInfo snes_DeaddanceRomDesc[] = { + { "Dead Dance (J)(1993)(Jaleco).sfc", 2097152, 0x7019b1f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Deaddance) +STD_ROM_FN(snes_Deaddance) + +struct BurnDriver BurnDrvsnes_Deaddance = { + "snes_deaddance", "snes_tuffenuff", NULL, NULL, "1993", + "Dead Dance (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DeaddanceRomInfo, snes_DeaddanceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Deae Tonosama - Appare Ichiban (Japan) + +static struct BurnRomInfo snes_DeaetonoRomDesc[] = { + { "Deae Tonosama - Appare Ichiban (J)(1995)(Sunsoft).sfc", 1572864, 0x6e42d71b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Deaetono) +STD_ROM_FN(snes_Deaetono) + +struct BurnDriver BurnDrvsnes_Deaetono = { + "snes_deaetono", NULL, NULL, NULL, "1995", + "Deae Tonosama - Appare Ichiban (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_DeaetonoRomInfo, snes_DeaetonoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Death Brade (Japan) + +static struct BurnRomInfo snes_DeathbradeRomDesc[] = { + { "Death Brade (J)(1993)(I'Max).sfc", 1572864, 0xca46fd3b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Deathbrade) +STD_ROM_FN(snes_Deathbrade) + +struct BurnDriver BurnDrvsnes_Deathbrade = { + "snes_deathbrade", NULL, NULL, NULL, "1993", + "Death Brade (Japan)\0", NULL, "I'Max", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DeathbradeRomInfo, snes_DeathbradeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Demolition Man (USA) + +static struct BurnRomInfo snes_DemolmanRomDesc[] = { + { "Demolition Man (U)(1995)(Acclaim Entertainment).sfc", 2097152, 0x8afe2f91, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Demolman) +STD_ROM_FN(snes_Demolman) + +struct BurnDriver BurnDrvsnes_Demolman = { + "snes_demolman", NULL, NULL, NULL, "1995", + "Demolition Man (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_DemolmanRomInfo, snes_DemolmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Demon's Blazon - Makaimura Monshou Hen (Japan) + +static struct BurnRomInfo snes_DemonblazonRomDesc[] = { + { "Demon's Blazon - Makaimura Monshou Hen (J)(1994)(Capcom).sfc", 2097152, 0x287f10cc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Demonblazon) +STD_ROM_FN(snes_Demonblazon) + +struct BurnDriver BurnDrvsnes_Demonblazon = { + "snes_demonblazon", "snes_demonscrest", NULL, NULL, "1994", + "Demon's Blazon - Makaimura Monshou Hen (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DemonblazonRomInfo, snes_DemonblazonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Demon's Crest (USA) + +static struct BurnRomInfo snes_DemonscrestRomDesc[] = { + { "Demon's Crest (U)(1994)(Capcom).sfc", 2097152, 0xe8236ad2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Demonscrest) +STD_ROM_FN(snes_Demonscrest) + +struct BurnDriver BurnDrvsnes_Demonscrest = { + "snes_demonscrest", NULL, NULL, NULL, "1994", + "Demon's Crest (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DemonscrestRomInfo, snes_DemonscrestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dennis the Menace (USA) + +static struct BurnRomInfo snes_DennisRomDesc[] = { + { "Dennis the Menace (U)(1993)(Ocean).sfc", 1048576, 0x8ee7faa5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dennis) +STD_ROM_FN(snes_Dennis) + +struct BurnDriver BurnDrvsnes_Dennis = { + "snes_dennis", NULL, NULL, NULL, "1993", + "Dennis the Menace (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DennisRomInfo, snes_DennisRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Desert Fighter (Euro) + +static struct BurnRomInfo snes_DesertfighteRomDesc[] = { + { "Desert Fighter (E)(1994)(System 3).sfc", 1048576, 0xb78bae0e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Desertfighte) +STD_ROM_FN(snes_Desertfighte) + +struct BurnDriver BurnDrvsnes_Desertfighte = { + "snes_desertfighte", "snes_asp", NULL, NULL, "1994", + "Desert Fighter (Euro)\0", NULL, "System 3", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_DesertfighteRomInfo, snes_DesertfighteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Desert Fighter - Suna no Arashi Sakusen (Japan) + +static struct BurnRomInfo snes_DesertfightjRomDesc[] = { + { "Desert Fighter - Suna no Arashi Sakusen (J)(1993)(Seta).sfc", 1048576, 0x9edc5a7d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Desertfightj) +STD_ROM_FN(snes_Desertfightj) + +struct BurnDriver BurnDrvsnes_Desertfightj = { + "snes_desertfightj", "snes_asp", NULL, NULL, "1993", + "Desert Fighter - Suna no Arashi Sakusen (Japan)\0", NULL, "Seta Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_DesertfightjRomInfo, snes_DesertfightjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Desert Strike - Return to the Gulf (USA) + +static struct BurnRomInfo snes_DesertstrikeRomDesc[] = { + { "Desert Strike - Return to the Gulf (U)(1992)(Electronic Arts).sfc", 1048576, 0x4ce26787, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Desertstrike) +STD_ROM_FN(snes_Desertstrike) + +struct BurnDriver BurnDrvsnes_Desertstrike = { + "snes_desertstrike", NULL, NULL, NULL, "1992", + "Desert Strike - Return to the Gulf (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_DesertstrikeRomInfo, snes_DesertstrikeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Desert Strike - Wangan Sakusen (Japan) + +static struct BurnRomInfo snes_DesertstrikejRomDesc[] = { + { "Desert Strike - Wangan Sakusen (J)(1992)(Electronic Arts).sfc", 1048576, 0xfcdf43ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Desertstrikej) +STD_ROM_FN(snes_Desertstrikej) + +struct BurnDriver BurnDrvsnes_Desertstrikej = { + "snes_desertstrikej", "snes_desertstrike", NULL, NULL, "1992", + "Desert Strike - Wangan Sakusen (Japan)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_DesertstrikejRomInfo, snes_DesertstrikejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Destructive (Japan) + +static struct BurnRomInfo snes_DestructRomDesc[] = { + { "Destructive (J)(1993)(Bandai).sfc", 524288, 0x21b47e62, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Destruct) +STD_ROM_FN(snes_Destruct) + +struct BurnDriver BurnDrvsnes_Destruct = { + "snes_destruct", "snes_bazooblitz", NULL, NULL, "1993", + "Destructive (Japan)\0", "'Super Scope' exclusive game", "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_DestructRomInfo, snes_DestructRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// New 3D Golf Simulation - Devil's Course (Japan) + +static struct BurnRomInfo snes_DevilscourseRomDesc[] = { + { "New 3D Golf Simulation - Devil's Course (J)(1993)(T&E Soft).sfc", 1048576, 0x640d734f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Devilscourse) +STD_ROM_FN(snes_Devilscourse) + +struct BurnDriver BurnDrvsnes_Devilscourse = { + "snes_devilscourse", "snes_wicked18", NULL, NULL, "1993", + "New 3D Golf Simulation - Devil's Course (Japan)\0", NULL, "T&E Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_DevilscourseRomInfo, snes_DevilscourseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kaite Tsukutte Asoberu Dezaemon (Japan) + +static struct BurnRomInfo snes_DezaemonjRomDesc[] = { + { "Kaite Tsukutte Asoberu Dezaemon (J)(1994)(Athena).sfc", 524288, 0x052167cc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dezaemonj) +STD_ROM_FN(snes_Dezaemonj) + +struct BurnDriver BurnDrvsnes_Dezaemonj = { + "snes_dezaemonj", "snes_dezaemonte", NULL, NULL, "1994", + "Kaite Tsukutte Asoberu Dezaemon (Japan)\0", NULL, "Athena Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_DezaemonjRomInfo, snes_DezaemonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dezaemon (Hack, English) +// https://www.romhacking.net/translations/3749/ +static struct BurnRomInfo snes_DezaemonteRomDesc[] = { + { "Dezaemon T-Eng (2018)(Aeon Genesis)..sfc", 524288, 0x32f9c958, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dezaemonte) +STD_ROM_FN(snes_Dezaemonte) + +struct BurnDriver BurnDrvsnes_Dezaemonte = { + "snes_dezaemonte", NULL, NULL, NULL, "2018", + "Dezaemon (Hack, English)\0", NULL, "Aeon Genesis, mwksoul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_DezaemonteRomInfo, snes_DezaemonteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// D-Force (USA) + +static struct BurnRomInfo snes_DforceRomDesc[] = { + { "D-Force (U)(1991)(Asmik).sfc", 1048576, 0x24230807, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dforce) +STD_ROM_FN(snes_Dforce) + +struct BurnDriver BurnDrvsnes_Dforce = { + "snes_dforce", NULL, NULL, NULL, "1991", + "D-Force (USA)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_DforceRomInfo, snes_DforceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Dimension-Force (Japan) + +static struct BurnRomInfo snes_DforcejRomDesc[] = { + { "Dimension-Force (J)(1991)(Asmik).sfc", 1048576, 0x3d0d6fdc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dforcej) +STD_ROM_FN(snes_Dforcej) + +struct BurnDriver BurnDrvsnes_Dforcej = { + "snes_dforcej", "snes_dforce", NULL, NULL, "1991", + "Dimension-Force (Japan)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_DforcejRomInfo, snes_DforcejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Dossun! Ganseki Battle (Japan) + +static struct BurnRomInfo snes_DgbattlejRomDesc[] = { + { "Dossun! Ganseki Battle (J)(1994)(I'Max).sfc", 1048576, 0x1aa002d6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dgbattlej) +STD_ROM_FN(snes_Dgbattlej) + +struct BurnDriver BurnDrvsnes_Dgbattlej = { + "snes_dgbattlej", "snes_dgbattlete", NULL, NULL, "1994", + "Dossun! Ganseki Battle (Japan)\0", NULL, "I'Max", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_DgbattlejRomInfo, snes_DgbattlejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dossun! Ganseki Battle (Hack, English) +// https://www.romhacking.net/translations/314/ +static struct BurnRomInfo snes_DgbattleteRomDesc[] = { + { "Dossun! Ganseki Battle T-Eng (2000)(Aeon Genesis).sfc", 1048576, 0x223d17d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dgbattlete) +STD_ROM_FN(snes_Dgbattlete) + +struct BurnDriver BurnDrvsnes_Dgbattlete = { + "snes_dgbattlete", NULL, NULL, NULL, "2000", + "Dossun! Ganseki Battle (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_DgbattleteRomInfo, snes_DgbattleteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DinoCity (USA) + +static struct BurnRomInfo snes_DinocityRomDesc[] = { + { "DinoCity (U)(1992)(Irem).sfc", 1048576, 0x94152717, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dinocity) +STD_ROM_FN(snes_Dinocity) + +struct BurnDriver BurnDrvsnes_Dinocity = { + "snes_dinocity", NULL, NULL, NULL, "1992", + "DinoCity (USA)\0", NULL, "Irem", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DinocityRomInfo, snes_DinocityRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dinowars - Kyouryuu Oukoku e no Daibouken (Japan) + +static struct BurnRomInfo snes_DinowarsjRomDesc[] = { + { "Dinowars - Kyouryuu Oukoku e no Daibouken (J)(1992)(Irem).sfc", 1048576, 0x6c043bf1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dinowarsj) +STD_ROM_FN(snes_Dinowarsj) + +struct BurnDriver BurnDrvsnes_Dinowarsj = { + "snes_dinowarsj", "snes_dinocity", NULL, NULL, "1992", + "Dinowars - Kyouryuu Oukoku e no Daibouken (Japan)\0", NULL, "Irem Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DinowarsjRomInfo, snes_DinowarsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dinowars - A Great Dino Odyssey (Hack, English v2.0) +// https://www.romhacking.net/translations/6379/ +static struct BurnRomInfo snes_DinowarsteRomDesc[] = { + { "Dinowars - A Great Dino Odyssey - T-Eng v2.0 (2021)(Backlog Odyssey).sfc", 1048576, 0xe4dd8edb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dinowarste) +STD_ROM_FN(snes_Dinowarste) + +struct BurnDriver BurnDrvsnes_Dinowarste = { + "snes_dinowarste", "snes_dinocity", NULL, NULL, "2021", + "Dinowars - A Great Dino Odyssey (Hack, English v2.0)\0", NULL, "Backlog Odyssey", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DinowarsteRomInfo, snes_DinowarsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Death and Return of Superman, The (USA) + +static struct BurnRomInfo snes_DnrsupermanRomDesc[] = { + { "Death and Return of Superman, The (U)(1994)(Sunsoft - Blizzard).sfc", 2097152, 0xa567957c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dnrsuperman) +STD_ROM_FN(snes_Dnrsuperman) + +struct BurnDriver BurnDrvsnes_Dnrsuperman = { + "snes_dnrsuperman", NULL, NULL, NULL, "1994", + "Death and Return of Superman, The (USA)\0", NULL, "Sunsoft - Blizzard", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_DnrsupermanRomInfo, snes_DnrsupermanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donkey Kong Country (USA) + +static struct BurnRomInfo snes_DkongcntryRomDesc[] = { + { "Donkey Kong Country (U)(1994)(Nintendo - Rare).sfc", 4194304, 0xc946dca0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dkongcntry) +STD_ROM_FN(snes_Dkongcntry) + +struct BurnDriver BurnDrvsnes_Dkongcntry = { + "snes_dkongcntry", NULL, NULL, NULL, "1994", + "Donkey Kong Country (USA)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DkongcntryRomInfo, snes_DkongcntryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donkey Kong Country (USA, Alt) + +static struct BurnRomInfo snes_DkongcntryaRomDesc[] = { + { "Donkey Kong Country (U, Alt)(1994)(Nintendo).sfc", 4194304, 0x762af827, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dkongcntrya) +STD_ROM_FN(snes_Dkongcntrya) + +struct BurnDriver BurnDrvsnes_Dkongcntrya = { + "snes_dkongcntrya", "snes_dkongcntry", NULL, NULL, "1994", + "Donkey Kong Country (USA, Alt)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DkongcntryaRomInfo, snes_DkongcntryaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donkey Kong Country 2 - Diddy's Kong Quest (USA) + +static struct BurnRomInfo snes_Dkongcntry2RomDesc[] = { + { "Donkey Kong Country 2 - Diddy's Kong Quest (U)(1995)(Nintendo - Rare).sfc", 4194304, 0x4e2d90f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dkongcntry2) +STD_ROM_FN(snes_Dkongcntry2) + +struct BurnDriver BurnDrvsnes_Dkongcntry2 = { + "snes_dkongcntry2", NULL, NULL, NULL, "1995", + "Donkey Kong Country 2 - Diddy's Kong Quest (USA)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Dkongcntry2RomInfo, snes_Dkongcntry2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donkey Kong Country 3 - Dixie Kong's Double Trouble! (USA) + +static struct BurnRomInfo snes_Dkongcntry3RomDesc[] = { + { "Donkey Kong Country 3 - Dixie Kong's Double Trouble! (U)(1996)(Nintnedo - Rare).sfc", 4194304, 0x448eec19, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dkongcntry3) +STD_ROM_FN(snes_Dkongcntry3) + +struct BurnDriver BurnDrvsnes_Dkongcntry3 = { + "snes_dkongcntry3", NULL, NULL, NULL, "1996", + "Donkey Kong Country 3 - Dixie Kong's Double Trouble! (USA)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Dkongcntry3RomInfo, snes_Dkongcntry3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dokapon 3-2-1 - Arashi o Yobu Yuujou (Japan) + +static struct BurnRomInfo snes_Dokapon321jRomDesc[] = { + { "Dokapon 3-2-1 - Arashi o Yobu Yuujou (J)(1994)(Asmik).sfc", 1572864, 0xfc353400, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dokapon321j) +STD_ROM_FN(snes_Dokapon321j) + +struct BurnDriver BurnDrvsnes_Dokapon321j = { + "snes_dokapon321j", "snes_dokapon321te", NULL, NULL, "1994", + "Dokapon 3-2-1 - Arashi o Yobu Yuujou (Japan)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_BOARD | GBF_RPG, 0, + SNESGetZipName, snes_Dokapon321jRomInfo, snes_Dokapon321jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dokapon 3-2-1, from Friendship to Mayhem (Hack, English v1.4) +// https://www.romhacking.net/translations/5561/ +static struct BurnRomInfo snes_Dokapon321teRomDesc[] = { + { "Dokapon 3-2-1 - Arashi o Yobu Yuujou T-Eng v1.4 (2023)(Krokodyl).sfc", 2097152, 0x4fe9b036, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dokapon321te) +STD_ROM_FN(snes_Dokapon321te) + +struct BurnDriver BurnDrvsnes_Dokapon321te = { + "snes_dokapon321te", NULL, NULL, NULL, "2023", + "Dokapon 3-2-1, from Friendship to Mayhem (Hack, English v1.4)\0", NULL, "Krokodyl", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 4, HARDWARE_SNES, GBF_BOARD | GBF_RPG, 0, + SNESGetZipName, snes_Dokapon321teRomInfo, snes_Dokapon321teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dokapon Gaiden - Honoo no Audition (Japan) + +static struct BurnRomInfo snes_DokapongdnjRomDesc[] = { + { "Dokapon Gaiden - Honoo no Audition (J)(1995)(Asmik).sfc", 1048576, 0xa1684b6c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dokapongdnj) +STD_ROM_FN(snes_Dokapongdnj) + +struct BurnDriver BurnDrvsnes_Dokapongdnj = { + "snes_dokapongdnj", "snes_dokapongdnte", NULL, NULL, "1995", + "Dokapon Gaiden - Honoo no Audition (Japan)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_BOARD | GBF_RPG, 0, + SNESGetZipName, snes_DokapongdnjRomInfo, snes_DokapongdnjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dokapon Gaiden - Fiery Audition (Hack, English) +// https://www.romhacking.net/translations/6648/ +static struct BurnRomInfo snes_DokapongdnteRomDesc[] = { + { "Dokapon Gaiden - Fiery Audition T-Eng (2022)(Krokodyl).sfc", 2097152, 0x94c83422, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dokapongdnte) +STD_ROM_FN(snes_Dokapongdnte) + +struct BurnDriver BurnDrvsnes_Dokapongdnte = { + "snes_dokapongdnte", NULL, NULL, NULL, "2022", + "Dokapon Gaiden - Fiery Audition (Hack, English)\0", NULL, "Krokodyl", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 4, HARDWARE_SNES, GBF_BOARD | GBF_RPG, 0, + SNESGetZipName, snes_DokapongdnteRomInfo, snes_DokapongdnteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dolucky no Kusayakiu (Japan) + +static struct BurnRomInfo snes_DoluckykusaRomDesc[] = { + { "Dolucky no Kusayakiu (J)(1993)(Imagineer).sfc", 2097152, 0xc2d2150c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doluckykusa) +STD_ROM_FN(snes_Doluckykusa) + +struct BurnDriver BurnDrvsnes_Doluckykusa = { + "snes_doluckykusa", NULL, NULL, NULL, "1993", + "Dolucky no Kusayakiu (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_DoluckykusaRomInfo, snes_DoluckykusaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dolucky no Puzzle Tour '94 (Japan) + +static struct BurnRomInfo snes_DoluckypzlRomDesc[] = { + { "Dolucky no Puzzle Tour '94 (J)(1994)(Imagineer).sfc", 524288, 0xf716c24d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doluckypzl) +STD_ROM_FN(snes_Doluckypzl) + +struct BurnDriver BurnDrvsnes_Doluckypzl = { + "snes_doluckypzl", NULL, NULL, NULL, "1994", + "Dolucky no Puzzle Tour '94 (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_DoluckypzlRomInfo, snes_DoluckypzlRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dolucky no A.League Soccer (Japan) + +static struct BurnRomInfo snes_DoluckysocRomDesc[] = { + { "Dolucky no A.League Soccer (J)(1994)(Imagineer).sfc", 1572864, 0x0bc19d72, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doluckysoc) +STD_ROM_FN(snes_Doluckysoc) + +struct BurnDriver BurnDrvsnes_Doluckysoc = { + "snes_doluckysoc", NULL, NULL, NULL, "1994", + "Dolucky no A.League Soccer (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_DoluckysocRomInfo, snes_DoluckysocRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donald Duck no Mahou no Boushi (Japan) + +static struct BurnRomInfo snes_DonalduckjRomDesc[] = { + { "Donald Duck no Mahou no Boushi (J)(1995)(Epoch).sfc", 1572864, 0x1ed5d2fa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Donalduckj) +STD_ROM_FN(snes_Donalduckj) + +struct BurnDriver BurnDrvsnes_Donalduckj = { + "snes_donalduckj", "snes_donalduckte", NULL, NULL, "1995", + "Donald Duck no Mahou no Boushi (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DonalduckjRomInfo, snes_DonalduckjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donald Duck and the Macical Hat (Hack, English) +// https://www.romhacking.net/translations/2655/ +static struct BurnRomInfo snes_DonalduckteRomDesc[] = { + { "Donald Duck and the Macical Hat T-Eng (2016)(gorgyrip).sfc", 2097152, 0xdf450dd2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Donalduckte) +STD_ROM_FN(snes_Donalduckte) + +struct BurnDriver BurnDrvsnes_Donalduckte = { + "snes_donalduckte", NULL, NULL, NULL, "2016", + "Donald Duck and the Macical Hat (Hack, English)\0", NULL, "gorgyrip", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DonalduckteRomInfo, snes_DonalduckteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doomsday Warrior (USA) + +static struct BurnRomInfo snes_DoomsdaywRomDesc[] = { + { "Doomsday Warrior (U)(1992)(Renovation).sfc", 1048576, 0xceeb7c32, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doomsdayw) +STD_ROM_FN(snes_Doomsdayw) + +struct BurnDriver BurnDrvsnes_Doomsdayw = { + "snes_doomsdayw", NULL, NULL, NULL, "1992", + "Doomsday Warrior (USA)\0", NULL, "Renovation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DoomsdaywRomInfo, snes_DoomsdaywRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doom Troopers (USA) + +static struct BurnRomInfo snes_DoomtroopRomDesc[] = { + { "Doom Troopers (U)(1995)(Playmates).sfc", 2097152, 0x1889feef, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doomtroop) +STD_ROM_FN(snes_Doomtroop) + +struct BurnDriver BurnDrvsnes_Doomtroop = { + "snes_doomtroop", NULL, NULL, NULL, "1995", + "Doom Troopers (USA)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_DoomtroopRomInfo, snes_DoomtroopRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chou Makai Taisen! Dorabocchan (Japan) + +static struct BurnRomInfo snes_DorabocchanRomDesc[] = { + { "Chou Makai Taisen! Dorabocchan (J)(1993)(Naxat Soft).sfc", 1048576, 0x497d7c95, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dorabocchan) +STD_ROM_FN(snes_Dorabocchan) + +struct BurnDriver BurnDrvsnes_Dorabocchan = { + "snes_dorabocchan", "snes_spikemcfang", NULL, NULL, "1993", + "Chou Makai Taisen! Dorabocchan (Japan)\0", NULL, "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_DorabocchanRomInfo, snes_DorabocchanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doraemon 2 - Nobita no Toys Land Daibouken (Japan) + +static struct BurnRomInfo snes_Doraemon2jRomDesc[] = { + { "Doraemon 2 - Nobita no Toys Land Daibouken (J)(1993)(Epoch Co.).sfc", 1048576, 0xd343b398, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doraemon2j) +STD_ROM_FN(snes_Doraemon2j) + +struct BurnDriver BurnDrvsnes_Doraemon2j = { + "snes_doraemon2j", NULL, NULL, NULL, "1993", + "Doraemon 2 - Nobita no Toys Land Daibouken (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Doraemon2jRomInfo, snes_Doraemon2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doraemon 3 - Nobita to Toki no Hougyoku (Japan) + +static struct BurnRomInfo snes_Doraemon3jRomDesc[] = { + { "Doraemon 3 - Nobita to Toki no Hougyoku (J)(1994)(Epoch Co.).sfc", 1572864, 0x560c5eab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doraemon3j) +STD_ROM_FN(snes_Doraemon3j) + +struct BurnDriver BurnDrvsnes_Doraemon3j = { + "snes_doraemon3j", NULL, NULL, NULL, "1994", + "Doraemon 3 - Nobita to Toki no Hougyoku (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Doraemon3jRomInfo, snes_Doraemon3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doraemon 4: Nobita to Tsuki no Oukoku (Japan) + +static struct BurnRomInfo snes_Doraemon4jRomDesc[] = { + { "Doraemon 4 - Nobita to Tsuki no Oukoku (J)(1995)(Epoch).sfc", 1572864, 0x4097bc01, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doraemon4j) +STD_ROM_FN(snes_Doraemon4j) + +struct BurnDriver BurnDrvsnes_Doraemon4j = { + "snes_doraemon4j", "snes_doraemon4te", NULL, NULL, "1995", + "Doraemon 4: Nobita to Tsuki no Oukoku (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Doraemon4jRomInfo, snes_Doraemon4jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doraemon 4: in the Moon Kingdom (Hack, English v0.94b) +// https://www.romhacking.net/translations/313/ +static struct BurnRomInfo snes_Doraemon4teRomDesc[] = { + { "Doraemon 4 - Nobita to Tsuki no Oukoku T-Eng v0.94b (1998)(Sgt. Bow Hack).sfc", 1573376, 0xe6b89f12, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doraemon4te) +STD_ROM_FN(snes_Doraemon4te) + +struct BurnDriver BurnDrvsnes_Doraemon4te = { + "snes_doraemon4te", NULL, NULL, NULL, "1998", + "Doraemon 4: in the Moon Kingdom (Hack, English v0.94b)\0", NULL, "Sgt. Bow Hack", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Doraemon4teRomInfo, snes_Doraemon4teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Doraemon - Nobita to Yousei no Kuni (Japan) + +static struct BurnRomInfo snes_DoraemonjRomDesc[] = { + { "Doraemon - Nobita to Yousei no Kuni (J)(1993)(Epoch Co.).sfc", 524288, 0x55e44983, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doraemonj) +STD_ROM_FN(snes_Doraemonj) + +struct BurnDriver BurnDrvsnes_Doraemonj = { + "snes_doraemonj", NULL, NULL, NULL, "1993", + "Doraemon - Nobita to Yousei no Kuni (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_DoraemonjRomInfo, snes_DoraemonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DoReMi Fantasy - Milon no Dokidoki Daibouken (Japan) + +static struct BurnRomInfo snes_DoremifantasyjRomDesc[] = { + { "DoReMi Fantasy - Milon no Dokidoki Daibouken (J)(1996)(Hudson Soft).sfc", 2097152, 0x9f2c2633, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doremifantasyj) +STD_ROM_FN(snes_Doremifantasyj) + +struct BurnDriver BurnDrvsnes_Doremifantasyj = { + "snes_doremifantasyj", "snes_doremifantasyte", NULL, NULL, "1996", + "DoReMi Fantasy - Milon no Dokidoki Daibouken (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DoremifantasyjRomInfo, snes_DoremifantasyjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DoReMi Fantasy - Milons Abenteuer (Hack, German v1.3) +// https://www.romhacking.net/translations/1187/ +static struct BurnRomInfo snes_DoremifantasytdeRomDesc[] = { + { "DoReMi Fantasy - Milons Abenteuer T-Ger v1.3 (2019)(Ghettoyouth).sfc", 2621440, 0x4557f89e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doremifantasytde) +STD_ROM_FN(snes_Doremifantasytde) + +struct BurnDriver BurnDrvsnes_Doremifantasytde = { + "snes_doremifantasytde", "snes_doremifantasyte", NULL, NULL, "2019", + "DoReMi Fantasy - Milons Abenteuer (Hack, German v1.3)\0", NULL, "Ghettoyouth", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DoremifantasytdeRomInfo, snes_DoremifantasytdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DoReMi Fantasy - Milon's Quest (Hack, English v1.3) +// https://www.romhacking.net/translations/1192/ +static struct BurnRomInfo snes_DoremifantasyteRomDesc[] = { + { "DoReMi Fantasy - Milon's Quest T-Eng v1.3 (2019)(Gaijin, RPGONE).sfc", 2621440, 0xaa378e8c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doremifantasyte) +STD_ROM_FN(snes_Doremifantasyte) + +struct BurnDriver BurnDrvsnes_Doremifantasyte = { + "snes_doremifantasyte", NULL, NULL, NULL, "2019", + "DoReMi Fantasy - Milon's Quest (Hack, English v1.3)\0", NULL, "Gaijin, RPGONE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_DoremifantasyteRomInfo, snes_DoremifantasyteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// DoReMi Fantasy - La Busqueda de Milon (Hack, Spanish v1.2) +// https://www.romhacking.net/translations/3980/ +static struct BurnRomInfo snes_DoremifantasytsRomDesc[] = { + { "DoReMi Fantasy - La Busqueda de Milon T-Spa v1.2 (2018)(Crimental).sfc", 2621440, 0xb54b37dc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Doremifantasyts) +STD_ROM_FN(snes_Doremifantasyts) + +struct BurnDriver BurnDrvsnes_Doremifantasyts = { + "snes_doremifantasyts", "snes_doremifantasyte", NULL, NULL, "2018", + "DoReMi Fantasy - La Busqueda de Milon (Hack, Spanish v1.2)\0", NULL, "Crimental", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DoremifantasytsRomInfo, snes_DoremifantasytsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest I & II (Japan) + +static struct BurnRomInfo snes_Dquest1n2jRomDesc[] = { + { "Dragon Quest I & II (J)(1993)(Enix).sfc", 1572864, 0x98bb6853, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest1n2j) +STD_ROM_FN(snes_Dquest1n2j) + +struct BurnDriver BurnDrvsnes_Dquest1n2j = { + "snes_dquest1n2j", "snes_dquest1n2te", NULL, NULL, "1993", + "Dragon Quest I & II (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest1n2jRomInfo, snes_Dquest1n2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest I & II (Hack, English v1.053rtm) +// https://www.romhacking.net/translations/6127/ +static struct BurnRomInfo snes_Dquest1n2teRomDesc[] = { + { "Dragon Quest I & II T-Eng v1.053rtm (2021)(RPGONE - Rod Merida).sfc", 2097152, 0x59e27f1a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest1n2te) +STD_ROM_FN(snes_Dquest1n2te) + +struct BurnDriver BurnDrvsnes_Dquest1n2te = { + "snes_dquest1n2te", NULL, NULL, NULL, "2021", + "Dragon Quest I & II (Hack, English v1.053rtm)\0", NULL, "RPGONE - Rod Merida", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest1n2teRomInfo, snes_Dquest1n2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest I & II (Hack, Spanish v1.2a) +// https://www.romhacking.net/translations/6039/ +static struct BurnRomInfo snes_Dquest1n2tsRomDesc[] = { + { "Dragon Quest I & II T-Spa v1.2a (2023)(Rod Merida).sfc", 2097152, 0xe8c748bc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest1n2ts) +STD_ROM_FN(snes_Dquest1n2ts) + +struct BurnDriver BurnDrvsnes_Dquest1n2ts = { + "snes_dquest1n2ts", "snes_dquest1n2te", NULL, NULL, "2023", + "Dragon Quest I & II (Hack, Spanish v1.2a)\0", NULL, "Rod Merida", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest1n2tsRomInfo, snes_Dquest1n2tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest III (Japan) + +static struct BurnRomInfo snes_Dquest3jRomDesc[] = { + { "Dragon Quest III (J)(1996)(Enix).sfc", 4194304, 0x13836bd2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest3j) +STD_ROM_FN(snes_Dquest3j) + +struct BurnDriver BurnDrvsnes_Dquest3j = { + "snes_dquest3j", "snes_dquest3te", NULL, NULL, "1996", + "Dragon Quest III (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest3jRomInfo, snes_Dquest3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest III (Hack, English v1.0c) +// https://www.romhacking.net/translations/6398/ +static struct BurnRomInfo snes_Dquest3teRomDesc[] = { + { "Dragon Quest III T-Eng v1.0c (2022)(DQ Translations - Rod Merida).sfc", 6291456, 0x7a1f8f09, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest3te) +STD_ROM_FN(snes_Dquest3te) + +struct BurnDriver BurnDrvsnes_Dquest3te = { + "snes_dquest3te", NULL, NULL, NULL, "2022", + "Dragon Quest III (Hack, English v1.0c)\0", NULL, "DQ Translations - Rod Merida", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest3teRomInfo, snes_Dquest3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Quest III (Hack, Spanish v1.05rtm) + +static struct BurnRomInfo snes_Dquest3tsRomDesc[] = { + { "Dragon Quest III T-Spa v1.05rtm (2021)(Rod Merida).sfc", 6291456, 0xa4de7f68, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dquest3ts) +STD_ROM_FN(snes_Dquest3ts) + +struct BurnDriver BurnDrvsnes_Dquest3ts = { + "snes_dquest3ts", "snes_dquest3te", NULL, NULL, "2021", + "Dragon Quest III (Hack, Spanish v1.05rtm)\0", NULL, "Rod Merida", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Dquest3tsRomInfo, snes_Dquest3tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - La Legende Saien (Euro, French) + +static struct BurnRomInfo snes_Dragballz2efRomDesc[] = { + { "Dragon Ball Z - La Legende Saien (E, France)(1993)(Bandai).sfc", 2097152, 0x8f24f886, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballz2ef) +STD_ROM_FN(snes_Dragballz2ef) + +struct BurnDriver BurnDrvsnes_Dragballz2ef = { + "snes_dragballz2ef", NULL, NULL, NULL, "1993", + "Dragon Ball Z - La Legende Saien (Euro, French)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Dragballz2efRomInfo, snes_Dragballz2efRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Super Butouden 2 (Japan) + +static struct BurnRomInfo snes_Dragballz2jRomDesc[] = { + { "Dragon Ball Z - Super Butouden 2 (J)(1993)(Bandai).sfc", 2097152, 0x081fde86, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballz2j) +STD_ROM_FN(snes_Dragballz2j) + +struct BurnDriver BurnDrvsnes_Dragballz2j = { + "snes_dragballz2j", "snes_dragballz2ef", NULL, NULL, "1993", + "Dragon Ball Z - Super Butouden 2 (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Dragballz2jRomInfo, snes_Dragballz2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Ultime Menace (Euro, French) + +static struct BurnRomInfo snes_Dragballz3efRomDesc[] = { + { "Dragon Ball Z - Ultime Menace (E, France)(1994)(Bandai).sfc", 2097152, 0x593eefe0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballz3ef) +STD_ROM_FN(snes_Dragballz3ef) + +struct BurnDriver BurnDrvsnes_Dragballz3ef = { + "snes_dragballz3ef", NULL, NULL, NULL, "1994", + "Dragon Ball Z - Ultime Menace (Euro, French)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Dragballz3efRomInfo, snes_Dragballz3efRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Super Butouden 3 (Japan) + +static struct BurnRomInfo snes_Dragballz3jRomDesc[] = { + { "Dragon Ball Z - Super Butouden 3 (J)(1994)(Bandai).sfc", 2097152, 0xcbfde2d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballz3j) +STD_ROM_FN(snes_Dragballz3j) + +struct BurnDriver BurnDrvsnes_Dragballz3j = { + "snes_dragballz3j", "snes_dragballz3ef", NULL, NULL, "1994", + "Dragon Ball Z - Super Butouden 3 (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Dragballz3jRomInfo, snes_Dragballz3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Super Butouden (Euro, French) + +static struct BurnRomInfo snes_DragballzefRomDesc[] = { + { "Dragon Ball Z - Super Butouden (E, France)(1993)(Bandai).sfc", 2097152, 0xea7abad1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzef) +STD_ROM_FN(snes_Dragballzef) + +struct BurnDriver BurnDrvsnes_Dragballzef = { + "snes_dragballzef", NULL, NULL, NULL, "1993", + "Dragon Ball Z - Super Butouden (Euro, French)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragballzefRomInfo, snes_DragballzefRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Super Butouden (Japan) + +static struct BurnRomInfo snes_DragballzjRomDesc[] = { + { "Dragon Ball Z - Super Butouden (J)(1993)(Bandai).sfc", 2097152, 0x8c7780bd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzj) +STD_ROM_FN(snes_Dragballzj) + +struct BurnDriver BurnDrvsnes_Dragballzj = { + "snes_dragballzj", "snes_dragballzef", NULL, NULL, "1993", + "Dragon Ball Z - Super Butouden (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragballzjRomInfo, snes_DragballzjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Chou Gokuuden - Totsugeki Hen (Japan) + +static struct BurnRomInfo snes_DragballzrpgjRomDesc[] = { + { "Dragon Ball Z - Chou Gokuuden - Totsugeki Hen (J)(1995)(Bandai).sfc", 2097152, 0xd531289b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzrpgj) +STD_ROM_FN(snes_Dragballzrpgj) + +struct BurnDriver BurnDrvsnes_Dragballzrpgj = { + "snes_dragballzrpgj", "snes_dragballzrpgte", NULL, NULL, "1995", + "Dragon Ball Z - Chou Gokuuden - Totsugeki Hen (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DragballzrpgjRomInfo, snes_DragballzrpgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Super Gokuden - Totsugeki Hen (Hack, English v0.98) +// https://www.romhacking.net/translations/315/ +static struct BurnRomInfo snes_DragballzrpgteRomDesc[] = { + { "Dragon Ball Z - Chou Gokuuden - Totsugeki Hen T-Eng v0.98 (2016)(Kakkoii Translations).sfc", 2097152, 0x3561ff9d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzrpgte) +STD_ROM_FN(snes_Dragballzrpgte) + +struct BurnDriver BurnDrvsnes_Dragballzrpgte = { + "snes_dragballzrpgte", NULL, NULL, NULL, "2016", + "Dragon Ball Z - Super Gokuden - Totsugeki Hen (Hack, English v0.98)\0", NULL, "Kakkoii Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DragballzrpgteRomInfo, snes_DragballzrpgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Hyper Dimension (Euro, French) + +static struct BurnRomInfo snes_DragballzhdefRomDesc[] = { + { "Dragon Ball Z - Hyper Dimension (E, France)(1996)(Bandai).sfc", 3145728, 0xa6dc166b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzhdef) +STD_ROM_FN(snes_Dragballzhdef) + +struct BurnDriver BurnDrvsnes_Dragballzhdef = { + "snes_dragballzhdef", "snes_dragballzhdte", NULL, NULL, "1996", + "Dragon Ball Z - Hyper Dimension (Euro, French)\0", "SA-1 enhancement CPU", "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragballzhdefRomInfo, snes_DragballzhdefRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Hyper Dimension (Japan) + +static struct BurnRomInfo snes_DragballzhdjRomDesc[] = { + { "Dragon Ball Z - Hyper Dimension (J)(1996)(Bandai).sfc", 3145728, 0xf4ab1557, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzhdj) +STD_ROM_FN(snes_Dragballzhdj) + +struct BurnDriver BurnDrvsnes_Dragballzhdj = { + "snes_dragballzhdj", "snes_dragballzhdte", NULL, NULL, "1996", + "Dragon Ball Z - Hyper Dimension (Japan)\0", "SA-1 enhancement CPU", "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragballzhdjRomInfo, snes_DragballzhdjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon Ball Z - Hyper Dimension (Hack, English) +// https://www.romhacking.net/translations/1537/ +static struct BurnRomInfo snes_DragballzhdteRomDesc[] = { + { "Dragon Ball Z - Hyper Dimension T-Eng (2010)(Twilight Translations).sfc", 3145728, 0x971c9513, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragballzhdte) +STD_ROM_FN(snes_Dragballzhdte) + +struct BurnDriver BurnDrvsnes_Dragballzhdte = { + "snes_dragballzhdte", NULL, NULL, NULL, "2010", + "Dragon Ball Z - Hyper Dimension (Hack, English)\0", "SA-1 enhancement CPU", "Twilight Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragballzhdteRomInfo, snes_DragballzhdteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon's Lair (USA) + +static struct BurnRomInfo snes_DraglairRomDesc[] = { + { "Dragon's Lair (U)(1993)(Data East).sfc", 524288, 0x24ffe7fd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Draglair) +STD_ROM_FN(snes_Draglair) + +struct BurnDriver BurnDrvsnes_Draglair = { + "snes_draglair", NULL, NULL, NULL, "1993", + "Dragon's Lair (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DraglairRomInfo, snes_DraglairRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon's Lair (Euro) + +static struct BurnRomInfo snes_DraglaireRomDesc[] = { + { "Dragon's Lair (E)(1993)(Elite).sfc", 524288, 0x304fdb92, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Draglaire) +STD_ROM_FN(snes_Draglaire) + +struct BurnDriver BurnDrvsnes_Draglaire = { + "snes_draglaire", "snes_draglair", NULL, NULL, "1993", + "Dragon's Lair (Euro)\0", NULL, "Elite", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DraglaireRomInfo, snes_DraglaireRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon's Magic (Japan) + +static struct BurnRomInfo snes_DragmagicRomDesc[] = { + { "Dragon's Magic (J)(1993)(Konami).sfc", 524288, 0x0cf53835, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragmagic) +STD_ROM_FN(snes_Dragmagic) + +struct BurnDriver BurnDrvsnes_Dragmagic = { + "snes_dragmagic", "snes_draglair", NULL, NULL, "1993", + "Dragon's Magic (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DragmagicRomInfo, snes_DragmagicRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon - The Bruce Lee Story (USA) + +static struct BurnRomInfo snes_DragonblsRomDesc[] = { + { "Dragon - The Bruce Lee Story (U)(1994)(Acclaim - Virgin).sfc", 2097152, 0x407c5c24, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragonbls) +STD_ROM_FN(snes_Dragonbls) + +struct BurnDriver BurnDrvsnes_Dragonbls = { + "snes_dragonbls", NULL, NULL, NULL, "1994", + "Dragon - The Bruce Lee Story (USA)\0", NULL, "Acclaim Ent. - Virgin Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_DragonblsRomInfo, snes_DragonblsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dragon View (USA) + +static struct BurnRomInfo snes_DragonviewRomDesc[] = { + { "Dragon View (U)(1994)(Kemco).sfc", 2097152, 0xab893412, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dragonview) +STD_ROM_FN(snes_Dragonview) + +struct BurnDriver BurnDrvsnes_Dragonview = { + "snes_dragonview", NULL, NULL, NULL, "1994", + "Dragon View (USA)\0", NULL, "Kemco - Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_RPG, 0, + SNESGetZipName, snes_DragonviewRomInfo, snes_DragonviewRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Drakkhen (USA) + +static struct BurnRomInfo snes_DrakkhenRomDesc[] = { + { "Drakkhen (U)(1991)(Kemco).sfc", 1048576, 0x7dae5c2a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Drakkhen) +STD_ROM_FN(snes_Drakkhen) + +struct BurnDriver BurnDrvsnes_Drakkhen = { + "snes_drakkhen", NULL, NULL, NULL, "1991", + "Drakkhen (USA)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DrakkhenRomInfo, snes_DrakkhenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Drakkhen (Japan) + +static struct BurnRomInfo snes_DrakkhenjRomDesc[] = { + { "Drakkhen (J)(1991)(Kemco).sfc", 1048576, 0xb0a016a2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Drakkhenj) +STD_ROM_FN(snes_Drakkhenj) + +struct BurnDriver BurnDrvsnes_Drakkhenj = { + "snes_drakkhenj", "snes_drakkhen", NULL, NULL, "1991", + "Drakkhen (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DrakkhenjRomInfo, snes_DrakkhenjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yume Meikyuu - Kigurumi Daibouken (Japan) + +static struct BurnRomInfo snes_DreamazejRomDesc[] = { + { "Yume Meikyuu - Kigurumi Daibouken (J)(1994)(Hect).sfc", 1048576, 0x4b17a200, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dreamazej) +STD_ROM_FN(snes_Dreamazej) + +struct BurnDriver BurnDrvsnes_Dreamazej = { + "snes_dreamazej", "snes_dreamazete", NULL, NULL, "1994", + "Yume Meikyuu - Kigurumi Daibouken (Japan)\0", NULL, "Hect", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_DreamazejRomInfo, snes_DreamazejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dream Maze - Kigurumi Daibouken (Hack, English v1.0b) +// https://www.romhacking.net/translations/860/ +static struct BurnRomInfo snes_DreamazeteRomDesc[] = { + { "Dream Maze - Kigurumi Daibouken T-Eng v1.0b (2004)(KingMike's Translations).sfc", 1048576, 0xc5fcafa0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dreamazete) +STD_ROM_FN(snes_Dreamazete) + +struct BurnDriver BurnDrvsnes_Dreamazete = { + "snes_dreamazete", NULL, NULL, NULL, "2004", + "Dream Maze - Kigurumi Daibouken (Hack, English v1.0b)\0", NULL, "KingMike's Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_DreamazeteRomInfo, snes_DreamazeteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Drift King Shutokou Battle '94 (Japan) + +static struct BurnRomInfo snes_Driftkingsb94RomDesc[] = { + { "Drift King Shutokou Battle '94 (J)(1994)(Bullet Proof Software).sfc", 1572864, 0x33ce298f, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Driftkingsb94, snes_Driftkingsb94, snes_dsp1b) +STD_ROM_FN(snes_Driftkingsb94) + +struct BurnDriver BurnDrvsnes_Driftkingsb94 = { + "snes_driftkingsb94", NULL, "snes_dsp1b", NULL, "1994", + "Drift King Shutokou Battle '94 (Japan)\0", "DSP-1B enhancement chip", "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Driftkingsb94RomInfo, snes_Driftkingsb94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dig & Spike Volleyball (USA) + +static struct BurnRomInfo snes_DsvolleyballRomDesc[] = { + { "Dig & Spike Volleyball (U)(1993)(Hudson Soft).sfc", 1048576, 0x954340f8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dsvolleyball) +STD_ROM_FN(snes_Dsvolleyball) + +struct BurnDriver BurnDrvsnes_Dsvolleyball = { + "snes_dsvolleyball", NULL, NULL, NULL, "1993", + "Dig & Spike Volleyball (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_DsvolleyballRomInfo, snes_DsvolleyballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dual Orb II (Japan) + +static struct BurnRomInfo snes_DualorbiijRomDesc[] = { + { "Dual Orb II (J)(1994)(I'Max).sfc", 2621440, 0xe8798f65, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dualorbiij) +STD_ROM_FN(snes_Dualorbiij) + +struct BurnDriver BurnDrvsnes_Dualorbiij = { + "snes_dualorbiij", "snes_dualorbiite", NULL, NULL, "1994", + "Dual Orb II (Japan)\0", NULL, "I'Max", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DualorbiijRomInfo, snes_DualorbiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dual Orb II (Hack, English v1.7) +// https://www.romhacking.net/translations/345/ +static struct BurnRomInfo snes_DualorbiiteRomDesc[] = { + { "Dual Orb II T-Eng v1.7 (2016)(Translation Corp.).sfc", 4194304, 0x06770592, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dualorbiite) +STD_ROM_FN(snes_Dualorbiite) + +struct BurnDriver BurnDrvsnes_Dualorbiite = { + "snes_dualorbiite", NULL, NULL, NULL, "2016", + "Dual Orb II (Hack, English v1.7)\0", NULL, "Translation Corporation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DualorbiiteRomInfo, snes_DualorbiiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dual Orb II (Hack, Spanish v1.1) +// https://traduccionessemco.blogspot.com/2019/11/traduccion-de-dual-orb-ii-de-snes-en.html +static struct BurnRomInfo snes_DualorbiitsRomDesc[] = { + { "Dual Orb II T-Spa v1.1 (2019-23)(semco).sfc", 4194304, 0x9c27bec7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dualorbiits) +STD_ROM_FN(snes_Dualorbiits) + +struct BurnDriver BurnDrvsnes_Dualorbiits = { + "snes_dualorbiits", "snes_dualorbiite", NULL, NULL, "2019-23", + "Dual Orb II (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_DualorbiitsRomInfo, snes_DualorbiitsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Duel, The - Test Drive II (USA) + +static struct BurnRomInfo snes_DueltdiiRomDesc[] = { + { "Duel, The - Test Drive II (U)(1992)(Ballistic).sfc", 1048576, 0x1cc662cd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dueltdii) +STD_ROM_FN(snes_Dueltdii) + +struct BurnDriver BurnDrvsnes_Dueltdii = { + "snes_dueltdii", NULL, NULL, NULL, "1992", + "Duel, The - Test Drive II (USA)\0", NULL, "Ballistic", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_DueltdiiRomInfo, snes_DueltdiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dungeon Master (USA) + +static struct BurnRomInfo snes_DungmasterRomDesc[] = { + { "Dungeon Master (U)(1992)(JVC Musical Industries).sfc", 1048576, 0x0dfd9ceb, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Dungmaster, snes_Dungmaster, snes_dsp2) +STD_ROM_FN(snes_Dungmaster) + +struct BurnDriver BurnDrvsnes_Dungmaster = { + "snes_dungmaster", NULL, "snes_dsp2", NULL, "1992", + "Dungeon Master (USA)\0", "DSP-2 enhancement chip", "JVC Musical Industries", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_DungmasterRomInfo, snes_DungmasterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dungeon Master (Japan) + +static struct BurnRomInfo snes_DungmasterjRomDesc[] = { + { "Dungeon Master (J)(1991)(Victor Musical Industries).sfc", 1048576, 0xaa79fa33, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Dungmasterj, snes_Dungmasterj, snes_dsp2) +STD_ROM_FN(snes_Dungmasterj) + +struct BurnDriver BurnDrvsnes_Dungmasterj = { + "snes_dungmasterj", "snes_dungmaster", "snes_dsp2", NULL, "1991", + "Dungeon Master (Japan)\0", "DSP-2 enhancement chip", "Victor Musical Industries", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_DungmasterjRomInfo, snes_DungmasterjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// EarthBound (USA) + +static struct BurnRomInfo snes_EarthboundRomDesc[] = { + { "EarthBound (U)(1995)(Nintendo).sfc", 3145728, 0xdc9bb451, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Earthbound) +STD_ROM_FN(snes_Earthbound) + +struct BurnDriver BurnDrvsnes_Earthbound = { + "snes_earthbound", NULL, NULL, NULL, "1995", + "EarthBound (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_EarthboundRomInfo, snes_EarthboundRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Earth Light (Japan) + +static struct BurnRomInfo snes_EarthlightjRomDesc[] = { + { "Earth Light (J)(1992)(Hudson Soft).sfc", 1048576, 0x727f1593, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Earthlightj) +STD_ROM_FN(snes_Earthlightj) + +struct BurnDriver BurnDrvsnes_Earthlightj = { + "snes_earthlightj", "snes_earthlightte", NULL, NULL, "1992", + "Earth Light (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_EarthlightjRomInfo, snes_EarthlightjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Earth Light (Hack, English) +// https://www.romhacking.net/translations/7290/ +static struct BurnRomInfo snes_EarthlightteRomDesc[] = { + { "Earth Light T-Eng (2024)(Nezz).sfc", 1572864, 0x6d3eec81, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Earthlightte) +STD_ROM_FN(snes_Earthlightte) + +struct BurnDriver BurnDrvsnes_Earthlightte = { + "snes_earthlightte", NULL, NULL, NULL, "2024", + "Earth Light (Hack, English)\0", NULL, "Nezz", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_EarthlightteRomInfo, snes_EarthlightteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Earthworm Jim (USA) + +static struct BurnRomInfo snes_EarthwormjimRomDesc[] = { + { "Earthworm Jim (U)(1994)(Playmates).sfc", 3145728, 0x3a4a47eb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Earthwormjim) +STD_ROM_FN(snes_Earthwormjim) + +struct BurnDriver BurnDrvsnes_Earthwormjim = { + "snes_earthwormjim", NULL, NULL, NULL, "1994", + "Earthworm Jim (USA)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_EarthwormjimRomInfo, snes_EarthwormjimRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Earthworm Jim 2 (USA) + +static struct BurnRomInfo snes_Earthwormjim2RomDesc[] = { + { "Earthworm Jim 2 (U)(1995)(Playmates).sfc", 3145728, 0x393de197, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Earthwormjim2) +STD_ROM_FN(snes_Earthwormjim2) + +struct BurnDriver BurnDrvsnes_Earthwormjim2 = { + "snes_earthwormjim2", NULL, NULL, NULL, "1995", + "Earthworm Jim 2 (USA)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Earthwormjim2RomInfo, snes_Earthwormjim2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Edono Kiba (Japan) + +static struct BurnRomInfo snes_EdonokibaRomDesc[] = { + { "Edono Kiba (J)(1993)(Micro World - Riot).sfc", 1048576, 0xeec5a5b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Edonokiba) +STD_ROM_FN(snes_Edonokiba) + +struct BurnDriver BurnDrvsnes_Edonokiba = { + "snes_edonokiba", NULL, NULL, NULL, "1993", + "Edono Kiba (Japan)\0", NULL, "Micro World - Riot", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_EdonokibaRomInfo, snes_EdonokibaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Eek! The Cat (USA) + +static struct BurnRomInfo snes_EekcatRomDesc[] = { + { "Eek! The Cat (U)(1994)(Ocean).sfc", 1048576, 0x216f2fc7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Eekcat) +STD_ROM_FN(snes_Eekcat) + +struct BurnDriver BurnDrvsnes_Eekcat = { + "snes_eekcat", NULL, NULL, NULL, "1994", + "Eek! The Cat (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_EekcatRomInfo, snes_EekcatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Elnard (Japan) + +static struct BurnRomInfo snes_ElnardRomDesc[] = { + { "Elnard (J)(1993)(Enix).sfc", 1572864, 0x14320873, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Elnard) +STD_ROM_FN(snes_Elnard) + +struct BurnDriver BurnDrvsnes_Elnard = { + "snes_elnard", "snes_7thsaga", NULL, NULL, "1993", + "Elnard (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_ElnardRomInfo, snes_ElnardRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Energy Breaker (Japan) + +static struct BurnRomInfo snes_EnergybreakjRomDesc[] = { + { "Energy Breaker (J)(1996)(Taito Corp.).sfc", 3145728, 0x74d89d96, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Energybreakj) +STD_ROM_FN(snes_Energybreakj) + +struct BurnDriver BurnDrvsnes_Energybreakj = { + "snes_energybreakj", "snes_energybreakte", NULL, NULL, "1996", + "Energy Breaker (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_EnergybreakjRomInfo, snes_EnergybreakjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Energy Breaker (Hack, English v1.02) +// https://www.romhacking.net/translations/346/ +static struct BurnRomInfo snes_EnergybreakteRomDesc[] = { + { "Energy Breaker T-Eng v1.02 (2012)(Disnesquick).sfc", 4194304, 0x655a1b8c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Energybreakte) +STD_ROM_FN(snes_Energybreakte) + +struct BurnDriver BurnDrvsnes_Energybreakte = { + "snes_energybreakte", NULL, NULL, NULL, "2012", + "Energy Breaker (Hack, English v1.02)\0", NULL, "Disnesquick", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_EnergybreakteRomInfo, snes_EnergybreakteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Equinox (USA) + +static struct BurnRomInfo snes_EquinoxRomDesc[] = { + { "Equinox (U)(1993)(Sony Imagesoft).sfc", 1048576, 0x96a4d1c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Equinox) +STD_ROM_FN(snes_Equinox) + +struct BurnDriver BurnDrvsnes_Equinox = { + "snes_equinox", NULL, NULL, NULL, "1993", + "Equinox (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_EquinoxRomInfo, snes_EquinoxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ESPN Baseball Tonight (USA) + +static struct BurnRomInfo snes_EspnmlbRomDesc[] = { + { "ESPN Baseball Tonight (U)(1994)(Sony Imagesoft).sfc", 2097152, 0x8606d69b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Espnmlb) +STD_ROM_FN(snes_Espnmlb) + +struct BurnDriver BurnDrvsnes_Espnmlb = { + "snes_espnmlb", NULL, NULL, NULL, "1994", + "ESPN Baseball Tonight (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_EspnmlbRomInfo, snes_EspnmlbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ESPN Sunday Night NFL (USA) + +static struct BurnRomInfo snes_EspnnflRomDesc[] = { + { "ESPN Sunday Night NFL (U)(1994)(Sony Imagesoft).sfc", 2097152, 0x26849f90, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Espnnfl) +STD_ROM_FN(snes_Espnnfl) + +struct BurnDriver BurnDrvsnes_Espnnfl = { + "snes_espnnfl", NULL, NULL, NULL, "1994", + "ESPN Sunday Night NFL (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_EspnnflRomInfo, snes_EspnnflRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ESPN National Hockey Night (USA) + +static struct BurnRomInfo snes_EspnnhlRomDesc[] = { + { "ESPN National Hockey Night (U)(1994)(Sony Imagesoft).sfc", 2097152, 0x75058ede, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Espnnhl) +STD_ROM_FN(snes_Espnnhl) + +struct BurnDriver BurnDrvsnes_Espnnhl = { + "snes_espnnhl", NULL, NULL, NULL, "1994", + "ESPN National Hockey Night (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_EspnnhlRomInfo, snes_EspnnhlRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// ESPN Speedworld (USA) + +static struct BurnRomInfo snes_EspnswRomDesc[] = { + { "ESPN Speedworld (U)(1994)(Sony Imagesoft).sfc", 2097152, 0xc2cff05a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Espnsw) +STD_ROM_FN(snes_Espnsw) + +struct BurnDriver BurnDrvsnes_Espnsw = { + "snes_espnsw", NULL, NULL, NULL, "1994", + "ESPN Speedworld (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_EspnswRomInfo, snes_EspnswRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Estpolis Denki (Japan) + +static struct BurnRomInfo snes_EstdenkiRomDesc[] = { + { "Estpolis Denki (J)(1993)(Taito Corp.).sfc", 1048576, 0x896b37fb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Estdenki) +STD_ROM_FN(snes_Estdenki) + +struct BurnDriver BurnDrvsnes_Estdenki = { + "snes_estdenki", "snes_lufia", NULL, NULL, "1993", + "Estpolis Denki (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_EstdenkiRomInfo, snes_EstdenkiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Estpolis Denki II (Japan) + +static struct BurnRomInfo snes_Estdenki2RomDesc[] = { + { "Estpolis Denki II (J)(1995)(Taito Corp.).sfc", 2621440, 0xd9665bbc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Estdenki2) +STD_ROM_FN(snes_Estdenki2) + +struct BurnDriver BurnDrvsnes_Estdenki2 = { + "snes_estdenki2", "snes_lufia2", NULL, NULL, "1995", + "Estpolis Denki II (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Estdenki2RomInfo, snes_Estdenki2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Euro Football Champ (Euro) + +static struct BurnRomInfo snes_EurofbcRomDesc[] = { + { "Euro Football Champ (E)(1992)(Taito).sfc", 524288, 0x2c6eb470, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Eurofbc) +STD_ROM_FN(snes_Eurofbc) + +struct BurnDriver BurnDrvsnes_Eurofbc = { + "snes_eurofbc", "snes_supsochamp", NULL, NULL, "1992", + "Euro Football Champ (Euro)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_EurofbcRomInfo, snes_EurofbcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// E.V.O. - Search for Eden (USA) + +static struct BurnRomInfo snes_EvoRomDesc[] = { + { "E.V.O. - Search for Eden (U)(1993)(Enix - Almanic).sfc", 1572864, 0xdd49911e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Evo) +STD_ROM_FN(snes_Evo) + +struct BurnDriver BurnDrvsnes_Evo = { + "snes_evo", NULL, NULL, NULL, "1993", + "E.V.O. - Search for Eden (USA)\0", NULL, "Enix/Almanic", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_EvoRomInfo, snes_EvoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Exhaust Heat (Japan) + +static struct BurnRomInfo snes_ExhaustheatRomDesc[] = { + { "Exhaust Heat (J)(1992)(Seta).sfc", 1048576, 0x5cb9bc35, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Exhaustheat) +STD_ROM_FN(snes_Exhaustheat) + +struct BurnDriver BurnDrvsnes_Exhaustheat = { + "snes_exhaustheat", "snes_f1roc", NULL, NULL, "1992", + "Exhaust Heat (Japan)\0", NULL, "Seta Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_ExhaustheatRomInfo, snes_ExhaustheatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Exhaust Heat II - F1 Driver e no Michi (Japan) + +static struct BurnRomInfo snes_ExhaustheatiiRomDesc[] = { + { "Exhaust Heat II - F1 Driver e no Michi (J)(1993)(Seta).sfc", 1048576, 0xe2c8e535, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Exhaustheatii, snes_Exhaustheatii, snes_st010) +STD_ROM_FN(snes_Exhaustheatii) + +struct BurnDriver BurnDrvsnes_Exhaustheatii = { + "snes_exhaustheatii", "snes_f1rocii", "snes_st010", NULL, "1993", + "Exhaust Heat II - F1 Driver e no Michi (Japan)\0", "ST010 enhancement chip", "Seta Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_ExhaustheatiiRomInfo, snes_ExhaustheatiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Extra Innings (USA) + +static struct BurnRomInfo snes_ExinningsRomDesc[] = { + { "Extra Innings (U)(1991)(Sony Imagesoft).sfc", 1048576, 0x440a4250, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Exinnings) +STD_ROM_FN(snes_Exinnings) + +struct BurnDriver BurnDrvsnes_Exinnings = { + "snes_exinnings", NULL, NULL, NULL, "1991", + "Extra Innings (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_ExinningsRomInfo, snes_ExinningsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Eye of the Beholder ~ Advanced Dungeons & Dragons (USA) + +static struct BurnRomInfo snes_EyebeholdRomDesc[] = { + { "Eye of the Beholder ~ Advanced Dungeons & Dragons (U)(1994)(Capcom).sfc", 1048576, 0x20143571, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Eyebehold) +STD_ROM_FN(snes_Eyebehold) + +struct BurnDriver BurnDrvsnes_Eyebehold = { + "snes_eyebehold", NULL, NULL, NULL, "1994", + "Eye of the Beholder ~ Advanced Dungeons & Dragons (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_EyebeholdRomInfo, snes_EyebeholdRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-1 Grand Prix - Part II (Japan) + +static struct BurnRomInfo snes_F1gp2jRomDesc[] = { + { "F-1 Grand Prix - Part II (J)(1993)(Video System).sfc", 1572864, 0x534ae12e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_F1gp2j) +STD_ROM_FN(snes_F1gp2j) + +struct BurnDriver BurnDrvsnes_F1gp2j = { + "snes_f1gp2j", NULL, NULL, NULL, "1993", + "F-1 Grand Prix - Part II (Japan)\0", NULL, "Video System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1gp2jRomInfo, snes_F1gp2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-1 Grand Prix - Part III (Japan) + +static struct BurnRomInfo snes_F1gp3jRomDesc[] = { + { "F-1 Grand Prix - Part III (J)(1994)(Video System).sfc", 2097152, 0x9b68248e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_F1gp3j) +STD_ROM_FN(snes_F1gp3j) + +struct BurnDriver BurnDrvsnes_F1gp3j = { + "snes_f1gp3j", NULL, NULL, NULL, "1994", + "F-1 Grand Prix - Part III (Japan)\0", NULL, "Video System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1gp3jRomInfo, snes_F1gp3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-1 Grand Prix (Japan) + +static struct BurnRomInfo snes_F1gpjRomDesc[] = { + { "F-1 Grand Prix (J)(1992)(Video System).sfc", 1048576, 0x1608ea1a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_F1gpj) +STD_ROM_FN(snes_F1gpj) + +struct BurnDriver BurnDrvsnes_F1gpj = { + "snes_f1gpj", NULL, NULL, NULL, "1992", + "F-1 Grand Prix (Japan)\0", NULL, "Video System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1gpjRomInfo, snes_F1gpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F1 Pole Position (USA) + +static struct BurnRomInfo snes_F1poleposRomDesc[] = { + { "F1 Pole Position (U)(1993)(Ubi Soft).sfc", 1048576, 0xb3da1b1d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_F1polepos) +STD_ROM_FN(snes_F1polepos) + +struct BurnDriver BurnDrvsnes_F1polepos = { + "snes_f1polepos", NULL, NULL, NULL, "1993", + "F1 Pole Position (USA)\0", NULL, "Ubi Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1poleposRomInfo, snes_F1poleposRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F1 ROC - Race of Champions (USA) + +static struct BurnRomInfo snes_F1rocRomDesc[] = { + { "F1-ROC - Race of Champions (U)(1992)(Seta).sfc", 1048576, 0x2a069989, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_F1roc) +STD_ROM_FN(snes_F1roc) + +struct BurnDriver BurnDrvsnes_F1roc = { + "snes_f1roc", NULL, NULL, NULL, "1992", + "F1 ROC - Race of Champions (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1rocRomInfo, snes_F1rocRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F1-ROC II - Race of Champions (USA) + +static struct BurnRomInfo snes_F1rociiRomDesc[] = { + { "F1-ROC II - Race of Champions (U)(1994)(Seta).sfc", 1048576, 0x3447609e, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_F1rocii, snes_F1rocii, snes_st010) +STD_ROM_FN(snes_F1rocii) + +struct BurnDriver BurnDrvsnes_F1rocii = { + "snes_f1rocii", NULL, "snes_st010", NULL, "1994", + "F1-ROC II - Race of Champions (USA)\0", "ST010 enhancement chip", "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_F1rociiRomInfo, snes_F1rociiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Family Dog (USA) + +static struct BurnRomInfo snes_FamilydogRomDesc[] = { + { "Family Dog (U)(1992)(Malibu Games).sfc", 1048576, 0x1b53c15a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Familydog) +STD_ROM_FN(snes_Familydog) + +struct BurnDriver BurnDrvsnes_Familydog = { + "snes_familydog", NULL, NULL, NULL, "1992", + "Family Dog (USA)\0", NULL, "Malibu Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FamilydogRomInfo, snes_FamilydogRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo (Japan) + +static struct BurnRomInfo snes_Famtanclub2jRomDesc[] = { + { "Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo (J)(1998)(Nintendo).sfc", 3145728, 0x28f450ac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Famtanclub2j) +STD_ROM_FN(snes_Famtanclub2j) + +struct BurnDriver BurnDrvsnes_Famtanclub2j = { + "snes_famtanclub2j", "snes_famtanclub2te", NULL, NULL, "1998", + "Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Famtanclub2jRomInfo, snes_Famtanclub2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Famicom Detective Club Part II (Hack, English) +// https://www.romhacking.net/translations/850/ +static struct BurnRomInfo snes_Famtanclub2teRomDesc[] = { + { "Famicom Detective Club Part II T-Eng (2004)(Demiforce, Tomato).sfc", 4194816, 0xb73f2bb8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Famtanclub2te) +STD_ROM_FN(snes_Famtanclub2te) + +struct BurnDriver BurnDrvsnes_Famtanclub2te = { + "snes_famtanclub2te", NULL, NULL, NULL, "2004", + "Famicom Detective Club Part II (Hack, English)\0", NULL, "Demiforce, Tomato", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Famtanclub2teRomInfo, snes_Famtanclub2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Family Feud (USA) + +static struct BurnRomInfo snes_FamyfeudRomDesc[] = { + { "Family Feud (U)(1993)(GameTek).sfc", 524288, 0x0c664b71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Famyfeud) +STD_ROM_FN(snes_Famyfeud) + +struct BurnDriver BurnDrvsnes_Famyfeud = { + "snes_famyfeud", NULL, NULL, NULL, "1993", + "Family Feud (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_QUIZ, 0, + SNESGetZipName, snes_FamyfeudRomInfo, snes_FamyfeudRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fatal Fury (USA) + +static struct BurnRomInfo snes_FatalfuryRomDesc[] = { + { "Fatal Fury (U)(1993)(Takara).sfc", 1572864, 0xc67257d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fatalfury) +STD_ROM_FN(snes_Fatalfury) + +struct BurnDriver BurnDrvsnes_Fatalfury = { + "snes_fatalfury", NULL, NULL, NULL, "1993", + "Fatal Fury (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_FatalfuryRomInfo, snes_FatalfuryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fatal Fury 2 (USA) + +static struct BurnRomInfo snes_Fatalfury2RomDesc[] = { + { "Fatal Fury 2 (U)(1994)(Takara).sfc", 2621440, 0xa26ebfef, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fatalfury2) +STD_ROM_FN(snes_Fatalfury2) + +struct BurnDriver BurnDrvsnes_Fatalfury2 = { + "snes_fatalfury2", NULL, NULL, NULL, "1994", + "Fatal Fury 2 (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Fatalfury2RomInfo, snes_Fatalfury2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fatal Fury Special (USA) + +static struct BurnRomInfo snes_FatalfuryspRomDesc[] = { + { "Fatal Fury Special (U)(1994)(Takara).sfc", 4194304, 0x93935bee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fatalfurysp) +STD_ROM_FN(snes_Fatalfurysp) + +struct BurnDriver BurnDrvsnes_Fatalfurysp = { + "snes_fatalfurysp", NULL, NULL, NULL, "1994", + "Fatal Fury Special (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_FatalfuryspRomInfo, snes_FatalfuryspRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Football Fury (USA) + +static struct BurnRomInfo snes_FbfuryRomDesc[] = { + { "Football Fury (U)(1993)(Sammy).sfc", 1048576, 0x729a5524, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fbfury) +STD_ROM_FN(snes_Fbfury) + +struct BurnDriver BurnDrvsnes_Fbfury = { + "snes_fbfury", NULL, NULL, NULL, "1993", + "Football Fury (USA)\0", NULL, "Sammy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_FbfuryRomInfo, snes_FbfuryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// American Tail, An - Fievel Goes West (USA) + +static struct BurnRomInfo snes_FievelgoesRomDesc[] = { + { "American Tail, An - Fievel Goes West (U)(1994)(Hudson Soft).sfc", 1048576, 0xeea38aed, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fievelgoes) +STD_ROM_FN(snes_Fievelgoes) + +struct BurnDriver BurnDrvsnes_Fievelgoes = { + "snes_fievelgoes", NULL, NULL, NULL, "1994", + "American Tail, An - Fievel Goes West (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FievelgoesRomInfo, snes_FievelgoesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight (USA) + +static struct BurnRomInfo snes_FfightRomDesc[] = { + { "Final Fight (U)(1990-91)(Capcom).sfc", 1048576, 0x4cab21db, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffight) +STD_ROM_FN(snes_Ffight) + +struct BurnDriver BurnDrvsnes_Ffight = { + "snes_ffight", NULL, NULL, NULL, "1990-91", + "Final Fight (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_FfightRomInfo, snes_FfightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight 2 (USA) + +static struct BurnRomInfo snes_Ffight2RomDesc[] = { + { "Final Fight 2 (U)(1993)(Capcom).sfc", 1310720, 0x8c37ff55, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffight2) +STD_ROM_FN(snes_Ffight2) + +struct BurnDriver BurnDrvsnes_Ffight2 = { + "snes_ffight2", NULL, NULL, NULL, "1993", + "Final Fight 2 (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Ffight2RomInfo, snes_Ffight2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight 2 (Japan) + +static struct BurnRomInfo snes_Ffight2jRomDesc[] = { + { "Final Fight 2 (J)(1993)(Capcom).sfc", 1310720, 0xf41e1a5a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffight2j) +STD_ROM_FN(snes_Ffight2j) + +struct BurnDriver BurnDrvsnes_Ffight2j = { + "snes_ffight2j", "snes_ffight2", NULL, NULL, "1993", + "Final Fight 2 (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Ffight2jRomInfo, snes_Ffight2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight 3 (USA) + +static struct BurnRomInfo snes_Ffight3RomDesc[] = { + { "Final Fight 3 (U)(1995)(Capcom).sfc", 3145728, 0xa916e708, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffight3) +STD_ROM_FN(snes_Ffight3) + +struct BurnDriver BurnDrvsnes_Ffight3 = { + "snes_ffight3", NULL, NULL, NULL, "1995", + "Final Fight 3 (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Ffight3RomInfo, snes_Ffight3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight Tough (Japan) + +static struct BurnRomInfo snes_Ffight3jRomDesc[] = { + { "Final Fight Tough (J)(1995)(Capcom).sfc", 3145728, 0x0e3ee9b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffight3j) +STD_ROM_FN(snes_Ffight3j) + +struct BurnDriver BurnDrvsnes_Ffight3j = { + "snes_ffight3j", "snes_ffight3", NULL, NULL, "1995", + "Final Fight Tough (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Ffight3jRomInfo, snes_Ffight3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight Guy (USA) + +static struct BurnRomInfo snes_FfightguyRomDesc[] = { + { "Final Fight Guy (U)(1994)(Capcom).sfc", 1048576, 0xbc1ae3c2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffightguy) +STD_ROM_FN(snes_Ffightguy) + +struct BurnDriver BurnDrvsnes_Ffightguy = { + "snes_ffightguy", NULL, NULL, NULL, "1994", + "Final Fight Guy (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_FfightguyRomInfo, snes_FfightguyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight Guy (Japan) + +static struct BurnRomInfo snes_FfightguyjRomDesc[] = { + { "Final Fight Guy (J)(1992)(Capcom).sfc", 1048576, 0xde144411, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffightguyj) +STD_ROM_FN(snes_Ffightguyj) + +struct BurnDriver BurnDrvsnes_Ffightguyj = { + "snes_ffightguyj", "snes_ffightguy", NULL, NULL, "1992", + "Final Fight Guy (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_FfightguyjRomInfo, snes_FfightguyjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fight (Japan) + +static struct BurnRomInfo snes_FfightjRomDesc[] = { + { "Final Fight (J)(1990)(Capcom).sfc", 1048576, 0xa425a202, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffightj) +STD_ROM_FN(snes_Ffightj) + +struct BurnDriver BurnDrvsnes_Ffightj = { + "snes_ffightj", "snes_ffight", NULL, NULL, "1990", + "Final Fight (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_FfightjRomInfo, snes_FfightjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// FIFA International Soccer (USA) + +static struct BurnRomInfo snes_FifasoccerRomDesc[] = { + { "FIFA International Soccer (U)(1994)(Electronic Arts).sfc", 1048576, 0x56296426, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fifasoccer) +STD_ROM_FN(snes_Fifasoccer) + +struct BurnDriver BurnDrvsnes_Fifasoccer = { + "snes_fifasoccer", NULL, NULL, NULL, "1994", + "FIFA International Soccer (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_FifasoccerRomInfo, snes_FifasoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// FIFA Soccer '96 (USA) + +static struct BurnRomInfo snes_Fifasoccer96RomDesc[] = { + { "FIFA Soccer '96 (U)(1995)(Electronic Arts).sfc", 1572864, 0x7566347d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fifasoccer96) +STD_ROM_FN(snes_Fifasoccer96) + +struct BurnDriver BurnDrvsnes_Fifasoccer96 = { + "snes_fifasoccer96", NULL, NULL, NULL, "1995", + "FIFA Soccer '96 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Fifasoccer96RomInfo, snes_Fifasoccer96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// FIFA Soccer '97 (USA) + +static struct BurnRomInfo snes_Fifasoccer97RomDesc[] = { + { "FIFA Soccer '97 (U)(1996)(Electronic Arts).sfc", 2097152, 0x9cdbb2f8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fifasoccer97) +STD_ROM_FN(snes_Fifasoccer97) + +struct BurnDriver BurnDrvsnes_Fifasoccer97 = { + "snes_fifasoccer97", NULL, NULL, NULL, "1996", + "FIFA Soccer '97 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Fifasoccer97RomInfo, snes_Fifasoccer97RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fighting Baseball (Japan) + +static struct BurnRomInfo snes_FightbaseballRomDesc[] = { + { "Fighting Baseball (J)(1994)(Coconuts Japan).sfc", 1048576, 0x7f3c1a95, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fightbaseball) +STD_ROM_FN(snes_Fightbaseball) + +struct BurnDriver BurnDrvsnes_Fightbaseball = { + "snes_fightbaseball", "snes_mlbpabb", NULL, NULL, "1994", + "Fighting Baseball (Japan)\0", NULL, "Coconuts Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_FightbaseballRomInfo, snes_FightbaseballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fighter's History (USA) + +static struct BurnRomInfo snes_FighthistoryRomDesc[] = { + { "Fighter's History (U)(1994)(Data East).sfc", 2621440, 0x3d17f6ea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fighthistory) +STD_ROM_FN(snes_Fighthistory) + +struct BurnDriver BurnDrvsnes_Fighthistory = { + "snes_fighthistory", NULL, NULL, NULL, "1994", + "Fighter's History (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_FighthistoryRomInfo, snes_FighthistoryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fighter's History (Japan) + +static struct BurnRomInfo snes_FighthistoryjRomDesc[] = { + { "Fighter's History (J)(1994)(Data East).sfc", 2621440, 0x10751e4f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fighthistoryj) +STD_ROM_FN(snes_Fighthistoryj) + +struct BurnDriver BurnDrvsnes_Fighthistoryj = { + "snes_fighthistoryj", "snes_fighthistory", NULL, NULL, "1994", + "Fighter's History (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_FighthistoryjRomInfo, snes_FighthistoryjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fighter's History - Mizoguchi Kikiippatsu!! (Japan) + +static struct BurnRomInfo snes_FighthistorymkjRomDesc[] = { + { "Fighter's History - Mizoguchi Kikiippatsu!! (J)(1995)(Data East).sfc", 3145728, 0x65bb5dc4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fighthistorymkj) +STD_ROM_FN(snes_Fighthistorymkj) + +struct BurnDriver BurnDrvsnes_Fighthistorymkj = { + "snes_fighthistorymkj", NULL, NULL, NULL, "1995", + "Fighter's History - Mizoguchi Kikiippatsu!! (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_FighthistorymkjRomInfo, snes_FighthistorymkjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy - Mystic Quest (USA) + +static struct BurnRomInfo snes_FfmqRomDesc[] = { + { "Final Fantasy - Mystic Quest (U)(1992)(Squaresoft).sfc", 524288, 0x6b19a2c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffmq) +STD_ROM_FN(snes_Ffmq) + +struct BurnDriver BurnDrvsnes_Ffmq = { + "snes_ffmq", NULL, NULL, NULL, "1992", + "Final Fantasy - Mystic Quest (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_FfmqRomInfo, snes_FfmqRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy USA - Mystic Quest (Japan) + +static struct BurnRomInfo snes_FfmqjRomDesc[] = { + { "Final Fantasy USA - Mystic Quest (J)(1993)(Sqauresoft).sfc", 524288, 0x1da17f0c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ffmqj) +STD_ROM_FN(snes_Ffmqj) + +struct BurnDriver BurnDrvsnes_Ffmqj = { + "snes_ffmqj", "snes_ffmq", NULL, NULL, "1993", + "Final Fantasy USA - Mystic Quest (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_FfmqjRomInfo, snes_FfmqjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy II (USA) + +static struct BurnRomInfo snes_FinalfantiiRomDesc[] = { + { "Final Fantasy II (U)(1991)(Squaresoft).sfc", 1048576, 0x65d0a825, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantii) +STD_ROM_FN(snes_Finalfantii) + +struct BurnDriver BurnDrvsnes_Finalfantii = { + "snes_finalfantii", NULL, NULL, NULL, "1991", + "Final Fantasy II (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantiiRomInfo, snes_FinalfantiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy III (USA) + +static struct BurnRomInfo snes_FinalfantiiiRomDesc[] = { + { "Final Fantasy III (U)(1994)(Squaresoft).sfc", 3145728, 0xc0fa0464, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantiii) +STD_ROM_FN(snes_Finalfantiii) + +struct BurnDriver BurnDrvsnes_Finalfantiii = { + "snes_finalfantiii", NULL, NULL, NULL, "1994", + "Final Fantasy III (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantiiiRomInfo, snes_FinalfantiiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy IV - Easy Type (Japan) + +static struct BurnRomInfo snes_FinalfantivetRomDesc[] = { + { "Final Fantasy IV - Easy Type (J)(1991)(Squaresoft).sfc", 1048576, 0x6cda700c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantivet) +STD_ROM_FN(snes_Finalfantivet) + +struct BurnDriver BurnDrvsnes_Finalfantivet = { + "snes_finalfantivet", "snes_finalfantii", NULL, NULL, "1991", + "Final Fantasy IV - Easy Type (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantivetRomInfo, snes_FinalfantivetRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy IV (Japan) + +static struct BurnRomInfo snes_FinalfantivjRomDesc[] = { + { "Final Fantasy IV (J)(1991)(Squaresoft).sfc", 1048576, 0xcaa15e97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantivj) +STD_ROM_FN(snes_Finalfantivj) + +struct BurnDriver BurnDrvsnes_Finalfantivj = { + "snes_finalfantivj", "snes_finalfantii", NULL, NULL, "1991", + "Final Fantasy IV (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantivjRomInfo, snes_FinalfantivjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy V (Japan) + +static struct BurnRomInfo snes_FinalfantvjRomDesc[] = { + { "Final Fantasy V (J)(1992)(Squaresoft).sfc", 2097152, 0xc1bc267d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantvj) +STD_ROM_FN(snes_Finalfantvj) + +struct BurnDriver BurnDrvsnes_Finalfantvj = { + "snes_finalfantvj", "snes_finalfantvte", NULL, NULL, "1992", + "Final Fantasy V (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantvjRomInfo, snes_FinalfantvjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy VI (Japan) + +static struct BurnRomInfo snes_FinalfantvijRomDesc[] = { + { "Final Fantasy VI (J)(1994)(Squaresoft).sfc", 3145728, 0x45ef5ac8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantvij) +STD_ROM_FN(snes_Finalfantvij) + +struct BurnDriver BurnDrvsnes_Finalfantvij = { + "snes_finalfantvij", "snes_finalfantiii", NULL, NULL, "1994", + "Final Fantasy VI (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantvijRomInfo, snes_FinalfantvijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy V (Hack, English v1.10) +// https://www.romhacking.net/translations/353/ +static struct BurnRomInfo snes_FinalfantvteRomDesc[] = { + { "Final Fantasy V T-Eng v1.10 (1998)(RPGe).sfc", 2621440, 0x17444605, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantvte) +STD_ROM_FN(snes_Finalfantvte) + +struct BurnDriver BurnDrvsnes_Finalfantvte = { + "snes_finalfantvte", NULL, NULL, NULL, "1998", + "Final Fantasy V (Hack, English v1.10)\0", NULL, "RPGe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantvteRomInfo, snes_FinalfantvteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy V (Hack, Spanish 1.06f) +// https://www.romhacking.net/translations/2836/ +static struct BurnRomInfo snes_FinalfantvtsRomDesc[] = { + { "Final Fantasy V T-Spa 1.06f (2015)(noisecross).sfc", 2621440, 0x4badf779, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantvts) +STD_ROM_FN(snes_Finalfantvts) + +struct BurnDriver BurnDrvsnes_Finalfantvts = { + "snes_finalfantvts", "snes_finalfantvte", NULL, NULL, "2015", + "Final Fantasy V (Hack, Spanish 1.06f)\0", NULL, "noisecross", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantvtsRomInfo, snes_FinalfantvtsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Finalset (Japan) + +static struct BurnRomInfo snes_FinalsetjRomDesc[] = { + { "Finalset (J)(1993)(Forum).sfc", 1048576, 0xe06fae58, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalsetj) +STD_ROM_FN(snes_Finalsetj) + +struct BurnDriver BurnDrvsnes_Finalsetj = { + "snes_finalsetj", NULL, NULL, NULL, "1993", + "Finalset (Japan)\0", NULL, "Forum", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_FinalsetjRomInfo, snes_FinalsetjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Emblem - Thracia 776 (Japan) + +static struct BurnRomInfo snes_Fireemblem776jRomDesc[] = { + { "Fire Emblem - Thracia 776 (J)(2000)(Nintendo).sfc", 4194304, 0xfc519952, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fireemblem776j) +STD_ROM_FN(snes_Fireemblem776j) + +struct BurnDriver BurnDrvsnes_Fireemblem776j = { + "snes_fireemblem776j", "snes_fireemblem776te", NULL, NULL, "2000", + "Fire Emblem - Thracia 776 (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_Fireemblem776jRomInfo, snes_Fireemblem776jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Emblem - Thracia 776 (Hack, English v1.08) +// https://www.romhacking.net/translations/5884/ +static struct BurnRomInfo snes_Fireemblem776teRomDesc[] = { + { "Fire Emblem - Thracia 776 T-Eng v1.08 (2021)(Cirosan, Miacis).sfc", 6291456, 0x2039d71b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fireemblem776te) +STD_ROM_FN(snes_Fireemblem776te) + +struct BurnDriver BurnDrvsnes_Fireemblem776te = { + "snes_fireemblem776te", NULL, NULL, NULL, "2021", + "Fire Emblem - Thracia 776 (Hack, English v1.08)\0", NULL, "Cirosan, Miacis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_Fireemblem776teRomInfo, snes_Fireemblem776teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Emblem - Monshou no Nazo (Japan) + +static struct BurnRomInfo snes_FireemblemjRomDesc[] = { + { "Fire Emblem - Monshou no Nazo (J, Rev 1)(1993)(Nintendo).sfc", 3145728, 0xa427b7e6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fireemblemj) +STD_ROM_FN(snes_Fireemblemj) + +struct BurnDriver BurnDrvsnes_Fireemblemj = { + "snes_fireemblemj", "snes_fireemblemte", NULL, NULL, "1993", + "Fire Emblem - Monshou no Nazo (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_FireemblemjRomInfo, snes_FireemblemjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Emblem - Mystery of the Emblem (Hack, English v0.22) +// https://www.romhacking.net/translations/4969/ +static struct BurnRomInfo snes_FireemblemteRomDesc[] = { + { "Fire Emblem - Monshou no Nazo T-Eng v0.22 (2022)(RobertTheSable).sfc", 4194304, 0x118d13c2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fireemblemte) +STD_ROM_FN(snes_Fireemblemte) + +struct BurnDriver BurnDrvsnes_Fireemblemte = { + "snes_fireemblemte", NULL, NULL, NULL, "2022", + "Fire Emblem - Mystery of the Emblem (Hack, English v0.22)\0", NULL, "RobertTheSable", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_FireemblemteRomInfo, snes_FireemblemteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Fighting (Japan) + +static struct BurnRomInfo snes_FirefightRomDesc[] = { + { "Fire Fighting (J)(1994)(Jaleco).sfc", 1048576, 0x554fc152, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firefight) +STD_ROM_FN(snes_Firefight) + +struct BurnDriver BurnDrvsnes_Firefight = { + "snes_firefight", "snes_ignfactor", NULL, NULL, "1994", + "Fire Fighting (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_FirefightRomInfo, snes_FirefightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Firemen, The (Euro) + +static struct BurnRomInfo snes_FiremenRomDesc[] = { + { "Firemen, The (E)(1994)(Human Entertainment).sfc", 1048576, 0xdef665af, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firemen) +STD_ROM_FN(snes_Firemen) + +struct BurnDriver BurnDrvsnes_Firemen = { + "snes_firemen", NULL, NULL, NULL, "1994", + "Firemen, The (Euro)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_FiremenRomInfo, snes_FiremenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Firemen, The (Japan) + +static struct BurnRomInfo snes_FiremenjRomDesc[] = { + { "Firemen, The (J)(1994)(Human Entertainment).sfc", 1048576, 0x15f2271d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firemenj) +STD_ROM_FN(snes_Firemenj) + +struct BurnDriver BurnDrvsnes_Firemenj = { + "snes_firemenj", "snes_firemen", NULL, NULL, "1994", + "Firemen, The (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_FiremenjRomInfo, snes_FiremenjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Firepower 2000 (USA) + +static struct BurnRomInfo snes_Firepower2000RomDesc[] = { + { "Firepower 2000 (U)(1992)(The Sales Curve).sfc", 1048576, 0x327416d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firepower2000) +STD_ROM_FN(snes_Firepower2000) + +struct BurnDriver BurnDrvsnes_Firepower2000 = { + "snes_firepower2000", NULL, NULL, NULL, "1992", + "Firepower 2000 (USA)\0", NULL, "The Sales Curve", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_Firepower2000RomInfo, snes_Firepower2000RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fire Striker (USA) + +static struct BurnRomInfo snes_FirestrikerRomDesc[] = { + { "Fire Striker (U)(1994)(DTMC).sfc", 1048576, 0xe500c7ba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firestriker) +STD_ROM_FN(snes_Firestriker) + +struct BurnDriver BurnDrvsnes_Firestriker = { + "snes_firestriker", NULL, NULL, NULL, "1994", + "Fire Striker (USA)\0", NULL, "DTMC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_FirestrikerRomInfo, snes_FirestrikerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// First Samurai (USA) + +static struct BurnRomInfo snes_FirstsamuraiRomDesc[] = { + { "First Samurai (U)(1993)(Kemco).sfc", 524288, 0x4f0a1e2a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firstsamurai) +STD_ROM_FN(snes_Firstsamurai) + +struct BurnDriver BurnDrvsnes_Firstsamurai = { + "snes_firstsamurai", NULL, NULL, NULL, "1993", + "First Samurai (USA)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FirstsamuraiRomInfo, snes_FirstsamuraiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// First Samurai (Japan) + +static struct BurnRomInfo snes_FirstsamuraijRomDesc[] = { + { "First Samurai (J)(1993)(Kemco).sfc", 524288, 0xb249401b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Firstsamuraij) +STD_ROM_FN(snes_Firstsamuraij) + +struct BurnDriver BurnDrvsnes_Firstsamuraij = { + "snes_firstsamuraij", "snes_firstsamurai", NULL, NULL, "1993", + "First Samurai (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FirstsamuraijRomInfo, snes_FirstsamuraijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flashback - The Quest for Identity (USA) + +static struct BurnRomInfo snes_FlashbackRomDesc[] = { + { "Flashback - The Quest for Identity (U)(1993)(U.S. Gold - Delphine Software).sfc", 2097152, 0x1e6aceba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flashback) +STD_ROM_FN(snes_Flashback) + +struct BurnDriver BurnDrvsnes_Flashback = { + "snes_flashback", NULL, NULL, NULL, "1993", + "Flashback - The Quest for Identity (USA)\0", NULL, "U.S. Gold - Delphine Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_FlashbackRomInfo, snes_FlashbackRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flashback (Japan) + +static struct BurnRomInfo snes_FlashbackjRomDesc[] = { + { "Flashback (J)(1993)(Sunsoft).sfc", 2097152, 0xcd09a892, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flashbackj) +STD_ROM_FN(snes_Flashbackj) + +struct BurnDriver BurnDrvsnes_Flashbackj = { + "snes_flashbackj", "snes_flashback", NULL, NULL, "1993", + "Flashback (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_FlashbackjRomInfo, snes_FlashbackjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flashback - The Quest for Identity (Hack, Italian) +// https://romhacking.it/project/view/id/383 +static struct BurnRomInfo snes_FlashbacktiRomDesc[] = { + { "Flashback - The Quest for Identity T-Ita (2009)(Vivi 86).sfc", 2097152, 0x8c703e71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flashbackti) +STD_ROM_FN(snes_Flashbackti) + +struct BurnDriver BurnDrvsnes_Flashbackti = { + "snes_flashbackti", "snes_flashback", NULL, NULL, "2009", + "Flashback - The Quest for Identity (Hack, Italian)\0", NULL, "Vivi 86", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_FlashbacktiRomInfo, snes_FlashbacktiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flintstones, The (USA) + +static struct BurnRomInfo snes_FlintstonesRomDesc[] = { + { "Flintstones, The (U)(1995)(Ocean).sfc", 2097152, 0x3e7b51e0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flintstones) +STD_ROM_FN(snes_Flintstones) + +struct BurnDriver BurnDrvsnes_Flintstones = { + "snes_flintstones", NULL, NULL, NULL, "1995", + "Flintstones, The (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FlintstonesRomInfo, snes_FlintstonesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flintstones, The - The Treasure of Sierra Madrock (USA) + +static struct BurnRomInfo snes_FlintstonestsmRomDesc[] = { + { "Flintstones, The - The Treasure of Sierra Madrock (U)(1994)(Taito).sfc", 1048576, 0x594f5cc6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flintstonestsm) +STD_ROM_FN(snes_Flintstonestsm) + +struct BurnDriver BurnDrvsnes_Flintstonestsm = { + "snes_flintstonestsm", NULL, NULL, NULL, "1994", + "Flintstones, The - The Treasure of Sierra Madrock (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BOARD | GBF_MINIGAMES, 0, + SNESGetZipName, snes_FlintstonestsmRomInfo, snes_FlintstonestsmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flintstones, The - The Treasure of Sierra Madrock (Japan) + +static struct BurnRomInfo snes_FlintstonestsmjRomDesc[] = { + { "Flintstones, The - The Treasure of Sierra Madrock (J)(1994)(Taito).sfc", 1048576, 0x53d29a71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flintstonestsmj) +STD_ROM_FN(snes_Flintstonestsmj) + +struct BurnDriver BurnDrvsnes_Flintstonestsmj = { + "snes_flintstonestsmj", "snes_flintstonestsm", NULL, NULL, "1994", + "Flintstones, The - The Treasure of Sierra Madrock (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_BOARD | GBF_MINIGAMES, 0, + SNESGetZipName, snes_FlintstonestsmjRomInfo, snes_FlintstonestsmjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flying Hero - Bugyuru no Daibouken (Japan) + +static struct BurnRomInfo snes_FlyingherojRomDesc[] = { + { "Flying Hero - Bugyuru no Daibouken (J)(1992)(SOFEL).sfc", 1048576, 0x1a19fc3a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flyingheroj) +STD_ROM_FN(snes_Flyingheroj) + +struct BurnDriver BurnDrvsnes_Flyingheroj = { + "snes_flyingheroj", "snes_flyingherote", NULL, NULL, "1992", + "Flying Hero - Bugyuru no Daibouken (Japan)\0", NULL, "SOFEL", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_FlyingherojRomInfo, snes_FlyingherojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Flying Hero - Bugyuru's Adventure (Hack, English) +// https://www.romhacking.net/translations/1714/ +static struct BurnRomInfo snes_FlyingheroteRomDesc[] = { + { "Flying Hero - Bugyuru's Adventure T-Eng (2012)(KingMike).sfc", 1048576, 0x24ccf556, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Flyingherote) +STD_ROM_FN(snes_Flyingherote) + +struct BurnDriver BurnDrvsnes_Flyingherote = { + "snes_flyingherote", NULL, NULL, NULL, "2012", + "Flying Hero - Bugyuru's Adventure (Hack, English)\0", NULL, "KingMike's Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_FlyingheroteRomInfo, snes_FlyingheroteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Foreman for Real (USA) + +static struct BurnRomInfo snes_ForemanRomDesc[] = { + { "Foreman for Real (U)(1995)(Acclaim Entertainment).sfc", 3145728, 0x5fa4d051, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Foreman) +STD_ROM_FN(snes_Foreman) + +struct BurnDriver BurnDrvsnes_Foreman = { + "snes_foreman", NULL, NULL, NULL, "1995", + "Foreman for Real (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_ForemanRomInfo, snes_ForemanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fantastic Parodius (Hack, English v1.1a) +// https://www.romhacking.net/translations/7021/ +static struct BurnRomInfo snes_FparodiusRomDesc[] = { + { "Fantastic Parodius T-Eng v1.1a (2023)(blizzz).sfc", 2621440, 0xe5ad7e53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fparodius) +STD_ROM_FN(snes_Fparodius) + +struct BurnDriver BurnDrvsnes_Fparodius = { + "snes_fparodius", NULL, NULL, NULL, "2023", + "Fantastic Parodius (Hack, English v1.1a)\0", NULL, "blizzz", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_FparodiusRomInfo, snes_FparodiusRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Frantic Flea (USA) + +static struct BurnRomInfo snes_FranticfleaRomDesc[] = { + { "Frantic Flea (U)(1995)(GameTek).sfc", 2097152, 0xffa8d1ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Franticflea) +STD_ROM_FN(snes_Franticflea) + +struct BurnDriver BurnDrvsnes_Franticflea = { + "snes_franticflea", NULL, NULL, NULL, "1995", + "Frantic Flea (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_FranticfleaRomInfo, snes_FranticfleaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Frogger (USA) + +static struct BurnRomInfo snes_FroggerRomDesc[] = { + { "Frogger (U)(1998)(Majesco).sfc", 524288, 0x2488b8f2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Frogger) +STD_ROM_FN(snes_Frogger) + +struct BurnDriver BurnDrvsnes_Frogger = { + "snes_frogger", NULL, NULL, NULL, "1998", + "Frogger (USA)\0", NULL, "Majesco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_FroggerRomInfo, snes_FroggerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Front Mission (Japan) + +static struct BurnRomInfo snes_FrontmissionjRomDesc[] = { + { "Front Mission (J)(1995)(Squaresoft).sfc", 3145728, 0xfe27e061, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Frontmissionj) +STD_ROM_FN(snes_Frontmissionj) + +struct BurnDriver BurnDrvsnes_Frontmissionj = { + "snes_frontmissionj", "snes_frontmissionte", NULL, NULL, "1995", + "Front Mission (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_FrontmissionjRomInfo, snes_FrontmissionjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Front Mission (Hack, English v1.02) +// https://www.romhacking.net/translations/6797/ +static struct BurnRomInfo snes_FrontmissionteRomDesc[] = { + { "Front Mission T-Eng v1.02 (2023)(mteam, F.H.).sfc", 4194304, 0x5a6d1169, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Frontmissionte) +STD_ROM_FN(snes_Frontmissionte) + +struct BurnDriver BurnDrvsnes_Frontmissionte = { + "snes_frontmissionte", NULL, NULL, NULL, "2023", + "Front Mission (Hack, English v1.02)\0", NULL, "mteam, F.H.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_RPG, 0, + SNESGetZipName, snes_FrontmissionteRomInfo, snes_FrontmissionteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Stretch (Japan) + +static struct BurnRomInfo snes_FstretchRomDesc[] = { + { "Final Stretch (J)(1993)(LOZC).sfc", 1572864, 0x8d29f41f, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Fstretch, snes_Fstretch, snes_dsp1) +STD_ROM_FN(snes_Fstretch) + +struct BurnDriver BurnDrvsnes_Fstretch = { + "snes_fstretch", NULL, "snes_dsp1", NULL, "1993", + "Final Stretch (Japan)\0", "DSP-1 enhancement chip", "LOZC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FstretchRomInfo, snes_FstretchRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Full Power (Japan) + +static struct BurnRomInfo snes_FullpowerRomDesc[] = { + { "Full Power (J)(1994)(Coconuts Japan).sfc", 2097152, 0x66c04587, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fullpower) +STD_ROM_FN(snes_Fullpower) + +struct BurnDriver BurnDrvsnes_Fullpower = { + "snes_fullpower", "snes_fullthrottle", NULL, NULL, "1994", + "Full Power (Japan)\0", NULL, "Coconuts Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FullpowerRomInfo, snes_FullpowerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Full Throttle: All-American Racing (USA) + +static struct BurnRomInfo snes_FullthrottleRomDesc[] = { + { "Full Throttle - All-American Racing (U)(1994)(Cybersoft).sfc", 2097152, 0x2a4a53ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fullthrottle) +STD_ROM_FN(snes_Fullthrottle) + +struct BurnDriver BurnDrvsnes_Fullthrottle = { + "snes_fullthrottle", NULL, NULL, NULL, "1994", + "Full Throttle: All-American Racing (USA)\0", NULL, "Cybersoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FullthrottleRomInfo, snes_FullthrottleRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fun 'n Games (USA) + +static struct BurnRomInfo snes_FunngamesRomDesc[] = { + { "Fun 'n Games (USA)(1994)(Tradewest).sfc", 1048576, 0x5d6deac7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Funngames) +STD_ROM_FN(snes_Funngames) + +struct BurnDriver BurnDrvsnes_Funngames = { + "snes_funngames", NULL, NULL, NULL, "1994", + "Fun 'n Games (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Tradewest", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MISC | GBF_MINIGAMES, 0, + SNESGetZipName, snes_FunngamesRomInfo, snes_FunngamesRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-Zero (USA) + +static struct BurnRomInfo snes_FzeroRomDesc[] = { + { "F-Zero (U)(1990-91)(Nintendo).sfc", 524288, 0xaa0e31de, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fzero) +STD_ROM_FN(snes_Fzero) + +struct BurnDriver BurnDrvsnes_Fzero = { + "snes_fzero", NULL, NULL, NULL, "1990-91", + "F-Zero (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FzeroRomInfo, snes_FzeroRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-Zero (Euro) + +static struct BurnRomInfo snes_FzeroeRomDesc[] = { + { "F-Zero (E)(1991)(Nintendo).sfc", 524288, 0xf1d8f5da, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fzeroe) +STD_ROM_FN(snes_Fzeroe) + +struct BurnDriver BurnDrvsnes_Fzeroe = { + "snes_fzeroe", "snes_fzero", NULL, NULL, "1990-91", + "F-Zero (Euro)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FzeroeRomInfo, snes_FzeroeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// F-Zero (Japan) + +static struct BurnRomInfo snes_FzerojRomDesc[] = { + { "F-Zero (J)(1990)(Nintendo).sfc", 524288, 0x7681efc1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fzeroj) +STD_ROM_FN(snes_Fzeroj) + +struct BurnDriver BurnDrvsnes_Fzeroj = { + "snes_fzeroj", "snes_fzero", NULL, NULL, "1990", + "F-Zero (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_FzerojRomInfo, snes_FzerojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gaia Gensouki (Japan) + +static struct BurnRomInfo snes_GaiagensoukiRomDesc[] = { + { "Gaia Gensouki (J)(1993)(Enix).sfc", 2097152, 0xb344e9a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gaiagensouki) +STD_ROM_FN(snes_Gaiagensouki) + +struct BurnDriver BurnDrvsnes_Gaiagensouki = { + "snes_gaiagensouki", "snes_illusionofgaia", NULL, NULL, "1993", + "Gaia Gensouki (Japan)\0", NULL, "Quintet/Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_GaiagensoukiRomInfo, snes_GaiagensoukiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Galaxy Robo (Japan) + +static struct BurnRomInfo snes_GalaxyrobojRomDesc[] = { + { "Galaxy Robo (J)(1994)(Imagineer).sfc", 1572864, 0xbee62812, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Galaxyroboj) +STD_ROM_FN(snes_Galaxyroboj) + +struct BurnDriver BurnDrvsnes_Galaxyroboj = { + "snes_galaxyroboj", "snes_galaxyrobote", NULL, NULL, "1994", + "Galaxy Robo (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_GalaxyrobojRomInfo, snes_GalaxyrobojRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Galaxy Robo (Hack, English v1.10) +// https://www.romhacking.net/translations/2418/ +static struct BurnRomInfo snes_GalaxyroboteRomDesc[] = { + { "Galaxy Robo T-Eng v1.10 (2015)(Dynamic-Designs).sfc", 1572864, 0x313e99e3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Galaxyrobote) +STD_ROM_FN(snes_Galaxyrobote) + +struct BurnDriver BurnDrvsnes_Galaxyrobote = { + "snes_galaxyrobote", NULL, NULL, NULL, "2015", + "Galaxy Robo (Hack, English v1.10)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_GalaxyroboteRomInfo, snes_GalaxyroboteRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Galaxy Wars (Japan) + +static struct BurnRomInfo snes_GalawarsRomDesc[] = { + { "Galaxy Wars (J)(1995)(Imagineer).sfc", 262144, 0xf159ca70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Galawars) +STD_ROM_FN(snes_Galawars) + +struct BurnDriver BurnDrvsnes_Galawars = { + "snes_galawars", NULL, NULL, NULL, "1995", + "Galaxy Wars (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_GalawarsRomInfo, snes_GalawarsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hakunetsu Pro Yakyuu - Ganba League (Japan) + +static struct BurnRomInfo snes_GanbaleagueRomDesc[] = { + { "Hakunetsu Pro Yakyuu - Ganba League (J)(1991)(Epic-Sony Records).sfc", 1048576, 0x702446b7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbaleague) +STD_ROM_FN(snes_Ganbaleague) + +struct BurnDriver BurnDrvsnes_Ganbaleague = { + "snes_ganbaleague", "snes_exinnings", NULL, NULL, "1991", + "Hakunetsu Pro Yakyuu - Ganba League (Japan)\0", NULL, "Epic/Sony Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_GanbaleagueRomInfo, snes_GanbaleagueRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganbare Goemon - Yuki hime Kyuushuutsu emaki (Japan) + +static struct BurnRomInfo snes_GanbgoemonRomDesc[] = { + { "Ganbare Goemon - Yuki hime Kyuushuutsu emaki (J)(1992)(Konami).sfc", 1048576, 0x6cd62399, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbgoemon) +STD_ROM_FN(snes_Ganbgoemon) + +struct BurnDriver BurnDrvsnes_Ganbgoemon = { + "snes_ganbgoemon", "snes_legendmninja", NULL, NULL, "1992", + "Ganbare Goemon - Yuki hime Kyuushuutsu emaki (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_GanbgoemonRomInfo, snes_GanbgoemonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganbare Goemon 2 - Kiteretsu Shougun Magginesu (Japan) + +static struct BurnRomInfo snes_Ganbgoemon2RomDesc[] = { + { "Ganbare Goemon 2 - Kiteretsu Shougun Magginesu (J)(1993(Konami).sfc", 2097152, 0xca4c0219, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbgoemon2) +STD_ROM_FN(snes_Ganbgoemon2) + +struct BurnDriver BurnDrvsnes_Ganbgoemon2 = { + "snes_ganbgoemon2", "snes_ganbgoemon2te", NULL, NULL, "1993", + "Ganbare Goemon 2 - Kiteretsu Shougun Magginesu (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Ganbgoemon2RomInfo, snes_Ganbgoemon2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go for it! Goemon 2 - The Strange General McGuinness (Hack, English v3.0) +// https://www.romhacking.net/translations/5353/ +static struct BurnRomInfo snes_Ganbgoemon2teRomDesc[] = { + { "Go for it! Goemon 2 - The Strange General McGuinness T-Eng v3.0 (2020)(DDSTranslation).sfc", 4194304, 0x87aa6548, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbgoemon2te) +STD_ROM_FN(snes_Ganbgoemon2te) + +struct BurnDriver BurnDrvsnes_Ganbgoemon2te = { + "snes_ganbgoemon2te", NULL, NULL, NULL, "2020", + "Go for it! Goemon 2 - The Strange General McGuinness (Hack, English v3.0)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Ganbgoemon2teRomInfo, snes_Ganbgoemon2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganbare Goemon 3 - Shishi Juuroku Hyoue no Karakuri Manjigatame (Japan) + +static struct BurnRomInfo snes_Ganbgoemon3RomDesc[] = { + { "Ganbare Goemon 3 - Shishi Juuroku Hyoue no Karakuri Manjigatame (J)(1994)(Konami).sfc", 2097152, 0x7e5929e8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbgoemon3) +STD_ROM_FN(snes_Ganbgoemon3) + +struct BurnDriver BurnDrvsnes_Ganbgoemon3 = { + "snes_ganbgoemon3", "snes_ganbgoemon3te", NULL, NULL, "1994", + "Ganbare Goemon 3 - Shishi Juuroku Hyoue no Karakuri Manjigatame (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_Ganbgoemon3RomInfo, snes_Ganbgoemon3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go for it! Goemon 3 - The Mecha Leg Hold of Jurokube Shishi (Hack, English v4.0) +// https://www.romhacking.net/translations/5354/ +static struct BurnRomInfo snes_Ganbgoemon3teRomDesc[] = { + { "Go for it! Goemon 3 - The Mecha Leg Hold of Jurokube Shishi T-Eng v4.0 (2020)(DDSTranslation).sfc", 4194304, 0x74bbe6a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganbgoemon3te) +STD_ROM_FN(snes_Ganbgoemon3te) + +struct BurnDriver BurnDrvsnes_Ganbgoemon3te = { + "snes_ganbgoemon3te", NULL, NULL, NULL, "2020", + "Go for it! Goemon 3 - The Mecha Leg Hold of Jurokube Shishi (Hack, English v4.0)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_Ganbgoemon3teRomInfo, snes_Ganbgoemon3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gangan Gan-chan (Japan) + +static struct BurnRomInfo snes_GanganjRomDesc[] = { + { "Gangan Gan-chan (J)(1995)(Magifact).sfc", 1048576, 0xa220c6d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganganj) +STD_ROM_FN(snes_Ganganj) + +struct BurnDriver BurnDrvsnes_Ganganj = { + "snes_ganganj", NULL, NULL, NULL, "1995", + "Gangan Gan-chan (Japan)\0", NULL, "Magifact", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_GanganjRomInfo, snes_GanganjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganpuru - Gunman's Proof (Japan) + +static struct BurnRomInfo snes_GanpurujRomDesc[] = { + { "Ganpuru - Gunman's Proof (J)(1997)(ASCII).sfc", 3145728, 0xaf415c24, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganpuruj) +STD_ROM_FN(snes_Ganpuruj) + +struct BurnDriver BurnDrvsnes_Ganpuruj = { + "snes_ganpuruj", "snes_ganpurute", NULL, NULL, "1997", + "Ganpuru - Gunman's Proof (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_GanpurujRomInfo, snes_GanpurujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganpuru - Gunman's Proof (Hack, English v1.03) +// https://aeongenesis.net/projects/ganpuru +static struct BurnRomInfo snes_GanpuruteRomDesc[] = { + { "Ganpuru - Gunman's Proof T-Eng v1.03 (2002)(Aeon Genesis).sfc", 3145728, 0xacdee757, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganpurute) +STD_ROM_FN(snes_Ganpurute) + +struct BurnDriver BurnDrvsnes_Ganpurute = { + "snes_ganpurute", NULL, NULL, NULL, "2002", + "Ganpuru - Gunman's Proof (Hack, English v1.03)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_GanpuruteRomInfo, snes_GanpuruteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ganpuru - Gunman's Proof (Hack, Spanish v0.9) +// https://traduccioneslukas.blogspot.com/2014/05/shin-chan-en-el-oeste.html +static struct BurnRomInfo snes_GanpurutsRomDesc[] = { + { "Ganpuru - Gunman's Proof T-Spa v0.9 (2014)(Lukas).sfc", 3145728, 0xba33f0a6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ganpuruts) +STD_ROM_FN(snes_Ganpuruts) + +struct BurnDriver BurnDrvsnes_Ganpuruts = { + "snes_ganpuruts", "snes_ganpurute", NULL, NULL, "2014", + "Ganpuru - Gunman's Proof (Hack, Spanish v0.9)\0", NULL, "Lukas", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_GanpurutsRomInfo, snes_GanpurutsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Garou Densetsu (Japan) + +static struct BurnRomInfo snes_GaroudensetsuRomDesc[] = { + { "Garou Densetsu (J)(1992)(Takara).sfc", 1572864, 0xae4dfed0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Garoudensetsu) +STD_ROM_FN(snes_Garoudensetsu) + +struct BurnDriver BurnDrvsnes_Garoudensetsu = { + "snes_garoudensetsu", "snes_fatalfury", NULL, NULL, "1992", + "Garou Densetsu (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GaroudensetsuRomInfo, snes_GaroudensetsuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Garou Densetsu 2 - Aratanaru Tatakai (Japan) + +static struct BurnRomInfo snes_Garoudensetsu2RomDesc[] = { + { "Garou Densetsu 2 - Aratanaru Tatakai (J)(1993)(Takara).sfc", 2621440, 0xfbf3abdf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Garoudensetsu2) +STD_ROM_FN(snes_Garoudensetsu2) + +struct BurnDriver BurnDrvsnes_Garoudensetsu2 = { + "snes_garoudensetsu2", "snes_fatalfury2", NULL, NULL, "1993", + "Garou Densetsu 2 - Aratanaru Tatakai (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Garoudensetsu2RomInfo, snes_Garoudensetsu2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Garou Densetsu Special (Japan) + +static struct BurnRomInfo snes_GaroudensetsuspRomDesc[] = { + { "Garou Densetsu Special (J)(1994)(Takara).sfc", 4194304, 0xc1f68c7a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Garoudensetsusp) +STD_ROM_FN(snes_Garoudensetsusp) + +struct BurnDriver BurnDrvsnes_Garoudensetsusp = { + "snes_garoudensetsusp", "snes_fatalfurysp", NULL, NULL, "1994", + "Garou Densetsu Special (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GaroudensetsuspRomInfo, snes_GaroudensetsuspRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ghost Chaser Densei (Japan) + +static struct BurnRomInfo snes_GcdenseijRomDesc[] = { + { "Ghost Chaser Densei (J)(1994)(Banpresto).sfc", 2097152, 0xdfd6385d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gcdenseij) +STD_ROM_FN(snes_Gcdenseij) + +struct BurnDriver BurnDrvsnes_Gcdenseij = { + "snes_gcdenseij", NULL, NULL, NULL, "1994", + "Ghost Chaser Densei (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_GcdenseijRomInfo, snes_GcdenseijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gegege no Kitarou - Fukkatsu! Tenma Daiou (Japan) + +static struct BurnRomInfo snes_GegekitarouRomDesc[] = { + { "Gegege no Kitarou - Fukkatsu! Tenma Daiou (J)(1993)(Bandai).sfc", 1048576, 0xe51fb6f8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gegekitarou) +STD_ROM_FN(snes_Gegekitarou) + +struct BurnDriver BurnDrvsnes_Gegekitarou = { + "snes_gegekitarou", NULL, NULL, NULL, "1993", + "Gegege no Kitarou - Fukkatsu! Tenma Daiou (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_GegekitarouRomInfo, snes_GegekitarouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gekitotsu Dangan - Battle Mobile (Japan) + +static struct BurnRomInfo snes_GekidanganRomDesc[] = { + { "Gekitotsu Dangan - Battle Mobile (J)(1993)(System Sacom Corp.).sfc", 1048576, 0x3e88e883, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gekidangan) +STD_ROM_FN(snes_Gekidangan) + +struct BurnDriver BurnDrvsnes_Gekidangan = { + "snes_gekidangan", NULL, NULL, NULL, "1993", + "Gekitotsu Dangan - Battle Mobile (Japan)\0", NULL, "System Sacom Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_GekidanganRomInfo, snes_GekidanganRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gemfire (USA) + +static struct BurnRomInfo snes_GemfireRomDesc[] = { + { "Gemfire (U)(1992)(Koei).sfc", 1048576, 0xee801a54, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gemfire) +STD_ROM_FN(snes_Gemfire) + +struct BurnDriver BurnDrvsnes_Gemfire = { + "snes_gemfire", NULL, NULL, NULL, "1992", + "Gemfire (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_GemfireRomInfo, snes_GemfireRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Genocide 2 (Japan) + +static struct BurnRomInfo snes_Genocide2RomDesc[] = { + { "Genocide 2 (J)(1994)(Kemco).sfc", 2097152, 0xde40aa12, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Genocide2) +STD_ROM_FN(snes_Genocide2) + +struct BurnDriver BurnDrvsnes_Genocide2 = { + "snes_genocide2", NULL, NULL, NULL, "1994", + "Genocide 2 (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Genocide2RomInfo, snes_Genocide2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kidou Butouden G-Gundam (Japan) + +static struct BurnRomInfo snes_GgundamjRomDesc[] = { + { "Kidou Butouden G-Gundam (J)(1994)(Bandai).sfc", 2097152, 0x723d7b46, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ggundamj) +STD_ROM_FN(snes_Ggundamj) + +struct BurnDriver BurnDrvsnes_Ggundamj = { + "snes_ggundamj", "snes_ggundamte", NULL, NULL, "1994", + "Kidou Butouden G-Gundam (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GgundamjRomInfo, snes_GgundamjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mobile Fighter G Gundam (Hack, English) +// https://aeongenesis.net/projects/ggundam +static struct BurnRomInfo snes_GgundamteRomDesc[] = { + { "Mobile Fighter G Gundam T-Eng (2002)(Aeon Genesis).sfc", 2097152, 0x2d0aa687, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ggundamte) +STD_ROM_FN(snes_Ggundamte) + +struct BurnDriver BurnDrvsnes_Ggundamte = { + "snes_ggundamte", NULL, NULL, NULL, "2002", + "Mobile Fighter G Gundam (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GgundamteRomInfo, snes_GgundamteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ghoul Patrol (USA) + +static struct BurnRomInfo snes_GhoulpatrolRomDesc[] = { + { "Ghoul Patrol (U)(1994)(JVC - LucasArts).sfc", 1048576, 0xea16b5a2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ghoulpatrol) +STD_ROM_FN(snes_Ghoulpatrol) + +struct BurnDriver BurnDrvsnes_Ghoulpatrol = { + "snes_ghoulpatrol", NULL, NULL, NULL, "1994", + "Ghoul Patrol (USA)\0", NULL, "JVC - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_GhoulpatrolRomInfo, snes_GhoulpatrolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman (Japan) + +static struct BurnRomInfo snes_GoackmanjRomDesc[] = { + { "Go Go Ackman (J)(1994)(Banpresto).sfc", 1310720, 0x26fb2d11, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackmanj) +STD_ROM_FN(snes_Goackmanj) + +struct BurnDriver BurnDrvsnes_Goackmanj = { + "snes_goackmanj", "snes_goackmante", NULL, NULL, "1994", + "Go Go Ackman (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GoackmanjRomInfo, snes_GoackmanjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman (Hack, English) +// https://www.romhacking.net/translations/363/ +static struct BurnRomInfo snes_GoackmanteRomDesc[] = { + { "Go Go Ackman T-Eng (1999)(Ackman Translations).sfc", 1310720, 0x7a15c55f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackmante) +STD_ROM_FN(snes_Goackmante) + +struct BurnDriver BurnDrvsnes_Goackmante = { + "snes_goackmante", NULL, NULL, NULL, "1999", + "Go Go Ackman (Hack, English)\0", NULL, "Ackman Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GoackmanteRomInfo, snes_GoackmanteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman 2 (Japan) + +static struct BurnRomInfo snes_Goackman2jRomDesc[] = { + { "Go Go Ackman 2 (J)(1995)(Banpresto).sfc", 1572864, 0x76c7aa37, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackman2j) +STD_ROM_FN(snes_Goackman2j) + +struct BurnDriver BurnDrvsnes_Goackman2j = { + "snes_goackman2j", "snes_goackman2te", NULL, NULL, "1995", + "Go Go Ackman 2 (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Goackman2jRomInfo, snes_Goackman2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman 2 (Hack, English v1.1) +// https://www.romhacking.net/translations/6777/ +static struct BurnRomInfo snes_Goackman2teRomDesc[] = { + { "Go Go Ackman 2 T-Eng v1.1 (2023)(Retroman_X).sfc", 4194304, 0x94d55150, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackman2te) +STD_ROM_FN(snes_Goackman2te) + +struct BurnDriver BurnDrvsnes_Goackman2te = { + "snes_goackman2te", NULL, NULL, NULL, "2023", + "Go Go Ackman 2 (Hack, English v1.1)\0", NULL, "Retroman_X", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Goackman2teRomInfo, snes_Goackman2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman 3 (Japan) + +static struct BurnRomInfo snes_Goackman3jRomDesc[] = { + { "Go Go Ackman 3 (J)(1995)(Banpresto).sfc", 2097152, 0x9a18290c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackman3j) +STD_ROM_FN(snes_Goackman3j) + +struct BurnDriver BurnDrvsnes_Goackman3j = { + "snes_goackman3j", "snes_goackman3te", NULL, NULL, "1995", + "Go Go Ackman 3 (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Goackman3jRomInfo, snes_Goackman3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Go Go Ackman 3 (Hack, English) +// https://www.romhacking.net/forum/index.php?topic=29838.0 +static struct BurnRomInfo snes_Goackman3teRomDesc[] = { + { "Go Go Ackman 3 T-Eng (2020)(Reld).sfc", 2097152, 0x43c27291, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goackman3te) +STD_ROM_FN(snes_Goackman3te) + +struct BurnDriver BurnDrvsnes_Goackman3te = { + "snes_goackman3te", NULL, NULL, NULL, "2020", + "Go Go Ackman 3 (Hack, English)\0", NULL, "Reld", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Goackman3teRomInfo, snes_Goackman3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Goal! (USA) + +static struct BurnRomInfo snes_GoalRomDesc[] = { + { "Goal! (U)(1992)(Jaleco).sfc", 1048576, 0x935ea22c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goal) +STD_ROM_FN(snes_Goal) + +struct BurnDriver BurnDrvsnes_Goal = { + "snes_goal", NULL, NULL, NULL, "1992", + "Goal! (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_GoalRomInfo, snes_GoalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// G.O.D: Mezame yo to Yobu Koe ga Kikoe (Japan) + +static struct BurnRomInfo snes_GodrpgjRomDesc[] = { + { "G.O.D - Mezame yo to Yobu Koe ga Kikoe (Japan)(1996)(Imagineer).sfc", 3145728, 0x4d2ce16f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Godrpgj) +STD_ROM_FN(snes_Godrpgj) + +struct BurnDriver BurnDrvsnes_Godrpgj = { + "snes_godrpgj", "snes_godrpgte", NULL, NULL, "1996", + "G.O.D: Mezame yo to Yobu Koe ga Kikoe (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_GodrpgjRomInfo, snes_GodrpgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// G.O.D: Growth or Devolution (Hack, English) +// https://www.dynamic-designs.us/god.shtml +static struct BurnRomInfo snes_GodrpgteRomDesc[] = { + { "G.O.D. - Growth or Devolution T-Eng (2018)(Dynamic-Designs).sfc", 4194304, 0x6fc6af26, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Godrpgte) +STD_ROM_FN(snes_Godrpgte) + +struct BurnDriver BurnDrvsnes_Godrpgte = { + "snes_godrpgte", NULL, NULL, NULL, "2018", + "G.O.D: Growth or Devolution (Hack, English)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_GodrpgteRomInfo, snes_GodrpgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gods (USA) + +static struct BurnRomInfo snes_GodsRomDesc[] = { + { "Gods (U)(1992)(Mindscape).sfc", 1048576, 0x6779970f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gods) +STD_ROM_FN(snes_Gods) + +struct BurnDriver BurnDrvsnes_Gods = { + "snes_gods", NULL, NULL, NULL, "1992", + "Gods (USA)\0", NULL, "Mindscape - The Bitmap Brothers", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GodsRomInfo, snes_GodsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Godzilla - Kaijuu Daikessen (Japan) + +static struct BurnRomInfo snes_GodzillaRomDesc[] = { + { "Godzilla - Kaijuu Daikessen (J)(1994)(Toho Co.).sfc", 2621440, 0x29ce8e57, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Godzilla) +STD_ROM_FN(snes_Godzilla) + +struct BurnDriver BurnDrvsnes_Godzilla = { + "snes_godzilla", NULL, NULL, NULL, "1994", + "Godzilla - Kaijuu Daikessen (Japan)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GodzillaRomInfo, snes_GodzillaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gon (Japan) + +static struct BurnRomInfo snes_GonjRomDesc[] = { + { "Gon (J)(1994)(Bandai).sfc", 1048576, 0x426881a3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gonj) +STD_ROM_FN(snes_Gonj) + +struct BurnDriver BurnDrvsnes_Gonj = { + "snes_gonj", NULL, NULL, NULL, "1994", + "Gon (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GonjRomInfo, snes_GonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Goof Troop (USA) + +static struct BurnRomInfo snes_GooftroopRomDesc[] = { + { "Goof Troop (U)(1993)(Capcom).sfc", 524288, 0x4aafa462, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gooftroop) +STD_ROM_FN(snes_Gooftroop) + +struct BurnDriver BurnDrvsnes_Gooftroop = { + "snes_gooftroop", NULL, NULL, NULL, "1993", + "Disney's Goof Troop (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_GooftroopRomInfo, snes_GooftroopRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Goof Troop (Euro, English) + +static struct BurnRomInfo snes_GooftroopeRomDesc[] = { + { "Goof Troop (E)(1993)(Capcom).sfc", 524288, 0x61e8f56a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gooftroope) +STD_ROM_FN(snes_Gooftroope) + +struct BurnDriver BurnDrvsnes_Gooftroope = { + "snes_gooftroope", "snes_gooftroop", NULL, NULL, "1993", + "Disney's Goof Troop (Euro, English)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_GooftroopeRomInfo, snes_GooftroopeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Goof Troop (Euro, French) + +static struct BurnRomInfo snes_GooftroopfRomDesc[] = { + { "Goof Troop (E, France)(1993)(Capcom).sfc", 524288, 0x4fe6077a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gooftroopf) +STD_ROM_FN(snes_Gooftroopf) + +struct BurnDriver BurnDrvsnes_Gooftroopf = { + "snes_gooftroopf", "snes_gooftroop", NULL, NULL, "1993", + "Disney's Goof Troop (Euro, French)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_GooftroopfRomInfo, snes_GooftroopfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Goof Troop (Euro, German) + +static struct BurnRomInfo snes_GooftroopgRomDesc[] = { + { "Goof Troop (E, Germany)(1993)(Capcom).sfc", 524288, 0xaa69ef05, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gooftroopg) +STD_ROM_FN(snes_Gooftroopg) + +struct BurnDriver BurnDrvsnes_Gooftroopg = { + "snes_gooftroopg", "snes_gooftroop", NULL, NULL, "1993", + "Disney's Goof Troop (Euro, German)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_GooftroopgRomInfo, snes_GooftroopgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Goofy to Max: Kaizoku-jima no Daibouken (Japan) + +static struct BurnRomInfo snes_GooftroopjRomDesc[] = { + { "Goofy to Max - Kaizoku-jima no Daibouken (J)(1993)(Capcom).sfc", 524288, 0xd3279aac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gooftroopj) +STD_ROM_FN(snes_Gooftroopj) + +struct BurnDriver BurnDrvsnes_Gooftroopj = { + "snes_gooftroopj", "snes_gooftroop", NULL, NULL, "1993", + "Goofy to Max: Kaizoku-jima no Daibouken (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_GooftroopjRomInfo, snes_GooftroopjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gouketsuji Ichizoku (Japan) + +static struct BurnRomInfo snes_GouketsujiRomDesc[] = { + { "Gouketsuji Ichizoku (J)(1994)(Atlus).sfc", 3145728, 0xbaf084ee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gouketsuji) +STD_ROM_FN(snes_Gouketsuji) + +struct BurnDriver BurnDrvsnes_Gouketsuji = { + "snes_gouketsuji", "snes_powinstinct", NULL, NULL, "1994", + "Gouketsuji Ichizoku (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GouketsujiRomInfo, snes_GouketsujiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// GP-1 (USA) + +static struct BurnRomInfo snes_Gp1RomDesc[] = { + { "GP-1 (U)(1993)(Atlus).sfc", 1048576, 0x14bbc357, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gp1) +STD_ROM_FN(snes_Gp1) + +struct BurnDriver BurnDrvsnes_Gp1 = { + "snes_gp1", NULL, NULL, NULL, "1993", + "GP-1 (USA)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Gp1RomInfo, snes_Gp1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// GP-1 - Part II (USA) + +static struct BurnRomInfo snes_Gp1piiRomDesc[] = { + { "GP-1 - Part II (U)(1994)(Atlus).sfc", 1572864, 0xa9014e12, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gp1pii) +STD_ROM_FN(snes_Gp1pii) + +struct BurnDriver BurnDrvsnes_Gp1pii = { + "snes_gp1pii", NULL, NULL, NULL, "1994", + "GP-1 - Part II (USA)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Gp1piiRomInfo, snes_Gp1piiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gokujou Parodius (Japan) + +static struct BurnRomInfo snes_GparodiusRomDesc[] = { + { "Gokujou Parodius (J)(1994)(Konami).sfc", 2097152, 0x04ee98ed, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gparodius) +STD_ROM_FN(snes_Gparodius) + +struct BurnDriver BurnDrvsnes_Gparodius = { + "snes_gparodius", "snes_fparodius", NULL, NULL, "1994", + "Gokujou Parodius (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_GparodiusRomInfo, snes_GparodiusRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gradius III (USA) + +static struct BurnRomInfo snes_Gradius3RomDesc[] = { + { "Gradius III (U)(1991)(Konami).sfc", 524288, 0xcd973979, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gradius3) +STD_ROM_FN(snes_Gradius3) + +struct BurnDriver BurnDrvsnes_Gradius3 = { + "snes_gradius3", NULL, NULL, NULL, "1991", + "Gradius III (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Gradius3RomInfo, snes_Gradius3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gradius III (Japan) + +static struct BurnRomInfo snes_Gradius3jRomDesc[] = { + { "Gradius III (J)(1990)(Konami).sfc", 524288, 0xbca9ab02, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gradius3j) +STD_ROM_FN(snes_Gradius3j) + +struct BurnDriver BurnDrvsnes_Gradius3j = { + "snes_gradius3j", "snes_gradius3", NULL, NULL, "1990", + "Gradius III (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Gradius3jRomInfo, snes_Gradius3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle II, The - Last Fighter Twin (Japan) + +static struct BurnRomInfo snes_Greatbattle2jRomDesc[] = { + { "Great Battle II, The - Last Fighter Twin (J)(1992)(Banpresto).sfc", 1048576, 0x8254a32e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle2j) +STD_ROM_FN(snes_Greatbattle2j) + +struct BurnDriver BurnDrvsnes_Greatbattle2j = { + "snes_greatbattle2j", "snes_greatbattle2te", NULL, NULL, "1992", + "Great Battle II, The - Last Fighter Twin (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Greatbattle2jRomInfo, snes_Greatbattle2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle II, The - Last Fighter Twin (Hack, English v1.2) +// https://www.romhacking.net/translations/3470/ +static struct BurnRomInfo snes_Greatbattle2teRomDesc[] = { + { "Great Battle II, The - Last Fighter Twin T-Eng v1.20 (2018)(Aeon Genesis).sfc", 1572864, 0xd4477448, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle2te) +STD_ROM_FN(snes_Greatbattle2te) + +struct BurnDriver BurnDrvsnes_Greatbattle2te = { + "snes_greatbattle2te", NULL, NULL, NULL, "2018", + "Great Battle II, The - Last Fighter Twin (Hack, English v1.2)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_Greatbattle2teRomInfo, snes_Greatbattle2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle III, The (Japan) + +static struct BurnRomInfo snes_Greatbattle3jRomDesc[] = { + { "Great Battle III, The (J)(1993)(Banpresto).sfc", 1310720, 0xb311df48, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle3j) +STD_ROM_FN(snes_Greatbattle3j) + +struct BurnDriver BurnDrvsnes_Greatbattle3j = { + "snes_greatbattle3j", "snes_greatbattle3te", NULL, NULL, "1993", + "Great Battle III, The (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Greatbattle3jRomInfo, snes_Greatbattle3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle III, The (Hack, English v1.1) +// https://www.romhacking.net/translations/3471/ +static struct BurnRomInfo snes_Greatbattle3teRomDesc[] = { + { "Great Battle III, The T-Eng v1.1 (2018)(Aeon Genesis).sfc", 1572864, 0x723ef711, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle3te) +STD_ROM_FN(snes_Greatbattle3te) + +struct BurnDriver BurnDrvsnes_Greatbattle3te = { + "snes_greatbattle3te", NULL, NULL, NULL, "2018", + "Great Battle III, The (Hack, English v1.1)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Greatbattle3teRomInfo, snes_Greatbattle3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle IV, The (Japan) + +static struct BurnRomInfo snes_Greatbattle4jRomDesc[] = { + { "Great Battle IV, The (J)(1994)(Banpresto).sfc", 1572864, 0xfb165a32, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle4j) +STD_ROM_FN(snes_Greatbattle4j) + +struct BurnDriver BurnDrvsnes_Greatbattle4j = { + "snes_greatbattle4j", "snes_greatbattle4te", NULL, NULL, "1994", + "Great Battle IV, The (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Greatbattle4jRomInfo, snes_Greatbattle4jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle IV, The (Hack, English v1.1) +// https://www.romhacking.net/translations/3472/ +static struct BurnRomInfo snes_Greatbattle4teRomDesc[] = { + { "Great Battle IV, The T-Eng v1.1 (2018)(Aeon Genesis).sfc", 2097152, 0xd7c93563, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle4te) +STD_ROM_FN(snes_Greatbattle4te) + +struct BurnDriver BurnDrvsnes_Greatbattle4te = { + "snes_greatbattle4te", NULL, NULL, NULL, "2018", + "Great Battle IV, The (Hack, English v1.1)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Greatbattle4teRomInfo, snes_Greatbattle4teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle V, The (Japan) + +static struct BurnRomInfo snes_Greatbattle5jRomDesc[] = { + { "Great Battle V, The (J)(1995)(Banpresto).sfc", 1572864, 0xbf3c9314, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle5j) +STD_ROM_FN(snes_Greatbattle5j) + +struct BurnDriver BurnDrvsnes_Greatbattle5j = { + "snes_greatbattle5j", "snes_greatbattle5te", NULL, NULL, "1995", + "Great Battle V, The (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SHOOT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Greatbattle5jRomInfo, snes_Greatbattle5jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Battle V, The (Hack, English v1.2) +// https://www.romhacking.net/translations/3473/ +static struct BurnRomInfo snes_Greatbattle5teRomDesc[] = { + { "Great Battle V, The T-Eng v1.2 (2018)(Aeon Genesis).sfc", 2097152, 0xfa493690, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattle5te) +STD_ROM_FN(snes_Greatbattle5te) + +struct BurnDriver BurnDrvsnes_Greatbattle5te = { + "snes_greatbattle5te", NULL, NULL, NULL, "2018", + "Great Battle V, The (Hack, English v1.2)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SHOOT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Greatbattle5teRomInfo, snes_Greatbattle5teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SD The Great Battle - Aratanaru Chousen (Japan) + +static struct BurnRomInfo snes_GreatbattlejRomDesc[] = { + { "SD The Great Battle - Aratanaru Chousen (J)(1991)(Banpresto).sfc", 786432, 0x38726ec1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattlej) +STD_ROM_FN(snes_Greatbattlej) + +struct BurnDriver BurnDrvsnes_Greatbattlej = { + "snes_greatbattlej", "snes_greatbattlete", NULL, NULL, "1991", + "SD The Great Battle - Aratanaru Chousen (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_GreatbattlejRomInfo, snes_GreatbattlejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SD The Great Battle (Hack, English) +// https://www.romhacking.net/translations/3469/ +static struct BurnRomInfo snes_GreatbattleteRomDesc[] = { + { "SD The Great Battle T-Eng (2018)(Aeon Genesis).sfc", 1048576, 0x9bf7d5e1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatbattlete) +STD_ROM_FN(snes_Greatbattlete) + +struct BurnDriver BurnDrvsnes_Greatbattlete = { + "snes_greatbattlete", NULL, NULL, NULL, "2018", + "SD The Great Battle (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_GreatbattleteRomInfo, snes_GreatbattleteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Circus Mystery Starring Mickey & Minnie, The (USA) + +static struct BurnRomInfo snes_GreatcircmystRomDesc[] = { + { "Great Circus Mystery Starring Mickey & Minnie, The (U)(1994)(Capcom).sfc", 1572864, 0x1903ea89, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatcircmyst) +STD_ROM_FN(snes_Greatcircmyst) + +struct BurnDriver BurnDrvsnes_Greatcircmyst = { + "snes_greatcircmyst", NULL, NULL, NULL, "1994", + "Great Circus Mystery Starring Mickey & Minnie, The (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GreatcircmystRomInfo, snes_GreatcircmystRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Great Waldo Search, The (USA) + +static struct BurnRomInfo snes_GreatwaldoRomDesc[] = { + { "Great Waldo Search, The (U)(1993)(THQ).sfc", 524288, 0xeb49f246, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Greatwaldo) +STD_ROM_FN(snes_Greatwaldo) + +struct BurnDriver BurnDrvsnes_Greatwaldo = { + "snes_greatwaldo", NULL, NULL, NULL, "1993", + "Great Waldo Search, The (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_GreatwaldoRomInfo, snes_GreatwaldoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gourmet Sentai Barayarou (Japan) + +static struct BurnRomInfo snes_GsentaibRomDesc[] = { + { "Gourmet Sentai Barayarou (J)(1995)(Virgin Interactive - Winds).sfc", 2097152, 0x9f717d76, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gsentaib) +STD_ROM_FN(snes_Gsentaib) + +struct BurnDriver BurnDrvsnes_Gsentaib = { + "snes_gsentaib", "snes_gourmetpiko", NULL, NULL, "1995", + "Gourmet Sentai Barayarou (Japan)\0", NULL, "Virgin Interactive - Winds", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_GsentaibRomInfo, snes_GsentaibRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ghost Sweeper Mikami - Joreishi wa Nice Body (Japan) + +static struct BurnRomInfo snes_GsmikamiRomDesc[] = { + { "Ghost Sweeper Mikami - Joreishi wa Nice Body (J)(1993)(Banalex).sfc", 1048576, 0x444c9962, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gsmikami) +STD_ROM_FN(snes_Gsmikami) + +struct BurnDriver BurnDrvsnes_Gsmikami = { + "snes_gsmikami", NULL, NULL, NULL, "1993", + "Ghost Sweeper Mikami - Joreishi wa Nice Body (Japan)\0", NULL, "Banalex", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_GsmikamiRomInfo, snes_GsmikamiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kidou Senshi Gundam - Cross Dimension 0079 (Japan) + +static struct BurnRomInfo snes_Gundamcd0079jRomDesc[] = { + { "Kidou Senshi Gundam - Cross Dimension 0079 (J)(1995)(Bandai).sfc", 1572864, 0x9ab3eb18, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gundamcd0079j) +STD_ROM_FN(snes_Gundamcd0079j) + +struct BurnDriver BurnDrvsnes_Gundamcd0079j = { + "snes_gundamcd0079j", "snes_gundamcd0079te", NULL, NULL, "1995", + "Kidou Senshi Gundam - Cross Dimension 0079 (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Gundamcd0079jRomInfo, snes_Gundamcd0079jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mobile Suit Gundam - Cross Dimension 0079 (Hack, English) +// https://www.romhacking.net/translations/830/ +static struct BurnRomInfo snes_Gundamcd0079teRomDesc[] = { + { "Mobile Suit Gundam - Cross Dimension 0079 T-Eng (2004)(Aeon Genesis).sfc", 1573376, 0x2116b6c5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gundamcd0079te) +STD_ROM_FN(snes_Gundamcd0079te) + +struct BurnDriver BurnDrvsnes_Gundamcd0079te = { + "snes_gundamcd0079te", NULL, NULL, NULL, "2004", + "Mobile Suit Gundam - Cross Dimension 0079 (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Gundamcd0079teRomInfo, snes_Gundamcd0079teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Kidou Senki Gundam W - Endless Duel (Japan) + +static struct BurnRomInfo snes_GundamwjRomDesc[] = { + { "Shin Kidou Senki Gundam W - Endless Duel (J)(1996)(Bandai).sfc", 2097152, 0xc0aecdca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gundamwj) +STD_ROM_FN(snes_Gundamwj) + +struct BurnDriver BurnDrvsnes_Gundamwj = { + "snes_gundamwj", "snes_gundamwte", NULL, NULL, "1996", + "Shin Kidou Senki Gundam W - Endless Duel (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GundamwjRomInfo, snes_GundamwjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mobile Suit Gundam Wing - Endless Duel (Hack, English) +// https://www.romhacking.net/translations/570/ +static struct BurnRomInfo snes_GundamwteRomDesc[] = { + { "Mobile Suit Gundam Wing - Endless Duel T-Eng (2002)(Aeon Genesis).sfc", 2097664, 0x8e2723ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gundamwte) +STD_ROM_FN(snes_Gundamwte) + +struct BurnDriver BurnDrvsnes_Gundamwte = { + "snes_gundamwte", NULL, NULL, NULL, "2002", + "Mobile Suit Gundam Wing - Endless Duel (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_GundamwteRomInfo, snes_GundamwteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hagane - The Final Conflict (USA) + +static struct BurnRomInfo snes_HaganeRomDesc[] = { + { "Hagane - The Final Conflict (U)(1994)(Hudson Soft).sfc", 2097152, 0x8e0a7034, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hagane) +STD_ROM_FN(snes_Hagane) + +struct BurnDriver BurnDrvsnes_Hagane = { + "snes_hagane", NULL, NULL, NULL, "1994", + "Hagane - The Final Conflict (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_HaganeRomInfo, snes_HaganeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hagane (Japan) + +static struct BurnRomInfo snes_HaganejRomDesc[] = { + { "Hagane (J)(1994)(Hudson Soft).sfc", 2097152, 0x63245cac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Haganej) +STD_ROM_FN(snes_Haganej) + +struct BurnDriver BurnDrvsnes_Haganej = { + "snes_haganej", "snes_hagane", NULL, NULL, "1994", + "Hagane (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_HaganejRomInfo, snes_HaganejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// HAL's Hole in One Golf (USA) + +static struct BurnRomInfo snes_HalsholeRomDesc[] = { + { "HAL's Hole in One Golf (U)(1991)(HAL Laboratory).sfc", 1048576, 0x58752baf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Halshole) +STD_ROM_FN(snes_Halshole) + +struct BurnDriver BurnDrvsnes_Halshole = { + "snes_halshole", NULL, NULL, NULL, "1991", + "HAL's Hole in One Golf (USA)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_HalsholeRomInfo, snes_HalsholeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hamelin no Violin Hiki (Japan) + +static struct BurnRomInfo snes_HamelinjRomDesc[] = { + { "Hamelin no Violin Hiki (J)(1995)(Enix).sfc", 1572864, 0xfb500926, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hamelinj) +STD_ROM_FN(snes_Hamelinj) + +struct BurnDriver BurnDrvsnes_Hamelinj = { + "snes_hamelinj", "snes_hamelinte", NULL, NULL, "1995", + "Hamelin no Violin Hiki (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_HamelinjRomInfo, snes_HamelinjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Violinist von Hameln, Der (Hack, German) +// https://www.romhacking.net/translations/7041/ +static struct BurnRomInfo snes_HamelintdeRomDesc[] = { + { "Hamelin no Violin Hiki T-Ger (2023)(POE).sfc", 1573376, 0xe382dbcf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hamelintde) +STD_ROM_FN(snes_Hamelintde) + +struct BurnDriver BurnDrvsnes_Hamelintde = { + "snes_hamelintde", "snes_hamelinte", NULL, NULL, "2023", + "Violinist von Hameln, Der (Hack, German)\0", NULL, "POE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_HamelintdeRomInfo, snes_HamelintdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Violinist of Hameln, The (Hack, English) +// https://www.romhacking.net/translations/484/ +static struct BurnRomInfo snes_HamelinteRomDesc[] = { + { "Hamelin no Violin Hiki T-Eng (2001)(J2e Translations).sfc", 1573376, 0x665d4148, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hamelinte) +STD_ROM_FN(snes_Hamelinte) + +struct BurnDriver BurnDrvsnes_Hamelinte = { + "snes_hamelinte", NULL, NULL, NULL, "2001", + "Violinist of Hameln, The (Hack, English)\0", NULL, "J2e Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_HamelinteRomInfo, snes_HamelinteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Violinista de Hameln, El (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/3347/ +static struct BurnRomInfo snes_HamelintsRomDesc[] = { + { "Hamelin no Violin Hiki T-Spa v1.1 (2017)(semco).sfc", 2359296, 0xbbfaeee5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hamelints) +STD_ROM_FN(snes_Hamelints) + +struct BurnDriver BurnDrvsnes_Hamelints = { + "snes_hamelints", "snes_hamelinte", NULL, NULL, "2017", + "Violinista de Hameln, El (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_HamelintsRomInfo, snes_HamelintsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Harapeko Bakka (Japan) + +static struct BurnRomInfo snes_HarabakkaRomDesc[] = { + { "Harapeko Bakka (J)(1994)(Sunsoft).sfc", 262144, 0x7abdb576, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Harabakka) +STD_ROM_FN(snes_Harabakka) + +struct BurnDriver BurnDrvsnes_Harabakka = { + "snes_harabakka", "snes_hungrydinos", NULL, NULL, "1994", + "Harapeko Bakka (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_HarabakkaRomInfo, snes_HarabakkaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// HardBall III (USA) + +static struct BurnRomInfo snes_Hardball3RomDesc[] = { + { "HardBall III (U)(1994)(Accolade).sfc", 2097152, 0xf3589b15, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hardball3) +STD_ROM_FN(snes_Hardball3) + +struct BurnDriver BurnDrvsnes_Hardball3 = { + "snes_hardball3", NULL, NULL, NULL, "1994", + "HardBall III (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Hardball3RomInfo, snes_Hardball3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Harley's Humongous Adventure (USA) + +static struct BurnRomInfo snes_HarhumadvRomDesc[] = { + { "Harley's Humongous Adventure (U)(1993)(Hi Tech Expressions).sfc", 524288, 0x91e0c960, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Harhumadv) +STD_ROM_FN(snes_Harhumadv) + +struct BurnDriver BurnDrvsnes_Harhumadv = { + "snes_harhumadv", NULL, NULL, NULL, "1993", + "Harley's Humongous Adventure (USA)\0", NULL, "Hi Tech Expressions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HarhumadvRomInfo, snes_HarhumadvRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Harvest Moon (USA) + +static struct BurnRomInfo snes_HarvmoonRomDesc[] = { + { "Harvest Moon (U)(1997)(Natsume).sfc", 2097152, 0xf829129e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Harvmoon) +STD_ROM_FN(snes_Harvmoon) + +struct BurnDriver BurnDrvsnes_Harvmoon = { + "snes_harvmoon", NULL, NULL, NULL, "1997", + "Harvest Moon (USA)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_ADV, 0, + SNESGetZipName, snes_HarvmoonRomInfo, snes_HarvmoonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bokujou Monogatari (Japan) + +static struct BurnRomInfo snes_HarvmoonjRomDesc[] = { + { "Bokujou Monogatari (J)(1996)(Pack-In-Video).sfc", 2097152, 0x9485ec0f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Harvmoonj) +STD_ROM_FN(snes_Harvmoonj) + +struct BurnDriver BurnDrvsnes_Harvmoonj = { + "snes_harvmoonj", "snes_harvmoon", NULL, NULL, "1996", + "Bokujou Monogatari (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY | GBF_ADV, 0, + SNESGetZipName, snes_HarvmoonjRomInfo, snes_HarvmoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hashire Hebereke (Japan) + +static struct BurnRomInfo snes_HashihebeRomDesc[] = { + { "Hashire Hebereke (J)(1994)(Sunsoft).sfc", 1310720, 0xdd792499, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hashihebe) +STD_ROM_FN(snes_Hashihebe) + +struct BurnDriver BurnDrvsnes_Hashihebe = { + "snes_hashihebe", NULL, NULL, NULL, "1994", + "Hashire Hebereke (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_HashihebeRomInfo, snes_HashihebeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hayazashi Nidan Morita Shougi (Japan) + +static struct BurnRomInfo snes_HayazashiRomDesc[] = { + { "Hayazashi Nidan Morita Shougi (J)(1993)(Seta).sfc", 524288, 0x81e822ad, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Hayazashi, snes_Hayazashi, snes_st011) +STD_ROM_FN(snes_Hayazashi) + +struct BurnDriver BurnDrvsnes_Hayazashi = { + "snes_hayazashi", NULL, "snes_st011", NULL, "1993", + "Hayazashi Nidan Morita Shougi (Japan)\0", "ST011 enhancement chip", "Seta Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BOARD | GBF_STRATEGY, 0, + SNESGetZipName, snes_HayazashiRomInfo, snes_HayazashiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 462, 4, 3 +}; + +// Hebereke's Popoon (Euro) + +static struct BurnRomInfo snes_HebepopooneRomDesc[] = { + { "Hebereke's Popoon (E)(1994)(Sunsoft).sfc", 1048576, 0x7a313722, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hebepopoone) +STD_ROM_FN(snes_Hebepopoone) + +struct BurnDriver BurnDrvsnes_Hebepopoone = { + "snes_hebepopoone", NULL, NULL, NULL, "1994", + "Hebereke's Popoon (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_HebepopooneRomInfo, snes_HebepopooneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hebereke no Popoon (Japan) + +static struct BurnRomInfo snes_HebepopoonjRomDesc[] = { + { "Hebereke no Popoon (J)(1993)(Sunsoft).sfc", 1048576, 0x890d9c9e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hebepopoonj) +STD_ROM_FN(snes_Hebepopoonj) + +struct BurnDriver BurnDrvsnes_Hebepopoonj = { + "snes_hebepopoonj", "snes_hebepopoone", NULL, NULL, "1993", + "Hebereke no Popoon (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_HebepopoonjRomInfo, snes_HebepopoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hello! Pac-Man (Japan) + +static struct BurnRomInfo snes_HellopacmanRomDesc[] = { + { "Hello! Pac-Man (J)(1994)(Namco).sfc", 1572864, 0x0318fd8c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hellopacman) +STD_ROM_FN(snes_Hellopacman) + +struct BurnDriver BurnDrvsnes_Hellopacman = { + "snes_hellopacman", "snes_pacman2adv", NULL, NULL, "1994", + "Hello! Pac-Man (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_HellopacmanRomInfo, snes_HellopacmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hebereke's Popoitto (Euro) + +static struct BurnRomInfo snes_HeberekepRomDesc[] = { + { "Hebereke's Popoitto (E)(1995)(Sunsoft).sfc", 524288, 0x0ce626ba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Heberekep) +STD_ROM_FN(snes_Heberekep) + +struct BurnDriver BurnDrvsnes_Heberekep = { + "snes_heberekep", NULL, NULL, NULL, "1995", + "Hebereke's Popoitto (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_HeberekepRomInfo, snes_HeberekepRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hero Senki - Project Olympus (Japan) + +static struct BurnRomInfo snes_HerosenkijRomDesc[] = { + { "Hero Senki - Project Olympus (J)(1992)(Banpresto).sfc", 1572864, 0x789da99c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Herosenkij) +STD_ROM_FN(snes_Herosenkij) + +struct BurnDriver BurnDrvsnes_Herosenkij = { + "snes_herosenkij", "snes_herosenkite", NULL, NULL, "1992", + "Hero Senki - Project Olympus (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_HerosenkijRomInfo, snes_HerosenkijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hero Chronicle - Project Olympus (Hack, English) +// https://aeongenesis.net/projects/herosenki +static struct BurnRomInfo snes_HerosenkiteRomDesc[] = { + { "Hero Senki - Project Olympus T-Eng (2019)(Aeon Genesis).sfc", 2097152, 0x0177b6d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Herosenkite) +STD_ROM_FN(snes_Herosenkite) + +struct BurnDriver BurnDrvsnes_Herosenkite = { + "snes_herosenkite", NULL, NULL, NULL, "2019", + "Hero Chronicle - Project Olympus (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_HerosenkiteRomInfo, snes_HerosenkiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hokuto no Ken 6: Gekitou Denshouken - Haou e no Michi (Japan) + +static struct BurnRomInfo snes_Hokuto6jRomDesc[] = { + { "Hokuto no Ken 6 - Gekitou Denshouken Haou e no Michi (J)(1992)(Toei Animation).sfc", 1572864, 0xe51cd206, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hokuto6j) +STD_ROM_FN(snes_Hokuto6j) + +struct BurnDriver BurnDrvsnes_Hokuto6j = { + "snes_hokuto6j", NULL, NULL, NULL, "1992", + "Hokuto no Ken 6: Gekitou Denshouken - Haou e no Michi (Japan)\0", NULL, "Toei Animation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Hokuto6jRomInfo, snes_Hokuto6jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hokuto no Ken 7: Seiken Retsuden - Denshousha e no Michi (Japan) + +static struct BurnRomInfo snes_Hokuto7jRomDesc[] = { + { "Hokuto no Ken 7 - Seiken Retsuden Denshousha e no Michi (J)(1993)(Toei Animation).sfc", 2621440, 0x143e5a7d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hokuto7j) +STD_ROM_FN(snes_Hokuto7j) + +struct BurnDriver BurnDrvsnes_Hokuto7j = { + "snes_hokuto7j", NULL, NULL, NULL, "1993", + "Hokuto no Ken 7: Seiken Retsuden - Denshousha e no Michi (Japan)\0", NULL, "Toei Animation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Hokuto7jRomInfo, snes_Hokuto7jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Holy Striker (Japan) + +static struct BurnRomInfo snes_HolystrikerRomDesc[] = { + { "Holy Striker (J)(1993)(Hect).sfc", 1048576, 0x46acfc84, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Holystriker) +STD_ROM_FN(snes_Holystriker) + +struct BurnDriver BurnDrvsnes_Holystriker = { + "snes_holystriker", "snes_firestriker", NULL, NULL, "1993", + "Holy Striker (Japan)\0", NULL, "Hect", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_HolystrikerRomInfo, snes_HolystrikerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Holy Umbrella: Dondera no Mubou!! (Japan) + +static struct BurnRomInfo snes_HolyumbrjRomDesc[] = { + { "Holy Umbrella - Dondera no Mubou!! (J)(1995)(Naxat Soft).sfc", 2621440, 0xf0a9dead, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Holyumbrj) +STD_ROM_FN(snes_Holyumbrj) + +struct BurnDriver BurnDrvsnes_Holyumbrj = { + "snes_holyumbrj", "snes_holyumbrte", NULL, NULL, "1995", + "Holy Umbrella: Dondera no Mubou!! (Japan)\0", NULL, "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_HolyumbrjRomInfo, snes_HolyumbrjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Holy Umbrella: Dondera's Wild!! (Hack, English) +// https://www.romhacking.net/translations/1441/ +static struct BurnRomInfo snes_HolyumbrteRomDesc[] = { + { "Holy Umbrella - Dondera's Wild!! T-Eng (2009)(Aeon Genesis).sfc", 3145728, 0x93a77c59, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Holyumbrte) +STD_ROM_FN(snes_Holyumbrte) + +struct BurnDriver BurnDrvsnes_Holyumbrte = { + "snes_holyumbrte", NULL, NULL, NULL, "2009", + "Holy Umbrella: Dondera's Wild!! (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_HolyumbrteRomInfo, snes_HolyumbrteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Home Alone (USA) + +static struct BurnRomInfo snes_HomealoneRomDesc[] = { + { "Home Alone (U)(1991)(THQ).sfc", 524288, 0x07c494b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Homealone) +STD_ROM_FN(snes_Homealone) + +struct BurnDriver BurnDrvsnes_Homealone = { + "snes_homealone", NULL, NULL, NULL, "1991", + "Home Alone (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HomealoneRomInfo, snes_HomealoneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Home Alone 2 - Lost in New York (USA) + +static struct BurnRomInfo snes_Homealone2RomDesc[] = { + { "Home Alone 2 - Lost in New York (U)(1992)(THQ).sfc", 524288, 0xd19165d9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Homealone2) +STD_ROM_FN(snes_Homealone2) + +struct BurnDriver BurnDrvsnes_Homealone2 = { + "snes_homealone2", NULL, NULL, NULL, "1992", + "Home Alone 2 - Lost in New York (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Homealone2RomInfo, snes_Homealone2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Home Improvement - Power Tool Pursuit! (USA) + +static struct BurnRomInfo snes_HomeimprovRomDesc[] = { + { "Home Improvement - Power Tool Pursuit! (U)(1994)(Absolute Entertainment).sfc", 1572864, 0xfa698c31, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Homeimprov) +STD_ROM_FN(snes_Homeimprov) + +struct BurnDriver BurnDrvsnes_Homeimprov = { + "snes_homeimprov", NULL, NULL, NULL, "1994", + "Home Improvement - Power Tool Pursuit! (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HomeimprovRomInfo, snes_HomeimprovRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hook (USA) + +static struct BurnRomInfo snes_HookRomDesc[] = { + { "Hook (U)(1992)(Sony Imagesoft).sfc", 1048576, 0x0c572ef0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hook) +STD_ROM_FN(snes_Hook) + +struct BurnDriver BurnDrvsnes_Hook = { + "snes_hook", NULL, NULL, NULL, "1992", + "Hook (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HookRomInfo, snes_HookRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hook (Japan) + +static struct BurnRomInfo snes_HookjRomDesc[] = { + { "Hook (J)(1992)(Epic-Sony Records).sfc", 1048576, 0x6f91883e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hookj) +STD_ROM_FN(snes_Hookj) + +struct BurnDriver BurnDrvsnes_Hookj = { + "snes_hookj", "snes_hook", NULL, NULL, "1992", + "Hook (Japan)\0", NULL, "Epic/Sony Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HookjRomInfo, snes_HookjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hat Trick Hero (Japan) + +static struct BurnRomInfo snes_HtheroRomDesc[] = { + { "Hat Trick Hero (J)(1992)(Taito Corp.).sfc", 524288, 0xfce8a74d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hthero) +STD_ROM_FN(snes_Hthero) + +struct BurnDriver BurnDrvsnes_Hthero = { + "snes_hthero", "snes_supsochamp", NULL, NULL, "1992", + "Hat Trick Hero (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_HtheroRomInfo, snes_HtheroRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hat Trick Hero 2 (Japan) + +static struct BurnRomInfo snes_Hthero2RomDesc[] = { + { "Hat Trick Hero 2 (J)(1994)(Taito Corp.).sfc", 1048576, 0x19e67dff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hthero2) +STD_ROM_FN(snes_Hthero2) + +struct BurnDriver BurnDrvsnes_Hthero2 = { + "snes_hthero2", NULL, NULL, NULL, "1994", + "Hat Trick Hero 2 (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Hthero2RomInfo, snes_Hthero2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Incredible Hulk, The (USA) + +static struct BurnRomInfo snes_HulkRomDesc[] = { + { "Incredible Hulk, The (U)(1994)(U.S. Gold - Probe).sfc", 2097152, 0x36b5a429, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hulk) +STD_ROM_FN(snes_Hulk) + +struct BurnDriver BurnDrvsnes_Hulk = { + "snes_hulk", NULL, NULL, NULL, "1994", + "Incredible Hulk, The (USA)\0", NULL, "U.S. Gold - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_HulkRomInfo, snes_HulkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Human Grand Prix (Japan) + +static struct BurnRomInfo snes_HumangpRomDesc[] = { + { "Human Grand Prix (J)(1992)(Human Entertainment).sfc", 1048576, 0x823019ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Humangp) +STD_ROM_FN(snes_Humangp) + +struct BurnDriver BurnDrvsnes_Humangp = { + "snes_humangp", "snes_f1polepos", NULL, NULL, "1992", + "Human Grand Prix (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_HumangpRomInfo, snes_HumangpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Humans, The (Euro) + +static struct BurnRomInfo snes_HumansRomDesc[] = { + { "Humans, The (E)(1992)(GameTek).sfc", 1048576, 0xd2af01d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Humans) +STD_ROM_FN(snes_Humans) + +struct BurnDriver BurnDrvsnes_Humans = { + "snes_humans", NULL, NULL, NULL, "1992", + "Humans, The (Euro)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_HumansRomInfo, snes_HumansRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hungry Dinosaurs (Euro) + +static struct BurnRomInfo snes_HungrydinosRomDesc[] = { + { "Hungry Dinosaurs (E)(1995)(Sunsoft).sfc", 262144, 0x5c4b2544, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hungrydinos) +STD_ROM_FN(snes_Hungrydinos) + +struct BurnDriver BurnDrvsnes_Hungrydinos = { + "snes_hungrydinos", NULL, NULL, NULL, "1995", + "Hungry Dinosaurs (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_HungrydinosRomInfo, snes_HungrydinosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hunt for Red October, The (USA) + +static struct BurnRomInfo snes_HuntredoctRomDesc[] = { + { "Hunt for Red October, The (U)(1993)(Hi Tech Expressions).sfc", 524288, 0xc796e830, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Huntredoct) +STD_ROM_FN(snes_Huntredoct) + +struct BurnDriver BurnDrvsnes_Huntredoct = { + "snes_huntredoct", NULL, NULL, NULL, "1993", + "Hunt for Red October, The (USA)\0", NULL, "Hi Tech Expressions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT | GBF_SHOOT, 0, + SNESGetZipName, snes_HuntredoctRomInfo, snes_HuntredoctRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hurricanes (USA) + +static struct BurnRomInfo snes_HurricanesRomDesc[] = { + { "Hurricanes (U)(1994)(U.S. Gold).sfc", 1048576, 0x42ff4f08, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hurricanes) +STD_ROM_FN(snes_Hurricanes) + +struct BurnDriver BurnDrvsnes_Hurricanes = { + "snes_hurricanes", NULL, NULL, NULL, "1994", + "Hurricanes (USA)\0", NULL, "U.S. Gold", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_HurricanesRomInfo, snes_HurricanesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hyper Iria (Japan) + +static struct BurnRomInfo snes_HypeririajRomDesc[] = { + { "Hyper Iria (J)(1995)(Banpresto).sfc", 1572864, 0xae7f2b0d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hypeririaj) +STD_ROM_FN(snes_Hypeririaj) + +struct BurnDriver BurnDrvsnes_Hypeririaj = { + "snes_hypeririaj", "snes_hypeririate", NULL, NULL, "1995", + "Hyper Iria (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_HypeririajRomInfo, snes_HypeririajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hyper Iria (Hack, English v1.03) +// https://dynamic-designs.us/hyper.shtml +static struct BurnRomInfo snes_HypeririateRomDesc[] = { + { "Hyper Iria T-Eng v1.03 (2022)(Dynamic-Designs).sfc", 2097152, 0x19dc0f72, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hypeririate) +STD_ROM_FN(snes_Hypeririate) + +struct BurnDriver BurnDrvsnes_Hypeririate = { + "snes_hypeririate", NULL, NULL, NULL, "2022", + "Hyper Iria (Hack, English v1.03)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_HypeririateRomInfo, snes_HypeririateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// HyperZone (USA) + +static struct BurnRomInfo snes_HyperzoneRomDesc[] = { + { "HyperZone (U)(1991)(HAL Laboratory).sfc", 524288, 0xc95b4129, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hyperzone) +STD_ROM_FN(snes_Hyperzone) + +struct BurnDriver BurnDrvsnes_Hyperzone = { + "snes_hyperzone", NULL, NULL, NULL, "1991", + "HyperZone (USA)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_HyperzoneRomInfo, snes_HyperzoneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Incredible Crash Dummies, The (USA) + +static struct BurnRomInfo snes_IcdummiesRomDesc[] = { + { "Incredible Crash Dummies, The (U)(1993)(Ljn).sfc", 1048576, 0x0b6209ba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Icdummies) +STD_ROM_FN(snes_Icdummies) + +struct BurnDriver BurnDrvsnes_Icdummies = { + "snes_icdummies", NULL, NULL, NULL, "1993", + "Incredible Crash Dummies, The (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_IcdummiesRomInfo, snes_IcdummiesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ignition Factor, The (USA) + +static struct BurnRomInfo snes_IgnfactorRomDesc[] = { + { "Ignition Factor, The (U)(1994)(Jaleco).sfc", 1048576, 0xee441564, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ignfactor) +STD_ROM_FN(snes_Ignfactor) + +struct BurnDriver BurnDrvsnes_Ignfactor = { + "snes_ignfactor", NULL, NULL, NULL, "1994", + "Ignition Factor, The (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_IgnfactorRomInfo, snes_IgnfactorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ihatovo Monogatari (Japan) + +static struct BurnRomInfo snes_IhatovojRomDesc[] = { + { "Ihatovo Monogatari (J)(1993)(Hect).sfc", 1048576, 0xc588cd17, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ihatovoj) +STD_ROM_FN(snes_Ihatovoj) + +struct BurnDriver BurnDrvsnes_Ihatovoj = { + "snes_ihatovoj", "snes_ihatovote", NULL, NULL, "1993", + "Ihatovo Monogatari (Japan)\0", NULL, "Hect", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_IhatovojRomInfo, snes_IhatovojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Historias de Ihatovo, Las (Hack, Spanish v1.3) +// https://traduccionessemco.blogspot.com/2019/02/traduccion-de-ihatovo-monogatari-de.html +static struct BurnRomInfo snes_IhatovotsRomDesc[] = { + { "Historias de Ihatovo, Las T-Spa v1.3 (2019)(semco).sfc", 2097152, 0x362deef9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ihatovots) +STD_ROM_FN(snes_Ihatovots) + +struct BurnDriver BurnDrvsnes_Ihatovots = { + "snes_ihatovots", "snes_ihatovote", NULL, NULL, "2019", + "Historias de Ihatovo, Las (Hack, Spanish v1.3)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_IhatovotsRomInfo, snes_IhatovotsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stories of Ihatovo, The (Hack, English v2.0) +// https://www.romhacking.net/translations/4116/ +static struct BurnRomInfo snes_IhatovoteRomDesc[] = { + { "Stories of Ihatovo, The T-Eng v2.0 (2018)(DDSTranslation, FlashPV, Tom).sfc", 2097152, 0xc344c232, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ihatovote) +STD_ROM_FN(snes_Ihatovote) + +struct BurnDriver BurnDrvsnes_Ihatovote = { + "snes_ihatovote", NULL, NULL, NULL, "2018", + "Stories of Ihatovo, The (Hack, English v2.0)\0", NULL, "DDSTranslation, FlashPV, Tom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_IhatovoteRomInfo, snes_IhatovoteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Illusion of Gaia (USA) + +static struct BurnRomInfo snes_IllusionofgaiaRomDesc[] = { + { "Illusion of Gaia (U)(1994)(Enix).sfc", 2097152, 0x1c3848c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Illusionofgaia) +STD_ROM_FN(snes_Illusionofgaia) + +struct BurnDriver BurnDrvsnes_Illusionofgaia = { + "snes_illusionofgaia", NULL, NULL, NULL, "1994", + "Illusion of Gaia (USA)\0", NULL, "Quintet/Enix - Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_IllusionofgaiaRomInfo, snes_IllusionofgaiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Illusion of Time (Euro, English) + +static struct BurnRomInfo snes_IllusionoftimeRomDesc[] = { + { "Illusion of Time (E)(1994)(Quintet-Enix, Nintendo).sfc", 2097152, 0xf9ae28db, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Illusionoftime) +STD_ROM_FN(snes_Illusionoftime) + +struct BurnDriver BurnDrvsnes_Illusionoftime = { + "snes_illusionoftime", "snes_illusionofgaia", NULL, NULL, "1994", + "Illusion of Time (Euro, English)\0", NULL, "Quintet/Enix - Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_IllusionoftimeRomInfo, snes_IllusionoftimeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Illusion of Time (Euro, French) + +static struct BurnRomInfo snes_IllusionoftimefRomDesc[] = { + { "Illusion of Time (E, France)(1994)(Quintet-Enix, Nintendo).sfc", 2097152, 0x63f6f934, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Illusionoftimef) +STD_ROM_FN(snes_Illusionoftimef) + +struct BurnDriver BurnDrvsnes_Illusionoftimef = { + "snes_illusionoftimef", "snes_illusionofgaia", NULL, NULL, "1994", + "Illusion of Time (Euro, French)\0", NULL, "Quintet/Enix - Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_IllusionoftimefRomInfo, snes_IllusionoftimefRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Illusion of Time (Euro, German) + +static struct BurnRomInfo snes_IllusionoftimegRomDesc[] = { + { "Illusion of Time (E, Germany)(1994)(Quintet-Enix, Nintendo).sfc", 2097152, 0x4bd8e60b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Illusionoftimeg) +STD_ROM_FN(snes_Illusionoftimeg) + +struct BurnDriver BurnDrvsnes_Illusionoftimeg = { + "snes_illusionoftimeg", "snes_illusionofgaia", NULL, NULL, "1994", + "Illusion of Time (Euro, German)\0", NULL, "Quintet/Enix - Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_IllusionoftimegRomInfo, snes_IllusionoftimegRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Illusion of Time (Euro, Spanish) + +static struct BurnRomInfo snes_IllusionoftimesRomDesc[] = { + { "Illusion of Time (E, Spain)(1994)(Quintet-Enix, Nintendo).sfc", 2097152, 0x7c305dc8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Illusionoftimes) +STD_ROM_FN(snes_Illusionoftimes) + +struct BurnDriver BurnDrvsnes_Illusionoftimes = { + "snes_illusionoftimes", "snes_illusionofgaia", NULL, NULL, "1994", + "Illusion of Time (Euro, Spanish)\0", NULL, "Quintet/Enix - Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_IllusionoftimesRomInfo, snes_IllusionoftimesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Imperium (USA) + +static struct BurnRomInfo snes_ImperiumRomDesc[] = { + { "Imperium (U)(1992)(Vic Tokai).sfc", 1048576, 0x2624f8bd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Imperium) +STD_ROM_FN(snes_Imperium) + +struct BurnDriver BurnDrvsnes_Imperium = { + "snes_imperium", NULL, NULL, NULL, "1992", + "Imperium (USA)\0", NULL, "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_ImperiumRomInfo, snes_ImperiumRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Incantation (USA) + +static struct BurnRomInfo snes_IncantationRomDesc[] = { + { "Incantation (U)(1996)(Titus).sfc", 524288, 0xd0ff7e9f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Incantation) +STD_ROM_FN(snes_Incantation) + +struct BurnDriver BurnDrvsnes_Incantation = { + "snes_incantation", NULL, NULL, NULL, "1996", + "Incantation (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_IncantationRomInfo, snes_IncantationRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Indiana Jones' Greatest Adventures (USA) + +static struct BurnRomInfo snes_IndianajonesRomDesc[] = { + { "Indiana Jones' Greatest Adventures (U)(1994)(JVC - LucasArts).sfc", 2097152, 0x70da6bb8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Indianajones) +STD_ROM_FN(snes_Indianajones) + +struct BurnDriver BurnDrvsnes_Indianajones = { + "snes_indianajones", NULL, NULL, NULL, "1994", + "Indiana Jones' Greatest Adventures (USA)\0", NULL, "JVC Musical Industries - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_IndianajonesRomInfo, snes_IndianajonesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Inindo - Way of the Ninja (USA) + +static struct BurnRomInfo snes_InindoRomDesc[] = { + { "Inindo - Way of the Ninja (U)(1993)(Koei).sfc", 1048576, 0x543f3327, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Inindo) +STD_ROM_FN(snes_Inindo) + +struct BurnDriver BurnDrvsnes_Inindo = { + "snes_inindo", NULL, NULL, NULL, "1993", + "Inindo - Way of the Ninja (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_InindoRomInfo, snes_InindoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Inindou - Datou Nobunaga (Japan) + +static struct BurnRomInfo snes_InindojRomDesc[] = { + { "Super Inindou - Datou Nobunaga (J)(1992)(Koei).sfc", 1310720, 0x7bc8cd39, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Inindoj) +STD_ROM_FN(snes_Inindoj) + +struct BurnDriver BurnDrvsnes_Inindoj = { + "snes_inindoj", "snes_inindo", NULL, NULL, "1992", + "Super Inindou - Datou Nobunaga (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_InindojRomInfo, snes_InindojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Inspector Gadget (USA) + +static struct BurnRomInfo snes_InspgadgetRomDesc[] = { + { "Inspector Gadget (U)(1993)(Hudson Soft).sfc", 1048576, 0x4ce2b818, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Inspgadget) +STD_ROM_FN(snes_Inspgadget) + +struct BurnDriver BurnDrvsnes_Inspgadget = { + "snes_inspgadget", NULL, NULL, NULL, "1993", + "Inspector Gadget (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_InspgadgetRomInfo, snes_InspgadgetRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// International Tennis Tour (USA) + +static struct BurnRomInfo snes_InttennistourRomDesc[] = { + { "International Tennis Tour (U)(1993)(Taito - Loriciel).sfc", 1048576, 0xad3cd5e6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Inttennistour) +STD_ROM_FN(snes_Inttennistour) + +struct BurnDriver BurnDrvsnes_Inttennistour = { + "snes_inttennistour", NULL, NULL, NULL, "1993", + "International Tennis Tour (USA)\0", NULL, "Taito - Loriciel", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_InttennistourRomInfo, snes_InttennistourRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Iron Commando: Koutetsu no Senshi (Japan) + +static struct BurnRomInfo snes_IroncdojRomDesc[] = { + { "Iron Commando - Koutetsu no Senshi (J)(1994)(Poppo).sfc", 1310720, 0x828b5f07, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ironcdoj) +STD_ROM_FN(snes_Ironcdoj) + +struct BurnDriver BurnDrvsnes_Ironcdoj = { + "snes_ironcdoj", "snes_ironcdope", NULL, NULL, "1994", + "Iron Commando: Koutetsu no Senshi (Japan)\0", NULL, "Poppo - Arcade Zone", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_IroncdojRomInfo, snes_IroncdojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Iron Commando (Euro, Prototype) + +static struct BurnRomInfo snes_IroncdopeRomDesc[] = { + { "Iron Commando (E, Proto)(1994)(Arcade Zone).sfc", 1310720, 0xd967299d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ironcdope) +STD_ROM_FN(snes_Ironcdope) + +struct BurnDriver BurnDrvsnes_Ironcdope = { + "snes_ironcdope", NULL, NULL, NULL, "1994", + "Iron Commando (Euro, Prototype)\0", NULL, "Arcade Zone", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_IroncdopeRomInfo, snes_IroncdopeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// International Superstar Soccer (USA) + +static struct BurnRomInfo snes_IssRomDesc[] = { + { "International Superstar Soccer (U)(1995)(Konami).sfc", 1048576, 0x49627238, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Iss) +STD_ROM_FN(snes_Iss) + +struct BurnDriver BurnDrvsnes_Iss = { + "snes_iss", NULL, NULL, NULL, "1995", + "International Superstar Soccer (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_IssRomInfo, snes_IssRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// International Superstar Soccer Deluxe (USA) + +static struct BurnRomInfo snes_IssdxRomDesc[] = { + { "International Superstar Soccer Deluxe (U)(1995)(Konami).sfc", 2097152, 0x0a20e602, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Issdx) +STD_ROM_FN(snes_Issdx) + +struct BurnDriver BurnDrvsnes_Issdx = { + "snes_issdx", NULL, NULL, NULL, "1995", + "International Superstar Soccer Deluxe (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_IssdxRomInfo, snes_IssdxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Itchy & Scratchy Game, The (USA) + +static struct BurnRomInfo snes_ItchyscratchyRomDesc[] = { + { "Itchy & Scratchy Game, The (U)(1994)(Acclaim Entertainment).sfc", 1048576, 0x95b65dfe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Itchyscratchy) +STD_ROM_FN(snes_Itchyscratchy) + +struct BurnDriver BurnDrvsnes_Itchyscratchy = { + "snes_itchyscratchy", NULL, NULL, NULL, "1994", + "Itchy & Scratchy Game, The (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ItchyscratchyRomInfo, snes_ItchyscratchyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Izzy's Quest for the Olympic Rings (USA) + +static struct BurnRomInfo snes_IzzyquestRomDesc[] = { + { "Izzy's Quest for the Olympic Rings (U)(1995)(U.S. Gold).sfc", 2097152, 0xe9bb68c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Izzyquest) +STD_ROM_FN(snes_Izzyquest) + +struct BurnDriver BurnDrvsnes_Izzyquest = { + "snes_izzyquest", NULL, NULL, NULL, "1995", + "Izzy's Quest for the Olympic Rings (USA)\0", NULL, "U.S. Gold", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_IzzyquestRomInfo, snes_IzzyquestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Naxat Super Pinball - Jaki Crush (Japan) + +static struct BurnRomInfo snes_JakicrushRomDesc[] = { + { "Naxat Super Pinball - Jaki Crush (J)(1992)(Naxat Soft).sfc", 1048576, 0xf696d5a9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jakicrush) +STD_ROM_FN(snes_Jakicrush) + +struct BurnDriver BurnDrvsnes_Jakicrush = { + "snes_jakicrush", NULL, NULL, NULL, "1992", + "Naxat Super Pinball - Jaki Crush (Japan)\0", NULL, "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PINBALL, 0, + SNESGetZipName, snes_JakicrushRomInfo, snes_JakicrushRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// James Bond Jr. (USA) + +static struct BurnRomInfo snes_JbondjrRomDesc[] = { + { "James Bond Jr. (U)(1992)(THQ).sfc", 524288, 0x69c2f850, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jbondjr) +STD_ROM_FN(snes_Jbondjr) + +struct BurnDriver BurnDrvsnes_Jbondjr = { + "snes_jbondjr", NULL, NULL, NULL, "1992", + "James Bond Jr. (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_HORSHOOT, 0, + SNESGetZipName, snes_JbondjrRomInfo, snes_JbondjrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Jelly Boy (Euro) + +static struct BurnRomInfo snes_JellyboyRomDesc[] = { + { "Jelly Boy (E)(1995)(Ocean).sfc", 1048576, 0xf8c72a24, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jellyboy) +STD_ROM_FN(snes_Jellyboy) + +struct BurnDriver BurnDrvsnes_Jellyboy = { + "snes_jellyboy", NULL, NULL, NULL, "1995", + "Jelly Boy (Euro)\0", NULL, "Ocean - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JellyboyRomInfo, snes_JellyboyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jeopardy! (USA) + +static struct BurnRomInfo snes_JeopardyRomDesc[] = { + { "Jeopardy! (U)(1992)(GameTek).sfc", 524288, 0x65bf3a7e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jeopardy) +STD_ROM_FN(snes_Jeopardy) + +struct BurnDriver BurnDrvsnes_Jeopardy = { + "snes_jeopardy", NULL, NULL, NULL, "1992", + "Jeopardy! (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 3, HARDWARE_SNES, GBF_QUIZ, 0, + SNESGetZipName, snes_JeopardyRomInfo, snes_JeopardyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jeopardy! - Deluxe Edition (USA) + +static struct BurnRomInfo snes_JeopardydeRomDesc[] = { + { "Jeopardy! - Deluxe Edition (U)(1993)(GameTek).sfc", 524288, 0x6301060c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jeopardyde) +STD_ROM_FN(snes_Jeopardyde) + +struct BurnDriver BurnDrvsnes_Jeopardyde = { + "snes_jeopardyde", NULL, NULL, NULL, "1993", + "Jeopardy! - Deluxe Edition (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 3, HARDWARE_SNES, GBF_QUIZ, 0, + SNESGetZipName, snes_JeopardydeRomInfo, snes_JeopardydeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jeopardy! - Sports Edition (USA) + +static struct BurnRomInfo snes_JeopardyseRomDesc[] = { + { "Jeopardy! - Sports Edition (U)(1993)(GameTek).sfc", 524288, 0xbda7de29, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jeopardyse) +STD_ROM_FN(snes_Jeopardyse) + +struct BurnDriver BurnDrvsnes_Jeopardyse = { + "snes_jeopardyse", NULL, NULL, NULL, "1993", + "Jeopardy! - Sports Edition (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 3, HARDWARE_SNES, GBF_QUIZ, 0, + SNESGetZipName, snes_JeopardyseRomInfo, snes_JeopardyseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jerry Boy (Japan) + +static struct BurnRomInfo snes_JerryboyRomDesc[] = { + { "Jerry Boy (J)(1991)(Epic-Sony Records).sfc", 1048576, 0x4ef452f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jerryboy) +STD_ROM_FN(snes_Jerryboy) + +struct BurnDriver BurnDrvsnes_Jerryboy = { + "snes_jerryboy", "snes_smartball", NULL, NULL, "1991", + "Jerry Boy (Japan)\0", NULL, "Epic/Sonic Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JerryboyRomInfo, snes_JerryboyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jetsons, The - Invasion of the Planet Pirates (USA) + +static struct BurnRomInfo snes_JetsonsRomDesc[] = { + { "Jetsons, The - Invasion of the Planet Pirates (U)(1994)(Taito).sfc", 1048576, 0x3e3073ce, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jetsons) +STD_ROM_FN(snes_Jetsons) + +struct BurnDriver BurnDrvsnes_Jetsons = { + "snes_jetsons", NULL, NULL, NULL, "1994", + "Jetsons, The - Invasion of the Planet Pirates (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JetsonsRomInfo, snes_JetsonsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jigsaw Party (Japan) + +static struct BurnRomInfo snes_JigsawRomDesc[] = { + { "Jigsaw Party (J)(1994)(Hori).sfc", 1048576, 0x78f229dc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jigsaw) +STD_ROM_FN(snes_Jigsaw) + +struct BurnDriver BurnDrvsnes_Jigsaw = { + "snes_jigsaw", "snes_pieces", NULL, NULL, "1994", + "Jigsaw Party (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Hori", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_JigsawRomInfo, snes_JigsawRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jikkyou Oshaberi Parodius (Japan) + +static struct BurnRomInfo snes_JikkyouparodiusRomDesc[] = { + { "Jikkyou Oshaberi Parodius (J)(1995)(Konami).sfc", 3145728, 0x177937ab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jikkyouparodius) +STD_ROM_FN(snes_Jikkyouparodius) + +struct BurnDriver BurnDrvsnes_Jikkyouparodius = { + "snes_jikkyouparodius", "snes_jikkyouparodiuste", NULL, NULL, "1995", + "Jikkyou Oshaberi Parodius (Japan)\0", "SA-1 enhancement CPU", "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_JikkyouparodiusRomInfo, snes_JikkyouparodiusRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chatting Parodius Live! (Hack, English) +// https://www.romhacking.net/translations/6858/ +static struct BurnRomInfo snes_JikkyouparodiusteRomDesc[] = { + { "Chatting Parodius Live! T-Eng (2023)(advancedpillow).sfc", 3145728, 0x4e1d8586, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jikkyouparodiuste) +STD_ROM_FN(snes_Jikkyouparodiuste) + +struct BurnDriver BurnDrvsnes_Jikkyouparodiuste = { + "snes_jikkyouparodiuste", NULL, NULL, NULL, "2023", + "Chatting Parodius Live! (Hack, English)\0", "SA-1 enhancement CPU", "advancedpillow", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_JikkyouparodiusteRomInfo, snes_JikkyouparodiusteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jim Power - The Lost Dimension in 3D (USA) + +static struct BurnRomInfo snes_JimpowerRomDesc[] = { + { "Jim Power - The Lost Dimension in 3D (U)(1993)(Electro Brain).sfc", 1048576, 0xc469f8f0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jimpower) +STD_ROM_FN(snes_Jimpower) + +struct BurnDriver BurnDrvsnes_Jimpower = { + "snes_jimpower", NULL, NULL, NULL, "1993", + "Jim Power - The Lost Dimension in 3D (USA)\0", NULL, "Electro Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT | GBF_PLATFORM, 0, + SNESGetZipName, snes_JimpowerRomInfo, snes_JimpowerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// J. League '96 Dream Stadium (Japan) + +static struct BurnRomInfo snes_Jleague96RomDesc[] = { + { "J. League '96 Dream Stadium (J)(1996)(Hudson Soft).sfc", 2621440, 0x93a0a25c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jleague96) +STD_ROM_FN(snes_Jleague96) + +struct BurnDriver BurnDrvsnes_Jleague96 = { + "snes_jleague96", NULL, NULL, NULL, "1996", + "J. League '96 Dream Stadium (Japan)\0", "SA-1 enhancement CPU", "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Jleague96RomInfo, snes_Jleague96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// J.League Excite Stage '94 (Japan) + +static struct BurnRomInfo snes_Jleaguees94RomDesc[] = { + { "J.League Excite Stage '94 (J)(1994)(Epoch).sfc", 1572864, 0xc9e33615, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jleaguees94) +STD_ROM_FN(snes_Jleaguees94) + +struct BurnDriver BurnDrvsnes_Jleaguees94 = { + "snes_jleaguees94", "snes_capsocshoot", NULL, NULL, "1994", + "J.League Excite Stage '94 (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Jleaguees94RomInfo, snes_Jleaguees94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// J.League Soccer - Prime Goal 3 (Japan) + +static struct BurnRomInfo snes_Jleaguepg3RomDesc[] = { + { "J.League Soccer - Prime Goal 3 (J)(1995)(Namco).sfc", 2097152, 0x1499b746, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jleaguepg3) +STD_ROM_FN(snes_Jleaguepg3) + +struct BurnDriver BurnDrvsnes_Jleaguepg3 = { + "snes_jleaguepg3", "snes_90minepg", NULL, NULL, "1995", + "J.League Soccer - Prime Goal 3 (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Jleaguepg3RomInfo, snes_Jleaguepg3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// J.League Super Soccer (Japan) + +static struct BurnRomInfo snes_JleaguessRomDesc[] = { + { "J.League Super Soccer (J)(1994)(Hudson Soft).sfc", 1572864, 0x1d20cac2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jleaguess) +STD_ROM_FN(snes_Jleaguess) + +struct BurnDriver BurnDrvsnes_Jleaguess = { + "snes_jleaguess", "snes_virtsoccerp", NULL, NULL, "1994", + "J.League Super Soccer (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_JleaguessRomInfo, snes_JleaguessRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Joe & Mac (USA) + +static struct BurnRomInfo snes_JoemacRomDesc[] = { + { "Joe & Mac (U)(1991)(Data East).sfc", 1048576, 0x3a2b6167, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemac) +STD_ROM_FN(snes_Joemac) + +struct BurnDriver BurnDrvsnes_Joemac = { + "snes_joemac", NULL, NULL, NULL, "1991", + "Joe & Mac (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JoemacRomInfo, snes_JoemacRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Joe & Mac 2 - Lost in the Tropics (USA) + +static struct BurnRomInfo snes_Joemac2RomDesc[] = { + { "Joe & Mac 2 - Lost in the Tropics (U)(1993)(Data East).sfc", 1048576, 0x0c3b4201, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemac2) +STD_ROM_FN(snes_Joemac2) + +struct BurnDriver BurnDrvsnes_Joemac2 = { + "snes_joemac2", NULL, NULL, NULL, "1994", + "Joe & Mac 2 - Lost in the Tropics (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Joemac2RomInfo, snes_Joemac2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Joe & Mac 3 - Lost in the Tropics (Euro) + +static struct BurnRomInfo snes_Joemac2eRomDesc[] = { + { "Joe & Mac 3 - Lost in the Tropics (E)(1993)(Data East - Elite).sfc", 1048576, 0xb9d6269d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemac2e) +STD_ROM_FN(snes_Joemac2e) + +struct BurnDriver BurnDrvsnes_Joemac2e = { + "snes_joemac2e", "snes_joemac2", NULL, NULL, "1993", + "Joe & Mac 3 - Lost in the Tropics (Euro)\0", NULL, "Data East - Elite", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Joemac2eRomInfo, snes_Joemac2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tatakae Genshijin 3 - Shuyaku wa Yappari Joe & Mac (Japan) + +static struct BurnRomInfo snes_Joemac2jRomDesc[] = { + { "Tatakae Genshijin 3 - Shuyaku wa Yappari Joe & Mac (J)(1993)(Data East).sfc", 1048576, 0xa0a9f044, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemac2j) +STD_ROM_FN(snes_Joemac2j) + +struct BurnDriver BurnDrvsnes_Joemac2j = { + "snes_joemac2j", "snes_joemac2", NULL, NULL, "1993", + "Tatakae Genshijin 3 - Shuyaku wa Yappari Joe & Mac (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Joemac2jRomInfo, snes_Joemac2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Joe & Mac - Caveman Ninja (Euro) + +static struct BurnRomInfo snes_JoemaceRomDesc[] = { + { "Joe & Mac - Caveman Ninja (E)(1991)(Data East - Elite).sfc", 1048576, 0xa423a9d8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemace) +STD_ROM_FN(snes_Joemace) + +struct BurnDriver BurnDrvsnes_Joemace = { + "snes_joemace", "snes_joemac", NULL, NULL, "1991", + "Joe & Mac - Caveman Ninja (Euro)\0", NULL, "Data East - Elite", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JoemaceRomInfo, snes_JoemaceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Joe & Mac - Tatakae Genshijin (Japan) + +static struct BurnRomInfo snes_JoemacjRomDesc[] = { + { "Joe & Mac - Tatakae Genshijin (J)(1991)(Data East).sfc", 1048576, 0xfb9f19ba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Joemacj) +STD_ROM_FN(snes_Joemacj) + +struct BurnDriver BurnDrvsnes_Joemacj = { + "snes_joemacj", "snes_joemac", NULL, NULL, "1991", + "Joe & Mac - Tatakae Genshijin (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JoemacjRomInfo, snes_JoemacjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// JoJo no Kimyou na Bouken (Japan) + +static struct BurnRomInfo snes_JojobajRomDesc[] = { + { "JoJo no Kimyou na Bouken (J)(1993)(Cobra Team).sfc", 1048576, 0x56ba694a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jojobaj) +STD_ROM_FN(snes_Jojobaj) + +struct BurnDriver BurnDrvsnes_Jojobaj = { + "snes_jojobaj", "snes_jojobate", NULL, NULL, "1993", + "JoJo no Kimyou na Bouken (Japan)\0", NULL, "Cobra Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_JojobajRomInfo, snes_JojobajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// JoJo's Bizarre Adventure (Hack, English v1.2) +// https://www.romhacking.net/translations/7212/ +static struct BurnRomInfo snes_JojobateRomDesc[] = { + { "JoJo's Bizarre Adventure T-Eng v1.2 (2024)(Aeon Genesis, brkmnly).sfc", 1572864, 0x69c6216e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jojobate) +STD_ROM_FN(snes_Jojobate) + +struct BurnDriver BurnDrvsnes_Jojobate = { + "snes_jojobate", NULL, NULL, NULL, "2024", + "JoJo's Bizarre Adventure (Hack, English v1.2)\0", NULL, "Aeon Genesis, brkmnly", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_JojobateRomInfo, snes_JojobateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// JoJo's Bizarre Adventure (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/5849/ +static struct BurnRomInfo snes_JojobatsRomDesc[] = { + { "JoJo's Bizarre Adventure T-Spa v1.1 (2024)(Max1323).sfc", 1572864, 0x9e278863, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jojobats) +STD_ROM_FN(snes_Jojobats) + +struct BurnDriver BurnDrvsnes_Jojobats = { + "snes_jojobats", "snes_jojobate", NULL, NULL, "2024", + "JoJo's Bizarre Adventure (Hack, Spanish v1.1)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_JojobatsRomInfo, snes_JojobatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (USA) + +static struct BurnRomInfo snes_JparkRomDesc[] = { + { "Jurassic Park (U)(1993)(Ocean).sfc", 2097152, 0x8bfde0b7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jpark) +STD_ROM_FN(snes_Jpark) + +struct BurnDriver BurnDrvsnes_Jpark = { + "snes_jpark", NULL, NULL, NULL, "1993", + "Jurassic Park (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkRomInfo, snes_JparkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park Part 2 - The Chaos Continues (USA) + +static struct BurnRomInfo snes_Jpark2RomDesc[] = { + { "Jurassic Park Part 2 - The Chaos Continues (U)(1994)(Ocean).sfc", 2097152, 0x836ee990, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jpark2) +STD_ROM_FN(snes_Jpark2) + +struct BurnDriver BurnDrvsnes_Jpark2 = { + "snes_jpark2", NULL, NULL, NULL, "1994", + "Jurassic Park Part 2 - The Chaos Continues (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Jpark2RomInfo, snes_Jpark2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Euro, English) + +static struct BurnRomInfo snes_JparkeRomDesc[] = { + { "Jurassic Park (E)(1993)(Ocean).sfc", 2097152, 0x7ccb8762, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparke) +STD_ROM_FN(snes_Jparke) + +struct BurnDriver BurnDrvsnes_Jparke = { + "snes_jparke", "snes_jpark", NULL, NULL, "1993", + "Jurassic Park (Euro, English)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkeRomInfo, snes_JparkeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Euro, French) + +static struct BurnRomInfo snes_JparkfRomDesc[] = { + { "Jurassic Park (E, France)(1993)(Ocean).sfc", 2097152, 0x61011074, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparkf) +STD_ROM_FN(snes_Jparkf) + +struct BurnDriver BurnDrvsnes_Jparkf = { + "snes_jparkf", "snes_jpark", NULL, NULL, "1993", + "Jurassic Park (Euro, French)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkfRomInfo, snes_JparkfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Euro, German) + +static struct BurnRomInfo snes_JparkgRomDesc[] = { + { "Jurassic Park (E, Germany)(1993)(Ocean).sfc", 2097152, 0x8c3f510d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparkg) +STD_ROM_FN(snes_Jparkg) + +struct BurnDriver BurnDrvsnes_Jparkg = { + "snes_jparkg", "snes_jpark", NULL, NULL, "1993", + "Jurassic Park (Euro, German)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkgRomInfo, snes_JparkgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Euro, Italian) + +static struct BurnRomInfo snes_JparkiRomDesc[] = { + { "Jurassic Park (E, Italy)(1993)(Ocean).sfc", 2097152, 0x3ee3e840, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparki) +STD_ROM_FN(snes_Jparki) + +struct BurnDriver BurnDrvsnes_Jparki = { + "snes_jparki", "snes_jpark", NULL, NULL, "1993", + "Jurassic Park (Euro, Italian)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkiRomInfo, snes_JparkiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Japan) + +static struct BurnRomInfo snes_JparkjRomDesc[] = { + { "Jurassic Park (J)(1994)(Jaleco).sfc", 2097152, 0x559c7cf5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparkj) +STD_ROM_FN(snes_Jparkj) + +struct BurnDriver BurnDrvsnes_Jparkj = { + "snes_jparkj", "snes_jpark", NULL, NULL, "1994", + "Jurassic Park (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparkjRomInfo, snes_JparkjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jurassic Park (Euro, Spanish) + +static struct BurnRomInfo snes_JparksRomDesc[] = { + { "Jurassic Park (E, Spain)(1993)(Ocean).sfc", 2097152, 0x3dee6fd9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jparks) +STD_ROM_FN(snes_Jparks) + +struct BurnDriver BurnDrvsnes_Jparks = { + "snes_jparks", "snes_jpark", NULL, NULL, "1993", + "Jurassic Park (Euro, Spanish)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_ADV, 0, + SNESGetZipName, snes_JparksRomInfo, snes_JparksRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// James Pond's Crazy Sports (Euro) + +static struct BurnRomInfo snes_JpcrazysportsRomDesc[] = { + { "James Pond's Crazy Sports (E)(1993)(Sales Curve).sfc", 524288, 0x66f00725, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jpcrazysports) +STD_ROM_FN(snes_Jpcrazysports) + +struct BurnDriver BurnDrvsnes_Jpcrazysports = { + "snes_jpcrazysports", "snes_supaquagames", NULL, NULL, "1993", + "James Pond's Crazy Sports (Euro)\0", NULL, "Sales Curve", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_JpcrazysportsRomInfo, snes_JpcrazysportsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Judge Dredd (USA) + +static struct BurnRomInfo snes_JudgedreedRomDesc[] = { + { "Judge Dredd (U)(1995)(Acclaim - Probe).sfc", 2097152, 0x0a3f0288, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Judgedreed) +STD_ROM_FN(snes_Judgedreed) + +struct BurnDriver BurnDrvsnes_Judgedreed = { + "snes_judgedreed", NULL, NULL, NULL, "1995", + "Judge Dredd (USA)\0", NULL, "Acclaim Entertainment - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_JudgedreedRomInfo, snes_JudgedreedRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jumbo Ozaki no Hole in One (Japan) + +static struct BurnRomInfo snes_JumboozakiRomDesc[] = { + { "Jumbo Ozaki no Hole in One (J)(1991)(HAL Laboratory).sfc", 1048576, 0x0fd99721, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jumboozaki) +STD_ROM_FN(snes_Jumboozaki) + +struct BurnDriver BurnDrvsnes_Jumboozaki = { + "snes_jumboozaki", "snes_halshole", NULL, NULL, "1991", + "Jumbo Ozaki no Hole in One (Japan)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_JumboozakiRomInfo, snes_JumboozakiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jumpin' Derby (Japan) + +static struct BurnRomInfo snes_JumpinderbyRomDesc[] = { + { "Jumpin' Derby (J)(1996)(Naxat Soft).sfc", 2097152, 0xa473b7e4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jumpinderby) +STD_ROM_FN(snes_Jumpinderby) + +struct BurnDriver BurnDrvsnes_Jumpinderby = { + "snes_jumpinderby", NULL, NULL, NULL, "1996", + "Jumpin' Derby (Japan)\0", "SA-1 enhancement CPU", "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_JumpinderbyRomInfo, snes_JumpinderbyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's The Jungle Book (USA) + +static struct BurnRomInfo snes_JunglebookRomDesc[] = { + { "Disney's The Jungle Book (U)(1994)(Virgin Int. - Disney Int.).sfc", 2097152, 0x3511efb3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Junglebook) +STD_ROM_FN(snes_Junglebook) + +struct BurnDriver BurnDrvsnes_Junglebook = { + "snes_junglebook", NULL, NULL, NULL, "1994", + "Disney's The Jungle Book (USA)\0", NULL, "Virgin Int. - Disney Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_JunglebookRomInfo, snes_JunglebookRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jungle no Ouja Taa-chan: Sekaimanyuu Daikakutou no Maki (Japan) + +static struct BurnRomInfo snes_JunglemakijRomDesc[] = { + { "Jungle no Ouja Taa-chan - Sekaimanyuu Daikakutou no Maki (J)(1994)(Bandai).sfc", 1048576, 0xeec6a20f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Junglemakij) +STD_ROM_FN(snes_Junglemakij) + +struct BurnDriver BurnDrvsnes_Junglemakij = { + "snes_junglemakij", NULL, NULL, NULL, "1994", + "Jungle no Ouja Taa-chan: Sekaimanyuu Daikakutou no Maki (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_JunglemakijRomInfo, snes_JunglemakijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jungle Strike (USA) + +static struct BurnRomInfo snes_JunglestrikeRomDesc[] = { + { "Jungle Strike (U)(1995)(Electronic Arts).sfc", 2097152, 0x335487e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Junglestrike) +STD_ROM_FN(snes_Junglestrike) + +struct BurnDriver BurnDrvsnes_Junglestrike = { + "snes_junglestrike", NULL, NULL, NULL, "1995", + "Jungle Strike (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_JunglestrikeRomInfo, snes_JunglestrikeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jungle Strike - Uketsugareta Kyouki (Japan) + +static struct BurnRomInfo snes_JunglestrikejRomDesc[] = { + { "Jungle Strike - Uketsugareta Kyouki (J)(1995)(Electronic Arts).sfc", 2097152, 0x5bdf5a87, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Junglestrikej) +STD_ROM_FN(snes_Junglestrikej) + +struct BurnDriver BurnDrvsnes_Junglestrikej = { + "snes_junglestrikej", "snes_junglestrike", NULL, NULL, "1995", + "Jungle Strike - Uketsugareta Kyouki (Japan)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_JunglestrikejRomInfo, snes_JunglestrikejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Justice League Task Force (USA) + +static struct BurnRomInfo snes_JusticeleagueRomDesc[] = { + { "Justice League Task Force (U)(1995)(Acclaim Entertainment).sfc", 2621440, 0x31cf46d1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Justiceleague) +STD_ROM_FN(snes_Justiceleague) + +struct BurnDriver BurnDrvsnes_Justiceleague = { + "snes_justiceleague", NULL, NULL, NULL, "1995", + "Justice League Task Force (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_JusticeleagueRomInfo, snes_JusticeleagueRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kablooey (USA) + +static struct BurnRomInfo snes_KablooeyRomDesc[] = { + { "Kablooey (U)(1992)(Kemco).sfc", 524288, 0xb2592eae, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kablooey) +STD_ROM_FN(snes_Kablooey) + +struct BurnDriver BurnDrvsnes_Kablooey = { + "snes_kablooey", NULL, NULL, NULL, "1992", + "Kablooey (USA)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_KablooeyRomInfo, snes_KablooeyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kamen Rider (Japan) + +static struct BurnRomInfo snes_KamenriderRomDesc[] = { + { "Kamen Rider (J)(1993)(Bandai).sfc", 1572864, 0x3f5aeb53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kamenrider) +STD_ROM_FN(snes_Kamenrider) + +struct BurnDriver BurnDrvsnes_Kamenrider = { + "snes_kamenrider", NULL, NULL, NULL, "1993", + "Kamen Rider (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KamenriderRomInfo, snes_KamenriderRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kamen Rider SD - Shutsugeki!! Rider Machine (Japan) + +static struct BurnRomInfo snes_KamenridersdRomDesc[] = { + { "Kamen Rider SD - Shutsugeki!! Rider Machine (J)(1993)(Yutaka).sfc", 1048576, 0xa2c7cb5f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kamenridersd) +STD_ROM_FN(snes_Kamenridersd) + +struct BurnDriver BurnDrvsnes_Kamenridersd = { + "snes_kamenridersd", NULL, NULL, NULL, "1993", + "Kamen Rider SD - Shutsugeki!! Rider Machine (Japan)\0", NULL, "Yutaka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_KamenridersdRomInfo, snes_KamenridersdRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Karura Ou (Japan) + +static struct BurnRomInfo snes_KaruraouRomDesc[] = { + { "Karura Ou (J)(1994)(Epic-Sony Records).sfc", 1048576, 0x5cf9a482, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Karuraou) +STD_ROM_FN(snes_Karuraou) + +struct BurnDriver BurnDrvsnes_Karuraou = { + "snes_karuraou", "snes_skyblazer", NULL, NULL, "1994", + "Karura Ou (Japan)\0", NULL, "Epic/Sony Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_KaruraouRomInfo, snes_KaruraouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kawasaki Superbike Challenge (USA) + +static struct BurnRomInfo snes_KawasakiRomDesc[] = { + { "Kawasaki Superbike Challenge (U)(1995)(Time Warner Int. - Domark).sfc", 1048576, 0xe8ed176e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kawasaki) +STD_ROM_FN(snes_Kawasaki) + +struct BurnDriver BurnDrvsnes_Kawasaki = { + "snes_kawasaki", NULL, NULL, NULL, "1995", + "Kawasaki Superbike Challenge (USA)\0", NULL, "Time Warner Int. - Domark", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_KawasakiRomInfo, snes_KawasakiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kawasaki Caribbean Challenge (USA) + +static struct BurnRomInfo snes_KawasakiccRomDesc[] = { + { "Kawasaki Caribbean Challenge (U)(1993)(GameTek).sfc", 1572864, 0x37d8ac57, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kawasakicc) +STD_ROM_FN(snes_Kawasakicc) + +struct BurnDriver BurnDrvsnes_Kawasakicc = { + "snes_kawasakicc", NULL, NULL, NULL, "1993", + "Kawasaki Caribbean Challenge (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_KawasakiccRomInfo, snes_KawasakiccRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kishin Douji Zenki - Battle Raiden (Japan) + +static struct BurnRomInfo snes_KdzbrRomDesc[] = { + { "Kishin Douji Zenki - Battle Raiden (J)(1995)(Hudson Soft).sfc", 2097152, 0x0becfc92, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kdzbr) +STD_ROM_FN(snes_Kdzbr) + +struct BurnDriver BurnDrvsnes_Kdzbr = { + "snes_kdzbr", "snes_dczbrte", NULL, NULL, "1995", + "Kishin Douji Zenki - Battle Raiden (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_KdzbrRomInfo, snes_KdzbrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kishin Douji Zenki - Denei Raibu (Japan) + +static struct BurnRomInfo snes_KdzdrRomDesc[] = { + { "Kishin Douji Zenki - Denei Raibu (J)(1995)(Hudson Soft).sfc", 2097152, 0x068cc21b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kdzdr) +STD_ROM_FN(snes_Kdzdr) + +struct BurnDriver BurnDrvsnes_Kdzdr = { + "snes_kdzdr", NULL, NULL, NULL, "1995", + "Kishin Douji Zenki - Denei Raibu (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_PLATFORM, 0, + SNESGetZipName, snes_KdzdrRomInfo, snes_KdzdrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kishin Douji Zenki - Tenchi Meidou (Japan) + +static struct BurnRomInfo snes_KdztmRomDesc[] = { + { "Kishin Douji Zenki - Tenchi Meidou (J)(1996)(Hudson Soft).sfc", 2097152, 0xd910990c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kdztm) +STD_ROM_FN(snes_Kdztm) + +struct BurnDriver BurnDrvsnes_Kdztm = { + "snes_kdztm", NULL, NULL, NULL, "1996", + "Kishin Douji Zenki - Tenchi Meidou (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_BOARD | GBF_ADV, 0, + SNESGetZipName, snes_KdztmRomInfo, snes_KdztmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Keeper (Japan) + +static struct BurnRomInfo snes_KeeperjRomDesc[] = { + { "Keeper (J)(1993)(Datam Polystar).sfc", 524288, 0x8676126b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Keeperj) +STD_ROM_FN(snes_Keeperj) + +struct BurnDriver BurnDrvsnes_Keeperj = { + "snes_keeperj", NULL, NULL, NULL, "1993", + "Keeper (Japan)\0", NULL, "Datam Polystar", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_KeeperjRomInfo, snes_KeeperjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kendo Rage (USA) + +static struct BurnRomInfo snes_KendorageRomDesc[] = { + { "Kendo Rage (U)(1993)(Seta).sfc", 1048576, 0xd1048918, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kendorage) +STD_ROM_FN(snes_Kendorage) + +struct BurnDriver BurnDrvsnes_Kendorage = { + "snes_kendorage", NULL, NULL, NULL, "1993", + "Kendo Rage (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_KendorageRomInfo, snes_KendorageRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ken Griffey Jr.'s Winning Run (USA) + +static struct BurnRomInfo snes_KgwinnrunRomDesc[] = { + { "Ken Griffey Jr.'s Winning Run (U)(1996)(Nintendo - Rare).sfc", 4194304, 0xe9b4bd73, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kgwinnrun) +STD_ROM_FN(snes_Kgwinnrun) + +struct BurnDriver BurnDrvsnes_Kgwinnrun = { + "snes_kgwinnrun", NULL, NULL, NULL, "1996", + "Ken Griffey Jr.'s Winning Run (USA)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_KgwinnrunRomInfo, snes_KgwinnrunRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kentou Ou World Champion (Japan) + +static struct BurnRomInfo snes_KentouwcRomDesc[] = { + { "Kentou Ou World Champion (J)(1992)(Sofel).sfc", 524288, 0xe8359cdb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kentouwc) +STD_ROM_FN(snes_Kentouwc) + +struct BurnDriver BurnDrvsnes_Kentouwc = { + "snes_kentouwc", "snes_tkoscb", NULL, NULL, "1992", + "Kentou Ou World Champion (Japan)\0", NULL, "Sofel", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_KentouwcRomInfo, snes_KentouwcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kick Off (Euro) + +static struct BurnRomInfo snes_KickoffRomDesc[] = { + { "Kick Off (E)(1992)(Imagineer - Anco Software).sfc", 524288, 0xa1306f3b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kickoff) +STD_ROM_FN(snes_Kickoff) + +struct BurnDriver BurnDrvsnes_Kickoff = { + "snes_kickoff", NULL, NULL, NULL, "1992", + "Kick Off (Euro)\0", NULL, "Imagineer - Anco Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_KickoffRomInfo, snes_KickoffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kick Off 3 - European Challenge (Euro) + +static struct BurnRomInfo snes_Kickoff3RomDesc[] = { + { "Kick Off 3 - European Challenge (E)(1994)(Vic Tokai - Anco).sfc", 1048576, 0x1ac7f523, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kickoff3) +STD_ROM_FN(snes_Kickoff3) + +struct BurnDriver BurnDrvsnes_Kickoff3 = { + "snes_kickoff3", NULL, NULL, NULL, "1994", + "Kick Off 3 - European Challenge (Euro)\0", NULL, "Vic Tokai - Anco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Kickoff3RomInfo, snes_Kickoff3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kid Klown in Crazy Chase (USA) + +static struct BurnRomInfo snes_KidklownRomDesc[] = { + { "Kid Klown in Crazy Chase (U)(1994)(Kemco).sfc", 1048576, 0xbd6c8ab1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kidklown) +STD_ROM_FN(snes_Kidklown) + +struct BurnDriver BurnDrvsnes_Kidklown = { + "snes_kidklown", NULL, NULL, NULL, "1994", + "Kid Klown in Crazy Chase (USA)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_KidklownRomInfo, snes_KidklownRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kid Klown no Crazy Chase (Japan) + +static struct BurnRomInfo snes_KidklownjRomDesc[] = { + { "Kid Klown no Crazy Chase (J)(1994)(Kemco).sfc", 1048576, 0x26e0d862, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kidklownj) +STD_ROM_FN(snes_Kidklownj) + +struct BurnDriver BurnDrvsnes_Kidklownj = { + "snes_kidklownj", "snes_kidklown", NULL, NULL, "1994", + "Kid Klown no Crazy Chase (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_KidklownjRomInfo, snes_KidklownjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kidou Soukou Dion (Japan) + +static struct BurnRomInfo snes_KidoudionRomDesc[] = { + { "Kidou Soukou Dion (J)(1992)(Vic Tokai).sfc", 1048576, 0x1e54f2c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kidoudion) +STD_ROM_FN(snes_Kidoudion) + +struct BurnDriver BurnDrvsnes_Kidoudion = { + "snes_kidoudion", "snes_imperium", NULL, NULL, "1992", + "Kidou Soukou Dion (Japan)\0", NULL, "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_KidoudionRomInfo, snes_KidoudionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kiki Kaikai - Nazo no Kuro Manteau (Japan) + +static struct BurnRomInfo snes_KikikaikaiRomDesc[] = { + { "Kiki Kaikai - Nazo no Kuro Manteau (J)(1992)(Natsume).sfc", 1048576, 0x1c57f2c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kikikaikai) +STD_ROM_FN(snes_Kikikaikai) + +struct BurnDriver BurnDrvsnes_Kikikaikai = { + "snes_kikikaikai", "snes_pockyrocky", NULL, NULL, "1992", + "Kiki Kaikai - Nazo no Kuro Manteau (Japan)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_KikikaikaiRomInfo, snes_KikikaikaiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kiki Kaikai - Tsukiyo Soushi (Japan) + +static struct BurnRomInfo snes_Kikikaikai2RomDesc[] = { + { "Kiki Kaikai - Tsukiyo Soushi (J)(1994)(Natsume).sfc", 1572864, 0x5c971bed, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kikikaikai2) +STD_ROM_FN(snes_Kikikaikai2) + +struct BurnDriver BurnDrvsnes_Kikikaikai2 = { + "snes_kikikaikai2", "snes_pockyrocky2", NULL, NULL, "1994", + "Kiki Kaikai - Tsukiyo Soushi (Japan)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_Kikikaikai2RomInfo, snes_Kikikaikai2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Killer Instinct (USA) + +static struct BurnRomInfo snes_KillinstRomDesc[] = { + { "Killer Instinct (U)(1995)(Nintendo - Rare).sfc", 4194304, 0x09e9a04e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Killinst) +STD_ROM_FN(snes_Killinst) + +struct BurnDriver BurnDrvsnes_Killinst = { + "snes_killinst", NULL, NULL, NULL, "1995", + "Killer Instinct (USA)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_KillinstRomInfo, snes_KillinstRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// King Arthur's World (USA) + +static struct BurnRomInfo snes_KingarthurwRomDesc[] = { + { "King Arthur's World (U)(1993)(Jaleco).sfc", 524288, 0x99bd1fe1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kingarthurw) +STD_ROM_FN(snes_Kingarthurw) + +struct BurnDriver BurnDrvsnes_Kingarthurw = { + "snes_kingarthurw", NULL, NULL, NULL, "1993", + "King Arthur's World (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_KingarthurwRomInfo, snes_KingarthurwRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// King of Dragons, The (USA) + +static struct BurnRomInfo snes_KingdragonsRomDesc[] = { + { "King of Dragons, The (U)(1994)(Capcom).sfc", 2097152, 0xdd505df7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kingdragons) +STD_ROM_FN(snes_Kingdragons) + +struct BurnDriver BurnDrvsnes_Kingdragons = { + "snes_kingdragons", NULL, NULL, NULL, "1994", + "King of Dragons, The (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KingdragonsRomInfo, snes_KingdragonsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby's Dream Land 3 (USA) + +static struct BurnRomInfo snes_Kirby3RomDesc[] = { + { "Kirby's Dream Land 3 (U)(1997)(Nintendo).sfc", 4194304, 0xec8a48f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirby3) +STD_ROM_FN(snes_Kirby3) + +struct BurnDriver BurnDrvsnes_Kirby3 = { + "snes_kirby3", NULL, NULL, NULL, "1997", + "Kirby's Dream Land 3 (USA)\0", "SA-1 enhancement CPU", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Kirby3RomInfo, snes_Kirby3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hoshi no Kirby 3 (Japan) + +static struct BurnRomInfo snes_Kirby3jRomDesc[] = { + { "Hoshi no Kirby 3 (J)(1997)(Nintendo).sfc", 4194304, 0x43373aee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirby3j) +STD_ROM_FN(snes_Kirby3j) + +struct BurnDriver BurnDrvsnes_Kirby3j = { + "snes_kirby3j", "snes_kirby3", NULL, NULL, "1997", + "Hoshi no Kirby 3 (Japan)\0", "SA-1 enhancement CPU", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Kirby3jRomInfo, snes_Kirby3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby's Avalanche (USA) + +static struct BurnRomInfo snes_KirbyavRomDesc[] = { + { "Kirby's Avalanche (U)(1995)(Nintendo - Compile).sfc", 1048576, 0x21e658b8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbyav) +STD_ROM_FN(snes_Kirbyav) + +struct BurnDriver BurnDrvsnes_Kirbyav = { + "snes_kirbyav", NULL, NULL, NULL, "1995", + "Kirby's Avalanche (USA)\0", NULL, "Nintendo - Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_KirbyavRomInfo, snes_KirbyavRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby Bowl (Japan) + +static struct BurnRomInfo snes_KirbybowlRomDesc[] = { + { "Kirby Bowl (J)(1994)(Nintendo).sfc", 1310720, 0x2a24fc9b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbybowl) +STD_ROM_FN(snes_Kirbybowl) + +struct BurnDriver BurnDrvsnes_Kirbybowl = { + "snes_kirbybowl", "snes_kirbydcourse", NULL, NULL, "1994", + "Kirby Bowl (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_KirbybowlRomInfo, snes_KirbybowlRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby's Dream Course (USA) + +static struct BurnRomInfo snes_KirbydcourseRomDesc[] = { + { "Kirby's Dream Course (U)(1995)(Nintendo).sfc", 1048576, 0xdf8153d9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbydcourse) +STD_ROM_FN(snes_Kirbydcourse) + +struct BurnDriver BurnDrvsnes_Kirbydcourse = { + "snes_kirbydcourse", NULL, NULL, NULL, "1995", + "Kirby's Dream Course (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_KirbydcourseRomInfo, snes_KirbydcourseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby's Fun Pak (Euro) + +static struct BurnRomInfo snes_KirbyfunpakRomDesc[] = { + { "Kirby's Fun Pak (E)(1996)(Nintendo).sfc", 4194304, 0xce33dcfb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbyfunpak) +STD_ROM_FN(snes_Kirbyfunpak) + +struct BurnDriver BurnDrvsnes_Kirbyfunpak = { + "snes_kirbyfunpak", "snes_kirbysstar", NULL, NULL, "1996", + "Kirby's Fun Pak (Euro)\0", "SA-1 enhancement CPU", "Nintendo - HAL Lab.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_KirbyfunpakRomInfo, snes_KirbyfunpakRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby's Ghost Trap (Euro) + +static struct BurnRomInfo snes_KirbygtRomDesc[] = { + { "Kirby's Ghost Trap (E)(1995)(Nintendo - Compile).sfc", 1048576, 0xdd0d08be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbygt) +STD_ROM_FN(snes_Kirbygt) + +struct BurnDriver BurnDrvsnes_Kirbygt = { + "snes_kirbygt", "snes_kirbyav", NULL, NULL, "1995", + "Kirby's Ghost Trap (Euro)\0", NULL, "Nintendo - Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_KirbygtRomInfo, snes_KirbygtRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hoshi no Kirby Super Deluxe (Japan) + +static struct BurnRomInfo snes_KirbysdxRomDesc[] = { + { "Hoshi no Kirby Super Deluxe (J)(1996)(Nintendo).sfc", 4194304, 0x1f35f230, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbysdx) +STD_ROM_FN(snes_Kirbysdx) + +struct BurnDriver BurnDrvsnes_Kirbysdx = { + "snes_kirbysdx", "snes_kirbysstar", NULL, NULL, "1996", + "Hoshi no Kirby Super Deluxe (Japan)\0", "SA-1 enhancement CPU", "Nintendo - HAL Lab.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_KirbysdxRomInfo, snes_KirbysdxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kirby Super Star (USA) + +static struct BurnRomInfo snes_KirbysstarRomDesc[] = { + { "Kirby Super Star (U)(1996)(Nintendo).sfc", 4194304, 0x89d0f7dc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kirbysstar) +STD_ROM_FN(snes_Kirbysstar) + +struct BurnDriver BurnDrvsnes_Kirbysstar = { + "snes_kirbysstar", NULL, NULL, NULL, "1996", + "Kirby Super Star (USA)\0", "SA-1 enhancement CPU", "Nintendo - HAL Lab.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_KirbysstarRomInfo, snes_KirbysstarRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Knights of the Round (USA) + +static struct BurnRomInfo snes_KnightsroundRomDesc[] = { + { "Knights of the Round (U)(1994)(Capcom).sfc", 1572864, 0xaaa82126, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Knightsround) +STD_ROM_FN(snes_Knightsround) + +struct BurnDriver BurnDrvsnes_Knightsround = { + "snes_knightsround", NULL, NULL, NULL, "1994", + "Knights of the Round (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KnightsroundRomInfo, snes_KnightsroundRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// King of the Monsters (USA) + +static struct BurnRomInfo snes_KotmRomDesc[] = { + { "King of the Monsters (U)(1992)(Takara).sfc", 1048576, 0xc285c7ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kotm) +STD_ROM_FN(snes_Kotm) + +struct BurnDriver BurnDrvsnes_Kotm = { + "snes_kotm", NULL, NULL, NULL, "1992", + "King of the Monsters (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_KotmRomInfo, snes_KotmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// King of the Monsters 2 (USA) + +static struct BurnRomInfo snes_Kotm2RomDesc[] = { + { "King of the Monsters 2 (U)(1994)(Takara).sfc", 2097152, 0x0b677a37, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kotm2) +STD_ROM_FN(snes_Kotm2) + +struct BurnDriver BurnDrvsnes_Kotm2 = { + "snes_kotm2", NULL, NULL, NULL, "1994", + "King of the Monsters 2 (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Kotm2RomInfo, snes_Kotm2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kouryu no Mimi (Japan) + +static struct BurnRomInfo snes_KouryujRomDesc[] = { + { "Kouryu no Mimi (J)(1995)(Vap).sfc", 1048576, 0x89276c88, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kouryuj) +STD_ROM_FN(snes_Kouryuj) + +struct BurnDriver BurnDrvsnes_Kouryuj = { + "snes_kouryuj", "snes_kouryute", NULL, NULL, "1995", + "Kouryu no Mimi (Japan)\0", NULL, "Vap", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KouryujRomInfo, snes_KouryujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kouryu no Mimi (Hack, English v2.0) +// https://www.romhacking.net/translations/852/ +static struct BurnRomInfo snes_KouryuteRomDesc[] = { + { "Kouryu no Mimi T-Eng v2.0 (2018)(RPGONE).sfc", 1572864, 0xe8eccd0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kouryute) +STD_ROM_FN(snes_Kouryute) + +struct BurnDriver BurnDrvsnes_Kouryute = { + "snes_kouryute", NULL, NULL, NULL, "2018", + "Kouryu no Mimi (Hack, English v2.0)\0", NULL, "RPGONE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KouryuteRomInfo, snes_KouryuteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kouryu no Mimi (Hack, French v2.0) +// https://www.romhacking.net/translations/3678/ +static struct BurnRomInfo snes_KouryutfRomDesc[] = { + { "Kouryu no Mimi T-Fre v2.0 (2018)(RPGONE, Terminus).sfc", 1572864, 0x51acb09c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kouryutf) +STD_ROM_FN(snes_Kouryutf) + +struct BurnDriver BurnDrvsnes_Kouryutf = { + "snes_kouryutf", "snes_kouryute", NULL, NULL, "2018", + "Kouryu no Mimi (Hack, French v2.0)\0", NULL, "RPGONE, Terminus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KouryutfRomInfo, snes_KouryutfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kouryu no Mimi (Hack, Spanish v2.0) +// https://www.romhacking.net/translations/3282/ +static struct BurnRomInfo snes_KouryutsRomDesc[] = { + { "Kouryu no Mimi T-Spa v2.0 (2018)(RPGONE, semco).sfc", 1572864, 0x183ab376, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kouryuts) +STD_ROM_FN(snes_Kouryuts) + +struct BurnDriver BurnDrvsnes_Kouryuts = { + "snes_kouryuts", "snes_kouryute", NULL, NULL, "2018", + "Kouryu no Mimi (Hack, Spanish v2.0)\0", NULL, "RPGONE, semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_KouryutsRomInfo, snes_KouryutsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kouryuuki (Japan) + +static struct BurnRomInfo snes_KouryuukiRomDesc[] = { + { "Kouryuuki (J)(1994)(Koei).sfc", 1572864, 0x23d61c64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kouryuuki) +STD_ROM_FN(snes_Kouryuuki) + +struct BurnDriver BurnDrvsnes_Kouryuuki = { + "snes_kouryuuki", "snes_risephoenix", NULL, NULL, "1994", + "Kouryuuki (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_KouryuukiRomInfo, snes_KouryuukiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Krusty's Super Fun House (USA) + +static struct BurnRomInfo snes_KrustysRomDesc[] = { + { "Krusty's Super Fun House (U)(1992)(Acclaim Entertainment).sfc", 524288, 0xac5116d9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Krustys) +STD_ROM_FN(snes_Krustys) + +struct BurnDriver BurnDrvsnes_Krustys = { + "snes_krustys", NULL, NULL, NULL, "1992", + "Krusty's Super Fun House (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_KrustysRomInfo, snes_KrustysRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kyle Petty's No Fear Racing (USA) + +static struct BurnRomInfo snes_KylepettyRomDesc[] = { + { "Kyle Petty's No Fear Racing (U)(1995)(Williams).sfc", 3145728, 0xaee90a85, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Kylepetty) +STD_ROM_FN(snes_Kylepetty) + +struct BurnDriver BurnDrvsnes_Kylepetty = { + "snes_kylepetty", NULL, NULL, NULL, "1995", + "Kyle Petty's No Fear Racing (USA)\0", NULL, "Williams Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_KylepettyRomInfo, snes_KylepettyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lagoon (USA) + +static struct BurnRomInfo snes_LagoonRomDesc[] = { + { "Lagoon (U)(1991)(Kemco).sfc", 1048576, 0xd2554270, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lagoon) +STD_ROM_FN(snes_Lagoon) + +struct BurnDriver BurnDrvsnes_Lagoon = { + "snes_lagoon", NULL, NULL, NULL, "1991", + "Lagoon (USA)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LagoonRomInfo, snes_LagoonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lagoon (Euro, English) + +static struct BurnRomInfo snes_LagooneRomDesc[] = { + { "Lagoon (E)(1993)(Kemco).sfc", 1048576, 0x840d0c53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lagoone) +STD_ROM_FN(snes_Lagoone) + +struct BurnDriver BurnDrvsnes_Lagoone = { + "snes_lagoone", "snes_lagoon", NULL, NULL, "1993", + "Lagoon (Euro, English)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LagooneRomInfo, snes_LagooneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lagoon (Euro, German) + +static struct BurnRomInfo snes_LagoongRomDesc[] = { + { "Lagoon (E, Germany)(1993)(Kemco).sfc", 1048576, 0xb24f5c0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lagoong) +STD_ROM_FN(snes_Lagoong) + +struct BurnDriver BurnDrvsnes_Lagoong = { + "snes_lagoong", "snes_lagoon", NULL, NULL, "1993", + "Lagoon (Euro, German)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LagoongRomInfo, snes_LagoongRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lagoon (Japan) + +static struct BurnRomInfo snes_LagoonjRomDesc[] = { + { "Lagoon (J)(1991)(Kemco).sfc", 1048576, 0x6f2015fb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lagoonj) +STD_ROM_FN(snes_Lagoonj) + +struct BurnDriver BurnDrvsnes_Lagoonj = { + "snes_lagoonj", "snes_lagoon", NULL, NULL, "1991", + "Lagoon (Japan)\0", NULL, "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LagoonjRomInfo, snes_LagoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lagoon (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/6982/ +static struct BurnRomInfo snes_LagoontsRomDesc[] = { + { "Lagoon T-Spa v1.1 (2023)(semco).sfc", 2097152, 0xbe762286, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lagoonts) +STD_ROM_FN(snes_Lagoonts) + +struct BurnDriver BurnDrvsnes_Lagoonts = { + "snes_lagoonts", "snes_lagoon", NULL, NULL, "2023", + "Lagoon (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LagoontsRomInfo, snes_LagoontsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lamborghini American Challenge (USA) + +static struct BurnRomInfo snes_LamborghiniRomDesc[] = { + { "Lamborghini American Challenge (U)(1993)(Titus).sfc", 524288, 0xd2fb701b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lamborghini) +STD_ROM_FN(snes_Lamborghini) + +struct BurnDriver BurnDrvsnes_Lamborghini = { + "snes_lamborghini", NULL, NULL, NULL, "1993", + "Lamborghini American Challenge (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_LamborghiniRomInfo, snes_LamborghiniRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Last Action Hero (USA) + +static struct BurnRomInfo snes_LastactheroRomDesc[] = { + { "Last Action Hero (U)(1993)(Sony Imagesoft).sfc", 1048576, 0x88017df9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lastacthero) +STD_ROM_FN(snes_Lastacthero) + +struct BurnDriver BurnDrvsnes_Lastacthero = { + "snes_lastacthero", NULL, NULL, NULL, "1993", + "Last Action Hero (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_LastactheroRomInfo, snes_LastactheroRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Last Bible III (Japan) + +static struct BurnRomInfo snes_Lastbible3jRomDesc[] = { + { "Last Bible III (J)(1995)(Atlus).sfc", 3145728, 0x5f1d73d7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lastbible3j) +STD_ROM_FN(snes_Lastbible3j) + +struct BurnDriver BurnDrvsnes_Lastbible3j = { + "snes_lastbible3j", "snes_lastbible3te", NULL, NULL, "1995", + "Last Bible III (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lastbible3jRomInfo, snes_Lastbible3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Last Bible III (Hack, English v7.0) +// https://www.romhacking.net/translations/3545/ +static struct BurnRomInfo snes_Lastbible3teRomDesc[] = { + { "Last Bible III T-Eng v7.0 (2018)(Tom).sfc", 4194304, 0xb3cdda23, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lastbible3te) +STD_ROM_FN(snes_Lastbible3te) + +struct BurnDriver BurnDrvsnes_Lastbible3te = { + "snes_lastbible3te", NULL, NULL, NULL, "2018", + "Last Bible III (Hack, English v7.0)\0", NULL, "Tom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lastbible3teRomInfo, snes_Lastbible3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Last Bible III (Hack, Spanish v1.2) +// https://traduccionessemco.blogspot.com/2019/10/traduccion-de-last-bible-iii-de-snes-en.html +static struct BurnRomInfo snes_Lastbible3tsRomDesc[] = { + { "Last Bible III T-Spa v1.2 (2023)(semco).sfc", 4194304, 0x70cd69d9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lastbible3ts) +STD_ROM_FN(snes_Lastbible3ts) + +struct BurnDriver BurnDrvsnes_Lastbible3ts = { + "snes_lastbible3ts", "snes_lastbible3te", NULL, NULL, "2023", + "Last Bible III (Hack, Spanish v1.2)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lastbible3tsRomInfo, snes_Lastbible3tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Warriors, Legend of the Blue Dragon - The Two Heroes (Hack, English v2.0) +// https://www.romhacking.net/translations/5997/ +static struct BurnRomInfo snes_LegbluedragRomDesc[] = { + { "Warriors, Legend of the Blue Dragon - The Two Heroes T-Eng v2.0 (2021)(DDSTranslation).sfc", 4194304, 0x5b66efdf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legbluedrag) +STD_ROM_FN(snes_Legbluedrag) + +struct BurnDriver BurnDrvsnes_Legbluedrag = { + "snes_legbluedrag", NULL, NULL, NULL, "2021", + "Warriors, Legend of the Blue Dragon - The Two Heroes (Hack, English v2.0)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_LegbluedragRomInfo, snes_LegbluedragRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend (USA) + +static struct BurnRomInfo snes_LegendRomDesc[] = { + { "Legend (U)(1993)(Seika - Arcade Zone).sfc", 1048576, 0x0a6dd870, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legend) +STD_ROM_FN(snes_Legend) + +struct BurnDriver BurnDrvsnes_Legend = { + "snes_legend", NULL, NULL, NULL, "1993", + "Legend (USA)\0", NULL, "Seika - Arcade Zone", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_LegendRomInfo, snes_LegendRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of the Mystical Ninja, The (USA) + +static struct BurnRomInfo snes_LegendmninjaRomDesc[] = { + { "Legend of the Mystical Ninja, The (U)(1992)(Konami).sfc", 1048576, 0x82479d6a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendmninja) +STD_ROM_FN(snes_Legendmninja) + +struct BurnDriver BurnDrvsnes_Legendmninja = { + "snes_legendmninja", NULL, NULL, NULL, "1992", + "Legend of the Mystical Ninja, The (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendmninjaRomInfo, snes_LegendmninjaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of the Mystical Ninja, The (Euro, English) + +static struct BurnRomInfo snes_LegendmninjaeRomDesc[] = { + { "Legend of the Mystical Ninja, The (E)(1993)(Konami).sfc", 1048576, 0x797724c8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendmninjae) +STD_ROM_FN(snes_Legendmninjae) + +struct BurnDriver BurnDrvsnes_Legendmninjae = { + "snes_legendmninjae", "snes_legendmninja", NULL, NULL, "1993", + "Legend of the Mystical Ninja, The (Euro, English)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendmninjaeRomInfo, snes_LegendmninjaeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of the Mystical Ninja, The (Euro, German) + +static struct BurnRomInfo snes_LegendmninjagRomDesc[] = { + { "Legend of the Mystical Ninja, The (E, Germany)(1994)(Konami).sfc", 1048576, 0x5796529e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendmninjag) +STD_ROM_FN(snes_Legendmninjag) + +struct BurnDriver BurnDrvsnes_Legendmninjag = { + "snes_legendmninjag", "snes_legendmninja", NULL, NULL, "1994", + "Legend of the Mystical Ninja, The (Euro, German)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendmninjagRomInfo, snes_LegendmninjagRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - A Link to the Past (USA) + +static struct BurnRomInfo snes_LegendofzeldaRomDesc[] = { + { "Legend of Zelda, The - A Link to the Past (U)(1991-92)(Nintendo).sfc", 1048576, 0x777aac2f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzelda) +STD_ROM_FN(snes_Legendofzelda) + +struct BurnDriver BurnDrvsnes_Legendofzelda = { + "snes_legendofzelda", NULL, NULL, NULL, "1991-92", + "Legend of Zelda, The - A Link to the Past (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldaRomInfo, snes_LegendofzeldaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - A Link to the Past (Canada, French) + +static struct BurnRomInfo snes_LegendofzeldafrRomDesc[] = { + { "Legend of Zelda, The - A Link to the Past (Can, Fr)(1992)(Nintendo).sfc", 1048576, 0x47760381, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzeldafr) +STD_ROM_FN(snes_Legendofzeldafr) + +struct BurnDriver BurnDrvsnes_Legendofzeldafr = { + "snes_legendofzeldafr", "snes_legendofzelda", NULL, NULL, "1992", + "Legend of Zelda, The - A Link to the Past (Canada, French)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldafrRomInfo, snes_LegendofzeldafrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - A Link to the Past (Hack, Italian v1.1) +// https://www.romhacking.net/translations/7163/ +static struct BurnRomInfo snes_LegendofzeldatiRomDesc[] = { + { "Legend of Zelda, The - A Link to the Past T-Ita v1.1 (2001)(Mickey, SadNES cITy).sfc", 1048576, 0x6d879a98, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzeldati) +STD_ROM_FN(snes_Legendofzeldati) + +struct BurnDriver BurnDrvsnes_Legendofzeldati = { + "snes_legendofzeldati", "snes_legendofzelda", NULL, NULL, "2001", + "Legend of Zelda, The - A Link to the Past (Hack, Italian v1.1)\0", NULL, "Mickey - 'SadNES cITy'", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldatiRomInfo, snes_LegendofzeldatiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - A Link to the Past (Hack, Spanish v1.11) +// https://www.romhacking.net/translations/2195/ +static struct BurnRomInfo snes_LegendofzeldatsRomDesc[] = { + { "Legend of Zelda, The - A Link to the Past T-Spa v1.11 (2021)(D_Skywalk).sfc", 2097152, 0x69f58bba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzeldats) +STD_ROM_FN(snes_Legendofzeldats) + +struct BurnDriver BurnDrvsnes_Legendofzeldats = { + "snes_legendofzeldats", "snes_legendofzelda", NULL, NULL, "2021", + "Legend of Zelda, The - A Link to the Past (Hack, Spanish v1.11)\0", NULL, "D_Skywalk", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldatsRomInfo, snes_LegendofzeldatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lemmings (USA) + +static struct BurnRomInfo snes_LemmingsRomDesc[] = { + { "Lemmings (U)(1992)(Sunsoft - Psygnosis).sfc", 1048576, 0x51e3d566, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lemmings) +STD_ROM_FN(snes_Lemmings) + +struct BurnDriver BurnDrvsnes_Lemmings = { + "snes_lemmings", NULL, NULL, NULL, "1992", + "Lemmings (USA)\0", NULL, "Sunsoft - Psygnosis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_LemmingsRomInfo, snes_LemmingsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lemmings 2 - The Tribes (USA) + +static struct BurnRomInfo snes_Lemmings2RomDesc[] = { + { "Lemmings 2 - The Tribes (U)(1994)(Psygnosis).sfc", 2097152, 0xdf7200c8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lemmings2) +STD_ROM_FN(snes_Lemmings2) + +struct BurnDriver BurnDrvsnes_Lemmings2 = { + "snes_lemmings2", NULL, NULL, NULL, "1994", + "Lemmings 2 - The Tribes (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Psygnosis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Lemmings2RomInfo, snes_Lemmings2RomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lester the Unlikely (USA) + +static struct BurnRomInfo snes_LesterRomDesc[] = { + { "Lester the Unlikely (U)(1993)(DTMC).sfc", 1048576, 0x1a52fee5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lester) +STD_ROM_FN(snes_Lester) + +struct BurnDriver BurnDrvsnes_Lester = { + "snes_lester", NULL, NULL, NULL, "1993", + "Lester the Unlikely (USA)\0", NULL, "DTMC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LesterRomInfo, snes_LesterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Odekake Lester: Lelele no Le (Japan) + +static struct BurnRomInfo snes_LesterjRomDesc[] = { + { "Odekake Lester - Lelele no Le (J)(1994)(Asmik).sfc", 1048576, 0x8d89a8e8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lesterj) +STD_ROM_FN(snes_Lesterj) + +struct BurnDriver BurnDrvsnes_Lesterj = { + "snes_lesterj", "snes_lester", NULL, NULL, "1994", + "Odekake Lester: Lelele no Le (Japan)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LesterjRomInfo, snes_LesterjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lethal Enforcers (USA) + +static struct BurnRomInfo snes_LethalenfRomDesc[] = { + { "Lethal Enforcers (U)(1993)(Konami).sfc", 2097152, 0x5aff8cd5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lethalenf) +STD_ROM_FN(snes_Lethalenf) + +struct BurnDriver BurnDrvsnes_Lethalenf = { + "snes_lethalenf", NULL, NULL, NULL, "1993", + "Lethal Enforcers (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_LethalenfRomInfo, snes_LethalenfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lethal Weapon (USA) + +static struct BurnRomInfo snes_LethalweapRomDesc[] = { + { "Lethal Weapon (U)(1992)(Ocean).sfc", 1048576, 0xa14c3dbc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lethalweap) +STD_ROM_FN(snes_Lethalweap) + +struct BurnDriver BurnDrvsnes_Lethalweap = { + "snes_lethalweap", NULL, NULL, NULL, "1992", + "Lethal Weapon (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LethalweapRomInfo, snes_LethalweapRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Light Fantasy (Japan) + +static struct BurnRomInfo snes_LightfantjRomDesc[] = { + { "Light Fantasy (J)(1992)(Tonkin House).sfc", 1048576, 0x17bbf914, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lightfantj) +STD_ROM_FN(snes_Lightfantj) + +struct BurnDriver BurnDrvsnes_Lightfantj = { + "snes_lightfantj", "snes_lightfantte", NULL, NULL, "1992", + "Light Fantasy (Japan)\0", NULL, "Tonkin House", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LightfantjRomInfo, snes_LightfantjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Light Fantasy (Hack, English) +// https://www.romhacking.net/translations/6993/ +static struct BurnRomInfo snes_LightfantteRomDesc[] = { + { "Light Fantasy T-Eng (2023)(Zarby89).sfc", 1572864, 0xfc8f73b6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lightfantte) +STD_ROM_FN(snes_Lightfantte) + +struct BurnDriver BurnDrvsnes_Lightfantte = { + "snes_lightfantte", NULL, NULL, NULL, "2023", + "Light Fantasy (Hack, English)\0", NULL, "Zarby89", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LightfantteRomInfo, snes_LightfantteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's The Lion King (USA) + +static struct BurnRomInfo snes_LionkingRomDesc[] = { + { "Lion King, The (U)(1994)(Virgin Interactive).sfc", 3145728, 0xc8fbfaa8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lionking) +STD_ROM_FN(snes_Lionking) + +struct BurnDriver BurnDrvsnes_Lionking = { + "snes_lionking", NULL, NULL, NULL, "1994", + "Disney's The Lion King (USA)\0", NULL, "Virgin Int. - Disney Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LionkingRomInfo, snes_LionkingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Little Magic (Japan) + +static struct BurnRomInfo snes_LittlemagicjRomDesc[] = { + { "Little Magic (J)(1993)(Altron).sfc", 524288, 0x9654194d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Littlemagicj) +STD_ROM_FN(snes_Littlemagicj) + +struct BurnDriver BurnDrvsnes_Littlemagicj = { + "snes_littlemagicj", "snes_littlemagicte", NULL, NULL, "1993", + "Little Magic (Japan)\0", NULL, "Altron", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_LittlemagicjRomInfo, snes_LittlemagicjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Little Magic (Hack, English v1.00B) +// https://www.romhacking.net/translations/377/ +static struct BurnRomInfo snes_LittlemagicteRomDesc[] = { + { "Little Magic T-Eng v1.00B (2001)(Aeon Genesis).sfc", 524800, 0xb73ec805, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Littlemagicte) +STD_ROM_FN(snes_Littlemagicte) + +struct BurnDriver BurnDrvsnes_Littlemagicte = { + "snes_littlemagicte", NULL, NULL, NULL, "2001", + "Little Magic (Hack, English v1.00B)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_LittlemagicteRomInfo, snes_LittlemagicteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Live A Live (Japan) + +static struct BurnRomInfo snes_LivealivejRomDesc[] = { + { "Live A Live (J)(1994)(Squaresoft).sfc", 2097152, 0x6291ee08, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Livealivej) +STD_ROM_FN(snes_Livealivej) + +struct BurnDriver BurnDrvsnes_Livealivej = { + "snes_livealivej", "snes_livealivete", NULL, NULL, "1994", + "Live A Live (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LivealivejRomInfo, snes_LivealivejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Live A Live (Hack, English v2.00) +// https://www.romhacking.net/translations/381/ +static struct BurnRomInfo snes_LivealiveteRomDesc[] = { + { "Live A Live T-Eng v2.00 (2008)(Aeon Genesis).sfc", 2621440, 0x5ad071f3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Livealivete) +STD_ROM_FN(snes_Livealivete) + +struct BurnDriver BurnDrvsnes_Livealivete = { + "snes_livealivete", NULL, NULL, NULL, "2008", + "Live A Live (Hack, English v2.00)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LivealiveteRomInfo, snes_LivealiveteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Live A Live (Hack, Spanish v1.6) +// https://www.romhacking.net/translations/6058/ +static struct BurnRomInfo snes_LivealivetsRomDesc[] = { + { "Live A Live T-Spa v1.6 (2022)(Max1323).sfc", 2621440, 0x7a92a82a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Livealivets) +STD_ROM_FN(snes_Livealivets) + +struct BurnDriver BurnDrvsnes_Livealivets = { + "snes_livealivets", "snes_livealivete", NULL, NULL, "2022", + "Live A Live (Hack, Spanish v1.6)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LivealivetsRomInfo, snes_LivealivetsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lock On (USA) + +static struct BurnRomInfo snes_LockonRomDesc[] = { + { "Lock On (U)(1993)(Vic Tokai).sfc", 524288, 0x84f7e078, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Lockon, snes_Lockon, snes_dsp1) +STD_ROM_FN(snes_Lockon) + +struct BurnDriver BurnDrvsnes_Lockon = { + "snes_lockon", NULL, "snes_dsp1", NULL, "1993", + "Lock On (USA)\0", "DSP-1 enhancement chip", "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_LockonRomInfo, snes_LockonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lost Vikings, The (USA) + +static struct BurnRomInfo snes_LostvikingRomDesc[] = { + { "Lost Vikings, The (U)(1992)(Interplay).sfc", 1048576, 0x6838be08, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lostviking) +STD_ROM_FN(snes_Lostviking) + +struct BurnDriver BurnDrvsnes_Lostviking = { + "snes_lostviking", NULL, NULL, NULL, "1992", + "Lost Vikings, The (USA)\0", NULL, "Interplay - Silicon & Synapse", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_LostvikingRomInfo, snes_LostvikingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lost Vikings II, The (USA) + +static struct BurnRomInfo snes_Lostviking2RomDesc[] = { + { "Lost Vikings II, The (U)(1997)(Interplay).sfc", 1048576, 0x3aa01dbd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lostviking2) +STD_ROM_FN(snes_Lostviking2) + +struct BurnDriver BurnDrvsnes_Lostviking2 = { + "snes_lostviking2", NULL, NULL, NULL, "1997", + "Lost Vikings II, The (USA)\0", NULL, "Interplay - Blizzard Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_Lostviking2RomInfo, snes_Lostviking2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Viking no Daimeiwaku (Japan) + +static struct BurnRomInfo snes_LostvikingjRomDesc[] = { + { "Viking no Daimeiwaku (J)(1993)(T&E Soft).sfc", 1048576, 0x50fef979, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lostvikingj) +STD_ROM_FN(snes_Lostvikingj) + +struct BurnDriver BurnDrvsnes_Lostvikingj = { + "snes_lostvikingj", "snes_lostviking", NULL, NULL, "1993", + "Viking no Daimeiwaku (Japan)\0", NULL, "T&E Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_LostvikingjRomInfo, snes_LostvikingjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lode Runner Twin - Justy to Liberty no Daibouken (Japan) + +static struct BurnRomInfo snes_LrtwinjRomDesc[] = { + { "Lode Runner Twin - Justy to Liberty no Daibouken (J)(1994)(T&E Soft).sfc", 1048576, 0xaba0a671, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lrtwinj) +STD_ROM_FN(snes_Lrtwinj) + +struct BurnDriver BurnDrvsnes_Lrtwinj = { + "snes_lrtwinj", NULL, NULL, NULL, "1994", + "Lode Runner Twin - Justy to Liberty no Daibouken (Japan)\0", NULL, "T&E Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LrtwinjRomInfo, snes_LrtwinjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Looney Tunes B-Ball (USA) + +static struct BurnRomInfo snes_LtbballRomDesc[] = { + { "Looney Tunes B-Ball (U)(1994)(Sunsoft).sfc", 2097152, 0x6d3bc96f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ltbball) +STD_ROM_FN(snes_Ltbball) + +struct BurnDriver BurnDrvsnes_Ltbball = { + "snes_ltbball", NULL, NULL, NULL, "1994", + "Looney Tunes B-Ball (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_LtbballRomInfo, snes_LtbballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lucky Luke (Euro) + +static struct BurnRomInfo snes_LuckylukeRomDesc[] = { + { "Lucky Luke (E)(1997)(Infogrames).sfc", 1572864, 0x7e2c7143, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Luckyluke) +STD_ROM_FN(snes_Luckyluke) + +struct BurnDriver BurnDrvsnes_Luckyluke = { + "snes_luckyluke", NULL, NULL, NULL, "1997", + "Lucky Luke (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LuckylukeRomInfo, snes_LuckylukeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia & The Fortress of Doom (USA) + +static struct BurnRomInfo snes_LufiaRomDesc[] = { + { "Lufia & The Fortress of Doom (U)(1993)(Taito).sfc", 1048576, 0x5e1aa1a6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufia) +STD_ROM_FN(snes_Lufia) + +struct BurnDriver BurnDrvsnes_Lufia = { + "snes_lufia", NULL, NULL, NULL, "1993", + "Lufia & The Fortress of Doom (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LufiaRomInfo, snes_LufiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia II - Rise of the Sinistrals (USA) + +static struct BurnRomInfo snes_Lufia2RomDesc[] = { + { "Lufia II - Rise of the Sinistrals (U)(1996)(Natsume).sfc", 2621440, 0x20f2ac29, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufia2) +STD_ROM_FN(snes_Lufia2) + +struct BurnDriver BurnDrvsnes_Lufia2 = { + "snes_lufia2", NULL, NULL, NULL, "1996", + "Lufia II - Rise of the Sinistrals (USA)\0", NULL, "Natsume - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lufia2RomInfo, snes_Lufia2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia (Euro, German) + +static struct BurnRomInfo snes_Lufia2deRomDesc[] = { + { "Lufia (E, Germany)(1995)(Nintendo).sfc", 3145728, 0x8278693d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufia2de) +STD_ROM_FN(snes_Lufia2de) + +struct BurnDriver BurnDrvsnes_Lufia2de = { + "snes_lufia2de", "snes_lufia2", NULL, NULL, "1995", + "Lufia (Euro, German)\0", NULL, "Nintendo - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lufia2deRomInfo, snes_Lufia2deRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia (Euro, English) + +static struct BurnRomInfo snes_Lufia2eRomDesc[] = { + { "Lufia (E)(1995)(Nintendo).sfc", 2621440, 0xfdb80165, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufia2e) +STD_ROM_FN(snes_Lufia2e) + +struct BurnDriver BurnDrvsnes_Lufia2e = { + "snes_lufia2e", "snes_lufia2", NULL, NULL, "1995", + "Lufia (Euro, English)\0", NULL, "Nintendo - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lufia2eRomInfo, snes_Lufia2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia (Euro, Spanish) + +static struct BurnRomInfo snes_Lufia2sRomDesc[] = { + { "Lufia (E, Spain)(1995)(Nintendo).sfc", 3145728, 0xd93c0dd4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufia2s) +STD_ROM_FN(snes_Lufia2s) + +struct BurnDriver BurnDrvsnes_Lufia2s = { + "snes_lufia2s", "snes_lufia2", NULL, NULL, "1995", + "Lufia (Euro, Spanish)\0", NULL, "Nintendo - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Lufia2sRomInfo, snes_Lufia2sRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia & The Fortress of Doom 'Restored' (Hack, v3.1) +// https://www.romhacking.net/hacks/2744/ +static struct BurnRomInfo snes_LufiarestRomDesc[] = { + { "Lufia & The Fortress of Doom Restored v3.1 (2022)(FlamePurge).sfc", 1572864, 0xe12e310d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufiarest) +STD_ROM_FN(snes_Lufiarest) + +struct BurnDriver BurnDrvsnes_Lufiarest = { + "snes_lufiarest", "snes_lufia", NULL, NULL, "2022", + "Lufia & The Fortress of Doom 'Restored' (Hack, v3.1)\0", NULL, "FlamePurge", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LufiarestRomInfo, snes_LufiarestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia & Die Schicksalsfestung (Hack, German) +// https://www.romhacking.net/translations/1268/ +static struct BurnRomInfo snes_LufiatdeRomDesc[] = { + { "Lufia & The Fortress of Doom T-Ger (2008)(FloBo).sfc", 1048576, 0x01b0ed7e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufiatde) +STD_ROM_FN(snes_Lufiatde) + +struct BurnDriver BurnDrvsnes_Lufiatde = { + "snes_lufiatde", "snes_lufia", NULL, NULL, "2008", + "Lufia & Die Schicksalsfestung (Hack, German)\0", NULL, "FloBo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LufiatdeRomInfo, snes_LufiatdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia e la Fortezza del Fato (Hack, Italian v1.01b) +// https://www.romhacking.net/translations/6299/ +static struct BurnRomInfo snes_LufiatiRomDesc[] = { + { "Lufia & The Fortress of Doom T-Ita v1.01b (2021)(Mumble Translations).sfc", 2097152, 0x3a0a33e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufiati) +STD_ROM_FN(snes_Lufiati) + +struct BurnDriver BurnDrvsnes_Lufiati = { + "snes_lufiati", "snes_lufia", NULL, NULL, "2013", + "Lufia e la Fortezza del Fato (Hack, Italian v1.01b)\0", NULL, "Mumble Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LufiatiRomInfo, snes_LufiatiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lufia & The Fortress of Doom (Hack, Spanish v1.03) +// https://traduccioneslukas.blogspot.com/2013/01/fallos-lufia.html +static struct BurnRomInfo snes_LufiatsRomDesc[] = { + { "Lufia & The Fortress of Doom T-Spa v1.03 (2013)(Lukas).sfc", 1048576, 0xdf776147, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lufiats) +STD_ROM_FN(snes_Lufiats) + +struct BurnDriver BurnDrvsnes_Lufiats = { + "snes_lufiats", "snes_lufia", NULL, NULL, "2013", + "Lufia & The Fortress of Doom (Hack, Spanish v1.03)\0", NULL, "Lukas", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_LufiatsRomInfo, snes_LufiatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lupin Sansei - Densetsu no Hihou o Oe! (Japan) + +static struct BurnRomInfo snes_LupinsanseiRomDesc[] = { + { "Lupin Sansei - Densetsu no Hihou o Oe! (J)(1994)(Epoch).sfc", 1572864, 0x74adc6e2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lupinsansei) +STD_ROM_FN(snes_Lupinsansei) + +struct BurnDriver BurnDrvsnes_Lupinsansei = { + "snes_lupinsansei", NULL, NULL, NULL, "1994", + "Lupin Sansei - Densetsu no Hihou o Oe! (Japan)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LupinsanseiRomInfo, snes_LupinsanseiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Maerchen Adventure Cotton 100% (Japan) + +static struct BurnRomInfo snes_Macotton100jRomDesc[] = { + { "Maerchen Adventure Cotton 100% (J)(1994)(Datam Polystar - Success).sfc", 2097152, 0x5fb7a31d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Macotton100j) +STD_ROM_FN(snes_Macotton100j) + +struct BurnDriver BurnDrvsnes_Macotton100j = { + "snes_macotton100j", "snes_macotton100te", NULL, NULL, "1994", + "Maerchen Adventure Cotton 100% (Japan)\0", NULL, "Datam Polystar - Success", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Macotton100jRomInfo, snes_Macotton100jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Maerchen Adventure Cotton 100% (Hack, English v1.1) +// https://www.romhacking.net/translations/6365/ +static struct BurnRomInfo snes_Macotton100teRomDesc[] = { + { "Maerchen Adventure Cotton 100% T-Eng v1.1 (2021)(Svambo).sfc", 2097152, 0x00fff73f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Macotton100te) +STD_ROM_FN(snes_Macotton100te) + +struct BurnDriver BurnDrvsnes_Macotton100te = { + "snes_macotton100te", NULL, NULL, NULL, "2021", + "Maerchen Adventure Cotton 100% (Hack, English v1.1)\0", NULL, "Svambo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Macotton100teRomInfo, snes_Macotton100teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Madden NFL '94 (USA) + +static struct BurnRomInfo snes_Madden94RomDesc[] = { + { "Madden NFL '94 (U)(1993)(Electronic Arts).sfc", 1048576, 0x8bed5914, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Madden94) +STD_ROM_FN(snes_Madden94) + +struct BurnDriver BurnDrvsnes_Madden94 = { + "snes_madden94", NULL, NULL, NULL, "1993", + "Madden NFL '94 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Madden94RomInfo, snes_Madden94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Madden NFL '95 (USA) + +static struct BurnRomInfo snes_Madden95RomDesc[] = { + { "Madden NFL '95 (U)(1994)(Electronic Arts).sfc", 1048576, 0x021a3f69, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Madden95) +STD_ROM_FN(snes_Madden95) + +struct BurnDriver BurnDrvsnes_Madden95 = { + "snes_madden95", NULL, NULL, NULL, "1994", + "Madden NFL '95 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Madden95RomInfo, snes_Madden95RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Madden NFL '96 (USA) + +static struct BurnRomInfo snes_Madden96RomDesc[] = { + { "Madden NFL '96 (U)(1995)(Electronic Arts).sfc", 1572864, 0x51a1fe86, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Madden96) +STD_ROM_FN(snes_Madden96) + +struct BurnDriver BurnDrvsnes_Madden96 = { + "snes_madden96", NULL, NULL, NULL, "1995", + "Madden NFL '96 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Madden96RomInfo, snes_Madden96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Madou Monogatari: Hanamaru Daiyouchienji (Japan) + +static struct BurnRomInfo snes_MadoumonojRomDesc[] = { + { "Madou Monogatari - Hanamaru Daiyouchienji (J)(1996)(Tokuma Shoten).sfc", 2097152, 0x1354e81e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Madoumonoj) +STD_ROM_FN(snes_Madoumonoj) + +struct BurnDriver BurnDrvsnes_Madoumonoj = { + "snes_madoumonoj", "snes_madoumonote", NULL, NULL, "1996", + "Madou Monogatari: Hanamaru Daiyouchienji (Japan)\0", NULL, "Tokuma Shoten", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MadoumonojRomInfo, snes_MadoumonojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Madou Monogatari - Big Kindergarten Kids (Hack, English v1.01) +// https://www.romhacking.net/translations/386/ +static struct BurnRomInfo snes_MadoumonoteRomDesc[] = { + { "Madou Monogatari - Big Kindergarten Kids T-Eng v1.01 (2016)(Aeon Genesis, J2e Translations).sfc", 2097152, 0xb423c9a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Madoumonote) +STD_ROM_FN(snes_Madoumonote) + +struct BurnDriver BurnDrvsnes_Madoumonote = { + "snes_madoumonote", NULL, NULL, NULL, "2016", + "Madou Monogatari - Big Kindergarten Kids (Hack, English v1.01)\0", NULL, "Aeon Genesis, J2e Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MadoumonoteRomInfo, snes_MadoumonoteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magic Boy (USA) + +static struct BurnRomInfo snes_MagicboyRomDesc[] = { + { "Magic Boy (U)(1993)(JVC Musical Industries).sfc", 524288, 0xab57a2f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicboy) +STD_ROM_FN(snes_Magicboy) + +struct BurnDriver BurnDrvsnes_Magicboy = { + "snes_magicboy", NULL, NULL, NULL, "1993", + "Magic Boy (USA)\0", NULL, "JVC Musical Industries", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicboyRomInfo, snes_MagicboyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Drop (Japan) + +static struct BurnRomInfo snes_MagicdropjRomDesc[] = { + { "Magical Drop (J)(1995)(Data East).sfc", 1048576, 0x51177158, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicdropj) +STD_ROM_FN(snes_Magicdropj) + +struct BurnDriver BurnDrvsnes_Magicdropj = { + "snes_magicdropj", "snes_magicdropte", NULL, NULL, "1995", + "Magical Drop (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MagicdropjRomInfo, snes_MagicdropjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Drop (Hack, English v0.95) +// https://www.romhacking.net/translations/527/ +static struct BurnRomInfo snes_MagicdropteRomDesc[] = { + { "Magical Drop T-Eng v0.95 (2002)(Aeon Genesis).sfc", 1049088, 0xf199888c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicdropte) +STD_ROM_FN(snes_Magicdropte) + +struct BurnDriver BurnDrvsnes_Magicdropte = { + "snes_magicdropte", NULL, NULL, NULL, "2002", + "Magical Drop (Hack, English v0.95)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MagicdropteRomInfo, snes_MagicdropteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Pop'n (Japan) + +static struct BurnRomInfo snes_MagicpopnjRomDesc[] = { + { "Magical Pop'n (J)(1995)(Pack-In-Video).sfc", 2097152, 0xc49d28a4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicpopnj) +STD_ROM_FN(snes_Magicpopnj) + +struct BurnDriver BurnDrvsnes_Magicpopnj = { + "snes_magicpopnj", "snes_magicpopnte", NULL, NULL, "1995", + "Magical Pop'n (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicpopnjRomInfo, snes_MagicpopnjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Pop'n (Hack, English v1.01) +// https://www.romhacking.net/translations/660/ +static struct BurnRomInfo snes_MagicpopnteRomDesc[] = { + { "Magical Pop'n T-Eng v1.01 (2003)(Aeon Genesis).sfc", 2228224, 0xac47a435, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicpopnte) +STD_ROM_FN(snes_Magicpopnte) + +struct BurnDriver BurnDrvsnes_Magicpopnte = { + "snes_magicpopnte", NULL, NULL, NULL, "2003", + "Magical Pop'n (Hack, English v1.01)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicpopnteRomInfo, snes_MagicpopnteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Quest Starring Mickey Mouse, The (USA) + +static struct BurnRomInfo snes_MagicalquestRomDesc[] = { + { "Magical Quest Starring Mickey Mouse, The (U)(1992)(Capcom).sfc", 1048576, 0x10874c70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicalquest) +STD_ROM_FN(snes_Magicalquest) + +struct BurnDriver BurnDrvsnes_Magicalquest = { + "snes_magicalquest", NULL, NULL, NULL, "1992", + "Magical Quest Starring Mickey Mouse, The (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicalquestRomInfo, snes_MagicalquestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Quest 3 Starring Mickey and Donald (Hack, English v1.5) +// https://www.romhacking.net/translations/553/ +static struct BurnRomInfo snes_Magicquest3RomDesc[] = { + { "Magical Quest 3 Starring Mickey and Donald T-Eng v1.5 (2020)(RPGONE).sfc", 2621440, 0x7ec8f9a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicquest3) +STD_ROM_FN(snes_Magicquest3) + +struct BurnDriver BurnDrvsnes_Magicquest3 = { + "snes_magicquest3", NULL, NULL, NULL, "2020", + "Magical Quest 3 Starring Mickey and Donald (Hack, English v1.5)\0", NULL, "RPGONE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Magicquest3RomInfo, snes_Magicquest3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magical Taruruuto-kun - Magic Adventure (Japan) + +static struct BurnRomInfo snes_MagicaltaruruutokunRomDesc[] = { + { "Magical Taruruuto-kun - Magic Adventure (J)(1992)(Bandai).sfc", 524288, 0x5f863463, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicaltaruruutokun) +STD_ROM_FN(snes_Magicaltaruruutokun) + +struct BurnDriver BurnDrvsnes_Magicaltaruruutokun = { + "snes_magicaltaruruutokun", NULL, NULL, NULL, "1992", + "Magical Taruruuto-kun - Magic Adventure (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicaltaruruutokunRomInfo, snes_MagicaltaruruutokunRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magic Sword (USA) + +static struct BurnRomInfo snes_MagicswordRomDesc[] = { + { "Magic Sword (U)(1992)(Capcom).sfc", 1048576, 0x27325e4d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicsword) +STD_ROM_FN(snes_Magicsword) + +struct BurnDriver BurnDrvsnes_Magicsword = { + "snes_magicsword", NULL, NULL, NULL, "1992", + "Magic Sword (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicswordRomInfo, snes_MagicswordRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magic Sword (Japan) + +static struct BurnRomInfo snes_MagicswordjRomDesc[] = { + { "Magic Sword (J)(1992)(Capcom).sfc", 1048576, 0x0b159d53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magicswordj) +STD_ROM_FN(snes_Magicswordj) + +struct BurnDriver BurnDrvsnes_Magicswordj = { + "snes_magicswordj", "snes_magicsword", NULL, NULL, "1992", + "Magic Sword (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MagicswordjRomInfo, snes_MagicswordjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mahou Kishi Rayearth (Japan) + +static struct BurnRomInfo snes_MagkrayjRomDesc[] = { + { "Mahou Kishi Rayearth (J)(1995)(Tomy).sfc", 1572864, 0xede4b627, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magkrayj) +STD_ROM_FN(snes_Magkrayj) + +struct BurnDriver BurnDrvsnes_Magkrayj = { + "snes_magkrayj", "snes_magkrayte", NULL, NULL, "1995", + "Mahou Kishi Rayearth (Japan)\0", NULL, "Tomy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MagkrayjRomInfo, snes_MagkrayjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Magic Knight Rayearth (Hack, English v1.02) +// https://www.romhacking.net/translations/6650/ +static struct BurnRomInfo snes_MagkrayteRomDesc[] = { + { "Magic Knight Rayearth T-Eng v1.02 (2022)(mteam).sfc", 1572864, 0x50cc4c9c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Magkrayte) +STD_ROM_FN(snes_Magkrayte) + +struct BurnDriver BurnDrvsnes_Magkrayte = { + "snes_magkrayte", NULL, NULL, NULL, "2022", + "Magic Knight Rayearth (Hack, English v1.02)\0", NULL, "mteam", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MagkrayteRomInfo, snes_MagkrayteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mahjong Club (Japan) + +static struct BurnRomInfo snes_MahjongclubRomDesc[] = { + { "Mahjong Club (J)(1994)(Hect).sfc", 262144, 0x1d8748fa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mahjongclub) +STD_ROM_FN(snes_Mahjongclub) + +struct BurnDriver BurnDrvsnes_Mahjongclub = { + "snes_mahjongclub", NULL, NULL, NULL, "1994", + "Mahjong Club (Japan)\0", NULL, "Hect", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MAHJONG, 0, + SNESGetZipName, snes_MahjongclubRomInfo, snes_MahjongclubRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Michael Andretti's Indy Car Challenge (USA) + +static struct BurnRomInfo snes_MaindycarRomDesc[] = { + { "Michael Andretti's Indy Car Challenge (U)(1994)(Bullet Proof Software).sfc", 1048576, 0x0fdb210e, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Maindycar, snes_Maindycar, snes_dsp1) +STD_ROM_FN(snes_Maindycar) + +struct BurnDriver BurnDrvsnes_Maindycar = { + "snes_maindycar", NULL, "snes_dsp1", NULL, "1994", + "Michael Andretti's Indy Car Challenge (USA)\0", "DSP-1 enhancement chip", "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MaindycarRomInfo, snes_MaindycarRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Michael Andretti's Indy Car Challenge (Japan) + +static struct BurnRomInfo snes_MaindycarjRomDesc[] = { + { "Michael Andretti's Indy Car Challenge (J)(1994)(Bullet Proof Software).sfc", 1048576, 0x1128572b, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Maindycarj, snes_Maindycarj, snes_dsp1) +STD_ROM_FN(snes_Maindycarj) + +struct BurnDriver BurnDrvsnes_Maindycarj = { + "snes_maindycarj", "snes_maindycar", "snes_dsp1", NULL, "1994", + "Michael Andretti's Indy Car Challenge (Japan)\0", "DSP-1 enhancement chip", "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MaindycarjRomInfo, snes_MaindycarjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Majin Tensei (Japan) + +static struct BurnRomInfo snes_MajtenseijRomDesc[] = { + { "Majin Tensei (J)(1994)(Atlus).sfc", 1572864, 0xc1b5d46a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Majtenseij) +STD_ROM_FN(snes_Majtenseij) + +struct BurnDriver BurnDrvsnes_Majtenseij = { + "snes_majtenseij", "snes_majtenseite", NULL, NULL, "1994", + "Majin Tensei (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_MajtenseijRomInfo, snes_MajtenseijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Majin Tensei (Hack, English v4.0) +// https://www.romhacking.net/translations/4832 +static struct BurnRomInfo snes_MajtenseiteRomDesc[] = { + { "Majin Tensei T-Eng v4.0 (2019)(DDSTranslation).sfc", 2097152, 0x50342db2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Majtenseite) +STD_ROM_FN(snes_Majtenseite) + +struct BurnDriver BurnDrvsnes_Majtenseite = { + "snes_majtenseite", NULL, NULL, NULL, "2019", + "Majin Tensei (Hack, English v4.0)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_MajtenseiteRomInfo, snes_MajtenseiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Majin Tensei (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/5690/ +static struct BurnRomInfo snes_MajtenseitsRomDesc[] = { + { "Majin Tensei T-Spa v1.1 (2021)(Max1323).sfc", 2097152, 0x9bdf3576, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Majtenseits) +STD_ROM_FN(snes_Majtenseits) + +struct BurnDriver BurnDrvsnes_Majtenseits = { + "snes_majtenseits", "snes_majtenseite", NULL, NULL, "2021", + "Majin Tensei (Hack, Spanish v1.1)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_MajtenseitsRomInfo, snes_MajtenseitsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Majuu Ou (Japan) + +static struct BurnRomInfo snes_MajuuouRomDesc[] = { + { "Majuu Ou (J)(1995)(KSS).sfc", 1572864, 0x4737370b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Majuuou) +STD_ROM_FN(snes_Majuuou) + +struct BurnDriver BurnDrvsnes_Majuuou = { + "snes_majuuou", "snes_majuuout", NULL, NULL, "1995", + "Majuu Ou (Japan)\0", NULL, "KSS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_RUNGUN, 0, + SNESGetZipName, snes_MajuuouRomInfo, snes_MajuuouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Majuu Ou - King of Demons (Hack, English v1.01) +// https://www.romhacking.net/translations/649/ +static struct BurnRomInfo snes_MajuuoutRomDesc[] = { + { "Majuu Ou - King of Demons T-Eng v1.01 (2005)(Aeon Genesis).sfc", 1572864, 0x14dcc20d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Majuuout) +STD_ROM_FN(snes_Majuuout) + +struct BurnDriver BurnDrvsnes_Majuuout = { + "snes_majuuout", NULL, NULL, NULL, "2005", + "Majuu Ou - King of Demons (Hack, English v1.01)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_RUNGUN, 0, + SNESGetZipName, snes_MajuuoutRomInfo, snes_MajuuoutRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Makeruna! Makendou (Japan) + +static struct BurnRomInfo snes_MakerunaRomDesc[] = { + { "Makeruna! Makendou (J)(1993)(Datam Polystar).sfc", 1048576, 0xbb95bc9f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Makeruna) +STD_ROM_FN(snes_Makeruna) + +struct BurnDriver BurnDrvsnes_Makeruna = { + "snes_makeruna", "snes_kendorage", NULL, NULL, "1993", + "Makeruna! Makendou (Japan)\0", NULL, "Datam Polystar", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MakerunaRomInfo, snes_MakerunaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marko's Magic Football (Euro) + +static struct BurnRomInfo snes_MarkosmfRomDesc[] = { + { "Marko's Magic Football (E)(1995)(Acclaim - Domark).sfc", 2097152, 0x4824a630, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Markosmf) +STD_ROM_FN(snes_Markosmf) + +struct BurnDriver BurnDrvsnes_Markosmf = { + "snes_markosmf", NULL, NULL, NULL, "1995", + "Marko's Magic Football (Euro)\0", NULL, "Acclaim Entertainment - Domark", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MarkosmfRomInfo, snes_MarkosmfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mario Paint (USA, Japan) + +static struct BurnRomInfo snes_MariopaintRomDesc[] = { + { "Mario Paint (USA, Japan)(1992)(Nintendo).sfc", 1048576, 0x38c9626c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mariopaint) +STD_ROM_FN(snes_Mariopaint) + +struct BurnDriver BurnDrvsnes_Mariopaint = { + "snes_mariopaint", NULL, NULL, NULL, "1992", + "Mario Paint (USA, Japan)\0", "'SNES Mouse' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MISC | GBF_MINIGAMES, 0, + SNESGetZipName, snes_MariopaintRomInfo, snes_MariopaintRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseP1DIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mario Paint (Euro) + +static struct BurnRomInfo snes_MariopainteRomDesc[] = { + { "Mario Paint (Euro)(1992)(Nintendo).sfc", 1048576, 0x266b220e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mariopainte) +STD_ROM_FN(snes_Mariopainte) + +struct BurnDriver BurnDrvsnes_Mariopainte = { + "snes_mariopainte", "snes_mariopaint", NULL, NULL, "1992", + "Mario Paint (Euro)\0", "'SNES Mouse' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_MISC | GBF_MINIGAMES, 0, + SNESGetZipName, snes_MariopainteRomInfo, snes_MariopainteRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseP1DIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mario no Super Picross (Japan) + +static struct BurnRomInfo snes_MariosupicjRomDesc[] = { + { "Mario no Super Picross (J)(1995)(Nintendo).sfc", 1048576, 0xf64c5aa0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mariosupicj) +STD_ROM_FN(snes_Mariosupicj) + +struct BurnDriver BurnDrvsnes_Mariosupicj = { + "snes_mariosupicj", "snes_mariosupicte", NULL, NULL, "1995", + "Mario no Super Picross (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MariosupicjRomInfo, snes_MariosupicjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mario's Super Picross (Hack, English v1.5) +// https://www.romhacking.net/translations/6306/ +static struct BurnRomInfo snes_MariosupicteRomDesc[] = { + { "Mario's Super Picross T-Eng v1.5 (2021)(FCandChill).sfc", 1048576, 0xe9f1ceb9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mariosupicte) +STD_ROM_FN(snes_Mariosupicte) + +struct BurnDriver BurnDrvsnes_Mariosupicte = { + "snes_mariosupicte", NULL, NULL, NULL, "2021", + "Mario's Super Picross (Hack, English v1.5)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "FCandChill", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MariosupicteRomInfo, snes_MariosupicteRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mario and Wario (Japan) + +static struct BurnRomInfo snes_MariowarioRomDesc[] = { + { "Mario and Wario (J)(1993)(Nintendo).sfc", 1048576, 0xc6695e34, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mariowario) +STD_ROM_FN(snes_Mariowario) + +struct BurnDriver BurnDrvsnes_Mariowario = { + "snes_mariowario", NULL, NULL, NULL, "1993", + "Mario and Wario (Japan)\0", "'SNES Mouse' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MariowarioRomInfo, snes_MariowarioRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseP1DIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marvelous: Mouhitotsu no Takarajima (Japan) + +static struct BurnRomInfo snes_MarvelousjRomDesc[] = { + { "Marvelous - Mouhitotsu no Takarajima (J)(1996)(Nintendo).sfc", 3145728, 0xcedf3ba7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Marvelousj) +STD_ROM_FN(snes_Marvelousj) + +struct BurnDriver BurnDrvsnes_Marvelousj = { + "snes_marvelousj", "snes_marvelouste", NULL, NULL, "1996", + "Marvelous: Mouhitotsu no Takarajima (Japan)\0", "SA-1 enhancement CPU", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_MarvelousjRomInfo, snes_MarvelousjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marvelous: Another Treasure Island (Hack, English v1.07) +// https://www.romhacking.net/translations/2558/ +static struct BurnRomInfo snes_MarvelousteRomDesc[] = { + { "Marvelous - Another Treasure Island T-Eng v1.07 (2018)(DackR).sfc", 4194304, 0x092a9db9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Marvelouste) +STD_ROM_FN(snes_Marvelouste) + +struct BurnDriver BurnDrvsnes_Marvelouste = { + "snes_marvelouste", NULL, NULL, NULL, "2018", + "Marvelous: Another Treasure Island (Hack, English v1.07)\0", "SA-1 enhancement CPU", "DackR", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_MarvelousteRomInfo, snes_MarvelousteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marvelous: Another Treasure Island (Hack, Spanish) +// https://www.romhacking.net/translations/3790/ +static struct BurnRomInfo snes_MarveloustsRomDesc[] = { + { "Marvelous - Another Treasure Island T-Spa (2018)(Crimental).sfc", 4194304, 0x4524b3cf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Marvelousts) +STD_ROM_FN(snes_Marvelousts) + +struct BurnDriver BurnDrvsnes_Marvelousts = { + "snes_marvelousts", "snes_marvelouste", NULL, NULL, "2018", + "Marvelous: Another Treasure Island (Hack, Spanish)\0", "SA-1 enhancement CPU", "Crimental", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_MarveloustsRomInfo, snes_MarveloustsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mask, The (USA) + +static struct BurnRomInfo snes_MaskRomDesc[] = { + { "Mask, The (U)(1995)(THQ - Black Pearl).sfc", 2097152, 0xe17626e2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mask) +STD_ROM_FN(snes_Mask) + +struct BurnDriver BurnDrvsnes_Mask = { + "snes_mask", NULL, NULL, NULL, "1995", + "Mask, The (USA)\0", NULL, "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MaskRomInfo, snes_MaskRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Matsumura Kuni Hiroden - Saikyou no Rekishi o Nurikaero! (Japan) + +static struct BurnRomInfo snes_MatsumuraRomDesc[] = { + { "Matsumura Kuni Hiroden - Saikyou no Rekishi o Nurikaero! (J)(1994)(Shouei).sfc", 3145728, 0x8f3da172, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Matsumura) +STD_ROM_FN(snes_Matsumura) + +struct BurnDriver BurnDrvsnes_Matsumura = { + "snes_matsumura", NULL, NULL, NULL, "1994", + "Matsumura Kuni Hiroden - Saikyou no Rekishi o Nurikaero! (Japan)\0", NULL, "Shouei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MatsumuraRomInfo, snes_MatsumuraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Maui Mallard in Cold Shadow (USA) + +static struct BurnRomInfo snes_MauimallardRomDesc[] = { + { "Maui Mallard in Cold Shadow (U)(1996)(Nintendo - Eurocom).sfc", 3145728, 0x2d3b9662, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mauimallard) +STD_ROM_FN(snes_Mauimallard) + +struct BurnDriver BurnDrvsnes_Mauimallard = { + "snes_mauimallard", NULL, NULL, NULL, "1996", + "Maui Mallard in Cold Shadow (USA)\0", NULL, "Nintendo - Eurocom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MauimallardRomInfo, snes_MauimallardRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donald in Maui Mallard (Euro) + +static struct BurnRomInfo snes_MauimallardeRomDesc[] = { + { "Donald in Maui Mallard (E)(1995)(Disney's Int. - Eurocom).sfc", 3145728, 0xd56c21a1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mauimallarde) +STD_ROM_FN(snes_Mauimallarde) + +struct BurnDriver BurnDrvsnes_Mauimallarde = { + "snes_mauimallarde", "snes_mauimallard", NULL, NULL, "1995", + "Donald in Maui Mallard (Euro)\0", NULL, "Disney's Int. - Eurocom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MauimallardeRomInfo, snes_MauimallardeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Donald no Maui Mallard (Japan) + +static struct BurnRomInfo snes_MauimallardjRomDesc[] = { + { "Donald no Maui Mallard (J)(1996)(Disney's Int. - Eurocom).sfc", 3145728, 0xd60a27a6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mauimallardj) +STD_ROM_FN(snes_Mauimallardj) + +struct BurnDriver BurnDrvsnes_Mauimallardj = { + "snes_mauimallardj", "snes_mauimallard", NULL, NULL, "1996", + "Donald no Maui Mallard (Japan)\0", NULL, "Disney's Int. - Eurocom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MauimallardjRomInfo, snes_MauimallardjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spider-Man and Venom: Maximum Carnage (USA) + +static struct BurnRomInfo snes_MaxcarnageRomDesc[] = { + { "Spider-Man and Venom - Maximum Carnage (U)(1994)(Ljn).sfc", 2097152, 0x7ef2bb0c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Maxcarnage) +STD_ROM_FN(snes_Maxcarnage) + +struct BurnDriver BurnDrvsnes_Maxcarnage = { + "snes_maxcarnage", NULL, NULL, NULL, "1994", + "Spider-Man and Venom: Maximum Carnage (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MaxcarnageRomInfo, snes_MaxcarnageRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mazinger Z (Japan) + +static struct BurnRomInfo snes_MazingerzRomDesc[] = { + { "Mazinger Z (J)(1993)(Bandai).sfc", 1048576, 0x202b3738, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mazingerz) +STD_ROM_FN(snes_Mazingerz) + +struct BurnDriver BurnDrvsnes_Mazingerz = { + "snes_mazingerz", NULL, NULL, NULL, "1993", + "Mazinger Z (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MazingerzRomInfo, snes_MazingerzRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mecarobot Golf (USA) + +static struct BurnRomInfo snes_MecagolfRomDesc[] = { + { "Mecarobot Golf (U)(1993)(Toho Co.).sfc", 1048576, 0x82ceee3a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mecagolf) +STD_ROM_FN(snes_Mecagolf) + +struct BurnDriver BurnDrvsnes_Mecagolf = { + "snes_mecagolf", NULL, NULL, NULL, "1993", + "Mecarobot Golf (USA)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_MecagolfRomInfo, snes_MecagolfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega lo Mania (Euro) + +static struct BurnRomInfo snes_MegalomaniaeRomDesc[] = { + { "Mega lo Mania (E)(1993)(Imagineer).sfc", 1048576, 0xe8042edf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megalomaniae) +STD_ROM_FN(snes_Megalomaniae) + +struct BurnDriver BurnDrvsnes_Megalomaniae = { + "snes_megalomaniae", NULL, NULL, NULL, "1993", + "Mega lo Mania (Euro)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_MegalomaniaeRomInfo, snes_MegalomaniaeRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega lo Mania - Jikuu Daisenryaku (Japan) + +static struct BurnRomInfo snes_MegalomaniajRomDesc[] = { + { "Mega lo Mania - Jikuu Daisenryaku (J)(1993)(Imagineer).sfc", 1048576, 0xf23bc69e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megalomaniaj) +STD_ROM_FN(snes_Megalomaniaj) + +struct BurnDriver BurnDrvsnes_Megalomaniaj = { + "snes_megalomaniaj", "snes_megalomaniae", NULL, NULL, "1993", + "Mega lo Mania - Jikuu Daisenryaku (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_MegalomaniajRomInfo, snes_MegalomaniajRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man 7 (USA) + +static struct BurnRomInfo snes_Megaman7RomDesc[] = { + { "Mega Man 7 (U)(1995)(Capcom).sfc", 2097152, 0x2d947536, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megaman7) +STD_ROM_FN(snes_Megaman7) + +struct BurnDriver BurnDrvsnes_Megaman7 = { + "snes_megaman7", NULL, NULL, NULL, "1995", + "Mega Man 7 (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Megaman7RomInfo, snes_Megaman7RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man X (USA) + +static struct BurnRomInfo snes_MegamanxRomDesc[] = { + { "Mega Man X (U)(1993)(Capcom).sfc", 1572864, 0xded53c64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megamanx) +STD_ROM_FN(snes_Megamanx) + +struct BurnDriver BurnDrvsnes_Megamanx = { + "snes_megamanx", NULL, NULL, NULL, "1993", + "Mega Man X (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MegamanxRomInfo, snes_MegamanxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man X2 (USA) + +static struct BurnRomInfo snes_Megamanx2RomDesc[] = { + { "Mega Man X2 (U)(1994)(Capcom).sfc", 1572864, 0x947b0355, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megamanx2) +STD_ROM_FN(snes_Megamanx2) + +struct BurnDriver BurnDrvsnes_Megamanx2 = { + "snes_megamanx2", NULL, NULL, NULL, "1994", + "Mega Man X2 (USA)\0", "CX4 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Megamanx2RomInfo, snes_Megamanx2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man X3 (USA) + +static struct BurnRomInfo snes_Megamanx3RomDesc[] = { + { "Mega Man X3 (U)(1995)(Capcom).sfc", 2097152, 0xfa0fe671, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megamanx3) +STD_ROM_FN(snes_Megamanx3) + +struct BurnDriver BurnDrvsnes_Megamanx3 = { + "snes_megamanx3", NULL, NULL, NULL, "1995", + "Mega Man X3 (USA)\0", "CX4 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Megamanx3RomInfo, snes_Megamanx3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man's Soccer (USA) + +static struct BurnRomInfo snes_MegamansoccerRomDesc[] = { + { "Megaman's Soccer (U)(1994)(Capcom).sfc", 1310720, 0xfa9ee2ce, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megamansoccer) +STD_ROM_FN(snes_Megamansoccer) + +struct BurnDriver BurnDrvsnes_Megamansoccer = { + "snes_megamansoccer", NULL, NULL, NULL, "1994", + "Mega Man's Soccer (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_MegamansoccerRomInfo, snes_MegamansoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Melfand Stories (Japan) + +static struct BurnRomInfo snes_MelfstoriesjRomDesc[] = { + { "Melfand Stories (J)(1994)(ASCII).sfc", 1572864, 0x0928fc15, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Melfstoriesj) +STD_ROM_FN(snes_Melfstoriesj) + +struct BurnDriver BurnDrvsnes_Melfstoriesj = { + "snes_melfstoriesj", "snes_melfstorieste", NULL, NULL, "1994", + "Melfand Stories (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MelfstoriesjRomInfo, snes_MelfstoriesjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Melfand Stories (Hack, English v1.1a) +// https://www.romhacking.net/translations/7209/ +static struct BurnRomInfo snes_MelfstoriesteRomDesc[] = { + { "Melfand Stories T-Eng v1.1a (2024)(Gan).sfc", 1572864, 0x55f1abf5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Melfstorieste) +STD_ROM_FN(snes_Melfstorieste) + +struct BurnDriver BurnDrvsnes_Melfstorieste = { + "snes_melfstorieste", NULL, NULL, NULL, "2024", + "Melfand Stories (Hack, English v1.1a)\0", NULL, "Gan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MelfstoriesteRomInfo, snes_MelfstoriesteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Combat - Falcon's Revenge (USA) + +static struct BurnRomInfo snes_MetalcombatRomDesc[] = { + { "Metal Combat - Falcon's Revenge (U)(1993)(Nintendo).sfc", 2097152, 0xc3131b49, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalcombat) +STD_ROM_FN(snes_Metalcombat) + +struct BurnDriver BurnDrvsnes_Metalcombat = { + "snes_metalcombat", NULL, NULL, NULL, "1993", + "Metal Combat - Falcon's Revenge (USA)\0", "'Super Scope' exclusive game / OBC-1 enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_MetalcombatRomInfo, snes_MetalcombatRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Combat - Falcon's Revenge (Euro) + +static struct BurnRomInfo snes_MetalcombateRomDesc[] = { + { "Metal Combat - Falcon's Revenge (E)(1993)(Nintendo).sfc", 2097152, 0xeb0039c4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalcombate) +STD_ROM_FN(snes_Metalcombate) + +struct BurnDriver BurnDrvsnes_Metalcombate = { + "snes_metalcombate", "snes_metalcombat", NULL, NULL, "1993", + "Metal Combat - Falcon's Revenge (Euro)\0", "'Super Scope' exclusive game / OBC-1 enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_MetalcombateRomInfo, snes_MetalcombateRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kikou Keisatsu: Metal Jack (Japan) + +static struct BurnRomInfo snes_MetaljackjRomDesc[] = { + { "Kikou Keisatsu Metal Jack (J)(1992)(Atlus Co.).sfc", 1048576, 0x5577de70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metaljackj) +STD_ROM_FN(snes_Metaljackj) + +struct BurnDriver BurnDrvsnes_Metaljackj = { + "snes_metaljackj", "snes_metaljackte", NULL, NULL, "1992", + "Kikou Keisatsu: Metal Jack (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MetaljackjRomInfo, snes_MetaljackjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Armored Police: Metal Jack (Hack, English v2.0) +// https://www.romhacking.net/translations/3596/ +static struct BurnRomInfo snes_MetaljackteRomDesc[] = { + { "Armored Police Metal Jack T-Eng v2.0 (2018)(MrRichard999).sfc", 1048576, 0x1b356ce3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metaljackte) +STD_ROM_FN(snes_Metaljackte) + +struct BurnDriver BurnDrvsnes_Metaljackte = { + "snes_metaljackte", NULL, NULL, NULL, "2018", + "Armored Police: Metal Jack (Hack, English v2.0)\0", NULL, "MrRichard999", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MetaljackteRomInfo, snes_MetaljackteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Max Returns (Japan) + +static struct BurnRomInfo snes_MetalmaxrjRomDesc[] = { + { "Metal Max Returns (J)(1995)(Data East).sfc", 4194304, 0x4396a35b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalmaxrj) +STD_ROM_FN(snes_Metalmaxrj) + +struct BurnDriver BurnDrvsnes_Metalmaxrj = { + "snes_metalmaxrj", "snes_metalmaxrte", NULL, NULL, "1995", + "Metal Max Returns (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MetalmaxrjRomInfo, snes_MetalmaxrjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Max Returns (Hack, English) +// https://aeongenesis.net/projects/mmr +static struct BurnRomInfo snes_MetalmaxrteRomDesc[] = { + { "Metal Max Returns T-Eng (2007)(Aeon Genesis).sfc", 4194304, 0xc76465a8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalmaxrte) +STD_ROM_FN(snes_Metalmaxrte) + +struct BurnDriver BurnDrvsnes_Metalmaxrte = { + "snes_metalmaxrte", NULL, NULL, NULL, "2007", + "Metal Max Returns (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MetalmaxrteRomInfo, snes_MetalmaxrteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Max Returns (Hack, Spanish) +// https://www.romhacking.net/translations/6634/ +static struct BurnRomInfo snes_MetalmaxrtsRomDesc[] = { + { "Metal Max Returns T-Spa (2022)(Max1323).sfc", 4194304, 0x6a6e3fc3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalmaxrts) +STD_ROM_FN(snes_Metalmaxrts) + +struct BurnDriver BurnDrvsnes_Metalmaxrts = { + "snes_metalmaxrts", "snes_metalmaxrte", NULL, NULL, "2022", + "Metal Max Returns (Hack, Spanish)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MetalmaxrtsRomInfo, snes_MetalmaxrtsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Morph (USA) + +static struct BurnRomInfo snes_MetalmorphRomDesc[] = { + { "Metal Morph (U)(1994)(FCI).sfc", 1572864, 0x0adaa9da, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalmorph) +STD_ROM_FN(snes_Metalmorph) + +struct BurnDriver BurnDrvsnes_Metalmorph = { + "snes_metalmorph", NULL, NULL, NULL, "1994", + "Metal Morph (USA)\0", NULL, "FCI Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_MetalmorphRomInfo, snes_MetalmorphRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Warriors (USA) + +static struct BurnRomInfo snes_MetalwarriorsRomDesc[] = { + { "Metal Warriors (U)(1994)(Konami - LucasArts).sfc", 2097152, 0xf2ab92d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metalwarriors) +STD_ROM_FN(snes_Metalwarriors) + +struct BurnDriver BurnDrvsnes_Metalwarriors = { + "snes_metalwarriors", NULL, NULL, NULL, "1994", + "Metal Warriors (USA)\0", NULL, "Konami - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_RUNGUN, 0, + SNESGetZipName, snes_MetalwarriorsRomInfo, snes_MetalwarriorsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Metal Marines (USA) + +static struct BurnRomInfo snes_MetmarinesRomDesc[] = { + { "Metal Marines (U)(1993)(Namco).sfc", 1572864, 0x66787df6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Metmarines) +STD_ROM_FN(snes_Metmarines) + +struct BurnDriver BurnDrvsnes_Metmarines = { + "snes_metmarines", NULL, NULL, NULL, "1993", + "Metal Marines (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_MetmarinesRomInfo, snes_MetmarinesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey no Magical Adventure (Japan) + +static struct BurnRomInfo snes_MickeymagicadvRomDesc[] = { + { "Mickey no Magical Adventure (J)(1992)(Capcom).sfc", 1048576, 0x453bd625, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeymagicadv) +STD_ROM_FN(snes_Mickeymagicadv) + +struct BurnDriver BurnDrvsnes_Mickeymagicadv = { + "snes_mickeymagicadv", "snes_magicalquest", NULL, NULL, "1992", + "Mickey no Magical Adventure (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MickeymagicadvRomInfo, snes_MickeymagicadvRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey to Minnie - Magical Adventure 2 (Japan) + +static struct BurnRomInfo snes_Mickeymagicadv2RomDesc[] = { + { "Mickey to Minnie - Magical Adventure 2 (J)(1994)(Capcom).sfc", 1572864, 0x8d258553, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeymagicadv2) +STD_ROM_FN(snes_Mickeymagicadv2) + +struct BurnDriver BurnDrvsnes_Mickeymagicadv2 = { + "snes_mickeymagicadv2", "snes_greatcircmyst", NULL, NULL, "1994", + "Mickey to Minnie - Magical Adventure 2 (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Mickeymagicadv2RomInfo, snes_Mickeymagicadv2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey to Donald - Magical Adventure 3 (Japan) + +static struct BurnRomInfo snes_Mickeymagicadv3RomDesc[] = { + { "Mickey to Donald - Magical Adventure 3 (J)(1995)(Capcom).sfc", 2097152, 0x32eea1e9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeymagicadv3) +STD_ROM_FN(snes_Mickeymagicadv3) + +struct BurnDriver BurnDrvsnes_Mickeymagicadv3 = { + "snes_mickeymagicadv3", "snes_magicquest3", NULL, NULL, "1995", + "Mickey to Donald - Magical Adventure 3 (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Mickeymagicadv3RomInfo, snes_Mickeymagicadv3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey Mania - The Timeless Adventures of Mickey Mouse (USA) + +static struct BurnRomInfo snes_MickeymaniaRomDesc[] = { + { "Mickey Mania - The Timeless Adventures of Mickey Mouse (U)(1994)(Sony Imagesoft).sfc", 2097152, 0x08806b5b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeymania) +STD_ROM_FN(snes_Mickeymania) + +struct BurnDriver BurnDrvsnes_Mickeymania = { + "snes_mickeymania", NULL, NULL, NULL, "1994", + "Mickey Mania - The Timeless Adventures of Mickey Mouse (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MickeymaniaRomInfo, snes_MickeymaniaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey no Tokyo Disneyland Daibouken (Japan) + +static struct BurnRomInfo snes_MickeytokyojRomDesc[] = { + { "Mickey no Tokyo Disneyland Daibouken (J)(1994)(Tomy).sfc", 1572864, 0xe235f0c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeytokyoj) +STD_ROM_FN(snes_Mickeytokyoj) + +struct BurnDriver BurnDrvsnes_Mickeytokyoj = { + "snes_mickeytokyoj", "snes_mickeytokyote", NULL, NULL, "1994", + "Mickey no Tokyo Disneyland Daibouken (Japan)\0", NULL, "Tomy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MickeytokyojRomInfo, snes_MickeytokyojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey's Great Adventure in Tokyo Disneyland (Hack, English) +// https://www.romhacking.net/translations/6400/ +static struct BurnRomInfo snes_MickeytokyoteRomDesc[] = { + { "Mickey's Great Adventure in Tokyo Disneyland T-Eng (2021)(Svambo).sfc", 1572864, 0x3cce65f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickeytokyote) +STD_ROM_FN(snes_Mickeytokyote) + +struct BurnDriver BurnDrvsnes_Mickeytokyote = { + "snes_mickeytokyote", NULL, NULL, NULL, "2021", + "Mickey's Great Adventure in Tokyo Disneyland (Hack, English)\0", NULL, "Svambo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MickeytokyoteRomInfo, snes_MickeytokyoteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mickey's Ultimate Challenge (USA) + +static struct BurnRomInfo snes_MickultchallRomDesc[] = { + { "Mickey's Ultimate Challenge (U)(1994)(Hi Tech Expressions).sfc", 1048576, 0xd6c60a84, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mickultchall) +STD_ROM_FN(snes_Mickultchall) + +struct BurnDriver BurnDrvsnes_Mickultchall = { + "snes_mickultchall", NULL, NULL, NULL, "1994", + "Mickey's Ultimate Challenge (USA)\0", NULL, "Hi Tech Expressions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_MickultchallRomInfo, snes_MickultchallRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Micro Machines (USA) + +static struct BurnRomInfo snes_MicromachinesRomDesc[] = { + { "Micro Machines (U)(1994)(Ocean).sfc", 524288, 0x364e68bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Micromachines) +STD_ROM_FN(snes_Micromachines) + +struct BurnDriver BurnDrvsnes_Micromachines = { + "snes_micromachines", NULL, NULL, NULL, "1994", + "Micro Machines (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MicromachinesRomInfo, snes_MicromachinesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Micro Machines 2 - Turbo Tournament (Euro) + +static struct BurnRomInfo snes_Micromachines2eRomDesc[] = { + { "Micro Machines 2 - Turbo Tournament (E)(1995)(Ocean).sfc", 1048576, 0x1619b619, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Micromachines2e) +STD_ROM_FN(snes_Micromachines2e) + +struct BurnDriver BurnDrvsnes_Micromachines2e = { + "snes_micromachines2e", NULL, NULL, NULL, "1995", + "Micro Machines 2 - Turbo Tournament (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Micromachines2eRomInfo, snes_Micromachines2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Micro Machines (Euro) + +static struct BurnRomInfo snes_MicromachineseRomDesc[] = { + { "Micro Machines (E)(1994)(Ocean).sfc", 524288, 0xb4f64a09, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Micromachinese) +STD_ROM_FN(snes_Micromachinese) + +struct BurnDriver BurnDrvsnes_Micromachinese = { + "snes_micromachinese", "snes_micromachines", NULL, NULL, "1994", + "Micro Machines (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MicromachineseRomInfo, snes_MicromachineseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Might and Magic III - Isles of Terra (USA) + +static struct BurnRomInfo snes_Mightmagic3RomDesc[] = { + { "Might and Magic III - Isles of Terra (U)(1994)(FCI).sfc", 1572864, 0x8af25e7e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mightmagic3) +STD_ROM_FN(snes_Mightmagic3) + +struct BurnDriver BurnDrvsnes_Mightmagic3 = { + "snes_mightmagic3", NULL, NULL, NULL, "1994", + "Might and Magic III - Isles of Terra (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "FCI Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Mightmagic3RomInfo, snes_Mightmagic3RomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Militia (Japan) + +static struct BurnRomInfo snes_MilitiaRomDesc[] = { + { "Militia (J)(1993)(Namco).sfc", 1572864, 0x96717f64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Militia) +STD_ROM_FN(snes_Militia) + +struct BurnDriver BurnDrvsnes_Militia = { + "snes_militia", "snes_metmarines", NULL, NULL, "1993", + "Militia (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_MilitiaRomInfo, snes_MilitiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mini Yonku Shining Scorpion - Let's & Go!! (Japan) + +static struct BurnRomInfo snes_MiniyonkujRomDesc[] = { + { "Mini Yonku Shining Scorpion - Let's & Go!! (J)(1996)(ASCII).sfc", 4194304, 0xb17e95d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Miniyonkuj) +STD_ROM_FN(snes_Miniyonkuj) + +struct BurnDriver BurnDrvsnes_Miniyonkuj = { + "snes_miniyonkuj", NULL, NULL, NULL, "1996", + "Mini Yonku Shining Scorpion - Let's & Go!! (Japan)\0", "SA-1 enhancement CPU", "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING | GBF_ADV, 0, + SNESGetZipName, snes_MiniyonkujRomInfo, snes_MiniyonkujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Miracle Girls (Japan) + +static struct BurnRomInfo snes_MiragirlsjRomDesc[] = { + { "Miracle Girls (J)(1993)(Takara).sfc", 1048576, 0xab82ebbe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Miragirlsj) +STD_ROM_FN(snes_Miragirlsj) + +struct BurnDriver BurnDrvsnes_Miragirlsj = { + "snes_miragirlsj", "snes_miragirlste", NULL, NULL, "1993", + "Miracle Girls (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_PLATFORM, 0, + SNESGetZipName, snes_MiragirlsjRomInfo, snes_MiragirlsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Miracle Girls (Hack, English v1.1) +// https://www.romhacking.net/translations/391/ +static struct BurnRomInfo snes_MiragirlsteRomDesc[] = { + { "Miracle Girls T-Eng v1.1 (2019)(RPGONE).sfc", 1048576, 0xae72d6fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Miragirlste) +STD_ROM_FN(snes_Miragirlste) + +struct BurnDriver BurnDrvsnes_Miragirlste = { + "snes_miragirlste", NULL, NULL, NULL, "2019", + "Miracle Girls (Hack, English v1.1)\0", NULL, "RPGONE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION | GBF_PLATFORM, 0, + SNESGetZipName, snes_MiragirlsteRomInfo, snes_MiragirlsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Michael Jordan - Chaos in the Windy City (USA) + +static struct BurnRomInfo snes_MjchaosRomDesc[] = { + { "Michael Jordan - Chaos in the Windy City (U)(1994)(Electronic Arts).sfc", 1310720, 0xf57dba3b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mjchaos) +STD_ROM_FN(snes_Mjchaos) + +struct BurnDriver BurnDrvsnes_Mjchaos = { + "snes_mjchaos", NULL, NULL, NULL, "1994", + "Michael Jordan - Chaos in the Windy City (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MjchaosRomInfo, snes_MjchaosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mortal Kombat (USA) + +static struct BurnRomInfo snes_MkRomDesc[] = { + { "Mortal Kombat (U)(1993)(Acclaim Entertainment).sfc", 2097152, 0x7ca113c9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mk) +STD_ROM_FN(snes_Mk) + +struct BurnDriver BurnDrvsnes_Mk = { + "snes_mk", NULL, NULL, NULL, "1993", + "Mortal Kombat (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MkRomInfo, snes_MkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mortal Kombat II (USA) + +static struct BurnRomInfo snes_MkiiRomDesc[] = { + { "Mortal Kombat II (U)(1994)(Acclaim Entertainment).sfc", 3145728, 0x70bb5513, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mkii) +STD_ROM_FN(snes_Mkii) + +struct BurnDriver BurnDrvsnes_Mkii = { + "snes_mkii", NULL, NULL, NULL, "1994", + "Mortal Kombat II (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MkiiRomInfo, snes_MkiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mortal Kombat II (USA, Alt) + +static struct BurnRomInfo snes_MkiiaRomDesc[] = { + { "Mortal Kombat II (U, Alt)(1994)(Acclaim Entertainment).sfc", 3145728, 0x1c3d3b72, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mkiia) +STD_ROM_FN(snes_Mkiia) + +struct BurnDriver BurnDrvsnes_Mkiia = { + "snes_mkiia", "snes_mkii", NULL, NULL, "1994", + "Mortal Kombat II (USA, Alt)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MkiiaRomInfo, snes_MkiiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mortal Kombat 3 (USA) + +static struct BurnRomInfo snes_Mk3RomDesc[] = { + { "Mortal Kombat 3 (U)(1995)(Williams).sfc", 4194304, 0x4e6af725, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mk3) +STD_ROM_FN(snes_Mk3) + +struct BurnDriver BurnDrvsnes_Mk3 = { + "snes_mk3", NULL, NULL, NULL, "1995", + "Mortal Kombat 3 (USA)\0", NULL, "Williams Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Mk3RomInfo, snes_Mk3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// MLBPA Baseball (USA) + +static struct BurnRomInfo snes_MlbpabbRomDesc[] = { + { "MLBPA Baseball (U)(1994)(Electronic Arts).sfc", 1048576, 0x62a92e57, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mlbpabb) +STD_ROM_FN(snes_Mlbpabb) + +struct BurnDriver BurnDrvsnes_Mlbpabb = { + "snes_mlbpabb", NULL, NULL, NULL, "1994", + "MLBPA Baseball (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_MlbpabbRomInfo, snes_MlbpabbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mighty Morphin Power Rangers (USA) + +static struct BurnRomInfo snes_MmprRomDesc[] = { + { "Mighty Morphin Power Rangers (U)(1994)(Bandai).sfc", 2097152, 0xa56eb77a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mmpr) +STD_ROM_FN(snes_Mmpr) + +struct BurnDriver BurnDrvsnes_Mmpr = { + "snes_mmpr", NULL, NULL, NULL, "1994", + "Mighty Morphin Power Rangers (USA)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MmprRomInfo, snes_MmprRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mighty Morphin Power Rangers - The Fighting Edition (USA) + +static struct BurnRomInfo snes_MmprfeRomDesc[] = { + { "Mighty Morphin Power Rangers - The Fighting Edition (U)(1995)(Bandai).sfc", 1572864, 0x460b0a60, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mmprfe) +STD_ROM_FN(snes_Mmprfe) + +struct BurnDriver BurnDrvsnes_Mmprfe = { + "snes_mmprfe", NULL, NULL, NULL, "1995", + "Mighty Morphin Power Rangers - The Fighting Edition (USA)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MmprfeRomInfo, snes_MmprfeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mighty Morphin Power Rangers - The Movie (USA) + +static struct BurnRomInfo snes_MmprmovieRomDesc[] = { + { "Mighty Morphin Power Rangers - The Movie (U)(1995)(Bandai).sfc", 1572864, 0xe3ef6201, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mmprmovie) +STD_ROM_FN(snes_Mmprmovie) + +struct BurnDriver BurnDrvsnes_Mmprmovie = { + "snes_mmprmovie", NULL, NULL, NULL, "1995", + "Mighty Morphin Power Rangers - The Movie (USA)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_MmprmovieRomInfo, snes_MmprmovieRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mohawk & Headphone Jack (USA) + +static struct BurnRomInfo snes_MohawkhpjRomDesc[] = { + { "Mohawk & Headphone Jack (U)(1995)(THQ - Black Pearl).sfc", 2097152, 0x0b207e7f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mohawkhpj) +STD_ROM_FN(snes_Mohawkhpj) + +struct BurnDriver BurnDrvsnes_Mohawkhpj = { + "snes_mohawkhpj", NULL, NULL, NULL, "1996", + "Mohawk & Headphone Jack (USA)\0", NULL, "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MohawkhpjRomInfo, snes_MohawkhpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Monstania (Japan) + +static struct BurnRomInfo snes_MonstaniajRomDesc[] = { + { "Monstania (J)(1996)(Pack-In-Video).sfc", 2621440, 0xf3887022, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Monstaniaj) +STD_ROM_FN(snes_Monstaniaj) + +struct BurnDriver BurnDrvsnes_Monstaniaj = { + "snes_monstaniaj", "snes_monstaniate", NULL, NULL, "1996", + "Monstania (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_MonstaniajRomInfo, snes_MonstaniajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Monstania (Hack, English v1.03) +// https://www.romhacking.net/translations/392/ +static struct BurnRomInfo snes_MonstaniateRomDesc[] = { + { "Monstania T-Eng v1.03 (2001)(Aeon Genesis).sfc", 3146240, 0xf548cd17, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Monstaniate) +STD_ROM_FN(snes_Monstaniate) + +struct BurnDriver BurnDrvsnes_Monstaniate = { + "snes_monstaniate", NULL, NULL, NULL, "2001", + "Monstania (Hack, English v1.03)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_MonstaniateRomInfo, snes_MonstaniateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Monstania (Hack, Spanish v0.9) +// https://traduccioneslukas.blogspot.com/2015/02/de-novias-y-monstruos.html +static struct BurnRomInfo snes_MonstaniatsRomDesc[] = { + { "Monstania T-Spa v0.9 (2015)(Lukas).sfc", 3145728, 0x73b140d1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Monstaniats) +STD_ROM_FN(snes_Monstaniats) + +struct BurnDriver BurnDrvsnes_Monstaniats = { + "snes_monstaniats", "snes_monstaniate", NULL, NULL, "2015", + "Monstania (Hack, Spanish v0.9)\0", NULL, "Lukas", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_MonstaniatsRomInfo, snes_MonstaniatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mother 2 - Gyiyg no Gyakushuu (Japan) + +static struct BurnRomInfo snes_Mother2RomDesc[] = { + { "Mother 2 - Gyiyg no Gyakushuu (J)(1994)(Nintendo).sfc", 3145728, 0x2019fabe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mother2) +STD_ROM_FN(snes_Mother2) + +struct BurnDriver BurnDrvsnes_Mother2 = { + "snes_mother2", "snes_earthbound", NULL, NULL, "1994", + "Mother 2 - Gyiyg no Gyakushuu (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Mother2RomInfo, snes_Mother2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mountain Bike Rally (USA) + +static struct BurnRomInfo snes_MountbikerallyRomDesc[] = { + { "Mountain Bike Rally (U)(1995)(Radical Entertainment).sfc", 2097152, 0xe6ede101, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mountbikerally) +STD_ROM_FN(snes_Mountbikerally) + +struct BurnDriver BurnDrvsnes_Mountbikerally = { + "snes_mountbikerally", NULL, NULL, NULL, "1995", + "Mountain Bike Rally (USA)\0", NULL, "Radical Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MountbikerallyRomInfo, snes_MountbikerallyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Bloopy - Saves the World (USA, Prototype) + +static struct BurnRomInfo snes_MrbloopypRomDesc[] = { + { "Mr. Bloopy - Saves the World (U, Proto)(1994)(Rare - Compedia).sfc", 2097152, 0xdde9a760, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrbloopyp) +STD_ROM_FN(snes_Mrbloopyp) + +struct BurnDriver BurnDrvsnes_Mrbloopyp = { + "snes_mrbloopyp", NULL, NULL, NULL, "1994", + "Mr. Bloopy - Saves the World (USA, Prototype)\0", NULL, "Rare - Compedia", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_MrbloopypRomInfo, snes_MrbloopypRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Do! (Japan) + +static struct BurnRomInfo snes_MrdojRomDesc[] = { + { "Mr. Do! (J)(1995)(Imagineer).sfc", 262144, 0x3847cf64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrdoj) +STD_ROM_FN(snes_Mrdoj) + +struct BurnDriver BurnDrvsnes_Mrdoj = { + "snes_mrdoj", NULL, NULL, NULL, "1995", + "Mr. Do! (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_MrdojRomInfo, snes_MrdojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Nutz (USA) + +static struct BurnRomInfo snes_MrnutzRomDesc[] = { + { "Mr. Nutz (U)(1994)(Ocean).sfc", 1048576, 0xa99bdd9a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrnutz) +STD_ROM_FN(snes_Mrnutz) + +struct BurnDriver BurnDrvsnes_Mrnutz = { + "snes_mrnutz", NULL, NULL, NULL, "1994", + "Mr. Nutz (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MrnutzRomInfo, snes_MrnutzRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Tuff (Euro, Prototype) + +static struct BurnRomInfo snes_MrtuffepRomDesc[] = { + { "Mr. Tuff (E, Proto)(1995)(Ocean).sfc", 1572864, 0x83f87bb7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrtuffep) +STD_ROM_FN(snes_Mrtuffep) + +struct BurnDriver BurnDrvsnes_Mrtuffep = { + "snes_mrtuffep", NULL, NULL, NULL, "1995", + "Mr. Tuff (Euro, Prototype)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MrtuffepRomInfo, snes_MrtuffepRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marvel Super Heroes in War of the Gems (USA) + +static struct BurnRomInfo snes_MshwargemsRomDesc[] = { + { "Marvel Super Heroes in War of the Gems (U)(1996)(Capcom).sfc", 2097152, 0x00af56e8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mshwargems) +STD_ROM_FN(snes_Mshwargems) + +struct BurnDriver BurnDrvsnes_Mshwargems = { + "snes_mshwargems", NULL, NULL, NULL, "1996", + "Marvel Super Heroes in War of the Gems (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MshwargemsRomInfo, snes_MshwargemsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Marvel Super Heroes - War of the Gems (Japan) + +static struct BurnRomInfo snes_MshwargemsjRomDesc[] = { + { "Marvel Super Heroes - War of the Gems (J)(1996)(Capcom).sfc", 2097152, 0xab628c0c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mshwargemsj) +STD_ROM_FN(snes_Mshwargemsj) + +struct BurnDriver BurnDrvsnes_Mshwargemsj = { + "snes_mshwargemsj", "snes_mshwargems", NULL, NULL, "1996", + "Marvel Super Heroes - War of the Gems (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MshwargemsjRomInfo, snes_MshwargemsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ms. Pac-Man (USA) + +static struct BurnRomInfo snes_MspacmanRomDesc[] = { + { "Ms. Pac-Man (U)(1996)(Williams).sfc", 262144, 0x74d210d3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mspacman) +STD_ROM_FN(snes_Mspacman) + +struct BurnDriver BurnDrvsnes_Mspacman = { + "snes_mspacman", NULL, NULL, NULL, "1996", + "Ms. Pac-Man (USA)\0", NULL, "Williams Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_MspacmanRomInfo, snes_MspacmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Muscle Bomber - The Body Explosion (Japan) + +static struct BurnRomInfo snes_MusclebomberRomDesc[] = { + { "Muscle Bomber - The Body Explosion (J)(1994)(Capcom).sfc", 3145728, 0xa6e028c2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Musclebomber) +STD_ROM_FN(snes_Musclebomber) + +struct BurnDriver BurnDrvsnes_Musclebomber = { + "snes_musclebomber", "snes_slammasters", NULL, NULL, "1994", + "Muscle Bomber - The Body Explosion (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MusclebomberRomInfo, snes_MusclebomberRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Musya - The Classic Japanese Tale of Horror (USA) + +static struct BurnRomInfo snes_MusyaRomDesc[] = { + { "Musya - The Classic Japanese Tale of Horror (U)(1992)(Seta).sfc", 1048576, 0x011907a4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Musya) +STD_ROM_FN(snes_Musya) + +struct BurnDriver BurnDrvsnes_Musya = { + "snes_musya", NULL, NULL, NULL, "1992", + "Musya - The Classic Japanese Tale of Horror (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_MusyaRomInfo, snes_MusyaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// MechWarrior 3050 (USA) + +static struct BurnRomInfo snes_Mw3050RomDesc[] = { + { "MechWarrior 3050 (U)(1995)(Activision).sfc", 1572864, 0xc0acc92d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mw3050) +STD_ROM_FN(snes_Mw3050) + +struct BurnDriver BurnDrvsnes_Mw3050 = { + "snes_mw3050", NULL, NULL, NULL, "1995", + "MechWarrior 3050 (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SIM | GBF_SHOOT, 0, + SNESGetZipName, snes_Mw3050RomInfo, snes_Mw3050RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fushigi no Dungeon 2 - Fuurai no Shiren (Japan) + +static struct BurnRomInfo snes_Mystdung2jRomDesc[] = { + { "Fushigi no Dungeon 2 - Fuurai no Shiren (J)(1995)(Chun Soft).sfc", 4194304, 0xaf5703ee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mystdung2j) +STD_ROM_FN(snes_Mystdung2j) + +struct BurnDriver BurnDrvsnes_Mystdung2j = { + "snes_mystdung2j", "snes_mystdung2te", NULL, NULL, "1995", + "Fushigi no Dungeon 2 - Fuurai no Shiren (Japan)\0", NULL, "Chun Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_Mystdung2jRomInfo, snes_Mystdung2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mysterious Dungeon 2 - Shiren the Wanderer (Hack, English) +// https://www.romhacking.net/translations/483/ +static struct BurnRomInfo snes_Mystdung2teRomDesc[] = { + { "Mysterious Dungeon 2 - Shiren the Wanderer T-Eng (2006)(Aeon Genesis).sfc", 4194304, 0xf9789079, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mystdung2te) +STD_ROM_FN(snes_Mystdung2te) + +struct BurnDriver BurnDrvsnes_Mystdung2te = { + "snes_mystdung2te", NULL, NULL, NULL, "2006", + "Mysterious Dungeon 2 - Shiren the Wanderer (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_Mystdung2teRomInfo, snes_Mystdung2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mazmorra Misteriosa 2 - Shiren al Vagabundo (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/483/ +static struct BurnRomInfo snes_Mystdung2tsRomDesc[] = { + { "Mazmorra Misteriosa 2 - Shiren al Vagabundo T-Spa v1.1 (2024)(semco).sfc", 4194304, 0x2d75818b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mystdung2ts) +STD_ROM_FN(snes_Mystdung2ts) + +struct BurnDriver BurnDrvsnes_Mystdung2ts = { + "snes_mystdung2ts", "snes_mystdung2te", NULL, NULL, "2024", + "Mazmorra Misteriosa 2 - Shiren al Vagabundo (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_Mystdung2tsRomInfo, snes_Mystdung2tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mystic Ark (Japan) + +static struct BurnRomInfo snes_MysticarkjRomDesc[] = { + { "Mystic Ark (J)(1995)(Enix).sfc", 4194304, 0xfeb80589, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mysticarkj) +STD_ROM_FN(snes_Mysticarkj) + +struct BurnDriver BurnDrvsnes_Mysticarkj = { + "snes_mysticarkj", "snes_mysticarkte", NULL, NULL, "1995", + "Mystic Ark (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MysticarkjRomInfo, snes_MysticarkjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mystic Ark (Hack, English v1.01) +// https://www.romhacking.net/translations/1429/ +static struct BurnRomInfo snes_MysticarkteRomDesc[] = { + { "Mystic Ark T-Eng v1.01 (2009)(Aeon Genesis).sfc", 4194304, 0x8dabaedc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mysticarkte) +STD_ROM_FN(snes_Mysticarkte) + +struct BurnDriver BurnDrvsnes_Mysticarkte = { + "snes_mysticarkte", NULL, NULL, NULL, "2009", + "Mystic Ark (Hack, English v1.01)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_MysticarkteRomInfo, snes_MysticarkteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nangoku Shounen Papuwa-kun (Japan) + +static struct BurnRomInfo snes_NangokujRomDesc[] = { + { "Nangoku Shounen Papuwa-kun (J)(1994)(Enix).sfc", 1048576, 0x8bda9255, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nangokuj) +STD_ROM_FN(snes_Nangokuj) + +struct BurnDriver BurnDrvsnes_Nangokuj = { + "snes_nangokuj", NULL, NULL, NULL, "1994", + "Nangoku Shounen Papuwa-kun (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_NangokujRomInfo, snes_NangokujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Natsuki Crisis Battle (Japan) + +static struct BurnRomInfo snes_NatsukicbRomDesc[] = { + { "Natsuki Crisis Battle (J)(1995)(Angel-Bandai).sfc", 2621440, 0x97727818, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Natsukicb) +STD_ROM_FN(snes_Natsukicb) + +struct BurnDriver BurnDrvsnes_Natsukicb = { + "snes_natsukicb", NULL, NULL, NULL, "1995", + "Natsuki Crisis Battle (Japan)\0", NULL, "Angel(Bandai)", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_NatsukicbRomInfo, snes_NatsukicbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NBA Hang Time (USA) + +static struct BurnRomInfo snes_NbahangtimeRomDesc[] = { + { "NBA Hang Time (U)(1996)(Midway).sfc", 3145728, 0x262ce76b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nbahangtime) +STD_ROM_FN(snes_Nbahangtime) + +struct BurnDriver BurnDrvsnes_Nbahangtime = { + "snes_nbahangtime", NULL, NULL, NULL, "1996", + "NBA Hang Time (USA)\0", NULL, "Midway", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NbahangtimeRomInfo, snes_NbahangtimeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NBA Jam (USA) + +static struct BurnRomInfo snes_NbajamRomDesc[] = { + { "NBA Jam (U)(1993)(Acclaim Entertainment).sfc", 2097152, 0x8f42cae7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nbajam) +STD_ROM_FN(snes_Nbajam) + +struct BurnDriver BurnDrvsnes_Nbajam = { + "snes_nbajam", NULL, NULL, NULL, "1993", + "NBA Jam (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NbajamRomInfo, snes_NbajamRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NBA Jam - Tournament Edition (USA) + +static struct BurnRomInfo snes_NbajamteRomDesc[] = { + { "NBA Jam - Tournament Edition (U)(1994)(Acclaim Entertainment).sfc", 3145728, 0x1fbc1ddb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nbajamte) +STD_ROM_FN(snes_Nbajamte) + +struct BurnDriver BurnDrvsnes_Nbajamte = { + "snes_nbajamte", NULL, NULL, NULL, "1994", + "NBA Jam - Tournament Edition (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NbajamteRomInfo, snes_NbajamteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NBA Showdown (USA) + +static struct BurnRomInfo snes_NbashowdownRomDesc[] = { + { "NBA Showdown (U)(1993)(Electronic Arts).sfc", 1048576, 0x65746f02, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nbashowdown) +STD_ROM_FN(snes_Nbashowdown) + +struct BurnDriver BurnDrvsnes_Nbashowdown = { + "snes_nbashowdown", NULL, NULL, NULL, "1993", + "NBA Showdown (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NbashowdownRomInfo, snes_NbashowdownRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NCAA Basketball (USA) + +static struct BurnRomInfo snes_NcaabasketballRomDesc[] = { + { "NCAA Basketball (U)(1992)(Nintendo).sfc", 1048576, 0x200370a2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ncaabasketball) +STD_ROM_FN(snes_Ncaabasketball) + +struct BurnDriver BurnDrvsnes_Ncaabasketball = { + "snes_ncaabasketball", NULL, NULL, NULL, "1992", + "NCAA Basketball (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NcaabasketballRomInfo, snes_NcaabasketballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// New Horizons (USA) + +static struct BurnRomInfo snes_NewhorizonsRomDesc[] = { + { "New Horizons (U)(1994)(Koei).sfc", 2097152, 0x3c3c63e6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Newhorizons) +STD_ROM_FN(snes_Newhorizons) + +struct BurnDriver BurnDrvsnes_Newhorizons = { + "snes_newhorizons", NULL, NULL, NULL, "1994", + "New Horizons (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_NewhorizonsRomInfo, snes_NewhorizonsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// New Yatterman - Nandai Kandai Yajirobee (Japan) + +static struct BurnRomInfo snes_NewyattermanRomDesc[] = { + { "New Yatterman - Nandai Kandai Yajirobee (J)(1996)(Yutaka).sfc", 1572864, 0xfacc2423, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Newyatterman) +STD_ROM_FN(snes_Newyatterman) + +struct BurnDriver BurnDrvsnes_Newyatterman = { + "snes_newyatterman", NULL, NULL, NULL, "1996", + "New Yatterman - Nandai Kandai Yajirobee (Japan)\0", NULL, "Yutaka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_NewyattermanRomInfo, snes_NewyattermanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NFL Football (USA) + +static struct BurnRomInfo snes_NflfbRomDesc[] = { + { "NFL Football (U)(1993)(Konami).sfc", 1048576, 0xadb7731b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nflfb) +STD_ROM_FN(snes_Nflfb) + +struct BurnDriver BurnDrvsnes_Nflfb = { + "snes_nflfb", NULL, NULL, NULL, "1993", + "NFL Football (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NflfbRomInfo, snes_NflfbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NFL Quarterback Club (USA) + +static struct BurnRomInfo snes_NflqcRomDesc[] = { + { "NFL Quarterback Club (U)(1994)(Ljn).sfc", 3145728, 0x79f16421, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nflqc) +STD_ROM_FN(snes_Nflqc) + +struct BurnDriver BurnDrvsnes_Nflqc = { + "snes_nflqc", NULL, NULL, NULL, "1994", + "NFL Quarterback Club (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_NflqcRomInfo, snes_NflqcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NFL Quarterback Club '96 (USA) + +static struct BurnRomInfo snes_Nflqc96RomDesc[] = { + { "NFL Quarterback Club '96 (U)(1995)(Acclaim Entertainment).sfc", 3145728, 0xe557689f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nflqc96) +STD_ROM_FN(snes_Nflqc96) + +struct BurnDriver BurnDrvsnes_Nflqc96 = { + "snes_nflqc96", NULL, NULL, NULL, "1995", + "NFL Quarterback Club '96 (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 5, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Nflqc96RomInfo, snes_Nflqc96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NHL '94 (USA) + +static struct BurnRomInfo snes_Nhl94RomDesc[] = { + { "NHL '94 (U)(1993)(Electronic Arts).sfc", 1048576, 0x42212a77, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nhl94) +STD_ROM_FN(snes_Nhl94) + +struct BurnDriver BurnDrvsnes_Nhl94 = { + "snes_nhl94", NULL, NULL, NULL, "1993", + "NHL '94 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Nhl94RomInfo, snes_Nhl94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NHL '95 (USA) + +static struct BurnRomInfo snes_Nhl95RomDesc[] = { + { "NHL '95 (U)(1994)(Electronic Arts).sfc", 1048576, 0x2e9b1463, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nhl95) +STD_ROM_FN(snes_Nhl95) + +struct BurnDriver BurnDrvsnes_Nhl95 = { + "snes_nhl95", NULL, NULL, NULL, "1994", + "NHL '95 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Nhl95RomInfo, snes_Nhl95RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NHL '96 (USA) + +static struct BurnRomInfo snes_Nhl96RomDesc[] = { + { "NHL '96 (U)(1995)(Electronic Arts).sfc", 1572864, 0xb6c6e7f3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nhl96) +STD_ROM_FN(snes_Nhl96) + +struct BurnDriver BurnDrvsnes_Nhl96 = { + "snes_nhl96", NULL, NULL, NULL, "1995", + "NHL '96 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Nhl96RomInfo, snes_Nhl96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// NHL '97 (USA) + +static struct BurnRomInfo snes_Nhl97RomDesc[] = { + { "NHL '97 (U)(1996)(Electronic Arts).sfc", 1572864, 0x4f72aa8c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nhl97) +STD_ROM_FN(snes_Nhl97) + +struct BurnDriver BurnDrvsnes_Nhl97 = { + "snes_nhl97", NULL, NULL, NULL, "1996", + "NHL '97 (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Nhl97RomInfo, snes_Nhl97RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nigel Mansell's World Championship Racing (USA) + +static struct BurnRomInfo snes_NigelmansellRomDesc[] = { + { "Nigel Mansell's World Championship Racing (U)(1993)(GameTek - Gremlin Graphics).sfc", 1048576, 0x162252e2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nigelmansell) +STD_ROM_FN(snes_Nigelmansell) + +struct BurnDriver BurnDrvsnes_Nigelmansell = { + "snes_nigelmansell", NULL, NULL, NULL, "1993", + "Nigel Mansell's World Championship Racing (USA)\0", NULL, "GameTek - Gremlin Graphics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_NigelmansellRomInfo, snes_NigelmansellRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Nightmare Busters (Euro) + +static struct BurnRomInfo snes_NightbustRomDesc[] = { + { "Nightmare Busters (E)(1995)(Arcade Zone).sfc", 1048576, 0x5327c524, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nightbust) +STD_ROM_FN(snes_Nightbust) + +struct BurnDriver BurnDrvsnes_Nightbust = { + "snes_nightbust", NULL, NULL, NULL, "1995", + "Nightmare Busters (Euro)\0", NULL, "Arcade Zone", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_NightbustRomInfo, snes_NightbustRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ninja Gaiden Trilogy (USA) + +static struct BurnRomInfo snes_NinjagaidentrilRomDesc[] = { + { "Ninja Gaiden Trilogy (U)(1995)(Tecmo).sfc", 1572864, 0x066fe797, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ninjagaidentril) +STD_ROM_FN(snes_Ninjagaidentril) + +struct BurnDriver BurnDrvsnes_Ninjagaidentril = { + "snes_ninjagaidentril", NULL, NULL, NULL, "1995", + "Ninja Gaiden Trilogy (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_NinjagaidentrilRomInfo, snes_NinjagaidentrilRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ninja Ryuuken Den Tomoe (Japan) + +static struct BurnRomInfo snes_NinjaryuukenRomDesc[] = { + { "Ninja Ryuuken Den Tomoe (J)(1995)(Tecmo).sfc", 1572864, 0x5995cf46, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ninjaryuuken) +STD_ROM_FN(snes_Ninjaryuuken) + +struct BurnDriver BurnDrvsnes_Ninjaryuuken = { + "snes_ninjaryuuken", "snes_ninjagaidentril", NULL, NULL, "1995", + "Ninja Ryuuken Den Tomoe (Japan)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_NinjaryuukenRomInfo, snes_NinjaryuukenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shounen Ninja Sasuke (Japan) + +static struct BurnRomInfo snes_NinjasasukeRomDesc[] = { + { "Shounen Ninja Sasuke (J)(1994)(Sunsoft).sfc", 1572864, 0xc2d10e95, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ninjasasuke) +STD_ROM_FN(snes_Ninjasasuke) + +struct BurnDriver BurnDrvsnes_Ninjasasuke = { + "snes_ninjasasuke", NULL, NULL, NULL, "1994", + "Shounen Ninja Sasuke (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_NinjasasukeRomInfo, snes_NinjasasukeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ninjawarriors (USA) + +static struct BurnRomInfo snes_NinjawarriorsRomDesc[] = { + { "Ninjawarriors (U)(1994)(Taito - Natsume).sfc", 1572864, 0x7537d8d7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ninjawarriors) +STD_ROM_FN(snes_Ninjawarriors) + +struct BurnDriver BurnDrvsnes_Ninjawarriors = { + "snes_ninjawarriors", NULL, NULL, NULL, "1994", + "Ninjawarriors (USA)\0", NULL, "Taito - Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_NinjawarriorsRomInfo, snes_NinjawarriorsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ninjawarriors Again, The (Japan) + +static struct BurnRomInfo snes_NinjawarriorsjRomDesc[] = { + { "Ninjawarriors Again, The (J)(1994)(Taito - Natsume).sfc", 1572864, 0x3bc037b6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ninjawarriorsj) +STD_ROM_FN(snes_Ninjawarriorsj) + +struct BurnDriver BurnDrvsnes_Ninjawarriorsj = { + "snes_ninjawarriorsj", "snes_ninjawarriors", NULL, NULL, "1994", + "Ninjawarriors Again, The (Japan)\0", NULL, "Taito Corp. - Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_NinjawarriorsjRomInfo, snes_NinjawarriorsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nitropunks - Might Heads (Japan) + +static struct BurnRomInfo snes_NitropunksRomDesc[] = { + { "Nitropunks - Might Heads (J)(1993)(Irem Corp.).sfc", 1048576, 0x5d8426e9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nitropunks) +STD_ROM_FN(snes_Nitropunks) + +struct BurnDriver BurnDrvsnes_Nitropunks = { + "snes_nitropunks", "snes_rockyrodent", NULL, NULL, "1993", + "Nitropunks - Might Heads (Japan)\0", NULL, "Irem Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_NitropunksRomInfo, snes_NitropunksRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nobunaga's Ambition - Lord of Darkness (USA) + +static struct BurnRomInfo snes_NobunagalodRomDesc[] = { + { "Nobunaga's Ambition - Lord of Darkness (U)(1994)(Koei).sfc", 1048576, 0x4d7b39cd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nobunagalod) +STD_ROM_FN(snes_Nobunagalod) + +struct BurnDriver BurnDrvsnes_Nobunagalod = { + "snes_nobunagalod", NULL, NULL, NULL, "1994", + "Nobunaga's Ambition - Lord of Darkness (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_NobunagalodRomInfo, snes_NobunagalodRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Nobunaga no Yabou - Bushou Fuuunroku (Japan) + +static struct BurnRomInfo snes_NobunagalodjRomDesc[] = { + { "Super Nobunaga no Yabou - Bushou Fuuunroku (J)(1991)(Koei).sfc", 1048576, 0xe42ca25a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nobunagalodj) +STD_ROM_FN(snes_Nobunagalodj) + +struct BurnDriver BurnDrvsnes_Nobunagalodj = { + "snes_nobunagalodj", "snes_nobunagalod", NULL, NULL, "1991", + "Super Nobunaga no Yabou - Bushou Fuuunroku (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_NobunagalodjRomInfo, snes_NobunagalodjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Nobunaga no Yabou - Zenkoku Ban (Japan) + +static struct BurnRomInfo snes_NobunagajRomDesc[] = { + { "Super Nobunaga no Yabou - Zenkoku Ban (J)(1993)(Koei).sfc", 524288, 0x072807ce, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nobunagaj) +STD_ROM_FN(snes_Nobunagaj) + +struct BurnDriver BurnDrvsnes_Nobunagaj = { + "snes_nobunagaj", "snes_nobunagas", NULL, NULL, "1993", + "Super Nobunaga no Yabou - Zenkoku Ban (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_NobunagajRomInfo, snes_NobunagajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nobunaga's Ambition (USA) + +static struct BurnRomInfo snes_NobunagasRomDesc[] = { + { "Nobunaga's Ambition (U)(1993)(Koei).sfc", 524288, 0x49da3583, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nobunagas) +STD_ROM_FN(snes_Nobunagas) + +struct BurnDriver BurnDrvsnes_Nobunagas = { + "snes_nobunagas", NULL, NULL, NULL, "1993", + "Nobunaga's Ambition (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_NobunagasRomInfo, snes_NobunagasRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// No Escape (USA) + +static struct BurnRomInfo snes_NoescapeRomDesc[] = { + { "No Escape (U)(1994)(Sony Imagesoft).sfc", 2097152, 0xc1082880, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Noescape) +STD_ROM_FN(snes_Noescape) + +struct BurnDriver BurnDrvsnes_Noescape = { + "snes_noescape", NULL, NULL, NULL, "1994", + "No Escape (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_NoescapeRomInfo, snes_NoescapeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nosferatu (USA) + +static struct BurnRomInfo snes_NosferatuRomDesc[] = { + { "Nosferatu (U)(1995)(Seta).sfc", 2097152, 0xde762764, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nosferatu) +STD_ROM_FN(snes_Nosferatu) + +struct BurnDriver BurnDrvsnes_Nosferatu = { + "snes_nosferatu", NULL, NULL, NULL, "1995", + "Nosferatu (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_NosferatuRomInfo, snes_NosferatuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nosferatu (Japan) + +static struct BurnRomInfo snes_NosferatujRomDesc[] = { + { "Nosferatu (J)(1994)(Seta Co.).sfc", 2097152, 0x2c5df175, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nosferatuj) +STD_ROM_FN(snes_Nosferatuj) + +struct BurnDriver BurnDrvsnes_Nosferatuj = { + "snes_nosferatuj", "snes_nosferatu", NULL, NULL, "1994", + "Nosferatu (Japan)\0", NULL, "Seta Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_NosferatujRomInfo, snes_NosferatujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Obitus (USA) + +static struct BurnRomInfo snes_ObitusRomDesc[] = { + { "Obitus (U)(1993)(Bullet Proof Software).sfc", 1048576, 0x7c495b36, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Obitus) +STD_ROM_FN(snes_Obitus) + +struct BurnDriver BurnDrvsnes_Obitus = { + "snes_obitus", NULL, NULL, NULL, "1993", + "Obitus (USA)\0", NULL, "Bullet Proof Software - Psygnosis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG | GBF_MAZE, 0, + SNESGetZipName, snes_ObitusRomInfo, snes_ObitusRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ogre Battle - The March of the Black Queen (USA) + +static struct BurnRomInfo snes_OgrebattleRomDesc[] = { + { "Ogre Battle - The March of the Black Queen (U)(1994)(Enix America).sfc", 1572864, 0xacfdb7b8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ogrebattle) +STD_ROM_FN(snes_Ogrebattle) + +struct BurnDriver BurnDrvsnes_Ogrebattle = { + "snes_ogrebattle", NULL, NULL, NULL, "1994", + "Ogre Battle - The March of the Black Queen (USA)\0", NULL, "Enix America", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_OgrebattleRomInfo, snes_OgrebattleRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Olivia no Mystery (Japan) + +static struct BurnRomInfo snes_OlivmystjRomDesc[] = { + { "Olivia no Mystery (Japan)(1993)(Altron).sfc", 1048576, 0x0dfde2aa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Olivmystj) +STD_ROM_FN(snes_Olivmystj) + +struct BurnDriver BurnDrvsnes_Olivmystj = { + "snes_olivmystj", "snes_olivmystte", NULL, NULL, "1993", + "Olivia no Mystery (Japan)\0", NULL, "Altron", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_OlivmystjRomInfo, snes_OlivmystjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Olivia's Mystery (Hack, English) +// https://www.romhacking.net/translations/7335/ +static struct BurnRomInfo snes_OlivmystteRomDesc[] = { + { "Olivia's Mystery T-Eng (2024)(alasker1899).sfc", 1048576, 0x5a51a43f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Olivmystte) +STD_ROM_FN(snes_Olivmystte) + +struct BurnDriver BurnDrvsnes_Olivmystte = { + "snes_olivmystte", NULL, NULL, NULL, "2024", + "Olivia's Mystery (Hack, English)\0", NULL, "alasker1899", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_OlivmystteRomInfo, snes_OlivmystteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Olympic Summer Games (USA) + +static struct BurnRomInfo snes_OlympicsgRomDesc[] = { + { "Olympic Summer Games (U)(1996)(Black Pearl).sfc", 2097152, 0x6b882d11, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Olympicsg) +STD_ROM_FN(snes_Olympicsg) + +struct BurnDriver BurnDrvsnes_Olympicsg = { + "snes_olympicsg", NULL, NULL, NULL, "1996", + "Olympic Summer Games (USA)\0", NULL, "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_OlympicsgRomInfo, snes_OlympicsgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// On the Ball (USA) + +static struct BurnRomInfo snes_OntheballRomDesc[] = { + { "On the Ball (U)(1992)(Taito).sfc", 1048576, 0x50ad3fe8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ontheball) +STD_ROM_FN(snes_Ontheball) + +struct BurnDriver BurnDrvsnes_Ontheball = { + "snes_ontheball", NULL, NULL, NULL, "1992", + "On the Ball (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_OntheballRomInfo, snes_OntheballRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Operation Logic Bomb - The Ultimate Search & Destroy (USA) + +static struct BurnRomInfo snes_OplogicbombRomDesc[] = { + { "Operation Logic Bomb - The Ultimate Search & Destroy (U)(1993)(Jaleco).sfc", 1048576, 0x65bbe8b4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Oplogicbomb) +STD_ROM_FN(snes_Oplogicbomb) + +struct BurnDriver BurnDrvsnes_Oplogicbomb = { + "snes_oplogicbomb", NULL, NULL, NULL, "1993", + "Operation Logic Bomb - The Ultimate Search & Destroy (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_OplogicbombRomInfo, snes_OplogicbombRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Operation Thunderbolt (USA) + +static struct BurnRomInfo snes_OpthundboltRomDesc[] = { + { "Operation Thunderbolt (U)(1994)(Taito).sfc", 1310720, 0x3042b049, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Opthundbolt) +STD_ROM_FN(snes_Opthundbolt) + +struct BurnDriver BurnDrvsnes_Opthundbolt = { + "snes_opthundbolt", NULL, NULL, NULL, "1994", + "Operation Thunderbolt (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_OpthundboltRomInfo, snes_OpthundboltRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Operation Europe - Path to Victory 1939-45 (USA) + +static struct BurnRomInfo snes_Opeuro3945RomDesc[] = { + { "Operation Europe - Path to Victory 1939-45 (U)(1994)(Koei).sfc", 1310720, 0xf84c2bb6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Opeuro3945) +STD_ROM_FN(snes_Opeuro3945) + +struct BurnDriver BurnDrvsnes_Opeuro3945 = { + "snes_opeuro3945", NULL, NULL, NULL, "1994", + "Operation Europe - Path to Victory 1939-45 (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Opeuro3945RomInfo, snes_Opeuro3945RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Oraga Land Shusai - Best Farmer Shuukakusai (Japan) + +static struct BurnRomInfo snes_OragalandRomDesc[] = { + { "Oraga Land Shusai - Best Farmer Shuukakusai (J)(1995)(Vic Tokai).sfc", 524288, 0x32a4612f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Oragaland) +STD_ROM_FN(snes_Oragaland) + +struct BurnDriver BurnDrvsnes_Oragaland = { + "snes_oragaland", NULL, NULL, NULL, "1995", + "Oraga Land Shusai - Best Farmer Shuukakusai (Japan)\0", NULL, "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_OragalandRomInfo, snes_OragalandRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Oscar (USA) + +static struct BurnRomInfo snes_OscarRomDesc[] = { + { "Oscar (U)(1996)(Titus).sfc", 524288, 0xcdf463c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Oscar) +STD_ROM_FN(snes_Oscar) + +struct BurnDriver BurnDrvsnes_Oscar = { + "snes_oscar", NULL, NULL, NULL, "1996", + "Oscar (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_OscarRomInfo, snes_OscarRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ossu!! Karate-bu (Japan) + +static struct BurnRomInfo snes_OssukarateRomDesc[] = { + { "Ossu!! Karate-bu (J)(1994)(Culture Brain).sfc", 2621440, 0xb4ecd206, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ossukarate) +STD_ROM_FN(snes_Ossukarate) + +struct BurnDriver BurnDrvsnes_Ossukarate = { + "snes_ossukarate", NULL, NULL, NULL, "1994", + "Ossu!! Karate-bu (Japan)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_OssukarateRomInfo, snes_OssukarateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Othello World (Japan) + +static struct BurnRomInfo snes_OthellojRomDesc[] = { + { "Othello World (J)(1992)(Tsukuda Original).sfc", 1048576, 0x1345ed19, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Othelloj) +STD_ROM_FN(snes_Othelloj) + +struct BurnDriver BurnDrvsnes_Othelloj = { + "snes_othelloj", NULL, NULL, NULL, "1992", + "Othello World (Japan)\0", NULL, "Tsukuda Original", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BOARD, 0, + SNESGetZipName, snes_OthellojRomInfo, snes_OthellojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Otogirisou (Japan) + +static struct BurnRomInfo snes_OtogirisoujRomDesc[] = { + { "Otogirisou (J)(1992)(Chun Soft).sfc", 1048576, 0x8e4befd0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Otogirisouj) +STD_ROM_FN(snes_Otogirisouj) + +struct BurnDriver BurnDrvsnes_Otogirisouj = { + "snes_otogirisouj", "snes_otogirisoute", NULL, NULL, "1992", + "Otogirisou (Japan)\0", NULL, "Chun Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_OtogirisoujRomInfo, snes_OtogirisoujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Otogirisou - Hypericum Perforatum (Hack, English) +// https://www.translated.games/snes/otogirisou +static struct BurnRomInfo snes_OtogirisouteRomDesc[] = { + { "Otogirisou T-Eng (2024)(Translated.Games).sfc", 4194304, 0x650112ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Otogirisoute) +STD_ROM_FN(snes_Otogirisoute) + +struct BurnDriver BurnDrvsnes_Otogirisoute = { + "snes_otogirisoute", NULL, NULL, NULL, "2024", + "Otogirisou - Hypericum Perforatum (Hack, English)\0", NULL, "Translated.Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_OtogirisouteRomInfo, snes_OtogirisouteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Outer World (Japan) + +static struct BurnRomInfo snes_OuterworldRomDesc[] = { + { "Outer World (J)(1992)(Victor).sfc", 1048576, 0x8d004dbb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Outerworld) +STD_ROM_FN(snes_Outerworld) + +struct BurnDriver BurnDrvsnes_Outerworld = { + "snes_outerworld", "snes_outofthisworld", NULL, NULL, "1992", + "Outer World (Japan)\0", NULL, "Victor", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_OuterworldRomInfo, snes_OuterworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Outlander (USA) + +static struct BurnRomInfo snes_OutlanderRomDesc[] = { + { "Outlander (U)(1992)(Mindscape).sfc", 1048576, 0xa978b36f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Outlander) +STD_ROM_FN(snes_Outlander) + +struct BurnDriver BurnDrvsnes_Outlander = { + "snes_outlander", NULL, NULL, NULL, "1992", + "Outlander (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_RACING, 0, + SNESGetZipName, snes_OutlanderRomInfo, snes_OutlanderRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Out to Lunch (USA) + +static struct BurnRomInfo snes_OutlunchRomDesc[] = { + { "Out to Lunch (U)(1993)(Mindscape).sfc", 1048576, 0x3d0c8974, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Outlunch) +STD_ROM_FN(snes_Outlunch) + +struct BurnDriver BurnDrvsnes_Outlunch = { + "snes_outlunch", NULL, NULL, NULL, "1993", + "Out to Lunch (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_OutlunchRomInfo, snes_OutlunchRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Out of This World (USA) + +static struct BurnRomInfo snes_OutofthisworldRomDesc[] = { + { "Out of This World (U)(1992)(Interplay - Delphine Software).sfc", 1048576, 0x5f40a869, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Outofthisworld) +STD_ROM_FN(snes_Outofthisworld) + +struct BurnDriver BurnDrvsnes_Outofthisworld = { + "snes_outofthisworld", NULL, NULL, NULL, "1992", + "Out of This World (USA)\0", NULL, "Interplay - Delphine Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_OutofthisworldRomInfo, snes_OutofthisworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-Attack (USA) + +static struct BurnRomInfo snes_PacattackRomDesc[] = { + { "Pac-Attack (U)(1993)(Namco).sfc", 524288, 0x191b1a19, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacattack) +STD_ROM_FN(snes_Pacattack) + +struct BurnDriver BurnDrvsnes_Pacattack = { + "snes_pacattack", NULL, NULL, NULL, "1993", + "Pac-Attack (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PacattackRomInfo, snes_PacattackRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-In-Time (USA) + +static struct BurnRomInfo snes_PacintimeRomDesc[] = { + { "Pac-In-Time (U)(1994)(Namco).sfc", 1048576, 0x44375368, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacintime) +STD_ROM_FN(snes_Pacintime) + +struct BurnDriver BurnDrvsnes_Pacintime = { + "snes_pacintime", NULL, NULL, NULL, "1994", + "Pac-In-Time (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PacintimeRomInfo, snes_PacintimeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-In-Time (Euro) + +static struct BurnRomInfo snes_PacintimeeRomDesc[] = { + { "Pac-In-Time (E)(1994)(Mindscape, Namco).sfc", 1048576, 0x348be5ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacintimee) +STD_ROM_FN(snes_Pacintimee) + +struct BurnDriver BurnDrvsnes_Pacintimee = { + "snes_pacintimee", "snes_pacintime", NULL, NULL, "1994", + "Pac-In-Time (Euro)\0", NULL, "Mindscape - Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PacintimeeRomInfo, snes_PacintimeeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-In-Time (Japan) + +static struct BurnRomInfo snes_PacintimejRomDesc[] = { + { "Pac-In-Time (J)(1994)(Namco).sfc", 1048576, 0xbb6b3b1f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacintimej) +STD_ROM_FN(snes_Pacintimej) + +struct BurnDriver BurnDrvsnes_Pacintimej = { + "snes_pacintimej", "snes_pacintime", NULL, NULL, "1994", + "Pac-In-Time (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PacintimejRomInfo, snes_PacintimejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-Man 2 - The New Adventures (USA) + +static struct BurnRomInfo snes_Pacman2advRomDesc[] = { + { "Pac-Man 2 - The New Adventures (U)(1994)(Namco).sfc", 1572864, 0x9fc62bcc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacman2adv) +STD_ROM_FN(snes_Pacman2adv) + +struct BurnDriver BurnDrvsnes_Pacman2adv = { + "snes_pacman2adv", NULL, NULL, NULL, "1994", + "Pac-Man 2 - The New Adventures (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Pacman2advRomInfo, snes_Pacman2advRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-Man 2 - The New Adventures (Euro, English) + +static struct BurnRomInfo snes_Pacman2adveRomDesc[] = { + { "Pac-Man 2 - The New Adventures (E)(1994)(Namco).sfc", 1572864, 0x51c8a0eb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacman2adve) +STD_ROM_FN(snes_Pacman2adve) + +struct BurnDriver BurnDrvsnes_Pacman2adve = { + "snes_pacman2adve", "snes_pacman2adv", NULL, NULL, "1994", + "Pac-Man 2 - The New Adventures (Euro, English)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Pacman2adveRomInfo, snes_Pacman2adveRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-Man 2 - The New Adventures (Euro, French) + +static struct BurnRomInfo snes_Pacman2advfRomDesc[] = { + { "Pac-Man 2 - The New Adventures (E, France)(1994)(Namco).sfc", 1572864, 0x30478a49, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacman2advf) +STD_ROM_FN(snes_Pacman2advf) + +struct BurnDriver BurnDrvsnes_Pacman2advf = { + "snes_pacman2advf", "snes_pacman2adv", NULL, NULL, "1994", + "Pac-Man 2 - The New Adventures (Euro, French)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Pacman2advfRomInfo, snes_Pacman2advfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pac-Man 2 - The New Adventures (Euro, German) + +static struct BurnRomInfo snes_Pacman2advgRomDesc[] = { + { "Pac-Man 2 - The New Adventures (E, Germany)(1994)(Namco).sfc", 1572864, 0xdf6a092d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pacman2advg) +STD_ROM_FN(snes_Pacman2advg) + +struct BurnDriver BurnDrvsnes_Pacman2advg = { + "snes_pacman2advg", "snes_pacman2adv", NULL, NULL, "1994", + "Pac-Man 2 - The New Adventures (Euro, German)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV, 0, + SNESGetZipName, snes_Pacman2advgRomInfo, snes_Pacman2advgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pagemaster, The (USA) + +static struct BurnRomInfo snes_PagemasterRomDesc[] = { + { "Pagemaster, The (U)(1994)(Fox Interactive - Probe).sfc", 2097152, 0x26c38eee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pagemaster) +STD_ROM_FN(snes_Pagemaster) + +struct BurnDriver BurnDrvsnes_Pagemaster = { + "snes_pagemaster", NULL, NULL, NULL, "1994", + "Pagemaster, The (USA)\0", NULL, "Fox Interactive - Probe", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PagemasterRomInfo, snes_PagemasterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Panel de Pon (Japan) + +static struct BurnRomInfo snes_PaneldeponjRomDesc[] = { + { "Panel de Pon (J)(1995)(Nintendo).sfc", 1048576, 0x14d70786, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Paneldeponj) +STD_ROM_FN(snes_Paneldeponj) + +struct BurnDriver BurnDrvsnes_Paneldeponj = { + "snes_paneldeponj", "snes_tetrisattack", NULL, NULL, "1995", + "Panel de Pon (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PaneldeponjRomInfo, snes_PaneldeponjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Panel de Pon (Hack, English) + +static struct BurnRomInfo snes_PaneldeponteRomDesc[] = { + { "Panel de Pon T-Eng (2007)(Zuqkeo).sfc", 1572864, 0x214d7b39, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Paneldeponte) +STD_ROM_FN(snes_Paneldeponte) + +struct BurnDriver BurnDrvsnes_Paneldeponte = { + "snes_paneldeponte", "snes_tetrisattack", NULL, NULL, "2007", + "Panel de Pon (Hack, English)\0", NULL, "Zuqkeo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PaneldeponteRomInfo, snes_PaneldeponteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Panic in Nakayoshi World (Japan) + +static struct BurnRomInfo snes_PanicworldjRomDesc[] = { + { "Panic in Nakayoshi World (J)(1994)(Bandai).sfc", 524288, 0x7ac3c0c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Panicworldj) +STD_ROM_FN(snes_Panicworldj) + +struct BurnDriver BurnDrvsnes_Panicworldj = { + "snes_panicworldj", "snes_panicworldte", NULL, NULL, "1994", + "Panic in Nakayoshi World (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_PanicworldjRomInfo, snes_PanicworldjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Panic in Nakayoshi World (Hack, English) +// https://www.romhacking.net/translations/399/ +static struct BurnRomInfo snes_PanicworldteRomDesc[] = { + { "Panic in Nakayoshi World T-Eng (2000)(Project - Sailor Moon).sfc", 524800, 0x9e072579, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Panicworldte) +STD_ROM_FN(snes_Panicworldte) + +struct BurnDriver BurnDrvsnes_Panicworldte = { + "snes_panicworldte", NULL, NULL, NULL, "2000", + "Panic in Nakayoshi World (Hack, English)\0", NULL, "Project: Sailor Moon", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_PanicworldteRomInfo, snes_PanicworldteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Paperboy 2 (USA) + +static struct BurnRomInfo snes_Paperboy2RomDesc[] = { + { "Paperboy 2 (U)(1991)(Minscape).sfc", 524288, 0xc85aa66a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Paperboy2) +STD_ROM_FN(snes_Paperboy2) + +struct BurnDriver BurnDrvsnes_Paperboy2 = { + "snes_paperboy2", NULL, NULL, NULL, "1991", + "Paperboy 2 (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_Paperboy2RomInfo, snes_Paperboy2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Parodius: Non-Sense Fantasy (Euro) + +static struct BurnRomInfo snes_ParodiuseRomDesc[] = { + { "Parodius - Non-Sense Fantasy (E)(1992)(Konami).sfc", 1048576, 0x6ffa308c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Parodiuse) +STD_ROM_FN(snes_Parodiuse) + +struct BurnDriver BurnDrvsnes_Parodiuse = { + "snes_parodiuse", NULL, NULL, NULL, "1992", + "Parodius: Non-Sense Fantasy (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ParodiuseRomInfo, snes_ParodiuseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Parodius Da!: Shinwa kara Owarai e (Japan) + +static struct BurnRomInfo snes_ParodiusjRomDesc[] = { + { "Parodius Da! - Shinwa kara Owarai e (J)(1992)(Konami).sfc", 1048576, 0x876dfd97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Parodiusj) +STD_ROM_FN(snes_Parodiusj) + +struct BurnDriver BurnDrvsnes_Parodiusj = { + "snes_parodiusj", "snes_parodiuse", NULL, NULL, "1992", + "Parodius Da!: Shinwa kara Owarai e (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ParodiusjRomInfo, snes_ParodiusjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Planet's Champ TG 3000, The (Japan) + +static struct BurnRomInfo snes_Pctg3000RomDesc[] = { + { "Planet's Champ TG 3000, The (J)(1995)(Kemco - Gremlin Graphics).sfc", 1048576, 0xb9b9df06, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Pctg3000, snes_Pctg3000, snes_dsp4) +STD_ROM_FN(snes_Pctg3000) + +struct BurnDriver BurnDrvsnes_Pctg3000 = { + "snes_pctg3000", "snes_topgear3000", "snes_dsp4", NULL, "1995", + "Planet's Champ TG 3000, The (Japan)\0", "DSP-4 enhancement chip", "Kemco - Gremlin Graphics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Pctg3000RomInfo, snes_Pctg3000RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Peace Keepers, The (USA) + +static struct BurnRomInfo snes_PeacekeepersRomDesc[] = { + { "Peace Keepers, The (U)(1994)(Jaleco).sfc", 2097152, 0x8071e5db, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Peacekeepers) +STD_ROM_FN(snes_Peacekeepers) + +struct BurnDriver BurnDrvsnes_Peacekeepers = { + "snes_peacekeepers", NULL, NULL, NULL, "1994", + "Peace Keepers, The (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_PeacekeepersRomInfo, snes_PeacekeepersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PGA European Tour (USA) + +static struct BurnRomInfo snes_PgaeutourRomDesc[] = { + { "PGA European Tour (U)(1996)(THQ).sfc", 1048576, 0x914f2ea3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgaeutour) +STD_ROM_FN(snes_Pgaeutour) + +struct BurnDriver BurnDrvsnes_Pgaeutour = { + "snes_pgaeutour", NULL, NULL, NULL, "1996", + "PGA European Tour (USA)\0", "SA-1 enhancement CPU", "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_PgaeutourRomInfo, snes_PgaeutourRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PGA European Tour (Euro) + +static struct BurnRomInfo snes_PgaeutoureRomDesc[] = { + { "PGA European Tour (E)(1996)(THQ).sfc", 1048576, 0xbe94e60d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgaeutoure) +STD_ROM_FN(snes_Pgaeutoure) + +struct BurnDriver BurnDrvsnes_Pgaeutoure = { + "snes_pgaeutoure", "snes_pgaeutour", NULL, NULL, "1996", + "PGA European Tour (Euro)\0", "SA-1 enhancement CPU", "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_PgaeutoureRomInfo, snes_PgaeutoureRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PGA Tour Golf (USA) + +static struct BurnRomInfo snes_PgatgolfRomDesc[] = { + { "PGA Tour Golf (U)(1991)(Electronic Arts).sfc", 524288, 0xb6566944, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgatgolf) +STD_ROM_FN(snes_Pgatgolf) + +struct BurnDriver BurnDrvsnes_Pgatgolf = { + "snes_pgatgolf", NULL, NULL, NULL, "1991", + "PGA Tour Golf (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_PgatgolfRomInfo, snes_PgatgolfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// PGA Tour Golf (Euro) + +static struct BurnRomInfo snes_PgatgolfeRomDesc[] = { + { "PGA Tour Golf (E)(1991)(Electronic Arts).sfc", 524288, 0x5daf9dbd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgatgolfe) +STD_ROM_FN(snes_Pgatgolfe) + +struct BurnDriver BurnDrvsnes_Pgatgolfe = { + "snes_pgatgolfe", "snes_pgatgolf", NULL, NULL, "1991", + "PGA Tour Golf (Euro)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_PgatgolfeRomInfo, snes_PgatgolfeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// PGA Tour 96 (USA) + +static struct BurnRomInfo snes_Pgatour96RomDesc[] = { + { "PGA Tour 96 (U)(1995)(Electronic Arts).sfc", 2097152, 0xef94eec7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgatour96) +STD_ROM_FN(snes_Pgatour96) + +struct BurnDriver BurnDrvsnes_Pgatour96 = { + "snes_pgatour96", NULL, NULL, NULL, "1995", + "PGA Tour 96 (USA)\0", "SA-1 enhancement CPU", "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Pgatour96RomInfo, snes_Pgatour96RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PGA Tour 96 (Euro) + +static struct BurnRomInfo snes_Pgatour96eRomDesc[] = { + { "PGA Tour 96 (E)(1995)(Electronic Arts).sfc", 2097152, 0xc5ac2e72, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pgatour96e) +STD_ROM_FN(snes_Pgatour96e) + +struct BurnDriver BurnDrvsnes_Pgatour96e = { + "snes_pgatour96e", "snes_pgatour96", NULL, NULL, "1995", + "PGA Tour 96 (Euro)\0", "SA-1 enhancement CPU", "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Pgatour96eRomInfo, snes_Pgatour96eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Phalanx (USA) + +static struct BurnRomInfo snes_PhalanxRomDesc[] = { + { "Phalanx (U)(1992)(Kemco - Zoom).sfc", 1048576, 0xdc90a8ab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Phalanx) +STD_ROM_FN(snes_Phalanx) + +struct BurnDriver BurnDrvsnes_Phalanx = { + "snes_phalanx", NULL, NULL, NULL, "1992", + "Phalanx (USA)\0", NULL, "Kemco - Zoom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_PhalanxRomInfo, snes_PhalanxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Phantom 2040 (USA) + +static struct BurnRomInfo snes_Phantom2040RomDesc[] = { + { "Phantom 2040 (U)(1995)(Viacom New Media).sfc", 2097152, 0x35e8fb28, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Phantom2040) +STD_ROM_FN(snes_Phantom2040) + +struct BurnDriver BurnDrvsnes_Phantom2040 = { + "snes_phantom2040", NULL, NULL, NULL, "1995", + "Phantom 2040 (USA)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Phantom2040RomInfo, snes_Phantom2040RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Phantom 2040 (Euro) + +static struct BurnRomInfo snes_Phantom2040eRomDesc[] = { + { "Phantom 2040 (E)(1995)(Viacom New Media).sfc", 2097152, 0x14252650, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Phantom2040e) +STD_ROM_FN(snes_Phantom2040e) + +struct BurnDriver BurnDrvsnes_Phantom2040e = { + "snes_phantom2040e", "snes_phantom2040", NULL, NULL, "1995", + "Phantom 2040 (Euro)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Phantom2040eRomInfo, snes_Phantom2040eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pieces (USA) + +static struct BurnRomInfo snes_PiecesRomDesc[] = { + { "Pieces (U)(1994)(Atlus).sfc", 1048576, 0xbb6c3c54, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pieces) +STD_ROM_FN(snes_Pieces) + +struct BurnDriver BurnDrvsnes_Pieces = { + "snes_pieces", NULL, NULL, NULL, "1994", + "Pieces (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PiecesRomInfo, snes_PiecesRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pikiinya! (Japan) + +static struct BurnRomInfo snes_PikiinyaRomDesc[] = { + { "Pikiinya! (J)(1996)(ASCII).sfc", 2097152, 0x9fe1b94a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pikiinya) +STD_ROM_FN(snes_Pikiinya) + +struct BurnDriver BurnDrvsnes_Pikiinya = { + "snes_pikiinya", NULL, NULL, NULL, "1996", + "Pikiinya! (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PikiinyaRomInfo, snes_PikiinyaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pilotwings (USA) + +static struct BurnRomInfo snes_PilotwingsRomDesc[] = { + { "Pilotwings (U)(1991)(Nintendo).sfc", 524288, 0x266c44ed, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Pilotwings, snes_Pilotwings, snes_dsp1) +STD_ROM_FN(snes_Pilotwings) + +struct BurnDriver BurnDrvsnes_Pilotwings = { + "snes_pilotwings", NULL, "snes_dsp1", NULL, "1991", + "Pilotwings (USA)\0", "DSP-1 enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_SIM, 0, + SNESGetZipName, snes_PilotwingsRomInfo, snes_PilotwingsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pilotwings (Euro) + +static struct BurnRomInfo snes_PilotwingseRomDesc[] = { + { "Pilotwings (E)(1992)(Nintendo).sfc", 524288, 0xdef45776, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Pilotwingse, snes_Pilotwingse, snes_dsp1) +STD_ROM_FN(snes_Pilotwingse) + +struct BurnDriver BurnDrvsnes_Pilotwingse = { + "snes_pilotwingse", "snes_pilotwings", "snes_dsp1", NULL, "1992", + "Pilotwings (Euro)\0", "DSP-1 enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_SIM, 0, + SNESGetZipName, snes_PilotwingseRomInfo, snes_PilotwingseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pilotwings (Japan) + +static struct BurnRomInfo snes_PilotwingsjRomDesc[] = { + { "Pilotwings (J)(1990)(Nintendo).sfc", 524288, 0x77871727, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Pilotwingsj, snes_Pilotwingsj, snes_dsp1) +STD_ROM_FN(snes_Pilotwingsj) + +struct BurnDriver BurnDrvsnes_Pilotwingsj = { + "snes_pilotwingsj", "snes_pilotwings", "snes_dsp1", NULL, "1990", + "Pilotwings (Japan)\0", "DSP-1 enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_SIM, 0, + SNESGetZipName, snes_PilotwingsjRomInfo, snes_PilotwingsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pinball Dreams (USA) + +static struct BurnRomInfo snes_PinballdreamsRomDesc[] = { + { "Pinball Dreams (U)(1993)(GameTek).sfc", 1048576, 0x81107ce2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinballdreams) +STD_ROM_FN(snes_Pinballdreams) + +struct BurnDriver BurnDrvsnes_Pinballdreams = { + "snes_pinballdreams", NULL, NULL, NULL, "1993", + "Pinball Dreams (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_PINBALL, 0, + SNESGetZipName, snes_PinballdreamsRomInfo, snes_PinballdreamsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pinball Fantasies (USA) + +static struct BurnRomInfo snes_PinballfantaRomDesc[] = { + { "Pinball Fantasies (U)(1994)(GameTek).sfc", 1048576, 0x822ad378, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinballfanta) +STD_ROM_FN(snes_Pinballfanta) + +struct BurnDriver BurnDrvsnes_Pinballfanta = { + "snes_pinballfanta", NULL, NULL, NULL, "1994", + "Pinball Fantasies (USA)\0", NULL, "GameTek", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 8, HARDWARE_SNES, GBF_PINBALL, 0, + SNESGetZipName, snes_PinballfantaRomInfo, snes_PinballfantaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pinball Pinball (Japan) + +static struct BurnRomInfo snes_PinballpinballRomDesc[] = { + { "Pinball Pinball (J)(1994)(Coconuts Japan).sfc", 1048576, 0x9bf79a7d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinballpinball) +STD_ROM_FN(snes_Pinballpinball) + +struct BurnDriver BurnDrvsnes_Pinballpinball = { + "snes_pinballpinball", "snes_pinballdreams", NULL, NULL, "1994", + "Pinball Pinball (Japan)\0", NULL, "Coconuts Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_PINBALL, 0, + SNESGetZipName, snes_PinballpinballRomInfo, snes_PinballpinballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pink Goes to Hollywood (USA) + +static struct BurnRomInfo snes_PinkhollyRomDesc[] = { + { "Pink Goes to Hollywood (U)(1993)(TecMagik).sfc", 1048576, 0x8bae9438, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinkholly) +STD_ROM_FN(snes_Pinkholly) + +struct BurnDriver BurnDrvsnes_Pinkholly = { + "snes_pinkholly", NULL, NULL, NULL, "1993", + "Pink Goes to Hollywood (USA)\0", NULL, "TecMagik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PinkhollyRomInfo, snes_PinkhollyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pinkie (Euro, Prototype) + +static struct BurnRomInfo snes_PinkieprotoRomDesc[] = { + { "Pinkie (E, Proto)(1995)(SWG - Data Design).sfc", 1048576, 0x91c9d645, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinkieproto) +STD_ROM_FN(snes_Pinkieproto) + +struct BurnDriver BurnDrvsnes_Pinkieproto = { + "snes_pinkieproto", NULL, NULL, NULL, "1995", + "Pinkie (Euro, Prototype)\0", NULL, "SWG - Data Design", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PinkieprotoRomInfo, snes_PinkieprotoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Pinocchio (USA) + +static struct BurnRomInfo snes_PinocchioRomDesc[] = { + { "Disney's Pinocchio (U)(1996)(Virgin Int. - Disney Int.).sfc", 3145728, 0x00fad8fd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinocchio) +STD_ROM_FN(snes_Pinocchio) + +struct BurnDriver BurnDrvsnes_Pinocchio = { + "snes_pinocchio", NULL, NULL, NULL, "1996", + "Disney's Pinocchio (USA)\0", NULL, "Virgin Int. - Disney Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PinocchioRomInfo, snes_PinocchioRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Pinocchio (Japan) + +static struct BurnRomInfo snes_PinocchiojRomDesc[] = { + { "Disney's Pinocchio (J)(1996)(Virgin Int. - Disney Int.).sfc", 3145728, 0xd9f5a47a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinocchioj) +STD_ROM_FN(snes_Pinocchioj) + +struct BurnDriver BurnDrvsnes_Pinocchioj = { + "snes_pinocchioj", "snes_pinocchio", NULL, NULL, "1996", + "Disney's Pinocchio (Japan)\0", NULL, "Virgin Int. - Disney Int.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PinocchiojRomInfo, snes_PinocchiojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pipe Dream (Japan) + +static struct BurnRomInfo snes_PipedreamRomDesc[] = { + { "Pipe Dream (J)(1992)(Bullet Proof Software).sfc", 524288, 0xaf2a3dfe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pipedream) +STD_ROM_FN(snes_Pipedream) + +struct BurnDriver BurnDrvsnes_Pipedream = { + "snes_pipedream", NULL, NULL, NULL, "1992", + "Pipe Dream (Japan)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PipedreamRomInfo, snes_PipedreamRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pirates of Dark Water, The (USA) + +static struct BurnRomInfo snes_PiratesdwRomDesc[] = { + { "Pirates of Dark Water, The (U)(1994)(Sunsoft).sfc", 1048576, 0x7ca0ca4d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Piratesdw) +STD_ROM_FN(snes_Piratesdw) + +struct BurnDriver BurnDrvsnes_Piratesdw = { + "snes_piratesdw", NULL, NULL, NULL, "1994", + "Pirates of Dark Water, The (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_PiratesdwRomInfo, snes_PiratesdwRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pitfall - The Mayan Adventure (USA) + +static struct BurnRomInfo snes_PitfallmayaRomDesc[] = { + { "Pitfall - The Mayan Adventure (U)(1994)(Activision).sfc", 2097152, 0x03e67d38, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pitfallmaya) +STD_ROM_FN(snes_Pitfallmaya) + +struct BurnDriver BurnDrvsnes_Pitfallmaya = { + "snes_pitfallmaya", NULL, NULL, NULL, "1994", + "Pitfall - The Mayan Adventure (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PitfallmayaRomInfo, snes_PitfallmayaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pit-Fighter (USA) + +static struct BurnRomInfo snes_PitfighterRomDesc[] = { + { "Pit-Fighter (U)(1991)(THQ).sfc", 524288, 0x9fab69fc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pitfighter) +STD_ROM_FN(snes_Pitfighter) + +struct BurnDriver BurnDrvsnes_Pitfighter = { + "snes_pitfighter", NULL, NULL, NULL, "1991", + "Pit-Fighter (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_PitfighterRomInfo, snes_PitfighterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Plok (USA) + +static struct BurnRomInfo snes_PlokRomDesc[] = { + { "Plok (U)(1993)(Tradewest).sfc", 1048576, 0xbbd678f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Plok) +STD_ROM_FN(snes_Plok) + +struct BurnDriver BurnDrvsnes_Plok = { + "snes_plok", NULL, NULL, NULL, "1993", + "Plok (USA)\0", NULL, "Tradewest", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PlokRomInfo, snes_PlokRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Plok! (Japan) + +static struct BurnRomInfo snes_PlokjRomDesc[] = { + { "Plok! (J)(1993)(Activision).sfc", 1048576, 0x57dcd2a1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Plokj) +STD_ROM_FN(snes_Plokj) + +struct BurnDriver BurnDrvsnes_Plokj = { + "snes_plokj", "snes_plok", NULL, NULL, "1993", + "Plok! (Japan)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PlokjRomInfo, snes_PlokjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Popoitto Hebereke (Japan) + +static struct BurnRomInfo snes_PheberekeRomDesc[] = { + { "Popoitto Hebereke (J)(1995)(Sunsoft).sfc", 524288, 0xe333354a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Phebereke) +STD_ROM_FN(snes_Phebereke) + +struct BurnDriver BurnDrvsnes_Phebereke = { + "snes_phebereke", "snes_heberekep", NULL, NULL, "1995", + "Popoitto Hebereke (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PheberekeRomInfo, snes_PheberekeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pocky & Rocky (USA) + +static struct BurnRomInfo snes_PockyrockyRomDesc[] = { + { "Pocky & Rocky (U)(1993)(Natsume).sfc", 1048576, 0x2b0e7ea3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pockyrocky) +STD_ROM_FN(snes_Pockyrocky) + +struct BurnDriver BurnDrvsnes_Pockyrocky = { + "snes_pockyrocky", NULL, NULL, NULL, "1993", + "Pocky & Rocky (USA)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_PockyrockyRomInfo, snes_PockyrockyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pocky & Rocky 2 (USA) + +static struct BurnRomInfo snes_Pockyrocky2RomDesc[] = { + { "Pocky & Rocky 2 (U)(1994)(Natsume).sfc", 1572864, 0xfc00bb1b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pockyrocky2) +STD_ROM_FN(snes_Pockyrocky2) + +struct BurnDriver BurnDrvsnes_Pockyrocky2 = { + "snes_pockyrocky2", NULL, NULL, NULL, "1994", + "Pocky & Rocky 2 (USA)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_Pockyrocky2RomInfo, snes_Pockyrocky2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pokonyan! - Henpokorin Adventure (Japan) + +static struct BurnRomInfo snes_PokonyanRomDesc[] = { + { "Pokonyan! - Henpokorin Adventure (J)(1994)(Toho Co.).sfc", 1048576, 0xd16810cd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pokonyan) +STD_ROM_FN(snes_Pokonyan) + +struct BurnDriver BurnDrvsnes_Pokonyan = { + "snes_pokonyan", NULL, NULL, NULL, "1994", + "Pokonyan! - Henpokorin Adventure (Japan)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PokonyanRomInfo, snes_PokonyanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Popeye - Ijiwaru Majo Sea Hag no Maki (Japan) + +static struct BurnRomInfo snes_PopeyejRomDesc[] = { + { "Popeye - Ijiwaru Majo Sea Hag no Maki (J)(1994)(Technos Japan).sfc", 1572864, 0xf5bfcd90, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popeyej) +STD_ROM_FN(snes_Popeyej) + +struct BurnDriver BurnDrvsnes_Popeyej = { + "snes_popeyej", "snes_popeyete", NULL, NULL, "1994", + "Popeye - Ijiwaru Majo Sea Hag no Maki (Japan)\0", NULL, "Technos Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_MINIGAMES | GBF_BOARD, 0, + SNESGetZipName, snes_PopeyejRomInfo, snes_PopeyejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Popeye - Tale of Teasing Witch Sea Hag (Hack, English) +// https://www.romhacking.net/translations/1355/ +static struct BurnRomInfo snes_PopeyeteRomDesc[] = { + { "Popeye - Tale of Teasing Witch Sea Hag T-Eng (2008)(KingMike’s Translations).sfc", 1572864, 0x749a6f69, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popeyete) +STD_ROM_FN(snes_Popeyete) + +struct BurnDriver BurnDrvsnes_Popeyete = { + "snes_popeyete", NULL, NULL, NULL, "2008", + "Popeye - Tale of Teasing Witch Sea Hag (Hack, English)\0", NULL, "KingMike's Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_MINIGAMES | GBF_BOARD, 0, + SNESGetZipName, snes_PopeyeteRomInfo, snes_PopeyeteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Popful Mail (Japan) + +static struct BurnRomInfo snes_PopfulmailRomDesc[] = { + { "Popful Mail (J)(1994)(Nihon Falcom).sfc", 1048576, 0x88e5bcdf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popfulmail) +STD_ROM_FN(snes_Popfulmail) + +struct BurnDriver BurnDrvsnes_Popfulmail = { + "snes_popfulmail", NULL, NULL, NULL, "1994", + "Popful Mail (Japan)\0", NULL, "Nihon Falcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PopfulmailRomInfo, snes_PopfulmailRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pop'n TwinBee (USA) + +static struct BurnRomInfo snes_PopntwinbeeRomDesc[] = { + { "Pop'n TwinBee (U)(1993)(Konami).sfc", 1048576, 0x950696d9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popntwinbee) +STD_ROM_FN(snes_Popntwinbee) + +struct BurnDriver BurnDrvsnes_Popntwinbee = { + "snes_popntwinbee", NULL, NULL, NULL, "1993", + "Pop'n TwinBee (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_PopntwinbeeRomInfo, snes_PopntwinbeeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pop'n TwinBee (Euro) + +static struct BurnRomInfo snes_PopntwinbeeeRomDesc[] = { + { "Pop'n TwinBee (E)(1993)(Konami).sfc", 1048576, 0x588a9707, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popntwinbeee) +STD_ROM_FN(snes_Popntwinbeee) + +struct BurnDriver BurnDrvsnes_Popntwinbeee = { + "snes_popntwinbeee", "snes_popntwinbee", NULL, NULL, "1993", + "Pop'n TwinBee (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_PopntwinbeeeRomInfo, snes_PopntwinbeeeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pop'n TwinBee (Japan) + +static struct BurnRomInfo snes_PopntwinbeejRomDesc[] = { + { "Pop'n TwinBee (J)(1993)(Konami).sfc", 1048576, 0xee13e32d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popntwinbeej) +STD_ROM_FN(snes_Popntwinbeej) + +struct BurnDriver BurnDrvsnes_Popntwinbeej = { + "snes_popntwinbeej", "snes_popntwinbee", NULL, NULL, "1993", + "Pop'n TwinBee (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_PopntwinbeejRomInfo, snes_PopntwinbeejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pop'n TwinBee - Rainbow Bell Adventures (Euro) + +static struct BurnRomInfo snes_PopntwinbeerbeRomDesc[] = { + { "Pop'n TwinBee - Rainbow Bell Adventures (E)(1993)(Konami).sfc", 1048576, 0x91a03035, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popntwinbeerbe) +STD_ROM_FN(snes_Popntwinbeerbe) + +struct BurnDriver BurnDrvsnes_Popntwinbeerbe = { + "snes_popntwinbeerbe", NULL, NULL, NULL, "1993", + "Pop'n TwinBee - Rainbow Bell Adventures (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PopntwinbeerbeRomInfo, snes_PopntwinbeerbeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Heisei Inu Monogatari Bow - Pop'n Smash!! (Japan) + +static struct BurnRomInfo snes_PopsmashRomDesc[] = { + { "Heisei Inu Monogatari Bow - Pop'n Smash!! (J)(1994)(Takara).sfc", 524288, 0xfe4a2622, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Popsmash) +STD_ROM_FN(snes_Popsmash) + +struct BurnDriver BurnDrvsnes_Popsmash = { + "snes_popsmash", NULL, NULL, NULL, "1994", + "Heisei Inu Monogatari Bow - Pop'n Smash!! (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BALLPADDLE, 0, + SNESGetZipName, snes_PopsmashRomInfo, snes_PopsmashRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous (USA) + +static struct BurnRomInfo snes_PopulousRomDesc[] = { + { "Populous (U)(1991)(Acclaim Entertainment).sfc", 524288, 0x2df4aa0f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populous) +STD_ROM_FN(snes_Populous) + +struct BurnDriver BurnDrvsnes_Populous = { + "snes_populous", NULL, NULL, NULL, "1991", + "Populous (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_PopulousRomInfo, snes_PopulousRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous II - Trials of the Olympian Gods (Euro, English) + +static struct BurnRomInfo snes_Populous2eRomDesc[] = { + { "Populous II - Trials of the Olympian Gods (E)(1993)(Imagineer).sfc", 1048576, 0x6c28cc39, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populous2e) +STD_ROM_FN(snes_Populous2e) + +struct BurnDriver BurnDrvsnes_Populous2e = { + "snes_populous2e", NULL, NULL, NULL, "1993", + "Populous II - Trials of the Olympian Gods (Euro, English)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Populous2eRomInfo, snes_Populous2eRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous II - Trials of the Olympian Gods (Euro, German) + +static struct BurnRomInfo snes_Populous2gRomDesc[] = { + { "Populous II - Trials of the Olympian Gods (E, Germany)(1993)(Imagineer).sfc", 1048576, 0xc5dae9b9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populous2g) +STD_ROM_FN(snes_Populous2g) + +struct BurnDriver BurnDrvsnes_Populous2g = { + "snes_populous2g", "snes_populous2e", NULL, NULL, "1993", + "Populous II - Trials of the Olympian Gods (Euro, German)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Populous2gRomInfo, snes_Populous2gRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous II - Trials of the Olympian Gods (Japan) + +static struct BurnRomInfo snes_Populous2jRomDesc[] = { + { "Populous II - Trials of the Olympian Gods (J)(1993)(Imagineer).sfc", 1310720, 0x0a0235c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populous2j) +STD_ROM_FN(snes_Populous2j) + +struct BurnDriver BurnDrvsnes_Populous2j = { + "snes_populous2j", "snes_populous2e", NULL, NULL, "1993", + "Populous II - Trials of the Olympian Gods (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Populous2jRomInfo, snes_Populous2jRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous (Euro) + +static struct BurnRomInfo snes_PopulouseRomDesc[] = { + { "Populous (E)(1992)(Imagineer).sfc", 524288, 0xfe88a713, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populouse) +STD_ROM_FN(snes_Populouse) + +struct BurnDriver BurnDrvsnes_Populouse = { + "snes_populouse", "snes_populous", NULL, NULL, "1992", + "Populous (Euro)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_PopulouseRomInfo, snes_PopulouseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Populous (Japan) + +static struct BurnRomInfo snes_PopulousjRomDesc[] = { + { "Populous (J)(1990)(Imagineer).sfc", 524288, 0x191e1ce3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Populousj) +STD_ROM_FN(snes_Populousj) + +struct BurnDriver BurnDrvsnes_Populousj = { + "snes_populousj", "snes_populous", NULL, NULL, "1990", + "Populous (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_PopulousjRomInfo, snes_PopulousjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Porky Pig's Haunted Holiday (USA) + +static struct BurnRomInfo snes_PorkypigRomDesc[] = { + { "Porky Pig's Haunted Holiday (U)(1995)(Acclaim - Sunsoft).sfc", 2097152, 0xf09e91a1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Porkypig) +STD_ROM_FN(snes_Porkypig) + +struct BurnDriver BurnDrvsnes_Porkypig = { + "snes_porkypig", NULL, NULL, NULL, "1995", + "Porky Pig's Haunted Holiday (USA)\0", NULL, "Acclaim Entertainment - Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PorkypigRomInfo, snes_PorkypigRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Drive (Euro) + +static struct BurnRomInfo snes_PowerdriveeRomDesc[] = { + { "Power Drive (E)(1994)(U.S. Gold - Rage).sfc", 1048576, 0x0bfdca70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powerdrivee) +STD_ROM_FN(snes_Powerdrivee) + +struct BurnDriver BurnDrvsnes_Powerdrivee = { + "snes_powerdrivee", NULL, NULL, NULL, "1994", + "Power Drive (Euro)\0", NULL, "U.S. Gold - Rage", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_PowerdriveeRomInfo, snes_PowerdriveeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Piggs of the Dark Age (USA) + +static struct BurnRomInfo snes_PowerpigsRomDesc[] = { + { "Power Piggs of the Dark Age (U)(1995)(Titus).sfc", 1048576, 0xe945530d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powerpigs) +STD_ROM_FN(snes_Powerpigs) + +struct BurnDriver BurnDrvsnes_Powerpigs = { + "snes_powerpigs", NULL, NULL, NULL, "1995", + "Power Piggs of the Dark Age (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PowerpigsRomInfo, snes_PowerpigsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Instinct (USA) + +static struct BurnRomInfo snes_PowinstinctRomDesc[] = { + { "Power Instinct (U)(1994)(Atlus).sfc", 2621440, 0xcb8a4f8e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powinstinct) +STD_ROM_FN(snes_Powinstinct) + +struct BurnDriver BurnDrvsnes_Powinstinct = { + "snes_powinstinct", NULL, NULL, NULL, "1994", + "Power Instinct (USA)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_PowinstinctRomInfo, snes_PowinstinctRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PowerMonger (Euro) + +static struct BurnRomInfo snes_PowmongereRomDesc[] = { + { "PowerMonger (E)(1993)(Imagineer).sfc", 1048576, 0xbc06f982, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powmongere) +STD_ROM_FN(snes_Powmongere) + +struct BurnDriver BurnDrvsnes_Powmongere = { + "snes_powmongere", NULL, NULL, NULL, "1993", + "PowerMonger (Euro)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_PowmongereRomInfo, snes_PowmongereRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// PowerMonger - Mashou no Bouryaku (Japan) + +static struct BurnRomInfo snes_PowmongerjRomDesc[] = { + { "PowerMonger - Mashou no Bouryaku (J)(1993)(Imagineer).sfc", 1048576, 0x3e14376b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powmongerj) +STD_ROM_FN(snes_Powmongerj) + +struct BurnDriver BurnDrvsnes_Powmongerj = { + "snes_powmongerj", "snes_powmongere", NULL, NULL, "1993", + "PowerMonger - Mashou no Bouryaku (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_PowmongerjRomInfo, snes_PowmongerjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Rangers Zeo - Battle Racers (USA) + +static struct BurnRomInfo snes_PowrangzeoRomDesc[] = { + { "Power Rangers Zeo - Battle Racers (U)(1996)(Natsume).sfc", 1048576, 0x389300cf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powrangzeo) +STD_ROM_FN(snes_Powrangzeo) + +struct BurnDriver BurnDrvsnes_Powrangzeo = { + "snes_powrangzeo", NULL, NULL, NULL, "1996", + "Power Rangers Zeo - Battle Racers (USA)\0", "SA-1 enhancement CPU", "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_PowrangzeoRomInfo, snes_PowrangzeoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Rangers Zeo - Battle Racers (Euro) + +static struct BurnRomInfo snes_PowrangzeoeRomDesc[] = { + { "Power Rangers Zeo - Battle Racers (E)(1996)(Natsume).sfc", 1048576, 0x6aa46cfc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powrangzeoe) +STD_ROM_FN(snes_Powrangzeoe) + +struct BurnDriver BurnDrvsnes_Powrangzeoe = { + "snes_powrangzeoe", "snes_powrangzeo", NULL, NULL, "1996", + "Power Rangers Zeo - Battle Racers (Euro)\0", "SA-1 enhancement CPU", "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_PowrangzeoeRomInfo, snes_PowrangzeoeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Soukoban (Japan) + +static struct BurnRomInfo snes_PowsoukjRomDesc[] = { + { "Power Soukoban (J)(1999)(Nintendo).sfc", 1048576, 0x39fbaa1e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powsoukj) +STD_ROM_FN(snes_Powsoukj) + +struct BurnDriver BurnDrvsnes_Powsoukj = { + "snes_powsoukj", "snes_powsoukte", NULL, NULL, "1999", + "Power Soukoban (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_PowsoukjRomInfo, snes_PowsoukjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Power Soukoban (Hack, English) +// https://www.romhacking.net/translations/4985/ +static struct BurnRomInfo snes_PowsoukteRomDesc[] = { + { "Power Soukoban T-Eng (2019)(Saffith).sfc", 1048576, 0xbea1ba90, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Powsoukte) +STD_ROM_FN(snes_Powsoukte) + +struct BurnDriver BurnDrvsnes_Powsoukte = { + "snes_powsoukte", NULL, NULL, NULL, "2019", + "Power Soukoban (Hack, English)\0", NULL, "Saffith", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_PowsoukteRomInfo, snes_PowsoukteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prehistorik Man (USA) + +static struct BurnRomInfo snes_PrehistorikmanRomDesc[] = { + { "Prehistorik Man (U)(1995)(Titus).sfc", 1048576, 0xcb4f87bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Prehistorikman) +STD_ROM_FN(snes_Prehistorikman) + +struct BurnDriver BurnDrvsnes_Prehistorikman = { + "snes_prehistorikman", NULL, NULL, NULL, "1995", + "Prehistorik Man (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PrehistorikmanRomInfo, snes_PrehistorikmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prehistorik Man (Euro) + +static struct BurnRomInfo snes_PrehistorikmaneRomDesc[] = { + { "Prehistorik Man (E)(1995)(Titus).sfc", 1048576, 0xb0e4e48a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Prehistorikmane) +STD_ROM_FN(snes_Prehistorikmane) + +struct BurnDriver BurnDrvsnes_Prehistorikmane = { + "snes_prehistorikmane", "snes_prehistorikman", NULL, NULL, "1995", + "Prehistorik Man (Euro)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PrehistorikmaneRomInfo, snes_PrehistorikmaneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Primal Rage (USA) + +static struct BurnRomInfo snes_PrimalrageRomDesc[] = { + { "Primal Rage (U)(1995)(Time Warner Interactive).sfc", 3145728, 0x3753e4b6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Primalrage) +STD_ROM_FN(snes_Primalrage) + +struct BurnDriver BurnDrvsnes_Primalrage = { + "snes_primalrage", NULL, NULL, NULL, "1995", + "Primal Rage (USA)\0", NULL, "Time Warner Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_PrimalrageRomInfo, snes_PrimalrageRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Princess Minerva (Japan) + +static struct BurnRomInfo snes_PriminervajRomDesc[] = { + { "Princess Minerva (J)(1995)(Vic Tokai).sfc", 2097152, 0x213368d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Priminervaj) +STD_ROM_FN(snes_Priminervaj) + +struct BurnDriver BurnDrvsnes_Priminervaj = { + "snes_priminervaj", "snes_priminervate", NULL, NULL, "1995", + "Princess Minerva (Japan)\0", NULL, "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_PriminervajRomInfo, snes_PriminervajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Princess Minerva (Hack, English v1.02) +// https://www.romhacking.net/translations/3355/ +static struct BurnRomInfo snes_PriminervateRomDesc[] = { + { "Princess Minerva T-Eng v1.02 (2017)(Dynamic-Designs).sfc", 3145728, 0x20fb2457, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Priminervate) +STD_ROM_FN(snes_Priminervate) + +struct BurnDriver BurnDrvsnes_Priminervate = { + "snes_priminervate", NULL, NULL, NULL, "2017", + "Princess Minerva (Hack, English v1.02)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_PriminervateRomInfo, snes_PriminervateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prince of Persia (USA) + +static struct BurnRomInfo snes_PrincepersiaRomDesc[] = { + { "Prince of Persia (U)(1992)(Konami - NCS Corp.).sfc", 1048576, 0x891bb2bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Princepersia) +STD_ROM_FN(snes_Princepersia) + +struct BurnDriver BurnDrvsnes_Princepersia = { + "snes_princepersia", NULL, NULL, NULL, "1992", + "Prince of Persia (USA)\0", NULL, "Konami - NCS Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_PrincepersiaRomInfo, snes_PrincepersiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prince of Persia 2 (USA) + +static struct BurnRomInfo snes_Princepersia2RomDesc[] = { + { "Prince of Persia 2 (U)(1995)(Titus - Psygnosis).sfc", 2097152, 0x50581d9d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Princepersia2) +STD_ROM_FN(snes_Princepersia2) + +struct BurnDriver BurnDrvsnes_Princepersia2 = { + "snes_princepersia2", NULL, NULL, NULL, "1995", + "Prince of Persia 2 (USA)\0", NULL, "Titus - Psygnosis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Princepersia2RomInfo, snes_Princepersia2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prince of Persia (Japan) + +static struct BurnRomInfo snes_PrincepersiajRomDesc[] = { + { "Prince of Persia (J)(1992)(NCS Corp.).sfc", 1048576, 0xcfc71e89, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Princepersiaj) +STD_ROM_FN(snes_Princepersiaj) + +struct BurnDriver BurnDrvsnes_Princepersiaj = { + "snes_princepersiaj", "snes_princepersia", NULL, NULL, "1992", + "Prince of Persia (Japan)\0", NULL, "NCS Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_PrincepersiajRomInfo, snes_PrincepersiajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Psycho Dream (Japan) + +static struct BurnRomInfo snes_PsychodreamjRomDesc[] = { + { "Psycho Dream (J)(1992)(Riot).sfc", 1048576, 0x5c145e98, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Psychodreamj) +STD_ROM_FN(snes_Psychodreamj) + +struct BurnDriver BurnDrvsnes_Psychodreamj = { + "snes_psychodreamj", "snes_psychodreamte", NULL, NULL, "1992", + "Psycho Dream (Japan)\0", NULL, "Nippon Telenet - Riot", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PsychodreamjRomInfo, snes_PsychodreamjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Psycho Dream (Hack, English) +// https://www.romhacking.net/translations/7049/ +static struct BurnRomInfo snes_PsychodreamteRomDesc[] = { + { "Psycho Dream T-Eng (2023)(Stardust Crusaders).sfc", 1572864, 0x34a67bc2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Psychodreamte) +STD_ROM_FN(snes_Psychodreamte) + +struct BurnDriver BurnDrvsnes_Psychodreamte = { + "snes_psychodreamte", NULL, NULL, NULL, "2023", + "Psycho Dream (Hack, English)\0", NULL, "Stardust Crusaders", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PsychodreamteRomInfo, snes_PsychodreamteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The - Pugsley's Scavenger Hunt (USA) + +static struct BurnRomInfo snes_PugsleyscavhuntRomDesc[] = { + { "Addams Family, The - Pugsley's Scavenger Hunt (U)(1992)(Ocean).sfc", 1048576, 0x153a00a7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pugsleyscavhunt) +STD_ROM_FN(snes_Pugsleyscavhunt) + +struct BurnDriver BurnDrvsnes_Pugsleyscavhunt = { + "snes_pugsleyscavhunt", NULL, NULL, NULL, "1992", + "Addams Family, The - Pugsley's Scavenger Hunt (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PugsleyscavhuntRomInfo, snes_PugsleyscavhuntRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The - Pugsley's Scavenger Hunt (Euro) + +static struct BurnRomInfo snes_PugsleyscavhunteRomDesc[] = { + { "Addams Family, The - Pugsley's Scavenger Hunt (E)(1992)(Ocean).sfc", 1048576, 0x644e7fbf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pugsleyscavhunte) +STD_ROM_FN(snes_Pugsleyscavhunte) + +struct BurnDriver BurnDrvsnes_Pugsleyscavhunte = { + "snes_pugsleyscavhunte", "snes_pugsleyscavhunt", NULL, NULL, "1992", + "Addams Family, The - Pugsley's Scavenger Hunt (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PugsleyscavhunteRomInfo, snes_PugsleyscavhunteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Addams Family, The - Pugsley's Scavenger Hunt (Hack, Italian) + +static struct BurnRomInfo snes_PugsleyscavhunttiRomDesc[] = { + { "Addams Family, The - Pugsley's Scavenger Hunt T-Ita (2014)(Wesker90).sfc", 1048576, 0xd58fb46b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pugsleyscavhuntti) +STD_ROM_FN(snes_Pugsleyscavhuntti) + +struct BurnDriver BurnDrvsnes_Pugsleyscavhuntti = { + "snes_pugsleyscavhuntti", "snes_pugsleyscavhunt", NULL, NULL, "2014", + "Addams Family, The - Pugsley's Scavenger Hunt (Hack, Italian)\0", NULL, "Wesker90", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PugsleyscavhunttiRomInfo, snes_PugsleyscavhunttiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Push-Over (USA) + +static struct BurnRomInfo snes_PushoverRomDesc[] = { + { "Push-Over (U)(1992)(Ocean).sfc", 524288, 0xfa06d5f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pushover) +STD_ROM_FN(snes_Pushover) + +struct BurnDriver BurnDrvsnes_Pushover = { + "snes_pushover", NULL, NULL, NULL, "1992", + "Push-Over (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PushoverRomInfo, snes_PushoverRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Push-Over (Euro) + +static struct BurnRomInfo snes_PushovereRomDesc[] = { + { "Push-Over (E)(1992)(Ocean).sfc", 524288, 0x6a4347ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pushovere) +STD_ROM_FN(snes_Pushovere) + +struct BurnDriver BurnDrvsnes_Pushovere = { + "snes_pushovere", "snes_pushover", NULL, NULL, "1992", + "Push-Over (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PushovereRomInfo, snes_PushovereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Puzzle Bobble (Japan) + +static struct BurnRomInfo snes_PuzzlebubbleRomDesc[] = { + { "Puzzle Bobble (J)(1995)(Taito Corp.).sfc", 524288, 0x96bd588b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Puzzlebubble) +STD_ROM_FN(snes_Puzzlebubble) + +struct BurnDriver BurnDrvsnes_Puzzlebubble = { + "snes_puzzlebubble", "snes_bustamove", NULL, NULL, "1995", + "Puzzle Bobble (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_PuzzlebubbleRomInfo, snes_PuzzlebubbleRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Q*bert 3 (USA) + +static struct BurnRomInfo snes_Qbert3RomDesc[] = { + { "Q-bert 3 (U)(1992)(NTVIC).sfc", 524288, 0x694cbfe4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Qbert3) +STD_ROM_FN(snes_Qbert3) + +struct BurnDriver BurnDrvsnes_Qbert3 = { + "snes_qbert3", NULL, NULL, NULL, "1992", + "Q*bert 3 (USA)\0", NULL, "NTVIC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_Qbert3RomInfo, snes_Qbert3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Q*bert 3 (Japan) + +static struct BurnRomInfo snes_Qbert3jRomDesc[] = { + { "Q-bert 3 (J)(1992)(Vap).sfc", 524288, 0xea3bc44e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Qbert3j) +STD_ROM_FN(snes_Qbert3j) + +struct BurnDriver BurnDrvsnes_Qbert3j = { + "snes_qbert3j", "snes_qbert3", NULL, NULL, "1992", + "Q*bert 3 (Japan)\0", NULL, "Vap", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_Qbert3jRomInfo, snes_Qbert3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Race Drivin' (USA) + +static struct BurnRomInfo snes_RacedrivinRomDesc[] = { + { "Race Drivin' (U)(1992)(THQ).sfc", 524288, 0xc5bab870, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Racedrivin) +STD_ROM_FN(snes_Racedrivin) + +struct BurnDriver BurnDrvsnes_Racedrivin = { + "snes_racedrivin", NULL, NULL, NULL, "1992", + "Race Drivin' (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_RacedrivinRomInfo, snes_RacedrivinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Raccoon Rascal (Hack, English) +// https://www.romhacking.net/translations/7167/ +static struct BurnRomInfo snes_RacrascalRomDesc[] = { + { "Raccoon Rascal T-Eng (2024)(Zarby89).sfc", 2097152, 0x274b9bf2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Racrascal) +STD_ROM_FN(snes_Racrascal) + +struct BurnDriver BurnDrvsnes_Racrascal = { + "snes_racrascal", NULL, NULL, NULL, "2024", + "Raccoon Rascal (Hack, English)\0", NULL, "Zarby89", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_RacrascalRomInfo, snes_RacrascalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Radical Rex (USA) + +static struct BurnRomInfo snes_RadicalrexRomDesc[] = { + { "Radical Rex (U)(1994)(Activision).sfc", 1048576, 0xe2b8da18, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Radicalrex) +STD_ROM_FN(snes_Radicalrex) + +struct BurnDriver BurnDrvsnes_Radicalrex = { + "snes_radicalrex", NULL, NULL, NULL, "1994", + "Radical Rex (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RadicalrexRomInfo, snes_RadicalrexRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Raiden Trad (USA) + +static struct BurnRomInfo snes_RaidenRomDesc[] = { + { "Raiden Trad (U)(1992)(Electro Brain).sfc", 1048576, 0x02ce6c96, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Raiden) +STD_ROM_FN(snes_Raiden) + +struct BurnDriver BurnDrvsnes_Raiden = { + "snes_raiden", NULL, NULL, NULL, "1992", + "Raiden Trad (USA)\0", NULL, "Electro Brain - Micronics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_RaidenRomInfo, snes_RaidenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Raiden Densetsu (Japan) + +static struct BurnRomInfo snes_RaidenjRomDesc[] = { + { "Raiden Densetsu (J)(1991)(Toei Animation).sfc", 1048576, 0xc352d27f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Raidenj) +STD_ROM_FN(snes_Raidenj) + +struct BurnDriver BurnDrvsnes_Raidenj = { + "snes_raidenj", "snes_raiden", NULL, NULL, "1991", + "Raiden Densetsu (Japan)\0", NULL, "Toei Animation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_RaidenjRomInfo, snes_RaidenjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rampart (USA) + +static struct BurnRomInfo snes_RampartRomDesc[] = { + { "Rampart (U)(1991)(Atari).sfc", 524288, 0xaed8892a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rampart) +STD_ROM_FN(snes_Rampart) + +struct BurnDriver BurnDrvsnes_Rampart = { + "snes_rampart", NULL, NULL, NULL, "1991", + "Rampart (USA)\0", NULL, "Atari", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_RampartRomInfo, snes_RampartRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Hard Battle (USA) + +static struct BurnRomInfo snes_RanmahbRomDesc[] = { + { "Ranma 1-2 - Hard Battle (U)(1992)(DTMC).sfc", 1572864, 0x8e4dadcd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahb) +STD_ROM_FN(snes_Ranmahb) + +struct BurnDriver BurnDrvsnes_Ranmahb = { + "snes_ranmahb", NULL, NULL, NULL, "1992", + "Ranma 1/2 - Hard Battle (USA)\0", NULL, "DTMC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RanmahbRomInfo, snes_RanmahbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Chougi Ranbu Hen (Japan) + +static struct BurnRomInfo snes_Ranmahb2jRomDesc[] = { + { "Ranma 1-2 - Chougi Ranbu Hen (J)(1994)(Rumic Soft).sfc", 2621440, 0x0c552b1f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahb2j) +STD_ROM_FN(snes_Ranmahb2j) + +struct BurnDriver BurnDrvsnes_Ranmahb2j = { + "snes_ranmahb2j", "snes_ranmahb2te", NULL, NULL, "1994", + "Ranma 1/2 - Chougi Ranbu Hen (Japan)\0", NULL, "Rumic Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ranmahb2jRomInfo, snes_Ranmahb2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Hard Battle II - Super Move Hustle (Hack, English v1.10) +// https://www.romhacking.net/translations/3516/ +static struct BurnRomInfo snes_Ranmahb2teRomDesc[] = { + { "Ranma 1-2 - Hard Battle II - Super Move Hustle T-Eng v1.10 (2018)(Dynamic-Designs).sfc", 2686976, 0xd1a35227, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahb2te) +STD_ROM_FN(snes_Ranmahb2te) + +struct BurnDriver BurnDrvsnes_Ranmahb2te = { + "snes_ranmahb2te", NULL, NULL, NULL, "2018", + "Ranma 1/2 - Hard Battle II - Super Move Hustle (Hack, English v1.10)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ranmahb2teRomInfo, snes_Ranmahb2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 (Euro, English) + +static struct BurnRomInfo snes_RanmahbeRomDesc[] = { + { "Ranma 1-2 (E, Eng)(1993)(Ocean).sfc", 1572864, 0xe6c51ff7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahbe) +STD_ROM_FN(snes_Ranmahbe) + +struct BurnDriver BurnDrvsnes_Ranmahbe = { + "snes_ranmahbe", "snes_ranmahb", NULL, NULL, "1993", + "Ranma 1/2 (Euro, English)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RanmahbeRomInfo, snes_RanmahbeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 (Euro, French) + +static struct BurnRomInfo snes_RanmahbfRomDesc[] = { + { "Ranma 1-2 (E, France)(1993)(Ocean).sfc", 1572864, 0x3fe1854a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahbf) +STD_ROM_FN(snes_Ranmahbf) + +struct BurnDriver BurnDrvsnes_Ranmahbf = { + "snes_ranmahbf", "snes_ranmahb", NULL, NULL, "1993", + "Ranma 1/2 (Euro, French)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RanmahbfRomInfo, snes_RanmahbfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Bakuretsu Rantou Hen (Japan) + +static struct BurnRomInfo snes_RanmahbjRomDesc[] = { + { "Ranma 1-2 - Bakuretsu Rantou Hen (J)(1992)(NCS).sfc", 1572864, 0x053b2615, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahbj) +STD_ROM_FN(snes_Ranmahbj) + +struct BurnDriver BurnDrvsnes_Ranmahbj = { + "snes_ranmahbj", "snes_ranmahb", NULL, NULL, "1992", + "Ranma 1/2 - Bakuretsu Rantou Hen (Japan)\0", NULL, "NCS - Masaya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RanmahbjRomInfo, snes_RanmahbjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Akanekodan Teki Hihou (Japan) + +static struct BurnRomInfo snes_RanmarpgjRomDesc[] = { + { "Ranma 1-2 - Akanekodan Teki Hihou (J)(1993)(Rumic Soft).sfc", 1572864, 0xb473f453, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmarpgj) +STD_ROM_FN(snes_Ranmarpgj) + +struct BurnDriver BurnDrvsnes_Ranmarpgj = { + "snes_ranmarpgj", "snes_ranmarpgte", NULL, NULL, "1993", + "Ranma 1/2 - Akanekodan Teki Hihou (Japan)\0", NULL, "Rumic Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_RanmarpgjRomInfo, snes_RanmarpgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Treasure of the Red Cat Gang (Hack, English) +// https://www.romhacking.net/translations/404/ +static struct BurnRomInfo snes_RanmarpgteRomDesc[] = { + { "Ranma 1-2 - Treasure of the Red Cat Gang T-Eng (2000)(Dynamic-Designs).sfc", 1572864, 0x9c79c3b8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmarpgte) +STD_ROM_FN(snes_Ranmarpgte) + +struct BurnDriver BurnDrvsnes_Ranmarpgte = { + "snes_ranmarpgte", NULL, NULL, NULL, "2000", + "Ranma 1/2 - Treasure of the Red Cat Gang (Hack, English)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_RanmarpgteRomInfo, snes_RanmarpgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Realm (USA) + +static struct BurnRomInfo snes_RealmRomDesc[] = { + { "Realm (U)(1996)(Titus).sfc", 1048576, 0x0744ba5b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Realm) +STD_ROM_FN(snes_Realm) + +struct BurnDriver BurnDrvsnes_Realm = { + "snes_realm", NULL, NULL, NULL, "1996", + "Realm (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_RealmRomInfo, snes_RealmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Return of Double Dragon (Japan) + +static struct BurnRomInfo snes_ReturndoubledragonRomDesc[] = { + { "Return of Double Dragon (J)(1992)(Technos Japan).sfc", 1048576, 0x10470b58, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Returndoubledragon) +STD_ROM_FN(snes_Returndoubledragon) + +struct BurnDriver BurnDrvsnes_Returndoubledragon = { + "snes_returndoubledragon", "snes_superdoubledragon", NULL, NULL, "1992", + "Return of Double Dragon (Japan)\0", NULL, "Technos Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_ReturndoubledragonRomInfo, snes_ReturndoubledragonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Revolution X (USA) + +static struct BurnRomInfo snes_RevxRomDesc[] = { + { "Revolution X (U)(1995)(Acclaim Entertainment).sfc", 2097152, 0x0dc5e7ba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Revx) +STD_ROM_FN(snes_Revx) + +struct BurnDriver BurnDrvsnes_Revx = { + "snes_revx", NULL, NULL, NULL, "1995", + "Revolution X (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_RevxRomInfo, snes_RevxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Riddick Bowe Boxing (USA) + +static struct BurnRomInfo snes_RiddickbbRomDesc[] = { + { "Riddick Bowe Boxing (U)(1993)(Extreme Entertainment).sfc", 524288, 0xa967a041, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Riddickbb) +STD_ROM_FN(snes_Riddickbb) + +struct BurnDriver BurnDrvsnes_Riddickbb = { + "snes_riddickbb", NULL, NULL, NULL, "1993", + "Riddick Bowe Boxing (USA)\0", NULL, "Extreme Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_RiddickbbRomInfo, snes_RiddickbbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ring ni Kakero (Japan) + +static struct BurnRomInfo snes_RingkakeroRomDesc[] = { + { "Ring ni Kakero (J)(1995)(NCS - Masaya).sfc", 2621440, 0x503b5b86, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ringkakero) +STD_ROM_FN(snes_Ringkakero) + +struct BurnDriver BurnDrvsnes_Ringkakero = { + "snes_ringkakero", NULL, NULL, NULL, "1995", + "Ring ni Kakero (Japan)\0", NULL, "NCS - Masaya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_RingkakeroRomInfo, snes_RingkakeroRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rise of the Phoenix (USA) + +static struct BurnRomInfo snes_RisephoenixRomDesc[] = { + { "Rise of the Phoenix (U)(1995)(Koei).sfc", 1572864, 0x908b90b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Risephoenix) +STD_ROM_FN(snes_Risephoenix) + +struct BurnDriver BurnDrvsnes_Risephoenix = { + "snes_risephoenix", NULL, NULL, NULL, "1995", + "Rise of the Phoenix (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_RisephoenixRomInfo, snes_RisephoenixRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rise of the Robots (USA) + +static struct BurnRomInfo snes_RiserobotsRomDesc[] = { + { "Rise of the Robots (U)(1994)(Acclaim Entertainment).sfc", 4194304, 0x83ba0ac0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Riserobots) +STD_ROM_FN(snes_Riserobots) + +struct BurnDriver BurnDrvsnes_Riserobots = { + "snes_riserobots", NULL, NULL, NULL, "1994", + "Rise of the Robots (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RiserobotsRomInfo, snes_RiserobotsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rival Turf (USA) + +static struct BurnRomInfo snes_RivalturfRomDesc[] = { + { "Rival Turf (U)(1992)(Jaleco).sfc", 1048576, 0xca988f59, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rivalturf) +STD_ROM_FN(snes_Rivalturf) + +struct BurnDriver BurnDrvsnes_Rivalturf = { + "snes_rivalturf", NULL, NULL, NULL, "1992", + "Rival Turf (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_RivalturfRomInfo, snes_RivalturfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Road Runner's Death Valley Rally (USA) + +static struct BurnRomInfo snes_RoadrunnerdeathrallyRomDesc[] = { + { "Road Runner's Death Valley Rally (U)(1992)(Sunsoft).sfc", 1048576, 0x5980d75d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Roadrunnerdeathrally) +STD_ROM_FN(snes_Roadrunnerdeathrally) + +struct BurnDriver BurnDrvsnes_Roadrunnerdeathrally = { + "snes_roadrunnerdeathrally", NULL, NULL, NULL, "1992", + "Road Runner's Death Valley Rally (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RoadrunnerdeathrallyRomInfo, snes_RoadrunnerdeathrallyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// RoboCop 3 (USA) + +static struct BurnRomInfo snes_Robocop3RomDesc[] = { + { "RoboCop 3 (U)(1992)(Ocean).sfc", 1048576, 0x3502f9b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Robocop3) +STD_ROM_FN(snes_Robocop3) + +struct BurnDriver BurnDrvsnes_Robocop3 = { + "snes_robocop3", NULL, NULL, NULL, "1992", + "RoboCop 3 (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Robocop3RomInfo, snes_Robocop3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Robotrek (USA) + +static struct BurnRomInfo snes_RobotrekRomDesc[] = { + { "Robotrek (U)(1994)(Quintet-Enix).sfc", 1572864, 0x7ad4aadc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Robotrek) +STD_ROM_FN(snes_Robotrek) + +struct BurnDriver BurnDrvsnes_Robotrek = { + "snes_robotrek", NULL, NULL, NULL, "1994", + "Robotrek (USA)\0", NULL, "Quintet-Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_RobotrekRomInfo, snes_RobotrekRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// RoboCop versus The Terminator (USA) + +static struct BurnRomInfo snes_RobvstermRomDesc[] = { + { "RoboCop versus The Terminator (U)(1993)(Virgin Games - Interplay).sfc", 1048576, 0xf5ab5d91, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Robvsterm) +STD_ROM_FN(snes_Robvsterm) + +struct BurnDriver BurnDrvsnes_Robvsterm = { + "snes_robvsterm", NULL, NULL, NULL, "1993", + "RoboCop versus The Terminator (USA)\0", NULL, "Virgin Games - Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_RobvstermRomInfo, snes_RobvstermRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rocketeer, The (USA) + +static struct BurnRomInfo snes_RocketeerRomDesc[] = { + { "Rocketeer, The (U)(1992)(IGS).sfc", 1048576, 0x4c68a3c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rocketeer) +STD_ROM_FN(snes_Rocketeer) + +struct BurnDriver BurnDrvsnes_Rocketeer = { + "snes_rocketeer", NULL, NULL, NULL, "1992", + "Rocketeer, The (USA)\0", NULL, "IGS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_RocketeerRomInfo, snes_RocketeerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Adventures of the Rocketeer, The (Japan) + +static struct BurnRomInfo snes_RocketeerjRomDesc[] = { + { "Adventures of the Rocketeer, The (J)(1992)(IGS).sfc", 1048576, 0xcbc4868e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rocketeerj) +STD_ROM_FN(snes_Rocketeerj) + +struct BurnDriver BurnDrvsnes_Rocketeerj = { + "snes_rocketeerj", "snes_rocketeer", NULL, NULL, "1992", + "Adventures of the Rocketeer, The (Japan)\0", NULL, "IGS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_RocketeerjRomInfo, snes_RocketeerjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman & Forte (Japan) + +static struct BurnRomInfo snes_RockmanforteRomDesc[] = { + { "Rockman & Forte (J)(1998)(Capcom).sfc", 4194304, 0x5047e0d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockmanforte) +STD_ROM_FN(snes_Rockmanforte) + +struct BurnDriver BurnDrvsnes_Rockmanforte = { + "snes_rockmanforte", NULL, NULL, NULL, "1998", + "Rockman & Forte (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RockmanforteRomInfo, snes_RockmanforteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman 7 - Shukumei no Taiketsu! (Japan) + +static struct BurnRomInfo snes_Rockman7RomDesc[] = { + { "Rockman 7 - Shukumei no Taiketsu! (J)(1995)(Capcom).sfc", 2097152, 0x31f18dda, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockman7) +STD_ROM_FN(snes_Rockman7) + +struct BurnDriver BurnDrvsnes_Rockman7 = { + "snes_rockman7", "snes_megaman7", NULL, NULL, "1995", + "Rockman 7 - Shukumei no Taiketsu! (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Rockman7RomInfo, snes_Rockman7RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman X (Japan) + +static struct BurnRomInfo snes_RockmanxRomDesc[] = { + { "Rockman X (J)(1993)(Capcom).sfc", 1572864, 0x6a1b6926, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockmanx) +STD_ROM_FN(snes_Rockmanx) + +struct BurnDriver BurnDrvsnes_Rockmanx = { + "snes_rockmanx", "snes_megamanx", NULL, NULL, "1993", + "Rockman X (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RockmanxRomInfo, snes_RockmanxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman X2 (Japan) + +static struct BurnRomInfo snes_Rockmanx2RomDesc[] = { + { "Rockman X2 (J)(1994)(Capcom).sfc", 1572864, 0x299d7a89, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockmanx2) +STD_ROM_FN(snes_Rockmanx2) + +struct BurnDriver BurnDrvsnes_Rockmanx2 = { + "snes_rockmanx2", "snes_megamanx2", NULL, NULL, "1994", + "Rockman X2 (Japan)\0", "CX4 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Rockmanx2RomInfo, snes_Rockmanx2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman X3 (Japan) + +static struct BurnRomInfo snes_Rockmanx3RomDesc[] = { + { "Rockman X3 (J)(1995)(Capcom).sfc", 2097152, 0xe476912b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockmanx3) +STD_ROM_FN(snes_Rockmanx3) + +struct BurnDriver BurnDrvsnes_Rockmanx3 = { + "snes_rockmanx3", "snes_megamanx3", NULL, NULL, "1995", + "Rockman X3 (Japan)\0", "CX4 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Rockmanx3RomInfo, snes_Rockmanx3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rockman's Soccer (Japan) + +static struct BurnRomInfo snes_RockmansoccerRomDesc[] = { + { "Rockman's Soccer (J)(1994)(Capcom).sfc", 1310720, 0xa3277c10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockmansoccer) +STD_ROM_FN(snes_Rockmansoccer) + +struct BurnDriver BurnDrvsnes_Rockmansoccer = { + "snes_rockmansoccer", "snes_megamansoccer", NULL, NULL, "1994", + "Rockman's Soccer (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_RockmansoccerRomInfo, snes_RockmansoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rocko's Modern Life - Spunky's Dangerous Day (USA) + +static struct BurnRomInfo snes_RockomlifeRomDesc[] = { + { "Rocko's Modern Life - Spunky's Dangerous Day (U)(1994)(Viacom New Media).sfc", 1572864, 0x197b4cba, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockomlife) +STD_ROM_FN(snes_Rockomlife) + +struct BurnDriver BurnDrvsnes_Rockomlife = { + "snes_rockomlife", NULL, NULL, NULL, "1994", + "Rocko's Modern Life - Spunky's Dangerous Day (USA)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_RockomlifeRomInfo, snes_RockomlifeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rocky Rodent (USA) + +static struct BurnRomInfo snes_RockyrodentRomDesc[] = { + { "Rocky Rodent (U)(1993)(Irem).sfc", 1048576, 0xc81a7b07, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rockyrodent) +STD_ROM_FN(snes_Rockyrodent) + +struct BurnDriver BurnDrvsnes_Rockyrodent = { + "snes_rockyrodent", NULL, NULL, NULL, "1993", + "Rocky Rodent (USA)\0", NULL, "Irem", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RockyrodentRomInfo, snes_RockyrodentRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Romancing Sa-Ga (Japan) + +static struct BurnRomInfo snes_RomasagajRomDesc[] = { + { "Romancing Sa-Ga (J)(1991)(Squaresoft).sfc", 1048576, 0xa6d82435, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Romasagaj) +STD_ROM_FN(snes_Romasagaj) + +struct BurnDriver BurnDrvsnes_Romasagaj = { + "snes_romasagaj", "snes_romasagate", NULL, NULL, "1991", + "Romancing Sa-Ga (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_RomasagajRomInfo, snes_RomasagajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Romancing Sa-Ga (Hack, English v1.2) +// https://www.romhacking.net/translations/2377/ +static struct BurnRomInfo snes_RomasagateRomDesc[] = { + { "Romancing Sa-Ga T-Eng v1.2 (2016)(DDSTranslation).sfc", 1376256, 0x98d5e423, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Romasagate) +STD_ROM_FN(snes_Romasagate) + +struct BurnDriver BurnDrvsnes_Romasagate = { + "snes_romasagate", NULL, NULL, NULL, "2016", + "Romancing Sa-Ga (Hack, English v1.2)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_RomasagateRomInfo, snes_RomasagateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Royal Conquest (Japan) + +static struct BurnRomInfo snes_RoyalconqRomDesc[] = { + { "Royal Conquest (J)(1992)(Jaleco).sfc", 524288, 0xf60e933e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Royalconq) +STD_ROM_FN(snes_Royalconq) + +struct BurnDriver BurnDrvsnes_Royalconq = { + "snes_royalconq", "snes_kingarthurw", NULL, NULL, "1992", + "Royal Conquest (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_RoyalconqRomInfo, snes_RoyalconqRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Radical Psycho Machine Racing (USA) + +static struct BurnRomInfo snes_RpmracingRomDesc[] = { + { "Radical Psycho Machine Racing (U)(1991)(Interplay).sfc", 524288, 0xf7933734, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rpmracing) +STD_ROM_FN(snes_Rpmracing) + +struct BurnDriver BurnDrvsnes_Rpmracing = { + "snes_rpmracing", NULL, NULL, NULL, "1991", + "Radical Psycho Machine Racing (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_RpmracingRomInfo, snes_RpmracingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Road Riot 4WD (USA) + +static struct BurnRomInfo snes_Rr4wdRomDesc[] = { + { "Road Riot 4WD (U)(1992)(THQ).sfc", 524288, 0x20367643, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rr4wd) +STD_ROM_FN(snes_Rr4wd) + +struct BurnDriver BurnDrvsnes_Rr4wd = { + "snes_rr4wd", NULL, NULL, NULL, "1992", + "Road Riot 4WD (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Rr4wdRomInfo, snes_Rr4wdRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rendering Ranger R2 (Japan) + +static struct BurnRomInfo snes_Rrangerr2RomDesc[] = { + { "Rendering Ranger R2 (J)(1995)(Virgin - Rainbow Arts).sfc", 2097152, 0x8fb5ac86, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rrangerr2) +STD_ROM_FN(snes_Rrangerr2) + +struct BurnDriver BurnDrvsnes_Rrangerr2 = { + "snes_rrangerr2", NULL, NULL, NULL, "1995", + "Rendering Ranger R2 (Japan)\0", NULL, "Virgin Interactive - Rainbow Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Rrangerr2RomInfo, snes_Rrangerr2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 460, 4, 3 +}; + +// Rock N' Roll Racing (USA) + +static struct BurnRomInfo snes_RrracingRomDesc[] = { + { "Rock N' Roll Racing (U)(1993)(Interplay).sfc", 1048576, 0x7d06f473, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rrracing) +STD_ROM_FN(snes_Rrracing) + +struct BurnDriver BurnDrvsnes_Rrracing = { + "snes_rrracing", NULL, NULL, NULL, "1993", + "Rock N' Roll Racing (USA)\0", NULL, "Inteplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_RrracingRomInfo, snes_RrracingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ramos Ruy no World Wide Soccer (Japan) + +static struct BurnRomInfo snes_RrwwsoccerRomDesc[] = { + { "Ramos Ruy no World Wide Soccer (J)(1993)(Pack-In-Video).sfc", 1048576, 0x906d505e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rrwwsoccer) +STD_ROM_FN(snes_Rrwwsoccer) + +struct BurnDriver BurnDrvsnes_Rrwwsoccer = { + "snes_rrwwsoccer", "snes_tmsksoccer", NULL, NULL, "1993", + "Ramos Ruy no World Wide Soccer (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_RrwwsoccerRomInfo, snes_RrwwsoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ren & Stimpy Show, The - Buckeroo$! (USA) + +static struct BurnRomInfo snes_RssbuckeroosRomDesc[] = { + { "Ren & Stimpy Show, The - Buckeroo$! (U)(1993)(THQ).sfc", 1048576, 0x672ebf39, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rssbuckeroos) +STD_ROM_FN(snes_Rssbuckeroos) + +struct BurnDriver BurnDrvsnes_Rssbuckeroos = { + "snes_rssbuckeroos", NULL, NULL, NULL, "1993", + "Ren & Stimpy Show, The - Buckeroo$! (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RssbuckeroosRomInfo, snes_RssbuckeroosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ren & Stimpy Show, The - Fire Dogs (USA) + +static struct BurnRomInfo snes_RssfiredogsRomDesc[] = { + { "Ren & Stimpy Show, The - Fire Dogs (U)(1994)(THQ).sfc", 524288, 0x0b472197, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rssfiredogs) +STD_ROM_FN(snes_Rssfiredogs) + +struct BurnDriver BurnDrvsnes_Rssfiredogs = { + "snes_rssfiredogs", NULL, NULL, NULL, "1994", + "Ren & Stimpy Show, The - Fire Dogs (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RssfiredogsRomInfo, snes_RssfiredogsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Ren & Stimpy Show, The - Time Warp (USA) + +static struct BurnRomInfo snes_RsstimewarpRomDesc[] = { + { "Ren & Stimpy Show, The - Time Warp (U)(1994)(THQ).sfc", 1310720, 0xde8fe3e8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rsstimewarp) +STD_ROM_FN(snes_Rsstimewarp) + +struct BurnDriver BurnDrvsnes_Rsstimewarp = { + "snes_rsstimewarp", NULL, NULL, NULL, "1994", + "Ren & Stimpy Show, The - Time Warp (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RsstimewarpRomInfo, snes_RsstimewarpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ren & Stimpy Show, The - Veediots! (USA) + +static struct BurnRomInfo snes_RssveediotsRomDesc[] = { + { "Ren & Stimpy Show, The - Veediots! (U)(1993)(THQ).sfc", 1048576, 0xfd1c12a3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rssveediots) +STD_ROM_FN(snes_Rssveediots) + +struct BurnDriver BurnDrvsnes_Rssveediots = { + "snes_rssveediots", NULL, NULL, NULL, "1993", + "Ren & Stimpy Show, The - Veediots! (USA)\0", NULL, "THQ Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_RssveediotsRomInfo, snes_RssveediotsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// R-Type III - The Third Lightning (USA) + +static struct BurnRomInfo snes_RtypeiiiRomDesc[] = { + { "R-Type III (U)(1994)(Jaleco - Irem).sfc", 2097152, 0x642b656b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rtypeiii) +STD_ROM_FN(snes_Rtypeiii) + +struct BurnDriver BurnDrvsnes_Rtypeiii = { + "snes_rtypeiii", NULL, NULL, NULL, "1994", + "R-Type III - The Third Lightning (USA)\0", NULL, "Jaleco - Irem", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_RtypeiiiRomInfo, snes_RtypeiiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// R-Type III - The Third Lightning (Japan) + +static struct BurnRomInfo snes_RtypeiiijRomDesc[] = { + { "R-Type III - The Third Lightning (J)(1993)(Irem).sfc", 2097152, 0x1e1ff9fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rtypeiiij) +STD_ROM_FN(snes_Rtypeiiij) + +struct BurnDriver BurnDrvsnes_Rtypeiiij = { + "snes_rtypeiiij", "snes_rtypeiii", NULL, NULL, "1993", + "R-Type III - The Third Lightning (Japan)\0", NULL, "Irem Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_RtypeiiijRomInfo, snes_RtypeiiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Run Saber (USA) + +static struct BurnRomInfo snes_RunsaberRomDesc[] = { + { "Run Saber (U)(1993)(Atlus).sfc", 1048576, 0x8708e5bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Runsaber) +STD_ROM_FN(snes_Runsaber) + +struct BurnDriver BurnDrvsnes_Runsaber = { + "snes_runsaber", NULL, NULL, NULL, "1993", + "Run Saber (USA)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_RunsaberRomInfo, snes_RunsaberRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rushing Beat (Japan) + +static struct BurnRomInfo snes_RushbeatRomDesc[] = { + { "Rushing Beat (J)(1992)(Jaleco).sfc", 1048576, 0xa6f0693d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rushbeat) +STD_ROM_FN(snes_Rushbeat) + +struct BurnDriver BurnDrvsnes_Rushbeat = { + "snes_rushbeat", "snes_rivalturf", NULL, NULL, "1992", + "Rushing Beat (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_RushbeatRomInfo, snes_RushbeatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rushing Beat Ran - Fukusei Toshi (Japan) + +static struct BurnRomInfo snes_RushbeatranRomDesc[] = { + { "Rushing Beat Ran - Fukusei Toshi (J)(1992)(Jaleco).sfc", 1572864, 0x8f35ebe0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rushbeatran) +STD_ROM_FN(snes_Rushbeatran) + +struct BurnDriver BurnDrvsnes_Rushbeatran = { + "snes_rushbeatran", "snes_brawlbros", NULL, NULL, "1992", + "Rushing Beat Ran - Fukusei Toshi (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_RushbeatranRomInfo, snes_RushbeatranRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rushing Beat Shura (Japan) + +static struct BurnRomInfo snes_RushbeatshuraRomDesc[] = { + { "Rushing Beat Shura (J)(1993)(Jaleco).sfc", 2097152, 0x0a2e4c2f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rushbeatshura) +STD_ROM_FN(snes_Rushbeatshura) + +struct BurnDriver BurnDrvsnes_Rushbeatshura = { + "snes_rushbeatshura", "snes_peacekeepers", NULL, NULL, "1993", + "Rushing Beat Shura (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_RushbeatshuraRomInfo, snes_RushbeatshuraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Rushing Beat (Hack, English) +// https://www.romhacking.net/translations/2739/ +static struct BurnRomInfo snes_RushbeatteRomDesc[] = { + { "Rushing Beat T-Eng (2016)(FlashPV).sfc", 1048576, 0xe50381bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Rushbeatte) +STD_ROM_FN(snes_Rushbeatte) + +struct BurnDriver BurnDrvsnes_Rushbeatte = { + "snes_rushbeatte", "snes_rivalturf", NULL, NULL, "2016", + "Rushing Beat (Hack, English)\0", NULL, "FlashPV", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_RushbeatteRomInfo, snes_RushbeatteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ryuuko no Ken (Japan) + +static struct BurnRomInfo snes_RyuukoRomDesc[] = { + { "Ryuuko no Ken (J)(1993)(KAC - Monolith).sfc", 2097152, 0x0db2d9ab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ryuuko) +STD_ROM_FN(snes_Ryuuko) + +struct BurnDriver BurnDrvsnes_Ryuuko = { + "snes_ryuuko", "snes_aof", NULL, NULL, "1993", + "Ryuuko no Ken (Japan)\0", NULL, "KAC - Monolith", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_RyuukoRomInfo, snes_RyuukoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ryuuko no Ken 2 ~ Art of Fighting 2 (Japan) + +static struct BurnRomInfo snes_Ryuuko2RomDesc[] = { + { "Ryuuko no Ken 2 (J)(1994)(Saurus).sfc", 4194304, 0x40019293, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ryuuko2) +STD_ROM_FN(snes_Ryuuko2) + +struct BurnDriver BurnDrvsnes_Ryuuko2 = { + "snes_ryuuko2", NULL, NULL, NULL, "1994", + "Ryuuko no Ken 2 ~ Art of Fighting 2 (Japan)\0", NULL, "Saurus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ryuuko2RomInfo, snes_Ryuuko2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super 3D Baseball (Japan) + +static struct BurnRomInfo snes_S3dbaseballRomDesc[] = { + { "Super 3D Baseball (J)(1993)(Jaleco).sfc", 1572864, 0x304123c2, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_S3dbaseball, snes_S3dbaseball, snes_dsp1) +STD_ROM_FN(snes_S3dbaseball) + +struct BurnDriver BurnDrvsnes_S3dbaseball = { + "snes_s3dbaseball", "snes_sbloadedii", "snes_dsp1", NULL, "1993", + "Super 3D Baseball (Japan)\0", "DSP-1 enhancement chip", "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_S3dbaseballRomInfo, snes_S3dbaseballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super 3D Noah's Ark (USA) + +static struct BurnRomInfo snes_S3dnoaharkRomDesc[] = { + { "Super 3D Noah's Ark (U)(1994)(Wisdom Tree).sfc", 1048576, 0xa2315a14, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_S3dnoahark) +STD_ROM_FN(snes_S3dnoahark) + +struct BurnDriver BurnDrvsnes_S3dnoahark = { + "snes_s3dnoahark", NULL, NULL, NULL, "1994", + "Super 3D Noah's Ark (USA)\0", NULL, "Wisdom Tree", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_MAZE, 0, + SNESGetZipName, snes_S3dnoaharkRomInfo, snes_S3dnoaharkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Samurai Shodown (USA) + +static struct BurnRomInfo snes_SamshodownRomDesc[] = { + { "Samurai Shodown (U)(1994)(Takara).sfc", 4194304, 0x2e614a53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Samshodown) +STD_ROM_FN(snes_Samshodown) + +struct BurnDriver BurnDrvsnes_Samshodown = { + "snes_samshodown", NULL, NULL, NULL, "1994", + "Samurai Shodown (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SamshodownRomInfo, snes_SamshodownRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Samurai Spirits (Japan) + +static struct BurnRomInfo snes_SamspiritsRomDesc[] = { + { "Samurai Spirits (J)(1994)(Takara).sfc", 4194304, 0x7d3d39f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Samspirits) +STD_ROM_FN(snes_Samspirits) + +struct BurnDriver BurnDrvsnes_Samspirits = { + "snes_samspirits", "snes_samshodown", NULL, NULL, "1994", + "Samurai Spirits (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SamspiritsRomInfo, snes_SamspiritsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sanrio World Smash Ball! (Japan) + +static struct BurnRomInfo snes_SanriowsbjRomDesc[] = { + { "Sanrio World Smash Ball! (J)(1993)(Tomcat System).sfc", 262144, 0x0e318416, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sanriowsbj) +STD_ROM_FN(snes_Sanriowsbj) + +struct BurnDriver BurnDrvsnes_Sanriowsbj = { + "snes_sanriowsbj", "snes_sanriowsbte", NULL, NULL, "1993", + "Sanrio World Smash Ball! (Japan)\0", NULL, "Tomcat System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_BALLPADDLE, 0, + SNESGetZipName, snes_SanriowsbjRomInfo, snes_SanriowsbjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sanrio World Smash Ball! (Hack, English) +// https://www.romhacking.net/translations/437/ +static struct BurnRomInfo snes_SanriowsbteRomDesc[] = { + { "Sanrio World Smash Ball! T-Eng (1999)(Suicidal Translations).sfc", 295424, 0x9eaf1588, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sanriowsbte) +STD_ROM_FN(snes_Sanriowsbte) + +struct BurnDriver BurnDrvsnes_Sanriowsbte = { + "snes_sanriowsbte", NULL, NULL, NULL, "1999", + "Sanrio World Smash Ball! (Hack, English)\0", NULL, "Suicidal Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_BALLPADDLE, 0, + SNESGetZipName, snes_SanriowsbteRomInfo, snes_SanriowsbteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Baseball 2020 (USA) + +static struct BurnRomInfo snes_Sb2020RomDesc[] = { + { "Super Baseball 2020 (U)(1993)(Tradewest).sfc", 1572864, 0x0d77933e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sb2020) +STD_ROM_FN(snes_Sb2020) + +struct BurnDriver BurnDrvsnes_Sb2020 = { + "snes_sb2020", NULL, NULL, NULL, "1993", + "Super Baseball 2020 (USA)\0", NULL, "Tradewest", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Sb2020RomInfo, snes_Sb2020RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bases Loaded (USA) + +static struct BurnRomInfo snes_SbloadedRomDesc[] = { + { "Super Bases Loaded (U)(1991)(Jaleco).sfc", 1048576, 0x6b971f1e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbloaded) +STD_ROM_FN(snes_Sbloaded) + +struct BurnDriver BurnDrvsnes_Sbloaded = { + "snes_sbloaded", NULL, NULL, NULL, "1991", + "Super Bases Loaded (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SbloadedRomInfo, snes_SbloadedRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Bases Loaded II (USA) + +static struct BurnRomInfo snes_SbloadediiRomDesc[] = { + { "Super Bases Loaded II (U)(1994)(Jaleco).sfc", 1572864, 0xe14128ca, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Sbloadedii, snes_Sbloadedii, snes_dsp1) +STD_ROM_FN(snes_Sbloadedii) + +struct BurnDriver BurnDrvsnes_Sbloadedii = { + "snes_sbloadedii", NULL, "snes_dsp1", NULL, "1994", + "Super Bases Loaded II (USA)\0", "DSP-1 enhancement chip", "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SbloadediiRomInfo, snes_SbloadediiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sonic Blast Man (USA) + +static struct BurnRomInfo snes_SbmanRomDesc[] = { + { "Sonic Blast Man (U)(1992)(Taito).sfc", 1048576, 0x8886396e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbman) +STD_ROM_FN(snes_Sbman) + +struct BurnDriver BurnDrvsnes_Sbman = { + "snes_sbman", NULL, NULL, NULL, "1992", + "Sonic Blast Man (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SbmanRomInfo, snes_SbmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sonic Blast Man II (USA) + +static struct BurnRomInfo snes_SbmaniiRomDesc[] = { + { "Sonic Blast Man II (U)(1994)(Taito).sfc", 1572864, 0x24229a34, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbmanii) +STD_ROM_FN(snes_Sbmanii) + +struct BurnDriver BurnDrvsnes_Sbmanii = { + "snes_sbmanii", NULL, NULL, NULL, "1994", + "Sonic Blast Man II (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SbmaniiRomInfo, snes_SbmaniiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sonic Blast Man II (Japan) + +static struct BurnRomInfo snes_SbmaniijRomDesc[] = { + { "Sonic Blast Man II (J)(1994)(Taito Corp.).sfc", 1572864, 0xe7df3216, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbmaniij) +STD_ROM_FN(snes_Sbmaniij) + +struct BurnDriver BurnDrvsnes_Sbmaniij = { + "snes_sbmaniij", "snes_sbmanii", NULL, NULL, "1994", + "Sonic Blast Man II (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SbmaniijRomInfo, snes_SbmaniijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sonic Blast Man (Japan) + +static struct BurnRomInfo snes_SbmanjRomDesc[] = { + { "Sonic Blast Man (J)(1992)(Taito Corp.).sfc", 1048576, 0xbe523800, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbmanj) +STD_ROM_FN(snes_Sbmanj) + +struct BurnDriver BurnDrvsnes_Sbmanj = { + "snes_sbmanj", "snes_sbman", NULL, NULL, "1992", + "Sonic Blast Man (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SbmanjRomInfo, snes_SbmanjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Scooby-Doo Mystery (USA) + +static struct BurnRomInfo snes_ScoobydooRomDesc[] = { + { "Scooby-Doo Mystery (U)(1995)(Acclaim Entertainment).sfc", 2097152, 0x98d7611e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Scoobydoo) +STD_ROM_FN(snes_Scoobydoo) + +struct BurnDriver BurnDrvsnes_Scoobydoo = { + "snes_scoobydoo", NULL, NULL, NULL, "1995", + "Scooby-Doo Mystery (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_ScoobydooRomInfo, snes_ScoobydooRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SD F-1 Grand Prix (Japan) + +static struct BurnRomInfo snes_Sdf1gpjRomDesc[] = { + { "SD F-1 Grand Prix (J)(1995)(Video System).sfc", 2097152, 0x2fee01ad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sdf1gpj) +STD_ROM_FN(snes_Sdf1gpj) + +struct BurnDriver BurnDrvsnes_Sdf1gpj = { + "snes_sdf1gpj", NULL, NULL, NULL, "1995", + "SD F-1 Grand Prix (Japan)\0", "SA-1 enhancement CPU", "Video System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sdf1gpjRomInfo, snes_Sdf1gpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SD Gundam GX (Japan) + +static struct BurnRomInfo snes_SdgundamgxRomDesc[] = { + { "SD Gundam GX (J)(1994)(Bandai).sfc", 1048576, 0x4dc3d903, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Sdgundamgx, snes_Sdgundamgx, snes_dsp3) +STD_ROM_FN(snes_Sdgundamgx) + +struct BurnDriver BurnDrvsnes_Sdgundamgx = { + "snes_sdgundamgx", NULL, "snes_dsp3", NULL, "1994", + "SD Gundam GX (Japan)\0", "DSP-3 enhancement chip", "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SdgundamgxRomInfo, snes_SdgundamgxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Mana (USA) + +static struct BurnRomInfo snes_SecretmanaRomDesc[] = { + { "Secret of Mana (U)(1993)(Squaresoft).sfc", 2097152, 0xd0176b24, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secretmana) +STD_ROM_FN(snes_Secretmana) + +struct BurnDriver BurnDrvsnes_Secretmana = { + "snes_secretmana", NULL, NULL, NULL, "1993", + "Secret of Mana (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecretmanaRomInfo, snes_SecretmanaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Mana (Euro, English) + +static struct BurnRomInfo snes_SecretmanaeRomDesc[] = { + { "Secret of Mana (E)(1994)(Squaresoft).sfc", 2097152, 0xde112322, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secretmanae) +STD_ROM_FN(snes_Secretmanae) + +struct BurnDriver BurnDrvsnes_Secretmanae = { + "snes_secretmanae", "snes_secretmana", NULL, NULL, "1994", + "Secret of Mana (Euro, English)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecretmanaeRomInfo, snes_SecretmanaeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Mana (Euro, French) + +static struct BurnRomInfo snes_SecretmanafRomDesc[] = { + { "Secret of Mana (E, France)(1994)(Squaresoft).sfc", 2097152, 0xe9334b9e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secretmanaf) +STD_ROM_FN(snes_Secretmanaf) + +struct BurnDriver BurnDrvsnes_Secretmanaf = { + "snes_secretmanaf", "snes_secretmana", NULL, NULL, "1994", + "Secret of Mana (Euro, French)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecretmanafRomInfo, snes_SecretmanafRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Mana (Euro, German) + +static struct BurnRomInfo snes_SecretmanagRomDesc[] = { + { "Secret of Mana (E, Germany)(1994)(Squaresoft).sfc", 2097152, 0xb069bb3a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secretmanag) +STD_ROM_FN(snes_Secretmanag) + +struct BurnDriver BurnDrvsnes_Secretmanag = { + "snes_secretmanag", "snes_secretmana", NULL, NULL, "1994", + "Secret of Mana (Euro, German)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecretmanagRomInfo, snes_SecretmanagRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (USA) + +static struct BurnRomInfo snes_SecreverRomDesc[] = { + { "Secret of Evermore (U)(1995)(Squaresoft).sfc", 3145728, 0xa5c0045e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secrever) +STD_ROM_FN(snes_Secrever) + +struct BurnDriver BurnDrvsnes_Secrever = { + "snes_secrever", NULL, NULL, NULL, "1995", + "Secret of Evermore (USA)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecreverRomInfo, snes_SecreverRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (Euro, English) + +static struct BurnRomInfo snes_SecrevereRomDesc[] = { + { "Secret of Evermore (E)(1995)(Squaresoft).sfc", 3145728, 0xe168d085, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secrevere) +STD_ROM_FN(snes_Secrevere) + +struct BurnDriver BurnDrvsnes_Secrevere = { + "snes_secrevere", "snes_secrever", NULL, NULL, "1995", + "Secret of Evermore (Euro, English)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecrevereRomInfo, snes_SecrevereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (Euro, French) + +static struct BurnRomInfo snes_SecreverfRomDesc[] = { + { "Secret of Evermore (E, France)(1995)(Squaresoft).sfc", 3145728, 0x7425bb91, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secreverf) +STD_ROM_FN(snes_Secreverf) + +struct BurnDriver BurnDrvsnes_Secreverf = { + "snes_secreverf", "snes_secrever", NULL, NULL, "1995", + "Secret of Evermore (Euro, French)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecreverfRomInfo, snes_SecreverfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (Euro, German) + +static struct BurnRomInfo snes_SecrevergRomDesc[] = { + { "Secret of Evermore (E, Germany)(1995)(Squaresoft).sfc", 3145728, 0x27f60e77, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secreverg) +STD_ROM_FN(snes_Secreverg) + +struct BurnDriver BurnDrvsnes_Secreverg = { + "snes_secreverg", "snes_secrever", NULL, NULL, "1995", + "Secret of Evermore (Euro, German)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecrevergRomInfo, snes_SecrevergRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (Euro, Spanish) + +static struct BurnRomInfo snes_SecreversRomDesc[] = { + { "Secret of Evermore (E, Spain)(1995)(Squaresoft).sfc", 3145728, 0xca5935d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secrevers) +STD_ROM_FN(snes_Secrevers) + +struct BurnDriver BurnDrvsnes_Secrevers = { + "snes_secrevers", "snes_secrever", NULL, NULL, "1995", + "Secret of Evermore (Euro, Spanish)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecreversRomInfo, snes_SecreversRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Secret of Evermore (Hack, Italian v1.2) +// https://romhacking.it/project/view/id/681 +static struct BurnRomInfo snes_SecrevertiRomDesc[] = { + { "Secret of Evermore T-Ita v1.2 (2021)(Mumble Translations).sfc", 4194304, 0x14e2175a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secreverti) +STD_ROM_FN(snes_Secreverti) + +struct BurnDriver BurnDrvsnes_Secreverti = { + "snes_secreverti", "snes_secrever", NULL, NULL, "2021", + "Secret of Evermore (Hack, Italian v1.2)\0", NULL, "Mumble Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SecrevertiRomInfo, snes_SecrevertiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tecmo Secret of the Stars (USA) + +static struct BurnRomInfo snes_SecrstarsRomDesc[] = { + { "Tecmo Secret of the Stars (U)(1995)(Tecmo).sfc", 1572864, 0xef968ed1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Secrstars) +STD_ROM_FN(snes_Secrstars) + +struct BurnDriver BurnDrvsnes_Secrstars = { + "snes_secrstars", NULL, NULL, NULL, "1995", + "Tecmo Secret of the Stars (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SecrstarsRomInfo, snes_SecrstarsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Seiken Densetsu 2 (Japan) + +static struct BurnRomInfo snes_Seikdens2RomDesc[] = { + { "Seiken Densetsu 2 (J)(1993)(Squaresoft).sfc", 2097152, 0xb8049e3c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Seikdens2) +STD_ROM_FN(snes_Seikdens2) + +struct BurnDriver BurnDrvsnes_Seikdens2 = { + "snes_seikdens2", "snes_secretmana", NULL, NULL, "1993", + "Seiken Densetsu 2 (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_Seikdens2RomInfo, snes_Seikdens2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sengoku Denshou (Japan) + +static struct BurnRomInfo snes_SengokujRomDesc[] = { + { "Sengoku Denshou (J)(1993)(Data East).sfc", 1048576, 0xc9d97b3e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sengokuj) +STD_ROM_FN(snes_Sengokuj) + +struct BurnDriver BurnDrvsnes_Sengokuj = { + "snes_sengokuj", "snes_sengokute", NULL, NULL, "1993", + "Sengoku Denshou (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SengokujRomInfo, snes_SengokujRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sengoku Denshou (Hack, English) +// https://www.romhacking.net/translations/1742/ +static struct BurnRomInfo snes_SengokuteRomDesc[] = { + { "Sengoku Denshou T-Eng (2012)(Vice Translations).sfc", 1048576, 0x0b3d1f0b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sengokute) +STD_ROM_FN(snes_Sengokute) + +struct BurnDriver BurnDrvsnes_Sengokute = { + "snes_sengokute", NULL, NULL, NULL, "2012", + "Sengoku Denshou (Hack, English)\0", NULL, "Vice Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SengokuteRomInfo, snes_SengokuteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Venom & Spider-Man - Separation Anxiety (USA) + +static struct BurnRomInfo snes_SepanxietyRomDesc[] = { + { "Venom & Spider-Man - Separation Anxiety (U)(1995)(Acclaim Entertainment).sfc", 3145728, 0x919c509d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sepanxiety) +STD_ROM_FN(snes_Sepanxiety) + +struct BurnDriver BurnDrvsnes_Sepanxiety = { + "snes_sepanxiety", NULL, NULL, NULL, "1995", + "Venom & Spider-Man - Separation Anxiety (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SepanxietyRomInfo, snes_SepanxietyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Septentrion (Japan) + +static struct BurnRomInfo snes_SeptentrionRomDesc[] = { + { "Septentrion (J)(1993)(Human Entertainment).sfc", 1048576, 0x6d8d580d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Septentrion) +STD_ROM_FN(snes_Septentrion) + +struct BurnDriver BurnDrvsnes_Septentrion = { + "snes_septentrion", "snes_sos", NULL, NULL, "1993", + "Septentrion (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SeptentrionRomInfo, snes_SeptentrionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super F1 Circus Gaiden (Japan) + +static struct BurnRomInfo snes_Sf1cgaidenjRomDesc[] = { + { "Super F1 Circus Gaiden (J)(1995)(Nichibutsu).sfc", 1310720, 0x6b8ac3b3, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Sf1cgaidenj, snes_Sf1cgaidenj, snes_dsp1) +STD_ROM_FN(snes_Sf1cgaidenj) + +struct BurnDriver BurnDrvsnes_Sf1cgaidenj = { + "snes_sf1cgaidenj", NULL, "snes_dsp1", NULL, "1995", + "Super F1 Circus Gaiden (Japan)\0", "DSP-1 enhancement chip", "Nichibutsu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sf1cgaidenjRomInfo, snes_Sf1cgaidenjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super F1 Circus 2 (Japan) + +static struct BurnRomInfo snes_Sf1circus2jRomDesc[] = { + { "Super F1 Circus 2 (J)(1993)(Nichibutsu).sfc", 1572864, 0x0ab53000, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf1circus2j) +STD_ROM_FN(snes_Sf1circus2j) + +struct BurnDriver BurnDrvsnes_Sf1circus2j = { + "snes_sf1circus2j", NULL, NULL, NULL, "1993", + "Super F1 Circus 2 (Japan)\0", NULL, "Nichibutsu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sf1circus2jRomInfo, snes_Sf1circus2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super F1 Circus 3 (Japan) + +static struct BurnRomInfo snes_Sf1circus3jRomDesc[] = { + { "Super F1 Circus 3 (J)(1994)(Nichibutsu).sfc", 2097152, 0x26ef22cb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf1circus3j) +STD_ROM_FN(snes_Sf1circus3j) + +struct BurnDriver BurnDrvsnes_Sf1circus3j = { + "snes_sf1circus3j", NULL, NULL, NULL, "1994", + "Super F1 Circus 3 (Japan)\0", NULL, "Nichibutsu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sf1circus3jRomInfo, snes_Sf1circus3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super F1 Circus (Japan) + +static struct BurnRomInfo snes_Sf1circusjRomDesc[] = { + { "Super F1 Circus (J)(1992)(Nichibutsu).sfc", 1048576, 0x7c94c86c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf1circusj) +STD_ROM_FN(snes_Sf1circusj) + +struct BurnDriver BurnDrvsnes_Sf1circusj = { + "snes_sf1circusj", NULL, NULL, NULL, "1992", + "Super F1 Circus (Japan)\0", NULL, "Nichibutsu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sf1circusjRomInfo, snes_Sf1circusjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super F1 Circus Limited (Japan) + +static struct BurnRomInfo snes_Sf1climitedjRomDesc[] = { + { "Super F1 Circus Limited (J)(1992)(Nichibutsu).sfc", 1048576, 0x047270f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf1climitedj) +STD_ROM_FN(snes_Sf1climitedj) + +struct BurnDriver BurnDrvsnes_Sf1climitedj = { + "snes_sf1climitedj", NULL, NULL, NULL, "1992", + "Super F1 Circus Limited (Japan)\0", NULL, "Nichibutsu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Sf1climitedjRomInfo, snes_Sf1climitedjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Street Fighter II (USA) + +static struct BurnRomInfo snes_Sf2RomDesc[] = { + { "Street Fighter II (U)(1992)(Capcom).sfc", 2097152, 0xbc3dcd9d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf2) +STD_ROM_FN(snes_Sf2) + +struct BurnDriver BurnDrvsnes_Sf2 = { + "snes_sf2", NULL, NULL, NULL, "1992", + "Street Fighter II (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sf2RomInfo, snes_Sf2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter II (Japan) + +static struct BurnRomInfo snes_Sf2jRomDesc[] = { + { "Street Fighter II (J)(1992)(Capcom).sfc", 2097152, 0x5556c5c9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf2j) +STD_ROM_FN(snes_Sf2j) + +struct BurnDriver BurnDrvsnes_Sf2j = { + "snes_sf2j", "snes_sf2", NULL, NULL, "1992", + "Street Fighter II (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sf2jRomInfo, snes_Sf2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter II Turbo (USA) + +static struct BurnRomInfo snes_Sf2turboRomDesc[] = { + { "Street Fighter II Turbo (U)(1993)(Capcom).sfc", 2621440, 0xa45cadd6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf2turbo) +STD_ROM_FN(snes_Sf2turbo) + +struct BurnDriver BurnDrvsnes_Sf2turbo = { + "snes_sf2turbo", NULL, NULL, NULL, "1993", + "Street Fighter II Turbo (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sf2turboRomInfo, snes_Sf2turboRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter II Turbo (Japan) + +static struct BurnRomInfo snes_Sf2turbojRomDesc[] = { + { "Street Fighter II Turbo (J)(1993)(Capcom).sfc", 2621440, 0x364087e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sf2turboj) +STD_ROM_FN(snes_Sf2turboj) + +struct BurnDriver BurnDrvsnes_Sf2turboj = { + "snes_sf2turboj", "snes_sf2turbo", NULL, NULL, "1993", + "Street Fighter II Turbo (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sf2turbojRomInfo, snes_Sf2turbojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter Alpha 2 (USA) + +static struct BurnRomInfo snes_Sfalpha2RomDesc[] = { + { "Street Fighter Alpha 2 (U)(1996)(Capcom).sfc", 4194304, 0x9c59ddff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfalpha2) +STD_ROM_FN(snes_Sfalpha2) + +struct BurnDriver BurnDrvsnes_Sfalpha2 = { + "snes_sfalpha2", NULL, NULL, NULL, "1996", + "Street Fighter Alpha 2 (USA)\0", "S-DD1 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sfalpha2RomInfo, snes_Sfalpha2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter Alpha 2 (Euro) + +static struct BurnRomInfo snes_Sfalpha2eRomDesc[] = { + { "Street Fighter Alpha 2 (E)(1996)(Capcom).sfc", 4194304, 0x2f109101, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfalpha2e) +STD_ROM_FN(snes_Sfalpha2e) + +struct BurnDriver BurnDrvsnes_Sfalpha2e = { + "snes_sfalpha2e", "snes_sfalpha2", NULL, NULL, "1996", + "Street Fighter Alpha 2 (Euro)\0", "S-DD1 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Sfalpha2eRomInfo, snes_Sfalpha2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Family Circuit (Japan) + +static struct BurnRomInfo snes_SfcircuitjRomDesc[] = { + { "Super Family Circuit (J)(1994)(Namco).sfc", 1048576, 0xdc82850e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfcircuitj) +STD_ROM_FN(snes_Sfcircuitj) + +struct BurnDriver BurnDrvsnes_Sfcircuitj = { + "snes_sfcircuitj", "snes_sfcircuitte", NULL, NULL, "1994", + "Super Family Circuit (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SfcircuitjRomInfo, snes_SfcircuitjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Family Circuit (Hack, English) +// https://www.romhacking.net/translations/3941/ +static struct BurnRomInfo snes_SfcircuitteRomDesc[] = { + { "Super Family Circuit T-Eng (2018)(MrRichard999).sfc", 1048576, 0x83f3e0c8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfcircuitte) +STD_ROM_FN(snes_Sfcircuitte) + +struct BurnDriver BurnDrvsnes_Sfcircuitte = { + "snes_sfcircuitte", NULL, NULL, NULL, "2018", + "Super Family Circuit (Hack, English)\0", NULL, "MrRichard999", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SfcircuitteRomInfo, snes_SfcircuitteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Famicom Wars (Japan) + +static struct BurnRomInfo snes_SfwarsjRomDesc[] = { + { "Super Famicom Wars (J)(1998)(Nintendo).sfc", 2097152, 0xd6eacbea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfwarsj) +STD_ROM_FN(snes_Sfwarsj) + +struct BurnDriver BurnDrvsnes_Sfwarsj = { + "snes_sfwarsj", "snes_sfwarste", NULL, NULL, "1998", + "Super Famicom Wars (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SfwarsjRomInfo, snes_SfwarsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Famicom Wars (Hack, English v1.1) +// https://www.romhacking.net/translations/3354/ +static struct BurnRomInfo snes_SfwarsteRomDesc[] = { + { "Super Famicom Wars T-Eng v1.1 (2018)(Optiroc).sfc", 2097152, 0x45cbdf8d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfwarste) +STD_ROM_FN(snes_Sfwarste) + +struct BurnDriver BurnDrvsnes_Sfwarste = { + "snes_sfwarste", NULL, NULL, NULL, "2018", + "Super Famicom Wars (Hack, English v1.1)\0", NULL, "Optiroc", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 4, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SfwarsteRomInfo, snes_SfwarsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Fighter Zero 2 (Japan) + +static struct BurnRomInfo snes_SfzerojRomDesc[] = { + { "Street Fighter Zero 2 (J)(1996)(Capcom).sfc", 4194304, 0x7455a7cf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sfzeroj) +STD_ROM_FN(snes_Sfzeroj) + +struct BurnDriver BurnDrvsnes_Sfzeroj = { + "snes_sfzeroj", "snes_sfalpha2", NULL, NULL, "1996", + "Street Fighter Zero 2 (Japan)\0", "S-DD1 enhancement chip", "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SfzerojRomInfo, snes_SfzerojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Godzilla (USA) + +static struct BurnRomInfo snes_SgodzillaRomDesc[] = { + { "Super Godzilla (U)(1993)(Toho Co.).sfc", 1572864, 0x6a187c70, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sgodzilla) +STD_ROM_FN(snes_Sgodzilla) + +struct BurnDriver BurnDrvsnes_Sgodzilla = { + "snes_sgodzilla", NULL, NULL, NULL, "1993", + "Super Godzilla (USA)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_SgodzillaRomInfo, snes_SgodzillaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Godzilla (Japan) + +static struct BurnRomInfo snes_SgodzillajRomDesc[] = { + { "Super Godzilla (J)(1993)(Toho Co.).sfc", 1572864, 0x56d63328, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sgodzillaj) +STD_ROM_FN(snes_Sgodzillaj) + +struct BurnDriver BurnDrvsnes_Sgodzillaj = { + "snes_sgodzillaj", "snes_sgodzilla", NULL, NULL, "1993", + "Super Godzilla (Japan)\0", NULL, "Toho Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_SgodzillajRomInfo, snes_SgodzillajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Shadowrun (USA) + +static struct BurnRomInfo snes_ShadowrunRomDesc[] = { + { "Shadowrun (U)(1993)(Data East).sfc", 1048576, 0x3f34dff0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shadowrun) +STD_ROM_FN(snes_Shadowrun) + +struct BurnDriver BurnDrvsnes_Shadowrun = { + "snes_shadowrun", NULL, NULL, NULL, "1993", + "Shadowrun (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_ShadowrunRomInfo, snes_ShadowrunRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shadowrun (Japan) + +static struct BurnRomInfo snes_ShadowrunjRomDesc[] = { + { "Shadowrun (J)(1993)(Data East).sfc", 1310720, 0xefd4d741, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shadowrunj) +STD_ROM_FN(snes_Shadowrunj) + +struct BurnDriver BurnDrvsnes_Shadowrunj = { + "snes_shadowrunj", "snes_shadowrun", NULL, NULL, "1993", + "Shadowrun (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_ShadowrunjRomInfo, snes_ShadowrunjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shadowrun (Hack, Italian v0.98) +// https://www.romhacking.net/translations/6537/ +static struct BurnRomInfo snes_ShadowruntiRomDesc[] = { + { "Shadowrun T-Ita v0.98 (2022)(Wolfgare).sfc", 1048576, 0x5c663c1f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shadowrunti) +STD_ROM_FN(snes_Shadowrunti) + +struct BurnDriver BurnDrvsnes_Shadowrunti = { + "snes_shadowrunti", "snes_shadowrun", NULL, NULL, "2022", + "Shadowrun (Hack, Italian v0.98)\0", NULL, "Wolfgare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_ShadowruntiRomInfo, snes_ShadowruntiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shanghai II - Dragon's Eye (USA) + +static struct BurnRomInfo snes_Shanghai2RomDesc[] = { + { "Shanghai II - Dragon's Eye (U)(1992)(Activision).sfc", 1048576, 0x2fec70b6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shanghai2) +STD_ROM_FN(snes_Shanghai2) + +struct BurnDriver BurnDrvsnes_Shanghai2 = { + "snes_shanghai2", NULL, NULL, NULL, "1992", + "Shanghai II - Dragon's Eye (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MAHJONG | GBF_PUZZLE, 0, + SNESGetZipName, snes_Shanghai2RomInfo, snes_Shanghai2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shaq-Fu (USA) + +static struct BurnRomInfo snes_ShaqfuRomDesc[] = { + { "Shaq-Fu (U)(1994)(Electronic Arts).sfc", 2097152, 0x52916c9d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shaqfu) +STD_ROM_FN(snes_Shaqfu) + +struct BurnDriver BurnDrvsnes_Shaqfu = { + "snes_shaqfu", NULL, NULL, NULL, "1994", + "Shaq-Fu (USA)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_ShaqfuRomInfo, snes_ShaqfuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shien - The Blade Chaser (Japan) + +static struct BurnRomInfo snes_ShientbcRomDesc[] = { + { "Shien - The Blade Chaser (J)(1994)(Dynamic Kikaku).sfc", 2097152, 0x17db8d06, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shientbc) +STD_ROM_FN(snes_Shientbc) + +struct BurnDriver BurnDrvsnes_Shientbc = { + "snes_shientbc", NULL, NULL, NULL, "1994", + "Shien - The Blade Chaser (Japan)\0", NULL, "Dynamic Kikaku", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_ShientbcRomInfo, snes_ShientbcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Nekketsu Kouha - Kunio-tachi no Banka (Japan) + +static struct BurnRomInfo snes_ShinkouhajRomDesc[] = { + { "Shin Nekketsu Kouha - Kunio-tachi no Banka (J)(1994)(Technos).sfc", 2097152, 0x31be696c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shinkouhaj) +STD_ROM_FN(snes_Shinkouhaj) + +struct BurnDriver BurnDrvsnes_Shinkouhaj = { + "snes_shinkouhaj", "snes_shinkouhate", NULL, NULL, "1994", + "Shin Nekketsu Kouha - Kunio-tachi no Banka (Japan)\0", NULL, "Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_ShinkouhajRomInfo, snes_ShinkouhajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Nekketsu Kouha - Kunio-tachi no Banka (Hack, English) +// https://www.romhacking.net/translations/598/ +static struct BurnRomInfo snes_ShinkouhateRomDesc[] = { + { "Shin Nekketsu Kouha - Kunio-tachi no Banka T-Eng (2002)(Aeon Genesis).sfc", 2097664, 0x71012823, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shinkouhate) +STD_ROM_FN(snes_Shinkouhate) + +struct BurnDriver BurnDrvsnes_Shinkouhate = { + "snes_shinkouhate", NULL, NULL, NULL, "2002", + "Shin Nekketsu Kouha - Kunio-tachi no Banka (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_ShinkouhateRomInfo, snes_ShinkouhateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shounen Ashibe: Goma-chan no Yuuenchi Daibouken (Japan) + +static struct BurnRomInfo snes_ShouashibeRomDesc[] = { + { "Shounen Ashibe - Goma-chan no Yuuenchi Daibouken (J)(1992)(Takara).sfc", 524288, 0xd01ab6a8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shouashibe) +STD_ROM_FN(snes_Shouashibe) + +struct BurnDriver BurnDrvsnes_Shouashibe = { + "snes_shouashibe", NULL, NULL, NULL, "1992", + "Shounen Ashibe: Goma-chan no Yuuenchi Daibouken (Japan)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ShouashibeRomInfo, snes_ShouashibeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Side Pocket (USA) + +static struct BurnRomInfo snes_SidepocketRomDesc[] = { + { "Side Pocket (U)(1993)(Data East).sfc", 1048576, 0x597c2bfe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sidepocket) +STD_ROM_FN(snes_Sidepocket) + +struct BurnDriver BurnDrvsnes_Sidepocket = { + "snes_sidepocket", NULL, NULL, NULL, "1993", + "Side Pocket (USA)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SidepocketRomInfo, snes_SidepocketRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimAnt - The Electronic Ant Colony (USA) + +static struct BurnRomInfo snes_SimantRomDesc[] = { + { "SimAnt - The Electronic Ant Colony (U)(1993)(Imagineer).sfc", 1048576, 0xd08c05df, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simant) +STD_ROM_FN(snes_Simant) + +struct BurnDriver BurnDrvsnes_Simant = { + "snes_simant", NULL, NULL, NULL, "1993", + "SimAnt - The Electronic Ant Colony (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimantRomInfo, snes_SimantRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimAnt (Japan) + +static struct BurnRomInfo snes_SimantjRomDesc[] = { + { "SimAnt (J)(1993)(Imageneer).sfc", 1048576, 0x34b99a85, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simantj) +STD_ROM_FN(snes_Simantj) + +struct BurnDriver BurnDrvsnes_Simantj = { + "snes_simantj", "snes_simant", NULL, NULL, "1993", + "SimAnt (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimantjRomInfo, snes_SimantjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity (USA) + +static struct BurnRomInfo snes_SimcityRomDesc[] = { + { "SimCity (U)(1991)(Nintendo).sfc", 524288, 0x8aedd3a1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcity) +STD_ROM_FN(snes_Simcity) + +struct BurnDriver BurnDrvsnes_Simcity = { + "snes_simcity", NULL, NULL, NULL, "1991", + "SimCity (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimcityRomInfo, snes_SimcityRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity (Euro, German) + +static struct BurnRomInfo snes_SimcitydeRomDesc[] = { + { "SimCity (E, Germany)(1992)(Nintendo).sfc", 524288, 0x451e4708, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcityde) +STD_ROM_FN(snes_Simcityde) + +struct BurnDriver BurnDrvsnes_Simcityde = { + "snes_simcityde", "snes_simcity", NULL, NULL, "1992", + "SimCity (Euro, German)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimcitydeRomInfo, snes_SimcitydeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity (Euro, English) + +static struct BurnRomInfo snes_SimcityeRomDesc[] = { + { "SimCity (E)(1991)(Nintendo).sfc", 524288, 0x81d85180, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcitye) +STD_ROM_FN(snes_Simcitye) + +struct BurnDriver BurnDrvsnes_Simcitye = { + "snes_simcitye", "snes_simcity", NULL, NULL, "1991", + "SimCity (Euro, English)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimcityeRomInfo, snes_SimcityeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity (Euro, French) + +static struct BurnRomInfo snes_SimcityfrRomDesc[] = { + { "SimCity (E, France)(1993)(Nintendo).sfc", 524288, 0x5d026339, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcityfr) +STD_ROM_FN(snes_Simcityfr) + +struct BurnDriver BurnDrvsnes_Simcityfr = { + "snes_simcityfr", "snes_simcity", NULL, NULL, "1993", + "SimCity (Euro, French)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimcityfrRomInfo, snes_SimcityfrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity (Japan) + +static struct BurnRomInfo snes_SimcityjRomDesc[] = { + { "SimCity (J)(1991)(Nintendo).sfc", 524288, 0xa39fd8d8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcityj) +STD_ROM_FN(snes_Simcityj) + +struct BurnDriver BurnDrvsnes_Simcityj = { + "snes_simcityj", "snes_simcity", NULL, NULL, "1991", + "SimCity (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SimcityjRomInfo, snes_SimcityjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity 2000 - The Ultimate City Simulator (USA) + +static struct BurnRomInfo snes_Simcity2RomDesc[] = { + { "SimCity 2000 - The Ultimate City Simulator (U)(1995)(Black Pearl).sfc", 2097152, 0x2d5dc011, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcity2) +STD_ROM_FN(snes_Simcity2) + +struct BurnDriver BurnDrvsnes_Simcity2 = { + "snes_simcity2", NULL, NULL, NULL, "1995", + "SimCity 2000 - The Ultimate City Simulator (USA)\0", NULL, "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Simcity2RomInfo, snes_Simcity2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity 2000 - The Ultimate City Simulator (Euro) + +static struct BurnRomInfo snes_Simcity2eRomDesc[] = { + { "SimCity 2000 - The Ultimate City Simulator (E)(1995)(Black Pearl).sfc", 2097152, 0xa1c28940, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcity2e) +STD_ROM_FN(snes_Simcity2e) + +struct BurnDriver BurnDrvsnes_Simcity2e = { + "snes_simcity2e", "snes_simcity2", NULL, NULL, "1995", + "SimCity 2000 - The Ultimate City Simulator (Euro)\0", NULL, "THQ Inc. - Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Simcity2eRomInfo, snes_Simcity2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SimCity 2000 - The Ultimate City Simulator (Japan) + +static struct BurnRomInfo snes_Simcity2jRomDesc[] = { + { "SimCity 2000 - The Ultimate City Simulator (J)(1995)(Imagineer).sfc", 2097152, 0xb0e89cc6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simcity2j) +STD_ROM_FN(snes_Simcity2j) + +struct BurnDriver BurnDrvsnes_Simcity2j = { + "snes_simcity2j", "snes_simcity2", NULL, NULL, "1995", + "SimCity 2000 - The Ultimate City Simulator (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Simcity2jRomInfo, snes_Simcity2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Simpsons, The - Bart's Nightmare (USA) + +static struct BurnRomInfo snes_SimpsonsbnRomDesc[] = { + { "Simpsons, The - Bart's Nightmare (U)(1992)(Acclaim Entertainment).sfc", 1048576, 0xed1c03c2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Simpsonsbn) +STD_ROM_FN(snes_Simpsonsbn) + +struct BurnDriver BurnDrvsnes_Simpsonsbn = { + "snes_simpsonsbn", NULL, NULL, NULL, "1992", + "Simpsons, The - Bart's Nightmare (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SimpsonsbnRomInfo, snes_SimpsonsbnRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// S.O.S - Sink or Swim (USA) + +static struct BurnRomInfo snes_SinkorswimRomDesc[] = { + { "S.O.S - Sink or Swim (U)(1994)(Titus).sfc", 524288, 0xdd329f85, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sinkorswim) +STD_ROM_FN(snes_Sinkorswim) + +struct BurnDriver BurnDrvsnes_Sinkorswim = { + "snes_sinkorswim", NULL, NULL, NULL, "1994", + "S.O.S - Sink or Swim (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_SinkorswimRomInfo, snes_SinkorswimRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Skuljagger - Revolt of the Westicans (USA) + +static struct BurnRomInfo snes_SkuljaggerRomDesc[] = { + { "Skuljagger - Revolt of the Westicans (U)(1992)(American Softworks).sfc", 524288, 0xe58a6d01, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skuljagger) +STD_ROM_FN(snes_Skuljagger) + +struct BurnDriver BurnDrvsnes_Skuljagger = { + "snes_skuljagger", NULL, NULL, NULL, "1992", + "Skuljagger - Revolt of the Westicans (USA)\0", NULL, "American Softworks", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SkuljaggerRomInfo, snes_SkuljaggerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Skyblazer (USA) + +static struct BurnRomInfo snes_SkyblazerRomDesc[] = { + { "Skyblazer (U)(1993)(Sony Imagesoft).sfc", 1048576, 0xf13b00b0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skyblazer) +STD_ROM_FN(snes_Skyblazer) + +struct BurnDriver BurnDrvsnes_Skyblazer = { + "snes_skyblazer", NULL, NULL, NULL, "1993", + "Skyblazer (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SkyblazerRomInfo, snes_SkyblazerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Skyblazer - English Retranslation (Hack) +// https://krokodyl.github.io/post/2024/08/skyblazer/ +static struct BurnRomInfo snes_SkyblazererRomDesc[] = { + { "Skyblazer - English Retranslation (2024)(krokodyl).sfc", 1572864, 0x4caa58f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skyblazerer) +STD_ROM_FN(snes_Skyblazerer) + +struct BurnDriver BurnDrvsnes_Skyblazerer = { + "snes_skyblazerer", "snes_skyblazer", NULL, NULL, "2024", + "Skyblazer - English Retranslation (Hack)\0", NULL, "krokodyl", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SkyblazererRomInfo, snes_SkyblazererRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sky Mission (Japan) + +static struct BurnRomInfo snes_SkymissionRomDesc[] = { + { "Sky Mission (J)(1992)(Namco).sfc", 524288, 0x0866a769, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skymission) +STD_ROM_FN(snes_Skymission) + +struct BurnDriver BurnDrvsnes_Skymission = { + "snes_skymission", "snes_wings2ah", NULL, NULL, "1992", + "Sky Mission (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_SkymissionRomInfo, snes_SkymissionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ski Paradise with Snowboard (Japan) + +static struct BurnRomInfo snes_SkiparadiseRomDesc[] = { + { "Ski Paradise with Snowboard (J)(1994)(Pack-In-Video).sfc", 1048576, 0xdbb603d4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skiparadise) +STD_ROM_FN(snes_Skiparadise) + +struct BurnDriver BurnDrvsnes_Skiparadise = { + "snes_skiparadise", "snes_wintextreme", NULL, NULL, "1994", + "Ski Paradise with Snowboard (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SkiparadiseRomInfo, snes_SkiparadiseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// From TV Animation Slam Dunk - SD Heat Up!! (Japan) + +static struct BurnRomInfo snes_SlamdunksdjRomDesc[] = { + { "From TV Animation Slam Dunk - SD Heat Up!! (J)(1995)(Bandai).sfc", 1572864, 0xd05114c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slamdunksdj) +STD_ROM_FN(snes_Slamdunksdj) + +struct BurnDriver BurnDrvsnes_Slamdunksdj = { + "snes_slamdunksdj", NULL, NULL, NULL, "1995", + "From TV Animation Slam Dunk - SD Heat Up!! (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SlamdunksdjRomInfo, snes_SlamdunksdjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Saturday Night Slam Masters (USA) + +static struct BurnRomInfo snes_SlammastersRomDesc[] = { + { "Saturday Night Slam Masters (U)(1994)(Capcom).sfc", 3145728, 0x54161830, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slammasters) +STD_ROM_FN(snes_Slammasters) + +struct BurnDriver BurnDrvsnes_Slammasters = { + "snes_slammasters", NULL, NULL, NULL, "1994", + "Saturday Night Slam Masters (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SlammastersRomInfo, snes_SlammastersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Slap Stick (Japan) + +static struct BurnRomInfo snes_SlapstickRomDesc[] = { + { "Slap Stick (J)(1994)(Quintet-Enix).sfc", 1572864, 0x53fb163b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slapstick) +STD_ROM_FN(snes_Slapstick) + +struct BurnDriver BurnDrvsnes_Slapstick = { + "snes_slapstick", "snes_robotrek", NULL, NULL, "1994", + "Slap Stick (Japan)\0", NULL, "Quintet-Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SlapstickRomInfo, snes_SlapstickRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Slayers (Japan) + +static struct BurnRomInfo snes_SlayersjRomDesc[] = { + { "Slayers (J)(1994)(Banpresto).sfc", 1572864, 0x0b610445, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slayersj) +STD_ROM_FN(snes_Slayersj) + +struct BurnDriver BurnDrvsnes_Slayersj = { + "snes_slayersj", "snes_slayerste", NULL, NULL, "1994", + "Slayers (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SlayersjRomInfo, snes_SlayersjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Slayers (Hack, English v1.01) +// https://www.romhacking.net/translations/1494/ +static struct BurnRomInfo snes_SlayersteRomDesc[] = { + { "Slayers T-Eng v1.01 (2010)(Dynamic-Designs).sfc", 2097152, 0x123f02b9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slayerste) +STD_ROM_FN(snes_Slayerste) + +struct BurnDriver BurnDrvsnes_Slayerste = { + "snes_slayerste", NULL, NULL, NULL, "2010", + "Slayers (Hack, English v1.01)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SlayersteRomInfo, snes_SlayersteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bishoujo Senshi Sailor Moon - Another Story (Japan) + +static struct BurnRomInfo snes_SlrmoonanstoryjRomDesc[] = { + { "Bishoujo Senshi Sailor Moon - Another Story (J)(1995)(Angel).sfc", 3145728, 0x02a442b8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonanstoryj) +STD_ROM_FN(snes_Slrmoonanstoryj) + +struct BurnDriver BurnDrvsnes_Slrmoonanstoryj = { + "snes_slrmoonanstoryj", "snes_slrmoonanstoryte", NULL, NULL, "1995", + "Bishoujo Senshi Sailor Moon - Another Story (Japan)\0", NULL, "Angel(Bandai)", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SlrmoonanstoryjRomInfo, snes_SlrmoonanstoryjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pretty Soldier Sailor Moon - Another Story (Hack, English v2.08) +// https://www.romhacking.net/translations/4654/ +static struct BurnRomInfo snes_SlrmoonanstoryteRomDesc[] = { + { "Pretty Soldier Sailor Moon - Another Story T-Eng v2.08 (2021)(Bishoujo Senshi Translations).sfc", 4194304, 0x003b74f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonanstoryte) +STD_ROM_FN(snes_Slrmoonanstoryte) + +struct BurnDriver BurnDrvsnes_Slrmoonanstoryte = { + "snes_slrmoonanstoryte", NULL, NULL, NULL, "2021", + "Pretty Soldier Sailor Moon - Another Story (Hack, English v2.08)\0", NULL, "Bishoujo Senshi Translations, mteam, FlamePurge", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SlrmoonanstoryteRomInfo, snes_SlrmoonanstoryteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bishoujo Senshi Sailor Moon Super S - Fuwa Fuwa Panic (Japan) + +static struct BurnRomInfo snes_SlrmoonffpjRomDesc[] = { + { "Bishoujo Senshi Sailor Moon Super S - Fuwa Fuwa Panic (J)(1995)(Bandai).sfc", 1048576, 0xb6b92ae0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonffpj) +STD_ROM_FN(snes_Slrmoonffpj) + +struct BurnDriver BurnDrvsnes_Slrmoonffpj = { + "snes_slrmoonffpj", "snes_slrmoonffpte", NULL, NULL, "1995", + "Bishoujo Senshi Sailor Moon Super S - Fuwa Fuwa Panic (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SlrmoonffpjRomInfo, snes_SlrmoonffpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pretty Soldier Sailor Moon Super S - Fuwa Fuwa Panic (Hack, English v1.01) +// https://www.romhacking.net/translations/2697/ +static struct BurnRomInfo snes_SlrmoonffpteRomDesc[] = { + { "Sailor Moon Super S - Fuwa Fuwa Panic T-Eng v1.01 (2016)(Dynamic-Designs).sfc", 1572864, 0x1062aa44, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonffpte) +STD_ROM_FN(snes_Slrmoonffpte) + +struct BurnDriver BurnDrvsnes_Slrmoonffpte = { + "snes_slrmoonffpte", NULL, NULL, NULL, "2016", + "Pretty Soldier Sailor Moon Super S - Fuwa Fuwa Panic (Hack, English v1.01)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SlrmoonffpteRomInfo, snes_SlrmoonffpteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bishoujo Senshi Sailor Moon Super S - Zenin Sanka!! Shuyaku Soudatsusen (Japan) + +static struct BurnRomInfo snes_SlrmoonfightsjRomDesc[] = { + { "Bishoujo Senshi Sailor Moon Super S - Zenin Sanka!! Shuyaku Soudatsusen (J)(1996)(Angel).sfc", 3145728, 0x25440331, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonfightsj) +STD_ROM_FN(snes_Slrmoonfightsj) + +struct BurnDriver BurnDrvsnes_Slrmoonfightsj = { + "snes_slrmoonfightsj", "snes_slrmoonfightste", NULL, NULL, "1996", + "Bishoujo Senshi Sailor Moon Super S - Zenin Sanka!! Shuyaku Soudatsusen (Japan)\0", NULL, "Angel(Bandai)", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SlrmoonfightsjRomInfo, snes_SlrmoonfightsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pretty Soldier Sailor Moon Fighter S (Hack, English + Improvements v1.67) +// https://www.romhacking.net/hacks/4498/ +static struct BurnRomInfo snes_SlrmoonfightsteRomDesc[] = { + { "Bishoujo Senshi Sailor Moon Fighter S T-Eng+Imp v1.67 (2020)(Metaquarius).sfc", 4194304, 0x2dcb5352, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonfightste) +STD_ROM_FN(snes_Slrmoonfightste) + +struct BurnDriver BurnDrvsnes_Slrmoonfightste = { + "snes_slrmoonfightste", NULL, NULL, NULL, "2020", + "Pretty Soldier Sailor Moon Fighter S (Hack, English + Improvements v1.67)\0", NULL, "Metaquarius", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SlrmoonfightsteRomInfo, snes_SlrmoonfightsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bishoujo Senshi Sailor Moon R (Japan) + +static struct BurnRomInfo snes_SlrmoonrjRomDesc[] = { + { "Bishoujo Senshi Sailor Moon R (J)(1993)(Bandai).sfc", 2097152, 0x4aee5abb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonrj) +STD_ROM_FN(snes_Slrmoonrj) + +struct BurnDriver BurnDrvsnes_Slrmoonrj = { + "snes_slrmoonrj", "snes_slrmoonrte", NULL, NULL, "1993", + "Bishoujo Senshi Sailor Moon R (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SlrmoonrjRomInfo, snes_SlrmoonrjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pretty Soldier Sailor Moon R (Hack, English) +// https://www.romhacking.net/translations/435/ +static struct BurnRomInfo snes_SlrmoonrteRomDesc[] = { + { "Pretty Soldier Sailor Moon R T-Eng (2002)(FuSoYa's Niche, Masamune).sfc", 3146240, 0x65c090ce, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Slrmoonrte) +STD_ROM_FN(snes_Slrmoonrte) + +struct BurnDriver BurnDrvsnes_Slrmoonrte = { + "snes_slrmoonrte", NULL, NULL, NULL, "2002", + "Pretty Soldier Sailor Moon R (Hack, English)\0", NULL, "FuSoYa's Niche, Masamune", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SlrmoonrteRomInfo, snes_SlrmoonrteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario All-Stars (USA) + +static struct BurnRomInfo snes_SmallstarsRomDesc[] = { + { "Super Mario All-Stars (U)(1993)(Nintendo).sfc", 2097152, 0x925637c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smallstars) +STD_ROM_FN(snes_Smallstars) + +struct BurnDriver BurnDrvsnes_Smallstars = { + "snes_smallstars", NULL, NULL, NULL, "1993", + "Super Mario All-Stars (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SmallstarsRomInfo, snes_SmallstarsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario All-Stars (Euro) + +static struct BurnRomInfo snes_SmallstarseRomDesc[] = { + { "Super Mario All-Stars (E)(1993)(Nintendo).sfc", 2097152, 0x925ffa69, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smallstarse) +STD_ROM_FN(snes_Smallstarse) + +struct BurnDriver BurnDrvsnes_Smallstarse = { + "snes_smallstarse", "snes_smallstars", NULL, NULL, "1993", + "Super Mario All-Stars (Euro)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SmallstarseRomInfo, snes_SmallstarseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Smart Ball (USA) + +static struct BurnRomInfo snes_SmartballRomDesc[] = { + { "Smart Ball (U)(1991)(Sony Imagesoft).sfc", 1048576, 0x3cfe77ab, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smartball) +STD_ROM_FN(snes_Smartball) + +struct BurnDriver BurnDrvsnes_Smartball = { + "snes_smartball", NULL, NULL, NULL, "1991", + "Smart Ball (USA)\0", NULL, "Sony Imagesoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SmartballRomInfo, snes_SmartballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario Collection (Japan) + +static struct BurnRomInfo snes_SmcollectionRomDesc[] = { + { "Super Mario Collection (J)(1993)(Nintendo).sfc", 2097152, 0x91b28d56, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smcollection) +STD_ROM_FN(snes_Smcollection) + +struct BurnDriver BurnDrvsnes_Smcollection = { + "snes_smcollection", "snes_smallstars", NULL, NULL, "1993", + "Super Mario Collection (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SmcollectionRomInfo, snes_SmcollectionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario RPG: Legend of the Seven Stars (USA) + +static struct BurnRomInfo snes_SmrpgRomDesc[] = { + { "Super Mario RPG - Legend of the Seven Stars (U)(1996)(Nintendo).sfc", 4194304, 0x1b8a0625, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smrpg) +STD_ROM_FN(snes_Smrpg) + +struct BurnDriver BurnDrvsnes_Smrpg = { + "snes_smrpg", NULL, NULL, NULL, "1996", + "Super Mario RPG: Legend of the Seven Stars (USA)\0", "SA-1 enhancement CPU", "Nintendo - Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmrpgRomInfo, snes_SmrpgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario RPG (Japan) + +static struct BurnRomInfo snes_SmrpgjRomDesc[] = { + { "Super Mario RPG (J)(1995)(Nintendo).sfc", 4194304, 0x5527071e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smrpgj) +STD_ROM_FN(snes_Smrpgj) + +struct BurnDriver BurnDrvsnes_Smrpgj = { + "snes_smrpgj", "snes_smrpg", NULL, NULL, "1995", + "Super Mario RPG (Japan)\0", "SA-1 enhancement CPU", "Nintendo - Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmrpgjRomInfo, snes_SmrpgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario RPG - Relocalized (Hack, English v2.0) +// https://www.romhacking.net/hacks/7651/ +static struct BurnRomInfo snes_SmrpgteRomDesc[] = { + { "Super Mario RPG - Relocalized T-Eng v2.0 (2023)(CoolCatBomberMan).sfc", 4194304, 0x1a5b825f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smrpgte) +STD_ROM_FN(snes_Smrpgte) + +struct BurnDriver BurnDrvsnes_Smrpgte = { + "snes_smrpgte", "snes_smrpg", NULL, NULL, "2023", + "Super Mario RPG - Relocalized (Hack, English v2.0)\0", "SA-1 enhancement CPU", "CoolCatBomberMan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmrpgteRomInfo, snes_SmrpgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario RPG: La Leyenda de las 7 Estrellas (Hack, Spanish v1.10) +// https://www.romhacking.net/translations/2620/ +static struct BurnRomInfo snes_SmrpgtsRomDesc[] = { + { "Super Mario RPG T-Spa v1.10 (2016)(josete2k).sfc", 4194304, 0x261f7f76, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smrpgts) +STD_ROM_FN(snes_Smrpgts) + +struct BurnDriver BurnDrvsnes_Smrpgts = { + "snes_smrpgts", "snes_smrpg", NULL, NULL, "2016", + "Super Mario RPG: La Leyenda de las 7 Estrellas (Hack, Spanish v1.10)\0", "SA-1 enhancement CPU", "josete2k", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmrpgtsRomInfo, snes_SmrpgtsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei II (Japan) + +static struct BurnRomInfo snes_Smtensei2jRomDesc[] = { + { "Shin Megami Tensei II (J)(1994)(Atlus).sfc", 2097152, 0x20d31588, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtensei2j) +STD_ROM_FN(snes_Smtensei2j) + +struct BurnDriver BurnDrvsnes_Smtensei2j = { + "snes_smtensei2j", "snes_smtensei2te", NULL, NULL, "1994", + "Shin Megami Tensei II (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Smtensei2jRomInfo, snes_Smtensei2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei II (Hack, English) +// https://aeongenesis.net/projects/smt2 +static struct BurnRomInfo snes_Smtensei2teRomDesc[] = { + { "Shin Megami Tensei II T-Eng (2004)(Aeon Genesis).sfc", 2621440, 0x6a49a51a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtensei2te) +STD_ROM_FN(snes_Smtensei2te) + +struct BurnDriver BurnDrvsnes_Smtensei2te = { + "snes_smtensei2te", NULL, NULL, NULL, "2004", + "Shin Megami Tensei II (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Smtensei2teRomInfo, snes_Smtensei2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei II (Hack, Spanish) +// https://www.romhacking.net/translations/1775/ +static struct BurnRomInfo snes_Smtensei2tsRomDesc[] = { + { "Shin Megami Tensei II T-Spa (2012)(Orden).sfc", 2621440, 0x07cf7dc9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtensei2ts) +STD_ROM_FN(snes_Smtensei2ts) + +struct BurnDriver BurnDrvsnes_Smtensei2ts = { + "snes_smtensei2ts", "snes_smtensei2te", NULL, NULL, "2012", + "Shin Megami Tensei II (Hack, Spanish)\0", NULL, "Orden", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Smtensei2tsRomInfo, snes_Smtensei2tsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei (Japan) + +static struct BurnRomInfo snes_SmtenseijRomDesc[] = { + { "Shin Megami Tensei (J)(1992)(Atlus).sfc", 1572864, 0x90de2c78, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtenseij) +STD_ROM_FN(snes_Smtenseij) + +struct BurnDriver BurnDrvsnes_Smtenseij = { + "snes_smtenseij", "snes_smtenseite", NULL, NULL, "1992", + "Shin Megami Tensei (Japan)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmtenseijRomInfo, snes_SmtenseijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei (Hack, English) +// https://www.romhacking.net/translations/571/ +// https://www.romhacking.net/translations/2616/ +static struct BurnRomInfo snes_SmtenseiteRomDesc[] = { + { "Shin Megami Tensei T-Eng (2012)(Aeon Genesis, Orden).sfc", 2097152, 0x9165294a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtenseite) +STD_ROM_FN(snes_Smtenseite) + +struct BurnDriver BurnDrvsnes_Smtenseite = { + "snes_smtenseite", NULL, NULL, NULL, "2002-2012", + "Shin Megami Tensei (Hack, English)\0", NULL, "Aeon Genesis, Orden", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmtenseiteRomInfo, snes_SmtenseiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Megami Tensei (Hack, Spanish) +// https://www.romhacking.net/translations/1754/ +static struct BurnRomInfo snes_SmtenseitsRomDesc[] = { + { "Shin Megami Tensei T-Spa (2012)(Orden).sfc", 2097152, 0xd39b10f3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smtenseits) +STD_ROM_FN(snes_Smtenseits) + +struct BurnDriver BurnDrvsnes_Smtenseits = { + "snes_smtenseits", "snes_smtenseite", NULL, NULL, "2012", + "Shin Megami Tensei (Hack, Spanish)\0", NULL, "Orden", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SmtenseitsRomInfo, snes_SmtenseitsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Smurfs, The (Euro) + +static struct BurnRomInfo snes_SmurfsRomDesc[] = { + { "Smurfs, The (E)(1994)(Infogrames).sfc", 1048576, 0x2ae148d6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smurfs) +STD_ROM_FN(snes_Smurfs) + +struct BurnDriver BurnDrvsnes_Smurfs = { + "snes_smurfs", NULL, NULL, NULL, "1994", + "Smurfs, The (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SmurfsRomInfo, snes_SmurfsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Smurfs, The - Travel the World (Euro) + +static struct BurnRomInfo snes_Smurfs2RomDesc[] = { + { "Smurfs, The - Travel the World (E)(1996)(Infogrames).sfc", 1310720, 0x22947169, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Smurfs2) +STD_ROM_FN(snes_Smurfs2) + +struct BurnDriver BurnDrvsnes_Smurfs2 = { + "snes_smurfs2", NULL, NULL, NULL, "1996", + "Smurfs, The - Travel the World (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Smurfs2RomInfo, snes_Smurfs2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Snoopy Concert (Japan) + +static struct BurnRomInfo snes_SnoopyconcertjRomDesc[] = { + { "Snoopy Concert (J)(1995)(Nintendo).sfc", 2097152, 0x3836a202, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Snoopyconcertj) +STD_ROM_FN(snes_Snoopyconcertj) + +struct BurnDriver BurnDrvsnes_Snoopyconcertj = { + "snes_snoopyconcertj", "snes_snoopyconcertte", NULL, NULL, "1995", + "Snoopy Concert (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_SnoopyconcertjRomInfo, snes_SnoopyconcertjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Snoopy Concert (Hack, English) +// https://aeongenesis.net/projects/snoopy +static struct BurnRomInfo snes_SnoopyconcertteRomDesc[] = { + { "Snoopy Concert T-Eng (2007)(Aeon Genesis).sfc", 2097152, 0x8ad05744, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Snoopyconcertte) +STD_ROM_FN(snes_Snoopyconcertte) + +struct BurnDriver BurnDrvsnes_Snoopyconcertte = { + "snes_snoopyconcertte", NULL, NULL, NULL, "2007", + "Snoopy Concert (Hack, English)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_SnoopyconcertteRomInfo, snes_SnoopyconcertteRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soccer Kid (Euro) + +static struct BurnRomInfo snes_SoccerkideRomDesc[] = { + { "Soccer Kid (E)(1994)(Ocean).sfc", 1310720, 0x2a9966c0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soccerkide) +STD_ROM_FN(snes_Soccerkide) + +struct BurnDriver BurnDrvsnes_Soccerkide = { + "snes_soccerkide", "snes_advkkleets", NULL, NULL, "1994", + "Soccer Kid (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SoccerkideRomInfo, snes_SoccerkideRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soccer Kid (Japan) + +static struct BurnRomInfo snes_SoccerkidjRomDesc[] = { + { "Soccer Kid (J)(1993)(Yanoman).sfc", 1310720, 0xa39c674e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soccerkidj) +STD_ROM_FN(snes_Soccerkidj) + +struct BurnDriver BurnDrvsnes_Soccerkidj = { + "snes_soccerkidj", "snes_advkkleets", NULL, NULL, "1993", + "Soccer Kid (Japan)\0", NULL, "Yanoman Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SoccerkidjRomInfo, snes_SoccerkidjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soccer Shootout (Euro) + +static struct BurnRomInfo snes_SoccershootRomDesc[] = { + { "Soccer Shootout (E)(1995)(Epoch).sfc", 1572864, 0xbbcd16f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soccershoot) +STD_ROM_FN(snes_Soccershoot) + +struct BurnDriver BurnDrvsnes_Soccershoot = { + "snes_soccershoot", "snes_capsocshoot", NULL, NULL, "1995", + "Soccer Shootout (Euro)\0", NULL, "Epoch Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SoccershootRomInfo, snes_SoccershootRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soldiers of Fortune (USA) + +static struct BurnRomInfo snes_SoldfortuneRomDesc[] = { + { "Soldiers of Fortune (U)(1993)(Spectrum HoloByte).sfc", 1572864, 0xcf719a93, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soldfortune) +STD_ROM_FN(snes_Soldfortune) + +struct BurnDriver BurnDrvsnes_Soldfortune = { + "snes_soldfortune", NULL, NULL, NULL, "1993", + "Soldiers of Fortune (USA)\0", NULL, "Spectrum HoloByte - The Bitmap Brothers", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_SoldfortuneRomInfo, snes_SoldfortuneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Solitaire (USA) + +static struct BurnRomInfo snes_SolitaireRomDesc[] = { + { "Super Solitaire (U)(1993)(Beam Software).sfc", 524288, 0xc8e80d55, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Solitaire) +STD_ROM_FN(snes_Solitaire) + +struct BurnDriver BurnDrvsnes_Solitaire = { + "snes_solitaire", NULL, NULL, NULL, "1993", + "Super Solitaire (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Beam Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_CARD, 0, + SNESGetZipName, snes_SolitaireRomInfo, snes_SolitaireRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Solstice II (Japan) + +static struct BurnRomInfo snes_SolsticeiiRomDesc[] = { + { "Solstice II (J)(1993)(Epic-Sony Records).sfc", 1048576, 0x21d280f8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Solsticeii) +STD_ROM_FN(snes_Solsticeii) + +struct BurnDriver BurnDrvsnes_Solsticeii = { + "snes_solsticeii", "snes_equinox", NULL, NULL, "1993", + "Solstice II (Japan)\0", NULL, "Epic-Sony Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_SolsticeiiRomInfo, snes_SolsticeiiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sonic Wings (Japan) + +static struct BurnRomInfo snes_SonicwingsRomDesc[] = { + { "Sonic Wings (J)(1993)(Video System).sfc", 1310720, 0xcfe75bcb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sonicwings) +STD_ROM_FN(snes_Sonicwings) + +struct BurnDriver BurnDrvsnes_Sonicwings = { + "snes_sonicwings", "snes_aerofight", NULL, NULL, "1993", + "Sonic Wings (Japan)\0", NULL, "Video System", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SonicwingsRomInfo, snes_SonicwingsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! (Japan) + +static struct BurnRomInfo snes_SoregoemonjRomDesc[] = { + { "Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! (J)(1996)(Konami).sfc", 1048576, 0x885fb1b9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soregoemonj) +STD_ROM_FN(snes_Soregoemonj) + +struct BurnDriver BurnDrvsnes_Soregoemonj = { + "snes_soregoemonj", "snes_soregoemonte", NULL, NULL, "1996", + "Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE | GBF_ADV, 0, + SNESGetZipName, snes_SoregoemonjRomInfo, snes_SoregoemonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! (Hack, English v2.0) +// https://www.romhacking.net/translations/5666/ +static struct BurnRomInfo snes_SoregoemonteRomDesc[] = { + { "Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! T-Eng v2.0 (2020)(DDSTranslation).sfc", 2097152, 0xf9e48f78, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soregoemonte) +STD_ROM_FN(snes_Soregoemonte) + +struct BurnDriver BurnDrvsnes_Soregoemonte = { + "snes_soregoemonte", NULL, NULL, NULL, "2020", + "Soreyuke Ebisumaru Karakuri Meiro - Kieta Goemon no Nazo!! (Hack, English v2.0)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE | GBF_ADV, 0, + SNESGetZipName, snes_SoregoemonteRomInfo, snes_SoregoemonteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SOS (USA) + +static struct BurnRomInfo snes_SosRomDesc[] = { + { "SOS (U)(1994)(Vic Tokai).sfc", 1048576, 0x09ae53f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sos) +STD_ROM_FN(snes_Sos) + +struct BurnDriver BurnDrvsnes_Sos = { + "snes_sos", NULL, NULL, NULL, "1994", + "SOS (USA)\0", NULL, "Vic Tokai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SosRomInfo, snes_SosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soul Blader (Japan) + +static struct BurnRomInfo snes_SoulbladerRomDesc[] = { + { "Soul Blader (J)(1992)(Enix).sfc", 1048576, 0xcd6dbc1c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soulblader) +STD_ROM_FN(snes_Soulblader) + +struct BurnDriver BurnDrvsnes_Soulblader = { + "snes_soulblader", "snes_soulblazer", NULL, NULL, "1992", + "Soul Blader (Japan)\0", NULL, "Quintet/Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SoulbladerRomInfo, snes_SoulbladerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Soul Blazer (USA) + +static struct BurnRomInfo snes_SoulblazerRomDesc[] = { + { "Soul Blazer (U)(1992)(Enix).sfc", 1048576, 0x31b965db, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Soulblazer) +STD_ROM_FN(snes_Soulblazer) + +struct BurnDriver BurnDrvsnes_Soulblazer = { + "snes_soulblazer", NULL, NULL, NULL, "1992", + "Soul Blazer (USA)\0", NULL, "Quintet/Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_SoulblazerRomInfo, snes_SoulblazerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Ace (USA) + +static struct BurnRomInfo snes_SpaceaceRomDesc[] = { + { "Space Ace (U)(1994)(Absolute Entertainment).sfc", 1048576, 0xf4bb0888, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spaceace) +STD_ROM_FN(snes_Spaceace) + +struct BurnDriver BurnDrvsnes_Spaceace = { + "snes_spaceace", NULL, NULL, NULL, "1994", + "Space Ace (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SpaceaceRomInfo, snes_SpaceaceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Ace (Euro) + +static struct BurnRomInfo snes_SpaceaceeRomDesc[] = { + { "Space Ace (E)(1993)(Empire Software).sfc", 1048576, 0xce74ec97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spaceacee) +STD_ROM_FN(snes_Spaceacee) + +struct BurnDriver BurnDrvsnes_Spaceacee = { + "snes_spaceacee", "snes_spaceace", NULL, NULL, "1993", + "Space Ace (Euro)\0", NULL, "Empire Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SpaceaceeRomInfo, snes_SpaceaceeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Ace (Japan) + +static struct BurnRomInfo snes_SpaceacejRomDesc[] = { + { "Space Ace (J)(1994)(Imagineer).sfc", 1048576, 0x62904e35, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spaceacej) +STD_ROM_FN(snes_Spaceacej) + +struct BurnDriver BurnDrvsnes_Spaceacej = { + "snes_spaceacej", "snes_spaceace", NULL, NULL, "1994", + "Space Ace (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SpaceacejRomInfo, snes_SpaceacejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Funky B.O.B. (Japan) + +static struct BurnRomInfo snes_SpacebobRomDesc[] = { + { "Space Funky B.O.B. (J)(1993)(Electronic Arts).sfc", 1048576, 0x5abfbe21, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spacebob) +STD_ROM_FN(snes_Spacebob) + +struct BurnDriver BurnDrvsnes_Spacebob = { + "snes_spacebob", "snes_bob", NULL, NULL, "1993", + "Space Funky B.O.B. (Japan)\0", NULL, "Electronic Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SpacebobRomInfo, snes_SpacebobRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Invaders - The Original Game (USA) + +static struct BurnRomInfo snes_SpaceinvRomDesc[] = { + { "Space Invaders - The Original Game (U)(1997)(Nintendo).sfc", 262144, 0xcaf035f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spaceinv) +STD_ROM_FN(snes_Spaceinv) + +struct BurnDriver BurnDrvsnes_Spaceinv = { + "snes_spaceinv", NULL, NULL, NULL, "1997", + "Space Invaders - The Original Game (USA)\0", NULL, "Nintendo - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SpaceinvRomInfo, snes_SpaceinvRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Invaders - The Original Game (Japan) + +static struct BurnRomInfo snes_SpaceinvjRomDesc[] = { + { "Space Invaders - The Original Game (J)(1994)(Taito).sfc", 262144, 0x07fafcd0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spaceinvj) +STD_ROM_FN(snes_Spaceinvj) + +struct BurnDriver BurnDrvsnes_Spaceinvj = { + "snes_spaceinvj", "snes_spaceinv", NULL, NULL, "1994", + "Space Invaders - The Original Game (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SpaceinvjRomInfo, snes_SpaceinvjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Megaforce (USA) + +static struct BurnRomInfo snes_SpacemforceRomDesc[] = { + { "Space Megaforce (U)(1992)(Toho Co. - Compile).sfc", 1048576, 0x11202781, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spacemforce) +STD_ROM_FN(snes_Spacemforce) + +struct BurnDriver BurnDrvsnes_Spacemforce = { + "snes_spacemforce", NULL, NULL, NULL, "1992", + "Space Megaforce (USA)\0", NULL, "Toho Co. - Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SpacemforceRomInfo, snes_SpacemforceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spanky's Quest (USA) + +static struct BurnRomInfo snes_SpankysquestRomDesc[] = { + { "Spanky's Quest (U)(1991)(Natsume).sfc", 524288, 0xca68c5c3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spankysquest) +STD_ROM_FN(snes_Spankysquest) + +struct BurnDriver BurnDrvsnes_Spankysquest = { + "snes_spankysquest", NULL, NULL, NULL, "1991", + "Spanky's Quest (USA)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SpankysquestRomInfo, snes_SpankysquestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sparkster (USA) + +static struct BurnRomInfo snes_SparksterRomDesc[] = { + { "Sparkster (U)(1994)(Konami).sfc", 1048576, 0x40d11c94, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sparkster) +STD_ROM_FN(snes_Sparkster) + +struct BurnDriver BurnDrvsnes_Sparkster = { + "snes_sparkster", NULL, NULL, NULL, "1994", + "Sparkster (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SparksterRomInfo, snes_SparksterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spark World (Japan) + +static struct BurnRomInfo snes_SparkworldRomDesc[] = { + { "Spark World (J)(1995)(ITC).sfc", 524288, 0x4cc4f40c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sparkworld) +STD_ROM_FN(snes_Sparkworld) + +struct BurnDriver BurnDrvsnes_Sparkworld = { + "snes_sparkworld", NULL, NULL, NULL, "1995", + "Spark World (Japan)\0", NULL, "ITC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_SparkworldRomInfo, snes_SparkworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spawn (USA) + +static struct BurnRomInfo snes_SpawnRomDesc[] = { + { "Spawn (U)(1995)(Acclaim Entertainment).sfc", 3145728, 0x4e1dafd0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spawn) +STD_ROM_FN(snes_Spawn) + +struct BurnDriver BurnDrvsnes_Spawn = { + "snes_spawn", NULL, NULL, NULL, "1995", + "Spawn (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SpawnRomInfo, snes_SpawnRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Bazooka (Japan) + +static struct BurnRomInfo snes_SpbazookaRomDesc[] = { + { "Space Bazooka (J)(1993)(Nintendo).sfc", 1048576, 0xf2dd3be4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spbazooka) +STD_ROM_FN(snes_Spbazooka) + +struct BurnDriver BurnDrvsnes_Spbazooka = { + "snes_spbazooka", "snes_battleclash", NULL, NULL, "1993", + "Space Bazooka (Japan)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_SpbazookaRomInfo, snes_SpbazookaRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Professional Baseball (Japan) + +static struct BurnRomInfo snes_SpbaseballRomDesc[] = { + { "Super Professional Baseball (J)(1991)(Jaleco).sfc", 1048576, 0xea0bfa66, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spbaseball) +STD_ROM_FN(snes_Spbaseball) + +struct BurnDriver BurnDrvsnes_Spbaseball = { + "snes_spbaseball", "snes_sbloaded", NULL, NULL, "1991", + "Super Professional Baseball (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SpbaseballRomInfo, snes_SpbaseballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Speed Racer (USA) + +static struct BurnRomInfo snes_SpeedracerRomDesc[] = { + { "Speed Racer (U)(1994)(Accolade).sfc", 2097152, 0xaa44287c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Speedracer) +STD_ROM_FN(snes_Speedracer) + +struct BurnDriver BurnDrvsnes_Speedracer = { + "snes_speedracer", NULL, NULL, NULL, "1994", + "Speed Racer (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING | GBF_PLATFORM, 0, + SNESGetZipName, snes_SpeedracerRomInfo, snes_SpeedracerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Speedy Gonzales - Los Gatos Bandidos (USA) + +static struct BurnRomInfo snes_SpeedygonzalesRomDesc[] = { + { "Speedy Gonzales - Los Gatos Bandidos (U)(1994)(Acclaim - Sunsoft).sfc", 1048576, 0xe2dbad76, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Speedygonzales) +STD_ROM_FN(snes_Speedygonzales) + +struct BurnDriver BurnDrvsnes_Speedygonzales = { + "snes_speedygonzales", NULL, NULL, NULL, "1994", + "Speedy Gonzales - Los Gatos Bandidos (USA)\0", NULL, "Acclaim Ent. - Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SpeedygonzalesRomInfo, snes_SpeedygonzalesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Space Football - One on One (USA) + +static struct BurnRomInfo snes_SpfootballRomDesc[] = { + { "Space Football - One on One (U)(1992)(Triffix).sfc", 524288, 0x55dcf09e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spfootball) +STD_ROM_FN(snes_Spfootball) + +struct BurnDriver BurnDrvsnes_Spfootball = { + "snes_spfootball", NULL, NULL, NULL, "1992", + "Space Football - One on One (USA)\0", NULL, "Triffix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SpfootballRomInfo, snes_SpfootballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spider-Man (USA) + +static struct BurnRomInfo snes_SpidermanRomDesc[] = { + { "Spider-Man (U)(1994)(Ljn).sfc", 2097152, 0xc99e174e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spiderman) +STD_ROM_FN(snes_Spiderman) + +struct BurnDriver BurnDrvsnes_Spiderman = { + "snes_spiderman", NULL, NULL, NULL, "1994", + "Spider-Man (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SpidermanRomInfo, snes_SpidermanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Twisted Tales of Spike McFang, The (USA) + +static struct BurnRomInfo snes_SpikemcfangRomDesc[] = { + { "Twisted Tales of Spike McFang, The (U)(1994)(Bullet Proof Software).sfc", 1048576, 0x8c2068d1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spikemcfang) +STD_ROM_FN(snes_Spikemcfang) + +struct BurnDriver BurnDrvsnes_Spikemcfang = { + "snes_spikemcfang", NULL, NULL, NULL, "1994", + "Twisted Tales of Spike McFang, The (USA)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_SpikemcfangRomInfo, snes_SpikemcfangRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spindizzy Worlds (USA) + +static struct BurnRomInfo snes_SpindizzyRomDesc[] = { + { "Spindizzy Worlds (U)(1992)(ASCII).sfc", 1048576, 0x52b68163, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spindizzy) +STD_ROM_FN(snes_Spindizzy) + +struct BurnDriver BurnDrvsnes_Spindizzy = { + "snes_spindizzy", NULL, NULL, NULL, "1992", + "Spindizzy Worlds (USA)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SpindizzyRomInfo, snes_SpindizzyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spirou (Euro) + +static struct BurnRomInfo snes_SpirouRomDesc[] = { + { "Spirou (E)(1995)(Infogrames).sfc", 1310720, 0x797e2e82, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spirou) +STD_ROM_FN(snes_Spirou) + +struct BurnDriver BurnDrvsnes_Spirou = { + "snes_spirou", NULL, NULL, NULL, "1995", + "Spirou (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SpirouRomInfo, snes_SpirouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spriggan Powered (Japan) + +static struct BurnRomInfo snes_SprigganpowRomDesc[] = { + { "Spriggan Powered (J)(1996)(Naxat Soft).sfc", 1048576, 0x3f83f67c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sprigganpow) +STD_ROM_FN(snes_Sprigganpow) + +struct BurnDriver BurnDrvsnes_Sprigganpow = { + "snes_sprigganpow", NULL, NULL, NULL, "1996", + "Spriggan Powered (Japan)\0", NULL, "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SprigganpowRomInfo, snes_SprigganpowRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Probotector - Alien Rebels (Euro) + +static struct BurnRomInfo snes_SprobotectorRomDesc[] = { + { "Super Probotector - Alien Rebels (E)(1992)(Konami).sfc", 1048576, 0x420bd975, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sprobotector) +STD_ROM_FN(snes_Sprobotector) + +struct BurnDriver BurnDrvsnes_Sprobotector = { + "snes_sprobotector", "snes_contraiii", NULL, NULL, "1992", + "Super Probotector - Alien Rebels (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SprobotectorRomInfo, snes_SprobotectorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Puyo Puyo Tsuu (Japan) + +static struct BurnRomInfo snes_Spuyopuyo2jRomDesc[] = { + { "Super Puyo Puyo Tsuu (J)(1995)(Compile).sfc", 2097152, 0x271e1f3f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spuyopuyo2j) +STD_ROM_FN(snes_Spuyopuyo2j) + +struct BurnDriver BurnDrvsnes_Spuyopuyo2j = { + "snes_spuyopuyo2j", "snes_spuyopuyo2te", NULL, NULL, "1995", + "Super Puyo Puyo Tsuu (Japan)\0", NULL, "Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Spuyopuyo2jRomInfo, snes_Spuyopuyo2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Puyo Puyo 2 (Hack, English v1.1) +// https://www.romhacking.net/translations/465/ +static struct BurnRomInfo snes_Spuyopuyo2teRomDesc[] = { + { "Super Puyo Puyo 2 T-Eng v1.1 (2001)(J2e Translations).sfc", 2097152, 0xb425c47d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spuyopuyo2te) +STD_ROM_FN(snes_Spuyopuyo2te) + +struct BurnDriver BurnDrvsnes_Spuyopuyo2te = { + "snes_spuyopuyo2te", NULL, NULL, NULL, "2001", + "Super Puyo Puyo 2 (Hack, English v1.1)\0", NULL, "J2e Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Spuyopuyo2teRomInfo, snes_Spuyopuyo2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Puyo Puyo (Japan) + +static struct BurnRomInfo snes_SpuyopuyojRomDesc[] = { + { "Super Puyo Puyo (J)(1993)(Banpresto).sfc", 1048576, 0xc5a482bd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spuyopuyoj) +STD_ROM_FN(snes_Spuyopuyoj) + +struct BurnDriver BurnDrvsnes_Spuyopuyoj = { + "snes_spuyopuyoj", NULL, NULL, NULL, "1993", + "Super Puyo Puyo (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SpuyopuyojRomInfo, snes_SpuyopuyojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Royal Blood (Japan) + +static struct BurnRomInfo snes_SroyalbloodRomDesc[] = { + { "Super Royal Blood (J)(1992)(Koei).sfc", 1048576, 0x12340705, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sroyalblood) +STD_ROM_FN(snes_Sroyalblood) + +struct BurnDriver BurnDrvsnes_Sroyalblood = { + "snes_sroyalblood", "snes_gemfire", NULL, NULL, "1992", + "Super Royal Blood (Japan)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SroyalbloodRomInfo, snes_SroyalbloodRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Taisen Gaiden: The Lord of Elemental (Japan) + +static struct BurnRomInfo snes_SrtglejRomDesc[] = { + { "Super Robot Taisen Gaiden - The Lord of Elemental (J)(1996)(Banpresto).sfc", 3145728, 0xebadc924, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Srtglej) +STD_ROM_FN(snes_Srtglej) + +struct BurnDriver BurnDrvsnes_Srtglej = { + "snes_srtglej", "snes_srwglete", NULL, NULL, "1996", + "Super Robot Taisen Gaiden: The Lord of Elemental (Japan)\0", "SA-1 enhancement CPU", "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SrtglejRomInfo, snes_SrtglejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars Gaiden: The Elementals Lord (Hack, English v1.05) +// https://www.romhacking.net/translations/3606/ +static struct BurnRomInfo snes_SrwgleteRomDesc[] = { + { "Super Robot Wars Gaiden - The Lord of Elemental T-Eng v1.05 (2018)(Aeon Genesis).sfc", 4194304, 0xbd1924d2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Srwglete) +STD_ROM_FN(snes_Srwglete) + +struct BurnDriver BurnDrvsnes_Srwglete = { + "snes_srwglete", NULL, NULL, NULL, "2018", + "Super Robot Wars Gaiden: The Elementals Lord (Hack, English v1.05)\0", "SA-1 enhancement CPU", "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SrwgleteRomInfo, snes_SrwgleteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Street Fighter II - The New Challengers (USA) + +static struct BurnRomInfo snes_Ssf2RomDesc[] = { + { "Super Street Fighter II - The New Challengers (U)(1994)(Capcom).sfc", 4194304, 0xf16d5ce9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ssf2) +STD_ROM_FN(snes_Ssf2) + +struct BurnDriver BurnDrvsnes_Ssf2 = { + "snes_ssf2", NULL, NULL, NULL, "1994", + "Super Street Fighter II - The New Challengers (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ssf2RomInfo, snes_Ssf2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Street Fighter II - The New Challengers (Japan) + +static struct BurnRomInfo snes_Ssf2jRomDesc[] = { + { "Super Street Fighter II - The New Challengers (J)(1994)(Capcom).sfc", 4194304, 0x26ca246b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ssf2j) +STD_ROM_FN(snes_Ssf2j) + +struct BurnDriver BurnDrvsnes_Ssf2j = { + "snes_ssf2j", "snes_ssf2", NULL, NULL, "1994", + "Super Street Fighter II - The New Challengers (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ssf2jRomInfo, snes_Ssf2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Shanghai - Dragon's Eye (Japan) + +static struct BurnRomInfo snes_SshanghaiRomDesc[] = { + { "Super Shanghai - Dragon's Eye (J)(1991)(Hot-B).sfc", 1048576, 0x6f95d27e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sshanghai) +STD_ROM_FN(snes_Sshanghai) + +struct BurnDriver BurnDrvsnes_Sshanghai = { + "snes_sshanghai", "snes_shanghai2", NULL, NULL, "1991", + "Super Shanghai - Dragon's Eye (Japan)\0", NULL, "Hot-B", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_MAHJONG | GBF_PUZZLE, 0, + SNESGetZipName, snes_SshanghaiRomInfo, snes_SshanghaiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Shell Monsters Story II (Hack, English v0.90) +// https://www.romhacking.net/translations/5763/ +static struct BurnRomInfo snes_Ssms2teRomDesc[] = { + { "Super Shell Monsters Story II T-Eng v0.90 (2020)(Dynamic-Designs).sfc", 5767168, 0xf8c3045e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ssms2te) +STD_ROM_FN(snes_Ssms2te) + +struct BurnDriver BurnDrvsnes_Ssms2te = { + "snes_ssms2te", NULL, NULL, NULL, "2020", + "Super Shell Monsters Story II (Hack, English v0.90)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ssms2teRomInfo, snes_Ssms2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Shell Monsters Story (Hack, English) +// https://www.romhacking.net/translations/2339/ +static struct BurnRomInfo snes_SsmsteRomDesc[] = { + { "Super Shell Monsters Story T-Eng (2015)(Dynamic-Designs).sfc", 4194304, 0x461240fb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ssmste) +STD_ROM_FN(snes_Ssmste) + +struct BurnDriver BurnDrvsnes_Ssmste = { + "snes_ssmste", NULL, NULL, NULL, "2015", + "Super Shell Monsters Story (Hack, English)\0", NULL, "Dynamic-Designs", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_SsmsteRomInfo, snes_SsmsteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stardust Suplex (Japan) + +static struct BurnRomInfo snes_StardustspxRomDesc[] = { + { "Stardust Suplex (J)(1995)(Varie Corp.).sfc", 2621440, 0xada27d91, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stardustspx) +STD_ROM_FN(snes_Stardustspx) + +struct BurnDriver BurnDrvsnes_Stardustspx = { + "snes_stardustspx", NULL, NULL, NULL, "1995", + "Stardust Suplex (Japan)\0", NULL, "Varie Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_StardustspxRomInfo, snes_StardustspxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stargate (USA) + +static struct BurnRomInfo snes_StargateRomDesc[] = { + { "Stargate (U)(1994)(Acclaim).sfc", 2097152, 0x526ce576, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stargate) +STD_ROM_FN(snes_Stargate) + +struct BurnDriver BurnDrvsnes_Stargate = { + "snes_stargate", NULL, NULL, NULL, "1994", + "Stargate (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_StargateRomInfo, snes_StargateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stargate (Euro) + +static struct BurnRomInfo snes_StargateeRomDesc[] = { + { "Stargate (E)(1994)(Acclaim).sfc", 2097152, 0xaf4d4439, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stargatee) +STD_ROM_FN(snes_Stargatee) + +struct BurnDriver BurnDrvsnes_Stargatee = { + "snes_stargatee", "snes_stargate", NULL, NULL, "1994", + "Stargate (Euro)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_StargateeRomInfo, snes_StargateeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stargate (Japan) + +static struct BurnRomInfo snes_StargatejRomDesc[] = { + { "Stargate (J)(1994)(Acclaim).sfc", 2097152, 0x24bbddf8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stargatej) +STD_ROM_FN(snes_Stargatej) + +struct BurnDriver BurnDrvsnes_Stargatej = { + "snes_stargatej", "snes_stargate", NULL, NULL, "1994", + "Stargate (Japan)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_StargatejRomInfo, snes_StargatejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Ocean (Japan) + +static struct BurnRomInfo snes_StaroceanjRomDesc[] = { + { "Star Ocean (J)(1996)(Enix).sfc", 6291456, 0x3dbdfdbf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Staroceanj) +STD_ROM_FN(snes_Staroceanj) + +struct BurnDriver BurnDrvsnes_Staroceanj = { + "snes_staroceanj", "snes_staroceante", NULL, NULL, "1996", + "Star Ocean (Japan)\0", "S-DD1 enhancement chip", "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_StaroceanjRomInfo, snes_StaroceanjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Ocean (Hack, English) +// https://www.romhacking.net/translations/452/ +static struct BurnRomInfo snes_StaroceanteRomDesc[] = { + { "Star Ocean T-Eng (2003)(DeJap Translations).sfc", 6291456, 0x6ba9e08d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Staroceante) +STD_ROM_FN(snes_Staroceante) + +struct BurnDriver BurnDrvsnes_Staroceante = { + "snes_staroceante", NULL, NULL, NULL, "2003", + "Star Ocean (Hack, English)\0", "S-DD1 enhancement chip", "DeJap Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_StaroceanteRomInfo, snes_StaroceanteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Ocean (Hack, Spanish) +// https://magno.romhackhispano.org/so.html +static struct BurnRomInfo snes_StaroceantsRomDesc[] = { + { "Star Ocean T-Spa (2018)(Magno).sfc", 6291456, 0xb3f89242, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Staroceants) +STD_ROM_FN(snes_Staroceants) + +struct BurnDriver BurnDrvsnes_Staroceants = { + "snes_staroceants", "snes_staroceante", NULL, NULL, "2018", + "Star Ocean (Hack, Spanish)\0", "S-DD1 enhancement chip", "Magno", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_StaroceantsRomInfo, snes_StaroceantsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - Deep Space Nine - Crossroads of Time (USA) + +static struct BurnRomInfo snes_StcrosstimeRomDesc[] = { + { "Star Trek - Deep Space Nine - Crossroads of Time (U)(1995)(Playmates).sfc", 1048576, 0x9a245fa3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stcrosstime) +STD_ROM_FN(snes_Stcrosstime) + +struct BurnDriver BurnDrvsnes_Stcrosstime = { + "snes_stcrosstime", NULL, NULL, NULL, "1995", + "Star Trek - Deep Space Nine - Crossroads of Time (USA)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_StcrosstimeRomInfo, snes_StcrosstimeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - Deep Space Nine - Crossroads of Time (Euro) + +static struct BurnRomInfo snes_StcrosstimeeRomDesc[] = { + { "Star Trek - Deep Space Nine - Crossroads of Time (E)(1995)(Playmates).sfc", 1048576, 0x75bff780, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stcrosstimee) +STD_ROM_FN(snes_Stcrosstimee) + +struct BurnDriver BurnDrvsnes_Stcrosstimee = { + "snes_stcrosstimee", "snes_stcrosstime", NULL, NULL, "1995", + "Star Trek - Deep Space Nine - Crossroads of Time (Euro)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_StcrosstimeeRomInfo, snes_StcrosstimeeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Steel Talons (USA) + +static struct BurnRomInfo snes_SteeltalonsRomDesc[] = { + { "Steel Talons (U)(1993)(Left Field Productions).sfc", 524288, 0x4ea9f93f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Steeltalons) +STD_ROM_FN(snes_Steeltalons) + +struct BurnDriver BurnDrvsnes_Steeltalons = { + "snes_steeltalons", NULL, NULL, NULL, "1993", + "Steel Talons (USA)\0", NULL, "Left Field Productions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_SteeltalonsRomInfo, snes_SteeltalonsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - The Next Generation - Future's Past (USA) + +static struct BurnRomInfo snes_StfuturepastRomDesc[] = { + { "Star Trek - The Next Generation - Future's Past (U)(1994)(Spectrum HoloByte).sfc", 2097152, 0x8de80428, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stfuturepast) +STD_ROM_FN(snes_Stfuturepast) + +struct BurnDriver BurnDrvsnes_Stfuturepast = { + "snes_stfuturepast", NULL, NULL, NULL, "1994", + "Star Trek - The Next Generation - Future's Past (USA)\0", NULL, "Spectrum HoloByte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_StfuturepastRomInfo, snes_StfuturepastRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - The Next Generation - Future's Past (Euro) + +static struct BurnRomInfo snes_StfuturepasteRomDesc[] = { + { "Star Trek - The Next Generation - Future's Past (E)(1994)(Spectrum HoloByte).sfc", 2097152, 0xd1a1f7e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stfuturepaste) +STD_ROM_FN(snes_Stfuturepaste) + +struct BurnDriver BurnDrvsnes_Stfuturepaste = { + "snes_stfuturepaste", "snes_stfuturepast", NULL, NULL, "1994", + "Star Trek - The Next Generation - Future's Past (Euro)\0", NULL, "Spectrum HoloByte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_StfuturepasteRomInfo, snes_StfuturepasteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shin Star Trek - Ooinaru Isan IFD no Nazo o Oe (Japan) + +static struct BurnRomInfo snes_StfuturepastjRomDesc[] = { + { "Shin Star Trek - Ooinaru Isan IFD no Nazo o Oe (J)(1995)(Tokuma Shoten).sfc", 2621440, 0x34f09544, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stfuturepastj) +STD_ROM_FN(snes_Stfuturepastj) + +struct BurnDriver BurnDrvsnes_Stfuturepastj = { + "snes_stfuturepastj", "snes_stfuturepast", NULL, NULL, "1995", + "Shin Star Trek - Ooinaru Isan IFD no Nazo o Oe (Japan)\0", NULL, "Tokuma Shoten", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_StfuturepastjRomInfo, snes_StfuturepastjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stone Protectors (USA) + +static struct BurnRomInfo snes_StoneprotRomDesc[] = { + { "Stone Protectors (U)(1994)(Kemco - Eurocom).sfc", 2097152, 0xa7e58592, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stoneprot) +STD_ROM_FN(snes_Stoneprot) + +struct BurnDriver BurnDrvsnes_Stoneprot = { + "snes_stoneprot", NULL, NULL, NULL, "1994", + "Stone Protectors (USA)\0", NULL, "Kemco - Eurocom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_StoneprotRomInfo, snes_StoneprotRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Street Racer (USA) + +static struct BurnRomInfo snes_StreetracerRomDesc[] = { + { "Street Racer (U)(1994)(Ubi Soft - Vivid Image).sfc", 1048576, 0x63e8b7d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Streetracer) +STD_ROM_FN(snes_Streetracer) + +struct BurnDriver BurnDrvsnes_Streetracer = { + "snes_streetracer", NULL, NULL, NULL, "1994", + "Street Racer (USA)\0", NULL, "Ubi Soft - Vivid Image", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_StreetracerRomInfo, snes_StreetracerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Strike Gunner S.T.G (USA) + +static struct BurnRomInfo snes_StrikegunnerstgRomDesc[] = { + { "Strike Gunner S.T.G (U)(1992)(Athena Co.).sfc", 1048576, 0xd054e288, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Strikegunnerstg) +STD_ROM_FN(snes_Strikegunnerstg) + +struct BurnDriver BurnDrvsnes_Strikegunnerstg = { + "snes_strikegunnerstg", NULL, NULL, NULL, "1992", + "Strike Gunner S.T.G (USA)\0", NULL, "Athena Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_StrikegunnerstgRomInfo, snes_StrikegunnerstgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Striker (Euro) + +static struct BurnRomInfo snes_StrikerRomDesc[] = { + { "Striker (E)(1993)(Elite- Rage).sfc", 524288, 0x60b2d4a8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Striker) +STD_ROM_FN(snes_Striker) + +struct BurnDriver BurnDrvsnes_Striker = { + "snes_striker", "snes_wsoccer94", NULL, NULL, "1993", + "Striker (Euro)\0", NULL, "Elite Systems - Rage Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_StrikerRomInfo, snes_StrikerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Star Trek - Starfleet Academy - Starship Bridge Simulator (USA) + +static struct BurnRomInfo snes_StstarfleetRomDesc[] = { + { "Star Trek - Starfleet Academy - Starship Bridge Simulator (U)(1994)(Interplay).sfc", 1048576, 0x2db38d24, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ststarfleet) +STD_ROM_FN(snes_Ststarfleet) + +struct BurnDriver BurnDrvsnes_Ststarfleet = { + "snes_ststarfleet", NULL, NULL, NULL, "1994", + "Star Trek - Starfleet Academy - Starship Bridge Simulator (USA)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_StstarfleetRomInfo, snes_StstarfleetRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - Starfleet Academy - Starship Bridge Simulator (Euro, English) + +static struct BurnRomInfo snes_StstarfleeteRomDesc[] = { + { "Star Trek - Starfleet Academy - Starship Bridge Simulator (E)(1994)(Interplay).sfc", 1048576, 0x7c07e4a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ststarfleete) +STD_ROM_FN(snes_Ststarfleete) + +struct BurnDriver BurnDrvsnes_Ststarfleete = { + "snes_ststarfleete", "snes_ststarfleet", NULL, NULL, "1994", + "Star Trek - Starfleet Academy - Starship Bridge Simulator (Euro, English)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_StstarfleeteRomInfo, snes_StstarfleeteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Trek - Starfleet Academy - Starship Bridge Simulator (Euro, German) + +static struct BurnRomInfo snes_StstarfleetgRomDesc[] = { + { "Star Trek - Starfleet Academy - Starship Bridge Simulator (E, Germany)(1994)(Interplay).sfc", 1048576, 0xcb2738bd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ststarfleetg) +STD_ROM_FN(snes_Ststarfleetg) + +struct BurnDriver BurnDrvsnes_Ststarfleetg = { + "snes_ststarfleetg", "snes_ststarfleet", NULL, NULL, "1994", + "Star Trek - Starfleet Academy - Starship Bridge Simulator (Euro, German)\0", NULL, "Interplay", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_StstarfleetgRomInfo, snes_StstarfleetgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ultra Baseball 2 (Japan) + +static struct BurnRomInfo snes_Subaseball2jRomDesc[] = { + { "Super Ultra Baseball 2 (J)(1994)(Culture Brain).sfc", 524288, 0xffe37adf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Subaseball2j) +STD_ROM_FN(snes_Subaseball2j) + +struct BurnDriver BurnDrvsnes_Subaseball2j = { + "snes_subaseball2j", "snes_subaseball2te", NULL, NULL, "1994", + "Super Ultra Baseball 2 (Japan)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Subaseball2jRomInfo, snes_Subaseball2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ultra Baseball 2 (Hack, English) +// https://www.romhacking.net/translations/1393/ +static struct BurnRomInfo snes_Subaseball2teRomDesc[] = { + { "Super Ultra Baseball 2 T-Eng (2009)(VX).sfc", 1048576, 0x344d4076, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Subaseball2te) +STD_ROM_FN(snes_Subaseball2te) + +struct BurnDriver BurnDrvsnes_Subaseball2te = { + "snes_subaseball2te", NULL, NULL, NULL, "2009", + "Super Ultra Baseball 2 (Hack English)\0", NULL, "VX", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Subaseball2teRomInfo, snes_Subaseball2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sugoi Hebereke (Japan) + +static struct BurnRomInfo snes_SugoihebeRomDesc[] = { + { "Sugoi Hebereke (J)(1994)(Sunsoft).sfc", 1310720, 0x72123ef0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sugoihebe) +STD_ROM_FN(snes_Sugoihebe) + +struct BurnDriver BurnDrvsnes_Sugoihebe = { + "snes_sugoihebe", NULL, NULL, NULL, "1994", + "Sugoi Hebereke (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SugoihebeRomInfo, snes_SugoihebeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sunset Riders (USA) + +static struct BurnRomInfo snes_SunsetridersRomDesc[] = { + { "Sunset Riders (U)(1993)(Konami).sfc", 1048576, 0x52ada404, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sunsetriders) +STD_ROM_FN(snes_Sunsetriders) + +struct BurnDriver BurnDrvsnes_Sunsetriders = { + "snes_sunsetriders", NULL, NULL, NULL, "1993", + "Sunset Riders (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SunsetridersRomInfo, snes_SunsetridersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Alfred Chicken (USA) + +static struct BurnRomInfo snes_SupalfchicRomDesc[] = { + { "Super Alfred Chicken (U)(1993)(Mindscape).sfc", 1048576, 0xf21c5a9d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supalfchic) +STD_ROM_FN(snes_Supalfchic) + +struct BurnDriver BurnDrvsnes_Supalfchic = { + "snes_supalfchic", NULL, NULL, NULL, "1993", + "Super Alfred Chicken (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupalfchicRomInfo, snes_SupalfchicRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Supapoon (Japan) + +static struct BurnRomInfo snes_SupapoonRomDesc[] = { + { "Supapoon (J)(1995)(Yutaka).sfc", 524288, 0x6d971e71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supapoon) +STD_ROM_FN(snes_Supapoon) + +struct BurnDriver BurnDrvsnes_Supapoon = { + "snes_supapoon", NULL, NULL, NULL, "1995", + "Supapoon (Japan)\0", NULL, "Yutaka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_SupapoonRomInfo, snes_SupapoonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Supapoon DX (Japan) + +static struct BurnRomInfo snes_SupapoondxRomDesc[] = { + { "Supapoon DX (J)(1996)(Yutaka).sfc", 1048576, 0xbe52c486, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supapoondx) +STD_ROM_FN(snes_Supapoondx) + +struct BurnDriver BurnDrvsnes_Supapoondx = { + "snes_supapoondx", NULL, NULL, NULL, "1996", + "Supapoon DX (Japan)\0", NULL, "Yutaka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_SupapoondxRomInfo, snes_SupapoondxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Aquatic Games Starring the Aquabats, The (USA) + +static struct BurnRomInfo snes_SupaquagamesRomDesc[] = { + { "Super Aquatic Games Starring the Aquabats, The (U)(1993)(Seika).sfc", 524288, 0x2a5ddac0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supaquagames) +STD_ROM_FN(snes_Supaquagames) + +struct BurnDriver BurnDrvsnes_Supaquagames = { + "snes_supaquagames", NULL, NULL, NULL, "1993", + "Super Aquatic Games Starring the Aquabats, The (USA)\0", NULL, "Seika", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupaquagamesRomInfo, snes_SupaquagamesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Back to the Future Part II (Japan) + +static struct BurnRomInfo snes_SupbackfutureiijRomDesc[] = { + { "Super Back to the Future Part II (J)(1993)(Toshiba EMI).sfc", 1048576, 0xb367d0b9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbackfutureiij) +STD_ROM_FN(snes_Supbackfutureiij) + +struct BurnDriver BurnDrvsnes_Supbackfutureiij = { + "snes_supbackfutureiij", "snes_supbackfutureiite", NULL, NULL, "1993", + "Super Back to the Future Part II (Japan)\0", NULL, "Toshiba EMI", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupbackfutureiijRomInfo, snes_SupbackfutureiijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Back to the Future Part II (Hack, English) +// https://www.romhacking.net/translations/1691/ +static struct BurnRomInfo snes_SupbackfutureiiteRomDesc[] = { + { "Super Back to the Future Part II T-Eng (2012)(mteam).sfc", 1048576, 0xa070febd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbackfutureiite) +STD_ROM_FN(snes_Supbackfutureiite) + +struct BurnDriver BurnDrvsnes_Supbackfutureiite = { + "snes_supbackfutureiite", NULL, NULL, NULL, "2012", + "Super Back to the Future Part II (Hack, English)\0", NULL, "mteam", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupbackfutureiiteRomInfo, snes_SupbackfutureiiteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Batter Up (USA) + +static struct BurnRomInfo snes_SupbatterupRomDesc[] = { + { "Super Batter Up (U)(1992)(Namco).sfc", 1048576, 0x5896c854, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbatterup) +STD_ROM_FN(snes_Supbatterup) + +struct BurnDriver BurnDrvsnes_Supbatterup = { + "snes_supbatterup", NULL, NULL, NULL, "1992", + "Super Batter Up (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupbatterupRomInfo, snes_SupbatterupRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman (USA) + +static struct BurnRomInfo snes_SupbombRomDesc[] = { + { "Super Bomberman (U)(1993)(Hudson Soft).sfc", 524288, 0x63a8e2c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb) +STD_ROM_FN(snes_Supbomb) + +struct BurnDriver BurnDrvsnes_Supbomb = { + "snes_supbomb", NULL, NULL, NULL, "1993", + "Super Bomberman (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_SupbombRomInfo, snes_SupbombRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman (Euro) + +static struct BurnRomInfo snes_SupbombeRomDesc[] = { + { "Super Bomberman (E)(1993)(Hudson Soft).sfc", 524288, 0x678501f2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbombe) +STD_ROM_FN(snes_Supbombe) + +struct BurnDriver BurnDrvsnes_Supbombe = { + "snes_supbombe", "snes_supbomb", NULL, NULL, "1993", + "Super Bomberman (Euro)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_SupbombeRomInfo, snes_SupbombeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman (Japan) + +static struct BurnRomInfo snes_SupbombjRomDesc[] = { + { "Super Bomberman (J)(1993)(Hudson Soft).sfc", 524288, 0x7989891a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbombj) +STD_ROM_FN(snes_Supbombj) + +struct BurnDriver BurnDrvsnes_Supbombj = { + "snes_supbombj", "snes_supbomb", NULL, NULL, "1993", + "Super Bomberman (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_SupbombjRomInfo, snes_SupbombjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 2 (USA) + +static struct BurnRomInfo snes_Supbomb2RomDesc[] = { + { "Super Bomberman 2 (U)(1994)(Hudson Soft).sfc", 1048576, 0x9c1f11e4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb2) +STD_ROM_FN(snes_Supbomb2) + +struct BurnDriver BurnDrvsnes_Supbomb2 = { + "snes_supbomb2", NULL, NULL, NULL, "1994", + "Super Bomberman 2 (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb2RomInfo, snes_Supbomb2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 2 (Euro) + +static struct BurnRomInfo snes_Supbomb2eRomDesc[] = { + { "Super Bomberman 2 (E)(1994)(Hudson Soft).sfc", 1048576, 0xc60a4191, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb2e) +STD_ROM_FN(snes_Supbomb2e) + +struct BurnDriver BurnDrvsnes_Supbomb2e = { + "snes_supbomb2e", "snes_supbomb2", NULL, NULL, "1994", + "Super Bomberman 2 (Euro)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb2eRomInfo, snes_Supbomb2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 2 (Japan) + +static struct BurnRomInfo snes_Supbomb2jRomDesc[] = { + { "Super Bomberman 2 (J)(1994)(Hudson Soft).sfc", 1048576, 0xfb259f4f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb2j) +STD_ROM_FN(snes_Supbomb2j) + +struct BurnDriver BurnDrvsnes_Supbomb2j = { + "snes_supbomb2j", "snes_supbomb2", NULL, NULL, "1994", + "Super Bomberman 2 (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb2jRomInfo, snes_Supbomb2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 3 (Euro) + +static struct BurnRomInfo snes_Supbomb3eRomDesc[] = { + { "Super Bomberman 3 (E)(1995)(Hudson Soft).sfc", 1572864, 0xa096a6e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb3e) +STD_ROM_FN(snes_Supbomb3e) + +struct BurnDriver BurnDrvsnes_Supbomb3e = { + "snes_supbomb3e", NULL, NULL, NULL, "1995", + "Super Bomberman 3 (Euro)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb3eRomInfo, snes_Supbomb3eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 3 (Japan) + +static struct BurnRomInfo snes_Supbomb3jRomDesc[] = { + { "Super Bomberman 3 (J)(1995)(Hudson Soft).sfc", 1572864, 0x9ecb0fe6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb3j) +STD_ROM_FN(snes_Supbomb3j) + +struct BurnDriver BurnDrvsnes_Supbomb3j = { + "snes_supbomb3j", "snes_supbomb3e", NULL, NULL, "1995", + "Super Bomberman 3 (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb3jRomInfo, snes_Supbomb3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 4 (Japan) + +static struct BurnRomInfo snes_Supbomb4jRomDesc[] = { + { "Super Bomberman 4 (J)(1996)(Hudson Soft).sfc", 2097152, 0x3bbaeb19, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb4j) +STD_ROM_FN(snes_Supbomb4j) + +struct BurnDriver BurnDrvsnes_Supbomb4j = { + "snes_supbomb4j", "snes_supbomb4te", NULL, NULL, "1996", + "Super Bomberman 4 (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb4jRomInfo, snes_Supbomb4jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 4 (Hack, English) +// https://www.romhacking.net/translations/1450/ +static struct BurnRomInfo snes_Supbomb4teRomDesc[] = { + { "Super Bomberman 4 T-Eng (2009)(Svambo).sfc", 2097152, 0x4c58462d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb4te) +STD_ROM_FN(snes_Supbomb4te) + +struct BurnDriver BurnDrvsnes_Supbomb4te = { + "snes_supbomb4te", NULL, NULL, NULL, "2009", + "Super Bomberman 4 (Hack, English)\0", NULL, "Svambo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb4teRomInfo, snes_Supbomb4teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman 5 (Japan) + +static struct BurnRomInfo snes_Supbomb5jRomDesc[] = { + { "Super Bomberman 5 (J)(1997)(Hudson Soft).sfc", 2097152, 0x06b1f0f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbomb5j) +STD_ROM_FN(snes_Supbomb5j) + +struct BurnDriver BurnDrvsnes_Supbomb5j = { + "snes_supbomb5j", NULL, NULL, NULL, "1997", + "Super Bomberman 5 (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_Supbomb5jRomInfo, snes_Supbomb5jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bomberman - Panic Bomber W (Japan) + +static struct BurnRomInfo snes_SupbombpbwjRomDesc[] = { + { "Super Bomberman - Panic Bomber W (J)(1995)(Hudson Soft).sfc", 1048576, 0xfc633ecb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbombpbwj) +STD_ROM_FN(snes_Supbombpbwj) + +struct BurnDriver BurnDrvsnes_Supbombpbwj = { + "snes_supbombpbwj", NULL, NULL, NULL, "1995", + "Super Bomberman - Panic Bomber W (Japan)\0", "SA-1 enhancement CPU", "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SupbombpbwjRomInfo, snes_SupbombpbwjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bowling (USA) + +static struct BurnRomInfo snes_SupbowlingRomDesc[] = { + { "Super Bowling (U)(1992)(Technos).sfc", 524288, 0x94945b50, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbowling) +STD_ROM_FN(snes_Supbowling) + +struct BurnDriver BurnDrvsnes_Supbowling = { + "snes_supbowling", NULL, NULL, NULL, "1992", + "Super Bowling (USA)\0", NULL, "Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupbowlingRomInfo, snes_SupbowlingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bowling (Japan) + +static struct BurnRomInfo snes_SupbowlingjRomDesc[] = { + { "Super Bowling (J)(1992)(Athena).sfc", 524288, 0x383bc5d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbowlingj) +STD_ROM_FN(snes_Supbowlingj) + +struct BurnDriver BurnDrvsnes_Supbowlingj = { + "snes_supbowlingj", "snes_supbowling", NULL, NULL, "1992", + "Super Bowling (Japan)\0", NULL, "Athena Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupbowlingjRomInfo, snes_SupbowlingjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Birdie Rush (Japan) + +static struct BurnRomInfo snes_SupbrushRomDesc[] = { + { "Super Birdie Rush (J)(1992)(Data East).sfc", 1048576, 0xb854df10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supbrush) +STD_ROM_FN(snes_Supbrush) + +struct BurnDriver BurnDrvsnes_Supbrush = { + "snes_supbrush", NULL, NULL, NULL, "1992", + "Super Birdie Rush (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupbrushRomInfo, snes_SupbrushRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Chinese World 2 - Uchuu Ichibu Toudaikai (Japan) + +static struct BurnRomInfo snes_Supchiworld2jRomDesc[] = { + { "Super Chinese World 2 - Uchuu Ichibu Toudaikai (J)(1993)(Culture Brain).sfc", 2097152, 0x77dafbb6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworld2j) +STD_ROM_FN(snes_Supchiworld2j) + +struct BurnDriver BurnDrvsnes_Supchiworld2j = { + "snes_supchiworld2j", "snes_supchiworld2te", NULL, NULL, "1993", + "Super Chinese World 2 - Uchuu Ichibu Toudaikai (Japan)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RPG | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Supchiworld2jRomInfo, snes_Supchiworld2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Chinese World 2 - The Interstellar Battle Arena (Hack, English v2) +// https://www.translated.games/snes/scw2 +static struct BurnRomInfo snes_Supchiworld2teRomDesc[] = { + { "Super Chinese World 2 - The Interstellar Battle Arena - T-Eng v2 (2022)(Translated.Games).sfc", 3145728, 0x200d64f6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworld2te) +STD_ROM_FN(snes_Supchiworld2te) + +struct BurnDriver BurnDrvsnes_Supchiworld2te = { + "snes_supchiworld2te", NULL, NULL, NULL, "2022", + "Super Chinese World 2 - The Interstellar Battle Arena (Hack, English v2)\0", NULL, "Translated.Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_RPG | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Supchiworld2teRomInfo, snes_Supchiworld2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Chinese World 3 (Japan) + +static struct BurnRomInfo snes_Supchiworld3jRomDesc[] = { + { "Super Chinese World 3 (J)(1995)(Culture Brain).sfc", 1572864, 0x758a0322, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworld3j) +STD_ROM_FN(snes_Supchiworld3j) + +struct BurnDriver BurnDrvsnes_Supchiworld3j = { + "snes_supchiworld3j", "snes_supchiworld3te", NULL, NULL, "1995", + "Super Chinese World 3 (Japan)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RPG | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Supchiworld3jRomInfo, snes_Supchiworld3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Chinese World 3 (Hack, English v2) +// https://cdromance.org/snes-rom/super-chinese-world-3-japan/ +static struct BurnRomInfo snes_Supchiworld3teRomDesc[] = { + { "Super Chinese World 3 T-Eng v2 (2022)(Translated.Games).sfc", 2097152, 0xad3fc93b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworld3te) +STD_ROM_FN(snes_Supchiworld3te) + +struct BurnDriver BurnDrvsnes_Supchiworld3te = { + "snes_supchiworld3te", NULL, NULL, NULL, "2022", + "Super Chinese World 3 (Hack, English v2)\0", NULL, "Translated.Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Supchiworld3teRomInfo, snes_Supchiworld3teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Chinese World (Japan) + +static struct BurnRomInfo snes_SupchiworldjRomDesc[] = { + { "Super Chinese World (J)(1991)(Culture Brain).sfc", 1048576, 0x52fff0bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworldj) +STD_ROM_FN(snes_Supchiworldj) + +struct BurnDriver BurnDrvsnes_Supchiworldj = { + "snes_supchiworldj", "snes_supninjaboy", NULL, NULL, "1991", + "Super Chinese World (Japan)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupchiworldjRomInfo, snes_SupchiworldjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Chinese World (Hack, English) +// https://www.translated.games/snes/scw +static struct BurnRomInfo snes_SupchiworldteRomDesc[] = { + { "Super Chinese World T-Eng (2022)(Translated.Games).sfc", 1572864, 0xf38fc8a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supchiworldte) +STD_ROM_FN(snes_Supchiworldte) + +struct BurnDriver BurnDrvsnes_Supchiworldte = { + "snes_supchiworldte", "snes_supninjaboy", NULL, NULL, "2022", + "Super Chinese World (Hack, English)\0", NULL, "Translated.Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupchiworldteRomInfo, snes_SupchiworldteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Cup Soccer (Japan) + +static struct BurnRomInfo snes_SupcupsoccerRomDesc[] = { + { "Super Cup Soccer (J)(1992)(Jaleco).sfc", 1048576, 0x14a03974, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supcupsoccer) +STD_ROM_FN(snes_Supcupsoccer) + +struct BurnDriver BurnDrvsnes_Supcupsoccer = { + "snes_supcupsoccer", "snes_goal", NULL, NULL, "1992", + "Super Cup Soccer (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SupcupsoccerRomInfo, snes_SupcupsoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Drakkhen (Japan) + +static struct BurnRomInfo snes_SupdrakkhenRomDesc[] = { + { "Super Drakkhen (J)(1994)(Kemco).sfc", 2097152, 0x2c4e6b8f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supdrakkhen) +STD_ROM_FN(snes_Supdrakkhen) + +struct BurnDriver BurnDrvsnes_Supdrakkhen = { + "snes_supdrakkhen", "snes_dragonview", NULL, NULL, "1994", + "Super Drakkhen (Japan)\0", NULL, "Kemco - Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_RPG, 0, + SNESGetZipName, snes_SupdrakkhenRomInfo, snes_SupdrakkhenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Adventure Island (USA) + +static struct BurnRomInfo snes_SuperadvislandRomDesc[] = { + { "Super Adventure Island (U)(1992)(Hudson Soft).sfc", 1048576, 0xdcd46848, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superadvisland) +STD_ROM_FN(snes_Superadvisland) + +struct BurnDriver BurnDrvsnes_Superadvisland = { + "snes_superadvisland", NULL, NULL, NULL, "1992", + "Super Adventure Island (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperadvislandRomInfo, snes_SuperadvislandRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Adventure Island II (USA) + +static struct BurnRomInfo snes_Superadvisland2RomDesc[] = { + { "Super Adventure Island II (U)(1994)(Hudson Soft).sfc", 1572864, 0x52fe16fd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superadvisland2) +STD_ROM_FN(snes_Superadvisland2) + +struct BurnDriver BurnDrvsnes_Superadvisland2 = { + "snes_superadvisland2", NULL, NULL, NULL, "1994", + "Super Adventure Island II (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Superadvisland2RomInfo, snes_Superadvisland2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Air Diver 2 (Japan) + +static struct BurnRomInfo snes_Superairdiver2RomDesc[] = { + { "Super Air Diver 2 (J)(1995)(Asmik).sfc", 1310720, 0xa6ad6b0f, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Superairdiver2, snes_Superairdiver2, snes_dsp1) +STD_ROM_FN(snes_Superairdiver2) + +struct BurnDriver BurnDrvsnes_Superairdiver2 = { + "snes_superairdiver2", NULL, "snes_dsp1", NULL, "1995", + "Super Air Diver 2 (Japan)\0", "DSP-1 enhancement chip", "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_Superairdiver2RomInfo, snes_Superairdiver2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Air Diver (Euro) + +static struct BurnRomInfo snes_SuperairdivereRomDesc[] = { + { "Super Air Diver (E)(1993)(Sunsoft).sfc", 524288, 0x0b57c764, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Superairdivere, snes_Superairdivere, snes_dsp1) +STD_ROM_FN(snes_Superairdivere) + +struct BurnDriver BurnDrvsnes_Superairdivere = { + "snes_superairdivere", "snes_lockon", "snes_dsp1", NULL, "1993", + "Super Air Diver (Euro)\0", "DSP-1 enhancement chip", "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_SuperairdivereRomInfo, snes_SuperairdivereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Air Diver (Japan) + +static struct BurnRomInfo snes_SuperairdiverjRomDesc[] = { + { "Super Air Diver (J)(1993)(Asmik).sfc", 524288, 0x971e74ba, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Superairdiverj, snes_Superairdiverj, snes_dsp1) +STD_ROM_FN(snes_Superairdiverj) + +struct BurnDriver BurnDrvsnes_Superairdiverj = { + "snes_superairdiverj", "snes_lockon", "snes_dsp1", NULL, "1993", + "Super Air Diver (Japan)\0", "DSP-1 enhancement chip", "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_SuperairdiverjRomInfo, snes_SuperairdiverjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Aleste (Japan) + +static struct BurnRomInfo snes_SuperalesteRomDesc[] = { + { "Super Aleste (J)(1992)(Toho Co. - Compile).sfc", 1048576, 0x94d28ff9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superaleste) +STD_ROM_FN(snes_Superaleste) + +struct BurnDriver BurnDrvsnes_Superaleste = { + "snes_superaleste", "snes_spacemforce", NULL, NULL, "1992", + "Super Aleste (Japan)\0", NULL, "Toho Co. - Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SuperalesteRomInfo, snes_SuperalesteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Buster Bros. (USA) + +static struct BurnRomInfo snes_SuperbbrosRomDesc[] = { + { "Super Buster Bros. (U)(1992)(Capcom).sfc", 524288, 0x9526d1aa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbbros) +STD_ROM_FN(snes_Superbbros) + +struct BurnDriver BurnDrvsnes_Superbbros = { + "snes_superbbros", NULL, NULL, NULL, "1992", + "Super Buster Bros. (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SuperbbrosRomInfo, snes_SuperbbrosRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super B.C. Kid (Euro) + +static struct BurnRomInfo snes_SuperbckidRomDesc[] = { + { "Super B.C. Kid (E)(1994)(Hudson Soft).sfc", 1572864, 0x5615d5ed, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbckid) +STD_ROM_FN(snes_Superbckid) + +struct BurnDriver BurnDrvsnes_Superbckid = { + "snes_superbckid", "snes_superbonk", NULL, NULL, "1994", + "Super B.C. Kid (Euro)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperbckidRomInfo, snes_SuperbckidRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Billiard - Championship Pool (Japan) + +static struct BurnRomInfo snes_SuperbilliardRomDesc[] = { + { "Super Billiard - Championship Pool (J)(1994)(Imagineer).sfc", 1048576, 0xf7031d41, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbilliard) +STD_ROM_FN(snes_Superbilliard) + +struct BurnDriver BurnDrvsnes_Superbilliard = { + "snes_superbilliard", "snes_championpool", NULL, NULL, "1994", + "Super Billiard - Championship Pool (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 8, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SuperbilliardRomInfo, snes_SuperbilliardRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Black Bass (USA) + +static struct BurnRomInfo snes_SuperblackbassRomDesc[] = { + { "Super Black Bass (U)(1992)(Hot-B).sfc", 1048576, 0x57d9fd61, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superblackbass) +STD_ROM_FN(snes_Superblackbass) + +struct BurnDriver BurnDrvsnes_Superblackbass = { + "snes_superblackbass", NULL, NULL, NULL, "1992", + "Super Black Bass (USA)\0", NULL, "Hot-B", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SuperblackbassRomInfo, snes_SuperblackbassRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Black Bass 2 (Japan) + +static struct BurnRomInfo snes_Superblackbass2jRomDesc[] = { + { "Super Black Bass 2 (J)(1994)(Star Fish).sfc", 2097152, 0x9572e3ad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superblackbass2j) +STD_ROM_FN(snes_Superblackbass2j) + +struct BurnDriver BurnDrvsnes_Superblackbass2j = { + "snes_superblackbass2j", "snes_bassinblackbass", NULL, NULL, "1994", + "Super Black Bass 2 (Japan)\0", NULL, "Star Fish", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Superblackbass2jRomInfo, snes_Superblackbass2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Black Bass 3 (Japan) + +static struct BurnRomInfo snes_Superblackbass3jRomDesc[] = { + { "Super Black Bass 3 (J)(1995)(Star Fish).sfc", 4194304, 0x97ae0df4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superblackbass3j) +STD_ROM_FN(snes_Superblackbass3j) + +struct BurnDriver BurnDrvsnes_Superblackbass3j = { + "snes_superblackbass3j", NULL, NULL, NULL, "1995", + "Super Black Bass 3 (Japan)\0", NULL, "Star Fish", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Superblackbass3jRomInfo, snes_Superblackbass3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Black Bass (Japan) + +static struct BurnRomInfo snes_SuperblackbassjRomDesc[] = { + { "Super Black Bass (J)(1992)(Hot-B).sfc", 1048576, 0x89f2712c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superblackbassj) +STD_ROM_FN(snes_Superblackbassj) + +struct BurnDriver BurnDrvsnes_Superblackbassj = { + "snes_superblackbassj", "snes_superblackbass", NULL, NULL, "1992", + "Super Black Bass (Japan)\0", NULL, "Hot-B", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SuperblackbassjRomInfo, snes_SuperblackbassjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bonk (USA) + +static struct BurnRomInfo snes_SuperbonkRomDesc[] = { + { "Super Bonk (U)(1994)(Hudson Soft).sfc", 1572864, 0x5688b581, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbonk) +STD_ROM_FN(snes_Superbonk) + +struct BurnDriver BurnDrvsnes_Superbonk = { + "snes_superbonk", NULL, NULL, NULL, "1994", + "Super Bonk (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperbonkRomInfo, snes_SuperbonkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Bonk 2 (Hack, English) +// https://www.romhacking.net/translations/461/ +static struct BurnRomInfo snes_Superbonk2teRomDesc[] = { + { "Super Bonk 2 T-Eng (1999)(Gaijin Productions).sfc", 1573376, 0x2e2a1be9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbonk2te) +STD_ROM_FN(snes_Superbonk2te) + +struct BurnDriver BurnDrvsnes_Superbonk2te = { + "snes_superbonk2te", NULL, NULL, NULL, "1999", + "Super Bonk 2 (Hack, English)\0", "NB: some compressed graphic texts have left untranslated", "Gaijin Productions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Superbonk2teRomInfo, snes_Superbonk2teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Garry Kitchen's Super Battletank - War in the Gulf (USA) + +static struct BurnRomInfo snes_SuperbtankRomDesc[] = { + { "Garry Kitchen's Super Battletank - War in the Gulf (U)(1992)(Absolute Entertainment).sfc", 524288, 0x77811b34, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbtank) +STD_ROM_FN(snes_Superbtank) + +struct BurnDriver BurnDrvsnes_Superbtank = { + "snes_superbtank", NULL, NULL, NULL, "1992", + "Garry Kitchen's Super Battletank - War in the Gulf (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM, 0, + SNESGetZipName, snes_SuperbtankRomInfo, snes_SuperbtankRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Battletank 2 (USA) + +static struct BurnRomInfo snes_Superbtank2RomDesc[] = { + { "Super Battletank 2 (U)(1993)(Absolute Entertainment).sfc", 2097152, 0x70a292d6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbtank2) +STD_ROM_FN(snes_Superbtank2) + +struct BurnDriver BurnDrvsnes_Superbtank2 = { + "snes_superbtank2", NULL, NULL, NULL, "1993", + "Super Battletank 2 (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM, 0, + SNESGetZipName, snes_Superbtank2RomInfo, snes_Superbtank2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Garry Kitchen's Super Battletank (Japan) + +static struct BurnRomInfo snes_SuperbtankjRomDesc[] = { + { "Garry Kitchen's Super Battletank (J)(1993)(Pack-In-Video).sfc", 524288, 0xc53b82cd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superbtankj) +STD_ROM_FN(snes_Superbtankj) + +struct BurnDriver BurnDrvsnes_Superbtankj = { + "snes_superbtankj", "snes_superbtank", NULL, NULL, "1993", + "Garry Kitchen's Super Battletank (Japan)\0", NULL, "Pack-In-Video", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM, 0, + SNESGetZipName, snes_SuperbtankjRomInfo, snes_SuperbtankjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Castlevania IV (USA) + +static struct BurnRomInfo snes_Supercastlevania4RomDesc[] = { + { "Super Castlevania IV (U)(1991)(Konami).sfc", 1048576, 0xb64ffb12, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supercastlevania4) +STD_ROM_FN(snes_Supercastlevania4) + +struct BurnDriver BurnDrvsnes_Supercastlevania4 = { + "snes_supercastlevania4", NULL, NULL, NULL, "1991", + "Super Castlevania IV (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Supercastlevania4RomInfo, snes_Supercastlevania4RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Castlevania IV (Euro) + +static struct BurnRomInfo snes_Supercastlevania4eRomDesc[] = { + { "Super Castlevania IV (E)(1992)(Konami).sfc", 1048576, 0x5d40cb37, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supercastlevania4e) +STD_ROM_FN(snes_Supercastlevania4e) + +struct BurnDriver BurnDrvsnes_Supercastlevania4e = { + "snes_supercastlevania4e", "snes_supercastlevania4", NULL, NULL, "1992", + "Super Castlevania IV (Euro)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Supercastlevania4eRomInfo, snes_Supercastlevania4eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Chase H.Q. (USA) + +static struct BurnRomInfo snes_SuperchasehqRomDesc[] = { + { "Super Chase H.Q. (U)(1993)(Taito).sfc", 1048576, 0x6ef3b9c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superchasehq) +STD_ROM_FN(snes_Superchasehq) + +struct BurnDriver BurnDrvsnes_Superchasehq = { + "snes_superchasehq", NULL, NULL, NULL, "1993", + "Super Chase H.Q. (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperchasehqRomInfo, snes_SuperchasehqRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Caesars Palace (USA) + +static struct BurnRomInfo snes_SupercpRomDesc[] = { + { "Super Caesars Palace (U)(1993)(Virgin Interactive).sfc", 524288, 0xa2381221, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supercp) +STD_ROM_FN(snes_Supercp) + +struct BurnDriver BurnDrvsnes_Supercp = { + "snes_supercp", NULL, NULL, NULL, "1993", + "Super Caesars Palace (USA)\0", NULL, "Virgin Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_CASINO, 0, + SNESGetZipName, snes_SupercpRomInfo, snes_SupercpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Casino - Caesars Palace (Japan) + +static struct BurnRomInfo snes_SupercpjRomDesc[] = { + { "Super Casino - Caesars Palace (J)(1993)(Coconuts Japan).sfc", 524288, 0x53193b87, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supercpj) +STD_ROM_FN(snes_Supercpj) + +struct BurnDriver BurnDrvsnes_Supercpj = { + "snes_supercpj", "snes_supercp", NULL, NULL, "1993", + "Super Casino - Caesars Palace (Japan)\0", NULL, "Coconuts Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_CASINO, 0, + SNESGetZipName, snes_SupercpjRomInfo, snes_SupercpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Donkey Kong (Japan) + +static struct BurnRomInfo snes_SuperdkongRomDesc[] = { + { "Super Donkey Kong (J)(1994)(Nintendo).sfc", 4194304, 0x3adef543, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdkong) +STD_ROM_FN(snes_Superdkong) + +struct BurnDriver BurnDrvsnes_Superdkong = { + "snes_superdkong", "snes_dkongcntry", NULL, NULL, "1994", + "Super Donkey Kong (Japan)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperdkongRomInfo, snes_SuperdkongRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Donkey Kong 2 - Dixie & Diddy (Japan) + +static struct BurnRomInfo snes_Superdkong2RomDesc[] = { + { "Super Donkey Kong 2 - Dixie & Diddy (J)(1995)(Nintendo).sfc", 4194304, 0x46079c0f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdkong2) +STD_ROM_FN(snes_Superdkong2) + +struct BurnDriver BurnDrvsnes_Superdkong2 = { + "snes_superdkong2", "snes_dkongcntry2", NULL, NULL, "1995", + "Super Donkey Kong 2 - Dixie & Diddy (Japan)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Superdkong2RomInfo, snes_Superdkong2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Donkey Kong 3 - Nazo no Kremis-tou (Japan) + +static struct BurnRomInfo snes_Superdkong3RomDesc[] = { + { "Super Donkey Kong 3 - Nazo no Kremis-tou (J)(1996)(Nintendo).sfc", 4194304, 0x5b337fb6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdkong3) +STD_ROM_FN(snes_Superdkong3) + +struct BurnDriver BurnDrvsnes_Superdkong3 = { + "snes_superdkong3", "snes_dkongcntry3", NULL, NULL, "1996", + "Super Donkey Kong 3 - Nazo no Kremis-tou (Japan)\0", NULL, "Nintendo - Rare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Superdkong3RomInfo, snes_Superdkong3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Double Dragon (USA) + +static struct BurnRomInfo snes_SuperdoubledragonRomDesc[] = { + { "Super Double Dragon (U)(1992)(Tradewest - Technos).sfc", 1048576, 0x09ed12a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdoubledragon) +STD_ROM_FN(snes_Superdoubledragon) + +struct BurnDriver BurnDrvsnes_Superdoubledragon = { + "snes_superdoubledragon", NULL, NULL, NULL, "1992", + "Super Double Dragon (USA)\0", NULL, "Tradewest - Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SuperdoubledragonRomInfo, snes_SuperdoubledragonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Double Dragon (Euro) + +static struct BurnRomInfo snes_SuperdoubledragoneRomDesc[] = { + { "Super Double Dragon (E)(1992)(Tradewest - Technos).sfc", 1048576, 0xb3f6009b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdoubledragone) +STD_ROM_FN(snes_Superdoubledragone) + +struct BurnDriver BurnDrvsnes_Superdoubledragone = { + "snes_superdoubledragone", "snes_superdoubledragon", NULL, NULL, "1992", + "Super Double Dragon (Euro)\0", NULL, "Tradewest - Technos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SuperdoubledragoneRomInfo, snes_SuperdoubledragoneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Drift Out - World Rally Championships (USA) + +static struct BurnRomInfo snes_SuperdriftoutRomDesc[] = { + { "Super Drift Out - World Rally Championships (U)(1994)(Visco Corp.).sfc", 2097152, 0xec8c1cca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdriftout) +STD_ROM_FN(snes_Superdriftout) + +struct BurnDriver BurnDrvsnes_Superdriftout = { + "snes_superdriftout", NULL, NULL, NULL, "1994", + "Super Drift Out - World Rally Championships (USA)\0", NULL, "Visco Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperdriftoutRomInfo, snes_SuperdriftoutRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Dropzone (Euro) + +static struct BurnRomInfo snes_SuperdropzoneRomDesc[] = { + { "Super Dropzone (E)(1994)(Psygnosis - Archer Maclean).sfc", 1048576, 0xe1ccce49, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdropzone) +STD_ROM_FN(snes_Superdropzone) + +struct BurnDriver BurnDrvsnes_Superdropzone = { + "snes_superdropzone", NULL, NULL, NULL, "1994", + "Super Dropzone (Euro)\0", NULL, "Psygnosis - Archer Maclean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SuperdropzoneRomInfo, snes_SuperdropzoneRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Dunk Shot (Japan) + +static struct BurnRomInfo snes_SuperdunkshotRomDesc[] = { + { "Super Dunk Shot (J)(1992)(HAL Laboratory).sfc", 1048576, 0x4674e469, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superdunkshot) +STD_ROM_FN(snes_Superdunkshot) + +struct BurnDriver BurnDrvsnes_Superdunkshot = { + "snes_superdunkshot", "snes_ncaabasketball", NULL, NULL, "1992", + "Super Dunk Shot (Japan)\0", NULL, "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SuperdunkshotRomInfo, snes_SuperdunkshotRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super E.D.F. (USA) + +static struct BurnRomInfo snes_SuperedfRomDesc[] = { + { "Super E.D.F. (U)(1991)(Jaleco).sfc", 1048576, 0x5ea2e79c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superedf) +STD_ROM_FN(snes_Superedf) + +struct BurnDriver BurnDrvsnes_Superedf = { + "snes_superedf", NULL, NULL, NULL, "1991", + "Super E.D.F. (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SuperedfRomInfo, snes_SuperedfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Formation Soccer (Japan) + +static struct BurnRomInfo snes_SuperfsoccerRomDesc[] = { + { "Super Formation Soccer (J)(1991)(Human Entertainment).sfc", 524288, 0x265afe97, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superfsoccer) +STD_ROM_FN(snes_Superfsoccer) + +struct BurnDriver BurnDrvsnes_Superfsoccer = { + "snes_superfsoccer", "snes_supersoccer", NULL, NULL, "1991", + "Super Formation Soccer (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SuperfsoccerRomInfo, snes_SuperfsoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Genjin (Japan) + +static struct BurnRomInfo snes_SupergenjinRomDesc[] = { + { "Super Genjin (J)(1994)(Hudson Soft).sfc", 1572864, 0xb24af648, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supergenjin) +STD_ROM_FN(snes_Supergenjin) + +struct BurnDriver BurnDrvsnes_Supergenjin = { + "snes_supergenjin", "snes_superbonk", NULL, NULL, "1994", + "Super Genjin (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupergenjinRomInfo, snes_SupergenjinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Genjin 2 (Japan) + +static struct BurnRomInfo snes_Supergenjin2RomDesc[] = { + { "Super Genjin 2 (J)(1995)(Hudson Soft).sfc", 1572864, 0xc5d12427, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supergenjin2) +STD_ROM_FN(snes_Supergenjin2) + +struct BurnDriver BurnDrvsnes_Supergenjin2 = { + "snes_supergenjin2", "snes_superbonk2te", NULL, NULL, "1995", + "Super Genjin 2 (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Supergenjin2RomInfo, snes_Supergenjin2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ghouls 'n Ghosts (USA) + +static struct BurnRomInfo snes_SupergngRomDesc[] = { + { "Super Ghouls 'n Ghosts (U)(1991)(Capcom).sfc", 1048576, 0x6aaba901, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supergng) +STD_ROM_FN(snes_Supergng) + +struct BurnDriver BurnDrvsnes_Supergng = { + "snes_supergng", NULL, NULL, NULL, "1991", + "Super Ghouls 'n Ghosts (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SupergngRomInfo, snes_SupergngRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Goal! (Euro) + +static struct BurnRomInfo snes_SupergoalRomDesc[] = { + { "Super Goal! (E)(1992)(Jaleco).sfc", 1048576, 0xbb624450, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supergoal) +STD_ROM_FN(snes_Supergoal) + +struct BurnDriver BurnDrvsnes_Supergoal = { + "snes_supergoal", "snes_goal", NULL, NULL, "1992", + "Super Goal! (Euro)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SupergoalRomInfo, snes_SupergoalRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super H.Q. - Criminal Chaser (Japan) + +static struct BurnRomInfo snes_SuperhqccRomDesc[] = { + { "Super H.Q. - Criminal Chaser (J)(1993)(Taito).sfc", 1048576, 0xbf252997, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superhqcc) +STD_ROM_FN(snes_Superhqcc) + +struct BurnDriver BurnDrvsnes_Superhqcc = { + "snes_superhqcc", "snes_superchasehq", NULL, NULL, "1993", + "Super H.Q. - Criminal Chaser (Japan)\0", NULL, "Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperhqccRomInfo, snes_SuperhqccRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Kick Off (Japan) + +static struct BurnRomInfo snes_SuperkickoffRomDesc[] = { + { "Super Kick Off (J)(1992)(Misawa Entertainment).sfc", 524288, 0x70afd634, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superkickoff) +STD_ROM_FN(snes_Superkickoff) + +struct BurnDriver BurnDrvsnes_Superkickoff = { + "snes_superkickoff", "snes_kickoff", NULL, NULL, "1992", + "Super Kick Off (Japan)\0", NULL, "Misawa Entertainment - Anco Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SuperkickoffRomInfo, snes_SuperkickoffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Loopz (Japan) + +static struct BurnRomInfo snes_SuperloopzjRomDesc[] = { + { "Super Loopz (J)(1994)(Imagineer).sfc", 524288, 0x49601821, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superloopzj) +STD_ROM_FN(snes_Superloopzj) + +struct BurnDriver BurnDrvsnes_Superloopzj = { + "snes_superloopzj", NULL, NULL, NULL, "1994", + "Super Loopz (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SuperloopzjRomInfo, snes_SuperloopzjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario World (USA) + +static struct BurnRomInfo snes_SupermarioworldRomDesc[] = { + { "Super Mario World (U)(1991)(Nintendo).sfc", 524288, 0xb19ed489, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermarioworld) +STD_ROM_FN(snes_Supermarioworld) + +struct BurnDriver BurnDrvsnes_Supermarioworld = { + "snes_supermarioworld", NULL, NULL, NULL, "1991", + "Super Mario World (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupermarioworldRomInfo, snes_SupermarioworldRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario World (Euro) + +static struct BurnRomInfo snes_SupermarioworldeRomDesc[] = { + { "Super Mario World (E)(1991)(Nintendo).sfc", 524288, 0xb47f5f20, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermarioworlde) +STD_ROM_FN(snes_Supermarioworlde) + +struct BurnDriver BurnDrvsnes_Supermarioworlde = { + "snes_supermarioworlde", "snes_supermarioworld", NULL, NULL, "1991", + "Super Mario World (Euro)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupermarioworldeRomInfo, snes_SupermarioworldeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Super Mario World ~ Super Mario Bros. 4 (Japan) + +static struct BurnRomInfo snes_SupermarioworldjRomDesc[] = { + { "Super Mario World - Super Mario Bros. 4 (J)(1990)(Nintendo).sfc", 524288, 0x0ec0ddac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermarioworldj) +STD_ROM_FN(snes_Supermarioworldj) + +struct BurnDriver BurnDrvsnes_Supermarioworldj = { + "snes_supermarioworldj", "snes_supermarioworld", NULL, NULL, "1990", + "Super Mario World ~ Super Mario Bros. 4 (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupermarioworldjRomInfo, snes_SupermarioworldjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Metroid (USA, Japan) + +static struct BurnRomInfo snes_SupermetroidRomDesc[] = { + { "Super Metroid (U)(1994)(Nintendo).sfc", 3145728, 0xd63ed5f8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermetroid) +STD_ROM_FN(snes_Supermetroid) + +struct BurnDriver BurnDrvsnes_Supermetroid = { + "snes_supermetroid", NULL, NULL, NULL, "1994", + "Super Metroid (USA, Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupermetroidRomInfo, snes_SupermetroidRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Metroid (Euro) + +static struct BurnRomInfo snes_SupermetroideRomDesc[] = { + { "Super Metroid (E)(1994)(Nintendo).sfc", 3145728, 0xad2cbf9c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermetroide) +STD_ROM_FN(snes_Supermetroide) + +struct BurnDriver BurnDrvsnes_Supermetroide = { + "snes_supermetroide", "snes_supermetroid", NULL, NULL, "1994", + "Super Metroid (Euro)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupermetroideRomInfo, snes_SupermetroideRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario Kart (USA) + +static struct BurnRomInfo snes_SupermkartRomDesc[] = { + { "Super Mario Kart (U)(1992)(Nintendo).sfc", 524288, 0xcd80db86, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Supermkart, snes_Supermkart, snes_dsp1b) +STD_ROM_FN(snes_Supermkart) + +struct BurnDriver BurnDrvsnes_Supermkart = { + "snes_supermkart", NULL, "snes_dsp1b", NULL, "1992", + "Super Mario Kart (USA)\0", "DSP-1B enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SupermkartRomInfo, snes_SupermkartRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario Kart (Euro) + +static struct BurnRomInfo snes_SupermkarteRomDesc[] = { + { "Super Mario Kart (E)(1992)(Nintendo).sfc", 524288, 0x56410e5e, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Supermkarte, snes_Supermkarte, snes_dsp1b) +STD_ROM_FN(snes_Supermkarte) + +struct BurnDriver BurnDrvsnes_Supermkarte = { + "snes_supermkarte", "snes_supermkart", "snes_dsp1b", NULL, "1992", + "Super Mario Kart (Euro)\0", "DSP-1B enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SupermkarteRomInfo, snes_SupermkarteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario Kart (Japan) + +static struct BurnRomInfo snes_SupermkartjRomDesc[] = { + { "Super Mario Kart (J)(1992)(Nintendo).sfc", 524288, 0xc8002453, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Supermkartj, snes_Supermkartj, snes_dsp1b) +STD_ROM_FN(snes_Supermkartj) + +struct BurnDriver BurnDrvsnes_Supermkartj = { + "snes_supermkartj", "snes_supermkart", "snes_dsp1b", NULL, "1992", + "Super Mario Kart (Japan)\0", "DSP-1B enhancement chip", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SupermkartjRomInfo, snes_SupermkartjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Nova (USA) + +static struct BurnRomInfo snes_SupernovaRomDesc[] = { + { "Super Nova (U)(1993)(Taito).sfc", 1048576, 0x460def25, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supernova) +STD_ROM_FN(snes_Supernova) + +struct BurnDriver BurnDrvsnes_Supernova = { + "snes_supernova", NULL, NULL, NULL, "1993", + "Super Nova (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SupernovaRomInfo, snes_SupernovaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Off Road (USA) + +static struct BurnRomInfo snes_SuperoffroadRomDesc[] = { + { "Super Off Road (U)(1992)(Tradewest).sfc", 524288, 0xfe263383, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superoffroad) +STD_ROM_FN(snes_Superoffroad) + +struct BurnDriver BurnDrvsnes_Superoffroad = { + "snes_superoffroad", NULL, NULL, NULL, "1992", + "Super Off Road (USA)\0", NULL, "Tradewest", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperoffroadRomInfo, snes_SuperoffroadRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Off Road - The Baja (USA) + +static struct BurnRomInfo snes_SuperoffroadbajaRomDesc[] = { + { "Super Off Road - The Baja (U)(1993)(Tradewest).sfc", 1048576, 0xcb483ead, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superoffroadbaja) +STD_ROM_FN(snes_Superoffroadbaja) + +struct BurnDriver BurnDrvsnes_Superoffroadbaja = { + "snes_superoffroadbaja", NULL, NULL, NULL, "1993", + "Super Off Road - The Baja (USA)\0", NULL, "Tradewest", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperoffroadbajaRomInfo, snes_SuperoffroadbajaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Pang (Japan) + +static struct BurnRomInfo snes_SuperpangRomDesc[] = { + { "Super Pang (J)(1992)(Capcom).sfc", 524288, 0xca54f001, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superpang) +STD_ROM_FN(snes_Superpang) + +struct BurnDriver BurnDrvsnes_Superpang = { + "snes_superpang", "snes_superbbros", NULL, NULL, "1992", + "Super Pang (Japan)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SuperpangRomInfo, snes_SuperpangRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Punch-Out!! (USA) + +static struct BurnRomInfo snes_SuperpunchoutRomDesc[] = { + { "Super Punch-Out!! (U)(1994)(Nintendo).sfc", 2097152, 0xe2f92f84, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superpunchout) +STD_ROM_FN(snes_Superpunchout) + +struct BurnDriver BurnDrvsnes_Superpunchout = { + "snes_superpunchout", NULL, NULL, NULL, "1994", + "Super Punch-Out!! (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SuperpunchoutRomInfo, snes_SuperpunchoutRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Putty (USA) + +static struct BurnRomInfo snes_SuperputtyRomDesc[] = { + { "Super Putty (U)(1993)(U.S. Gold - System 3).sfc", 1048576, 0x746087c1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superputty) +STD_ROM_FN(snes_Superputty) + +struct BurnDriver BurnDrvsnes_Superputty = { + "snes_superputty", NULL, NULL, NULL, "1993", + "Super Putty (USA)\0", NULL, "U.S. Gold - System 3", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperputtyRomInfo, snes_SuperputtyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super R-Type (USA) + +static struct BurnRomInfo snes_SuperrtypeRomDesc[] = { + { "Super R-Type (U)(1991)(Irem).sfc", 1048576, 0x8b22c830, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superrtype) +STD_ROM_FN(snes_Superrtype) + +struct BurnDriver BurnDrvsnes_Superrtype = { + "snes_superrtype", NULL, NULL, NULL, "1991", + "Super R-Type (USA)\0", NULL, "Irem", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SuperrtypeRomInfo, snes_SuperrtypeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super R-Type (Japan) + +static struct BurnRomInfo snes_SuperrtypejRomDesc[] = { + { "Super R-Type (J)(1991)(Irem).sfc", 1048576, 0x4e872c8b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superrtypej) +STD_ROM_FN(snes_Superrtypej) + +struct BurnDriver BurnDrvsnes_Superrtypej = { + "snes_superrtypej", "snes_superrtype", NULL, NULL, "1991", + "Super R-Type (Japan)\0", NULL, "Irem Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_SuperrtypejRomInfo, snes_SuperrtypejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Scope 6 (USA) + +static struct BurnRomInfo snes_Superscope6RomDesc[] = { + { "Super Scope 6 (U)(1992)(Nintendo).sfc", 1048576, 0xb141ea99, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superscope6) +STD_ROM_FN(snes_Superscope6) + +struct BurnDriver BurnDrvsnes_Superscope6 = { + "snes_superscope6", NULL, NULL, NULL, "1992", + "Super Scope 6 (USA)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT | GBF_MINIGAMES, 0, + SNESGetZipName, snes_Superscope6RomInfo, snes_Superscope6RomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nintendo Scope 6 (Euro) + +static struct BurnRomInfo snes_Superscope6eRomDesc[] = { + { "Nintendo Scope 6 (E)(1992)(Nintendo).sfc", 1048576, 0xb1859ca4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superscope6e) +STD_ROM_FN(snes_Superscope6e) + +struct BurnDriver BurnDrvsnes_Superscope6e = { + "snes_superscope6e", "snes_superscope6", NULL, NULL, "1992", + "Nintendo Scope 6 (Euro)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT | GBF_MINIGAMES, 0, + SNESGetZipName, snes_Superscope6eRomInfo, snes_Superscope6eRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Scope 6 (Japan) + +static struct BurnRomInfo snes_Superscope6jRomDesc[] = { + { "Super Scope 6 (J)(1993)(Nintendo).sfc", 1048576, 0x7887f968, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superscope6j) +STD_ROM_FN(snes_Superscope6j) + +struct BurnDriver BurnDrvsnes_Superscope6j = { + "snes_superscope6j", "snes_superscope6", NULL, NULL, "1993", + "Super Scope 6 (Japan)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT | GBF_MINIGAMES, 0, + SNESGetZipName, snes_Superscope6jRomInfo, snes_Superscope6jRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Snakey (Japan) + +static struct BurnRomInfo snes_SupersnakeyRomDesc[] = { + { "Super Snakey (J)(1994)(Yojigen).sfc", 524288, 0x5ec69fad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supersnakey) +STD_ROM_FN(snes_Supersnakey) + +struct BurnDriver BurnDrvsnes_Supersnakey = { + "snes_supersnakey", "snes_wildsnake", NULL, NULL, "1994", + "Super Snakey (Japan)\0", NULL, "Yojigen", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SupersnakeyRomInfo, snes_SupersnakeyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Soccer (USA) + +static struct BurnRomInfo snes_SupersoccerRomDesc[] = { + { "Super Soccer (U)(1992)(Nintendo - Human Ent.).sfc", 524288, 0x4fd164d8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supersoccer) +STD_ROM_FN(snes_Supersoccer) + +struct BurnDriver BurnDrvsnes_Supersoccer = { + "snes_supersoccer", NULL, NULL, NULL, "1992", + "Super Soccer (USA)\0", NULL, "Nintendo - Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SupersoccerRomInfo, snes_SupersoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Star Wars - Episode IV (USA) + +static struct BurnRomInfo snes_SuperstarwarsRomDesc[] = { + { "Super Star Wars (U)(1992)(JVC - LucasArts).sfc", 1048576, 0xacbcae7c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superstarwars) +STD_ROM_FN(snes_Superstarwars) + +struct BurnDriver BurnDrvsnes_Superstarwars = { + "snes_superstarwars", NULL, NULL, NULL, "1992", + "Super Star Wars - Episode IV (USA)\0", NULL, "JVC - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperstarwarsRomInfo, snes_SuperstarwarsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Star Wars - Episode V - The Empire Strikes Back (USA) + +static struct BurnRomInfo snes_SuperstarwarsesbRomDesc[] = { + { "Super Star Wars - The Empire Strikes Back (U)(1993)(JVC - LucasArts).sfc", 1572864, 0xf45b15be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superstarwarsesb) +STD_ROM_FN(snes_Superstarwarsesb) + +struct BurnDriver BurnDrvsnes_Superstarwarsesb = { + "snes_superstarwarsesb", NULL, NULL, NULL, "1993", + "Super Star Wars - Episode V - The Empire Strikes Back (USA)\0", NULL, "JVC - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperstarwarsesbRomInfo, snes_SuperstarwarsesbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Star Wars - Episode VI - Return of the Jedi (USA) + +static struct BurnRomInfo snes_SuperstarwarsrjRomDesc[] = { + { "Super Star Wars - Return of the Jedi (U)(1994)(JVC - LucasArts).sfc", 2097152, 0xc709ec69, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superstarwarsrj) +STD_ROM_FN(snes_Superstarwarsrj) + +struct BurnDriver BurnDrvsnes_Superstarwarsrj = { + "snes_superstarwarsrj", NULL, NULL, NULL, "1994", + "Super Star Wars - Episode VI - Return of the Jedi (USA)\0", NULL, "JVC - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperstarwarsrjRomInfo, snes_SuperstarwarsrjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Strike Eagle (USA) + +static struct BurnRomInfo snes_SuperstrikeeagleRomDesc[] = { + { "Super Strike Eagle (U)(1993)(MicroProse).sfc", 1048576, 0xecf79841, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superstrikeeagle) +STD_ROM_FN(snes_Superstrikeeagle) + +struct BurnDriver BurnDrvsnes_Superstrikeeagle = { + "snes_superstrikeeagle", NULL, NULL, NULL, "1993", + "Super Strike Eagle (USA)\0", NULL, "MicroProse", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_SuperstrikeeagleRomInfo, snes_SuperstrikeeagleRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Tennis (USA) + +static struct BurnRomInfo snes_SupertennisRomDesc[] = { + { "Super Tennis (U)(1991)(Nintendo).sfc", 524288, 0x8d383776, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supertennis) +STD_ROM_FN(snes_Supertennis) + +struct BurnDriver BurnDrvsnes_Supertennis = { + "snes_supertennis", NULL, NULL, NULL, "1991", + "Super Tennis (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupertennisRomInfo, snes_SupertennisRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Turrican (USA) + +static struct BurnRomInfo snes_SuperturricanRomDesc[] = { + { "Super Turrican (U)(1993)(SEIKA - Factor 5).sfc", 524288, 0x3a7e8215, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superturrican) +STD_ROM_FN(snes_Superturrican) + +struct BurnDriver BurnDrvsnes_Superturrican = { + "snes_superturrican", NULL, NULL, NULL, "1993", + "Super Turrican (USA)\0", NULL, "SEIKA - Factor 5", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperturricanRomInfo, snes_SuperturricanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Turrican 2 (USA) + +static struct BurnRomInfo snes_Superturrican2RomDesc[] = { + { "Super Turrican 2 (U)(1995)(Ocean - Factor 5).sfc", 2097152, 0xd2ffabac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superturrican2) +STD_ROM_FN(snes_Superturrican2) + +struct BurnDriver BurnDrvsnes_Superturrican2 = { + "snes_superturrican2", NULL, NULL, NULL, "1995", + "Super Turrican 2 (USA)\0", NULL, "Ocean - Factor 5", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Superturrican2RomInfo, snes_Superturrican2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Valis IV (USA) + +static struct BurnRomInfo snes_SupervalisivRomDesc[] = { + { "Super Valis IV (U)(1992)(Atlus).sfc", 1048576, 0x29e8ac9f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supervalisiv) +STD_ROM_FN(snes_Supervalisiv) + +struct BurnDriver BurnDrvsnes_Supervalisiv = { + "snes_supervalisiv", NULL, NULL, NULL, "1992", + "Super Valis IV (USA)\0", NULL, "Atlus Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupervalisivRomInfo, snes_SupervalisivRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Valis - Akaki Tsuki no Otome (Japan) + +static struct BurnRomInfo snes_SupervalisjRomDesc[] = { + { "Super Valis - Akaki Tsuki no Otome (J)(1992)(Laser Soft).sfc", 1048576, 0xe46c1112, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supervalisj) +STD_ROM_FN(snes_Supervalisj) + +struct BurnDriver BurnDrvsnes_Supervalisj = { + "snes_supervalisj", "snes_supervalisiv", NULL, NULL, "1992", + "Super Valis - Akaki Tsuki no Otome (Japan)\0", NULL, "Laser Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupervalisjRomInfo, snes_SupervalisjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super SWIV (Japan) + +static struct BurnRomInfo snes_SuperswivjRomDesc[] = { + { "Super SWIV (J)(1992)(The Sales Curve).sfc", 1048576, 0x70f28a6d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superswivj) +STD_ROM_FN(snes_Superswivj) + +struct BurnDriver BurnDrvsnes_Superswivj = { + "snes_superswivj", "snes_firepower2000", NULL, NULL, "1992", + "Super SWIV (Japan)\0", NULL, "The Sales Curve", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VERSHOOT, 0, + SNESGetZipName, snes_SuperswivjRomInfo, snes_SuperswivjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Famista (Japan) + +static struct BurnRomInfo snes_SupfamistaRomDesc[] = { + { "Super Famista (J)(1992)(Namco).sfc", 1048576, 0x72d49e26, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supfamista) +STD_ROM_FN(snes_Supfamista) + +struct BurnDriver BurnDrvsnes_Supfamista = { + "snes_supfamista", "snes_supbatterup", NULL, NULL, "1992", + "Super Famista (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupfamistaRomInfo, snes_SupfamistaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Gussun Oyoyo 2 (Japan) + +static struct BurnRomInfo snes_Supgusoyo2jRomDesc[] = { + { "Super Gussun Oyoyo 2 (J)(1996)(Banpresto).sfc", 1310720, 0x244cf4df, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supgusoyo2j) +STD_ROM_FN(snes_Supgusoyo2j) + +struct BurnDriver BurnDrvsnes_Supgusoyo2j = { + "snes_supgusoyo2j", NULL, NULL, NULL, "1996", + "Super Gussun Oyoyo 2 (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Supgusoyo2jRomInfo, snes_Supgusoyo2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Gussun Oyoyo (Japan) + +static struct BurnRomInfo snes_SupgusoyojRomDesc[] = { + { "Super Gussun Oyoyo (J)(1995)(Banpresto).sfc", 1572864, 0xbc405def, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supgusoyoj) +STD_ROM_FN(snes_Supgusoyoj) + +struct BurnDriver BurnDrvsnes_Supgusoyoj = { + "snes_supgusoyoj", NULL, NULL, NULL, "1995", + "Super Gussun Oyoyo (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SupgusoyojRomInfo, snes_SupgusoyojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Hockey '94 (Japan) + +static struct BurnRomInfo snes_Suphockey94RomDesc[] = { + { "Super Hockey '94 (J)(1994)(Party Room 21).sfc", 1048576, 0xa3890d4f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suphockey94) +STD_ROM_FN(snes_Suphockey94) + +struct BurnDriver BurnDrvsnes_Suphockey94 = { + "snes_suphockey94", "snes_supicehockey", NULL, NULL, "1994", + "Super Hockey '94 (Japan)\0", NULL, "Party Room 21", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Suphockey94RomInfo, snes_Suphockey94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ice Hockey (Euro) + +static struct BurnRomInfo snes_SupicehockeyRomDesc[] = { + { "Super Ice Hockey (E)(1994)(Sunsoft).sfc", 1048576, 0xfb1d16c4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supicehockey) +STD_ROM_FN(snes_Supicehockey) + +struct BurnDriver BurnDrvsnes_Supicehockey = { + "snes_supicehockey", NULL, NULL, NULL, "1994", + "Super Ice Hockey (Euro)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupicehockeyRomInfo, snes_SupicehockeyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super International Cricket (Euro) + +static struct BurnRomInfo snes_SupintcricketRomDesc[] = { + { "Super International Cricket (E)(1994)(Nintendo - Beam Software).sfc", 1048576, 0x89cd72b0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supintcricket) +STD_ROM_FN(snes_Supintcricket) + +struct BurnDriver BurnDrvsnes_Supintcricket = { + "snes_supintcricket", NULL, NULL, NULL, "1994", + "Super International Cricket (Euro)\0", NULL, "Nintendo - Beam Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupintcricketRomInfo, snes_SupintcricketRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super James Pond (USA) + +static struct BurnRomInfo snes_SupjpondRomDesc[] = { + { "Super James Pond (U)(1993)(American Softworks).sfc", 524288, 0xd7c34122, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supjpond) +STD_ROM_FN(snes_Supjpond) + +struct BurnDriver BurnDrvsnes_Supjpond = { + "snes_supjpond", NULL, NULL, NULL, "1993", + "Super James Pond (USA)\0", NULL, "American Softworks", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupjpondRomInfo, snes_SupjpondRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super James Pond II (Japan) + +static struct BurnRomInfo snes_Supjpond2jRomDesc[] = { + { "Super James Pond II (J)(1993)(Victor Musical Industries).sfc", 1048576, 0x1b2c3a47, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supjpond2j) +STD_ROM_FN(snes_Supjpond2j) + +struct BurnDriver BurnDrvsnes_Supjpond2j = { + "snes_supjpond2j", "snes_supjpond", NULL, NULL, "1993", + "Super James Pond II (Japan)\0", NULL, "Victor Musical Industries", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Supjpond2jRomInfo, snes_Supjpond2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super James Pond II (Euro) + +static struct BurnRomInfo snes_Supjpond2eRomDesc[] = { + { "Super James Pond (E)(1993)(Ocean).sfc", 524288, 0x8edb44ad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supjpond2e) +STD_ROM_FN(snes_Supjpond2e) + +struct BurnDriver BurnDrvsnes_Supjpond2e = { + "snes_supjpond2e", "snes_supjpond", NULL, NULL, "1993", + "Super James Pond II (Euro)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Supjpond2eRomInfo, snes_Supjpond2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Linearball (Japan) + +static struct BurnRomInfo snes_SuplinearballRomDesc[] = { + { "Super Linearball (J)(1992)(Hiro).sfc", 524288, 0x689ac35c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suplinearball) +STD_ROM_FN(snes_Suplinearball) + +struct BurnDriver BurnDrvsnes_Suplinearball = { + "snes_suplinearball", "snes_spfootball", NULL, NULL, "1992", + "Super Linearball (Japan)\0", NULL, "Hiro", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SuplinearballRomInfo, snes_SuplinearballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Naxat Open - Golf de Shoubu da! (Japan) + +static struct BurnRomInfo snes_SupnaxatjRomDesc[] = { + { "Super Naxat Open - Golf de Shoubu da! (J)(1994)(Naxat Soft).sfc", 1048576, 0x86aa8a10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supnaxatj) +STD_ROM_FN(snes_Supnaxatj) + +struct BurnDriver BurnDrvsnes_Supnaxatj = { + "snes_supnaxatj", "snes_supnaxatte", NULL, NULL, "1994", + "Super Naxat Open - Golf de Shoubu da! (Japan)\0", NULL, "Naxat Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupnaxatjRomInfo, snes_SupnaxatjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Naxat Open - Spike McFang Golf (Hack, English v0.99) +// https://www.romhacking.net/translations/4096/ +static struct BurnRomInfo snes_SupnaxatteRomDesc[] = { + { "Super Naxat Open - Spike McFang Golf T-Eng v0.99 (2018)(MrRichard999).sfc", 1048576, 0x9a3059b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supnaxatte) +STD_ROM_FN(snes_Supnaxatte) + +struct BurnDriver BurnDrvsnes_Supnaxatte = { + "snes_supnaxatte", NULL, NULL, NULL, "2018", + "Super Naxat Open - Spike McFang Golf (Hack, English v0.99)\0", NULL, "MrRichard999", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_SupnaxatteRomInfo, snes_SupnaxatteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Nazo Puyo - Rulue no Roux (Japan) + +static struct BurnRomInfo snes_SupnazopuyojRomDesc[] = { + { "Super Nazo Puyo - Rulue no Roux (J)(1995)(Banpresto).sfc", 1048576, 0xba1dba22, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supnazopuyoj) +STD_ROM_FN(snes_Supnazopuyoj) + +struct BurnDriver BurnDrvsnes_Supnazopuyoj = { + "snes_supnazopuyoj", "snes_supnazopuyote", NULL, NULL, "1995", + "Super Nazo Puyo - Rulue no Roux (Japan)\0", NULL, "Banpresto - Compile", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE | GBF_ADV, 0, + SNESGetZipName, snes_SupnazopuyojRomInfo, snes_SupnazopuyojRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Nazo Puyo - Rulue's Roux (Hack, English v1.1) +// https://www.romhacking.net/translations/5563/ +static struct BurnRomInfo snes_SupnazopuyoteRomDesc[] = { + { "Super Nazo Puyo - Rulue's Roux T-Eng v1.1 (2020)(Momochi).sfc", 1048576, 0xf6c8a237, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supnazopuyote) +STD_ROM_FN(snes_Supnazopuyote) + +struct BurnDriver BurnDrvsnes_Supnazopuyote = { + "snes_supnazopuyote", NULL, NULL, NULL, "2020", + "Super Nazo Puyo - Rulue's Roux (Hack, English v1.1)\0", NULL, "Momochi", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PUZZLE | GBF_ADV, 0, + SNESGetZipName, snes_SupnazopuyoteRomInfo, snes_SupnazopuyoteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ninja Boy (USA) + +static struct BurnRomInfo snes_SupninjaboyRomDesc[] = { + { "Super Ninja Boy (U)(1992)(Culture Brain).sfc", 1048576, 0x6bcbba10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supninjaboy) +STD_ROM_FN(snes_Supninjaboy) + +struct BurnDriver BurnDrvsnes_Supninjaboy = { + "snes_supninjaboy", NULL, NULL, NULL, "1992", + "Super Ninja Boy (USA)\0", NULL, "Culture Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupninjaboyRomInfo, snes_SupninjaboyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ninja-kun (Japan) + +static struct BurnRomInfo snes_SupninjakunRomDesc[] = { + { "Super Ninja-kun (J)(1994)(Jaleco).sfc", 1048576, 0x0a94fcca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supninjakun) +STD_ROM_FN(snes_Supninjakun) + +struct BurnDriver BurnDrvsnes_Supninjakun = { + "snes_supninjakun", "snes_supninjakid", NULL, NULL, "1994", + "Super Ninja-kun (Japan)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupninjakunRomInfo, snes_SupninjakunRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Taisen EX (Japan) + +static struct BurnRomInfo snes_SuprobtaisexRomDesc[] = { + { "Super Robot Taisen EX (J)(1994)(Banpresto).sfc", 1572864, 0x239621a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobtaisex) +STD_ROM_FN(snes_Suprobtaisex) + +struct BurnDriver BurnDrvsnes_Suprobtaisex = { + "snes_suprobtaisex", "snes_suprobwarsexte", NULL, NULL, "1994", + "Super Robot Taisen EX (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SuprobtaisexRomInfo, snes_SuprobtaisexRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars 3 (Hack, English v2.00m2) +// https://www.romhacking.net/translations/466/ +static struct BurnRomInfo snes_Suprobwars3RomDesc[] = { + { "Super Robot Wars 3 T-Eng v2.00m2 (2019)(Aeon Genesis).sfc", 2097152, 0xa43f85b0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobwars3) +STD_ROM_FN(snes_Suprobwars3) + +struct BurnDriver BurnDrvsnes_Suprobwars3 = { + "snes_suprobwars3", NULL, NULL, NULL, "2019", + "Super Robot Wars 3 (Hack, English v2.00m2)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Suprobwars3RomInfo, snes_Suprobwars3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars 3 (Hack, Italian) +// https://romhacking.it/project/view/id/675 +static struct BurnRomInfo snes_Suprobwars3tiRomDesc[] = { + { "Super Robot Wars 3 T-Ita (2019)(Wolfgare).sfc", 2097152, 0x17a3d0d5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobwars3ti) +STD_ROM_FN(snes_Suprobwars3ti) + +struct BurnDriver BurnDrvsnes_Suprobwars3ti = { + "snes_suprobwars3ti", "snes_suprobwars3", NULL, NULL, "2019", + "Super Robot Wars 3 (Hack, Italian)\0", NULL, "Wolfgare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_Suprobwars3tiRomInfo, snes_Suprobwars3tiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars EX (Hack, English) +// https://www.romhacking.net/translations/4100/ +static struct BurnRomInfo snes_SuprobwarsexteRomDesc[] = { + { "Super Robot Wars EX T-Eng (2018)(Aeon Genesis).sfc", 2097152, 0x3c11e7fa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobwarsexte) +STD_ROM_FN(snes_Suprobwarsexte) + +struct BurnDriver BurnDrvsnes_Suprobwarsexte = { + "snes_suprobwarsexte", NULL, NULL, NULL, "2018", + "Super Robot Wars EX (Hack, English)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SuprobwarsexteRomInfo, snes_SuprobwarsexteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars EX (Hack, Italian) +// https://romhacking.it/project/view/id/719 +static struct BurnRomInfo snes_SuprobwarsextiRomDesc[] = { + { "Super Robot Wars EX T-Ita (2022)(Wolfgare).sfc", 2097152, 0x7cc2d5f0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobwarsexti) +STD_ROM_FN(snes_Suprobwarsexti) + +struct BurnDriver BurnDrvsnes_Suprobwarsexti = { + "snes_suprobwarsexti", "snes_suprobwarsexte", NULL, NULL, "2022", + "Super Robot Wars EX (Hack, Italian)\0", NULL, "Wolfgare", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SuprobwarsextiRomInfo, snes_SuprobwarsextiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Robot Wars EX (Hack, Spanish) +// https://www.romhacking.net/translations/7043/ +static struct BurnRomInfo snes_SuprobwarsextsRomDesc[] = { + { "Super Robot Wars EX T-Spa (2023)(Max1323).sfc", 2097152, 0x543be354, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suprobwarsexts) +STD_ROM_FN(snes_Suprobwarsexts) + +struct BurnDriver BurnDrvsnes_Suprobwarsexts = { + "snes_suprobwarsexts", "snes_suprobwarsexte", NULL, NULL, "2023", + "Super Robot Wars EX (Hack, Spanish)\0", NULL, "Max1323", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_SuprobwarsextsRomInfo, snes_SuprobwarsextsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Shadow of the Beast (USA, Prototype) + +static struct BurnRomInfo snes_SupshadbeastpRomDesc[] = { + { "Super Shadow of the Beast (U, Proto)(1992)(IGS - Psygnosis).sfc", 1048576, 0xbeadfd61, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supshadbeastp) +STD_ROM_FN(snes_Supshadbeastp) + +struct BurnDriver BurnDrvsnes_Supshadbeastp = { + "snes_supshadbeastp", NULL, NULL, NULL, "1992", + "Super Shadow of the Beast (USA, Prototype)\0", NULL, "IGS - Psygnosis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SupshadbeastpRomInfo, snes_SupshadbeastpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Smash T.V. (USA) + +static struct BurnRomInfo snes_SupsmashtvRomDesc[] = { + { "Super Smash T.V. (U)(1991)(Acclaim Entertainment).sfc", 524288, 0x2d0b20d0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supsmashtv) +STD_ROM_FN(snes_Supsmashtv) + +struct BurnDriver BurnDrvsnes_Supsmashtv = { + "snes_supsmashtv", NULL, NULL, NULL, "1991", + "Super Smash T.V. (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_SupsmashtvRomInfo, snes_SupsmashtvRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Soccer Champ (USA) + +static struct BurnRomInfo snes_SupsochampRomDesc[] = { + { "Super Soccer Champ (U)(1992)(Taito).sfc", 524288, 0xb31d35a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supsochamp) +STD_ROM_FN(snes_Supsochamp) + +struct BurnDriver BurnDrvsnes_Supsochamp = { + "snes_supsochamp", NULL, NULL, NULL, "1992", + "Super Soccer Champ (USA)\0", NULL, "Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_SupsochampRomInfo, snes_SupsochampRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Tekkyuu Fight! (Japan) + +static struct BurnRomInfo snes_SuptekfightRomDesc[] = { + { "Super Tekkyuu Fight! (J)(1995)(Banpresto).sfc", 1310720, 0x5be4a7e3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suptekfight) +STD_ROM_FN(snes_Suptekfight) + +struct BurnDriver BurnDrvsnes_Suptekfight = { + "snes_suptekfight", NULL, NULL, NULL, "1995", + "Super Tekkyuu Fight! (Japan)\0", NULL, "Banpresto", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_SuptekfightRomInfo, snes_SuptekfightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Fire Pro Wrestling X Premium (Japan) + +static struct BurnRomInfo snes_SupwrestxpjRomDesc[] = { + { "Super Fire Pro Wrestling X Premium (J)(1996)(Human Ent.).sfc", 4194304, 0x82de1380, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supwrestxpj) +STD_ROM_FN(snes_Supwrestxpj) + +struct BurnDriver BurnDrvsnes_Supwrestxpj = { + "snes_supwrestxpj", "snes_supwrestxpte", NULL, NULL, "1996", + "Super Fire Pro Wrestling X Premium (Japan)\0", NULL, "Human Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SupwrestxpjRomInfo, snes_SupwrestxpjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Fire Pro Wrestling X Premium (Hack, English) +// https://www.romhacking.net/translations/3238/ +static struct BurnRomInfo snes_SupwrestxpteRomDesc[] = { + { "Super Fire Pro Wrestling X Premium T-Eng (2005)(Brian).sfc", 4194304, 0x2fc8605a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supwrestxpte) +STD_ROM_FN(snes_Supwrestxpte) + +struct BurnDriver BurnDrvsnes_Supwrestxpte = { + "snes_supwrestxpte", NULL, NULL, NULL, "2005", + "Super Fire Pro Wrestling X Premium (Hack, English)\0", NULL, "Brian", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_SupwrestxpteRomInfo, snes_SupwrestxpteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sutte Hakkun (Japan) + +static struct BurnRomInfo snes_SuttehakkunjRomDesc[] = { + { "Sutte Hakkun (J)(1998)(Nintendo).sfc", 3145728, 0xdc173550, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suttehakkunj) +STD_ROM_FN(snes_Suttehakkunj) + +struct BurnDriver BurnDrvsnes_Suttehakkunj = { + "snes_suttehakkunj", "snes_suttehakkunte", NULL, NULL, "1998", + "Sutte Hakkun (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SuttehakkunjRomInfo, snes_SuttehakkunjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sutte Hakkun (Hack, English) +// https://www.romhacking.net/translations/3280/ +static struct BurnRomInfo snes_SuttehakkunteRomDesc[] = { + { "Sutte Hakkun T-Eng (2017)(Raccoon Sam).sfc", 3145728, 0x9c4e07a4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Suttehakkunte) +STD_ROM_FN(snes_Suttehakkunte) + +struct BurnDriver BurnDrvsnes_Suttehakkunte = { + "snes_suttehakkunte", NULL, NULL, NULL, "2017", + "Sutte Hakkun (Hack, English)\0", NULL, "Raccoon Sam", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SuttehakkunteRomInfo, snes_SuttehakkunteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Suzuka 8 Hours (USA) + +static struct BurnRomInfo snes_Suzuka8hrsRomDesc[] = { + { "Suzuka 8 Hours (U)(1993)(Namco).sfc", 1048576, 0x54740b9b, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Suzuka8hrs, snes_Suzuka8hrs, snes_dsp1) +STD_ROM_FN(snes_Suzuka8hrs) + +struct BurnDriver BurnDrvsnes_Suzuka8hrs = { + "snes_suzuka8hrs", NULL, "snes_dsp1", NULL, "1993", + "Suzuka 8 Hours (USA)\0", "DSP-1 enhancement chip", "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Suzuka8hrsRomInfo, snes_Suzuka8hrsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Suzuka 8 Hours (Japan) + +static struct BurnRomInfo snes_Suzuka8hrsjRomDesc[] = { + { "Suzuka 8 Hours (J)(1993)(Namcot).sfc", 1048576, 0xb846b00d, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Suzuka8hrsj, snes_Suzuka8hrsj, snes_dsp1) +STD_ROM_FN(snes_Suzuka8hrsj) + +struct BurnDriver BurnDrvsnes_Suzuka8hrsj = { + "snes_suzuka8hrsj", "snes_suzuka8hrs", "snes_dsp1", NULL, "1993", + "Suzuka 8 Hours (Japan)\0", "DSP-1 enhancement chip", "Namcot", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Suzuka8hrsjRomInfo, snes_Suzuka8hrsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// SWAT Kats - The Radical Squadron (USA) + +static struct BurnRomInfo snes_SwatkatsRomDesc[] = { + { "SWAT Kats - The Radical Squadron (U)(1995)(Hudson Soft).sfc", 2097152, 0xea2a23fb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Swatkats) +STD_ROM_FN(snes_Swatkats) + +struct BurnDriver BurnDrvsnes_Swatkats = { + "snes_swatkats", NULL, NULL, NULL, "1995", + "SWAT Kats - The Radical Squadron (USA)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SwatkatsRomInfo, snes_SwatkatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sword Maniac (Japan) + +static struct BurnRomInfo snes_SwordmaniacRomDesc[] = { + { "Sword Maniac (J)(1993)(Toshiba EMI).sfc", 1048576, 0xa7295784, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Swordmaniac) +STD_ROM_FN(snes_Swordmaniac) + +struct BurnDriver BurnDrvsnes_Swordmaniac = { + "snes_swordmaniac", "snes_xkaliber2097", NULL, NULL, "1993", + "Sword Maniac (Japan)\0", NULL, "Toshiba EMI", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_VSFIGHT, 0, + SNESGetZipName, snes_SwordmaniacRomInfo, snes_SwordmaniacRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Syvalion (Euro) + +static struct BurnRomInfo snes_SyvalioneuRomDesc[] = { + { "Syvalion European (E)(1992)(JVC - Taito).sfc", 1048576, 0xf1884ecb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Syvalioneu) +STD_ROM_FN(snes_Syvalioneu) + +struct BurnDriver BurnDrvsnes_Syvalioneu = { + "snes_syvalioneu", NULL, NULL, NULL, "1992", + "Syvalion (Euro)\0", NULL, "JVC - Taito", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_SyvalioneuRomInfo, snes_SyvalioneuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Syvalion (Japan) + +static struct BurnRomInfo snes_SyvalionjpRomDesc[] = { + { "Syvalion Japan (J)(1992)(Toshiba EMI - Taito).sfc", 1048576, 0x75ff74f2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Syvalionjp) +STD_ROM_FN(snes_Syvalionjp) + +struct BurnDriver BurnDrvsnes_Syvalionjp = { + "snes_syvalionjp", "snes_syvalioneu", NULL, NULL, "1992", + "Syvalion (Japan)\0", NULL, "Toshiba EMI - Taito Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_SyvalionjpRomInfo, snes_SyvalionjpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// T2 - The Arcade Game (USA) + +static struct BurnRomInfo snes_T2arcadeRomDesc[] = { + { "T2 - The Arcade Game (U)(1993)(Ljn).sfc", 1048576, 0x5dc6b9fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_T2arcade) +STD_ROM_FN(snes_T2arcade) + +struct BurnDriver BurnDrvsnes_T2arcade = { + "snes_t2arcade", NULL, NULL, NULL, "1993", + "T2 - The Arcade Game (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_T2arcadeRomInfo, snes_T2arcadeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Taiketsu!! Brass Numbers (Japan) + +static struct BurnRomInfo snes_TaiketsuRomDesc[] = { + { "Taiketsu!! Brass Numbers (J)(1992)(Telenet Japan).sfc", 1048576, 0x27815b78, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Taiketsu) +STD_ROM_FN(snes_Taiketsu) + +struct BurnDriver BurnDrvsnes_Taiketsu = { + "snes_taiketsu", "snes_doomsdayw", NULL, NULL, "1992", + "Taiketsu!! Brass Numbers (Japan)\0", NULL, "Telenet Japan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TaiketsuRomInfo, snes_TaiketsuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Takahashi Meijin no Daibouken-jima (Japan) + +static struct BurnRomInfo snes_TakahashiRomDesc[] = { + { "Takahashi Meijin no Daibouken-jima (J)(1992)(Hudson Soft).sfc", 1048576, 0x37c0ae76, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Takahashi) +STD_ROM_FN(snes_Takahashi) + +struct BurnDriver BurnDrvsnes_Takahashi = { + "snes_takahashi", "snes_superadvisland", NULL, NULL, "1992", + "Takahashi Meijin no Daibouken-jima (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TakahashiRomInfo, snes_TakahashiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Takahashi Meijin no Daibouken-jima II (Japan) + +static struct BurnRomInfo snes_Takahashi2RomDesc[] = { + { "Takahashi Meijin no Daibouken-jima II (J)(1995)(Hudson Soft).sfc", 1572864, 0x1c71451c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Takahashi2) +STD_ROM_FN(snes_Takahashi2) + +struct BurnDriver BurnDrvsnes_Takahashi2 = { + "snes_takahashi2", "snes_superadvisland2", NULL, NULL, "1995", + "Takahashi Meijin no Daibouken-jima II (Japan)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Takahashi2RomInfo, snes_Takahashi2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tales of Phantasia (Japan) + +static struct BurnRomInfo snes_TalesofphantjRomDesc[] = { + { "Tales of Phantasia (J)(1994)(Namco).sfc", 6291456, 0xe9946b84, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Talesofphantj) +STD_ROM_FN(snes_Talesofphantj) + +struct BurnDriver BurnDrvsnes_Talesofphantj = { + "snes_talesofphantj", "snes_talesofphantte", NULL, NULL, "1994", + "Tales of Phantasia (Japan)\0", NULL, "Namco - Wolf Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_TalesofphantjRomInfo, snes_TalesofphantjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tales of Phantasia (Hack, English v1.2) +// https://www.romhacking.net/translations/470/ +static struct BurnRomInfo snes_TalesofphantteRomDesc[] = { + { "Tales of Phantasia T-Eng v1.2 (2001)(DeJap Translations).sfc", 6291456, 0x14612848, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Talesofphantte) +STD_ROM_FN(snes_Talesofphantte) + +struct BurnDriver BurnDrvsnes_Talesofphantte = { + "snes_talesofphantte", NULL, NULL, NULL, "2001", + "Tales of Phantasia (Hack, English v1.2)\0", NULL, "DeJap Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_RPG, 0, + SNESGetZipName, snes_TalesofphantteRomInfo, snes_TalesofphantteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tatakae Genshijin 2 - Rookie no Bouken (Japan) + +static struct BurnRomInfo snes_Tatakae2RomDesc[] = { + { "Tatakae Genshijin 2 - Rookie no Bouken (J)(1992)(Data East).sfc", 524288, 0x689cbf05, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tatakae2) +STD_ROM_FN(snes_Tatakae2) + +struct BurnDriver BurnDrvsnes_Tatakae2 = { + "snes_tatakae2", "snes_congocaper", NULL, NULL, "1992", + "Tatakae Genshijin 2 - Rookie no Bouken (Japan)\0", NULL, "Data East", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Tatakae2RomInfo, snes_Tatakae2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Taz-Mania (USA) + +static struct BurnRomInfo snes_TazmaniaRomDesc[] = { + { "Taz-Mania (U)(1993)(Sunsoft).sfc", 1048576, 0xb17230ae, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tazmania) +STD_ROM_FN(snes_Tazmania) + +struct BurnDriver BurnDrvsnes_Tazmania = { + "snes_tazmania", NULL, NULL, NULL, "1993", + "Taz-Mania (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_TazmaniaRomInfo, snes_TazmaniaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tecmo Super Baseball (USA) + +static struct BurnRomInfo snes_TecmosbbRomDesc[] = { + { "Tecmo Super Baseball (U)(1994)(Tecmo).sfc", 1572864, 0xe302d853, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tecmosbb) +STD_ROM_FN(snes_Tecmosbb) + +struct BurnDriver BurnDrvsnes_Tecmosbb = { + "snes_tecmosbb", NULL, NULL, NULL, "1994", + "Tecmo Super Baseball (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_TecmosbbRomInfo, snes_TecmosbbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tecmo Super Bowl (USA) + +static struct BurnRomInfo snes_TecmosbowlRomDesc[] = { + { "Tecmo Super Bowl (U)(1993)(Tecmo).sfc", 1572864, 0xcde3746b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tecmosbowl) +STD_ROM_FN(snes_Tecmosbowl) + +struct BurnDriver BurnDrvsnes_Tecmosbowl = { + "snes_tecmosbowl", NULL, NULL, NULL, "1993", + "Tecmo Super Bowl (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_TecmosbowlRomInfo, snes_TecmosbowlRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tecmo Super Bowl II - Special Edition (USA) + +static struct BurnRomInfo snes_Tecmosbowl2RomDesc[] = { + { "Tecmo Super Bowl II - Special Edition (U)(1994)(Tecmo).sfc", 2097152, 0xd67d507b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tecmosbowl2) +STD_ROM_FN(snes_Tecmosbowl2) + +struct BurnDriver BurnDrvsnes_Tecmosbowl2 = { + "snes_tecmosbowl2", NULL, NULL, NULL, "1994", + "Tecmo Super Bowl II - Special Edition (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Tecmosbowl2RomInfo, snes_Tecmosbowl2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tecmo Super Bowl III - Final Edition (USA) + +static struct BurnRomInfo snes_Tecmosbowl3RomDesc[] = { + { "Tecmo Super Bowl III - Final Edition (U)(1995)(Tecmo).sfc", 2097152, 0x8ef1411f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tecmosbowl3) +STD_ROM_FN(snes_Tecmosbowl3) + +struct BurnDriver BurnDrvsnes_Tecmosbowl3 = { + "snes_tecmosbowl3", NULL, NULL, NULL, "1995", + "Tecmo Super Bowl III - Final Edition (USA)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Tecmosbowl3RomInfo, snes_Tecmosbowl3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tenchi Souzou (Japan) + +static struct BurnRomInfo snes_TenchisouzouRomDesc[] = { + { "Tenchi Souzou (J)(1996)(Enix).sfc", 4194304, 0x3cc7fdf4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tenchisouzou) +STD_ROM_FN(snes_Tenchisouzou) + +struct BurnDriver BurnDrvsnes_Tenchisouzou = { + "snes_tenchisouzou", "snes_terranigmae", NULL, NULL, "1996", + "Tenchi Souzou (Japan)\0", NULL, "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TenchisouzouRomInfo, snes_TenchisouzouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tenshi no Uta - Shiroki Tsubasa no Inori (Japan) + +static struct BurnRomInfo snes_TenshinoutajRomDesc[] = { + { "Tenshi no Uta - Shiroki Tsubasa no Inori (J)(1994)(Nippon Telenet).sfc", 1572864, 0x6e030b96, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tenshinoutaj) +STD_ROM_FN(snes_Tenshinoutaj) + +struct BurnDriver BurnDrvsnes_Tenshinoutaj = { + "snes_tenshinoutaj", "snes_tenshinoutate", NULL, NULL, "1994", + "Tenshi no Uta - Shiroki Tsubasa no Inori (Japan)\0", NULL, "Nippon Telenet", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TenshinoutajRomInfo, snes_TenshinoutajRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Song of the Angel - Prayer of the White Wing (Hack, English) +// https://www.romhacking.net/translations/822/ +static struct BurnRomInfo snes_TenshinoutateRomDesc[] = { + { "Song of the Angel - Prayer of the White Wing T-Eng (2018)(Nightcrawler's TransCorp).sfc", 4194304, 0x7353e8f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tenshinoutate) +STD_ROM_FN(snes_Tenshinoutate) + +struct BurnDriver BurnDrvsnes_Tenshinoutate = { + "snes_tenshinoutate", NULL, NULL, NULL, "2018", + "Song of the Angel - Prayer of the White Wing (Hack, English)\0", NULL, "Nightcrawler's TransCorp", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TenshinoutateRomInfo, snes_TenshinoutateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cancion del Angel, La (Hack, Spanish v1.3) +// https://traduccionessemco.blogspot.com/2019/10/traduccion-de-tenshi-no-uta-de-snes-en.html +static struct BurnRomInfo snes_TenshinoutatsRomDesc[] = { + { "Cancion del Angel, La T-Spa v1.3 (2023)(semco).sfc", 4194304, 0x95e367a1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tenshinoutats) +STD_ROM_FN(snes_Tenshinoutats) + +struct BurnDriver BurnDrvsnes_Tenshinoutats = { + "snes_tenshinoutats", "snes_tenshinoutate", NULL, NULL, "2023", + "Cancion del Angel, La (Hack, Spanish v1.3)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TenshinoutatsRomInfo, snes_TenshinoutatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terminator, The (USA) + +static struct BurnRomInfo snes_TerminatorRomDesc[] = { + { "Terminator, The (U)(1993)(Mindscape).sfc", 1048576, 0xd71e6c3b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terminator) +STD_ROM_FN(snes_Terminator) + +struct BurnDriver BurnDrvsnes_Terminator = { + "snes_terminator", NULL, NULL, NULL, "1993", + "Terminator, The (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_TerminatorRomInfo, snes_TerminatorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terminator 2: Judgment Day (USA) + +static struct BurnRomInfo snes_Terminator2RomDesc[] = { + { "Terminator 2 - Judgment Day (U)(1993)(Ljn).sfc", 1048576, 0xf729b19e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terminator2) +STD_ROM_FN(snes_Terminator2) + +struct BurnDriver BurnDrvsnes_Terminator2 = { + "snes_terminator2", NULL, NULL, NULL, "1993", + "Terminator 2: Judgment Day (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Terminator2RomInfo, snes_Terminator2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terranigma (Euro, English) + +static struct BurnRomInfo snes_TerranigmaeRomDesc[] = { + { "Terranigma (E, Eng)(1996)(Nintendo - Enix).sfc", 4194304, 0x974523ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terranigmae) +STD_ROM_FN(snes_Terranigmae) + +struct BurnDriver BurnDrvsnes_Terranigmae = { + "snes_terranigmae", NULL, NULL, NULL, "1996", + "Terranigma (Euro, English)\0", NULL, "Nintendo - Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TerranigmaeRomInfo, snes_TerranigmaeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terranigma (Euro, French) + +static struct BurnRomInfo snes_TerranigmafRomDesc[] = { + { "Terranigma (E, France)(1996)(Nintendo - Enix).sfc", 4194304, 0x614a7090, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terranigmaf) +STD_ROM_FN(snes_Terranigmaf) + +struct BurnDriver BurnDrvsnes_Terranigmaf = { + "snes_terranigmaf", "snes_terranigmae", NULL, NULL, "1996", + "Terranigma (Euro, French)\0", NULL, "Nintendo - Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TerranigmafRomInfo, snes_TerranigmafRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terranigma (Euro, German) + +static struct BurnRomInfo snes_TerranigmagRomDesc[] = { + { "Terranigma (E, Germany)(1996)(Nintendo - Enix).sfc", 4194304, 0x6fb8a4df, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terranigmag) +STD_ROM_FN(snes_Terranigmag) + +struct BurnDriver BurnDrvsnes_Terranigmag = { + "snes_terranigmag", "snes_terranigmae", NULL, NULL, "1996", + "Terranigma (Euro, German)\0", NULL, "Nintendo - Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TerranigmagRomInfo, snes_TerranigmagRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terranigma (Euro, Spanish) + +static struct BurnRomInfo snes_TerranigmasRomDesc[] = { + { "Terranigma (E, Spa)(1996)(Nintendo - Enix).sfc", 4194304, 0x00e61534, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terranigmas) +STD_ROM_FN(snes_Terranigmas) + +struct BurnDriver BurnDrvsnes_Terranigmas = { + "snes_terranigmas", "snes_terranigmae", NULL, NULL, "1996", + "Terranigma (Euro, Spanish)\0", NULL, "Nintendo - Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TerranigmasRomInfo, snes_TerranigmasRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Terranigma (Hack, Italian) +// https://romhacking.it/project/view/id/159 +static struct BurnRomInfo snes_TerranigmatiRomDesc[] = { + { "Terranigma T-Ita (2004)(Psyco).sfc", 4194816, 0xcaf98888, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Terranigmati) +STD_ROM_FN(snes_Terranigmati) + +struct BurnDriver BurnDrvsnes_Terranigmati = { + "snes_terranigmati", "snes_terranigmae", NULL, NULL, "2004", + "Terranigma (Hack, Italian)\0", NULL, "Psyco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_TerranigmatiRomInfo, snes_TerranigmatiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris 2 (USA) + +static struct BurnRomInfo snes_Tetris2RomDesc[] = { + { "Tetris 2 (U)(1994)(Nintendo).sfc", 1048576, 0xce3392b1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetris2) +STD_ROM_FN(snes_Tetris2) + +struct BurnDriver BurnDrvsnes_Tetris2 = { + "snes_tetris2", NULL, NULL, NULL, "1994", + "Tetris 2 (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Tetris2RomInfo, snes_Tetris2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris Attack (USA) + +static struct BurnRomInfo snes_TetrisattackRomDesc[] = { + { "Tetris Attack (U)(1996)(Nintendo).sfc", 1048576, 0x6c128210, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisattack) +STD_ROM_FN(snes_Tetrisattack) + +struct BurnDriver BurnDrvsnes_Tetrisattack = { + "snes_tetrisattack", NULL, NULL, NULL, "1996", + "Tetris Attack (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisattackRomInfo, snes_TetrisattackRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris Battle Gaiden (Japan) + +static struct BurnRomInfo snes_TetrisbgjRomDesc[] = { + { "Tetris Battle Gaiden (J)(1993)(Bullet Proof Software).sfc", 1048576, 0xb8f5f846, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisbgj) +STD_ROM_FN(snes_Tetrisbgj) + +struct BurnDriver BurnDrvsnes_Tetrisbgj = { + "snes_tetrisbgj", "snes_tetrisbgte", NULL, NULL, "1993", + "Tetris Battle Gaiden (Japan)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisbgjRomInfo, snes_TetrisbgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris Battle Spin Off (Hack, German) +// https://www.romhacking.net/translations/6896/ +static struct BurnRomInfo snes_TetrisbgtdeRomDesc[] = { + { "Tetris Battle Spin Off T-Ger (2023)(POE).sfc", 2097152, 0xebf8acdb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisbgtde) +STD_ROM_FN(snes_Tetrisbgtde) + +struct BurnDriver BurnDrvsnes_Tetrisbgtde = { + "snes_tetrisbgtde", "snes_tetrisbgte", NULL, NULL, "2023", + "Tetris Battle Spin Off (Hack, German)\0", NULL, "POE", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisbgtdeRomInfo, snes_TetrisbgtdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris Battle Spin Off (Hack, English) +// https://www.romhacking.net/translations/5737/ +static struct BurnRomInfo snes_TetrisbgteRomDesc[] = { + { "Tetris Battle Spin Off T-Eng (2020)(DDSTranslation).sfc", 2097152, 0xdce18ba6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisbgte) +STD_ROM_FN(snes_Tetrisbgte) + +struct BurnDriver BurnDrvsnes_Tetrisbgte = { + "snes_tetrisbgte", NULL, NULL, NULL, "2020", + "Tetris Battle Spin Off (Hack, English)\0", NULL, "DDSTranslation", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisbgteRomInfo, snes_TetrisbgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris Battle Spin Off (Hack, Spanish v1.1) +// https://www.romhacking.net/translations/5752/ +static struct BurnRomInfo snes_TetrisbgtsRomDesc[] = { + { "Tetris Battle Spin Off T-Spa v1.1 (2020)(semco).sfc", 2097152, 0x06fd4f33, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisbgts) +STD_ROM_FN(snes_Tetrisbgts) + +struct BurnDriver BurnDrvsnes_Tetrisbgts = { + "snes_tetrisbgts", "snes_tetrisbgte", NULL, NULL, "2020", + "Tetris Battle Spin Off (Hack, Spanish v1.1)\0", NULL, "semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisbgtsRomInfo, snes_TetrisbgtsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetris & Dr. Mario (USA) + +static struct BurnRomInfo snes_TetrisdrmarioRomDesc[] = { + { "Tetris & Dr. Mario (U)(1994)(Nintendo).sfc", 1048576, 0x6c852ef3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisdrmario) +STD_ROM_FN(snes_Tetrisdrmario) + +struct BurnDriver BurnDrvsnes_Tetrisdrmario = { + "snes_tetrisdrmario", NULL, NULL, NULL, "1994", + "Tetris & Dr. Mario (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisdrmarioRomInfo, snes_TetrisdrmarioRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Tetris Flash (Japan) + +static struct BurnRomInfo snes_TetrisflashRomDesc[] = { + { "Tetris Flash (J)(1994)(Nintendo).sfc", 1048576, 0x09e9e3bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetrisflash) +STD_ROM_FN(snes_Tetrisflash) + +struct BurnDriver BurnDrvsnes_Tetrisflash = { + "snes_tetrisflash", "snes_tetris2", NULL, NULL, "1994", + "Tetris Flash (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TetrisflashRomInfo, snes_TetrisflashRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tetsuwan Atom (Japan) + +static struct BurnRomInfo snes_TetsuwatomRomDesc[] = { + { "Tetsuwan Atom (J)(1994)(Zamuse).sfc", 1310720, 0x2b79faf0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tetsuwatom) +STD_ROM_FN(snes_Tetsuwatom) + +struct BurnDriver BurnDrvsnes_Tetsuwatom = { + "snes_tetsuwatom", NULL, NULL, NULL, "1994", + "Tetsuwan Atom (Japan)\0", NULL, "Zamuse", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TetsuwatomRomInfo, snes_TetsuwatomRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Thunder Spirits (USA) + +static struct BurnRomInfo snes_ThunderspiritsRomDesc[] = { + { "Thunder Spirits (U)(1991)(SEIKA - Technosoft).sfc", 1048576, 0x522fe837, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Thunderspirits) +STD_ROM_FN(snes_Thunderspirits) + +struct BurnDriver BurnDrvsnes_Thunderspirits = { + "snes_thunderspirits", NULL, NULL, NULL, "1991", + "Thunder Spirits (USA)\0", NULL, "SEIKA - Technosoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ThunderspiritsRomInfo, snes_ThunderspiritsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Thunder Spirits (Japan) + +static struct BurnRomInfo snes_ThunderspiritsjRomDesc[] = { + { "Thunder Spirits (J)(1991)(Toshiba EMI).sfc", 1048576, 0x41a933a6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Thunderspiritsj) +STD_ROM_FN(snes_Thunderspiritsj) + +struct BurnDriver BurnDrvsnes_Thunderspiritsj = { + "snes_thunderspiritsj", "snes_thunderspirits", NULL, NULL, "1991", + "Thunder Spirits (Japan)\0", NULL, "Toshiba EMI", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ThunderspiritsjRomInfo, snes_ThunderspiritsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tick, The (USA) + +static struct BurnRomInfo snes_TickRomDesc[] = { + { "Tick, The (U)(1994)(Fox Interactive - Software Creations).sfc", 2097152, 0x12ab22a7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tick) +STD_ROM_FN(snes_Tick) + +struct BurnDriver BurnDrvsnes_Tick = { + "snes_tick", NULL, NULL, NULL, "1994", + "Tick, The (USA)\0", NULL, "Fox Interactive - Software Creations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_TickRomInfo, snes_TickRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// TimeCop (USA) + +static struct BurnRomInfo snes_TimecopRomDesc[] = { + { "TimeCop (USA)(1995)(JVC Musical Industries).sfc", 2097152, 0x130b0933, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Timecop) +STD_ROM_FN(snes_Timecop) + +struct BurnDriver BurnDrvsnes_Timecop = { + "snes_timecop", NULL, NULL, NULL, "1995", + "TimeCop (USA)\0", NULL, "JVC Musical Industries", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_TimecopRomInfo, snes_TimecopRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Time Trax (USA) + +static struct BurnRomInfo snes_TimetraxRomDesc[] = { + { "Time Trax (U)(1994)(THQ - Malibu).sfc", 1048576, 0xf6628157, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Timetrax) +STD_ROM_FN(snes_Timetrax) + +struct BurnDriver BurnDrvsnes_Timetrax = { + "snes_timetrax", NULL, NULL, NULL, "1994", + "Time Trax (USA)\0", NULL, "THQ Inc. - Malibu Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TimetraxRomInfo, snes_TimetraxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tinhead (Euro, Prototype) + +static struct BurnRomInfo snes_TinheadprotoRomDesc[] = { + { "Tinhead (E, Proto)(1994)(MicroProse).sfc", 1048576, 0x1e079ac0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinheadproto) +STD_ROM_FN(snes_Tinheadproto) + +struct BurnDriver BurnDrvsnes_Tinheadproto = { + "snes_tinheadproto", NULL, NULL, NULL, "1994", + "Tinhead (Euro, Prototype)\0", NULL, "MicroProse", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TinheadprotoRomInfo, snes_TinheadprotoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tin Star (USA) + +static struct BurnRomInfo snes_TinstarRomDesc[] = { + { "Tin Star (U)(1994)(Nintendo).sfc", 2097152, 0xec26f75b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinstar) +STD_ROM_FN(snes_Tinstar) + +struct BurnDriver BurnDrvsnes_Tinstar = { + "snes_tinstar", NULL, NULL, NULL, "1994", + "Tin Star (USA)\0", "'Super Scope' compatible game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_TinstarRomInfo, snes_TinstarRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tintin - Prisoners of the Sun (Euro) + +static struct BurnRomInfo snes_Tintin2eRomDesc[] = { + { "Tintin - Prisoners of the Sun (E)(1996)(Infogrames).sfc", 2097152, 0xa94a47be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tintin2e) +STD_ROM_FN(snes_Tintin2e) + +struct BurnDriver BurnDrvsnes_Tintin2e = { + "snes_tintin2e", NULL, NULL, NULL, "1996", + "Tintin - Prisoners of the Sun (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_Tintin2eRomInfo, snes_Tintin2eRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tintin in Tibet (Euro) + +static struct BurnRomInfo snes_TintineRomDesc[] = { + { "Tintin in Tibet (E)(1995)(Infogrames).sfc", 1572864, 0xf1dce2b7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tintine) +STD_ROM_FN(snes_Tintine) + +struct BurnDriver BurnDrvsnes_Tintine = { + "snes_tintine", NULL, NULL, NULL, "1995", + "Tintin in Tibet (Euro)\0", NULL, "Infogrames", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_TintineRomInfo, snes_TintineRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tiny Toon Adventures - Buster Busts Loose! (USA) + +static struct BurnRomInfo snes_TinytoonRomDesc[] = { + { "Tiny Toon Adventures - Buster Busts Loose! (U)(1993)(Konami).sfc", 1048576, 0xab48d27a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinytoon) +STD_ROM_FN(snes_Tinytoon) + +struct BurnDriver BurnDrvsnes_Tinytoon = { + "snes_tinytoon", NULL, NULL, NULL, "1993", + "Tiny Toon Adventures - Buster Busts Loose! (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TinytoonRomInfo, snes_TinytoonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tiny Toon Adventures (Japan) + +static struct BurnRomInfo snes_TinytoonjRomDesc[] = { + { "Tiny Toon Adventures (J)(1992)(Konami).sfc", 1048576, 0x8f0d2c90, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinytoonj) +STD_ROM_FN(snes_Tinytoonj) + +struct BurnDriver BurnDrvsnes_Tinytoonj = { + "snes_tinytoonj", "snes_tinytoon", NULL, NULL, "1992", + "Tiny Toon Adventures (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TinytoonjRomInfo, snes_TinytoonjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tiny Toon Adventures - Dotabata Daiundoukai (Japan) + +static struct BurnRomInfo snes_TinytoonddjRomDesc[] = { + { "Tiny Toon Adventures - Dotabata Daiundoukai (J)(1994)(Konami).sfc", 1048576, 0x01344c8e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinytoonddj) +STD_ROM_FN(snes_Tinytoonddj) + +struct BurnDriver BurnDrvsnes_Tinytoonddj = { + "snes_tinytoonddj", "snes_tinytoonwsc", NULL, NULL, "1994", + "Tiny Toon Adventures - Dotabata Daiundoukai (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_TinytoonddjRomInfo, snes_TinytoonddjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tiny Toon Adventures - Wacky Sports Challenge (USA) + +static struct BurnRomInfo snes_TinytoonwscRomDesc[] = { + { "Tiny Toon Adventures - Wacky Sports Challenge (U)(1994)(Konami).sfc", 1048576, 0xafe72ff0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinytoonwsc) +STD_ROM_FN(snes_Tinytoonwsc) + +struct BurnDriver BurnDrvsnes_Tinytoonwsc = { + "snes_tinytoonwsc", NULL, NULL, NULL, "1994", + "Tiny Toon Adventures - Wacky Sports Challenge (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_TinytoonwscRomInfo, snes_TinytoonwscRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// TKO Super Championship Boxing (USA) + +static struct BurnRomInfo snes_TkoscbRomDesc[] = { + { "TKO Super Championship Boxing (U)(1992)(Sofel).sfc", 524288, 0xfd4af462, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tkoscb) +STD_ROM_FN(snes_Tkoscb) + +struct BurnDriver BurnDrvsnes_Tkoscb = { + "snes_tkoscb", NULL, NULL, NULL, "1992", + "TKO Super Championship Boxing (USA)\0", NULL, "Sofel", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_SPORTSMISC, 0, + SNESGetZipName, snes_TkoscbRomInfo, snes_TkoscbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Teenage Mutant Ninja Turtles - Tournament Fighters (USA) + +static struct BurnRomInfo snes_TmntfightRomDesc[] = { + { "Teenage Mutant Ninja Turtles - Tournament Fighters (U)(1993)(Konami).sfc", 2097152, 0xe2fe5dbf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tmntfight) +STD_ROM_FN(snes_Tmntfight) + +struct BurnDriver BurnDrvsnes_Tmntfight = { + "snes_tmntfight", NULL, NULL, NULL, "1993", + "Teenage Mutant Ninja Turtles - Tournament Fighters (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TmntfightRomInfo, snes_TmntfightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Teenage Mutant Ninja Turtles IV - Turtles in Time (USA) + +static struct BurnRomInfo snes_TmntivRomDesc[] = { + { "Teenage Mutant Ninja Turtles IV - Turtles in Time (U)(1992)(Konami).sfc", 1048576, 0x5940bd99, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tmntiv) +STD_ROM_FN(snes_Tmntiv) + +struct BurnDriver BurnDrvsnes_Tmntiv = { + "snes_tmntiv", NULL, NULL, NULL, "1992", + "Teenage Mutant Ninja Turtles IV - Turtles in Time (USA)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_TmntivRomInfo, snes_TmntivRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Teenage Mutant Ninja Turtles - Turtles in Time (Japan) + +static struct BurnRomInfo snes_TmntivjRomDesc[] = { + { "Teenage Mutant Ninja Turtles - Turtles in Time (J)(1992)(Konami).sfc", 1048576, 0xbdba1b55, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tmntivj) +STD_ROM_FN(snes_Tmntivj) + +struct BurnDriver BurnDrvsnes_Tmntivj = { + "snes_tmntivj", "snes_tmntiv", NULL, NULL, "1992", + "Teenage Mutant Ninja Turtles - Turtles in Time (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_TmntivjRomInfo, snes_TmntivjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Teenage Mutant Ninja Turtles - Mutant Warriors (Japan) + +static struct BurnRomInfo snes_TmntmwRomDesc[] = { + { "Teenage Mutant Ninja Turtles - Mutant Warriors (J)(1993)(Konami).sfc", 2097152, 0x7e97e194, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tmntmw) +STD_ROM_FN(snes_Tmntmw) + +struct BurnDriver BurnDrvsnes_Tmntmw = { + "snes_tmntmw", "snes_tmntfight", NULL, NULL, "1993", + "Teenage Mutant Ninja Turtles - Mutant Warriors (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TmntmwRomInfo, snes_TmntmwRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tony Meola's Sidekicks Soccer (USA) + +static struct BurnRomInfo snes_TmsksoccerRomDesc[] = { + { "Tony Meola's Sidekicks Soccer (U)(1993)(Electro Brain).sfc", 1048576, 0x32b658c1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tmsksoccer) +STD_ROM_FN(snes_Tmsksoccer) + +struct BurnDriver BurnDrvsnes_Tmsksoccer = { + "snes_tmsksoccer", NULL, NULL, NULL, "1993", + "Tony Meola's Sidekicks Soccer (USA)\0", NULL, "Electro Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_TmsksoccerRomInfo, snes_TmsksoccerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tom & Jerry (USA) + +static struct BurnRomInfo snes_TomjerryRomDesc[] = { + { "Tom and Jerry (U)(1992)(Hi Tech Expressions).sfc", 524288, 0x8b1dafbb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tomjerry) +STD_ROM_FN(snes_Tomjerry) + +struct BurnDriver BurnDrvsnes_Tomjerry = { + "snes_tomjerry", NULL, NULL, NULL, "1992", + "Tom & Jerry (USA)\0", NULL, "Hi Tech Expressions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TomjerryRomInfo, snes_TomjerryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Tomorrow's Joe (Hack, English v0.99) +// https://www.romhacking.net/translations/1272/ +static struct BurnRomInfo snes_TomorrowjoeRomDesc[] = { + { "Tomorrow's Joe T-Eng v0.99 (2008)(Vice Translations).sfc", 1049088, 0x41544109, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tomorrowjoe) +STD_ROM_FN(snes_Tomorrowjoe) + +struct BurnDriver BurnDrvsnes_Tomorrowjoe = { + "snes_tomorrowjoe", NULL, NULL, NULL, "2008", + "Tomorrow's Joe (Hack, English v0.99)\0", NULL, "Vice Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TomorrowjoeRomInfo, snes_TomorrowjoeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Top Gear (USA) + +static struct BurnRomInfo snes_TopgearRomDesc[] = { + { "Top Gear (U)(1992)(Kemco).sfc", 524288, 0xd34c49b7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Topgear) +STD_ROM_FN(snes_Topgear) + +struct BurnDriver BurnDrvsnes_Topgear = { + "snes_topgear", NULL, NULL, NULL, "1992", + "Top Gear (USA)\0", NULL, "Kemco - Gremlin Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_TopgearRomInfo, snes_TopgearRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Top Gear 2 (USA) + +static struct BurnRomInfo snes_Topgear2RomDesc[] = { + { "Top Gear 2 (U)(1993)(Kemco).sfc", 1048576, 0x2b88bee8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Topgear2) +STD_ROM_FN(snes_Topgear2) + +struct BurnDriver BurnDrvsnes_Topgear2 = { + "snes_topgear2", NULL, NULL, NULL, "1993", + "Top Gear 2 (USA)\0", NULL, "Kemco - Gremlin Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Topgear2RomInfo, snes_Topgear2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Top Gear 3000 (USA) + +static struct BurnRomInfo snes_Topgear3000RomDesc[] = { + { "Top Gear 3000 (1994)(Kemco - Gremlin Interactive).sfc", 1048576, 0xa20be998, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Topgear3000, snes_Topgear3000, snes_dsp4) +STD_ROM_FN(snes_Topgear3000) + +struct BurnDriver BurnDrvsnes_Topgear3000 = { + "snes_topgear3000", NULL, "snes_dsp4", NULL, "1994", + "Top Gear 3000 (USA)\0", "DSP-4 enhancement chip", "Kemco - Gremlin Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Topgear3000RomInfo, snes_Topgear3000RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Total Carnage (USA) + +static struct BurnRomInfo snes_TotalcarnageRomDesc[] = { + { "Total Carnage (U)(1993)(Black Pearl).sfc", 1048576, 0xe27ff2bc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Totalcarnage) +STD_ROM_FN(snes_Totalcarnage) + +struct BurnDriver BurnDrvsnes_Totalcarnage = { + "snes_totalcarnage", NULL, NULL, NULL, "1993", + "Total Carnage (USA)\0", NULL, "Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_TotalcarnageRomInfo, snes_TotalcarnageRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Disney's Toy Story (USA) + +static struct BurnRomInfo snes_ToystoryRomDesc[] = { + { "Toy Story (U)(1995)(Disney Interactive).sfc", 4194304, 0x8328822b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Toystory) +STD_ROM_FN(snes_Toystory) + +struct BurnDriver BurnDrvsnes_Toystory = { + "snes_toystory", NULL, NULL, NULL, "1995", + "Disney's Toy Story (USA)\0", NULL, "Disney Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ToystoryRomInfo, snes_ToystoryRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Treasure Hunter G (Japan) + +static struct BurnRomInfo snes_TreashuntgjRomDesc[] = { + { "Treasure Hunter G (J)(1996)(Squaresoft).sfc", 3145728, 0x3cceed49, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Treashuntgj) +STD_ROM_FN(snes_Treashuntgj) + +struct BurnDriver BurnDrvsnes_Treashuntgj = { + "snes_treashuntgj", "snes_treashuntgte", NULL, NULL, "1996", + "Treasure Hunter G (Japan)\0", NULL, "Squaresoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_TreashuntgjRomInfo, snes_TreashuntgjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Treasure Hunter G (Hack, English 'Post Beta 2') +// https://www.romhacking.net/translations/490/ +static struct BurnRomInfo snes_TreashuntgteRomDesc[] = { + { "Treasure Hunter G T-Eng Post Beta 2 (2004)(Metalhawk's Translations).sfc", 4194816, 0xebb81b81, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Treashuntgte) +STD_ROM_FN(snes_Treashuntgte) + +struct BurnDriver BurnDrvsnes_Treashuntgte = { + "snes_treashuntgte", NULL, NULL, NULL, "2004", + "Treasure Hunter G (Hack, English 'Post Beta 2')\0", NULL, "Metalhawk's Translations", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG | GBF_STRATEGY, 0, + SNESGetZipName, snes_TreashuntgteRomInfo, snes_TreashuntgteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Troddlers (USA) + +static struct BurnRomInfo snes_TroddlersRomDesc[] = { + { "Troddlers (U)(1993)(The Sales Curve).sfc", 524288, 0x6a7ff02d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Troddlers) +STD_ROM_FN(snes_Troddlers) + +struct BurnDriver BurnDrvsnes_Troddlers = { + "snes_troddlers", NULL, NULL, NULL, "1993", + "Troddlers (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "The Sales Curve", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_TroddlersRomInfo, snes_TroddlersRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// True Lies (USA) + +static struct BurnRomInfo snes_TrueliesRomDesc[] = { + { "True Lies (U)(1994)(Ljn).sfc", 2097152, 0x40ca49ae, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Truelies) +STD_ROM_FN(snes_Truelies) + +struct BurnDriver BurnDrvsnes_Truelies = { + "snes_truelies", NULL, NULL, NULL, "1994", + "True Lies (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_TrueliesRomInfo, snes_TrueliesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tsuppari Oozumou - Risshin Shusse Hen (Japan) + +static struct BurnRomInfo snes_TsuoozumouRomDesc[] = { + { "Tsuppari Oozumou - Risshin Shusse Hen (J)(1993)(Tecmo).sfc", 1048576, 0xecda1f8b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tsuoozumou) +STD_ROM_FN(snes_Tsuoozumou) + +struct BurnDriver BurnDrvsnes_Tsuoozumou = { + "snes_tsuoozumou", NULL, NULL, NULL, "1993", + "Tsuppari Oozumou - Risshin Shusse Hen (Japan)\0", NULL, "Tecmo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TsuoozumouRomInfo, snes_TsuoozumouRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tuff E Nuff (USA) + +static struct BurnRomInfo snes_TuffenuffRomDesc[] = { + { "Tuff E Nuff (U)(1993)(Jaleco).sfc", 2097152, 0x865f37bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tuffenuff) +STD_ROM_FN(snes_Tuffenuff) + +struct BurnDriver BurnDrvsnes_Tuffenuff = { + "snes_tuffenuff", NULL, NULL, NULL, "1993", + "Tuff E Nuff (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_TuffenuffRomInfo, snes_TuffenuffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Turbo Toons (Euro) + +static struct BurnRomInfo snes_TurbotoonsRomDesc[] = { + { "Turbo Toons (E)(1994)(Empire Software).sfc", 524288, 0x26a9c3f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Turbotoons) +STD_ROM_FN(snes_Turbotoons) + +struct BurnDriver BurnDrvsnes_Turbotoons = { + "snes_turbotoons", NULL, NULL, NULL, "1994", + "Turbo Toons (Euro)\0", NULL, "Empire Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 5, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_TurbotoonsRomInfo, snes_TurbotoonsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Turn and Burn: No-Fly Zone (USA) + +static struct BurnRomInfo snes_TurnburnRomDesc[] = { + { "Turn and Burn - No-Fly Zone (U)(1993)(Absolute Entertainment).sfc", 2097152, 0x87bfa0b8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Turnburn) +STD_ROM_FN(snes_Turnburn) + +struct BurnDriver BurnDrvsnes_Turnburn = { + "snes_turnburn", NULL, NULL, NULL, "1993", + "Turn and Burn: No-Fly Zone (USA)\0", NULL, "Absolute Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM, 0, + SNESGetZipName, snes_TurnburnRomInfo, snes_TurnburnRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// TwinBee - Rainbow Bell Adventure (Japan) + +static struct BurnRomInfo snes_TwinbeerbjRomDesc[] = { + { "TwinBee - Rainbow Bell Adventure (J)(1993)(Konami).sfc", 1048576, 0x91867af4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Twinbeerbj) +STD_ROM_FN(snes_Twinbeerbj) + +struct BurnDriver BurnDrvsnes_Twinbeerbj = { + "snes_twinbeerbj", "snes_popntwinbeerbe", NULL, NULL, "1993", + "TwinBee - Rainbow Bell Adventure (Japan)\0", NULL, "Konami", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TwinbeerbjRomInfo, snes_TwinbeerbjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Uchuu no Kishi - Tekkaman Blade (Japan) + +static struct BurnRomInfo snes_UchuunokishiRomDesc[] = { + { "Uchuu no Kishi - Tekkaman Blade (J)(1993)(BEC).sfc", 1048576, 0x7e107c35, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Uchuunokishi) +STD_ROM_FN(snes_Uchuunokishi) + +struct BurnDriver BurnDrvsnes_Uchuunokishi = { + "snes_uchuunokishi", NULL, NULL, NULL, "1993", + "Uchuu no Kishi - Tekkaman Blade (Japan)\0", NULL, "BEC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_HORSHOOT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_UchuunokishiRomInfo, snes_UchuunokishiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// U.F.O. Kamen Yakisoban - Kettler no Kuroi Inbou (Japan) + +static struct BurnRomInfo snes_UfokyRomDesc[] = { + { "U.F.O. Kamen Yakisoban - Kettler no Kuroi Inbou (J)(1994)(Den'Z).sfc", 1048576, 0x272dfc4b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ufoky) +STD_ROM_FN(snes_Ufoky) + +struct BurnDriver BurnDrvsnes_Ufoky = { + "snes_ufoky", NULL, NULL, NULL, "1994", + "U.F.O. Kamen Yakisoban - Kettler no Kuroi Inbou (Japan)\0", NULL, "Den'Z", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_UfokyRomInfo, snes_UfokyRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultimate Football (Japan) + +static struct BurnRomInfo snes_UltfootballRomDesc[] = { + { "Ultimate Football (J)(1992)(Sammy).sfc", 1048576, 0x4c9a5e89, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultfootball) +STD_ROM_FN(snes_Ultfootball) + +struct BurnDriver BurnDrvsnes_Ultfootball = { + "snes_ultfootball", "snes_fbfury", NULL, NULL, "1992", + "Ultimate Football (Japan)\0", NULL, "Sammy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_UltfootballRomInfo, snes_UltfootballRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultima VI - The False Prophet (USA) + +static struct BurnRomInfo snes_UltimaviRomDesc[] = { + { "Ultima VI - The False Prophet (U)(1993)(FCI).sfc", 1048576, 0x9277c9f7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultimavi) +STD_ROM_FN(snes_Ultimavi) + +struct BurnDriver BurnDrvsnes_Ultimavi = { + "snes_ultimavi", NULL, NULL, NULL, "1993", + "Ultima VI - The False Prophet (USA)\0", NULL, "FCI Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_UltimaviRomInfo, snes_UltimaviRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultima VI - Itsuwari no Yogensha (Japan) + +static struct BurnRomInfo snes_UltimavijRomDesc[] = { + { "Ultima VI - Itsuwari no Yogensha (J)(1993)(Pony Canyon).sfc", 1048576, 0x7dd62a5e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultimavij) +STD_ROM_FN(snes_Ultimavij) + +struct BurnDriver BurnDrvsnes_Ultimavij = { + "snes_ultimavij", "snes_ultimavi", NULL, NULL, "1993", + "Ultima VI - Itsuwari no Yogensha (Japan)\0", NULL, "Pony Canyon", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_UltimavijRomInfo, snes_UltimavijRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultraman (USA) + +static struct BurnRomInfo snes_UltramanRomDesc[] = { + { "Ultraman (U)(1991)(Bandai).sfc", 524288, 0x1ded2814, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultraman) +STD_ROM_FN(snes_Ultraman) + +struct BurnDriver BurnDrvsnes_Ultraman = { + "snes_ultraman", NULL, NULL, NULL, "1991", + "Ultraman (USA)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_UltramanRomInfo, snes_UltramanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultraman (Japan) + +static struct BurnRomInfo snes_UltramanjRomDesc[] = { + { "Ultraman (J)(1990)(Bandai).sfc", 524288, 0x3495adf0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultramanj) +STD_ROM_FN(snes_Ultramanj) + +struct BurnDriver BurnDrvsnes_Ultramanj = { + "snes_ultramanj", "snes_ultraman", NULL, NULL, "1990", + "Ultraman (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_UltramanjRomInfo, snes_UltramanjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultra Seven (Japan) + +static struct BurnRomInfo snes_UltrasevenjRomDesc[] = { + { "Ultra Seven (J)(1993)(Bandai).sfc", 1048576, 0x71b24bee, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ultrasevenj) +STD_ROM_FN(snes_Ultrasevenj) + +struct BurnDriver BurnDrvsnes_Ultrasevenj = { + "snes_ultrasevenj", NULL, NULL, NULL, "1993", + "Ultra Seven (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_UltrasevenjRomInfo, snes_UltrasevenjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Umihara Kawase (Japan) + +static struct BurnRomInfo snes_UmiharakawaseRomDesc[] = { + { "Umihara Kawase (J)(1994)(TNN).sfc", 1048576, 0x393ccca2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Umiharakawase) +STD_ROM_FN(snes_Umiharakawase) + +struct BurnDriver BurnDrvsnes_Umiharakawase = { + "snes_umiharakawase", "snes_umikawate", NULL, NULL, "1994", + "Umihara Kawase (Japan)\0", NULL, "TNN", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_UmiharakawaseRomInfo, snes_UmiharakawaseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Umihara Kawase (Hack, English) +// https://www.romhacking.net/translations/5834/ +static struct BurnRomInfo snes_UmikawateRomDesc[] = { + { "Umihara Kawase T-Eng (2021)(satsu, Green Jerry).sfc", 1048576, 0x18b07992, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Umikawate) +STD_ROM_FN(snes_Umikawate) + +struct BurnDriver BurnDrvsnes_Umikawate = { + "snes_umikawate", NULL, NULL, NULL, "2021", + "Umihara Kawase (Hack, English)\0", NULL, "satsu, Green Jerry", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_UmikawateRomInfo, snes_UmikawateRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ultimate Mortal Kombat 3 (USA) + +static struct BurnRomInfo snes_Umk3RomDesc[] = { + { "Ultimate Mortal Kombat 3 (U)(1996)(Williams).sfc", 4194304, 0xf5bfe41e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Umk3) +STD_ROM_FN(snes_Umk3) + +struct BurnDriver BurnDrvsnes_Umk3 = { + "snes_umk3", NULL, NULL, NULL, "1996", + "Ultimate Mortal Kombat 3 (USA)\0", NULL, "Williams Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Umk3RomInfo, snes_Umk3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Undercover Cops (Japan) + +static struct BurnRomInfo snes_UndercopsjRomDesc[] = { + { "Undercover Cops (J)(1995)(Varie Corp.).sfc", 2097152, 0xb574c939, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Undercopsj) +STD_ROM_FN(snes_Undercopsj) + +struct BurnDriver BurnDrvsnes_Undercopsj = { + "snes_undercopsj", "snes_undercopsrb", NULL, NULL, "1995", + "Undercover Cops (Japan)\0", NULL, "Varie Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_UndercopsjRomInfo, snes_UndercopsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Uniracers (USA) + +static struct BurnRomInfo snes_UniracersRomDesc[] = { + { "Uniracers (U)(1994)(Nintendo).sfc", 2097152, 0x383858c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Uniracers) +STD_ROM_FN(snes_Uniracers) + +struct BurnDriver BurnDrvsnes_Uniracers = { + "snes_uniracers", NULL, NULL, NULL, "1994", + "Uniracers (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_UniracersRomInfo, snes_UniracersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Uncharted Waters (USA) + +static struct BurnRomInfo snes_UnchwatersRomDesc[] = { + { "Uncharted Waters (U)(1991)(Koei).sfc", 1048576, 0x95724a2f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Unchwaters) +STD_ROM_FN(snes_Unchwaters) + +struct BurnDriver BurnDrvsnes_Unchwaters = { + "snes_unchwaters", NULL, NULL, NULL, "1991", + "Uncharted Waters (USA)\0", NULL, "Koei", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_UnchwatersRomInfo, snes_UnchwatersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// U.N. Squadron (USA) + +static struct BurnRomInfo snes_UnsquadronRomDesc[] = { + { "U.N. Squadron (U)(1991)(Capcom).sfc", 1048576, 0x231f0f67, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Unsquadron) +STD_ROM_FN(snes_Unsquadron) + +struct BurnDriver BurnDrvsnes_Unsquadron = { + "snes_unsquadron", NULL, NULL, NULL, "1991", + "U.N. Squadron (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_UnsquadronRomInfo, snes_UnsquadronRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Untouchables, The (USA) + +static struct BurnRomInfo snes_UntouchablesRomDesc[] = { + { "Untouchables, The (U)(1993)(Ocean).sfc", 1048576, 0xc70f2374, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Untouchables) +STD_ROM_FN(snes_Untouchables) + +struct BurnDriver BurnDrvsnes_Untouchables = { + "snes_untouchables", NULL, NULL, NULL, "1993", + "Untouchables, The (USA)\0", NULL, "Ocean", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_PLATFORM, 0, + SNESGetZipName, snes_UntouchablesRomInfo, snes_UntouchablesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Urban Strike (USA) + +static struct BurnRomInfo snes_UrbanstrikeRomDesc[] = { + { "Urban Strike (U)(1994)(Black Pearl).sfc", 2097152, 0xb9bf7990, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Urbanstrike) +STD_ROM_FN(snes_Urbanstrike) + +struct BurnDriver BurnDrvsnes_Urbanstrike = { + "snes_urbanstrike", NULL, NULL, NULL, "1994", + "Urban Strike (USA)\0", NULL, "Black Pearl Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_UrbanstrikeRomInfo, snes_UrbanstrikeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ushio to Tora (Japan) + +static struct BurnRomInfo snes_UshiotoraRomDesc[] = { + { "Ushio to Tora (J)(1993)(Yutaka).sfc", 1048576, 0x6eb78ae8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ushiotora) +STD_ROM_FN(snes_Ushiotora) + +struct BurnDriver BurnDrvsnes_Ushiotora = { + "snes_ushiotora", NULL, NULL, NULL, "1993", + "Ushio to Tora (Japan)\0", NULL, "Yutaka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_UshiotoraRomInfo, snes_UshiotoraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Utopia: The Creation of a Nation (USA) + +static struct BurnRomInfo snes_UtopiaRomDesc[] = { + { "Utopia - The Creation of a Nation (U)(1993)(Jaleco).sfc", 524288, 0x252a96c7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Utopia) +STD_ROM_FN(snes_Utopia) + +struct BurnDriver BurnDrvsnes_Utopia = { + "snes_utopia", NULL, NULL, NULL, "1993", + "Utopia: The Creation of a Nation (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_UtopiaRomInfo, snes_UtopiaRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Utopia: The Creation of a Nation (Euro) + +static struct BurnRomInfo snes_UtopiaeRomDesc[] = { + { "Utopia - The Creation of a Nation (E)(1993)(Gremlin Graphics).sfc", 524288, 0x6f702486, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Utopiae) +STD_ROM_FN(snes_Utopiae) + +struct BurnDriver BurnDrvsnes_Utopiae = { + "snes_utopiae", "snes_utopia", NULL, NULL, "1993", + "Utopia: The Creation of a Nation (Euro)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Gremlin Graphics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_UtopiaeRomInfo, snes_UtopiaeRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Utopia (Japan) + +static struct BurnRomInfo snes_UtopiajRomDesc[] = { + { "Utopia (J)(1993)(Epic-Sony Records).sfc", 524288, 0x268c1181, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Utopiaj) +STD_ROM_FN(snes_Utopiaj) + +struct BurnDriver BurnDrvsnes_Utopiaj = { + "snes_utopiaj", "snes_utopia", NULL, NULL, "1993", + "Utopia (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Epic/Sony Records", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_UtopiajRomInfo, snes_UtopiajRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Val d'Isere Championship (Euro) + +static struct BurnRomInfo snes_ValdisereRomDesc[] = { + { "Val d'Isere Championship (E)(1993)(Mindscape).sfc", 1048576, 0xde31d87a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Valdisere) +STD_ROM_FN(snes_Valdisere) + +struct BurnDriver BurnDrvsnes_Valdisere = { + "snes_valdisere", "snes_wintextreme", NULL, NULL, "1993", + "Val d'Isere Championship (Euro)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_ValdisereRomInfo, snes_ValdisereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Las Vegas Dream in Golden Paradise (Japan) + +static struct BurnRomInfo snes_VegasdreamRomDesc[] = { + { "Las Vegas Dream in Golden Paradise (J)(1993)(HAL Laboratory).sfc", 1048576, 0xa6bb5a7a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Vegasdream) +STD_ROM_FN(snes_Vegasdream) + +struct BurnDriver BurnDrvsnes_Vegasdream = { + "snes_vegasdream", "snes_vegasstakes", NULL, NULL, "1993", + "Las Vegas Dream in Golden Paradise (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_CASINO | GBF_ADV, 0, + SNESGetZipName, snes_VegasdreamRomInfo, snes_VegasdreamRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Vegas Stakes (USA) + +static struct BurnRomInfo snes_VegasstakesRomDesc[] = { + { "Vegas Stakes (U)(1993)(HAL Laboratory).sfc", 1048576, 0x03a0e935, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Vegasstakes) +STD_ROM_FN(snes_Vegasstakes) + +struct BurnDriver BurnDrvsnes_Vegasstakes = { + "snes_vegasstakes", NULL, NULL, NULL, "1993", + "Vegas Stakes (USA)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "HAL Laboratory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_CASINO | GBF_ADV, 0, + SNESGetZipName, snes_VegasstakesRomInfo, snes_VegasstakesRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Virtual Soccer (Euro) + +static struct BurnRomInfo snes_VirtsoccereRomDesc[] = { + { "Virtual Soccer (E)(1993)(Hudson Soft).sfc", 1048576, 0xecb8a53a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Virtsoccere) +STD_ROM_FN(snes_Virtsoccere) + +struct BurnDriver BurnDrvsnes_Virtsoccere = { + "snes_virtsoccere", "snes_virtsoccerp", NULL, NULL, "1993", + "Virtual Soccer (Euro)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_VirtsoccereRomInfo, snes_VirtsoccereRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Virtual Soccer (USA, Prototype) + +static struct BurnRomInfo snes_VirtsoccerpRomDesc[] = { + { "Virtual Soccer (U, Proto)(1993)(Hudson Soft).sfc", 1048576, 0x75457b6b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Virtsoccerp) +STD_ROM_FN(snes_Virtsoccerp) + +struct BurnDriver BurnDrvsnes_Virtsoccerp = { + "snes_virtsoccerp", NULL, NULL, NULL, "1993", + "Virtual Soccer (USA, Prototype)\0", NULL, "Hudson Soft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_VirtsoccerpRomInfo, snes_VirtsoccerpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Virtual Bart (USA) + +static struct BurnRomInfo snes_VirtualbartRomDesc[] = { + { "Virtual Bart (U)(1994)(Acclaim Entertainment).sfc", 2097152, 0x5d0addda, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Virtualbart) +STD_ROM_FN(snes_Virtualbart) + +struct BurnDriver BurnDrvsnes_Virtualbart = { + "snes_virtualbart", NULL, NULL, NULL, "1994", + "Virtual Bart (USA)\0", NULL, "Acclaim Entertainment", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_VirtualbartRomInfo, snes_VirtualbartRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Volleyball Twin (Japan) + +static struct BurnRomInfo snes_VolleytwinRomDesc[] = { + { "Volleyball Twin (J)(1992)(Tonkin House).sfc", 1048576, 0xa3f4af43, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Volleytwin) +STD_ROM_FN(snes_Volleytwin) + +struct BurnDriver BurnDrvsnes_Volleytwin = { + "snes_volleytwin", "snes_dsvolleyball", NULL, NULL, "1992", + "Volleyball Twin (Japan)\0", NULL, "Tonkin House", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_VolleytwinRomInfo, snes_VolleytwinRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wagyan Paradise (Japan) + +static struct BurnRomInfo snes_WagparadiseRomDesc[] = { + { "Wagyan Paradise (J)(1994)(Namco).sfc", 1310720, 0xc06e6621, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wagparadise) +STD_ROM_FN(snes_Wagparadise) + +struct BurnDriver BurnDrvsnes_Wagparadise = { + "snes_wagparadise", NULL, NULL, NULL, "1994", + "Wagyan Paradise (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WagparadiseRomInfo, snes_WagparadiseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// War 2410 (USA) + +static struct BurnRomInfo snes_War2410RomDesc[] = { + { "War 2410 (U)(1995)(Advanced Productions).sfc", 2097152, 0xad2dc53a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_War2410) +STD_ROM_FN(snes_War2410) + +struct BurnDriver BurnDrvsnes_War2410 = { + "snes_war2410", NULL, NULL, NULL, "1995", + "War 2410 (USA)\0", NULL, "Advanced Productions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_War2410RomInfo, snes_War2410RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// War 3010 - The Revolution (USA) + +static struct BurnRomInfo snes_War3010RomDesc[] = { + { "War 3010 - The Revolution (U)(1996)(Advanced Productions).sfc", 1048576, 0x98c974be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_War3010) +STD_ROM_FN(snes_War3010) + +struct BurnDriver BurnDrvsnes_War3010 = { + "snes_war3010", NULL, NULL, NULL, "1996", + "War 3010 - The Revolution (USA)\0", NULL, "Advanced Productions", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_STRATEGY, 0, + SNESGetZipName, snes_War3010RomInfo, snes_War3010RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wario's Woods (USA) + +static struct BurnRomInfo snes_WariowoodsRomDesc[] = { + { "Wario's Woods (U)(1994)(Nintendo).sfc", 1048576, 0x2d1004f1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wariowoods) +STD_ROM_FN(snes_Wariowoods) + +struct BurnDriver BurnDrvsnes_Wariowoods = { + "snes_wariowoods", NULL, NULL, NULL, "1994", + "Wario's Woods (USA)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_WariowoodsRomInfo, snes_WariowoodsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WarpSpeed (USA) + +static struct BurnRomInfo snes_WarpspeedRomDesc[] = { + { "WarpSpeed (U)(1992)(Accolade).sfc", 1048576, 0x1e10a1d1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Warpspeed) +STD_ROM_FN(snes_Warpspeed) + +struct BurnDriver BurnDrvsnes_Warpspeed = { + "snes_warpspeed", NULL, NULL, NULL, "1992", + "WarpSpeed (USA)\0", NULL, "Accolade", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_WarpspeedRomInfo, snes_WarpspeedRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WCW Super Brawl Wrestling (USA) + +static struct BurnRomInfo snes_WcwsupbrawlRomDesc[] = { + { "WCW Super Brawl Wrestling (U)1994)(FCI).sfc", 1572864, 0x8b477300, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wcwsupbrawl) +STD_ROM_FN(snes_Wcwsupbrawl) + +struct BurnDriver BurnDrvsnes_Wcwsupbrawl = { + "snes_wcwsupbrawl", NULL, NULL, NULL, "1994", + "WCW Super Brawl Wrestling (USA)\0", NULL, "FCI Inc.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WcwsupbrawlRomInfo, snes_WcwsupbrawlRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WeaponLord (USA) + +static struct BurnRomInfo snes_WeaponlordRomDesc[] = { + { "WeaponLord (U)(1995)(Namco).sfc", 3145728, 0x0e7e7102, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Weaponlord) +STD_ROM_FN(snes_Weaponlord) + +struct BurnDriver BurnDrvsnes_Weaponlord = { + "snes_weaponlord", NULL, NULL, NULL, "1995", + "WeaponLord (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WeaponlordRomInfo, snes_WeaponlordRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wedding Peach (Japan) + +static struct BurnRomInfo snes_WeddpeachjRomDesc[] = { + { "Wedding Peach (J)(1995)(KSS).sfc", 1048576, 0x5fc89932, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Weddpeachj) +STD_ROM_FN(snes_Weddpeachj) + +struct BurnDriver BurnDrvsnes_Weddpeachj = { + "snes_weddpeachj", NULL, NULL, NULL, "1995", + "Wedding Peach (Japan)\0", NULL, "KSS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_MINIGAMES, 0, + SNESGetZipName, snes_WeddpeachjRomInfo, snes_WeddpeachjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WildSnake (USA) + +static struct BurnRomInfo snes_WildsnakeRomDesc[] = { + { "WildSnake (U)(1994)(Spectrum HoloByte).sfc", 524288, 0x025adbf9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wildsnake) +STD_ROM_FN(snes_Wildsnake) + +struct BurnDriver BurnDrvsnes_Wildsnake = { + "snes_wildsnake", NULL, NULL, NULL, "1994", + "WildSnake (USA)\0", NULL, "Spectrum HoloByte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_WildsnakeRomInfo, snes_WildsnakeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander (USA) + +static struct BurnRomInfo snes_WingcmdRomDesc[] = { + { "Wing Commander (U)(1992)(Mindscape).sfc", 1048576, 0x65ad4f8d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmd) +STD_ROM_FN(snes_Wingcmd) + +struct BurnDriver BurnDrvsnes_Wingcmd = { + "snes_wingcmd", NULL, NULL, NULL, "1992", + "Wing Commander (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdRomInfo, snes_WingcmdRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander (Euro, English) + +static struct BurnRomInfo snes_WingcmdeRomDesc[] = { + { "Wing Commander (E)(1992)(Mindscape).sfc", 1048576, 0xa7a22a40, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmde) +STD_ROM_FN(snes_Wingcmde) + +struct BurnDriver BurnDrvsnes_Wingcmde = { + "snes_wingcmde", "snes_wingcmd", NULL, NULL, "1992", + "Wing Commander (Euro, English)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdeRomInfo, snes_WingcmdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander (Euro, German) + +static struct BurnRomInfo snes_WingcmdgRomDesc[] = { + { "Wing Commander (E, Germany)(1992)(Mindscape).sfc", 1048576, 0x49fbd64e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmdg) +STD_ROM_FN(snes_Wingcmdg) + +struct BurnDriver BurnDrvsnes_Wingcmdg = { + "snes_wingcmdg", "snes_wingcmd", NULL, NULL, "1992", + "Wing Commander (Euro, German)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdgRomInfo, snes_WingcmdgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander (Japan) + +static struct BurnRomInfo snes_WingcmdjRomDesc[] = { + { "Wing Commander (J)(1993)(ASCII).sfc", 1048576, 0x42299cea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmdj) +STD_ROM_FN(snes_Wingcmdj) + +struct BurnDriver BurnDrvsnes_Wingcmdj = { + "snes_wingcmdj", "snes_wingcmd", NULL, NULL, "1993", + "Wing Commander (Japan)\0", NULL, "ASCII Corp.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdjRomInfo, snes_WingcmdjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander - The Secret Missions (USA) + +static struct BurnRomInfo snes_WingcmdsmRomDesc[] = { + { "Wing Commander - The Secret Missions (U)(1993)(Mindscape).sfc", 1048576, 0xd5e9af7f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmdsm) +STD_ROM_FN(snes_Wingcmdsm) + +struct BurnDriver BurnDrvsnes_Wingcmdsm = { + "snes_wingcmdsm", NULL, NULL, NULL, "1993", + "Wing Commander - The Secret Missions (USA)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdsmRomInfo, snes_WingcmdsmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wing Commander - The Secret Missions (Euro) + +static struct BurnRomInfo snes_WingcmdsmeRomDesc[] = { + { "Wing Commander - The Secret Missions (E)(1993)(Mindscape).sfc", 1048576, 0x6ef77f07, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wingcmdsme) +STD_ROM_FN(snes_Wingcmdsme) + +struct BurnDriver BurnDrvsnes_Wingcmdsme = { + "snes_wingcmdsme", "snes_wingcmdsm", NULL, NULL, "1993", + "Wing Commander - The Secret Missions (Euro)\0", NULL, "Mindscape", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SIM | GBF_ADV, 0, + SNESGetZipName, snes_WingcmdsmeRomInfo, snes_WingcmdsmeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wings 2 - Aces High (USA) + +static struct BurnRomInfo snes_Wings2ahRomDesc[] = { + { "Wings 2 - Aces High (U)(1992)(Namco).sfc", 524288, 0x1637d1a5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wings2ah) +STD_ROM_FN(snes_Wings2ah) + +struct BurnDriver BurnDrvsnes_Wings2ah = { + "snes_wings2ah", NULL, NULL, NULL, "1992", + "Wings 2 - Aces High (USA)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_SIM, 0, + SNESGetZipName, snes_Wings2ahRomInfo, snes_Wings2ahRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tommy Moe's Winter Extreme - Skiing and Snowboarding (USA) + +static struct BurnRomInfo snes_WintextremeRomDesc[] = { + { "Tommy Moe's Winter Extreme - Skiing and Snowboarding (U)(1993)(Electro Brain).sfc", 1048576, 0x3d005f22, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wintextreme) +STD_ROM_FN(snes_Wintextreme) + +struct BurnDriver BurnDrvsnes_Wintextreme = { + "snes_wintextreme", NULL, NULL, NULL, "1993", + "Tommy Moe's Winter Extreme - Skiing and Snowboarding (USA)\0", NULL, "Electro Brain", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_WintextremeRomInfo, snes_WintextremeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wizard of Oz, The (USA) + +static struct BurnRomInfo snes_WizardofozRomDesc[] = { + { "Wizard of Oz, The (U)(1993)(Seta).sfc", 1048576, 0xd5ce2db5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wizardofoz) +STD_ROM_FN(snes_Wizardofoz) + +struct BurnDriver BurnDrvsnes_Wizardofoz = { + "snes_wizardofoz", NULL, NULL, NULL, "1993", + "Wizard of Oz, The (USA)\0", NULL, "Seta", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WizardofozRomInfo, snes_WizardofozRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wizardry I-II-III - Story of Llylgamyn (Japan) + +static struct BurnRomInfo snes_Wiz123jRomDesc[] = { + { "Wizardry I-II-III - Story of Llylgamyn (J)(1999)(Media Factory).sfc", 4194304, 0xb8a72553, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wiz123j) +STD_ROM_FN(snes_Wiz123j) + +struct BurnDriver BurnDrvsnes_Wiz123j = { + "snes_wiz123j", "snes_wiz123te", NULL, NULL, "1999", + "Wizardry I-II-III - Story of Llylgamyn (Japan)\0", NULL, "Media Factory", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Wiz123jRomInfo, snes_Wiz123jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wizardry I-II-III - Story of Llylgamyn (Hack, English v1.2) +// https://www.romhacking.net/translations/5711/ +static struct BurnRomInfo snes_Wiz123teRomDesc[] = { + { "Wizardry I-II-III - Story of Llylgamyn T-Eng v1.2 (2023)(HK Adi, Aeon Genesis).sfc", 4194304, 0x05bd884c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wiz123te) +STD_ROM_FN(snes_Wiz123te) + +struct BurnDriver BurnDrvsnes_Wiz123te = { + "snes_wiz123te", NULL, NULL, NULL, "2023", + "Wizardry I-II-III - Story of Llylgamyn (Hack, English v1.2)\0", "Set 'English' from Options Menu", "HK Adi, Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Wiz123teRomInfo, snes_Wiz123teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Heroes 2 (Japan) + +static struct BurnRomInfo snes_Wh2jRomDesc[] = { + { "World Heroes 2 (J)(1994)(Saurus).sfc", 3145728, 0x25a55b3b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wh2j) +STD_ROM_FN(snes_Wh2j) + +struct BurnDriver BurnDrvsnes_Wh2j = { + "snes_wh2j", "snes_wh2u", NULL, NULL, "1994", + "World Heroes 2 (Japan)\0", NULL, "Saurus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Wh2jRomInfo, snes_Wh2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Heroes 2 (USA) + +static struct BurnRomInfo snes_Wh2uRomDesc[] = { + { "World Heroes 2 (U)(1994)(Takara).sfc", 3145728, 0x098d7eaa, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wh2u) +STD_ROM_FN(snes_Wh2u) + +struct BurnDriver BurnDrvsnes_Wh2u = { + "snes_wh2u", NULL, NULL, NULL, "1994", + "World Heroes 2 (USA)\0", NULL, "Takara Co.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Wh2uRomInfo, snes_Wh2uRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Whirlo (Euro) + +static struct BurnRomInfo snes_WhirloRomDesc[] = { + { "Whirlo (E)(1992)(Namco).sfc", 1048576, 0x7379e3b3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Whirlo) +STD_ROM_FN(snes_Whirlo) + +struct BurnDriver BurnDrvsnes_Whirlo = { + "snes_whirlo", NULL, NULL, NULL, "1992", + "Whirlo (Euro)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WhirloRomInfo, snes_WhirloRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Whizz (USA) + +static struct BurnRomInfo snes_WhizzRomDesc[] = { + { "Whizz (U)(1996)(Titus).sfc", 1048576, 0xea8df334, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Whizz) +STD_ROM_FN(snes_Whizz) + +struct BurnDriver BurnDrvsnes_Whizz = { + "snes_whizz", NULL, NULL, NULL, "1996", + "Whizz (USA)\0", NULL, "Titus", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WhizzRomInfo, snes_WhizzRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Heroes (Japan) + +static struct BurnRomInfo snes_WhjRomDesc[] = { + { "World Heroes (J)(1993)(Sunsoft).sfc", 2097152, 0x1ff42561, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Whj) +STD_ROM_FN(snes_Whj) + +struct BurnDriver BurnDrvsnes_Whj = { + "snes_whj", "snes_whu", NULL, NULL, "1993", + "World Heroes (Japan)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WhjRomInfo, snes_WhjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Heroes (USA) + +static struct BurnRomInfo snes_WhuRomDesc[] = { + { "World Heroes (U)(1993)(Sunsoft).sfc", 2097152, 0x1228ad30, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Whu) +STD_ROM_FN(snes_Whu) + +struct BurnDriver BurnDrvsnes_Whu = { + "snes_whu", NULL, NULL, NULL, "1993", + "World Heroes (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WhuRomInfo, snes_WhuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// True Golf Classics - Wicked 18 (USA) + +static struct BurnRomInfo snes_Wicked18RomDesc[] = { + { "True Golf Classics - Wicked 18 (U)(1993)(Bullet Proof Software).sfc", 1048576, 0x26177842, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wicked18) +STD_ROM_FN(snes_Wicked18) + +struct BurnDriver BurnDrvsnes_Wicked18 = { + "snes_wicked18", NULL, NULL, NULL, "1993", + "True Golf Classics - Wicked 18 (USA)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_SPORTSMISC, 0, + SNESGetZipName, snes_Wicked18RomInfo, snes_Wicked18RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jim Lee's WildC.A.T.S - Covert Action Teams (USA) + +static struct BurnRomInfo snes_WildcatsRomDesc[] = { + { "Jim Lee's WildC.A.T.S - Covert Action Teams (U)(1995)(Playmates).sfc", 2097152, 0x10c6f5ad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wildcats) +STD_ROM_FN(snes_Wildcats) + +struct BurnDriver BurnDrvsnes_Wildcats = { + "snes_wildcats", NULL, NULL, NULL, "1995", + "Jim Lee's WildC.A.T.S - Covert Action Teams (USA)\0", NULL, "Playmates Interactive Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_WildcatsRomInfo, snes_WildcatsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wild Guns (USA) + +static struct BurnRomInfo snes_WildgunsRomDesc[] = { + { "Wild Guns (U)(1994)(Natsume).sfc", 1048576, 0x085d8d14, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wildguns) +STD_ROM_FN(snes_Wildguns) + +struct BurnDriver BurnDrvsnes_Wildguns = { + "snes_wildguns", NULL, NULL, NULL, "1994", + "Wild Guns (USA)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_WildgunsRomInfo, snes_WildgunsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wild Guns (Euro) + +static struct BurnRomInfo snes_WildgunseRomDesc[] = { + { "Wild Guns (E)(1995)(Titus - Natsume).sfc", 1048576, 0x6e939dd3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wildgunse) +STD_ROM_FN(snes_Wildgunse) + +struct BurnDriver BurnDrvsnes_Wildgunse = { + "snes_wildgunse", "snes_wildguns", NULL, NULL, "1995", + "Wild Guns (Euro)\0", NULL, "Titus - Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_WildgunseRomInfo, snes_WildgunseRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wild Guns (Japan) + +static struct BurnRomInfo snes_WildgunsjRomDesc[] = { + { "Wild Guns (J)(1994)(Natsume).sfc", 1048576, 0x96f948cb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wildgunsj) +STD_ROM_FN(snes_Wildgunsj) + +struct BurnDriver BurnDrvsnes_Wildgunsj = { + "snes_wildgunsj", "snes_wildguns", NULL, NULL, "1994", + "Wild Guns (Japan)\0", NULL, "Natsume", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_WildgunsjRomInfo, snes_WildgunsjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wolfenstein 3-D (USA) + +static struct BurnRomInfo snes_Wolf3dRomDesc[] = { + { "Wolfenstein 3-D (U)(1993)(Imagineer).sfc", 1048576, 0x6582a8f5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wolf3d) +STD_ROM_FN(snes_Wolf3d) + +struct BurnDriver BurnDrvsnes_Wolf3d = { + "snes_wolf3d", NULL, NULL, NULL, "1993", + "Wolfenstein 3-D (USA)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_MAZE, 0, + SNESGetZipName, snes_Wolf3dRomInfo, snes_Wolf3dRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wolfenstein 3D - The Claw of Eisenfaust (Japan) + +static struct BurnRomInfo snes_Wolf3djRomDesc[] = { + { "Wolfenstein 3D - The Claw of Eisenfaust (J)(1993)(Imagineer).sfc", 1048576, 0xcc47b8f9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wolf3dj) +STD_ROM_FN(snes_Wolf3dj) + +struct BurnDriver BurnDrvsnes_Wolf3dj = { + "snes_wolf3dj", "snes_wolf3d", NULL, NULL, "1993", + "Wolfenstein 3D - The Claw of Eisenfaust (Japan)\0", NULL, "Imagineer", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT | GBF_MAZE, 0, + SNESGetZipName, snes_Wolf3djRomInfo, snes_Wolf3djRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wolfchild (USA) + +static struct BurnRomInfo snes_WolfchildRomDesc[] = { + { "Wolfchild (U)(1993)(Virgin Int. - Core Design).sfc", 1048576, 0x13bfb3a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wolfchild) +STD_ROM_FN(snes_Wolfchild) + +struct BurnDriver BurnDrvsnes_Wolfchild = { + "snes_wolfchild", NULL, NULL, NULL, "1993", + "Wolfchild (USA)\0", NULL, "Virgin Int. - Core Design", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WolfchildRomInfo, snes_WolfchildRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wolverine - Adamantium Rage (USA) + +static struct BurnRomInfo snes_WolverineRomDesc[] = { + { "Wolverine - Adamantium Rage (U)(1994)(Ljn).sfc", 2097152, 0x4e62d6bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wolverine) +STD_ROM_FN(snes_Wolverine) + +struct BurnDriver BurnDrvsnes_Wolverine = { + "snes_wolverine", NULL, NULL, NULL, "1994", + "Wolverine - Adamantium Rage (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_WolverineRomInfo, snes_WolverineRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wordtris (USA) + +static struct BurnRomInfo snes_WordtrisRomDesc[] = { + { "Wordtris (U)(1992)(Spectrum HoloByte).sfc", 524288, 0x856ab0bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wordtris) +STD_ROM_FN(snes_Wordtris) + +struct BurnDriver BurnDrvsnes_Wordtris = { + "snes_wordtris", NULL, NULL, NULL, "1992", + "Wordtris (USA)\0", NULL, "Spectrum HoloByte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_WordtrisRomInfo, snes_WordtrisRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Worms (Euro) + +static struct BurnRomInfo snes_WormsRomDesc[] = { + { "Worms (E)(1996)(Ocean - Team17).sfc", 2097152, 0x90d0fac0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Worms) +STD_ROM_FN(snes_Worms) + +struct BurnDriver BurnDrvsnes_Worms = { + "snes_worms", NULL, NULL, NULL, "1996", + "Worms (Euro)\0", NULL, "Ocean - Team17", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_WormsRomInfo, snes_WormsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wonder Project J - Kikai no Shounen Pino (Japan) + +static struct BurnRomInfo snes_WprojectjjRomDesc[] = { + { "Wonder Project J - Kikai no Shounen Pino (J)(1994)(Enix).sfc", 3145728, 0xaf8f4db9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wprojectjj) +STD_ROM_FN(snes_Wprojectjj) + +struct BurnDriver BurnDrvsnes_Wprojectjj = { + "snes_wprojectjj", "snes_wprojectjte", NULL, NULL, "1994", + "Wonder Project J - Kikai no Shounen Pino (Japan)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Enix", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ADV | GBF_RPG, 0, + SNESGetZipName, snes_WprojectjjRomInfo, snes_WprojectjjRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wonder Project J - Kikai no Shounen Pino (Hack, English v1.04) +// https://www.romhacking.net/translations/497/ +static struct BurnRomInfo snes_WprojectjteRomDesc[] = { + { "Wonder Project J - Kikai no Shounen Pino T-Eng v1.04 (2016)(WakdHacks).sfc", 3203584, 0xc3891fcb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wprojectjte) +STD_ROM_FN(snes_Wprojectjte) + +struct BurnDriver BurnDrvsnes_Wprojectjte = { + "snes_wprojectjte", NULL, NULL, NULL, "2016", + "Wonder Project J - Kikai no Shounen Pino (Hack, English v1.04)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "WakdHacks", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV | GBF_RPG, 0, + SNESGetZipName, snes_WprojectjteRomInfo, snes_WprojectjteRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wonder Project J - Kikai no Shounen Pino (Hack, Italian v1.0b) +// https://www.sadnescity.it/traduzioni/wpj/wpj.php +static struct BurnRomInfo snes_WprojectjtiRomDesc[] = { + { "Wonder Project J - Kikai no Shounen Pino T-Ita v1.0b (2002)(Mog Tom).sfc", 3203072, 0x2f02cd52, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wprojectjti) +STD_ROM_FN(snes_Wprojectjti) + +struct BurnDriver BurnDrvsnes_Wprojectjti = { + "snes_wprojectjti", "snes_wprojectjte", NULL, NULL, "2002", + "Wonder Project J - Kikai no Shounen Pino (Hack, Italian v1.0b)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Mog Tom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV | GBF_RPG, 0, + SNESGetZipName, snes_WprojectjtiRomInfo, snes_WprojectjtiRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wonder Project J - Kikai no Shounen Pino (Hack, Spanish v1.2) +// https://traduccionessemco.blogspot.com/2018/02/traduccion-wonder-project-j-de-snes-en_24.html +static struct BurnRomInfo snes_WprojectjtsRomDesc[] = { + { "Wonder Project J - Kikai no Shounen Pino T-Spa v1.2 (2018)(Semco).sfc", 3211776, 0xdaba478d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wprojectjts) +STD_ROM_FN(snes_Wprojectjts) + +struct BurnDriver BurnDrvsnes_Wprojectjts = { + "snes_wprojectjts", "snes_wprojectjte", NULL, NULL, "2018", + "Wonder Project J - Kikai no Shounen Pino (Hack, Spanish v1.2)\0", "'SNES Mouse' compatible game (Set Dipswitches)", "Semco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ADV | GBF_RPG, 0, + SNESGetZipName, snes_WprojectjtsRomInfo, snes_WprojectjtsRomName, NULL, NULL, NULL, NULL, SNESMouseInputInfo, SNESMouseDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wrecking Crew '98 (Japan) + +static struct BurnRomInfo snes_Wreckcrew98jRomDesc[] = { + { "Wrecking Crew '98 (J)(1998)(Nintendo).sfc", 2097152, 0xa24f85ff, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wreckcrew98j) +STD_ROM_FN(snes_Wreckcrew98j) + +struct BurnDriver BurnDrvsnes_Wreckcrew98j = { + "snes_wreckcrew98j", "snes_wreckcrew98te", NULL, NULL, "1998", + "Wrecking Crew '98 (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_Wreckcrew98jRomInfo, snes_Wreckcrew98jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Wrecking Crew '98 (Hack, English v2.0) +// https://www.romhacking.net/translations/3214/ +static struct BurnRomInfo snes_Wreckcrew98teRomDesc[] = { + { "Wrecking Crew '98 T-Eng v2.0 (2021)(ShadowOne333).sfc", 2097152, 0x5f795f9b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wreckcrew98te) +STD_ROM_FN(snes_Wreckcrew98te) + +struct BurnDriver BurnDrvsnes_Wreckcrew98te = { + "snes_wreckcrew98te", NULL, NULL, NULL, "2021", + "Wrecking Crew '98 (Hack, English v2.0)\0", NULL, "ShadowOne333", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_Wreckcrew98teRomInfo, snes_Wreckcrew98teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Soccer '94: Road to Glory (USA) + +static struct BurnRomInfo snes_Wsoccer94RomDesc[] = { + { "World Soccer '94 - Road to Glory (U)(1993)(Atlus - Rage).sfc", 524288, 0x0aae0a10, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wsoccer94) +STD_ROM_FN(snes_Wsoccer94) + +struct BurnDriver BurnDrvsnes_Wsoccer94 = { + "snes_wsoccer94", NULL, NULL, NULL, "1993", + "World Soccer '94: Road to Glory (USA)\0", NULL, "Atlus Co. - Rage Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_Wsoccer94RomInfo, snes_Wsoccer94RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// World Soccer (Japan) + +static struct BurnRomInfo snes_WsoccerjRomDesc[] = { + { "World Soccer (J)(1993)(Coconuts - Rage).sfc", 524288, 0xa3096a8e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wsoccerj) +STD_ROM_FN(snes_Wsoccerj) + +struct BurnDriver BurnDrvsnes_Wsoccerj = { + "snes_wsoccerj", "snes_wsoccer94", NULL, NULL, "1993", + "World Soccer (Japan)\0", NULL, "Coconuts Japan - Rage Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SPORTSFOOTBALL, 0, + SNESGetZipName, snes_WsoccerjRomInfo, snes_WsoccerjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WWF Raw (USA) + +static struct BurnRomInfo snes_WwfrawRomDesc[] = { + { "WWF Raw (U)(1994)(Ljn).sfc", 3145728, 0x3e0038bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wwfraw) +STD_ROM_FN(snes_Wwfraw) + +struct BurnDriver BurnDrvsnes_Wwfraw = { + "snes_wwfraw", NULL, NULL, NULL, "1994", + "WWF Raw (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 4, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WwfrawRomInfo, snes_WwfrawRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WWF Royal Rumble (USA) + +static struct BurnRomInfo snes_WwfrrRomDesc[] = { + { "WWF Royal Rumble (U)(1993)(Ljn).sfc", 2097152, 0x2101d515, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wwfrr) +STD_ROM_FN(snes_Wwfrr) + +struct BurnDriver BurnDrvsnes_Wwfrr = { + "snes_wwfrr", NULL, NULL, NULL, "1993", + "WWF Royal Rumble (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WwfrrRomInfo, snes_WwfrrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// WWF Super WrestleMania (USA) + +static struct BurnRomInfo snes_WwfswmRomDesc[] = { + { "WWF Super WrestleMania (U)(1991)(Ljn).sfc", 1048576, 0x676cb638, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wwfswm) +STD_ROM_FN(snes_Wwfswm) + +struct BurnDriver BurnDrvsnes_Wwfswm = { + "snes_wwfswm", NULL, NULL, NULL, "1991", + "WWF Super WrestleMania (USA)\0", NULL, "Ljn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_WwfswmRomInfo, snes_WwfswmRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Xandra no Daibouken - Valkyrie to no Deai (Japan) + +static struct BurnRomInfo snes_XandraRomDesc[] = { + { "Xandra no Daibouken - Valkyrie to no Deai (J)(1992)(Namco).sfc", 1048576, 0x56ec4655, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xandra) +STD_ROM_FN(snes_Xandra) + +struct BurnDriver BurnDrvsnes_Xandra = { + "snes_xandra", "snes_whirlo", NULL, NULL, "1992", + "Xandra no Daibouken - Valkyrie to no Deai (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_XandraRomInfo, snes_XandraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Xardion (USA) + +static struct BurnRomInfo snes_XardionRomDesc[] = { + { "Xardion (U)(1992)(Asmik).sfc", 1048576, 0xc7c12a57, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xardion) +STD_ROM_FN(snes_Xardion) + +struct BurnDriver BurnDrvsnes_Xardion = { + "snes_xardion", NULL, NULL, NULL, "1992", + "Xardion (USA)\0", NULL, "Asmik", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_XardionRomInfo, snes_XardionRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// X-Kaliber 2097 (USA) + +static struct BurnRomInfo snes_Xkaliber2097RomDesc[] = { + { "X-Kaliber 2097 (U)(1994)(Activision).sfc", 1048576, 0xe83eceea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xkaliber2097) +STD_ROM_FN(snes_Xkaliber2097) + +struct BurnDriver BurnDrvsnes_Xkaliber2097 = { + "snes_xkaliber2097", NULL, NULL, NULL, "1994", + "X-Kaliber 2097 (USA)\0", NULL, "Activision", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_VSFIGHT, 0, + SNESGetZipName, snes_Xkaliber2097RomInfo, snes_Xkaliber2097RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// X-Men - Mutant Apocalypse (USA) + +static struct BurnRomInfo snes_XmenmaRomDesc[] = { + { "X-Men - Mutant Apocalypse (U)(1994)(Capcom).sfc", 2097152, 0x5e34822a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xmenma) +STD_ROM_FN(snes_Xmenma) + +struct BurnDriver BurnDrvsnes_Xmenma = { + "snes_xmenma", NULL, NULL, NULL, "1994", + "X-Men - Mutant Apocalypse (USA)\0", NULL, "Capcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_XmenmaRomInfo, snes_XmenmaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// X Zone (USA, Japan) + +static struct BurnRomInfo snes_XzoneRomDesc[] = { + { "X Zone (U, J)(1992)(Kemco).sfc", 524288, 0x99627bb0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xzone) +STD_ROM_FN(snes_Xzone) + +struct BurnDriver BurnDrvsnes_Xzone = { + "snes_xzone", NULL, NULL, NULL, "1992", + "X Zone (USA, Japan)\0", "'Super Scope' exclusive game", "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_XzoneRomInfo, snes_XzoneRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// X Zone (Euro) + +static struct BurnRomInfo snes_XzoneeRomDesc[] = { + { "X Zone (E)(1993)(Kemco).sfc", 524288, 0x1a24bc5c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xzonee) +STD_ROM_FN(snes_Xzonee) + +struct BurnDriver BurnDrvsnes_Xzonee = { + "snes_xzonee", "snes_xzone", NULL, NULL, "1993", + "X Zone (Euro)\0", "'Super Scope' exclusive game", "Kemco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_XzoneeRomInfo, snes_XzoneeRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// YamYam (Japan) + +static struct BurnRomInfo snes_YamyamjRomDesc[] = { + { "YamYam (J)(1995)(Bandai).sfc", 1572864, 0x4620c386, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yamyamj) +STD_ROM_FN(snes_Yamyamj) + +struct BurnDriver BurnDrvsnes_Yamyamj = { + "snes_yamyamj", NULL, NULL, NULL, "1995", + "YamYam (Japan)\0", NULL, "Bandai", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_SHOOT | GBF_ADV, 0, + SNESGetZipName, snes_YamyamjRomInfo, snes_YamyamjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yogi Bear (USA) + +static struct BurnRomInfo snes_YogibearRomDesc[] = { + { "Yogi Bear (U)(1994)(Cybersoft).sfc", 1048576, 0x7448d45c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yogibear) +STD_ROM_FN(snes_Yogibear) + +struct BurnDriver BurnDrvsnes_Yogibear = { + "snes_yogibear", NULL, NULL, NULL, "1994", + "Yogi Bear (USA)\0", NULL, "Cybersoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_YogibearRomInfo, snes_YogibearRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yoshi's Cookie (USA) + +static struct BurnRomInfo snes_YoshicookieRomDesc[] = { + { "Yoshi's Cookie (U)(1993)(Bullet Proof Software).sfc", 524288, 0xef15f4c3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshicookie) +STD_ROM_FN(snes_Yoshicookie) + +struct BurnDriver BurnDrvsnes_Yoshicookie = { + "snes_yoshicookie", NULL, NULL, NULL, "1993", + "Yoshi's Cookie (USA)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_YoshicookieRomInfo, snes_YoshicookieRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Yoshi no Cookie (Japan) + +static struct BurnRomInfo snes_YoshicookiejRomDesc[] = { + { "Yoshi no Cookie (J)(1993)(Bullet Proof Software).sfc", 524288, 0x1e1aa75f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshicookiej) +STD_ROM_FN(snes_Yoshicookiej) + +struct BurnDriver BurnDrvsnes_Yoshicookiej = { + "snes_yoshicookiej", "snes_yoshicookie", NULL, NULL, "1993", + "Yoshi no Cookie (Japan)\0", NULL, "Bullet Proof Software", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_YoshicookiejRomInfo, snes_YoshicookiejRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Yoshi no Road Hunting (Japan) + +static struct BurnRomInfo snes_YoshiroadhuntRomDesc[] = { + { "Yoshi no Road Hunting (J)(1993)(Nintendo).sfc", 1048576, 0x52948f3c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshiroadhunt) +STD_ROM_FN(snes_Yoshiroadhunt) + +struct BurnDriver BurnDrvsnes_Yoshiroadhunt = { + "snes_yoshiroadhunt", "snes_yoshisafari", NULL, NULL, "1993", + "Yoshi no Road Hunting (Japan)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_YoshiroadhuntRomInfo, snes_YoshiroadhuntRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yoshi's Safari (USA) + +static struct BurnRomInfo snes_YoshisafariRomDesc[] = { + { "Yoshi's Safari (U)(1993)(Nintendo).sfc", 1048576, 0x59490ce8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshisafari) +STD_ROM_FN(snes_Yoshisafari) + +struct BurnDriver BurnDrvsnes_Yoshisafari = { + "snes_yoshisafari", NULL, NULL, NULL, "1993", + "Yoshi's Safari (USA)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_YoshisafariRomInfo, snes_YoshisafariRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yoshi's Safari (Euro) + +static struct BurnRomInfo snes_YoshisafarieRomDesc[] = { + { "Yoshi's Safari (E)(1993)(Nintendo).sfc", 1048576, 0x9a8178bf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshisafarie) +STD_ROM_FN(snes_Yoshisafarie) + +struct BurnDriver BurnDrvsnes_Yoshisafarie = { + "snes_yoshisafarie", "snes_yoshisafari", NULL, NULL, "1993", + "Yoshi's Safari (Euro)\0", "'Super Scope' exclusive game", "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES_ZAPPER, GBF_SHOOT, 0, + SNESGetZipName, snes_YoshisafarieRomInfo, snes_YoshisafarieRomName, NULL, NULL, NULL, NULL, SNESZapperInputInfo, SNESZapperDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Youkai Buster - Ruka no Daibouken (Japan) + +static struct BurnRomInfo snes_YoukaibustRomDesc[] = { + { "Youkai Buster - Ruka no Daibouken (J)(1995)(Kadokawa Digital Ent.).sfc", 1048576, 0xe6d19429, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Youkaibust) +STD_ROM_FN(snes_Youkaibust) + +struct BurnDriver BurnDrvsnes_Youkaibust = { + "snes_youkaibust", "snes_jetsons", NULL, NULL, "1995", + "Youkai Buster - Ruka no Daibouken (Japan)\0", NULL, "Kadokawa Digital Ent.", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_YoukaibustRomInfo, snes_YoukaibustRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ys III - Wanderers from Ys (USA) + +static struct BurnRomInfo snes_Ys3RomDesc[] = { + { "Ys III - Wanderers from Ys (U)(1991)(Sammy).sfc", 1048576, 0x64a91e64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ys3) +STD_ROM_FN(snes_Ys3) + +struct BurnDriver BurnDrvsnes_Ys3 = { + "snes_ys3", NULL, NULL, NULL, "1991", + "Ys III - Wanderers from Ys (USA)\0", NULL, "Sammy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ys3RomInfo, snes_Ys3RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ys III - Wanderers from Ys (Japan) + +static struct BurnRomInfo snes_Ys3jRomDesc[] = { + { "Ys III - Wanderers from Ys (J)(1991)(Tonkin House).sfc", 1048576, 0x8e39a006, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ys3j) +STD_ROM_FN(snes_Ys3j) + +struct BurnDriver BurnDrvsnes_Ys3j = { + "snes_ys3j", "snes_ys3", NULL, NULL, "1991", + "Ys III - Wanderers from Ys (Japan)\0", NULL, "Tonkin House", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ys3jRomInfo, snes_Ys3jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ys IV - Mask of the Sun (Japan) + +static struct BurnRomInfo snes_Ys4jRomDesc[] = { + { "Ys IV - Mask of the Sun (J)(1993)(Nihon Falcom).sfc", 1572864, 0xca7b4db9, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ys4j) +STD_ROM_FN(snes_Ys4j) + +struct BurnDriver BurnDrvsnes_Ys4j = { + "snes_ys4j", "snes_ys4te", NULL, NULL, "1993", + "Ys IV - Mask of the Sun\0", NULL, "Nihon Falcom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ys4jRomInfo, snes_Ys4jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ys IV - Mask of the Sun (Hack, English V2.10) +// https://www.romhacking.net/translations/498/ +static struct BurnRomInfo snes_Ys4teRomDesc[] = { + { "Ys IV - Mask of the Sun T-Eng V2.10 (2013)(Aeon Genesis).sfc", 1572864, 0x27577ec8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ys4te) +STD_ROM_FN(snes_Ys4te) + +struct BurnDriver BurnDrvsnes_Ys4te = { + "snes_ys4te", NULL, NULL, NULL, "2013", + "Ys IV - Mask of the Sun (Hack, English V2.10)\0", NULL, "Aeon Genesis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ys4teRomInfo, snes_Ys4teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yuu Yuu Hakusho 2 - Kakutou no Shou (Japan) + +static struct BurnRomInfo snes_Yuuyuuhak2jRomDesc[] = { + { "Yuu Yuu Hakusho 2 - Kakutou no Shou (J)(1994)(Namco).sfc", 2097152, 0xeef45a93, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yuuyuuhak2j) +STD_ROM_FN(snes_Yuuyuuhak2j) + +struct BurnDriver BurnDrvsnes_Yuuyuuhak2j = { + "snes_yuuyuuhak2j", NULL, NULL, NULL, "1994", + "Yuu Yuu Hakusho 2 - Kakutou no Shou (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Yuuyuuhak2jRomInfo, snes_Yuuyuuhak2jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yuu Yuu Hakusho - Tokubetsu Hen (Japan) + +static struct BurnRomInfo snes_YuuyuuhakjRomDesc[] = { + { "Yuu Yuu Hakusho - Tokubetsu Hen (J)(1994)(Namco).sfc", 2097152, 0x535cccac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yuuyuuhakj) +STD_ROM_FN(snes_Yuuyuuhakj) + +struct BurnDriver BurnDrvsnes_Yuuyuuhakj = { + "snes_yuuyuuhakj", NULL, NULL, NULL, "1994", + "Yuu Yuu Hakusho - Tokubetsu Hen (Japan)\0", NULL, "Namco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_VSFIGHT | GBF_ADV, 0, + SNESGetZipName, snes_YuuyuuhakjRomInfo, snes_YuuyuuhakjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zelda no Densetsu - Kamigami no Triforce (Japan) + +static struct BurnRomInfo snes_ZeldanodensetsuRomDesc[] = { + { "Zelda no Densetsu - Kamigami no Triforce (J)(1991)(Nintendo).sfc", 1048576, 0x3322effc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zeldanodensetsu) +STD_ROM_FN(snes_Zeldanodensetsu) + +struct BurnDriver BurnDrvsnes_Zeldanodensetsu = { + "snes_zeldanodensetsu", "snes_legendofzelda", NULL, NULL, "1991", + "Zelda no Densetsu - Kamigami no Triforce (Japan)\0", NULL, "Nintendo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_ZeldanodensetsuRomInfo, snes_ZeldanodensetsuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zero the Kamikaze Squirrel (USA) + +static struct BurnRomInfo snes_ZerokamiRomDesc[] = { + { "Zero the Kamikaze Squirrel (U)(1994)(Sunsoft).sfc", 2097152, 0x5397d5bc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zerokami) +STD_ROM_FN(snes_Zerokami) + +struct BurnDriver BurnDrvsnes_Zerokami = { + "snes_zerokami", NULL, NULL, NULL, "1994", + "Zero the Kamikaze Squirrel (USA)\0", NULL, "Sunsoft", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ZerokamiRomInfo, snes_ZerokamiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zig Zag Cat - Dachou Club mo Oosawagi da (Japan) + +static struct BurnRomInfo snes_ZigzagcatjRomDesc[] = { + { "Zig Zag Cat - Dachou Club mo Oosawagi da (J)(1994)(Den'Z).sfc", 1572864, 0x53554d5e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zigzagcatj) +STD_ROM_FN(snes_Zigzagcatj) + +struct BurnDriver BurnDrvsnes_Zigzagcatj = { + "snes_zigzagcatj", NULL, NULL, NULL, "1994", + "Zig Zag Cat - Dachou Club mo Oosawagi da (Japan)\0", NULL, "Den'Z", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_BREAKOUT | GBF_ADV, 0, + SNESGetZipName, snes_ZigzagcatjRomInfo, snes_ZigzagcatjRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zombies Ate My Neighbors (USA) + +static struct BurnRomInfo snes_ZombiesRomDesc[] = { + { "Zombies Ate My Neighbors (U)(1993)(Konami - LucasArts).sfc", 1048576, 0x7cfc0c7c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zombies) +STD_ROM_FN(snes_Zombies) + +struct BurnDriver BurnDrvsnes_Zombies = { + "snes_zombies", NULL, NULL, NULL, "1993", + "Zombies Ate My Neighbors (USA)\0", NULL, "Konami - LucasArts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_ZombiesRomInfo, snes_ZombiesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zool - Ninja of the Nth Dimension (USA) + +static struct BurnRomInfo snes_ZoolRomDesc[] = { + { "Zool - Ninja of the Nth Dimension (U)(1993)(GameTek - Gremlin Graphics).sfc", 1048576, 0x3c10daf1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zool) +STD_ROM_FN(snes_Zool) + +struct BurnDriver BurnDrvsnes_Zool = { + "snes_zool", NULL, NULL, NULL, "1993", + "Zool - Ninja of the Nth Dimension (USA)\0", NULL, "GameTek - Gremlin Graphics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ZoolRomInfo, snes_ZoolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zool no Yume Bouken (Japan) + +static struct BurnRomInfo snes_ZooljRomDesc[] = { + { "Zool no Yume Bouken (J)(1993)(Infocom - Gremlin Graphics).sfc", 1048576, 0x5c2a701d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zoolj) +STD_ROM_FN(snes_Zoolj) + +struct BurnDriver BurnDrvsnes_Zoolj = { + "snes_zoolj", "snes_zool", NULL, NULL, "1993", + "Zool no Yume Bouken (Japan)\0", NULL, "Infocom - Gremlin Graphics", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_ZooljRomInfo, snes_ZooljRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Zoop (USA) + +static struct BurnRomInfo snes_ZoopRomDesc[] = { + { "Zoop (1995)(Viacom New Media).sfc", 524288, 0x06f0e94c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zoop) +STD_ROM_FN(snes_Zoop) + +struct BurnDriver BurnDrvsnes_Zoop = { + "snes_zoop", NULL, NULL, NULL, "1995", + "Zoop (USA)\0", NULL, "Viacom New Media", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_ZoopRomInfo, snes_ZoopRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + + +// ---------------------------------------- +// Aftermarkets/Homebrews/Improvement Hacks +// ---------------------------------------- + + +// 7th Saga, The - Redux (Hack, v3.0) +// https://www.romhacking.net/hacks/421/ +static struct BurnRomInfo snes_7thsagardxRomDesc[] = { + { "7th Saga Redux v3.0 (2013)(Nati).sfc", 1573376, 0xf1c28ef4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_7thsagardx) +STD_ROM_FN(snes_7thsagardx) + +struct BurnDriver BurnDrvsnes_7thsagardx = { + "snes_7thsagardx", "snes_7thsaga", NULL, NULL, "2013", + "7th Saga, The - Redux (Hack, v3.0)\0", NULL, "Nati", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_7thsagardxRomInfo, snes_7thsagardxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 2048 (HB) + +static struct BurnRomInfo snes_2048RomDesc[] = { + { "2048 (2014)(Alekmaul).sfc", 262144, 0xe155d6f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_2048) +STD_ROM_FN(snes_2048) + +struct BurnDriver BurnDrvsnes_2048 = { + "snes_2048", NULL, NULL, NULL, "2014", + "2048 (HB)\0", NULL, "Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_2048RomInfo, snes_2048RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// 4096 (HB) + +static struct BurnRomInfo snes_4096RomDesc[] = { + { "4096 (2015)(e-nost).sfc", 262144, 0xdd073c4b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_4096) +STD_ROM_FN(snes_4096) + +struct BurnDriver BurnDrvsnes_4096 = { + "snes_4096", NULL, NULL, NULL, "2015", + "4096 (HB)\0", NULL, "e-nost", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_4096RomInfo, snes_4096RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alien Cat 2 Enhanced Edition (HB, v1.1) + +static struct BurnRomInfo snes_Aliencat2RomDesc[] = { + { "Alien Cat 2 Enhanced Edition v1.1 (2024)(PSCD Games).sfc", 1048576, 0xe559df41, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Aliencat2) +STD_ROM_FN(snes_Aliencat2) + +struct BurnDriver BurnDrvsnes_Aliencat2 = { + "snes_aliencat2", NULL, NULL, NULL, "2024", + "Alien Cat 2 Enhanced Edition (HB, v1.1)\0", NULL, "PSCD Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Aliencat2RomInfo, snes_Aliencat2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Alpha Sphere Director Cut (GlobalHack, v1.0.2) + +static struct BurnRomInfo snes_AlphaspheredcRomDesc[] = { + { "Alpha Sphere Director Cut v1.0.2 (2021)(Daizo Dee Von).sfc", 2097152, 0xa3736cfe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Alphaspheredc) +STD_ROM_FN(snes_Alphaspheredc) + +struct BurnDriver BurnDrvsnes_Alphaspheredc = { + "snes_alphaspheredc", NULL, NULL, NULL, "2021", + "Alpha Sphere Director Cut (GlobalHack, v1.0.2)\0", NULL, "Daizo Dee Von", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_AlphaspheredcRomInfo, snes_AlphaspheredcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Apocalypse II (Euro) (Piko) + +static struct BurnRomInfo snes_Apocalypse2pikoRomDesc[] = { + { "Apocalypse II (E)(2015)(Piko Interactive).sfc", 1048576, 0xc2204105, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Apocalypse2piko) +STD_ROM_FN(snes_Apocalypse2piko) + +struct BurnDriver BurnDrvsnes_Apocalypse2piko = { + "snes_apocalypse2piko", "snes_apocalypse2proto", NULL, NULL, "2015", + "Apocalypse II (Euro) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 4, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_Apocalypse2pikoRomInfo, snes_Apocalypse2pikoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Arcana - Seal of Rimsala (Hack, v3.0) +// https://www.romhacking.net/hacks/4505/ +static struct BurnRomInfo snes_ArcanasorRomDesc[] = { + { "Arcana - Seal of Rimsala v3.0 (2024)(Sarah Shinespark).sfc", 2097152, 0xd8f4e882, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Arcanasor) +STD_ROM_FN(snes_Arcanasor) + +struct BurnDriver BurnDrvsnes_Arcanasor = { + "snes_arcanasor", "snes_arcana", NULL, NULL, "2024", + "Arcana - Seal of Rimsala (Hack, v3.0)\0", NULL, "Sarah Shinespark", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_MAZE | GBF_RPG, 0, + SNESGetZipName, snes_ArcanasorRomInfo, snes_ArcanasorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// AstroHawk (HB) + +static struct BurnRomInfo snes_AstrohawkRomDesc[] = { + { "AstroHawk (2013)(Piko Interactive).sfc", 786432, 0x183e3bbf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Astrohawk) +STD_ROM_FN(snes_Astrohawk) + +struct BurnDriver BurnDrvsnes_Astrohawk = { + "snes_astrohawk", NULL, NULL, NULL, "2013", + "AstroHawk (HB)\0", "NB: title screen 'black', press 'start' button to begin a game session", "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_AstrohawkRomInfo, snes_AstrohawkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Attack of the PETSCII Robots (HB) + +static struct BurnRomInfo snes_AtkpetsciiRomDesc[] = { + { "Attack of the PETSCII Robots (2023)(Govak Lamesi).sfc", 524288, 0x5f48a248, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Atkpetscii) +STD_ROM_FN(snes_Atkpetscii) + +struct BurnDriver BurnDrvsnes_Atkpetscii = { + "snes_atkpetscii", NULL, NULL, NULL, "2023", + "Attack of the PETSCII Robots (HB)\0", NULL, "Govak Lamesi", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION | GBF_STRATEGY, 0, + SNESGetZipName, snes_AtkpetsciiRomInfo, snes_AtkpetsciiRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Blow'em Out (HB) + +static struct BurnRomInfo snes_BlowemoutRomDesc[] = { + { "Blow'em Out (2016)(Second Dimension).sfc", 131072, 0xffc7e9d3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Blowemout) +STD_ROM_FN(snes_Blowemout) + +struct BurnDriver BurnDrvsnes_Blowemout = { + "snes_blowemout", NULL, NULL, NULL, "2016", + "Blow'em Out (HB)\0", NULL, "Second Dimension", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_BlowemoutRomInfo, snes_BlowemoutRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire II Maeson (Hack, v1.06) +// https://www.romhacking.net/hacks/3272/ +static struct BurnRomInfo snes_Bof2maesonRomDesc[] = { + { "Breath of Fire II Maeson v1.06 (2023)(Maeson).sfc", 3684480, 0xd7c7b721, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bof2maeson) +STD_ROM_FN(snes_Bof2maeson) + +struct BurnDriver BurnDrvsnes_Bof2maeson = { + "snes_bof2maeson", "snes_bof2", NULL, NULL, "2023", + "Breath of Fire II Maeson (Hack, v1.06)\0", NULL, "Maeson", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Bof2maesonRomInfo, snes_Bof2maesonRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire Definitive Edition (Hack, v2.0) +// https://www.romhacking.net/hacks/7597/ +static struct BurnRomInfo snes_BofdeRomDesc[] = { + { "Breath of Fire Definitive Edition v2.0 (2023)(ThegreatBen).sfc", 2097152, 0x80086171, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bofde) +STD_ROM_FN(snes_Bofde) + +struct BurnDriver BurnDrvsnes_Bofde = { + "snes_bofde", "snes_bof", NULL, NULL, "2023", + "Breath of Fire Definitive Edition (Hack, v2.0)\0", NULL, "ThegreatBen", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_BofdeRomInfo, snes_BofdeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Breath of Fire - War of the Goddess (Hack, v1.06) +// https://www.romhacking.net/hacks/6611/ +static struct BurnRomInfo snes_BofwofgRomDesc[] = { + { "Breath of Fire - War of the Goddess v1.06 (2024)(FlamePurge).sfc", 2097152, 0x3dc098be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bofwofg) +STD_ROM_FN(snes_Bofwofg) + +struct BurnDriver BurnDrvsnes_Bofwofg = { + "snes_bofwofg", "snes_bof", NULL, NULL, "2024", + "Breath of Fire - War of the Goddess (Hack, v1.06)\0", NULL, "FlamePurge", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_BofwofgRomInfo, snes_BofwofgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Bust-A-Move - Bust-A-Move '99 Levels (Hack) +// https://www.romhacking.net/hacks/8325/ +static struct BurnRomInfo snes_Bustamoveh99RomDesc[] = { + { "Bust-A-Move - Bust-A-Move '99 Levels (2023)(English1stud).sfc", 524288, 0x02314d75, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Bustamoveh99) +STD_ROM_FN(snes_Bustamoveh99) + +struct BurnDriver BurnDrvsnes_Bustamoveh99 = { + "snes_bustamoveh99", "snes_bustamove", NULL, NULL, "2023", + "Bust-A-Move - Bust-A-Move '99 Levels (Hack)\0", NULL, "English1stud", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_Bustamoveh99RomInfo, snes_Bustamoveh99RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Chips Challenge (HB) + +static struct BurnRomInfo snes_ChipschlgRomDesc[] = { + { "Chips Challenge (2020)(Alekmaul).sfc", 1048576, 0xce7cd57f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Chipschlg) +STD_ROM_FN(snes_Chipschlg) + +struct BurnDriver BurnDrvsnes_Chipschlg = { + "snes_chipschlg", NULL, NULL, NULL, "2020", + "Chips Challenge (HB)\0", NULL, "Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_ChipschlgRomInfo, snes_ChipschlgRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Classic Kong Complete (HB, v2.01) + +static struct BurnRomInfo snes_ClassickongRomDesc[] = { + { "Classic Kong Complete v2.01 (2012)(Bubblezap).sfc", 262144, 0x8fa368be, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Classickong) +STD_ROM_FN(snes_Classickong) + +struct BurnDriver BurnDrvsnes_Classickong = { + "snes_classickong", NULL, NULL, NULL, "2012-14", + "Classic Kong Complete (HB, v2.01)\0", NULL, "Bubblezap", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_ClassickongRomInfo, snes_ClassickongRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Contra III - The Alien Wars SA-1 (Hack, v1.2) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Contra-III +static struct BurnRomInfo snes_Contraiiisa1RomDesc[] = { + { "Contra III - The Alien Wars SA-1 v1.2 (2022)(Vitor Vilela).sfc", 1048576, 0xff3ee176, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Contraiiisa1) +STD_ROM_FN(snes_Contraiiisa1) + +struct BurnDriver BurnDrvsnes_Contraiiisa1 = { + "snes_contraiiisa1", "snes_contraiii", NULL, NULL, "2022", + "Contra III - The Alien Wars SA-1 (Hack, v1.2)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM | GBF_RUNGUN, 0, + SNESGetZipName, snes_Contraiiisa1RomInfo, snes_Contraiiisa1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Corn Buster (Euro) (Piko) + +static struct BurnRomInfo snes_CornbustpikoRomDesc[] = { + { "Corn Buster (E)(2015)(Piko Interactive).sfc", 2097152, 0xc380ff4a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cornbustpiko) +STD_ROM_FN(snes_Cornbustpiko) + +struct BurnDriver BurnDrvsnes_Cornbustpiko = { + "snes_cornbustpiko", "snes_cornbustproto", NULL, NULL, "2015", + "Corn Buster (Euro) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_CornbustpikoRomInfo, snes_CornbustpikoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Cosmo Gang - The Puzzle - Double Rotation (Hack) +// https://www.romhacking.net/hacks/8158/ +static struct BurnRomInfo snes_CosmogangpzlhRomDesc[] = { + { "Cosmo Gang - The Puzzle - Double Rotation Hack (2023)(bankbank).sfc", 524288, 0x524ee83b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Cosmogangpzlh) +STD_ROM_FN(snes_Cosmogangpzlh) + +struct BurnDriver BurnDrvsnes_Cosmogangpzlh = { + "snes_cosmogangpzlh", "snes_cosmogangpzlj", NULL, NULL, "2023", + "Cosmo Gang - The Puzzle - Double Rotation (Hack)\0", NULL, "bankbank", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_CosmogangpzlhRomInfo, snes_CosmogangpzlhRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Creepy Bird (HB, v1.02) + +static struct BurnRomInfo snes_CreepybirdRomDesc[] = { + { "Creepy Bird v1.02 (2014)(Piko Interactive).sfc", 262144, 0x707c5e8b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Creepybird) +STD_ROM_FN(snes_Creepybird) + +struct BurnDriver BurnDrvsnes_Creepybird = { + "snes_creepybird", NULL, NULL, NULL, "2014", + "Creepy Bird (HB, v1.02)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_CreepybirdRomInfo, snes_CreepybirdRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Deflektor (HB, v1.1) + +static struct BurnRomInfo snes_DeflektorRomDesc[] = { + { "Deflektor v1.1 (2019)(Alekmaul).sfc", 524288, 0x5a1f9d11, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Deflektor) +STD_ROM_FN(snes_Deflektor) + +struct BurnDriver BurnDrvsnes_Deflektor = { + "snes_deflektor", NULL, NULL, NULL, "2019", + "Deflektor (HB, v1.1)\0", NULL, "Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_DeflektorRomInfo, snes_DeflektorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 400, 4, 3 +}; + +// Dorke & Ymp (USA) (Piko) + +static struct BurnRomInfo snes_DorkeympRomDesc[] = { + { "Dorke & Ymp (2014)(Piko Interactive).sfc", 4194304, 0xc3fa8238, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dorkeymp) +STD_ROM_FN(snes_Dorkeymp) + +struct BurnDriver BurnDrvsnes_Dorkeymp = { + "snes_dorkeymp", NULL, NULL, NULL, "2014", + "Dorke & Ymp (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DorkeympRomInfo, snes_DorkeympRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dottie dreads nought (HB, v1.1) + +static struct BurnRomInfo snes_DottiedredsRomDesc[] = { + { "Dottie Dreads Nought v1.1 (2021)(Goldlocke).sfc", 1048576, 0x94afc86d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dottiedreds) +STD_ROM_FN(snes_Dottiedreds) + +struct BurnDriver BurnDrvsnes_Dottiedreds = { + "snes_dottiedreds", NULL, NULL, NULL, "2021", + "Dottie dreads nought (HB, v1.1)\0", NULL, "Goldlocke", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_DottiedredsRomInfo, snes_DottiedredsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Dottie Flowers (HB) + +static struct BurnRomInfo snes_DottieflowersRomDesc[] = { + { "Dottie Flowers (2023)(Goldlocke).sfc", 1048576, 0x14172273, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Dottieflowers) +STD_ROM_FN(snes_Dottieflowers) + +struct BurnDriver BurnDrvsnes_Dottieflowers = { + "snes_dottieflowers", NULL, NULL, NULL, "2023", + "Dottie Flowers (HB)\0", NULL, "Goldlocke", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_DottieflowersRomInfo, snes_DottieflowersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Eek! The Cat - Color Enhancement (Hack) +// https://www.romhacking.net/hacks/6336/ +static struct BurnRomInfo snes_EekcatceRomDesc[] = { + { "Eek! The Cat - Color Enhancement (2023)(Mister Man).sfc", 1048576, 0x2328b899, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Eekcatce) +STD_ROM_FN(snes_Eekcatce) + +struct BurnDriver BurnDrvsnes_Eekcatce = { + "snes_eekcatce", "snes_eekcat", NULL, NULL, "2023", + "Eek! The Cat - Color Enhancement (Hack)\0", NULL, "Mister Man", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_EekcatceRomInfo, snes_EekcatceRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Eyra the Crow Maiden (HB) + +static struct BurnRomInfo snes_EyraRomDesc[] = { + { "Eyra the Crow Maiden (2022-23)(Second Dimension).sfc", 2097152, 0x891c5bad, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Eyra) +STD_ROM_FN(snes_Eyra) + +struct BurnDriver BurnDrvsnes_Eyra = { + "snes_eyra", NULL, NULL, NULL, "2022-23", + "Eyra the Crow Maiden (HB)\0", NULL, "Second Dimension", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_EyraRomInfo, snes_EyraRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy V - FF5R (Hack,v1.4, English v1.0c) +// https://www.romhacking.net/hacks/1408/ +// https://www.romhacking.net/hacks/7972/ +static struct BurnRomInfo snes_Ff5rteRomDesc[] = { + { "Final Fantasy V - FF5R v1.4 - T-Eng v1.0c (2020)(s8fp98fd5k, Serity).sfc", 3145728, 0xd4b23e7e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ff5rte) +STD_ROM_FN(snes_Ff5rte) + +struct BurnDriver BurnDrvsnes_Ff5rte = { + "snes_ff5rte", "snes_finalfantvte", NULL, NULL, "2020", + "Final Fantasy V - FF5R (Hack,v1.4, English v1.0c)\0", NULL, "s8fp98fd5k (FF5R), Serity (T-Eng)", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ff5rteRomInfo, snes_Ff5rteRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy VI Reimagined (Hack) +// https://www.ff6hacking.com/forums/thread-4416.html +static struct BurnRomInfo snes_Ff6rmdRomDesc[] = { + { "Final Fantasy VI Reimagined (2024)(DrakeyC).sfc", 4194304, 0xb1148ddf, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ff6rmd) +STD_ROM_FN(snes_Ff6rmd) + +struct BurnDriver BurnDrvsnes_Ff6rmd = { + "snes_ff6rmd", "snes_finalfantiii", NULL, NULL, "2024", + "Final Fantasy VI Reimagined (Hack)\0", NULL, "DrakeyC", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ff6rmdRomInfo, snes_Ff6rmdRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy VI: A Soldier's Contingency (Hack, v2.01) +// https://romhackplaza.org/romhacks/final-fantasy-vi-a-soldiers-contingency-extended-bestiary-edition-snes/ +static struct BurnRomInfo snes_Ff6scRomDesc[] = { + { "Final Fantasy VI - A Soldier's Contingency (Extended Bestiary Edition) v2.01 (2024)(Lightning Hunter).sfc", 6291456, 0xfd1a4f8b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ff6sc) +STD_ROM_FN(snes_Ff6sc) + +struct BurnDriver BurnDrvsnes_Ff6sc = { + "snes_ff6sc", "snes_finalfantiii", NULL, NULL, "2024", + "Final Fantasy VI: A Soldier's Contingency (Hack, v2.01)\0", "(Extended Bestiary Edition)", "Lightning Hunter", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ff6scRomInfo, snes_Ff6scRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy VI - T-Edition (Hack v2.9, English v1.1) +// https://www.romhacking.net/hacks/6339/ +static struct BurnRomInfo snes_Ff6teRomDesc[] = { + { "Final Fantasy VI - T-Edition v2.9 - T-Eng v1.1 (2017-2021)(Tomato).sfc", 6291456, 0x966cf93c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ff6te) +STD_ROM_FN(snes_Ff6te) + +struct BurnDriver BurnDrvsnes_Ff6te = { + "snes_ff6te", "snes_finalfantiii", NULL, NULL, "2017-2021", + "Final Fantasy VI - T-Edition (Hack v2.9, English v1.1)\0", NULL, "Tomato", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Ff6teRomInfo, snes_Ff6teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Final Fantasy IV - Ultima (Hack, v2022-rev25c) +// https://www.romhacking.net/hacks/4134/ +static struct BurnRomInfo snes_FinalfantivultRomDesc[] = { + { "Final Fantasy IV - Ultima v2022-rev25c (2023)(8-bit fan).sfc", 2097152, 0x1a13a227, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Finalfantivult) +STD_ROM_FN(snes_Finalfantivult) + +struct BurnDriver BurnDrvsnes_Finalfantivult = { + "snes_finalfantivult", "snes_finalfantii", NULL, NULL, "2023", + "Final Fantasy IV - Ultima (Hack, v2022-rev25c)\0", NULL, "8-bit fan", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FinalfantivultRomInfo, snes_FinalfantivultRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Fork Parker's Crunch Out (HB) + +static struct BurnRomInfo snes_ForkparkerRomDesc[] = { + { "Fork Parker's Crunch Out (2018)(Mega Cat Studios).sfc", 2097152, 0x1ccccc6e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Forkparker) +STD_ROM_FN(snes_Forkparker) + +struct BurnDriver BurnDrvsnes_Forkparker = { + "snes_forkparker", NULL, NULL, NULL, "2018", + "Fork Parker's Crunch Out (HB)\0", NULL, "Mega Cat Studios", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_ForkparkerRomInfo, snes_ForkparkerRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// FrogNes (Euro) (HB) + +static struct BurnRomInfo snes_FrognesRomDesc[] = { + { "FrogNes (1996)(Insomnya).sfc", 851968, 0x2ba40b80, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Frognes) +STD_ROM_FN(snes_Frognes) + +struct BurnDriver BurnDrvsnes_Frognes = { + "snes_frognes", NULL, NULL, NULL, "1996", + "FrogNes (Euro) (HB)\0", NULL, "Insomnya", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_FrognesRomInfo, snes_FrognesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Frue Lufia (Hack, v7.0) +// https://www.romhacking.net/hacks/4129/ +static struct BurnRomInfo snes_FruelufiaRomDesc[] = { + { "Frue Lufia v7.0 (2024)(Artemis).sfc", 4194304, 0xc114c2ea, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Fruelufia) +STD_ROM_FN(snes_Fruelufia) + +struct BurnDriver BurnDrvsnes_Fruelufia = { + "snes_fruelufia", "snes_lufia2", NULL, NULL, "2024", + "Frue Lufia (Hack, v7.0)\0", NULL, "Artemis", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_FruelufiaRomInfo, snes_FruelufiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ghost Chaser Densei - Brightness Fix (Hack) +// https://www.romhacking.net/hacks/8229/ +static struct BurnRomInfo snes_GcdenseibfRomDesc[] = { + { "Ghost Chaser Densei - Brightness Fix (2023)(Mister Man).sfc", 2097152, 0xff1c3c53, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gcdenseibf) +STD_ROM_FN(snes_Gcdenseibf) + +struct BurnDriver BurnDrvsnes_Gcdenseibf = { + "snes_gcdenseibf", "snes_gcdenseij", NULL, NULL, "2023", + "Ghost Chaser Densei - Brightness Fix (Hack)\0", NULL, "Mister Man", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_GcdenseibfRomInfo, snes_GcdenseibfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Goomba Break Out (HB, v1.3) + +static struct BurnRomInfo snes_GoombaRomDesc[] = { + { "Goomba Break Out v1.3 (2024)(BriG78).sfc", 262144, 0x56817acc, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Goomba) +STD_ROM_FN(snes_Goomba) + +struct BurnDriver BurnDrvsnes_Goomba = { + "snes_goomba", NULL, NULL, NULL, "2024", + "Goomba Break Out (HB, v1.3)\0", NULL, "BriG78", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_BREAKOUT, 0, + SNESGetZipName, snes_GoombaRomInfo, snes_GoombaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gourmet Warriors (USA) (Piko) + +static struct BurnRomInfo snes_GourmetpikoRomDesc[] = { + { "Gourmet Warriors (U)(2018)(Piko Interactive).sfc", 2621440, 0x690a9540, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gourmetpiko) +STD_ROM_FN(snes_Gourmetpiko) + +struct BurnDriver BurnDrvsnes_Gourmetpiko = { + "snes_gourmetpiko", NULL, NULL, NULL, "1995-2018", + "Gourmet Warriors (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_GourmetpikoRomInfo, snes_GourmetpikoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gradius III SA-1 (USA) (Hack, v1.7) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Gradius-III +static struct BurnRomInfo snes_Gradius3sa1RomDesc[] = { + { "Gradius III (U) SA-1 v1.7 (2022)(Vitor Vilela).sfc", 524288, 0x0317bdb2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gradius3sa1) +STD_ROM_FN(snes_Gradius3sa1) + +struct BurnDriver BurnDrvsnes_Gradius3sa1 = { + "snes_gradius3sa1", "snes_gradius3", NULL, NULL, "2022", + "Gradius III SA-1 (USA) (Hack, v1.7)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Gradius3sa1RomInfo, snes_Gradius3sa1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Gradius III SA-1 (Japan) (Hack, v1.7) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Gradius-III +static struct BurnRomInfo snes_Gradius3sa1jRomDesc[] = { + { "Gradius III (J) SA-1 v1.7 (2022)(Vitor Vilela).sfc", 524288, 0x7c2e0613, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Gradius3sa1j) +STD_ROM_FN(snes_Gradius3sa1j) + +struct BurnDriver BurnDrvsnes_Gradius3sa1j = { + "snes_gradius3sa1j", "snes_gradius3", NULL, NULL, "2022", + "Gradius III SA-1 (Japan) (Hack, v1.7)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Gradius3sa1jRomInfo, snes_Gradius3sa1jRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hebereke's Popoitto Restoration (Hack) + +static struct BurnRomInfo snes_HeberekeprRomDesc[] = { + { "Hebereke's Popoitto Restoration (2024)(Ryu).sfc", 524288, 0x5f082016, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Heberekepr) +STD_ROM_FN(snes_Heberekepr) + +struct BurnDriver BurnDrvsnes_Heberekepr = { + "snes_heberekepr", "snes_heberekep", NULL, NULL, "2024", + "Hebereke's Popoitto Restoration (Hack)\0", NULL, "Ryu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_HeberekeprRomInfo, snes_HeberekeprRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hind Strike (HB) + +static struct BurnRomInfo snes_HindstrikeRomDesc[] = { + { "Hind Strike (2015)(Bubblezap).sfc", 1048576, 0x027bd1d9, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Hindstrike, snes_Hindstrike, snes_dsp1) +STD_ROM_FN(snes_Hindstrike) + +struct BurnDriver BurnDrvsnes_Hindstrike = { + "snes_hindstrike", NULL, "snes_dsp1", NULL, "2015", + "Hind Strike (HB)\0", "DSP-1 enhancement chip", "Bubblezap", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_SHOOT, 0, + SNESGetZipName, snes_HindstrikeRomInfo, snes_HindstrikeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Hyper Metroid (Hack) +// https://www.romhacking.net/hacks/3038/ +static struct BurnRomInfo snes_HypermetroidRomDesc[] = { + { "Hyper Metroid (2015)(RealRed).sfc", 4194304, 0xd4d38230, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Hypermetroid) +STD_ROM_FN(snes_Hypermetroid) + +struct BurnDriver BurnDrvsnes_Hypermetroid = { + "snes_hypermetroid", "snes_supermetroid", NULL, NULL, "2015", + "Hyper Metroid (Hack)\0", NULL, "RealRed", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_HypermetroidRomInfo, snes_HypermetroidRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Iron Commando (USA) (Piko) + +static struct BurnRomInfo snes_IroncdopkRomDesc[] = { + { "Iron Commando (U)(2015)(Piko Interactive).sfc", 2097152, 0x2d911b58, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ironcdopk) +STD_ROM_FN(snes_Ironcdopk) + +struct BurnDriver BurnDrvsnes_Ironcdopk = { + "snes_ironcdopk", "snes_ironcdope", NULL, NULL, "2015", + "Iron Commando (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_IroncdopkRomInfo, snes_IroncdopkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jester (HB) + +static struct BurnRomInfo snes_JesterRomDesc[] = { + { "Jester (2023)(CollectorVision).sfc", 1048576, 0x3cae6b7b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jester) +STD_ROM_FN(snes_Jester) + +struct BurnDriver BurnDrvsnes_Jester = { + "snes_jester", NULL, NULL, NULL, "2023", + "Jester (HB)\0", NULL, "CollectorVision - Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION | GBF_MAZE, 0, + SNESGetZipName, snes_JesterRomInfo, snes_JesterRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jet Pilot Rising (HB, v1.1) + +static struct BurnRomInfo snes_JetprisingRomDesc[] = { + { "Jet Pilot Rising v1.1 (2018)(d4s).sfc", 524288, 0x23507977, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jetprising) +STD_ROM_FN(snes_Jetprising) + +struct BurnDriver BurnDrvsnes_Jetprising = { + "snes_jetprising", NULL, NULL, NULL, "2018", + "Jet Pilot Rising (HB, v1.1)\0", NULL, "d4s", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_JetprisingRomInfo, snes_JetprisingRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Jim Power - The Lost Dimension in 3D 'Enhanced Edition' (USA) + +static struct BurnRomInfo snes_JimpowereeRomDesc[] = { + { "Jim Power - The Lost Dimension in 3D Enhanced Edition (U)(2015)(Piko Interactive).sfc", 2097152, 0xd2a2aea0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Jimpoweree) +STD_ROM_FN(snes_Jimpoweree) + +struct BurnDriver BurnDrvsnes_Jimpoweree = { + "snes_jimpoweree", "snes_jimpower", NULL, NULL, "2015", + "Jim Power - The Lost Dimension in 3D 'Enhanced Edition' (USA)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_HORSHOOT | GBF_PLATFORM, 0, + SNESGetZipName, snes_JimpowereeRomInfo, snes_JimpowereeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - 18 Hours Past (Hack, v1.11) +// https://www.romhacking.net/hacks/7732/ +static struct BurnRomInfo snes_Legendofzelda18hpRomDesc[] = { + { "Legend of Zelda, The - 18 Hours Past v1.11 (2024)(Letterbomb).sfc", 2097152, 0x45d6950f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzelda18hp) +STD_ROM_FN(snes_Legendofzelda18hp) + +struct BurnDriver BurnDrvsnes_Legendofzelda18hp = { + "snes_legendofzelda18hp", "snes_legendofzelda", NULL, NULL, "2024", + "Legend of Zelda, The - 18 Hours Past (Hack, v1.11)\0", NULL, "Letterbomb", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_Legendofzelda18hpRomInfo, snes_Legendofzelda18hpRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - Parallel Worlds (Hack, v1.23) +// https://www.romhacking.net/hacks/197/ +static struct BurnRomInfo snes_LegendofzeldapwRomDesc[] = { + { "Legend of Zelda, The - Parallel Worlds v1.23 (2016-17)(Euclid, SePH).sfc", 2097152, 0xddd61cbe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzeldapw) +STD_ROM_FN(snes_Legendofzeldapw) + +struct BurnDriver BurnDrvsnes_Legendofzeldapw = { + "snes_legendofzeldapw", "snes_legendofzelda", NULL, NULL, "2016-17", + "Legend of Zelda, The - Parallel Worlds (Hack, v1.23)\0", NULL, "Euclid, SePH", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldapwRomInfo, snes_LegendofzeldapwRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Legend of Zelda, The - A Link to the Past Redux (Hack, v10.2.3) +// https://www.romhacking.net/hacks/2594/ +static struct BurnRomInfo snes_LegendofzeldardxRomDesc[] = { + { "Legend of Zelda, The - A Link to the Past Redux v10.2.3 (2024)(ShadowOne333).sfc", 2097152, 0xb0b544c1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Legendofzeldardx) +STD_ROM_FN(snes_Legendofzeldardx) + +struct BurnDriver BurnDrvsnes_Legendofzeldardx = { + "snes_legendofzeldardx", "snes_legendofzelda", NULL, NULL, "2024", + "Legend of Zelda, The - A Link to the Past Redux (Hack, v10.2.3)\0", NULL, "ShadowOne333", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_ACTION | GBF_ADV, 0, + SNESGetZipName, snes_LegendofzeldardxRomInfo, snes_LegendofzeldardxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Little Medusa (HB) + +static struct BurnRomInfo snes_LittlemedusaRomDesc[] = { + { "Little Medusa (2018)(Mega Cat Studios).sfc", 2097152, 0xcc295189, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Littlemedusa) +STD_ROM_FN(snes_Littlemedusa) + +struct BurnDriver BurnDrvsnes_Littlemedusa = { + "snes_littlemedusa", NULL, NULL, NULL, "2018", + "Little Medusa (HB)\0", NULL, "Mega Cat Studios", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_LittlemedusaRomInfo, snes_LittlemedusaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Lizard (NES2SNES) (HB) + +static struct BurnRomInfo snes_LizardRomDesc[] = { + { "Lizard NES2SNES (2022)(rainwarrior).sfc", 557056, 0x34ee7436, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Lizard) +STD_ROM_FN(snes_Lizard) + +struct BurnDriver BurnDrvsnes_Lizard = { + "snes_lizard", NULL, NULL, NULL, "2022", + "Lizard (NES2SNES) (HB)\0", NULL, "rainwarrior", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_LizardRomInfo, snes_LizardRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// MazezaM Challenge DX (HB, v2.1) + +static struct BurnRomInfo snes_MazedxRomDesc[] = { + { "MazezaM DX v2.1 (2020)(Alekmaul).sfc", 524288, 0xf5a916c4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mazedx) +STD_ROM_FN(snes_Mazedx) + +struct BurnDriver BurnDrvsnes_Mazedx = { + "snes_mazedx", NULL, NULL, NULL, "2020", + "MazezaM Challenge DX (HB, v2.1)\0", NULL, "Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MazedxRomInfo, snes_MazedxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// MazezaM Challenge (HB, v1.2) + +static struct BurnRomInfo snes_MazezamRomDesc[] = { + { "MazezaM Challenge v1.2 (2012)(Alekmaul).sfc", 524288, 0x076ac3fe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mazezam) +STD_ROM_FN(snes_Mazezam) + +struct BurnDriver BurnDrvsnes_Mazezam = { + "snes_mazezam", NULL, NULL, NULL, "2012", + "MazezaM Challenge (HB, v1.2)\0", NULL, "Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_MazezamRomInfo, snes_MazezamRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mega Man X - Project Zero (Hack) +// https://www.romhacking.net/hacks/8167/ +static struct BurnRomInfo snes_MegamanxpzRomDesc[] = { + { "Mega Man X - Project Zero (2023)(CF).sfc", 2097152, 0xa2f2edb8, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megamanxpz) +STD_ROM_FN(snes_Megamanxpz) + +struct BurnDriver BurnDrvsnes_Megamanxpz = { + "snes_megamanxpz", "snes_megamanx", NULL, NULL, "2023", + "Mega Man X - Project Zero (Hack)\0", NULL, "CF", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MegamanxpzRomInfo, snes_MegamanxpzRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Megastalgia - Megaman Edition (GlobalHack) +// https://www.romhacking.net/hacks/8423/ +static struct BurnRomInfo snes_MegastalgiaRomDesc[] = { + { "Megastalgia - Megaman Edition (2024)(Koopenstein).sfc", 2097152, 0xa7dba08f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Megastalgia) +STD_ROM_FN(snes_Megastalgia) + +struct BurnDriver BurnDrvsnes_Megastalgia = { + "snes_megastalgia", NULL, NULL, NULL, "2024", + "Megastalgia - Megaman Edition (GlobalHack)\0", "GlobalHack of Super Mario World", "Koopenstein", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MegastalgiaRomInfo, snes_MegastalgiaRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Micro Mages (NES2SNES) (HB) + +static struct BurnRomInfo snes_MicromagesRomDesc[] = { + { "Micro Mages NES2SNES (2019-24)(Morphcat Games).sfc", 2097152, 0x711da3a0, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Micromages) +STD_ROM_FN(snes_Micromages) + +struct BurnDriver BurnDrvsnes_Micromages = { + "snes_micromages", NULL, NULL, NULL, "2019-24", + "Micro Mages (NES2SNES) (HB)\0", NULL, "Morphcat Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 4, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MicromagesRomInfo, snes_MicromagesRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Micro Mages - Second Quest (NES2SNES) (HB) + +static struct BurnRomInfo snes_Micromages2RomDesc[] = { + { "Micro Mages - Second Quest NES2SNES (2022-24)(Morphcat Games).sfc", 2097152, 0xda8a65e5, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Micromages2) +STD_ROM_FN(snes_Micromages2) + +struct BurnDriver BurnDrvsnes_Micromages2 = { + "snes_micromages2", NULL, NULL, NULL, "2022-24", + "Micro Mages - Second Quest (NES2SNES) (HB)\0", NULL, "Morphcat Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 4, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Micromages2RomInfo, snes_Micromages2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Mortal Kombat - Blood Color Fix (Hack) +// https://www.romhacking.net/hacks/2885/ +static struct BurnRomInfo snes_MkbcfRomDesc[] = { + { "Mortal Kombat Blood Color Fix (2016)(DarkSamus993).sfc", 2097152, 0x6383b31c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mkbcf) +STD_ROM_FN(snes_Mkbcf) + +struct BurnDriver BurnDrvsnes_Mkbcf = { + "snes_mkbcf", "snes_mk", NULL, NULL, "2016", + "Mortal Kombat - Blood Color Fix (Hack)\0", NULL, "DarkSamus993", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_MkbcfRomInfo, snes_MkbcfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mother 2 - Perfect Edition (Hack, v1.5) +// https://www.romhacking.net/hacks/6140/ +static struct BurnRomInfo snes_Mother2peRomDesc[] = { + { "Mother 2 - Perfect Edition v1.5 (2022)(CoolGuyBrendyn).sfc", 4194304, 0x98008d9a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mother2pe) +STD_ROM_FN(snes_Mother2pe) + +struct BurnDriver BurnDrvsnes_Mother2pe = { + "snes_mother2pe", "snes_earthbound", NULL, NULL, "2022", + "Mother 2 - Perfect Edition (Hack, v1.5)\0", NULL, "CoolGuyBrendyn", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RPG, 0, + SNESGetZipName, snes_Mother2peRomInfo, snes_Mother2peRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Moto-X (USA) (Piko) + +static struct BurnRomInfo snes_MotoxRomDesc[] = { + { "Moto-X (2023)(Piko Interactive).sfc", 1048576, 0xdd5332bb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Motox) +STD_ROM_FN(snes_Motox) + +struct BurnDriver BurnDrvsnes_Motox = { + "snes_motox", NULL, NULL, NULL, "2023", + "Moto-X (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_MotoxRomInfo, snes_MotoxRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Bloopy - Saves the World (USA) (Piko) + +static struct BurnRomInfo snes_MrbloopypkRomDesc[] = { + { "Mr. Bloopy - Saves the World (U)(2014)(Piko Interactive).sfc", 2097152, 0x235a86d2, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrbloopypk) +STD_ROM_FN(snes_Mrbloopypk) + +struct BurnDriver BurnDrvsnes_Mrbloopypk = { + "snes_mrbloopypk", "snes_mrbloopyp", NULL, NULL, "2014", + "Mr. Bloopy - Saves the World (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_PUZZLE, 0, + SNESGetZipName, snes_MrbloopypkRomInfo, snes_MrbloopypkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Mr. Tuff (Euro) (TRR) + +static struct BurnRomInfo snes_MrtuffeRomDesc[] = { + { "Mr. Tuff (2024)(The Retro Room).sfc", 2097152, 0x5c8a87b6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Mrtuffe) +STD_ROM_FN(snes_Mrtuffe) + +struct BurnDriver BurnDrvsnes_Mrtuffe = { + "snes_mrtuffe", "snes_mrtuffep", NULL, NULL, "2024", + "Mr. Tuff (Euro) (TRR)\0", NULL, "The Retro Room", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_MrtuffeRomInfo, snes_MrtuffeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Neko Tako (HB) + +static struct BurnRomInfo snes_NekotacoRomDesc[] = { + { "Neko Tako (2019)(PA Games).sfc", 1048576, 0x72bdafbb, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nekotaco) +STD_ROM_FN(snes_Nekotaco) + +struct BurnDriver BurnDrvsnes_Nekotaco = { + "snes_nekotaco", NULL, NULL, NULL, "2019", + "Neko Tako (HB)\0", NULL, "PA Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_NekotacoRomInfo, snes_NekotacoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Nightmare Busters (Euro) (Bug Fix) +// https://www.romhacking.net/hacks/8546/ +static struct BurnRomInfo snes_NightbustbfRomDesc[] = { + { "Nightmare Busters (E)(Bug Fix)(2012-2024)(Super Fighter Team).sfc", 2097152, 0x1cef9982, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Nightbustbf) +STD_ROM_FN(snes_Nightbustbf) + +struct BurnDriver BurnDrvsnes_Nightbustbf = { + "snes_nightbustbf", "snes_nightbust", NULL, NULL, "2012-2024", + "Nightmare Busters (Euro) (Bug Fix)\0", "Bug fix patch by upsilandre", "Super Fighter Team", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_NightbustbfRomInfo, snes_NightbustbfRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Old Towers (HB) + +static struct BurnRomInfo snes_OldtowersRomDesc[] = { + { "Old Towers (2022)(Mega Cat Studios).sfc", 1048576, 0xee38277f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Oldtowers) +STD_ROM_FN(snes_Oldtowers) + +struct BurnDriver BurnDrvsnes_Oldtowers = { + "snes_oldtowers", NULL, NULL, NULL, "2022", + "Old Towers (HB)\0", NULL, "Mega Cat Studios", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_OldtowersRomInfo, snes_OldtowersRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Parodius: Non-Sense Fantasy - Fastrom Fix (Euro, Hack, v1.04) + +static struct BurnRomInfo snes_ParodiuseffRomDesc[] = { + { "Parodius - Non-Sense Fantasy - Fastrom Fix v1.04 (E)(2023)(kandowontu).sfc", 1048576, 0x7fa02b26, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Parodiuseff) +STD_ROM_FN(snes_Parodiuseff) + +struct BurnDriver BurnDrvsnes_Parodiuseff = { + "snes_parodiuseff", "snes_parodiuse", NULL, NULL, "2023", + "Parodius: Non-Sense Fantasy - Fastrom Fix (Euro, Hack, v1.04)\0", NULL, "kandowontu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ParodiuseffRomInfo, snes_ParodiuseffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Parodius Da!: Shinwa kara Owarai e - Fastrom Fix (Japan, Hack) + +static struct BurnRomInfo snes_ParodiusjffRomDesc[] = { + { "Parodius Da! - Shinwa kara Owarai e - Fastrom Fix (J)(2021)(MaxwelOlinda).sfc", 1048576, 0x9554dd02, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Parodiusjff) +STD_ROM_FN(snes_Parodiusjff) + +struct BurnDriver BurnDrvsnes_Parodiusjff = { + "snes_parodiusjff", "snes_parodiuse", NULL, NULL, "2021", + "Parodius Da!: Shinwa kara Owarai e - Fastrom Fix (Japan, Hack)\0", NULL, "MaxwelOlinda", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_ParodiusjffRomInfo, snes_ParodiusjffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Pinkie (Euro) (Piko) + +static struct BurnRomInfo snes_PinkieRomDesc[] = { + { "Pinkie (E)(1995-2015)(Data Design Int. - Piko Int.).sfc", 1048576, 0xd2aa58d3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Pinkie) +STD_ROM_FN(snes_Pinkie) + +struct BurnDriver BurnDrvsnes_Pinkie = { + "snes_pinkie", "snes_pinkieproto", NULL, NULL, "1995-2015", + "Pinkie (Euro) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_PinkieRomInfo, snes_PinkieRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Prince of Persia Restoration (Hack) +// https://www.romhacking.net/hacks/3603/ +static struct BurnRomInfo snes_PrincepersiarRomDesc[] = { + { "Prince of Persia Restoration (2017)(SCD).sfc", 1048576, 0xbb3da37b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Princepersiar) +STD_ROM_FN(snes_Princepersiar) + +struct BurnDriver BurnDrvsnes_Princepersiar = { + "snes_princepersiar", "snes_princepersia", NULL, NULL, "2017", + "Prince of Persia Restoration (Hack)\0", NULL, "SCD", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_PrincepersiarRomInfo, snes_PrincepersiarRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Qwak (CBM2SNES) (HB, v1.3) + +static struct BurnRomInfo snes_QwakRomDesc[] = { + { "Qwak CBM2SNES v1.3 (2022)(Oziphantom).sfc", 262144, 0xcfb44991, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Qwak) +STD_ROM_FN(snes_Qwak) + +struct BurnDriver BurnDrvsnes_Qwak = { + "snes_qwak", NULL, NULL, NULL, "2022", + "Qwak (CBM2SNES) (HB, v1.3)\0", NULL, "Oziphantom", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_QwakRomInfo, snes_QwakRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Race Drivin' SA-1 - Base (Hack, v1.1) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Race-Drivin +static struct BurnRomInfo snes_Racedrivinsa1bRomDesc[] = { + { "Race Drivin' SA-1 - Base v1.1 (2021)(Vitor Vilela).sfc", 524288, 0x23eaa97e, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Racedrivinsa1b) +STD_ROM_FN(snes_Racedrivinsa1b) + +struct BurnDriver BurnDrvsnes_Racedrivinsa1b = { + "snes_racedrivinsa1b", "snes_racedrivin", NULL, NULL, "2021", + "Race Drivin' SA-1 - Base (Hack, v1.1)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Racedrivinsa1bRomInfo, snes_Racedrivinsa1bRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Race Drivin' SA-1 - Origin (Hack, v1.1) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Race-Drivin +static struct BurnRomInfo snes_Racedrivinsa1oRomDesc[] = { + { "Race Drivin' SA-1 - Origin v1.1 (2021)(Vitor Vilela).sfc", 524288, 0xbb42a085, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Racedrivinsa1o) +STD_ROM_FN(snes_Racedrivinsa1o) + +struct BurnDriver BurnDrvsnes_Racedrivinsa1o = { + "snes_racedrivinsa1o", "snes_racedrivin", NULL, NULL, "2021", + "Race Drivin' SA-1 - Origin (Hack, v1.1)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_Racedrivinsa1oRomInfo, snes_Racedrivinsa1oRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Chougi Ranbu Hen (Japan) +// https://romhackplaza.org/romhacks/ranma-1-2-chougi-ranbu-hen-big-framerate-improvement-snes/ +static struct BurnRomInfo snes_Ranmahb2jfrRomDesc[] = { + { "Ranma 1-2 - Chougi Ranbu Hen frameratehack v1.3 (2024)(Upsilandre).sfc", 4194304, 0x71aaff40, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahb2jfr) +STD_ROM_FN(snes_Ranmahb2jfr) + +struct BurnDriver BurnDrvsnes_Ranmahb2jfr = { + "snes_ranmahb2jfr", "snes_ranmahb2te", NULL, NULL, "2024", + "Ranma 1/2 - Chougi Ranbu Hen (Hack, Framerate Imp. v1.3)\0", NULL, "Upsilandre", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ranmahb2jfrRomInfo, snes_Ranmahb2jfrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Ranma 1/2 - Hard Battle II - Super Move Hustle (Hack, English v1.10 + Framerate Imp. v1.3) +// https://www.romhacking.net/translations/3516/ +// https://romhackplaza.org/romhacks/ranma-1-2-chougi-ranbu-hen-big-framerate-improvement-snes/ +static struct BurnRomInfo snes_Ranmahb2tefrRomDesc[] = { + { "Ranma 1-2 - Hard Battle II - Super Move Hustle T-Eng + frameratehack v1.3 (2024)(Upsilandre).sfc", 4194304, 0x4401b68c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Ranmahb2tefr) +STD_ROM_FN(snes_Ranmahb2tefr) + +struct BurnDriver BurnDrvsnes_Ranmahb2tefr = { + "snes_ranmahb2tefr", "snes_ranmahb2te", NULL, NULL, "2024", + "Ranma 1/2 - Hard Battle II - Super Move Hustle (Hack, English v1.10 + Framerate Imp. v1.3)\0", NULL, "Dynamic-Designs - Upsilandre", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_Ranmahb2tefrRomInfo, snes_Ranmahb2tefrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super 3D Noah's Ark (USA) (Piko) + +static struct BurnRomInfo snes_S3dnoaharkpkRomDesc[] = { + { "Super 3D Noah's Ark (U)(2013)(Piko Interactive).sfc", 1048576, 0x2b691ded, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_S3dnoaharkpk) +STD_ROM_FN(snes_S3dnoaharkpk) + +struct BurnDriver BurnDrvsnes_S3dnoaharkpk = { + "snes_s3dnoaharkpk", "snes_s3dnoahark", NULL, NULL, "2013", + "Super 3D Noah's Ark (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_SHOOT | GBF_MAZE, 0, + SNESGetZipName, snes_S3dnoaharkpkRomInfo, snes_S3dnoaharkpkRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Boss Gaiden (HB, v1.2) + +static struct BurnRomInfo snes_SbgaidenRomDesc[] = { + { "Super Boss Gaiden v1.2 (2018)(ChronoMoogle).sfc", 524288, 0xc9a8412d, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sbgaiden) +STD_ROM_FN(snes_Sbgaiden) + +struct BurnDriver BurnDrvsnes_Sbgaiden = { + "snes_sbgaiden", NULL, NULL, NULL, "2018", + "Super Boss Gaiden (HB, v1.2)\0", NULL, "ChronoMoogle", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_SbgaidenRomInfo, snes_SbgaidenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Shockman Zero (Hack, English) +// https://www.romhacking.net/translations/6807/ +static struct BurnRomInfo snes_Shockman0teRomDesc[] = { + { "Shockman Zero T-Eng (2023)(Svambo).sfc", 1572864, 0x75d84c0f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shockman0te) +STD_ROM_FN(snes_Shockman0te) + +struct BurnDriver BurnDrvsnes_Shockman0te = { + "snes_shockman0te", NULL, NULL, NULL, "2023", + "Shockman Zero (Hack, English)\0", NULL, "Svambo", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HACK, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_Shockman0teRomInfo, snes_Shockman0teRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Kaizou Choujin Shubibinman Zero (Japan) + +static struct BurnRomInfo snes_ShubibinmanRomDesc[] = { + { "Kaizou Choujin Shubibinman Zero (J)(1997-2017)(Masaya - Columbus Circle).sfc", 1048576, 0xe59e1096, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Shubibinman) +STD_ROM_FN(snes_Shubibinman) + +struct BurnDriver BurnDrvsnes_Shubibinman = { + "snes_shubibinman", "snes_shockman0te", NULL, NULL, "1997-2017", + "Kaizou Choujin Shubibinman Zero (Japan)\0", NULL, "Masaya Games - Columbus Circle", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_PLATFORM, 0, + SNESGetZipName, snes_ShubibinmanRomInfo, snes_ShubibinmanRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sicari 2 - The Brink of Time (GlobalHack, v1.061) +// https://www.romhacking.net/hacks/6980/ +static struct BurnRomInfo snes_Sicari2RomDesc[] = { + { "Sicari 2 - The Brink of Time v1.061 (2022)(Yukivee).sfc", 4194304, 0x93ae800f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sicari2) +STD_ROM_FN(snes_Sicari2) + +struct BurnDriver BurnDrvsnes_Sicari2 = { + "snes_sicari2", NULL, NULL, NULL, "2022", + "Sicari 2 - The Brink of Time (GlobalHack, v1.061)\0","A complete overhaul of Super Mario World", "Yukivee", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Sicari2RomInfo, snes_Sicari2RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sicari Remastered (GlobalHack, v1.05) +// https://www.romhacking.net/hacks/6323/ +static struct BurnRomInfo snes_SicarirRomDesc[] = { + { "Sicari Remastered v1.05 (2018-21)(Yukivee).sfc", 4194304, 0x1b566b35, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sicarir) +STD_ROM_FN(snes_Sicarir) + +struct BurnDriver BurnDrvsnes_Sicarir = { + "snes_sicarir", NULL, NULL, NULL, "2018-21", + "Sicari Remastered (GlobalHack, v1.05)\0", "A complete overhaul of Super Mario World", "Yukivee", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SicarirRomInfo, snes_SicarirRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Skipp and Friends - Unexpected Journey (HB) + +static struct BurnRomInfo snes_SkippfrdsRomDesc[] = { + { "Skipp and Friends - Unexpected Journey (2013)(Mukunda Johnson).sfc", 1048576, 0xc1c4ac32, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Skippfrds) +STD_ROM_FN(snes_Skippfrds) + +struct BurnDriver BurnDrvsnes_Skippfrds = { + "snes_skippfrds", NULL, NULL, NULL, "2013", + "Skipp and Friends - Unexpected Journey (HB)\0", NULL, "Mukunda Johnson", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION | GBF_PUZZLE, 0, + SNESGetZipName, snes_SkippfrdsRomInfo, snes_SkippfrdsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Socks the Cat Rocks the Hill (USA) (Second Dimension) + +static struct BurnRomInfo snes_SocksthecatRomDesc[] = { + { "Socks the Cat Rocks the Hill (1994-2018)(Kaneko - 2nd Dimension).sfc", 1048576, 0xcac6521f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Socksthecat) +STD_ROM_FN(snes_Socksthecat) + +struct BurnDriver BurnDrvsnes_Socksthecat = { + "snes_socksthecat", NULL, NULL, NULL, "1994-2018", + "Socks the Cat Rocks the Hill (USA) (Second Dimension)\0", NULL, "Kaneko - Second Dimension", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SocksthecatRomInfo, snes_SocksthecatRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Spacegulls (NES2SNES) (HB, v1.1) + +static struct BurnRomInfo snes_SpacegullsRomDesc[] = { + { "Spacegulls v1.1 NES2SNES (2021-24)(Morphcat Games).sfc", 2097152, 0x66fa628f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Spacegulls) +STD_ROM_FN(snes_Spacegulls) + +struct BurnDriver BurnDrvsnes_Spacegulls = { + "snes_spacegulls", NULL, NULL, NULL, "2021-24", + "Spacegulls (NES2SNES) (HB, v1.1)\0", NULL, "Morphcat Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SpacegullsRomInfo, snes_SpacegullsRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Star Keeper (HB) + +static struct BurnRomInfo snes_StarkeeperRomDesc[] = { + { "Star Keeper (2018)(87Arts).sfc", 524288, 0xd925182f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Starkeeper) +STD_ROM_FN(snes_Starkeeper) + +struct BurnDriver BurnDrvsnes_Starkeeper = { + "snes_starkeeper", NULL, NULL, NULL, "2018", + "Star Keeper (HB)\0", NULL, "87Arts", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_StarkeeperRomInfo, snes_StarkeeperRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Steel Talons - Fastrom fix (Hack) +// https://www.patreon.com/posts/steel-talons-fix-79800713 +static struct BurnRomInfo snes_SteeltalonsffRomDesc[] = { + { "Steel Talons - Fastrom fix (2023)(ANONYMOUS).sfc", 524288, 0xdc40be22, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Steeltalonsff) +STD_ROM_FN(snes_Steeltalonsff) + +struct BurnDriver BurnDrvsnes_Steeltalonsff = { + "snes_steeltalonsff", "snes_steeltalons", NULL, NULL, "2023", + "Steel Talons - Fastrom fix (Hack)\0", NULL, "ANONYMOUS", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_SIM | GBF_SHOOT, 0, + SNESGetZipName, snes_SteeltalonsffRomInfo, snes_SteeltalonsffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Stone Protectors (USA) (Piko) + +static struct BurnRomInfo snes_StoneprotpikoRomDesc[] = { + { "Stone Protectors (U)(1994-2022)(Piko Interactive).sfc", 2097152, 0xfeb912e1, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Stoneprotpiko) +STD_ROM_FN(snes_Stoneprotpiko) + +struct BurnDriver BurnDrvsnes_Stoneprotpiko = { + "snes_stoneprotpiko", "snes_stoneprot", NULL, NULL, "1994-2022", + "Stone Protectors (USA) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNES, GBF_SCRFIGHT | GBF_VSFIGHT, 0, + SNESGetZipName, snes_StoneprotpikoRomInfo, snes_StoneprotpikoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Block'em Sock'em (HB) + +static struct BurnRomInfo snes_SupblocksockRomDesc[] = { + { "Super Block'em Sock'em (2023)(Second Dimension).sfc", 2097152, 0xff153921, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supblocksock) +STD_ROM_FN(snes_Supblocksock) + +struct BurnDriver BurnDrvsnes_Supblocksock = { + "snes_supblocksock", NULL, NULL, NULL, "2023", + "Super Block'em Sock'em (HB)\0", NULL, "Second Dimension", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SupblocksockRomInfo, snes_SupblocksockRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Supercooked! (HB, v1.2) + +static struct BurnRomInfo snes_SupcookedRomDesc[] = { + { "Supercooked! v1.2 (2022)(Goldlocke).sfc", 524288, 0x06df4264, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supcooked) +STD_ROM_FN(snes_Supcooked) + +struct BurnDriver BurnDrvsnes_Supcooked = { + "snes_supcooked", NULL, NULL, NULL, "2022", + "Supercooked! (HB, v1.2)\0", NULL, "Goldlocke", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 4, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SupcookedRomInfo, snes_SupcookedRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ghouls 'n Ghosts Restoration (Hack) +// https://www.romhacking.net/hacks/3473/ +static struct BurnRomInfo snes_SupergngrRomDesc[] = { + { "Super Ghouls 'n Ghosts Restoration Hack (2023)(SCD).sfc", 2097152, 0xacaed88a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supergngr) +STD_ROM_FN(snes_Supergngr) + +struct BurnDriver BurnDrvsnes_Supergngr = { + "snes_supergngr", "snes_supergng", NULL, NULL, "2023", + "Super Ghouls 'n Ghosts Restoration (Hack)\0", NULL, "SCD", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SupergngrRomInfo, snes_SupergngrRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Junkoid (GlobalHack, v1.3) +// https://www.romhacking.net/hacks/8109/ +static struct BurnRomInfo snes_SuperjunkoidRomDesc[] = { + { "Super Junkoid v1.3 (2023)(P. Yoshi).sfc", 4194304, 0x132b3663, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superjunkoid) +STD_ROM_FN(snes_Superjunkoid) + +struct BurnDriver BurnDrvsnes_Superjunkoid = { + "snes_superjunkoid", NULL, NULL, NULL, "2023", + "Super Junkoid (GlobalHack, v1.3)\0", "A complete overhaul of Super Metroid", "P. Yoshi", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SuperjunkoidRomInfo, snes_SuperjunkoidRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario World - 30th Anniversary Edition (Hack) +// https://www.smwcentral.net/?p=viewthread&t=105457&page=1&pid=1563232 +static struct BurnRomInfo snes_Supermarioworld30thRomDesc[] = { + { "Super Mario World - 30th Anniversary Edition (2024)(LadiesMan217).sfc", 4194304, 0x92cca4ca, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermarioworld30th) +STD_ROM_FN(snes_Supermarioworld30th) + +struct BurnDriver BurnDrvsnes_Supermarioworld30th = { + "snes_supermarioworld30th", "snes_supermarioworld", NULL, NULL, "2024", + "Super Mario World - 30th Anniversary Edition (Hack)\0", NULL, "LadiesMan217", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Supermarioworld30thRomInfo, snes_Supermarioworld30thRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario World SA-1 Pack (Hack, v1.40) +// https://github.com/VitorVilela7/SMW-SA1-Pack +static struct BurnRomInfo snes_Supermarioworldsa1RomDesc[] = { + { "Super Mario World SA-1 Pack v1.40 (2021)(Vitor Vilela).sfc", 1048576, 0x389df7f4, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermarioworldsa1) +STD_ROM_FN(snes_Supermarioworldsa1) + +struct BurnDriver BurnDrvsnes_Supermarioworldsa1 = { + "snes_supermarioworldsa1", "snes_supermarioworld", NULL, NULL, "2021", + "Super Mario World SA-1 Pack (Hack, v1.40)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_Supermarioworldsa1RomInfo, snes_Supermarioworldsa1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Metroid Ascent (Hack, v1.12) +// https://www.romhacking.net/hacks/6347/ +static struct BurnRomInfo snes_SupermetroidascRomDesc[] = { + { "Super Metroid Ascent v1.12 (2019)(Benox50).sfc", 4194304, 0x71b973ac, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supermetroidasc) +STD_ROM_FN(snes_Supermetroidasc) + +struct BurnDriver BurnDrvsnes_Supermetroidasc = { + "snes_supermetroidasc", "snes_supermetroid", NULL, NULL, "2019", + "Super Metroid Ascent (Hack, v1.12)\0", NULL, "Benox50", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM | GBF_ADV, 0, + SNESGetZipName, snes_SupermetroidascRomInfo, snes_SupermetroidascRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Mario Kart - Horizons (Hack, v1.3) +// https://www.romhacking.net/hacks/8639/ +static struct BurnRomInfo snes_SupermkarthorizRomDesc[] = { + { "Super Mario Kart - Horizons v1.3 (2024)(gridatttack).sfc", 2097152, 0x590679e5, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Supermkarthoriz, snes_Supermkarthoriz, snes_dsp1b) +STD_ROM_FN(snes_Supermkarthoriz) + +struct BurnDriver BurnDrvsnes_Supermkarthoriz = { + "snes_supermkarthoriz", "snes_supermkart", "snes_dsp1b", NULL, "2024", + "Super Mario Kart - Horizons (Hack, v1.3)\0", "DSP-1B enhancement chip", "gridatttack", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SupermkarthorizRomInfo, snes_SupermkarthorizRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super SpongeBob Kart (Hack) + +static struct BurnRomInfo snes_SuperspongekartRomDesc[] = { + { "Super SpongeBob Kart - Hack (2014)(Kempy).sfc", 786432, 0xf6d5920b, BRF_ESS | BRF_PRG }, +}; + +STDROMPICKEXT(snes_Superspongekart, snes_Superspongekart, snes_dsp1b) +STD_ROM_FN(snes_Superspongekart) + +struct BurnDriver BurnDrvsnes_Superspongekart = { + "snes_superspongekart", "snes_supermkart", "snes_dsp1b", NULL, "2014", + "Super SpongeBob Kart (Hack)\0", "DSP-1B enhancement chip", "Kempy", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_RACING, 0, + SNESGetZipName, snes_SuperspongekartRomInfo, snes_SuperspongekartRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Ninja Kid 'Legendary Ninja Collection' (USA) + +static struct BurnRomInfo snes_SupninjakidRomDesc[] = { + { "Super Ninja Kid - Legendary Ninja Collection (U)(2023)(Jaleco).sfc", 1048576, 0x8e122404, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supninjakid) +STD_ROM_FN(snes_Supninjakid) + +struct BurnDriver BurnDrvsnes_Supninjakid = { + "snes_supninjakid", NULL, NULL, NULL, "2023", + "Super Ninja Kid 'Legendary Ninja Collection' (USA)\0", NULL, "Jaleco", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SupninjakidRomInfo, snes_SupninjakidRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super R-Type SA-1 (Hack, v1.2) +// https://github.com/VitorVilela7/SA1-Root/tree/master/Super-R-Type +static struct BurnRomInfo snes_Superrtypesa1RomDesc[] = { + { "Super R-Type SA-1 v1.2 (2022)(Vitor Vilela).sfc", 1048576, 0x0d73e7d3, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superrtypesa1) +STD_ROM_FN(snes_Superrtypesa1) + +struct BurnDriver BurnDrvsnes_Superrtypesa1 = { + "snes_superrtypesa1", "snes_superrtype", NULL, NULL, "2022", + "Super R-Type SA-1 (Hack, v1.2)\0", "SA-1 enhancement CPU", "Vitor Vilela", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_HORSHOOT, 0, + SNESGetZipName, snes_Superrtypesa1RomInfo, snes_Superrtypesa1RomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Thor Quest (HB) + +static struct BurnRomInfo snes_SuperthorRomDesc[] = { + { "Super Thor Quest (2015)(Bubblezap - Piko Int.).sfc", 262144, 0x8658f479, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superthor) +STD_ROM_FN(snes_Superthor) + +struct BurnDriver BurnDrvsnes_Superthor = { + "snes_superthor", "snes_classickong", NULL, NULL, "2015", + "Super Thor Quest (HB)\0", NULL, "Bubblezap - Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SuperthorRomInfo, snes_SuperthorRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Turrican 2 Special Edition (USA) + +static struct BurnRomInfo snes_Superturrican2seRomDesc[] = { + { "Super Turrican 2 Special Edition (U)(2022)(Strictly Limited Games).sfc", 3145728, 0x9f1098bd, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superturrican2se) +STD_ROM_FN(snes_Superturrican2se) + +struct BurnDriver BurnDrvsnes_Superturrican2se = { + "snes_superturrican2se", NULL, NULL, NULL, "2022", + "Super Turrican 2 Special Edition (USA)\0", "Super Turrican 2 + Super Turrican Score Attack", "Strictly Limited Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_Superturrican2seRomInfo, snes_Superturrican2seRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Turrican Director's Cut (USA) + +static struct BurnRomInfo snes_SuperturricandcRomDesc[] = { + { "Super Turrican Director's Cut (U)(2022)(Strictly Limited Games).sfc", 1572864, 0x97758715, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Superturricandc) +STD_ROM_FN(snes_Superturricandc) + +struct BurnDriver BurnDrvsnes_Superturricandc = { + "snes_superturricandc", NULL, NULL, NULL, "2022", + "Super Turrican Director's Cut (USA)\0", "Super Turrican + Super Turrican Director's Cut", "Strictly Limited Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 1, HARDWARE_SNES, GBF_RUNGUN | GBF_PLATFORM, 0, + SNESGetZipName, snes_SuperturricandcRomInfo, snes_SuperturricandcRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Sudoku World (HB, v1.1) + +static struct BurnRomInfo snes_SupsudokuRomDesc[] = { + { "Super Sudoku World v1.1 (2022)(Raphael Assenat).sfc", 262144, 0x21ee5635, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supsudoku) +STD_ROM_FN(snes_Supsudoku) + +struct BurnDriver BurnDrvsnes_Supsudoku = { + "snes_supsudoku", NULL, NULL, NULL, "2022", + "Super Sudoku World (HB, v1.1)\0", NULL, "Raphael Assenat", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE, 0, + SNESGetZipName, snes_SupsudokuRomInfo, snes_SupsudokuRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Super Xoxol vs. Pigdog (HB) + +static struct BurnRomInfo snes_SupxoxolRomDesc[] = { + { "Super Xoxol vs. Pigdog (2023)(Sergey Cyka).sfc", 1048576, 0xed786ffe, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Supxoxol) +STD_ROM_FN(snes_Supxoxol) + +struct BurnDriver BurnDrvsnes_Supxoxol = { + "snes_supxoxol", NULL, NULL, NULL, "2023", + "Super Xoxol vs. Pigdog (HB)\0", NULL, "Sergey Cyka", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_SupxoxolRomInfo, snes_SupxoxolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sure Instinct Mini-Edition (HB, v1.0.2) + +static struct BurnRomInfo snes_SureinstinctRomDesc[] = { + { "Sure Instinct Mini-Edition v1.0.2 (2021)(Benjamin Schulte).sfc", 524288, 0x9d4e6d2f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sureinstinct) +STD_ROM_FN(snes_Sureinstinct) + +struct BurnDriver BurnDrvsnes_Sureinstinct = { + "snes_sureinstinct", NULL, NULL, NULL, "2021", + "Sure Instinct Mini-Edition (HB, v1.0.2)\0", NULL, "Benjamin Schulte", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_SureinstinctRomInfo, snes_SureinstinctRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sydney Hunter and the Caverns of Death (HB) + +static struct BurnRomInfo snes_SydneyhuntRomDesc[] = { + { "Sydney Hunter and the Caverns of Death (2017)(Blazepro - Collectorvision).sfc", 2097152, 0xce88163a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sydneyhunt) +STD_ROM_FN(snes_Sydneyhunt) + +struct BurnDriver BurnDrvsnes_Sydneyhunt = { + "snes_sydneyhunt", "snes_sydneyhuntee", NULL, NULL, "2017", + "Sydney Hunter and the Caverns of Death (HB)\0", NULL, "Blazepro - Collectorvision Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SydneyhuntRomInfo, snes_SydneyhuntRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Sydney Hunter and the Caverns of Death - Evercade Edition (HB) + +static struct BurnRomInfo snes_SydneyhunteeRomDesc[] = { + { "Sydney Hunter and the Caverns of Death - Evercade Edition (2018)(CollectorVision).sfc", 2097152, 0x95c8491f, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Sydneyhuntee) +STD_ROM_FN(snes_Sydneyhuntee) + +struct BurnDriver BurnDrvsnes_Sydneyhuntee = { + "snes_sydneyhuntee", NULL, NULL, NULL, "2018", + "Sydney Hunter and the Caverns of Death - Evercade Edition (HB)\0", NULL, "Alekmaul Studio - CollectorVision Games", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_SydneyhunteeRomInfo, snes_SydneyhunteeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Tinhead (Euro) (Piko) + +static struct BurnRomInfo snes_TinheadpikoRomDesc[] = { + { "Tinhead (E)(2018)(Piko Interactive).sfc", 1048576, 0xbfd26228, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Tinheadpiko) +STD_ROM_FN(snes_Tinheadpiko) + +struct BurnDriver BurnDrvsnes_Tinheadpiko = { + "snes_tinheadpiko", "snes_tinheadproto", NULL, NULL, "2018", + "Tinhead (Euro) (Piko)\0", NULL, "Piko Interactive", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_TinheadpikoRomInfo, snes_TinheadpikoRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Undercover Cops (USA) (Retro-bit) + +static struct BurnRomInfo snes_UndercopsrbRomDesc[] = { + { "Undercover Cops (U)(2020)(Retro-bit).sfc", 4194304, 0xfebc684a, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Undercopsrb) +STD_ROM_FN(snes_Undercopsrb) + +struct BurnDriver BurnDrvsnes_Undercopsrb = { + "snes_undercopsrb", NULL, NULL, NULL, "2020", + "Undercover Cops (USA) (Retro-bit)\0", NULL, "Retro-bit", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING, 2, HARDWARE_SNES, GBF_SCRFIGHT, 0, + SNESGetZipName, snes_UndercopsrbRomInfo, snes_UndercopsrbRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Unholy Night - The Darkness Hunter (HB) + +static struct BurnRomInfo snes_UnholynightRomDesc[] = { + { "Unholy Night - The Darkness Hunter (2017)(Blazepro -Foxbat).sfc", 4194816, 0x219a466b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Unholynight) +STD_ROM_FN(snes_Unholynight) + +struct BurnDriver BurnDrvsnes_Unholynight = { + "snes_unholynight", NULL, NULL, NULL, "2017", + "Unholy Night - The Darkness Hunter (HB)\0", NULL, "Blazepro -Foxbat", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_VSFIGHT, 0, + SNESGetZipName, snes_UnholynightRomInfo, snes_UnholynightRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Uwol Quest for Money (HB) + +static struct BurnRomInfo snes_UwolRomDesc[] = { + { "Uwol Quest for Money (2012)(The Mojon Twins - Alekmaul).sfc", 262144, 0x6b125b71, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Uwol) +STD_ROM_FN(snes_Uwol) + +struct BurnDriver BurnDrvsnes_Uwol = { + "snes_uwol", NULL, NULL, NULL, "2012", + "Uwol Quest for Money (HB)\0", NULL, "The Mojon Twins - Alekmaul", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_UwolRomInfo, snes_UwolRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Witch n' Wiz (NES2SNES) (HB) + +static struct BurnRomInfo snes_WitchnwizRomDesc[] = { + { "Witch n' Wiz NES2SNES (2022)(Matt Hughson).sfc", 1048576, 0x7fec473b, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Witchnwiz) +STD_ROM_FN(snes_Witchnwiz) + +struct BurnDriver BurnDrvsnes_Witchnwiz = { + "snes_witchnwiz", NULL, NULL, NULL, "2022", + "Witch n' Wiz (NES2SNES) (HB)\0", NULL, "Matt Hughson", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 1, HARDWARE_SNES, GBF_PUZZLE | GBF_ADV, 0, + SNESGetZipName, snes_WitchnwizRomInfo, snes_WitchnwizRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 478, 4, 3 +}; + +// Wolfchild - Fastrom Fix (Hack) + +static struct BurnRomInfo snes_WolfchildffRomDesc[] = { + { "Wolfchild - Fastrom Fix (2024)(kandowontu).sfc", 1048576, 0xfe9deb64, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Wolfchildff) +STD_ROM_FN(snes_Wolfchildff) + +struct BurnDriver BurnDrvsnes_Wolfchildff = { + "snes_wolfchildff", "snes_wolfchild", NULL, NULL, "2024", + "Wolfchild - Fastrom Fix (Hack)\0", NULL, "kandowontu", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_WolfchildffRomInfo, snes_WolfchildffRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Christmas Craze (HB) + +static struct BurnRomInfo snes_XmascrazeRomDesc[] = { + { "Christmas Craze (2011)(RetroUSB).sfc", 524288, 0x5f7b6627, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Xmascraze) +STD_ROM_FN(snes_Xmascraze) + +struct BurnDriver BurnDrvsnes_Xmascraze = { + "snes_xmascraze", NULL, NULL, NULL, "2011", + "Christmas Craze (HB)\0", NULL, "RetroUSB", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_XmascrazeRomInfo, snes_XmascrazeRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yoshi's Strange Quest (GlobalHack, v1.3) +// https://www.romhacking.net/hacks/2357/ +static struct BurnRomInfo snes_YoshistrangequestRomDesc[] = { + { "Yoshi's Strange Quest v1.3 (2014)(Yoshifanatic).sfc", 4194816, 0xac1cd3c6, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoshistrangequest) +STD_ROM_FN(snes_Yoshistrangequest) + +struct BurnDriver BurnDrvsnes_Yoshistrangequest = { + "snes_yoshistrangequest", NULL, NULL, NULL, "2014", + "Yoshi's Strange Quest (GlobalHack, v1.3)\0", "A complete overhaul of Super Mario World", "Yoshifanatic", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW | BDF_HACK, 1, HARDWARE_SNES, GBF_PLATFORM, 0, + SNESGetZipName, snes_YoshistrangequestRomInfo, snes_YoshistrangequestRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Yo-Yo Shuriken (HB) + +static struct BurnRomInfo snes_YoyoshurikenRomDesc[] = { + { "Yo-Yo Shuriken (2019)(Catskull Games - Dr. Ludos).sfc", 262144, 0xc66723b7, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Yoyoshuriken) +STD_ROM_FN(snes_Yoyoshuriken) + +struct BurnDriver BurnDrvsnes_Yoyoshuriken = { + "snes_yoyoshuriken", NULL, NULL, NULL, "2019", + "Yo-Yo Shuriken (HB)\0", NULL, "Catskull Games - Dr. Ludos", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_SNES, GBF_ACTION, 0, + SNESGetZipName, snes_YoyoshurikenRomInfo, snes_YoyoshurikenRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + +// Oh No! More Zombies Ate My Neighbors! (Hack) + +static struct BurnRomInfo snes_Zombies2hRomDesc[] = { + { "Oh No! More Zombies Ate My Neighbors! - Hack (2010)(Stanley_Decker, Sloat).sfc", 4194304, 0xd218147c, BRF_ESS | BRF_PRG }, +}; + +STD_ROM_PICK(snes_Zombies2h) +STD_ROM_FN(snes_Zombies2h) + +struct BurnDriver BurnDrvsnes_Zombies2h = { + "snes_zombies2h", "snes_zombies", NULL, NULL, "2010", + "Oh No! More Zombies Ate My Neighbors! (Hack)\0", "The unofficial sequel/hack of first episode", "Stanley_Decker, Sloat", "Nintendo", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_CLONE | BDF_HACK, 2, HARDWARE_SNES, GBF_RUNGUN, 0, + SNESGetZipName, snes_Zombies2hRomInfo, snes_Zombies2hRomName, NULL, NULL, NULL, NULL, SNESInputInfo, SNESDIPInfo, + DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000, + 512, 448, 4, 3 +}; + diff --git a/src/burn/drv/snes/dma.cpp b/src/burn/drv/snes/dma.cpp new file mode 100644 index 000000000..ed5c7e947 --- /dev/null +++ b/src/burn/drv/snes/dma.cpp @@ -0,0 +1,404 @@ + +#include +#include +#include +#include +#include + +#include "dma.h" +#include "snes.h" +#include "statehandler.h" + +static const int bAdrOffsets[8][4] = { + {0, 0, 0, 0}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1}, + {0, 1, 2, 3}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1} +}; + +static const int transferLength[8] = { + 1, 2, 2, 4, 4, 4, 2, 4 +}; + +static void dma_transferByte(Dma* dma, uint16_t aAdr, uint8_t aBank, uint8_t bAdr, bool fromB); +static void dma_checkHdma(Dma* dma); +static void dma_doDma(Dma* dma, int cpuCycles); +static void dma_initHdma(Dma* dma, bool doSync, int cpuCycles); +static void dma_doHdma(Dma* dma, bool doSync, int cpuCycles); + +Dma* dma_init(Snes* snes) { + Dma* dma = (Dma*)BurnMalloc(sizeof(Dma)); + dma->snes = snes; + return dma; +} + +void dma_free(Dma* dma) { + BurnFree(dma); +} + +void dma_reset(Dma* dma) { + for(int i = 0; i < 8; i++) { + dma->channel[i].bAdr = 0xff; + dma->channel[i].aAdr = 0xffff; + dma->channel[i].aBank = 0xff; + dma->channel[i].size = 0xffff; + dma->channel[i].indBank = 0xff; + dma->channel[i].tableAdr = 0xffff; + dma->channel[i].repCount = 0xff; + dma->channel[i].unusedByte = 0xff; + dma->channel[i].dmaActive = false; + dma->channel[i].hdmaActive = false; + dma->channel[i].mode = 7; + dma->channel[i].fixed = true; + dma->channel[i].decrement = true; + dma->channel[i].indirect = true; + dma->channel[i].fromB = true; + dma->channel[i].unusedBit = true; + dma->channel[i].doTransfer = false; + dma->channel[i].terminated = false; + } + dma->dmaState = 0; + dma->hdmaInitRequested = false; + dma->hdmaRunRequested = false; +} + +void dma_handleState(Dma* dma, StateHandler* sh) { + sh_handleBools(sh, &dma->hdmaInitRequested, &dma->hdmaRunRequested, NULL); + sh_handleBytes(sh, &dma->dmaState, NULL); + for(int i = 0; i < 8; i++) { + sh_handleBools(sh, + &dma->channel[i].dmaActive, &dma->channel[i].hdmaActive, &dma->channel[i].fixed, &dma->channel[i].decrement, + &dma->channel[i].indirect, &dma->channel[i].fromB, &dma->channel[i].unusedBit, &dma->channel[i].doTransfer, + &dma->channel[i].terminated, NULL + ); + sh_handleBytes(sh, + &dma->channel[i].bAdr, &dma->channel[i].aBank, &dma->channel[i].indBank, &dma->channel[i].repCount, + &dma->channel[i].unusedByte, &dma->channel[i].mode, NULL + ); + sh_handleWords(sh, &dma->channel[i].aAdr, &dma->channel[i].size, &dma->channel[i].tableAdr, NULL); + } +} + +uint8_t dma_read(Dma* dma, uint16_t adr) { + uint8_t c = (adr & 0x70) >> 4; + switch(adr & 0xf) { + case 0x0: { + uint8_t val = dma->channel[c].mode; + val |= dma->channel[c].fixed << 3; + val |= dma->channel[c].decrement << 4; + val |= dma->channel[c].unusedBit << 5; + val |= dma->channel[c].indirect << 6; + val |= dma->channel[c].fromB << 7; + return val; + } + case 0x1: { + return dma->channel[c].bAdr; + } + case 0x2: { + return dma->channel[c].aAdr & 0xff; + } + case 0x3: { + return dma->channel[c].aAdr >> 8; + } + case 0x4: { + return dma->channel[c].aBank; + } + case 0x5: { + return dma->channel[c].size & 0xff; + } + case 0x6: { + return dma->channel[c].size >> 8; + } + case 0x7: { + return dma->channel[c].indBank; + } + case 0x8: { + return dma->channel[c].tableAdr & 0xff; + } + case 0x9: { + return dma->channel[c].tableAdr >> 8; + } + case 0xa: { + return dma->channel[c].repCount; + } + case 0xb: + case 0xf: { + return dma->channel[c].unusedByte; + } + default: { + return dma->snes->openBus; + } + } +} + +void dma_write(Dma* dma, uint16_t adr, uint8_t val) { + uint8_t c = (adr & 0x70) >> 4; + switch(adr & 0xf) { + case 0x0: { + dma->channel[c].mode = val & 0x7; + dma->channel[c].fixed = val & 0x8; + dma->channel[c].decrement = val & 0x10; + dma->channel[c].unusedBit = val & 0x20; + dma->channel[c].indirect = val & 0x40; + dma->channel[c].fromB = val & 0x80; + break; + } + case 0x1: { + dma->channel[c].bAdr = val; + break; + } + case 0x2: { + dma->channel[c].aAdr = (dma->channel[c].aAdr & 0xff00) | val; + break; + } + case 0x3: { + dma->channel[c].aAdr = (dma->channel[c].aAdr & 0xff) | (val << 8); + break; + } + case 0x4: { + dma->channel[c].aBank = val; + break; + } + case 0x5: { + dma->channel[c].size = (dma->channel[c].size & 0xff00) | val; + break; + } + case 0x6: { + dma->channel[c].size = (dma->channel[c].size & 0xff) | (val << 8); + break; + } + case 0x7: { + dma->channel[c].indBank = val; + break; + } + case 0x8: { + dma->channel[c].tableAdr = (dma->channel[c].tableAdr & 0xff00) | val; + break; + } + case 0x9: { + dma->channel[c].tableAdr = (dma->channel[c].tableAdr & 0xff) | (val << 8); + break; + } + case 0xa: { + dma->channel[c].repCount = val; + break; + } + case 0xb: + case 0xf: { + dma->channel[c].unusedByte = val; + break; + } + default: { + break; + } + } +} + +static void dma_checkHdma(Dma* dma) { + // run hdma if requested, no sync (already sycned due to dma) + if(dma->hdmaInitRequested) dma_initHdma(dma, false, 0); + if(dma->hdmaRunRequested) dma_doHdma(dma, false, 0); +} + +static void dma_doDma(Dma* dma, int cpuCycles) { + // nmi/irq is delayed by 1 opcode if requested during dma/hdma + cpu_setIntDelay(); + // align to multiple of 8 + snes_syncCycles(dma->snes, true, 8); + dma_checkHdma(dma); + snes_runCycles(dma->snes, 8); // full transfer overhead + for(int i = 0; i < 8; i++) { + if(!dma->channel[i].dmaActive) continue; + //bprintf(0, _T("d%x, x/y %d %d\n"), i, dma->snes->hPos, dma->snes->vPos); + // do channel i + dma_checkHdma(dma); + snes_runCycles(dma->snes, 8); // overhead per channel + int offIndex = 0; + while(dma->channel[i].dmaActive) { + dma_checkHdma(dma); + dma_transferByte( + dma, dma->channel[i].aAdr, dma->channel[i].aBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][offIndex++], dma->channel[i].fromB + ); + offIndex &= 3; + if(!dma->channel[i].fixed) { + dma->channel[i].aAdr += dma->channel[i].decrement ? -1 : 1; + } + dma->channel[i].size--; + if(dma->channel[i].size == 0) { + dma->channel[i].dmaActive = false; + } + } + } + // re-align to cpu cycles + snes_syncCycles(dma->snes, false, cpuCycles); +} + +static void dma_initHdma(Dma* dma, bool doSync, int cpuCycles) { + dma->hdmaInitRequested = false; + bool hdmaEnabled = false; + // check if a channel is enabled, and do reset + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive) hdmaEnabled = true; + dma->channel[i].doTransfer = false; + dma->channel[i].terminated = false; + } + if(!hdmaEnabled) return; + // nmi/irq is delayed by 1 opcode if requested during dma/hdma + cpu_setIntDelay(); + if(doSync) snes_syncCycles(dma->snes, true, 8); + // full transfer overhead + snes_runCycles(dma->snes, 8); + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive) { + //bprintf(0, _T("Hdinit%x, x/y %d %d\n"), i, dma->snes->hPos, dma->snes->vPos); + // terminate any dma + dma->channel[i].dmaActive = false; + // load address, repCount, and indirect address if needed + dma->channel[i].tableAdr = dma->channel[i].aAdr; + snes_runCycles(dma->snes, 4); + dma->channel[i].repCount = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + snes_runCycles(dma->snes, 4); + if(dma->channel[i].repCount == 0) dma->channel[i].terminated = true; + if(dma->channel[i].indirect) { + snes_runCycles(dma->snes, 4); + dma->channel[i].size = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + snes_runCycles(dma->snes, 4); + + snes_runCycles(dma->snes, 4); + dma->channel[i].size |= snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++) << 8; + snes_runCycles(dma->snes, 4); + } + dma->channel[i].doTransfer = true; + } + } + if(doSync) snes_syncCycles(dma->snes, false, cpuCycles); +} + +static void dma_doHdma(Dma* dma, bool doSync, int cpuCycles) { + dma->hdmaRunRequested = false; + bool hdmaActive = false; + int lastActive = 0; + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive) { + hdmaActive = true; + if(!dma->channel[i].terminated) lastActive = i; + } + } + if(!hdmaActive) return; + // nmi/irq is delayed by 1 opcode if requested during dma/hdma + cpu_setIntDelay(); + if(doSync) snes_syncCycles(dma->snes, true, 8); + // full transfer overhead + snes_runCycles(dma->snes, 8); + // do all copies + for(int i = 0; i < 8; i++) { + // terminate any dma + if(dma->channel[i].hdmaActive) dma->channel[i].dmaActive = false; + if(dma->channel[i].hdmaActive && !dma->channel[i].terminated) { + // do the hdma + if(dma->channel[i].doTransfer) { + //bprintf(0, _T("???Hdma%x, x/y %d %d\n"), i, dma->snes->hPos, dma->snes->vPos); + for(int j = 0; j < transferLength[dma->channel[i].mode]; j++) { + if(dma->channel[i].indirect) { + dma_transferByte( + dma, dma->channel[i].size++, dma->channel[i].indBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][j], dma->channel[i].fromB + ); + } else { + dma_transferByte( + dma, dma->channel[i].tableAdr++, dma->channel[i].aBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][j], dma->channel[i].fromB + ); + } + } + } + } + } + // do all updates + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive && !dma->channel[i].terminated) { + //bprintf(0, _T("Hdma%x, x/y %d %d\n"), i, dma->snes->hPos, dma->snes->vPos); + dma->channel[i].repCount--; + dma->channel[i].doTransfer = dma->channel[i].repCount & 0x80; + snes_runCycles(dma->snes, 4); + uint8_t newRepCount = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr); + snes_runCycles(dma->snes, 4); + if((dma->channel[i].repCount & 0x7f) == 0) { + dma->channel[i].repCount = newRepCount; + dma->channel[i].tableAdr++; + if(dma->channel[i].indirect) { + if(dma->channel[i].repCount == 0 && i == lastActive) { + // if this is the last active channel, only fetch high, and use 0 for low + dma->channel[i].size = 0; + } else { + snes_runCycles(dma->snes, 4); + dma->channel[i].size = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + snes_runCycles(dma->snes, 4); + } + snes_runCycles(dma->snes, 4); + dma->channel[i].size |= snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++) << 8; + snes_runCycles(dma->snes, 4); + } + if(dma->channel[i].repCount == 0) dma->channel[i].terminated = true; + dma->channel[i].doTransfer = true; + } + } + } + if(doSync) snes_syncCycles(dma->snes, false, cpuCycles); +} + +static void dma_transferByte(Dma* dma, uint16_t aAdr, uint8_t aBank, uint8_t bAdr, bool fromB) { + // accessing 0x2180 via b-bus while a-bus accesses ram gives open bus + bool validB = !(bAdr == 0x80 && (aBank == 0x7e || aBank == 0x7f || ( + (aBank < 0x40 || (aBank >= 0x80 && aBank < 0xc0)) && aAdr < 0x2000 + ))); + // accesing b-bus, or dma regs via a-bus gives open bus + bool validA = !((aBank < 0x40 || (aBank >= 0x80 && aBank < 0xc0)) && ( + aAdr == 0x420b || aAdr == 0x420c || (aAdr >= 0x4300 && aAdr < 0x4380) || (aAdr >= 0x2100 && aAdr < 0x2200) + )); + if(fromB) { + snes_runCycles(dma->snes, 4); + uint8_t val = validB ? snes_readBBus(dma->snes, bAdr) : dma->snes->openBus; + snes_runCycles(dma->snes, 4); + if(validA) snes_write(dma->snes, (aBank << 16) | aAdr, val); + } else { + snes_runCycles(dma->snes, 4); + uint8_t val = validA ? snes_read(dma->snes, (aBank << 16) | aAdr) : dma->snes->openBus; + snes_runCycles(dma->snes, 4); + if(validB) snes_writeBBus(dma->snes, bAdr, val); + } +} + +void dma_handleDma(Dma* dma, int cpuCycles) { + // if hdma triggered, do it, except if dmastate indicates dma will be done now + // (it will be done as part of the dma in that case) + if(dma->hdmaInitRequested && dma->dmaState != 2) dma_initHdma(dma, true, cpuCycles); + if(dma->hdmaRunRequested && dma->dmaState != 2) dma_doHdma(dma, true, cpuCycles); + if(dma->dmaState == 1) { + dma->dmaState = 2; + return; + } + if(dma->dmaState == 2) { + // do dma + dma_doDma(dma, cpuCycles); + dma->dmaState = 0; + } +} + +void dma_startDma(Dma* dma, uint8_t val, bool hdma) { + for(int i = 0; i < 8; i++) { + if(hdma) { + dma->channel[i].hdmaActive = val & (1 << i); + } else { + dma->channel[i].dmaActive = val & (1 << i); + } + } + if(!hdma) { + dma->dmaState = val != 0 ? 1 : 0; + } +} diff --git a/src/burn/drv/snes/dma.h b/src/burn/drv/snes/dma.h new file mode 100644 index 000000000..37ecadba2 --- /dev/null +++ b/src/burn/drv/snes/dma.h @@ -0,0 +1,52 @@ + +#ifndef DMA_H +#define DMA_H + +#include +#include + +typedef struct Dma Dma; + +#include "snes.h" +#include "statehandler.h" + +typedef struct DmaChannel { + uint8_t bAdr; + uint16_t aAdr; + uint8_t aBank; + uint16_t size; // also indirect hdma adr + uint8_t indBank; // hdma + uint16_t tableAdr; // hdma + uint8_t repCount; // hdma + uint8_t unusedByte; + bool dmaActive; + bool hdmaActive; + uint8_t mode; + bool fixed; + bool decrement; + bool indirect; // hdma + bool fromB; + bool unusedBit; + bool doTransfer; // hdma + bool terminated; // hdma +} DmaChannel; + +struct Dma { + Snes* snes; + DmaChannel channel[8]; + uint8_t dmaState; + bool hdmaInitRequested; + bool hdmaRunRequested; +}; + +Dma* dma_init(Snes* snes); +void dma_free(Dma* dma); +void dma_reset(Dma* dma); +void dma_handleState(Dma* dma, StateHandler* sh); +uint8_t dma_read(Dma* dma, uint16_t adr); // 43x0-43xf +void dma_write(Dma* dma, uint16_t adr, uint8_t val); // 43x0-43xf +void dma_handleDma(Dma* dma, int cpuCycles); +void dma_startDma(Dma* dma, uint8_t val, bool hdma); + + +#endif diff --git a/src/burn/drv/snes/dsp.cpp b/src/burn/drv/snes/dsp.cpp new file mode 100644 index 000000000..1cc11ad29 --- /dev/null +++ b/src/burn/drv/snes/dsp.cpp @@ -0,0 +1,601 @@ + +#include +#include +#include +#include +#include + +#include "dsp.h" +#include "apu.h" +#include "statehandler.h" + +static const int rateValues[32] = { + 0, 2048, 1536, 1280, 1024, 768, 640, 512, + 384, 320, 256, 192, 160, 128, 96, 80, + 64, 48, 40, 32, 24, 20, 16, 12, + 10, 8, 6, 5, 4, 3, 2, 1 +}; + +static const int rateOffsets[32] = { + 0, 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, + 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, 0, 1040, 536, 0 +}; + +static const int gaussValues[512] = { + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x002, 0x002, 0x002, 0x002, 0x002, + 0x002, 0x002, 0x003, 0x003, 0x003, 0x003, 0x003, 0x004, 0x004, 0x004, 0x004, 0x004, 0x005, 0x005, 0x005, 0x005, + 0x006, 0x006, 0x006, 0x006, 0x007, 0x007, 0x007, 0x008, 0x008, 0x008, 0x009, 0x009, 0x009, 0x00a, 0x00a, 0x00a, + 0x00b, 0x00b, 0x00b, 0x00c, 0x00c, 0x00d, 0x00d, 0x00e, 0x00e, 0x00f, 0x00f, 0x00f, 0x010, 0x010, 0x011, 0x011, + 0x012, 0x013, 0x013, 0x014, 0x014, 0x015, 0x015, 0x016, 0x017, 0x017, 0x018, 0x018, 0x019, 0x01a, 0x01b, 0x01b, + 0x01c, 0x01d, 0x01d, 0x01e, 0x01f, 0x020, 0x020, 0x021, 0x022, 0x023, 0x024, 0x024, 0x025, 0x026, 0x027, 0x028, + 0x029, 0x02a, 0x02b, 0x02c, 0x02d, 0x02e, 0x02f, 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, + 0x03a, 0x03b, 0x03c, 0x03d, 0x03e, 0x040, 0x041, 0x042, 0x043, 0x045, 0x046, 0x047, 0x049, 0x04a, 0x04c, 0x04d, + 0x04e, 0x050, 0x051, 0x053, 0x054, 0x056, 0x057, 0x059, 0x05a, 0x05c, 0x05e, 0x05f, 0x061, 0x063, 0x064, 0x066, + 0x068, 0x06a, 0x06b, 0x06d, 0x06f, 0x071, 0x073, 0x075, 0x076, 0x078, 0x07a, 0x07c, 0x07e, 0x080, 0x082, 0x084, + 0x086, 0x089, 0x08b, 0x08d, 0x08f, 0x091, 0x093, 0x096, 0x098, 0x09a, 0x09c, 0x09f, 0x0a1, 0x0a3, 0x0a6, 0x0a8, + 0x0ab, 0x0ad, 0x0af, 0x0b2, 0x0b4, 0x0b7, 0x0ba, 0x0bc, 0x0bf, 0x0c1, 0x0c4, 0x0c7, 0x0c9, 0x0cc, 0x0cf, 0x0d2, + 0x0d4, 0x0d7, 0x0da, 0x0dd, 0x0e0, 0x0e3, 0x0e6, 0x0e9, 0x0ec, 0x0ef, 0x0f2, 0x0f5, 0x0f8, 0x0fb, 0x0fe, 0x101, + 0x104, 0x107, 0x10b, 0x10e, 0x111, 0x114, 0x118, 0x11b, 0x11e, 0x122, 0x125, 0x129, 0x12c, 0x130, 0x133, 0x137, + 0x13a, 0x13e, 0x141, 0x145, 0x148, 0x14c, 0x150, 0x153, 0x157, 0x15b, 0x15f, 0x162, 0x166, 0x16a, 0x16e, 0x172, + 0x176, 0x17a, 0x17d, 0x181, 0x185, 0x189, 0x18d, 0x191, 0x195, 0x19a, 0x19e, 0x1a2, 0x1a6, 0x1aa, 0x1ae, 0x1b2, + 0x1b7, 0x1bb, 0x1bf, 0x1c3, 0x1c8, 0x1cc, 0x1d0, 0x1d5, 0x1d9, 0x1dd, 0x1e2, 0x1e6, 0x1eb, 0x1ef, 0x1f3, 0x1f8, + 0x1fc, 0x201, 0x205, 0x20a, 0x20f, 0x213, 0x218, 0x21c, 0x221, 0x226, 0x22a, 0x22f, 0x233, 0x238, 0x23d, 0x241, + 0x246, 0x24b, 0x250, 0x254, 0x259, 0x25e, 0x263, 0x267, 0x26c, 0x271, 0x276, 0x27b, 0x280, 0x284, 0x289, 0x28e, + 0x293, 0x298, 0x29d, 0x2a2, 0x2a6, 0x2ab, 0x2b0, 0x2b5, 0x2ba, 0x2bf, 0x2c4, 0x2c9, 0x2ce, 0x2d3, 0x2d8, 0x2dc, + 0x2e1, 0x2e6, 0x2eb, 0x2f0, 0x2f5, 0x2fa, 0x2ff, 0x304, 0x309, 0x30e, 0x313, 0x318, 0x31d, 0x322, 0x326, 0x32b, + 0x330, 0x335, 0x33a, 0x33f, 0x344, 0x349, 0x34e, 0x353, 0x357, 0x35c, 0x361, 0x366, 0x36b, 0x370, 0x374, 0x379, + 0x37e, 0x383, 0x388, 0x38c, 0x391, 0x396, 0x39b, 0x39f, 0x3a4, 0x3a9, 0x3ad, 0x3b2, 0x3b7, 0x3bb, 0x3c0, 0x3c5, + 0x3c9, 0x3ce, 0x3d2, 0x3d7, 0x3dc, 0x3e0, 0x3e5, 0x3e9, 0x3ed, 0x3f2, 0x3f6, 0x3fb, 0x3ff, 0x403, 0x408, 0x40c, + 0x410, 0x415, 0x419, 0x41d, 0x421, 0x425, 0x42a, 0x42e, 0x432, 0x436, 0x43a, 0x43e, 0x442, 0x446, 0x44a, 0x44e, + 0x452, 0x455, 0x459, 0x45d, 0x461, 0x465, 0x468, 0x46c, 0x470, 0x473, 0x477, 0x47a, 0x47e, 0x481, 0x485, 0x488, + 0x48c, 0x48f, 0x492, 0x496, 0x499, 0x49c, 0x49f, 0x4a2, 0x4a6, 0x4a9, 0x4ac, 0x4af, 0x4b2, 0x4b5, 0x4b7, 0x4ba, + 0x4bd, 0x4c0, 0x4c3, 0x4c5, 0x4c8, 0x4cb, 0x4cd, 0x4d0, 0x4d2, 0x4d5, 0x4d7, 0x4d9, 0x4dc, 0x4de, 0x4e0, 0x4e3, + 0x4e5, 0x4e7, 0x4e9, 0x4eb, 0x4ed, 0x4ef, 0x4f1, 0x4f3, 0x4f5, 0x4f6, 0x4f8, 0x4fa, 0x4fb, 0x4fd, 0x4ff, 0x500, + 0x502, 0x503, 0x504, 0x506, 0x507, 0x508, 0x50a, 0x50b, 0x50c, 0x50d, 0x50e, 0x50f, 0x510, 0x511, 0x511, 0x512, + 0x513, 0x514, 0x514, 0x515, 0x516, 0x516, 0x517, 0x517, 0x517, 0x518, 0x518, 0x518, 0x518, 0x518, 0x519, 0x519 +}; + +static int clamp16(int val); +static int clip16(int val); +static bool dsp_checkCounter(Dsp* dsp, int rate); +static void dsp_cycleChannel(Dsp* dsp, int ch); +static void dsp_handleEcho(Dsp* dsp); +static void dsp_handleGain(Dsp* dsp, int ch); +static void dsp_decodeBrr(Dsp* dsp, int ch); +static int16_t dsp_getSample(Dsp* dsp, int ch); +static void dsp_handleNoise(Dsp* dsp); + +Dsp* dsp_init(Apu* apu) { + Dsp* dsp = (Dsp*)BurnMalloc(sizeof(Dsp)); + dsp->apu = apu; + return dsp; +} + +void dsp_free(Dsp* dsp) { + BurnFree(dsp); +} + +void dsp_reset(Dsp* dsp) { + memset(dsp->ram, 0, sizeof(dsp->ram)); + dsp->ram[0x7c] = 0xff; // set ENDx + for(int i = 0; i < 8; i++) { + dsp->channel[i].pitch = 0; + dsp->channel[i].pitchCounter = 0; + dsp->channel[i].pitchModulation = false; + memset(dsp->channel[i].decodeBuffer, 0, sizeof(dsp->channel[i].decodeBuffer)); + dsp->channel[i].bufferOffset = 0; + dsp->channel[i].srcn = 0; + dsp->channel[i].decodeOffset = 0; + dsp->channel[i].blockOffset = 0; + dsp->channel[i].brrHeader = 0; + dsp->channel[i].useNoise = false; + dsp->channel[i].startDelay = 0; + memset(dsp->channel[i].adsrRates, 0, sizeof(dsp->channel[i].adsrRates)); + dsp->channel[i].adsrState = 0; + dsp->channel[i].sustainLevel = 0; + dsp->channel[i].gainSustainLevel = 0; + dsp->channel[i].useGain = false; + dsp->channel[i].gainMode = 0; + dsp->channel[i].directGain = false; + dsp->channel[i].gainValue = 0; + dsp->channel[i].preclampGain = 0; + dsp->channel[i].gain = 0; + dsp->channel[i].keyOn = false; + dsp->channel[i].keyOff = false; + dsp->channel[i].sampleOut = 0; + dsp->channel[i].volumeL = 0; + dsp->channel[i].volumeR = 0; + dsp->channel[i].echoEnable = false; + } + dsp->counter = 0; + dsp->dirPage = 0; + dsp->evenCycle = true; + dsp->mute = true; + dsp->reset = true; + dsp->masterVolumeL = 0; + dsp->masterVolumeR = 0; + dsp->sampleOutL = 0; + dsp->sampleOutR = 0; + dsp->echoOutL = 0; + dsp->echoOutR = 0; + dsp->noiseSample = 0x4000; + dsp->noiseRate = 0; + dsp->echoWrites = false; + dsp->echoVolumeL = 0; + dsp->echoVolumeR = 0; + dsp->feedbackVolume = 0; + dsp->echoBufferAdr = 0; + dsp->echoDelay = 0; + dsp->echoLength = 0; + dsp->echoBufferIndex = 0; + dsp->firBufferIndex = 0; + memset(dsp->firValues, 0, sizeof(dsp->firValues)); + memset(dsp->firBufferL, 0, sizeof(dsp->firBufferL)); + memset(dsp->firBufferR, 0, sizeof(dsp->firBufferR)); + memset(dsp->sampleBuffer, 0, sizeof(dsp->sampleBuffer)); + dsp->sampleOffset = 0; + dsp->lastFrameBoundary = 0; +} + +void dsp_newFrame(Dsp* dsp) { + dsp->lastFrameBoundary = dsp->sampleOffset; +} + +void dsp_handleState(Dsp* dsp, StateHandler* sh) { + sh_handleBools(sh, &dsp->evenCycle, &dsp->mute, &dsp->reset, &dsp->echoWrites, NULL); + sh_handleBytes(sh, &dsp->noiseRate, &dsp->firBufferIndex, NULL); + sh_handleBytesS(sh, + &dsp->masterVolumeL, &dsp->masterVolumeR, &dsp->echoVolumeL, &dsp->echoVolumeR, &dsp->feedbackVolume, + &dsp->firValues[0], &dsp->firValues[1], &dsp->firValues[2], &dsp->firValues[3], &dsp->firValues[4], + &dsp->firValues[5], &dsp->firValues[6], &dsp->firValues[7], NULL + ); + sh_handleWords(sh, + &dsp->counter, &dsp->dirPage, &dsp->echoBufferAdr, &dsp->echoDelay, &dsp->echoLength, &dsp->echoBufferIndex, &dsp->lastFrameBoundary, &dsp->sampleOffset, NULL + ); + sh_handleWordsS(sh, + &dsp->sampleOutL, &dsp->sampleOutR, &dsp->echoOutL, &dsp->echoOutR, &dsp->noiseSample, + &dsp->firBufferL[0], &dsp->firBufferL[1], &dsp->firBufferL[2], &dsp->firBufferL[3], &dsp->firBufferL[4], + &dsp->firBufferL[5], &dsp->firBufferL[6], &dsp->firBufferL[7], &dsp->firBufferR[0], &dsp->firBufferR[1], + &dsp->firBufferR[2], &dsp->firBufferR[3], &dsp->firBufferR[4], &dsp->firBufferR[5], &dsp->firBufferR[6], + &dsp->firBufferR[7], NULL + ); + for(int i = 0; i < 8; i++) { + sh_handleBools(sh, + &dsp->channel[i].pitchModulation, &dsp->channel[i].useNoise, &dsp->channel[i].useGain, &dsp->channel[i].directGain, + &dsp->channel[i].keyOn, &dsp->channel[i].keyOff, &dsp->channel[i].echoEnable, NULL + ); + sh_handleBytes(sh, + &dsp->channel[i].bufferOffset, &dsp->channel[i].srcn, &dsp->channel[i].blockOffset, &dsp->channel[i].brrHeader, + &dsp->channel[i].startDelay, &dsp->channel[i].adsrRates[0], &dsp->channel[i].adsrRates[1], + &dsp->channel[i].adsrRates[2], &dsp->channel[i].adsrRates[3], &dsp->channel[i].adsrState, + &dsp->channel[i].sustainLevel, &dsp->channel[i].gainSustainLevel, &dsp->channel[i].gainMode, NULL + ); + sh_handleBytesS(sh, &dsp->channel[i].volumeL, &dsp->channel[i].volumeR, NULL); + sh_handleWords(sh, + &dsp->channel[i].pitch, &dsp->channel[i].pitchCounter, &dsp->channel[i].decodeOffset, &dsp->channel[i].gainValue, + &dsp->channel[i].preclampGain, &dsp->channel[i].gain, NULL + ); + sh_handleWordsS(sh, + &dsp->channel[i].decodeBuffer[0], &dsp->channel[i].decodeBuffer[1], &dsp->channel[i].decodeBuffer[2], + &dsp->channel[i].decodeBuffer[3], &dsp->channel[i].decodeBuffer[4], &dsp->channel[i].decodeBuffer[5], + &dsp->channel[i].decodeBuffer[6], &dsp->channel[i].decodeBuffer[7], &dsp->channel[i].decodeBuffer[8], + &dsp->channel[i].decodeBuffer[9], &dsp->channel[i].decodeBuffer[10], &dsp->channel[i].decodeBuffer[11], + &dsp->channel[i].sampleOut, NULL + ); + } + sh_handleByteArray(sh, dsp->ram, 0x80); +// sh_handleByteArray(sh, (UINT8*)&dsp->sampleBuffer[0], 0x800*2*2); +} + +void dsp_cycle(Dsp* dsp) { + dsp->sampleOutL = 0; + dsp->sampleOutR = 0; + dsp->echoOutL = 0; + dsp->echoOutR = 0; + for(int i = 0; i < 8; i++) { + dsp_cycleChannel(dsp, i); + } + dsp_handleEcho(dsp); // also applies master volume + dsp->counter = dsp->counter == 0 ? 30720 - 1 : dsp->counter - 1; + dsp_handleNoise(dsp); + dsp->evenCycle = !dsp->evenCycle; + // handle mute flag + if(dsp->mute) { + dsp->sampleOutL = 0; + dsp->sampleOutR = 0; + } + if (bBurnRunAheadFrame == 0) { + // put final sample in the samplebuffer + dsp->sampleBuffer[(dsp->sampleOffset & 0x7ff) * 2] = dsp->sampleOutL; + dsp->sampleBuffer[(dsp->sampleOffset++ & 0x7ff) * 2 + 1] = dsp->sampleOutR; + } +} +static int clamp16(int val) { + return val < -0x8000 ? -0x8000 : (val > 0x7fff ? 0x7fff : val); +} + +static int clip16(int val) { + return (int16_t) (val & 0xffff); +} + +static bool dsp_checkCounter(Dsp* dsp, int rate) { + if(rate == 0) return false; + return ((dsp->counter + rateOffsets[rate]) % rateValues[rate]) == 0; +} + +static void dsp_handleEcho(Dsp* dsp) { + // increment fir buffer index + dsp->firBufferIndex++; + dsp->firBufferIndex &= 0x7; + // get value out of ram + uint16_t adr = dsp->echoBufferAdr + dsp->echoBufferIndex; + int16_t ramSample = dsp->apu->ram[adr] | (dsp->apu->ram[(adr + 1) & 0xffff] << 8); + dsp->firBufferL[dsp->firBufferIndex] = ramSample >> 1; + ramSample = dsp->apu->ram[(adr + 2) & 0xffff] | (dsp->apu->ram[(adr + 3) & 0xffff] << 8); + dsp->firBufferR[dsp->firBufferIndex] = ramSample >> 1; + // calculate FIR-sum + int sumL = 0, sumR = 0; + for(int i = 0; i < 8; i++) { + sumL += (dsp->firBufferL[(dsp->firBufferIndex + i + 1) & 0x7] * dsp->firValues[i]) >> 6; + sumR += (dsp->firBufferR[(dsp->firBufferIndex + i + 1) & 0x7] * dsp->firValues[i]) >> 6; + if(i == 6) { + // clip to 16-bit before last addition + sumL = clip16(sumL); + sumR = clip16(sumR); + } + } + sumL = clamp16(sumL) & ~1; + sumR = clamp16(sumR) & ~1; + // apply master volume and modify output with sum + dsp->sampleOutL = clamp16(((dsp->sampleOutL * dsp->masterVolumeL) >> 7) + ((sumL * dsp->echoVolumeL) >> 7)); + dsp->sampleOutR = clamp16(((dsp->sampleOutR * dsp->masterVolumeR) >> 7) + ((sumR * dsp->echoVolumeR) >> 7)); + // get echo value + int echoL = clamp16(dsp->echoOutL + clip16((sumL * dsp->feedbackVolume) >> 7)) & ~1; + int echoR = clamp16(dsp->echoOutR + clip16((sumR * dsp->feedbackVolume) >> 7)) & ~1; + // write it to ram + if(dsp->echoWrites) { + dsp->apu->ram[adr] = echoL & 0xff; + dsp->apu->ram[(adr + 1) & 0xffff] = echoL >> 8; + dsp->apu->ram[(adr + 2) & 0xffff] = echoR & 0xff; + dsp->apu->ram[(adr + 3) & 0xffff] = echoR >> 8; + } + // handle indexes + if(dsp->echoBufferIndex == 0) { + dsp->echoLength = dsp->echoDelay * 4; + } + dsp->echoBufferIndex += 4; + if(dsp->echoBufferIndex >= dsp->echoLength) { + dsp->echoBufferIndex = 0; + } +} + +static void dsp_cycleChannel(Dsp* dsp, int ch) { + // handle pitch counter + int pitch = dsp->channel[ch].pitch; + if(ch > 0 && dsp->channel[ch].pitchModulation) { + pitch += ((dsp->channel[ch - 1].sampleOut >> 5) * pitch) >> 10; + } + // get current brr header and get sample address + dsp->channel[ch].brrHeader = dsp->apu->ram[dsp->channel[ch].decodeOffset]; + uint16_t samplePointer = dsp->dirPage + 4 * dsp->channel[ch].srcn; + if(dsp->channel[ch].startDelay == 0) samplePointer += 2; + uint16_t sampleAdr = dsp->apu->ram[samplePointer] | (dsp->apu->ram[(samplePointer + 1) & 0xffff] << 8); + // handle starting of sample + if(dsp->channel[ch].startDelay > 0) { + if(dsp->channel[ch].startDelay == 5) { + // first keyed on + dsp->channel[ch].decodeOffset = sampleAdr; + dsp->channel[ch].blockOffset = 1; + dsp->channel[ch].bufferOffset = 0; + dsp->channel[ch].brrHeader = 0; + } + dsp->channel[ch].gain = 0; + dsp->channel[ch].startDelay--; + dsp->channel[ch].pitchCounter = 0; + if(dsp->channel[ch].startDelay > 0 && dsp->channel[ch].startDelay < 4) { + dsp->channel[ch].pitchCounter = 0x4000; + } + pitch = 0; + } + // get sample + int sample = 0; + if(dsp->channel[ch].useNoise) { + sample = clip16(dsp->noiseSample * 2); + } else { + sample = dsp_getSample(dsp, ch); + } + sample = ((sample * dsp->channel[ch].gain) >> 11) & ~1; + // handle reset and release + if(dsp->reset || (dsp->channel[ch].brrHeader & 0x03) == 1) { + dsp->channel[ch].adsrState = 3; // go to release + dsp->channel[ch].gain = 0; + } + // handle keyon/keyoff + if(dsp->evenCycle) { + if(dsp->channel[ch].keyOff) { + dsp->channel[ch].adsrState = 3; // go to release + } + if(dsp->channel[ch].keyOn) { + dsp->channel[ch].startDelay = 5; + dsp->channel[ch].adsrState = 0; // go to attack + dsp->channel[ch].keyOn = false; + dsp->ram[0x7c] &= ~(1 << ch); // clear ENDx + } + } + // handle envelope + if(dsp->channel[ch].startDelay == 0) { + dsp_handleGain(dsp, ch); + } + // decode new brr samples if needed and update offsets + if(dsp->channel[ch].pitchCounter >= 0x4000) { + dsp_decodeBrr(dsp, ch); + if(dsp->channel[ch].blockOffset >= 7) { + if(dsp->channel[ch].brrHeader & 0x1) { + dsp->channel[ch].decodeOffset = sampleAdr; + dsp->ram[0x7c] |= 1 << ch; // set ENDx + } else { + dsp->channel[ch].decodeOffset += 9; + } + dsp->channel[ch].blockOffset = 1; + } else { + dsp->channel[ch].blockOffset += 2; + } + } + // update pitch counter + dsp->channel[ch].pitchCounter &= 0x3fff; + dsp->channel[ch].pitchCounter += pitch; + if(dsp->channel[ch].pitchCounter > 0x7fff) dsp->channel[ch].pitchCounter = 0x7fff; + // set outputs + dsp->ram[(ch << 4) | 8] = dsp->channel[ch].gain >> 4; + dsp->ram[(ch << 4) | 9] = sample >> 8; + dsp->channel[ch].sampleOut = sample; + dsp->sampleOutL = clamp16(dsp->sampleOutL + ((sample * dsp->channel[ch].volumeL) >> 7)); + dsp->sampleOutR = clamp16(dsp->sampleOutR + ((sample * dsp->channel[ch].volumeR) >> 7)); + if(dsp->channel[ch].echoEnable) { + dsp->echoOutL = clamp16(dsp->echoOutL + ((sample * dsp->channel[ch].volumeL) >> 7)); + dsp->echoOutR = clamp16(dsp->echoOutR + ((sample * dsp->channel[ch].volumeR) >> 7)); + } +} + +static void dsp_handleGain(Dsp* dsp, int ch) { + int newGain = dsp->channel[ch].gain; + int rate = 0; + // handle gain mode + if(dsp->channel[ch].adsrState == 3) { // release + rate = 31; + newGain -= 8; + } else { + if(!dsp->channel[ch].useGain) { + rate = dsp->channel[ch].adsrRates[dsp->channel[ch].adsrState]; + switch(dsp->channel[ch].adsrState) { + case 0: newGain += rate == 31 ? 1024 : 32; break; // attack + case 1: newGain -= ((newGain - 1) >> 8) + 1; break; // decay + case 2: newGain -= ((newGain - 1) >> 8) + 1; break; // sustain + } + } else { + if(!dsp->channel[ch].directGain) { + rate = dsp->channel[ch].adsrRates[3]; + switch(dsp->channel[ch].gainMode) { + case 0: newGain -= 32; break; // linear decrease + case 1: newGain -= ((newGain - 1) >> 8) + 1; break; // exponential decrease + case 2: newGain += 32; break; // linear increase + case 3: newGain += (dsp->channel[ch].preclampGain < 0x600) ? 32 : 8; break; // bent increase + } + } else { // direct gain + rate = 31; + newGain = dsp->channel[ch].gainValue; + } + } + } + // use sustain level according to mode + int sustainLevel = dsp->channel[ch].useGain ? dsp->channel[ch].gainSustainLevel : dsp->channel[ch].sustainLevel; + if(dsp->channel[ch].adsrState == 1 && (newGain >> 8) == sustainLevel) { + dsp->channel[ch].adsrState = 2; // go to sustain + } + // store pre-clamped gain (for bent increase) + dsp->channel[ch].preclampGain = newGain & 0xffff; + // clamp gain + if(newGain < 0 || newGain > 0x7ff) { + newGain = newGain < 0 ? 0 : 0x7ff; + if(dsp->channel[ch].adsrState == 0) { + dsp->channel[ch].adsrState = 1; // go to decay + } + } + // store new value + if(dsp_checkCounter(dsp, rate)) dsp->channel[ch].gain = newGain; +} + +static int16_t dsp_getSample(Dsp* dsp, int ch) { + int pos = (dsp->channel[ch].pitchCounter >> 12) + dsp->channel[ch].bufferOffset; + int offset = (dsp->channel[ch].pitchCounter >> 4) & 0xff; + int16_t news = dsp->channel[ch].decodeBuffer[(pos + 3) % 12]; + int16_t olds = dsp->channel[ch].decodeBuffer[(pos + 2) % 12]; + int16_t olders = dsp->channel[ch].decodeBuffer[(pos + 1) % 12]; + int16_t oldests = dsp->channel[ch].decodeBuffer[pos % 12]; + int out = (gaussValues[0xff - offset] * oldests) >> 11; + out += (gaussValues[0x1ff - offset] * olders) >> 11; + out += (gaussValues[0x100 + offset] * olds) >> 11; + out = clip16(out) + ((gaussValues[offset] * news) >> 11); + return clamp16(out) & ~1; +} + +static void dsp_decodeBrr(Dsp* dsp, int ch) { + int shift = dsp->channel[ch].brrHeader >> 4; + int filter = (dsp->channel[ch].brrHeader & 0xc) >> 2; + int bOff = dsp->channel[ch].bufferOffset; + int old = dsp->channel[ch].decodeBuffer[bOff == 0 ? 11 : bOff - 1] >> 1; + int older = dsp->channel[ch].decodeBuffer[bOff == 0 ? 10 : bOff - 2] >> 1; + uint8_t curByte = 0; + for(int i = 0; i < 4; i++) { + int s = 0; + if(i & 1) { + s = curByte & 0xf; + } else { + curByte = dsp->apu->ram[(dsp->channel[ch].decodeOffset + dsp->channel[ch].blockOffset + (i >> 1)) & 0xffff]; + s = curByte >> 4; + } + if(s > 7) s -= 16; + if(shift <= 0xc) { + s = (s << shift) >> 1; + } else { + s = (s >> 3) << 12; + } + switch(filter) { + case 1: s += old + (-old >> 4); break; + case 2: s += 2 * old + ((3 * -old) >> 5) - older + (older >> 4); break; + case 3: s += 2 * old + ((13 * -old) >> 6) - older + ((3 * older) >> 4); break; + } + dsp->channel[ch].decodeBuffer[bOff + i] = clamp16(s) * 2; // cuts off bit 15 + older = old; + old = dsp->channel[ch].decodeBuffer[bOff + i] >> 1; + } + dsp->channel[ch].bufferOffset += 4; + if(dsp->channel[ch].bufferOffset >= 12) dsp->channel[ch].bufferOffset = 0; +} + +static void dsp_handleNoise(Dsp* dsp) { + if(dsp_checkCounter(dsp, dsp->noiseRate)) { + int bit = (dsp->noiseSample & 1) ^ ((dsp->noiseSample >> 1) & 1); + dsp->noiseSample = ((dsp->noiseSample >> 1) & 0x3fff) | (bit << 14); + } +} + +uint8_t dsp_read(Dsp* dsp, uint8_t adr) { + return dsp->ram[adr]; +} + +void dsp_write(Dsp* dsp, uint8_t adr, uint8_t val) { + int ch = adr >> 4; + switch(adr) { + case 0x00: case 0x10: case 0x20: case 0x30: case 0x40: case 0x50: case 0x60: case 0x70: { + dsp->channel[ch].volumeL = val; + break; + } + case 0x01: case 0x11: case 0x21: case 0x31: case 0x41: case 0x51: case 0x61: case 0x71: { + dsp->channel[ch].volumeR = val; + break; + } + case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72: { + dsp->channel[ch].pitch = (dsp->channel[ch].pitch & 0x3f00) | val; + break; + } + case 0x03: case 0x13: case 0x23: case 0x33: case 0x43: case 0x53: case 0x63: case 0x73: { + dsp->channel[ch].pitch = ((dsp->channel[ch].pitch & 0x00ff) | (val << 8)) & 0x3fff; + break; + } + case 0x04: case 0x14: case 0x24: case 0x34: case 0x44: case 0x54: case 0x64: case 0x74: { + dsp->channel[ch].srcn = val; + break; + } + case 0x05: case 0x15: case 0x25: case 0x35: case 0x45: case 0x55: case 0x65: case 0x75: { + dsp->channel[ch].adsrRates[0] = (val & 0xf) * 2 + 1; + dsp->channel[ch].adsrRates[1] = ((val & 0x70) >> 4) * 2 + 16; + dsp->channel[ch].useGain = (val & 0x80) == 0; + break; + } + case 0x06: case 0x16: case 0x26: case 0x36: case 0x46: case 0x56: case 0x66: case 0x76: { + dsp->channel[ch].adsrRates[2] = val & 0x1f; + dsp->channel[ch].sustainLevel = (val & 0xe0) >> 5; + break; + } + case 0x07: case 0x17: case 0x27: case 0x37: case 0x47: case 0x57: case 0x67: case 0x77: { + dsp->channel[ch].directGain = (val & 0x80) == 0; + dsp->channel[ch].gainMode = (val & 0x60) >> 5; + dsp->channel[ch].adsrRates[3] = val & 0x1f; + dsp->channel[ch].gainValue = (val & 0x7f) * 16; + dsp->channel[ch].gainSustainLevel = (val & 0xe0) >> 5; + break; + } + case 0x0c: { + dsp->masterVolumeL = val; + break; + } + case 0x1c: { + dsp->masterVolumeR = val; + break; + } + case 0x2c: { + dsp->echoVolumeL = val; + break; + } + case 0x3c: { + dsp->echoVolumeR = val; + break; + } + case 0x4c: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].keyOn = val & (1 << i); + } + break; + } + case 0x5c: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].keyOff = val & (1 << i); + } + break; + } + case 0x6c: { + dsp->reset = val & 0x80; + dsp->mute = val & 0x40; + dsp->echoWrites = (val & 0x20) == 0; + dsp->noiseRate = val & 0x1f; + break; + } + case 0x7c: { + val = 0; // any write clears ENDx + break; + } + case 0x0d: { + dsp->feedbackVolume = val; + break; + } + case 0x2d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].pitchModulation = val & (1 << i); + } + break; + } + case 0x3d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].useNoise = val & (1 << i); + } + break; + } + case 0x4d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].echoEnable = val & (1 << i); + } + break; + } + case 0x5d: { + dsp->dirPage = val << 8; + break; + } + case 0x6d: { + dsp->echoBufferAdr = val << 8; + break; + } + case 0x7d: { + dsp->echoDelay = (val & 0xf) * 512; // 2048-byte steps, stereo sample is 4 bytes + break; + } + case 0x0f: case 0x1f: case 0x2f: case 0x3f: case 0x4f: case 0x5f: case 0x6f: case 0x7f: { + dsp->firValues[ch] = val; + break; + } + } + dsp->ram[adr] = val; +} + +void dsp_getSamples(Dsp* dsp, int16_t* sampleData, int samplesPerFrame) { + // resample from 534 / 641 samples per frame to wanted value + float wantedSamples = (dsp->apu->snes->palTiming ? 641.0 : 534.0); + double adder = wantedSamples / samplesPerFrame; + double location = dsp->lastFrameBoundary - wantedSamples; + for(int i = 0; i < samplesPerFrame; i++) { + sampleData[i * 2] = dsp->sampleBuffer[(((int) location) & 0x7ff) * 2]; + sampleData[i * 2 + 1] = dsp->sampleBuffer[(((int) location) & 0x7ff) * 2 + 1]; + location += adder; + } +} diff --git a/src/burn/drv/snes/dsp.h b/src/burn/drv/snes/dsp.h new file mode 100644 index 000000000..91d1a5c91 --- /dev/null +++ b/src/burn/drv/snes/dsp.h @@ -0,0 +1,99 @@ + +#ifndef DSP_H +#define DSP_H + +#include +#include + +typedef struct Dsp Dsp; + +#include "apu.h" +#include "statehandler.h" + +typedef struct DspChannel { + // pitch + uint16_t pitch; + uint16_t pitchCounter; + bool pitchModulation; + // brr decoding + int16_t decodeBuffer[12]; + uint8_t bufferOffset; + uint8_t srcn; + uint16_t decodeOffset; + uint8_t blockOffset; // offset within brr block + uint8_t brrHeader; + bool useNoise; + uint8_t startDelay; + // adsr, envelope, gain + uint8_t adsrRates[4]; // attack, decay, sustain, gain + uint8_t adsrState; // 0: attack, 1: decay, 2: sustain, 3: release + uint8_t sustainLevel; + uint8_t gainSustainLevel; + bool useGain; + uint8_t gainMode; + bool directGain; + uint16_t gainValue; // for direct gain + uint16_t preclampGain; // for bent increase + uint16_t gain; + // keyon/off + bool keyOn; + bool keyOff; + // output + int16_t sampleOut; // final sample, to be multiplied by channel volume + int8_t volumeL; + int8_t volumeR; + bool echoEnable; +} DspChannel; + +struct Dsp { + Apu* apu; + // mirror ram + uint8_t ram[0x80]; + // 8 channels + DspChannel channel[8]; + // overarching + uint16_t counter; + uint16_t dirPage; + bool evenCycle; + bool mute; + bool reset; + int8_t masterVolumeL; + int8_t masterVolumeR; + // accumulation + int16_t sampleOutL; + int16_t sampleOutR; + int16_t echoOutL; + int16_t echoOutR; + // noise + int16_t noiseSample; + uint8_t noiseRate; + // echo + bool echoWrites; + int8_t echoVolumeL; + int8_t echoVolumeR; + int8_t feedbackVolume; + uint16_t echoBufferAdr; + uint16_t echoDelay; + uint16_t echoLength; + uint16_t echoBufferIndex; + uint8_t firBufferIndex; + int8_t firValues[8]; + int16_t firBufferL[8]; + int16_t firBufferR[8]; + // sample ring buffer (2048 samples, *2 for stereo) + int16_t sampleBuffer[0x800 * 2]; + uint16_t sampleOffset; // current offset in samplebuffer + uint16_t lastFrameBoundary; +}; + +Dsp* dsp_init(Apu* apu); +void dsp_free(Dsp* dsp); +void dsp_reset(Dsp* dsp); +void dsp_handleState(Dsp* dsp, StateHandler* sh); +void dsp_cycle(Dsp* dsp); +uint8_t dsp_read(Dsp* dsp, uint8_t adr); +void dsp_write(Dsp* dsp, uint8_t adr, uint8_t val); +void dsp_getSamples(Dsp* dsp, int16_t* sampleData, int samplesPerFrame); +void dsp_newFrame(Dsp* dsp); + +#endif diff --git a/src/burn/drv/snes/input.cpp b/src/burn/drv/snes/input.cpp new file mode 100644 index 000000000..a9b6a21f0 --- /dev/null +++ b/src/burn/drv/snes/input.cpp @@ -0,0 +1,107 @@ +\ +#include +#include +#include +#include +#include + +#include "input.h" +#include "snes.h" +#include "statehandler.h" + +Input* input_init(Snes* snes, int8_t tag) { + Input* input = (Input*)BurnMalloc(sizeof(Input)); + input->snes = snes; + // TODO: handle (where?) + input->portTag = tag; // 1, 2, ... + input->type = DEVICE_GAMEPAD; + input->currentState = 0; + // TODO: handle I/O line (and latching of PPU) + return input; +} + +void input_free(Input* input) { + BurnFree(input); +} + +void input_reset(Input* input) { + input->latchLine = false; + input->latchedState = 0; + input->currentState = 0; + input->lastX = 0; + input->lastY = 0; + input->mouseSens = 0; +} + +void input_handleState(Input* input, StateHandler* sh) { + sh_handleBytes(sh, &input->type, &input->lastX, &input->lastY, &input->mouseSens, NULL); + sh_handleBools(sh, &input->latchLine, NULL); + sh_handleInts(sh, &input->currentState, &input->latchedState, NULL); +} + +void input_setType(Input* input, uint8_t type) { + input->type = type; +} + +#define d_min(a, b) (((a) < (b)) ? (a) : (b)) +#define d_abs(z) (((z) < 0) ? -(z) : (z)) + +void input_setMouse(Input* input, int16_t x, int16_t y, uint8_t buttonA, uint8_t buttonB) { + x >>= 8; + y >>= 8; + input->lastX = (x) ? (x < 0) << 7 : input->lastX; + input->lastY = (y) ? (y < 0) << 7 : input->lastY; + x = d_min(d_abs(x), 0x7f); + y = d_min(d_abs(y), 0x7f); + input->currentState = 0; + input->currentState |= (0x01 | (input->mouseSens % 3) << 4 | (buttonA) << 6 | (buttonB) << 7) << 16; + input->currentState |= (y | input->lastY) << 8; + input->currentState |= (x | input->lastX) << 0; +} + +static void update_mouse_sensitivity(Input* input) { + input->currentState = (input->currentState & ~0x300000) | ((input->mouseSens % 3) << (4 + 16)); +} + +void input_latch(Input* input, bool value) { +// if(input->latchLine && !value) { + if(value) { + input->latchedState = input->currentState; + if (input->type == DEVICE_MOUSE) { + update_mouse_sensitivity(input); + } + } + input->latchLine = value; +} + +uint8_t input_read(Input* input) { + if(input->latchLine) { + input->latchedState = input->currentState; + } + uint8_t ret = 0; + switch (input->type) { + case DEVICE_NONE: + input_reset(input); + ret = 0x00; + break; + case DEVICE_MOUSE: + if (input->latchLine) { + // fun feature: reading the mouse while latched changes the sensitivty + // setting + update_mouse_sensitivity(input); + input->mouseSens++; + } + ret = (input->latchedState >> 31) & 1; + input->latchedState <<= 1; + input->latchedState |= 1; + break; + case DEVICE_GAMEPAD: + case DEVICE_SUPERSCOPE: + default: + ret = input->latchedState & 1; + input->latchedState >>= 1; + input->latchedState |= 0x8000; + break; + } + return ret; +} diff --git a/src/burn/drv/snes/input.h b/src/burn/drv/snes/input.h new file mode 100644 index 000000000..c6065b263 --- /dev/null +++ b/src/burn/drv/snes/input.h @@ -0,0 +1,39 @@ + +#ifndef INPUT_H +#define INPUT_H + +#include +#include + +typedef struct Input Input; + +#include "snes.h" +#include "statehandler.h" + +enum { DEVICE_NONE = 0, DEVICE_GAMEPAD = 1, DEVICE_SUPERSCOPE = 2, DEVICE_MOUSE = 3 }; +enum { SCOPE_FIRE = 1 << 0, SCOPE_CURSOR = 1 << 1, SCOPE_TURBO = 1 << 2, SCOPE_PAUSE = 1 << 3, SCOPE_RELOAD = 1 << 6 }; + +struct Input { + Snes* snes; + uint8_t type; + uint8_t portTag; + // latchline + bool latchLine; + // for controller + uint32_t currentState; // actual state + uint32_t latchedState; + // for mouse + uint8_t lastX, lastY; + uint8_t mouseSens; +}; + +Input* input_init(Snes* snes, int8_t tag); +void input_free(Input* input); +void input_reset(Input* input); +void input_handleState(Input* input, StateHandler* sh); +void input_latch(Input* input, bool value); +uint8_t input_read(Input* input); +void input_setMouse(Input* input, int16_t x, int16_t y, uint8_t buttonA, uint8_t buttonB); +void input_setType(Input* input, uint8_t type); + +#endif diff --git a/src/burn/drv/snes/license.txt b/src/burn/drv/snes/license.txt new file mode 100644 index 000000000..cf0e4b1c1 --- /dev/null +++ b/src/burn/drv/snes/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-2024 elzo_d, dink + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/burn/drv/snes/ppu.cpp b/src/burn/drv/snes/ppu.cpp new file mode 100644 index 000000000..74bf3a695 --- /dev/null +++ b/src/burn/drv/snes/ppu.cpp @@ -0,0 +1,1371 @@ + +#include +#include +#include +#include +#include + +#include "ppu.h" +#include "snes.h" +#include "statehandler.h" + +// array for layer definitions per mode: +// 0-7: mode 0-7; 8: mode 1 + l3prio; 9: mode 7 + extbg + +// 0-3; layers 1-4; 4: sprites; 5: nonexistent +static const int layersPerMode[10][12] = { + {4, 0, 1, 4, 0, 1, 4, 2, 3, 4, 2, 3}, + {4, 0, 1, 4, 0, 1, 4, 2, 4, 2, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 4, 0, 4, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 0, 4, 5, 5, 5, 5, 5, 5, 5}, + {2, 4, 0, 1, 4, 0, 1, 4, 4, 2, 5, 5}, + {4, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5, 5} +}; + +static const int prioritysPerMode[10][12] = { + {3, 1, 1, 2, 0, 0, 1, 1, 1, 0, 0, 0}, + {3, 1, 1, 2, 0, 0, 1, 1, 0, 0, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 0, 0, 5, 5, 5, 5, 5, 5}, + {3, 2, 1, 0, 0, 5, 5, 5, 5, 5, 5, 5}, + {1, 3, 1, 1, 2, 0, 0, 1, 0, 0, 5, 5}, + {3, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5, 5} +}; + +static const int layerCountPerMode[10] = { + 12, 10, 8, 8, 8, 8, 6, 5, 10, 7 +}; + +static const int bitDepthsPerMode[10][4] = { + {2, 2, 2, 2}, + {4, 4, 2, 5}, + {4, 4, 5, 5}, + {8, 4, 5, 5}, + {8, 2, 5, 5}, + {4, 2, 5, 5}, + {4, 5, 5, 5}, + {8, 5, 5, 5}, + {4, 4, 2, 5}, + {8, 7, 5, 5} +}; + +static const int spriteSizes[8][2] = { + {8, 16}, {8, 32}, {8, 64}, {16, 32}, + {16, 64}, {32, 64}, {16, 32}, {16, 32} +}; + +static uint32_t bright_lut[0x10]; +static uint8_t color_clamp_lut[0x20 * 3]; +static uint8_t *color_clamp_lut_i20 = &color_clamp_lut[0x20]; + +static uint16_t bg_line_buf[4]; +static uint8_t bg_prio_buf[4]; +static bool bg_window_state[6]; // 0-3 (bg) 4 (spr) 5 (colorwind) + +static Snes* snes; +// vram access +static uint16_t vram[0x8000]; +static uint16_t vramPointer; +static bool vramIncrementOnHigh; +static uint16_t vramIncrement; +static uint8_t vramRemapMode; +static uint16_t vramReadBuffer; +// cgram access +static uint16_t cgram[0x100]; +static uint8_t cgramPointer; +static bool cgramSecondWrite; +static uint8_t cgramBuffer; +// oam access +static uint16_t oam[0x100]; +static uint8_t highOam[0x20]; +static uint8_t oamAdr; +static uint8_t oamAdrWritten; +static bool oamInHigh; +static bool oamInHighWritten; +static bool oamSecondWrite; +static uint8_t oamBuffer; +// object/sprites +static bool objPriority; +static uint16_t objTileAdr1; +static uint16_t objTileAdr2; +static uint8_t objSize; +static uint8_t objPixelBuffer[256]; // line buffers +static uint8_t objPriorityBuffer[256]; +static bool timeOver; +static bool rangeOver; +static bool objInterlace; +// background layers +static BgLayer bgLayer[4]; +static uint8_t scrollPrev; +static uint8_t scrollPrev2; +static uint8_t mosaicSize; +static uint8_t mosaicStartLine; +// layers +static Layer layer[5]; +// mode 7 +static int16_t m7matrix[8]; // a, b, c, d, x, y, h, v +static uint8_t m7prev; +static bool m7largeField; +static bool m7charFill; +static bool m7xFlip; +static bool m7yFlip; +static bool m7extBg; +// mode 7 internal +static int32_t m7startX; +static int32_t m7startY; +// windows +static WindowLayer windowLayer[6]; +static uint8_t window1left; +static uint8_t window1right; +static uint8_t window2left; +static uint8_t window2right; +// color math +static uint8_t clipMode; +static uint8_t preventMathMode; +static bool addSubscreen; +static bool subtractColor; +static bool halfColor; +static bool mathEnabled[6]; +static uint8_t fixedColorR; +static uint8_t fixedColorG; +static uint8_t fixedColorB; +// settings +static bool forcedBlank; +static uint8_t brightness; +static uint8_t mode; +static bool bg3priority; +static bool evenFrame; +static bool pseudoHires; +static bool overscan; +static bool frameOverscan; // if we are overscanning this frame (determined at 0,225) +static bool interlace; +static bool frameInterlace; // if we are interlacing this frame (determined at start vblank) +static bool directColor; +// latching +static uint16_t hCount; +static uint16_t vCount; +static bool hCountSecond; +static bool vCountSecond; +static bool countersLatched; +static uint8_t ppu1openBus; +static uint8_t ppu2openBus; +// super scope (zapper) +static uint16_t hScope; +static uint16_t vScope; +static bool bScopeLatch; + +// pixel buffer (char)(xbgr) == (int)(xrgb) [int endianness] +// times 2 for even and odd frame +static uint8_t pixelBuffer[512 * 4 * 239 * 2]; + +bool ppu_frameInterlace() { + return frameInterlace; +} + +bool ppu_evenFrame() { + return evenFrame; +} + +static inline void ppu_handlePixel(int x, int y); +static inline int ppu_getPixel(int x, int y, bool sub, int* r, int* g, int* b); +static uint16_t ppu_getOffsetValue(int col, int row); +static inline void ppu_getPixelForBgLayer(int x, int y, int nlayer); //, bool priority, uint16_t *pixelCache, uint8_t *pixelCachePriority); +static void ppu_handleOPT(int nlayer, int* lx, int* ly); +static void ppu_calculateMode7Starts(int y); +static int ppu_getPixelForMode7(int x, int nlayer, bool priority); +static inline bool ppu_getWindowState(int nlayer, int x); +static void ppu_evaluateSprites(int line); +static uint16_t ppu_getVramRemap(); + +void ppu_init(Snes* ssnes) { + snes = ssnes; +} + +void ppu_free() { +} + +void ppu_reset() { + for (int i = 0; i < 0x10; i++) { + bright_lut[i] = (i * 0x10000) / 15; + } + for (int i = 0; i < 0x20*3; i++) { + if (i < 0x20) { + color_clamp_lut[i] = 0; + } + if (i >= 0x20 && i <= 0x3f) { + color_clamp_lut[i] = i - 0x20; // 0 - 1f + } + if (i >= 0x40) { + color_clamp_lut[i] = 0x1f; + } + } + memset(vram, 0, sizeof(vram)); + vramPointer = 0; + vramIncrementOnHigh = false; + vramIncrement = 1; + vramRemapMode = 0; + vramReadBuffer = 0; + memset(cgram, 0, sizeof(cgram)); + cgramPointer = 0; + cgramSecondWrite = false; + cgramBuffer = 0; + memset(oam, 0, sizeof(oam)); + memset(highOam, 0, sizeof(highOam)); + oamAdr = 0; + oamAdrWritten = 0; + oamInHigh = false; + oamInHighWritten = false; + oamSecondWrite = false; + oamBuffer = 0; + objPriority = false; + objTileAdr1 = 0; + objTileAdr2 = 0; + objSize = 0; + memset(objPixelBuffer, 0, sizeof(objPixelBuffer)); + memset(objPriorityBuffer, 0, sizeof(objPriorityBuffer)); + timeOver = false; + rangeOver = false; + objInterlace = false; + for(int i = 0; i < 4; i++) { + bgLayer[i].hScroll = 0; + bgLayer[i].vScroll = 0; + bgLayer[i].tilemapWider = false; + bgLayer[i].tilemapHigher = false; + bgLayer[i].tilemapAdr = 0; + bgLayer[i].tileAdr = 0; + bgLayer[i].bigTiles = false; + bgLayer[i].mosaicEnabled = false; + } + scrollPrev = 0; + scrollPrev2 = 0; + mosaicSize = 1; + mosaicStartLine = 1; + for(int i = 0; i < 5; i++) { + layer[i].mainScreenEnabled = false; + layer[i].subScreenEnabled = false; + layer[i].mainScreenWindowed = false; + layer[i].subScreenWindowed = false; + } + memset(m7matrix, 0, sizeof(m7matrix)); + m7prev = 0; + m7largeField = false; + m7charFill = false; + m7xFlip = false; + m7yFlip = false; + m7extBg = false; + m7startX = 0; + m7startY = 0; + for(int i = 0; i < 6; i++) { + windowLayer[i].window1enabled = false; + windowLayer[i].window2enabled = false; + windowLayer[i].window1inversed = false; + windowLayer[i].window2inversed = false; + windowLayer[i].maskLogic = 0; + } + window1left = 0; + window1right = 0; + window2left = 0; + window2right = 0; + clipMode = 0; + preventMathMode = 0; + addSubscreen = false; + subtractColor = false; + halfColor = false; + memset(mathEnabled, 0, sizeof(mathEnabled)); + fixedColorR = 0; + fixedColorG = 0; + fixedColorB = 0; + forcedBlank = true; + brightness = 0; + mode = 0; + bg3priority = false; + evenFrame = false; + pseudoHires = false; + overscan = false; + frameOverscan = false; + interlace = false; + frameInterlace = false; + directColor = false; + hCount = 0; + vCount = 0; + hCountSecond = false; + vCountSecond = false; + countersLatched = false; + ppu1openBus = 0; + ppu2openBus = 0; + memset(pixelBuffer, 0, sizeof(pixelBuffer)); +} + +void ppu_handleState(StateHandler* sh) { + sh_handleBools(sh, + &vramIncrementOnHigh, &cgramSecondWrite, &oamInHigh, &oamInHighWritten, &oamSecondWrite, + &objPriority, &timeOver, &rangeOver, &objInterlace, &m7largeField, &m7charFill, + &m7xFlip, &m7yFlip, &m7extBg, &addSubscreen, &subtractColor, &halfColor, + &mathEnabled[0], &mathEnabled[1], &mathEnabled[2], &mathEnabled[3], &mathEnabled[4], + &mathEnabled[5], &forcedBlank, &bg3priority, &evenFrame, &pseudoHires, &overscan, + &frameOverscan, &interlace, &frameInterlace, &directColor, &hCountSecond, &vCountSecond, + &countersLatched, NULL + ); + sh_handleBytes(sh, + &vramRemapMode, &cgramPointer, &cgramBuffer, &oamAdr, &oamAdrWritten, &oamBuffer, + &objSize, &scrollPrev, &scrollPrev2, &mosaicSize, &mosaicStartLine, &m7prev, + &window1left, &window1right, &window2left, &window2right, &clipMode, &preventMathMode, + &fixedColorR, &fixedColorG, &fixedColorB, &brightness, &mode, + &ppu1openBus, &ppu2openBus, NULL + ); + sh_handleWords(sh, + &vramPointer, &vramIncrement, &vramReadBuffer, &objTileAdr1, &objTileAdr2, + &hCount, &vCount, NULL + ); + sh_handleWordsS(sh, + &m7matrix[0], &m7matrix[1], &m7matrix[2], &m7matrix[3], &m7matrix[4], &m7matrix[5], + &m7matrix[6], &m7matrix[7], NULL + ); + sh_handleIntsS(sh, &m7startX, &m7startY, NULL); + for(int i = 0; i < 4; i++) { + sh_handleBools(sh, + &bgLayer[i].tilemapWider, &bgLayer[i].tilemapHigher, &bgLayer[i].bigTiles, + &bgLayer[i].mosaicEnabled, NULL + ); + sh_handleWords(sh, + &bgLayer[i].hScroll, &bgLayer[i].vScroll, &bgLayer[i].tilemapAdr, &bgLayer[i].tileAdr, NULL + ); + } + for(int i = 0; i < 5; i++) { + sh_handleBools(sh, + &layer[i].mainScreenEnabled, &layer[i].subScreenEnabled, &layer[i].mainScreenWindowed, + &layer[i].subScreenWindowed, NULL + ); + } + for(int i = 0; i < 6; i++) { + sh_handleBools(sh, + &windowLayer[i].window1enabled, &windowLayer[i].window1inversed, &windowLayer[i].window2enabled, + &windowLayer[i].window2inversed, NULL + ); + sh_handleBytes(sh, &windowLayer[i].maskLogic, NULL); + } + sh_handleWordArray(sh, vram, 0x8000); + sh_handleWordArray(sh, cgram, 0x100); + sh_handleWordArray(sh, oam, 0x100); + sh_handleByteArray(sh, highOam, 0x20); + sh_handleByteArray(sh, objPixelBuffer, 256); + sh_handleByteArray(sh, objPriorityBuffer, 256); +} + +bool ppu_checkOverscan() { + // called at (0,225) + frameOverscan = overscan; // set if we have a overscan-frame + return frameOverscan; +} + +void ppu_handleVblank() { + // called either right after ppu_checkOverscan at (0,225), or at (0,240) + if(!forcedBlank) { + oamAdr = oamAdrWritten; + oamInHigh = oamInHighWritten; + oamSecondWrite = false; + } + frameInterlace = interlace; // set if we have a interlaced frame + ppu_latchScopeCheck(true); // reset scope latch if it was not hit this frame +} + +void ppu_handleFrameStart() { + // called at (0, 0) + mosaicStartLine = 1; + rangeOver = false; + timeOver = false; + evenFrame = !evenFrame; +} + +static int layerCache[4] = { -1, -1, -1, -1 }; + +void ppu_latchMode7(int line) { + if(mode == 7) ppu_calculateMode7Starts(line); +} + +void ppu_runLine(int line) { + // called for lines 1-224/239 + // evaluate sprites + memset(objPixelBuffer, 0, sizeof(objPixelBuffer)); + if(!forcedBlank) ppu_evaluateSprites(line - 1); + if (!pBurnDraw) { return;} /// super speeeeeeeeeeeeeeeeeeeeeeeeeeeeed!!!! + // actual line + // if(mode == 7) ppu_calculateMode7Starts(line); // note: latched at hPos == 22! + layerCache[0] = layerCache[1] = layerCache[2] = layerCache[3] = -1; +#if 0 + for(int x = 0; x < 256; x++) { + ppu_handlePixel(x, line); + } +#endif +#if 1 + for(int x = 0; x < 256; x+=8) { + ppu_handlePixel(x + 0, line); + ppu_handlePixel(x + 1, line); + ppu_handlePixel(x + 2, line); + ppu_handlePixel(x + 3, line); + ppu_handlePixel(x + 4, line); + ppu_handlePixel(x + 5, line); + ppu_handlePixel(x + 6, line); + ppu_handlePixel(x + 7, line); + } +#endif +} + +static inline void ppu_handlePixel(int x, int y) { + int r = 0, r2 = 0; + int g = 0, g2 = 0; + int b = 0, b2 = 0; + bool bhalfColor = halfColor; + + bg_window_state[0] = ppu_getWindowState(0, x); + bg_window_state[1] = ppu_getWindowState(1, x); + bg_window_state[2] = ppu_getWindowState(2, x); + bg_window_state[3] = ppu_getWindowState(3, x); + bg_window_state[4] = ppu_getWindowState(4, x); + bg_window_state[5] = ppu_getWindowState(5, x); + + if(!forcedBlank) { + int mainLayer = ppu_getPixel(x, y, false, &r, &g, &b); + // bool colorWindowState = ppu_getWindowState(5, x); + bool colorWindowState = bg_window_state[5]; + bool bClipIfHires = false; + if( + clipMode == 3 || + (clipMode == 2 && colorWindowState) || + (clipMode == 1 && !colorWindowState) + ) { + if (clipMode < 3) bhalfColor = false; + r = 0; + g = 0; + b = 0; + bClipIfHires = true; + } + int secondLayer = 5; // backdrop + bool bmathEnabled = mainLayer < 6 && mathEnabled[mainLayer] && !( + preventMathMode == 3 || + (preventMathMode == 2 && colorWindowState) || + (preventMathMode == 1 && !colorWindowState) + ); + bool bHighRes = pseudoHires || mode == 5 || mode == 6; + if((bmathEnabled && addSubscreen) || bHighRes) { + secondLayer = ppu_getPixel(x, y, true, &r2, &g2, &b2); + if (bHighRes && bClipIfHires) { r2 = g2 = b2 = 0; } // jpark hires odd pixels border clipping + } + // TODO: subscreen pixels can be clipped to black as well (done, line above -dink) + // TODO: math for subscreen pixels (add/sub sub to main, in hires mode) (done, partially: only add/sub subscreen with fixedcolor for now -dink) + if(bmathEnabled) { + if(subtractColor) { + if (addSubscreen && secondLayer != 5) { + r -= r2; + g -= g2; + b -= b2; + } else { + r -= fixedColorR; + g -= fixedColorG; + b -= fixedColorB; + if (bHighRes) { + r2 = color_clamp_lut_i20[r2 - fixedColorR]; + g2 = color_clamp_lut_i20[g2 - fixedColorG]; + b2 = color_clamp_lut_i20[b2 - fixedColorB]; + } + } + } else { + if (addSubscreen && secondLayer != 5) { + r += r2; + g += g2; + b += b2; + } else { + r += fixedColorR; + g += fixedColorG; + b += fixedColorB; + if (bHighRes) { + r2 = color_clamp_lut_i20[r2 + fixedColorR]; + g2 = color_clamp_lut_i20[g2 + fixedColorG]; + b2 = color_clamp_lut_i20[b2 + fixedColorB]; + } + } + } + if(bhalfColor && (secondLayer != 5 || !addSubscreen)) { + r >>= 1; + g >>= 1; + b >>= 1; + } + r = color_clamp_lut_i20[r]; + g = color_clamp_lut_i20[g]; + b = color_clamp_lut_i20[b]; + } + if(pseudoHires && mode < 5) { + r = r2 = (r + r2) >> 1; + b = b2 = (b + b2) >> 1; + g = g2 = (g + g2) >> 1; + } + if(bHighRes == false) { + r2 = r; g2 = g; b2 = b; + } + } + UINT32 *dest = (UINT32*)&pixelBuffer[((y - 1) + (evenFrame ? 0 : 239)) * 2048 + x * 8]; + + dest[0] = (UINT8)((((b2 << 3) | (b2 >> 2)) * bright_lut[brightness]) >> 16) << 0 | + (UINT8)((((g2 << 3) | (g2 >> 2)) * bright_lut[brightness]) >> 16) << 8 | + (UINT8)((((r2 << 3) | (r2 >> 2)) * bright_lut[brightness]) >> 16) << 16; + + dest[1] = (UINT8)((((b << 3) | (b >> 2)) * bright_lut[brightness]) >> 16) << 0 | + (UINT8)((((g << 3) | (g >> 2)) * bright_lut[brightness]) >> 16) << 8 | + (UINT8)((((r << 3) | (r >> 2)) * bright_lut[brightness]) >> 16) << 16; +} + +static inline int ppu_getPixel(int x, int y, bool sub, int* r, int* g, int* b) { + // figure out which color is on this location on main- or subscreen, sets it in r, g, b + // returns which layer it is: 0-3 for bg layer, 4 or 6 for sprites (depending on palette), 5 for backdrop + uint32_t actMode = mode == 1 && bg3priority ? 8 : mode; + actMode = mode == 7 && m7extBg ? 9 : actMode; + uint32_t nlayer = 5; + uint32_t pixel = 0; + + for(int i = 0; i < layerCountPerMode[actMode]; i++) { + uint32_t curLayer = layersPerMode[actMode][i]; + uint32_t curPriority = prioritysPerMode[actMode][i]; + bool layerActive = false; + if(!sub) { + layerActive = layer[curLayer].mainScreenEnabled && ( + !layer[curLayer].mainScreenWindowed || !bg_window_state[curLayer] //!ppu_getWindowState(curLayer, x) + ); + } else { + layerActive = layer[curLayer].subScreenEnabled && ( + !layer[curLayer].subScreenWindowed || !bg_window_state[curLayer] //!ppu_getWindowState(curLayer, x) + ); + } + if(layerActive) { +#if 0 + if (y==1 && x==0) { + bprintf(0, _T("Layer %x Prio %x i %x\n"), curLayer, curPriority, i); + } +#endif + if(curLayer < 4) { + // bg layer + int lx = x; + int ly = y; + if(bgLayer[curLayer].mosaicEnabled && mosaicSize > 1) { + lx -= lx % mosaicSize; + ly -= (ly - mosaicStartLine) % mosaicSize; + } + if(mode == 7) { + pixel = ppu_getPixelForMode7(lx, curLayer, curPriority); + } else { + lx += bgLayer[curLayer].hScroll; + if(mode == 5 || mode == 6) { + lx *= 2; + lx += (sub || bgLayer[curLayer].mosaicEnabled) ? 0 : 1; + if(interlace) { + ly *= 2; + ly += (evenFrame || bgLayer[curLayer].mosaicEnabled) ? 0 : 1; + } + } + ly += bgLayer[curLayer].vScroll; + if(mode == 2 || mode == 4 || mode == 6) { + ppu_handleOPT(curLayer, &lx, &ly); + } + if (lx != layerCache[curLayer]) { + ppu_getPixelForBgLayer(lx & 0x3ff, ly & 0x3ff, curLayer); + layerCache[curLayer] = lx; + } + pixel = (bg_prio_buf[curLayer] == curPriority) ? bg_line_buf[curLayer] : 0; + } + } else { + // get a pixel from the sprite buffer + pixel = 0; + if(objPriorityBuffer[x] == curPriority) pixel = objPixelBuffer[x]; + } + } + if(pixel) { + nlayer = curLayer; + break; + } + } + if(directColor && nlayer < 4 && bitDepthsPerMode[actMode][nlayer] == 8) { + *r = ((pixel & 0x7) << 2) | ((pixel & 0x100) >> 7); + *g = ((pixel & 0x38) >> 1) | ((pixel & 0x200) >> 8); + *b = ((pixel & 0xc0) >> 3) | ((pixel & 0x400) >> 8); + } else { + uint16_t color = cgram[pixel & 0xff]; + *r = color & 0x1f; + *g = (color >> 5) & 0x1f; + *b = (color >> 10) & 0x1f; + } + if(nlayer == 4 && pixel < 0xc0) nlayer = 6; // sprites with palette color < 0xc0 + return nlayer; +} + +static void ppu_handleOPT(int nlayer, int* lx, int* ly) { + int x = *lx; + int y = *ly; + int column = 0; + if(mode == 6) { + column = ((x - (x & 0xf)) - ((bgLayer[nlayer].hScroll * 2) & 0xfff0)) >> 4; + } else { + column = ((x - (x & 0x7)) - (bgLayer[nlayer].hScroll & 0xfff8)) >> 3; + } + if(column > 0) { + // fetch offset values from nlayer 3 tilemap + int valid = nlayer == 0 ? 0x2000 : 0x4000; + uint16_t hOffset = ppu_getOffsetValue(column - 1, 0); + uint16_t vOffset = 0; + if(mode == 4) { + if(hOffset & 0x8000) { + vOffset = hOffset; + hOffset = 0; + } + } else { + vOffset = ppu_getOffsetValue(column - 1, 1); + } + if(mode == 6) { + // TODO: not sure if correct + if(hOffset & valid) *lx = (((hOffset & 0x3f8) + (column * 8)) * 2) | (x & 0xf); + } else { + if(hOffset & valid) *lx = ((hOffset & 0x3f8) + (column * 8)) | (x & 0x7); + } + // TODO: not sure if correct for interlace + if(vOffset & valid) *ly = (vOffset & 0x3ff) + (y - bgLayer[nlayer].vScroll); + } +} + +static uint16_t ppu_getOffsetValue(int col, int row) { + int x = col * 8 + bgLayer[2].hScroll; + int y = row * 8 + bgLayer[2].vScroll; + int tileBits = bgLayer[2].bigTiles ? 4 : 3; + int tileHighBit = bgLayer[2].bigTiles ? 0x200 : 0x100; + uint16_t tilemapAdr = bgLayer[2].tilemapAdr + (((y >> tileBits) & 0x1f) << 5 | ((x >> tileBits) & 0x1f)); + if((x & tileHighBit) && bgLayer[2].tilemapWider) tilemapAdr += 0x400; + if((y & tileHighBit) && bgLayer[2].tilemapHigher) tilemapAdr += bgLayer[2].tilemapWider ? 0x800 : 0x400; + return vram[tilemapAdr & 0x7fff]; +} + +static inline void ppu_getPixelForBgLayer(int x, int y, int nlayer) { //, bool priority, uint16_t *pixelCache, uint8_t *pixelCachePriority) { + // figure out address of tilemap word and read it + bool wideTiles = bgLayer[nlayer].bigTiles || mode == 5 || mode == 6; + int tileBitsX = wideTiles ? 4 : 3; + //const int tileBitsX = 3 + wideTiles; + int tileHighBitX = wideTiles ? 0x200 : 0x100; + //const int tileHighBitX = 1 << (wideTiles + 8); + int tileBitsY = bgLayer[nlayer].bigTiles ? 4 : 3; + //const int tileBitsY = 3 + bgLayer[nlayer].bigTiles; + int tileHighBitY = bgLayer[nlayer].bigTiles ? 0x200 : 0x100; + //const int tileHighBitY = 1 << (bgLayer[nlayer].bigTiles + 8); + uint16_t tilemapAdr = bgLayer[nlayer].tilemapAdr + (((y >> tileBitsY) & 0x1f) << 5 | ((x >> tileBitsX) & 0x1f)); + //tilemapAdr += 0x400 & (0 - ((x & tileHighBitX) && bgLayer[nlayer].tilemapWider)); + //tilemapAdr += (0x400 << bgLayer[nlayer].tilemapWider) & (0 - ((y & tileHighBitY) && bgLayer[nlayer].tilemapHigher)); + if((x & tileHighBitX) && bgLayer[nlayer].tilemapWider) tilemapAdr += 0x400; + if((y & tileHighBitY) && bgLayer[nlayer].tilemapHigher) tilemapAdr += bgLayer[nlayer].tilemapWider ? 0x800 : 0x400; + uint16_t tile = vram[tilemapAdr & 0x7fff]; + // check priority, get palette + int tilePrio = (tile >> 13) & 1; + int paletteNum = (tile & 0x1c00) >> 10; + // figure out position within tile + int row = (tile & 0x8000) ? (y & 0x7)^7 : (y & 0x7); +// int row = (y & 0x7) ^ ( 7 & (0 - ((tile & 0x8000) >> 15))); + int col = (tile & 0x4000) ? (x & 0x7) : (x & 0x7)^7; +// int col = (x & 0x7) ^ ( 7 & (0 - ((~tile & 0x4000) >> 14))); + int tileNum = tile & 0x3ff; + if(wideTiles) { + // if unflipped right half of tile, or flipped left half of tile + if(((bool) (x & 8)) ^ ((bool) (tile & 0x4000))) tileNum += 1; + //tileNum += (((x & 8) >> 3) ^ ((tile & 0x4000) >> 14)) & (0 - wideTiles); + } + if(bgLayer[nlayer].bigTiles) { + // if unflipped bottom half of tile, or flipped upper half of tile + if(((bool) (y & 8)) ^ ((bool) (tile & 0x8000))) tileNum += 0x10; + //tileNum += (((x & 8) << 1) ^ ((tile & 0x8000) >> 11)) & (0 - bgLayer[nlayer].bigTiles); + } + // read tiledata, ajust palette for mode 0 + const int bitDepth = bitDepthsPerMode[mode][nlayer]; + if(mode == 0) paletteNum += 8 * nlayer; + // plane 1 (always) + const uint16_t base_addr = bgLayer[nlayer].tileAdr + ((tileNum & 0x3ff) * 4 * bitDepth); + const int bit2shift = 8 + col; + uint16_t pixel = 0; +#if 1 + switch (bitDepth) { + case 2: { + uint16_t plane = vram[(base_addr + row) & 0x7fff]; + pixel = (plane >> col) & 1; + pixel |= ((plane >> bit2shift) & 1) << 1; + } break; + case 4: { + uint16_t plane = vram[(base_addr + row) & 0x7fff]; + pixel = (plane >> col) & 1; + pixel |= ((plane >> bit2shift) & 1) << 1; + + plane = vram[(base_addr + 8 + row) & 0x7fff]; + pixel |= ((plane >> col) & 1) << 2; + pixel |= ((plane >> bit2shift) & 1) << 3; + } break; + case 8: { + uint16_t plane = vram[(base_addr + row) & 0x7fff]; + pixel = (plane >> col) & 1; + pixel |= ((plane >> bit2shift) & 1) << 1; + + plane = vram[(base_addr + 8 + row) & 0x7fff]; + pixel |= ((plane >> col) & 1) << 2; + pixel |= ((plane >> bit2shift) & 1) << 3; + + plane = vram[(base_addr + 16 + row) & 0x7fff]; + pixel |= ((plane >> col) & 1) << 4; + pixel |= ((plane >> bit2shift) & 1) << 5; + + plane = vram[(base_addr + 24 + row) & 0x7fff]; + pixel |= ((plane >> col) & 1) << 6; + pixel |= ((plane >> bit2shift) & 1) << 7; + } break; + } +#endif + // return cgram index, or 0 if transparent, palette number in bits 10-8 for 8-color nlayers + bg_line_buf[nlayer] = (pixel == 0) ? 0 : (paletteNum << bitDepth) + pixel; +// *pixelCache = (paletteSize * paletteNum + pixel) & (0 - (pixel != 0)); + bg_prio_buf[nlayer] = tilePrio; +} + +static void ppu_calculateMode7Starts(int y) { + // expand 13-bit values to signed values + int hScroll = ((int16_t) (m7matrix[6] << 3)) >> 3; + int vScroll = ((int16_t) (m7matrix[7] << 3)) >> 3; + int xCenter = ((int16_t) (m7matrix[4] << 3)) >> 3; + int yCenter = ((int16_t) (m7matrix[5] << 3)) >> 3; + // do calculation + int clippedH = hScroll - xCenter; + int clippedV = vScroll - yCenter; + clippedH = (clippedH & 0x2000) ? (clippedH | ~1023) : (clippedH & 1023); + clippedV = (clippedV & 0x2000) ? (clippedV | ~1023) : (clippedV & 1023); + if(bgLayer[0].mosaicEnabled && mosaicSize > 1) { + y -= (y - mosaicStartLine) % mosaicSize; + } + uint8_t ry = m7yFlip ? 255 - y : y; + m7startX = ( + ((m7matrix[0] * clippedH) & ~63) + + ((m7matrix[1] * ry) & ~63) + + ((m7matrix[1] * clippedV) & ~63) + + (xCenter << 8) + ); + m7startY = ( + ((m7matrix[2] * clippedH) & ~63) + + ((m7matrix[3] * ry) & ~63) + + ((m7matrix[3] * clippedV) & ~63) + + (yCenter << 8) + ); +} + +static int ppu_getPixelForMode7(int x, int nlayer, bool priority) { + uint8_t rx = m7xFlip ? 255 - x : x; + int xPos = (m7startX + m7matrix[0] * rx) >> 8; + int yPos = (m7startY + m7matrix[2] * rx) >> 8; + bool outsideMap = xPos < 0 || xPos >= 1024 || yPos < 0 || yPos >= 1024; + xPos &= 0x3ff; + yPos &= 0x3ff; + if(!m7largeField) outsideMap = false; + uint8_t tile = outsideMap ? 0 : vram[(yPos >> 3) * 128 + (xPos >> 3)] & 0xff; + uint8_t pixel = outsideMap && !m7charFill ? 0 : vram[tile * 64 + (yPos & 7) * 8 + (xPos & 7)] >> 8; + if(nlayer == 1) { + if(((bool) (pixel & 0x80)) != priority) return 0; + return pixel & 0x7f; + } + return pixel; +} + +static inline bool ppu_getWindowState(int nlayer, int x) { + if(!windowLayer[nlayer].window1enabled && !windowLayer[nlayer].window2enabled) { + return false; + } + if(windowLayer[nlayer].window1enabled && !windowLayer[nlayer].window2enabled) { + bool test = x >= window1left && x <= window1right; + return windowLayer[nlayer].window1inversed ? !test : test; + } + if(!windowLayer[nlayer].window1enabled && windowLayer[nlayer].window2enabled) { + bool test = x >= window2left && x <= window2right; + return windowLayer[nlayer].window2inversed ? !test : test; + } + bool test1 = x >= window1left && x <= window1right; + bool test2 = x >= window2left && x <= window2right; + if(windowLayer[nlayer].window1inversed) test1 = !test1; + if(windowLayer[nlayer].window2inversed) test2 = !test2; + switch(windowLayer[nlayer].maskLogic) { + case 0: return test1 || test2; + case 1: return test1 && test2; + case 2: return test1 != test2; + case 3: return test1 == test2; + } + return false; +} + +static void ppu_evaluateSprites(int line) { + // TODO: rectangular sprites + uint8_t index = objPriority ? (oamAdr & 0xfe) : 0; + int spritesFound = 0; + int tilesFound = 0; + uint8_t foundSprites[32] = {}; + // iterate over oam to find sprites in range + for(int i = 0; i < 128; i++) { + uint8_t y = oam[index] >> 8; + // check if the sprite is on this line and get the sprite size + uint8_t row = line - y; + int spriteSize = spriteSizes[objSize][(highOam[index >> 3] >> ((index & 7) + 1)) & 1]; + int spriteHeight = objInterlace ? spriteSize / 2 : spriteSize; + if(row < spriteHeight) { + // in y-range, get the x location, using the high bit as well + int x = oam[index] & 0xff; + x |= ((highOam[index >> 3] >> (index & 7)) & 1) << 8; + if(x > 255) x -= 512; + // if in x-range, record + if(x > -spriteSize || x == -256) { + // break if we found 32 sprites already + spritesFound++; + if(spritesFound > 32) { + rangeOver = true; + spritesFound = 32; + break; + } + foundSprites[spritesFound - 1] = index; + } + } + index += 2; + } + // iterate over found sprites backwards to fetch max 34 tile slivers + for(int i = spritesFound; i > 0; i--) { + index = foundSprites[i - 1]; + uint8_t y = oam[index] >> 8; + uint8_t row = line - y; + int spriteSize = spriteSizes[objSize][(highOam[index >> 3] >> ((index & 7) + 1)) & 1]; + int x = oam[index] & 0xff; + x |= ((highOam[index >> 3] >> (index & 7)) & 1) << 8; + if(x > 255) x -= 512; + if(x > -spriteSize) { + // update row according to obj-interlace + if(objInterlace) row = row * 2 + (evenFrame ? 0 : 1); + // get some data for the sprite and y-flip row if needed + int tile = oam[index + 1] & 0xff; + int palette = (oam[index + 1] & 0xe00) >> 9; + bool hFlipped = oam[index + 1] & 0x4000; + if(oam[index + 1] & 0x8000) row = spriteSize - 1 - row; + // fetch all tiles in x-range + for(int col = 0; col < spriteSize; col += 8) { + if(col + x > -8 && col + x < 256) { + // break if we found > 34 8*1 slivers already + tilesFound++; + if(tilesFound > 34) { + timeOver = true; + break; + } + // figure out which tile this uses, looping within 16x16 pages, and get it's data + int usedCol = hFlipped ? spriteSize - 1 - col : col; + uint8_t usedTile = (((tile >> 4) + (row / 8)) << 4) | (((tile & 0xf) + (usedCol / 8)) & 0xf); + uint16_t objAdr = (oam[index + 1] & 0x100) ? objTileAdr2 : objTileAdr1; + uint16_t plane1 = vram[(objAdr + usedTile * 16 + (row & 0x7)) & 0x7fff]; + uint16_t plane2 = vram[(objAdr + usedTile * 16 + 8 + (row & 0x7)) & 0x7fff]; + // go over each pixel + for(int px = 0; px < 8; px++) { + int shift = hFlipped ? px : 7 - px; + int pixel = (plane1 >> shift) & 1; + pixel |= ((plane1 >> (8 + shift)) & 1) << 1; + pixel |= ((plane2 >> shift) & 1) << 2; + pixel |= ((plane2 >> (8 + shift)) & 1) << 3; + // draw it in the buffer if there is a pixel here + int screenCol = col + x + px; + if(pixel > 0 && screenCol >= 0 && screenCol < 256) { + objPixelBuffer[screenCol] = 0x80 + 16 * palette + pixel; + objPriorityBuffer[screenCol] = (oam[index + 1] & 0x3000) >> 12; + } + } + } + } + if(tilesFound > 34) break; // break out of sprite-loop if max tiles found + } + } +} + +static inline uint16_t ppu_getVramRemap() { + const uint16_t adr = vramPointer; + switch(vramRemapMode) { + case 0: return adr; + case 1: return (adr & 0xff00) | ((adr & 0xe0) >> 5) | ((adr & 0x1f) << 3); + case 2: return (adr & 0xfe00) | ((adr & 0x1c0) >> 6) | ((adr & 0x3f) << 3); + case 3: return (adr & 0xfc00) | ((adr & 0x380) >> 7) | ((adr & 0x7f) << 3); + } + return adr; +} + +void ppu_latchHV() { + hCount = snes->hPos / 4; + vCount = snes->vPos; + countersLatched = true; +} + +void ppu_latchScope(int x, int y) { + hScope = (0x28 + x) * 4; // x -> cycle + vScope = y * (ppu_checkOverscan() ? 240 : 225) / 255; + //bprintf (0, _T("latch scope @ %d,%d (cycle %d)\n"), x, y, hScope); + bScopeLatch = true; +} + +void ppu_latchScopeCheck(bool reset) { + if (bScopeLatch) { + if ((snes->vPos == vScope && snes->hPos >= hScope) || snes->vPos > vScope) { + hCount = hScope / 4; + vCount = vScope; + countersLatched = true; + bScopeLatch = false; + } + if (reset) { + bScopeLatch = false; + } + } +} + +uint8_t ppu_read(uint8_t adr) { + switch(adr) { + case 0x04: case 0x14: case 0x24: + case 0x05: case 0x15: case 0x25: + case 0x06: case 0x16: case 0x26: + case 0x08: case 0x18: case 0x28: + case 0x09: case 0x19: case 0x29: + case 0x0a: case 0x1a: case 0x2a: { + return ppu1openBus; + } + case 0x34: + case 0x35: + case 0x36: { + int result = m7matrix[0] * (m7matrix[1] >> 8); + ppu1openBus = (result >> (8 * (adr - 0x34))) & 0xff; + return ppu1openBus; + } + case 0x37: { + if (snes->ppuLatch) { + ppu_latchHV(); + } + return snes->openBus; + } + case 0x38: { + uint8_t ret = 0; + if(oamInHigh) { + ret = highOam[((oamAdr & 0xf) << 1) | oamSecondWrite]; + if(oamSecondWrite) { + oamAdr++; + if(oamAdr == 0) oamInHigh = false; + } + } else { + if(!oamSecondWrite) { + ret = oam[oamAdr] & 0xff; + } else { + ret = oam[oamAdr++] >> 8; + if(oamAdr == 0) oamInHigh = true; + } + } + oamSecondWrite = !oamSecondWrite; + ppu1openBus = ret; + return ret; + } + case 0x39: { + uint16_t val = vramReadBuffer; + if(!vramIncrementOnHigh) { + vramReadBuffer = vram[ppu_getVramRemap() & 0x7fff]; + vramPointer += vramIncrement; + } + ppu1openBus = val & 0xff; + return val & 0xff; + } + case 0x3a: { + uint16_t val = vramReadBuffer; + if(vramIncrementOnHigh) { + vramReadBuffer = vram[ppu_getVramRemap() & 0x7fff]; + vramPointer += vramIncrement; + } + ppu1openBus = val >> 8; + return val >> 8; + } + case 0x3b: { + uint8_t ret = 0; + if(!cgramSecondWrite) { + ret = cgram[cgramPointer] & 0xff; + } else { + ret = ((cgram[cgramPointer++] >> 8) & 0x7f) | (ppu2openBus & 0x80); + } + cgramSecondWrite = !cgramSecondWrite; + ppu2openBus = ret; + return ret; + } + case 0x3c: { + uint8_t val = 0; + ppu_latchScopeCheck(false); + if(hCountSecond) { + val = ((hCount >> 8) & 1) | (ppu2openBus & 0xfe); + } else { + val = hCount & 0xff; + } + hCountSecond = !hCountSecond; + ppu2openBus = val; + return val; + } + case 0x3d: { + uint8_t val = 0; + ppu_latchScopeCheck(false); + if(vCountSecond) { + val = ((vCount >> 8) & 1) | (ppu2openBus & 0xfe); + } else { + val = vCount & 0xff; + } + vCountSecond = !vCountSecond; + ppu2openBus = val; + return val; + } + case 0x3e: { + uint8_t val = 0x1; // ppu1 version (4 bit) + val |= ppu1openBus & 0x10; + val |= rangeOver << 6; + val |= timeOver << 7; + ppu1openBus = val; + return val; + } + case 0x3f: { + uint8_t val = 0x3; // ppu2 version (4 bit) + ppu_latchScopeCheck(false); + val |= snes->palTiming << 4; // ntsc/pal + val |= ppu2openBus & 0x20; + val |= countersLatched << 6; + val |= evenFrame << 7; + + if (snes->ppuLatch) { + countersLatched = false; + hCountSecond = false; + vCountSecond = false; + } + ppu2openBus = val; + return val; + } + default: { + return snes->openBus; + } + } +} + +void ppu_write(uint8_t adr, uint8_t val) { + switch(adr) { + case 0x00: { + // TODO: oam address reset when written on first line of vblank, (and when forced blank is disabled?) + brightness = val & 0xf; + forcedBlank = val & 0x80; + break; + } + case 0x01: { + objSize = val >> 5; + objTileAdr1 = (val & 7) << 13; + objTileAdr2 = objTileAdr1 + (((val & 0x18) + 8) << 9); + break; + } + case 0x02: { + oamAdr = val; + oamAdrWritten = oamAdr; + oamInHigh = oamInHighWritten; + oamSecondWrite = false; + break; + } + case 0x03: { + objPriority = val & 0x80; + oamInHigh = val & 1; + oamInHighWritten = oamInHigh; + oamAdr = oamAdrWritten; + oamSecondWrite = false; + break; + } + case 0x04: { + if(oamInHigh) { + highOam[((oamAdr & 0xf) << 1) | oamSecondWrite] = val; + if(oamSecondWrite) { + oamAdr++; + if(oamAdr == 0) oamInHigh = false; + } + } else { + if(!oamSecondWrite) { + oamBuffer = val; + } else { + oam[oamAdr++] = (val << 8) | oamBuffer; + if(oamAdr == 0) oamInHigh = true; + } + } + oamSecondWrite = !oamSecondWrite; + break; + } + case 0x05: { + mode = val & 0x7; + //extern int counter; + //if (counter) bprintf(0, _T("ppu MODE %x\n"), mode); + bg3priority = val & 0x8; + bgLayer[0].bigTiles = val & 0x10; + bgLayer[1].bigTiles = val & 0x20; + bgLayer[2].bigTiles = val & 0x40; + bgLayer[3].bigTiles = val & 0x80; + break; + } + case 0x06: { + // TODO: mosaic line reset specifics + bgLayer[0].mosaicEnabled = val & 0x1; + bgLayer[1].mosaicEnabled = val & 0x2; + bgLayer[2].mosaicEnabled = val & 0x4; + bgLayer[3].mosaicEnabled = val & 0x8; + mosaicSize = (val >> 4) + 1; + mosaicStartLine = snes->vPos; + break; + } + case 0x07: + case 0x08: + case 0x09: + case 0x0a: { + bgLayer[adr - 7].tilemapWider = val & 0x1; + bgLayer[adr - 7].tilemapHigher = val & 0x2; + bgLayer[adr - 7].tilemapAdr = (val & 0xfc) << 8; + break; + } + case 0x0b: { + bgLayer[0].tileAdr = (val & 0xf) << 12; + bgLayer[1].tileAdr = (val & 0xf0) << 8; + break; + } + case 0x0c: { + bgLayer[2].tileAdr = (val & 0xf) << 12; + bgLayer[3].tileAdr = (val & 0xf0) << 8; + break; + } + case 0x0d: { + m7matrix[6] = ((val << 8) | m7prev) & 0x1fff; + m7prev = val; + // fallthrough to normal layer BG-HOFS + } + case 0x0f: + case 0x11: + case 0x13: { + bgLayer[(adr - 0xd) / 2].hScroll = ((val << 8) | (scrollPrev & 0xf8) | (scrollPrev2 & 0x7)) & 0x3ff; + scrollPrev = val; + scrollPrev2 = val; + break; + } + case 0x0e: { + m7matrix[7] = ((val << 8) | m7prev) & 0x1fff; + m7prev = val; + // fallthrough to normal layer BG-VOFS + } + case 0x10: + case 0x12: + case 0x14: { + bgLayer[(adr - 0xe) / 2].vScroll = ((val << 8) | scrollPrev) & 0x3ff; + scrollPrev = val; + break; + } + case 0x15: { + if((val & 3) == 0) { + vramIncrement = 1; + } else if((val & 3) == 1) { + vramIncrement = 32; + } else { + vramIncrement = 128; + } + vramRemapMode = (val & 0xc) >> 2; + vramIncrementOnHigh = val & 0x80; + break; + } + case 0x16: { + vramPointer = (vramPointer & 0xff00) | val; + vramReadBuffer = vram[ppu_getVramRemap() & 0x7fff]; + break; + } + case 0x17: { + vramPointer = (vramPointer & 0x00ff) | (val << 8); + vramReadBuffer = vram[ppu_getVramRemap() & 0x7fff]; + break; + } + case 0x18: { + uint16_t vramAdr = ppu_getVramRemap(); + if (forcedBlank || snes->inVblank) { // TODO: also cgram and oam? + vram[vramAdr & 0x7fff] = (vram[vramAdr & 0x7fff] & 0xff00) | val; + } + if(!vramIncrementOnHigh) vramPointer += vramIncrement; + break; + } + case 0x19: { + uint16_t vramAdr = ppu_getVramRemap(); + if (forcedBlank || snes->inVblank) { + vram[vramAdr & 0x7fff] = (vram[vramAdr & 0x7fff] & 0x00ff) | (val << 8); + } + if(vramIncrementOnHigh) vramPointer += vramIncrement; + break; + } + case 0x1a: { + m7largeField = val & 0x80; + m7charFill = val & 0x40; + m7yFlip = val & 0x2; + m7xFlip = val & 0x1; + break; + } + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: { + m7matrix[adr - 0x1b] = (val << 8) | m7prev; + m7prev = val; + break; + } + case 0x1f: + case 0x20: { + m7matrix[adr - 0x1b] = ((val << 8) | m7prev) & 0x1fff; + m7prev = val; + break; + } + case 0x21: { + cgramPointer = val; + cgramSecondWrite = false; + break; + } + case 0x22: { + if(!cgramSecondWrite) { + cgramBuffer = val; + } else { + cgram[cgramPointer++] = (val << 8) | cgramBuffer; + } + cgramSecondWrite = !cgramSecondWrite; + break; + } + case 0x23: + case 0x24: + case 0x25: { + windowLayer[(adr - 0x23) * 2].window1inversed = val & 0x1; + windowLayer[(adr - 0x23) * 2].window1enabled = val & 0x2; + windowLayer[(adr - 0x23) * 2].window2inversed = val & 0x4; + windowLayer[(adr - 0x23) * 2].window2enabled = val & 0x8; + windowLayer[(adr - 0x23) * 2 + 1].window1inversed = val & 0x10; + windowLayer[(adr - 0x23) * 2 + 1].window1enabled = val & 0x20; + windowLayer[(adr - 0x23) * 2 + 1].window2inversed = val & 0x40; + windowLayer[(adr - 0x23) * 2 + 1].window2enabled = val & 0x80; + break; + } + case 0x26: { + window1left = val; + break; + } + case 0x27: { + window1right = val; + break; + } + case 0x28: { + window2left = val; + break; + } + case 0x29: { + window2right = val; + break; + } + case 0x2a: { + windowLayer[0].maskLogic = val & 0x3; + windowLayer[1].maskLogic = (val >> 2) & 0x3; + windowLayer[2].maskLogic = (val >> 4) & 0x3; + windowLayer[3].maskLogic = (val >> 6) & 0x3; + break; + } + case 0x2b: { + windowLayer[4].maskLogic = val & 0x3; + windowLayer[5].maskLogic = (val >> 2) & 0x3; + break; + } + case 0x2c: { + layer[0].mainScreenEnabled = val & 0x1; + layer[1].mainScreenEnabled = val & 0x2; + layer[2].mainScreenEnabled = val & 0x4; + layer[3].mainScreenEnabled = val & 0x8; + layer[4].mainScreenEnabled = val & 0x10; + break; + } + case 0x2d: { + layer[0].subScreenEnabled = val & 0x1; + layer[1].subScreenEnabled = val & 0x2; + layer[2].subScreenEnabled = val & 0x4; + layer[3].subScreenEnabled = val & 0x8; + layer[4].subScreenEnabled = val & 0x10; + break; + } + case 0x2e: { + layer[0].mainScreenWindowed = val & 0x1; + layer[1].mainScreenWindowed = val & 0x2; + layer[2].mainScreenWindowed = val & 0x4; + layer[3].mainScreenWindowed = val & 0x8; + layer[4].mainScreenWindowed = val & 0x10; + break; + } + case 0x2f: { + layer[0].subScreenWindowed = val & 0x1; + layer[1].subScreenWindowed = val & 0x2; + layer[2].subScreenWindowed = val & 0x4; + layer[3].subScreenWindowed = val & 0x8; + layer[4].subScreenWindowed = val & 0x10; + break; + } + case 0x30: { + directColor = val & 0x1; + addSubscreen = val & 0x2; + preventMathMode = (val & 0x30) >> 4; + clipMode = (val & 0xc0) >> 6; + break; + } + case 0x31: { + subtractColor = val & 0x80; + halfColor = val & 0x40; +// bprintf(0, _T("math enab: ")); + for(int i = 0; i < 6; i++) { + mathEnabled[i] = val & (1 << i); +// bprintf(0, _T("%02x "), mathEnabled[i]); + } +// bprintf(0, _T("\n")); + break; + } + case 0x32: { + if(val & 0x80) fixedColorB = val & 0x1f; + if(val & 0x40) fixedColorG = val & 0x1f; + if(val & 0x20) fixedColorR = val & 0x1f; + break; + } + case 0x33: { + interlace = val & 0x1; + objInterlace = val & 0x2; + overscan = val & 0x4; + pseudoHires = val & 0x8; + m7extBg = val & 0x40; + break; + } + default: { + break; + } + } +} + +void ppu_putPixels(uint8_t* pixels, int height) { + for(int y = 0; y < (frameOverscan ? 239 : 224); y++) { + int dest = y * 2;// + (frameOverscan ? 2 : 16); + int y1 = y, y2 = y + 239; + if(!frameInterlace) { + y1 = y + (evenFrame ? 0 : 239); + y2 = y1; + } + if (dest + 1 >= height) continue; + memcpy(pixels + ((dest + 0) * 2048), &pixelBuffer[y1 * 2048], 2048); + memcpy(pixels + ((dest + 1) * 2048), &pixelBuffer[y2 * 2048], 2048); + } +#if 0 + // we just don't show this, anyways -dink + // clear top 2 lines, and following 14 and last 16 lines if not overscanning + memset(pixels, 0, 2048 * 2); + if(!frameOverscan) { + memset(pixels + (2 * 2048), 0, 2048 * 14); + memset(pixels + (464 * 2048), 0, 2048 * 16); + } +#endif +} diff --git a/src/burn/drv/snes/ppu.h b/src/burn/drv/snes/ppu.h new file mode 100644 index 000000000..85ef27507 --- /dev/null +++ b/src/burn/drv/snes/ppu.h @@ -0,0 +1,56 @@ + +#ifndef PPU_H +#define PPU_H + +#include +#include + +#include "snes.h" +#include "statehandler.h" + +typedef struct BgLayer { + uint16_t hScroll; + uint16_t vScroll; + bool tilemapWider; + bool tilemapHigher; + uint16_t tilemapAdr; + uint16_t tileAdr; + bool bigTiles; + bool mosaicEnabled; +} BgLayer; + +typedef struct Layer { + bool mainScreenEnabled; + bool subScreenEnabled; + bool mainScreenWindowed; + bool subScreenWindowed; +} Layer; + +typedef struct WindowLayer { + bool window1enabled; + bool window2enabled; + bool window1inversed; + bool window2inversed; + uint8_t maskLogic; +} WindowLayer; + +void ppu_init(Snes* ssnes); +void ppu_free(); +void ppu_reset(); +void ppu_handleState(StateHandler* sh); +bool ppu_checkOverscan(); +void ppu_handleVblank(); +void ppu_handleFrameStart(); +void ppu_runLine(int line); +void ppu_latchMode7(int line); +uint8_t ppu_read(uint8_t adr); +void ppu_write(uint8_t adr, uint8_t val); +void ppu_latchHV(); +void ppu_latchScope(int x, int y); +void ppu_latchScopeCheck(bool reset); +void ppu_putPixels(uint8_t* pixels, int height); +void ppu_setPixelOutputFormat(int pixelOutputFormat); +bool ppu_frameInterlace(); +bool ppu_evenFrame(); + +#endif diff --git a/src/burn/drv/snes/sa1.cpp b/src/burn/drv/snes/sa1.cpp new file mode 100644 index 000000000..8331106bd --- /dev/null +++ b/src/burn/drv/snes/sa1.cpp @@ -0,0 +1,1000 @@ +// SA-1 mapper/simulator for LakeSnes, (c) 2024 dink +// License: MIT + +// Supports everything except: +// char conversion[1,2]-DMA & bitmap bwram +// 3 games use this: Haruka Naru Augusta 3, Pebble Beach no Hotou & SD Gundam G NEXT + +#include "snes.h" +#include "cpu_sa1.h" +#include "sa1.h" + +static uint64_t sa1_cycles; +static Snes *snes_ctx; + +static uint8_t *sram; +static uint32_t sram_size; +static uint32_t sram_mask; +static uint8_t *iram; + +static uint8_t *rom; +static uint32_t rom_size; +static uint32_t rom_mask; + +static uint8_t openbus; + +static uint8_t scpu_control; +static uint8_t scpu_irq_enable; +static uint16_t scpu_irq_vector; +static uint16_t scpu_nmi_vector; +static uint8_t scpu_irq_pending; +static bool scpu_in_irq; + +static uint8_t sa1_control; +static uint8_t sa1_irq_enable; +static uint16_t sa1_reset_vector; +static uint16_t sa1_nmi_vector; +static uint16_t sa1_irq_vector; +static uint8_t sa1_irq_pending; + +enum { + sa1_IRQ = 1 << 7, + sa1_IRQ_TIMER = 1 << 6, + sa1_IRQ_DMA = 1 << 5, + sa1_IRQ_NMI = 1 << 4 +}; + +#define set_byte(var, data, offset) (var = (var & (~(0xff << (((offset) & 3) * 8)))) | (data << (((offset) & 3) * 8))) + +#define sa1_set_irq(flg, f) do { sa1_irq_pending = (sa1_irq_pending & ~flg) | ((f) ? flg : 0); } while (0) +#define scpu_set_irq(flg, f) do { scpu_irq_pending = (scpu_irq_pending & ~flg) | ((f) ? flg : 0); } while (0) + +static uint8_t timer_mode; +static uint16_t timer_hpos; +static uint16_t timer_vpos; +static uint16_t hpos_latch; +static uint16_t vpos_latch; + +static uint8_t supermmc[4]; + +static uint32_t bwram_snes_bank; +static uint32_t bwram_sa1_bank; +static uint8_t bwram_sa1_mode; + +static uint8_t math_mode; +static uint16_t math_param_a; +static uint16_t math_param_b; +static uint64_t math_result; +static uint8_t math_overflow; +static const uint64_t math_40bit_mask = ((uint64_t)1 << 40) - 1; +static const uint64_t math_overflow_mask = ~math_40bit_mask; + +static uint8_t dma_control; +static uint32_t dma_src; +static uint32_t dma_dst; +static uint16_t dma_len; + +static uint32_t vari_src; +static uint32_t vari_temp; +static uint8_t vari_bitcount; +static uint8_t vari_width; +static uint8_t vari_clock; + +// memory mapping (test) +static const int banks_len = 0x100; // 00 - ff +static const int page_len = 0x10000; // 0000 - ffff +static const int slot_len = 0x1000; // 4k (smallest mappable segment) +static const int map_len = (page_len * banks_len) / slot_len; // == 0x1000 +static uint8_t *rom_map[map_len]; +static uint8_t rom_map_type[map_len]; + +static uint8_t (*sa1_rom_map_read[map_len])(uint32_t); +static void (*sa1_rom_map_write[map_len])(uint32_t, uint8_t); + +static uint8_t (*scpu_rom_map_read[map_len])(uint32_t); +static void (*scpu_rom_map_write[map_len])(uint32_t, uint8_t); + +#if 0 /* debug unmapped? */ +// note: unmapped writes from scpu catches the entire snes bus outside of sa-1(!) (this is why it is /**/'d) +static uint8_t sa1_unmap_read(uint32_t address) { bprintf(0, _T("SA1: unmapped read: %x\n"), address); return 0xff; } +static uint8_t scpu_unmap_read(uint32_t address) { bprintf(0, _T("SNES: unmapped read: %x\n"), address); return 0xff; } +static void sa1_unmap_write(uint32_t address, uint8_t data) { bprintf(0, _T("SA1: unmapped write: %x %x\n"), address, data); } +static void scpu_unmap_write(uint32_t address, uint8_t data) { /*bprintf(0, _T("SNES: unmapped write: %x %x\n"), address, data);*/ } +#else +static uint8_t sa1_unmap_read(uint32_t address) { return 0xff; } +static uint8_t scpu_unmap_read(uint32_t address) { return 0xff; } +static void sa1_unmap_write(uint32_t address, uint8_t data) { } +static void scpu_unmap_write(uint32_t address, uint8_t data) { } +#endif + +static uint8_t *rom_unmap = NULL; + +#define S_MAP_TYPE_UNMAP 0 +#define S_MAP_TYPE_PRG 1 + +#define SA1 0x1000 +#define SCPU 0x2000 + +static void map_handlers_sa1(); +static void map_handlers_scpu(); +static void map_rw(uint32_t cpu, uint8_t bank_from, uint8_t bank_to, uint16_t adr_from, uint16_t adr_to, uint8_t (*rd_handler)(uint32_t), void (*wr_handler)(uint32_t, uint8_t)); +static void map_rom(uint8_t bank_from, uint8_t bank_to, uint16_t adr_from, uint16_t adr_to, uint32_t slot); + +uint64_t sa1_getcycles() { + return sa1_cycles; +} + +static void map_init() { + memset(rom_map, 0, sizeof(rom_map)); + memset(rom_map_type, 0, sizeof(rom_map_type)); + + if (rom_unmap == NULL) { + rom_unmap = (uint8_t*)BurnMalloc(slot_len); + } + + for (int i = 0; i < map_len; i++) { + rom_map[i] = rom_unmap; + } + + // unmapped rom reads return 0xff + for (int i = 0; i < slot_len; i++) { + rom_unmap[i] = 0xff; + } + + map_rw(SA1, 0x00, 0xff, 0x0000, 0xffff, sa1_unmap_read, sa1_unmap_write); + map_rw(SCPU, 0x00, 0xff, 0x0000, 0xffff, scpu_unmap_read, scpu_unmap_write); + + map_handlers_sa1(); + map_handlers_scpu(); +} + +static void map_exit() { + BurnFree(rom_unmap); + rom_unmap = NULL; +} + +static void map_rom(uint8_t bank_from, uint8_t bank_to, uint16_t adr_from, uint16_t adr_to, uint32_t slot) { + + slot *= 0x100; + const uint32_t bank_stride = (adr_to + 1) - adr_from; + //bprintf(0, _T("map_rom(%02x, %02x, %04x, %04x, %x, %x)\n"), bank_from, bank_to, adr_from, adr_to, bank_stride, slot); + + for (int bank = bank_from; bank <= bank_to; bank++) { + for (int adr = adr_from; adr <= adr_to; adr += slot_len) { + const uint32_t map_offset = ((bank & 0xff) << 4) | (adr >> 12); + const uint32_t rom_offset = (adr - adr_from) + ((bank - bank_from) * bank_stride) + (slot * slot_len); + // bprintf(0, _T("scpu_map[%x] = %x (mirr %x)\n"), map_offset, rom_offset, rom_offset % rom_size); + rom_map[map_offset] = rom + rom_offset % rom_size; + rom_map_type[map_offset] = S_MAP_TYPE_PRG; + } + } +} + +// note: mapping NULL for a handler doesn't unmap +static void map_rw(uint32_t cpu, uint8_t bank_from, uint8_t bank_to, uint16_t adr_from, uint16_t adr_to, uint8_t (*rd_handler)(uint32_t), void (*wr_handler)(uint32_t, uint8_t)) { + + //bprintf(0, _T("map_rw: %S: %x %x %x %x\n"), (cpu == SA1) ? "sa1" : "scpu", bank_from, bank_to, adr_from, adr_to); + + for (int bank = bank_from; bank <= bank_to; bank++) { + for (int adr = adr_from; adr <= adr_to; adr += slot_len) { + const uint32_t map_offset = ((bank & 0xff) << 4) | (adr >> 12); + if (rd_handler != NULL) { + switch (cpu) { + case SA1: sa1_rom_map_read[map_offset] = rd_handler; break; + case SCPU: scpu_rom_map_read[map_offset] = rd_handler; break; + } + } + if (wr_handler != NULL) { + switch (cpu) { + case SA1: sa1_rom_map_write[map_offset] = wr_handler; break; + case SCPU: scpu_rom_map_write[map_offset] = wr_handler; break; + } + } + } + } +} + +bool sa1_isrom_address(uint32_t address) +{ + return rom_map_type[address >> 12] == S_MAP_TYPE_PRG; +} + +bool sa1_snes_rom_conflict() { + return rom_map_type[snes_ctx->adrBus >> 12] == S_MAP_TYPE_PRG; +} + +static inline uint32_t map_get_handler(uint32_t address) +{ + return address >> 12; +} + +static inline uint8_t sa1_bus_read(uint32_t address) { + return sa1_rom_map_read[map_get_handler(address)](address); +} + +static void map_update() { + map_rom(0x00, 0x1f, 0x8000, 0xffff, (supermmc[0] & 0x80) ? (supermmc[0] & 0x07) : 0); + map_rom(0x20, 0x3f, 0x8000, 0xffff, (supermmc[1] & 0x80) ? (supermmc[1] & 0x07) : 1); + map_rom(0x80, 0x9f, 0x8000, 0xffff, (supermmc[2] & 0x80) ? (supermmc[2] & 0x07) : 2); + map_rom(0xa0, 0xbf, 0x8000, 0xffff, (supermmc[3] & 0x80) ? (supermmc[3] & 0x07) : 3); + + map_rom(0xc0, 0xcf, 0x0000, 0xffff, (supermmc[0] & 0x07)); + map_rom(0xd0, 0xdf, 0x0000, 0xffff, (supermmc[1] & 0x07)); + map_rom(0xe0, 0xef, 0x0000, 0xffff, (supermmc[2] & 0x07)); + map_rom(0xf0, 0xff, 0x0000, 0xffff, (supermmc[3] & 0x07)); +} + + +// forwards jib +static inline uint8_t iram_read(uint32_t address); +static inline void iram_write(uint32_t address, uint8_t data); +static inline uint8_t bwram_read(uint32_t address); +static inline void bwram_write(uint32_t address, uint8_t data); +static inline uint8_t rom_read(uint32_t address); + +static void check_hv_timers(); +static void check_pending_irqs(); + +static inline const bool sa1_running() { + return (sa1_control & (0x40 | 0x20) ) == 0; +} + +static inline void acc_cyc() { + sa1_cycles += 2; + if (sa1_cycles & 2) check_hv_timers(); +} + +void snes_sa1_init(void *mem, uint8_t *srom, int32_t sromsize, void *s_ram, int32_t s_ram_size) +{ + if (iram != NULL) return; // snes cart reset calls this, ignore if already initted. + + bprintf(0, _T("sa1: snes_sa1_init().\n")); + + iram = (UINT8*)BurnMalloc(0x800); + + snes_ctx = (Snes *)mem; + + sram_size = s_ram_size; + sram_mask = s_ram_size - 1; + sram = (uint8_t*)s_ram; + + if (sram_size == 0) { + bprintf(0, _T("SA1 Init Error: SRAM required for operation.\n")); + // todo: allocate default sram? maybe? + } + + cpusa1_init(); + map_init(); + + rom = srom; + rom_size = sromsize; + rom_mask = rom_size - 1; + + bprintf(0, _T("rom size/mask %x / %x \n"), rom_size, rom_mask); +} + +void snes_sa1_handleState(StateHandler* sh) +{ + cpusa1_handleState(sh); + sh_handleByteArray(sh, (uint8_t*)iram, 0x800); + sh_handleLongLongs(sh, &sa1_cycles, &math_result, NULL); + sh_handleBytes(sh, &openbus, &scpu_control, &scpu_irq_enable, &scpu_irq_pending, &sa1_control, &sa1_irq_enable, &sa1_irq_pending, &timer_mode, &supermmc[0], &supermmc[1], &supermmc[2], &supermmc[3], &bwram_sa1_mode, &math_mode, &math_overflow, &dma_control, &vari_bitcount, &vari_width, &vari_clock, NULL); + sh_handleBools(sh, &scpu_in_irq, NULL); + sh_handleWords(sh, &scpu_irq_vector, &scpu_nmi_vector, &sa1_reset_vector, &sa1_nmi_vector, &sa1_irq_vector, &timer_hpos, &timer_vpos, &hpos_latch, &vpos_latch, &bwram_snes_bank, &bwram_sa1_bank, &math_param_a, &math_param_b, &dma_len, NULL); + sh_handleInts(sh, &dma_src, &dma_dst, &vari_src, &vari_temp, NULL); + + if (sh->saving == false) { + map_update(); + } +} + +void snes_sa1_run() +{ + // note: we run sa1 cpu @ snes m-cyc, but count 2 cycles per, for 10.7mhz + // w/o having to divide down + const uint64_t sa1_sync_to = snes_ctx->cycles; + + while (sa1_cycles < sa1_sync_to) { + cpusa1_runOpcode(); + } +} + +void snes_sa1_exit() +{ + //bprintf(0, _T("sa1: snes_sa1_exit()\n")); + + BurnFree(iram); + iram = NULL; + + map_exit(); + + cpusa1_free(); +} + +void snes_sa1_reset() +{ + //bprintf(0, _T("sa1: snes_sa1_reset()\n")); + + memset(iram, 0xff, 0x800); + + openbus = 0xff; + + scpu_control = 0x00; + scpu_irq_enable = 0x00; + scpu_irq_vector = 0x00; + scpu_nmi_vector = 0x00; + scpu_irq_pending = 0x00; + scpu_in_irq = 0x00; + + sa1_control = 0x20 | 0x40; // cpu in reset & stopped + sa1_irq_enable = 0x00; + sa1_reset_vector = 0x00; + sa1_nmi_vector = 0x00; + sa1_irq_vector = 0x00; + sa1_irq_pending = 0x00; + + timer_mode = 0x00; + timer_hpos = 0x00; + timer_vpos = 0x00; + hpos_latch = 0x00; + vpos_latch = 0x00; + + supermmc[0] = 0; + supermmc[1] = 1; + supermmc[2] = 2; + supermmc[3] = 3; + + bwram_snes_bank = 0x00; + bwram_sa1_bank = 0x00; + bwram_sa1_mode = 0x00; + + math_mode = 0x00; + math_param_a = 0x00; + math_param_b = 0x00; + math_result = 0x00; + math_overflow = 0x00; + + dma_control = 0x00; + dma_src = 0x00; + dma_dst = 0x00; + dma_len = 0x00; + + vari_src = 0x00; + vari_temp = 0x00; + vari_bitcount = 0x00; + vari_width = 0x00; + vari_clock = 0x00; + + map_update(); + + sa1_cycles = 0; + + cpusa1_reset(true); + cpusa1_setHalt(true); +} + +static void check_hv_timers() +{ + switch (timer_mode & 0x03) { + case 0x01: + if (snes_ctx->hPos == timer_hpos) { + //bprintf(0, _T("h @ %d\n"), timer_hpos); + sa1_set_irq(sa1_IRQ_TIMER, 1); + check_pending_irqs(); + } + break; + case 0x02: + if ((snes_ctx->hPos == 0) && (snes_ctx->vPos == timer_vpos)) { + //bprintf(0, _T("v @ %d\n"), timer_vpos); + sa1_set_irq(sa1_IRQ_TIMER, 1); + check_pending_irqs(); + } + break; + case 0x03: + if ((snes_ctx->hPos == timer_hpos) && (snes_ctx->vPos == timer_vpos)) { + //bprintf(0, _T("hv @ %d,%d\n"), timer_hpos, timer_vpos); + sa1_set_irq(sa1_IRQ_TIMER, 1); + check_pending_irqs(); + } + break; + } +} + +static void check_pending_irqs() +{ + if (scpu_irq_pending & scpu_irq_enable & sa1_IRQ) { + scpu_in_irq = true; + cpu_setIrq(true); + //bprintf(0, _T("sa1->snes irq\n")); + } else { + if (scpu_in_irq) { + cpu_setIrq(false); // must be latched! as it will conflict with regular line-irq's + scpu_in_irq = false; + } + } + + if (sa1_running() && (sa1_irq_pending & sa1_irq_enable & (sa1_IRQ | sa1_IRQ_TIMER | sa1_IRQ_DMA))) { + cpusa1_setIrq(true); + //bprintf(0, _T("sa1->sa1 irq\n")); + } else { + cpusa1_setIrq(false); + } + + if (sa1_running() && (sa1_irq_pending & sa1_irq_enable & sa1_IRQ_NMI)) { + cpusa1_nmi(); + //bprintf(0, _T("sa1->sa1 nmi\n")); + } +} + +static void dma_xfer() +{ + const uint32_t dma_src_dev = dma_control & 0x03; + const uint32_t dma_dst_dev = (dma_control & 0x04) >> 2; + //bprintf(0, _T("sa1 : dma_xfer %x (%x) -> %x (%x) size %x\n"), dma_src, dma_src_dev, dma_dst, dma_dst_dev, dma_len); + + while (dma_len > 0) { + uint8_t src = 0; + switch (dma_src_dev) { + case 0: src = rom_read(dma_src); break; + case 1: src = bwram_read(dma_src & 0xfffff); acc_cyc(); break; + case 2: src = iram_read(dma_src); break; + } + acc_cyc(); + + switch (dma_dst_dev) { + case 0: iram_write(dma_dst, src); break; + case 1: bwram_write(dma_dst & 0xfffff, src); acc_cyc(); break; + } + + dma_src++; + dma_dst++; + dma_len--; + } + + sa1_set_irq(sa1_IRQ_DMA, 1); + check_pending_irqs(); +} + +static void dma_regs(uint32_t address, uint8_t data) +{ + switch (address) { + case 0x2230: + dma_control = data; + break; + case 0x2231: // char conv. dma (unimpl) + bprintf(0, _T("cconvdma unimpl.\n")); + break; + case 0x2232: + case 0x2233: + case 0x2234: + set_byte(dma_src, data, address - 0x2232); + break; + case 0x2235: + case 0x2236: + case 0x2237: + set_byte(dma_dst, data, address - 0x2235); + if ( (address == 0x2236 && (dma_control & 0x80) && (~dma_control & 0x20) && (dma_control & 0x04) == 0x00) || + (address == 0x2237 && (dma_control & 0x80) && (~dma_control & 0x20) && (dma_control & 0x04) == 0x04) ) { + dma_xfer(); + } + break; + case 0x2238: + case 0x2239: + set_byte(dma_len, data, address & 1); + break; + } +} + +static uint8_t sa1_regs_read(uint32_t address) +{ + address &= 0xffff; +// bprintf(0, _T("sa1_regs_read %x\n"), address); + switch (address) { + case 0x2301: + return (sa1_control & 0x0f) | (sa1_irq_pending & 0xf0); + + case 0x2302: + hpos_latch = snes_ctx->hPos / 4; + vpos_latch = snes_ctx->vPos; + return hpos_latch & 0xff; + case 0x2303: + return (hpos_latch >> 8) & 0xff; + case 0x2304: + return vpos_latch & 0xff; + case 0x2305: + return (vpos_latch >> 8) & 0xff; + + case 0x2306: + return math_result & 0xff; + case 0x2307: + return (math_result >> 8) & 0xff; + case 0x2308: + return (math_result >> 16) & 0xff; + case 0x2309: + return (math_result >> 24) & 0xff; + case 0x230a: + return (math_result >> 32) & 0xff; + case 0x230b: + return math_overflow; + + case 0x230c: + case 0x230d: + if ((vari_src & 0xc0c000) == 0x000000) return 0xff; // prevent access to regs (recursion) + set_byte(vari_temp, sa1_bus_read(vari_src + 0), 0); + set_byte(vari_temp, sa1_bus_read(vari_src + 1), 1); + set_byte(vari_temp, sa1_bus_read(vari_src + 2), 2); + vari_temp >>= vari_bitcount + ((address & 1) << 3); + if (address & 1 && vari_clock) { + vari_src += (vari_bitcount += vari_width) >> 3; + vari_bitcount &= 0x07; + } + return vari_temp & 0xff; + + default: +// bprintf(0, _T("sa1.regs_read(%x) unimpl openbus %x\n"), address, openbus); + break; + } + + return openbus; +} + +static void sa1_regs_write(uint32_t address, uint8_t data) +{ + address &= 0xffff; + //bprintf(0, _T("sa1_regs_write: %x %x\n"), address, data); + switch (address) { + case 0x2209: + scpu_control = data; + scpu_set_irq(sa1_IRQ, data & sa1_IRQ); + check_pending_irqs(); + break; + case 0x220a: + sa1_irq_enable = data; + //bprintf(0, _T("sa1_irq_enab %x\n"), data); + check_pending_irqs(); + break; + case 0x220b: + //bprintf(0, _T("irq_ack: %x\n"), data); + if (data & sa1_IRQ) sa1_set_irq(sa1_IRQ, 0); + if (data & sa1_IRQ_TIMER) sa1_set_irq(sa1_IRQ_TIMER, 0); + if (data & sa1_IRQ_DMA) sa1_set_irq(sa1_IRQ_DMA, 0); + if (data & sa1_IRQ_NMI) sa1_set_irq(sa1_IRQ_NMI, 0); + check_pending_irqs(); + break; + case 0x220c: + case 0x220d: + set_byte(scpu_nmi_vector, data, address & 1); + break; + case 0x220e: + case 0x220f: + set_byte(scpu_irq_vector, data, address & 1); + break; + + case 0x2210: + timer_mode = data; + break; + case 0x2211: // linear timer? + break; + case 0x2212: + timer_hpos = (timer_hpos & 0x0400) | (data << 2); + break; + case 0x2213: + timer_hpos = (timer_hpos & 0x03fc) | ((data & 1) << 10); + break; + case 0x2214: + timer_vpos = (timer_vpos & 0x0100) | data; + break; + case 0x2215: + timer_vpos = (timer_vpos & 0x00ff) | ((data & 1) << 8); + break; + + case 0x2225: + bwram_sa1_bank = (data & 0x7f) * 0x2000; + bwram_sa1_mode = data & 0x80; + break; + case 0x2227: + break; + case 0x222a: + break; + + case 0x2230: + case 0x2231: + case 0x2232: + case 0x2233: + case 0x2234: + case 0x2235: + case 0x2236: + case 0x2237: + case 0x2238: + case 0x2239: + dma_regs(address, data); + break; + + case 0x223f: // bwram bitmap (unimpl) + bprintf(0, _T("bwram bitmap unimpl\n")); + break; + + case 0x2240: // dma type-2 char conversion (unimpl) + case 0x2241: + case 0x2242: + case 0x2243: + case 0x2244: + case 0x2245: + case 0x2246: + case 0x2247: + case 0x2248: + case 0x2249: + case 0x224a: + case 0x224b: + case 0x224c: + case 0x224d: + case 0x224e: + case 0x224f: + bprintf(0, _T("dma cct2 unimpl\n")); + break; + + case 0x2250: + math_mode = data & 0x03; + if (data & (1 << 1)) { + math_result = 0; + } + break; + case 0x2251: + set_byte(math_param_a, data, ~address & 1); + break; + case 0x2252: + set_byte(math_param_a, data, ~address & 1); + break; + case 0x2253: + set_byte(math_param_b, data, ~address & 1); + break; + case 0x2254: + set_byte(math_param_b, data, ~address & 1); + switch (math_mode) { + case 0: + math_result = (uint32_t)((int16_t)math_param_a * (int16_t)math_param_b); + math_param_b = 0; + break; + case 1: + if (math_param_b) { + math_result = (((int16_t)math_param_a + ((uint32_t)math_param_b << 16)) / math_param_b) & 0xffff; + math_result |= ((uint16_t)(((int16_t)math_param_a + ((uint32_t)math_param_b << 16)) % math_param_b) & 0xffff) << 16; + } else { + math_result = 0; + } + math_param_a = math_param_b = 0; + break; + case 2: + math_result = math_result + (int16_t)math_param_a * (int16_t)math_param_b; + math_overflow = (math_result & math_overflow_mask) != 0; + math_result &= math_40bit_mask; + math_param_b = 0; + break; + case 3: + /* reserved mode */ + break; + } + //bprintf(0, _T("math mode %x: res: %I64x\n"), math_mode, math_result); + break; + + case 0x2258: // variable bit-length bus read + vari_width = ((data & 0x0f) == 0) ? 0x10 : data & 0x0f; + vari_clock = data & 0x80; + + if (vari_clock == 0) { + vari_src += (vari_bitcount += vari_width) >> 3; + vari_bitcount &= 0x07; + } + break; + case 0x2259: + case 0x225a: + case 0x225b: + vari_bitcount = 0; + set_byte(vari_src, data, address - 0x2259); + break; + } +} + +static uint8_t snes_regs_read(uint32_t address) +{ + address &= 0xffff; +// if ((address & 0x2f00) == 0x2300) +// bprintf(0, _T("snes_regs_read(%x)\n"), address); + switch (address) { + case 0x2300: return (scpu_control & 0x0f) | (scpu_irq_pending & 0xf0); + case 0x2301: return (sa1_control & 0x0f) | (sa1_irq_pending & 0xf0); // is this valid from snes side? kirby superstar seems to think so + } + +// bprintf(0, _T("snes_regs_read(%x)\n"), address); + + return snes_ctx->openBus; +} + +static void snes_regs_write(uint32_t address, uint8_t data) +{ + address &= 0xffff; +// if ((address & 0x2f00) == 0x2200) +// bprintf(0, _T("snes_regs_write(%x) %x\n"), address, data); + switch (address) { + case 0x2200: +// bprintf(0, _T("sa1_control %x\n"), data); + if (~data & 0x20 && sa1_control & 0x20) { + cpusa1_reset(true); + } + + cpusa1_setHalt(data & 0x40); + + sa1_control = data; + + if (data & sa1_IRQ) sa1_set_irq(sa1_IRQ, 1); + if (data & sa1_IRQ_NMI) sa1_set_irq(sa1_IRQ_NMI, 1); + check_pending_irqs(); + break; + + case 0x2201: + scpu_irq_enable = data; + check_pending_irqs(); + break; + case 0x2202: + if (data & sa1_IRQ) scpu_set_irq(sa1_IRQ, 0); + if (data & sa1_IRQ_DMA) scpu_set_irq(sa1_IRQ_DMA, 0); + check_pending_irqs(); + break; + + case 0x2203: + case 0x2204: + set_byte(sa1_reset_vector, data, ~address & 1); + break; + case 0x2205: + case 0x2206: + set_byte(sa1_nmi_vector, data, ~address & 1); + break; + case 0x2207: + case 0x2208: + set_byte(sa1_irq_vector, data, ~address & 1); + break; + + case 0x2220: + case 0x2221: + case 0x2222: + case 0x2223: + if (data != supermmc[address & 3]) { + supermmc[address & 3] = data; + //bprintf(0, _T("MAP[%x] = %x %S\n"), address & 3, data & 7, (data & 0x80) ? "lowbank: use reg" : "lowbank: fixed"); + map_update(); + } + break; + + case 0x2224: + bwram_snes_bank = (data & 0x1f) * 0x2000; + break; + case 0x2226: // bwram (?) + case 0x2228:// bprintf(0, _T("bwramwp %x %x\n"), address, data); + break; + + case 0x2229: // iram write protect (?) + //bprintf(0, _T("iramwp %x %x\n"), address, data); + break; + + case 0x2231: // dma + case 0x2232: + case 0x2233: + case 0x2234: + case 0x2235: + case 0x2236: + case 0x2237: + dma_regs(address, data); + break; + } +} + +static void acc_cyc_rom_conflict(uint32_t address) { + if (sa1_snes_rom_conflict()) { + acc_cyc(); + } +} + +static void acc_cyc_iram_conflict() { + if ( (snes_ctx->adrBus & 0x40f800) == 0x003000) { + if (snes_ctx->inRefresh == false ) acc_cyc(); + if (snes_ctx->inRefresh == false ) acc_cyc(); + } +} + +static void acc_cyc_bwram_conflict() { + if ( ((snes_ctx->adrBus & 0x40e000) == 0x006000) + || ((snes_ctx->adrBus & 0xf00000) == 0x400000) ) { + acc_cyc(); + acc_cyc(); + } +} + +static inline uint8_t iram_read(uint32_t address) +{ + if (address & 0x800) return 0xff; + return iram[address & 0x7ff]; +} + +static inline void iram_write(uint32_t address, uint8_t data) +{ + if (address & 0x800) return; + iram[address & 0x7ff] = data; +} + +static inline uint8_t iram_read_sa1(uint32_t address) { + acc_cyc_iram_conflict(); + return iram_read(address); +} + +static inline void iram_write_sa1(uint32_t address, uint8_t data) { + acc_cyc_iram_conflict(); + iram_write(address, data); +} + +static inline uint8_t bwram_read(uint32_t address) +{ + return sram[address & sram_mask]; +} + +static inline uint8_t bwram_read_bank(uint32_t address) +{ + return bwram_read(bwram_snes_bank + (address & 0x1fff)); +} + +static inline uint8_t bwram_read_sa1(uint32_t address) +{ + acc_cyc(); + acc_cyc_bwram_conflict(); + return bwram_read(address); +} + +static inline uint8_t bwram_read_bank_sa1(uint32_t address) +{ + acc_cyc(); + acc_cyc_bwram_conflict(); + return bwram_read(bwram_sa1_bank + (address & 0x1fff)); +} + +static inline void bwram_write(uint32_t address, uint8_t data) +{ + sram[address & sram_mask] = data; +} + +static inline void bwram_write_bank(uint32_t address, uint8_t data) +{ + bwram_write(bwram_snes_bank + (address & 0x1fff), data); +} + +static inline void bwram_write_sa1(uint32_t address, uint8_t data) +{ + acc_cyc(); + acc_cyc_bwram_conflict(); + bwram_write(address, data); +} + +static inline void bwram_write_bank_sa1(uint32_t address, uint8_t data) +{ + acc_cyc(); + acc_cyc_bwram_conflict(); + bwram_write(bwram_sa1_bank + (address & 0x1fff), data); +} + +static inline uint8_t rom_read(uint32_t address) +{ + return rom_map[address >> 12][address & 0xfff]; +} + +static inline uint8_t rom_read_sa1(uint32_t address) +{ + acc_cyc_rom_conflict(address); + return rom_map[address >> 12][address & 0xfff]; +} + +static inline uint8_t rom_read_low_sa1(uint32_t address) +{ + acc_cyc_rom_conflict(address); + + if (cpusa1_isVector()) { + // it's absolutely necessary to detect if the cpu core is reading from + // the vectors here. Some games rely on reading from rom @ these addresses. + switch (address) { + case 0xffee: + return sa1_irq_vector & 0xff; + case 0xffef: + return sa1_irq_vector >> 8; + case 0xffea: + return sa1_nmi_vector & 0xff; + case 0xffeb: + return sa1_nmi_vector >> 8; + case 0xfffc: + return sa1_reset_vector & 0xff; + case 0xfffd: + return sa1_reset_vector >> 8; + } + } + return rom_map[address >> 12][address & 0xfff]; +} + +static inline uint8_t snes_rom_vect_read(uint32_t address) +{ + if (cpu_isVector()) { + switch (address) { + case 0xffea: if (scpu_control & 0x10) return scpu_nmi_vector & 0xff; break; + case 0xffeb: if (scpu_control & 0x10) return (scpu_nmi_vector >> 8) & 0xff; break; + case 0xffee: if (scpu_control & 0x40) return scpu_irq_vector & 0xff; break; + case 0xffef: if (scpu_control & 0x40) return (scpu_irq_vector >> 8) & 0xff; break; + } + } + + return rom_map[address >> 12][address & 0xfff]; +} + +static void map_handlers_scpu() { + map_rw(SCPU, 0x00, 0x3f, 0x2000, 0x2fff, snes_regs_read, snes_regs_write); + map_rw(SCPU, 0x80, 0xbf, 0x2000, 0x2fff, snes_regs_read, snes_regs_write); + + map_rw(SCPU, 0x00, 0x3f, 0x3000, 0x3fff, iram_read, iram_write); + map_rw(SCPU, 0x80, 0xbf, 0x3000, 0x3fff, iram_read, iram_write); + + map_rw(SCPU, 0x00, 0x3f, 0x6000, 0x7fff, bwram_read_bank, bwram_write_bank); + map_rw(SCPU, 0x80, 0xbf, 0x6000, 0x7fff, bwram_read_bank, bwram_write_bank); + + map_rw(SCPU, 0x00, 0x3f, 0x8000, 0xffff, snes_rom_vect_read, NULL); + map_rw(SCPU, 0x80, 0xbf, 0x8000, 0xffff, snes_rom_vect_read, NULL); + map_rw(SCPU, 0xc0, 0xff, 0x0000, 0xffff, rom_read, NULL); + + map_rw(SCPU, 0x40, 0x4f, 0x0000, 0xffff, bwram_read, bwram_write); +} + +// snes-cart bus +uint8_t snes_sa1_cart_read(uint32_t address) +{ + snes_sa1_run(); + + return scpu_rom_map_read[map_get_handler(address)](address); +} + +void snes_sa1_cart_write(uint32_t address, uint8_t data) +{ + snes_sa1_run(); + + scpu_rom_map_write[map_get_handler(address)](address, data); +} + +// sa1 bus map & callbacks for cpu_sa1 +static void map_handlers_sa1() { + map_rw(SA1, 0x00, 0x3f, 0x0000, 0x0fff, iram_read, iram_write); + map_rw(SA1, 0x80, 0xbf, 0x0000, 0x0fff, iram_read, iram_write); + + map_rw(SA1, 0x00, 0x3f, 0x2000, 0x2fff, sa1_regs_read, sa1_regs_write); + map_rw(SA1, 0x80, 0xbf, 0x2000, 0x2fff, sa1_regs_read, sa1_regs_write); + + map_rw(SA1, 0x00, 0x3f, 0x3000, 0x3fff, iram_read_sa1, iram_write_sa1); + map_rw(SA1, 0x80, 0xbf, 0x3000, 0x3fff, iram_read_sa1, iram_write_sa1); + + map_rw(SA1, 0x00, 0x3f, 0x6000, 0x7fff, bwram_read_bank_sa1, bwram_write_bank_sa1); + map_rw(SA1, 0x80, 0xbf, 0x6000, 0x7fff, bwram_read_bank_sa1, bwram_write_bank_sa1); + + map_rw(SA1, 0x00, 0x3f, 0x8000, 0xffff, rom_read_low_sa1, NULL); + map_rw(SA1, 0x80, 0xbf, 0x8000, 0xffff, rom_read_low_sa1, NULL); + map_rw(SA1, 0xc0, 0xff, 0x0000, 0xffff, rom_read_sa1, NULL); + + map_rw(SA1, 0x40, 0x4f, 0x0000, 0xffff, bwram_read_sa1, bwram_write_sa1); +} + +void sa1_cpuIdle() { + acc_cyc(); +} + +uint8_t sa1_cpuRead(uint32_t adr) { + acc_cyc(); + + return openbus = sa1_bus_read(adr); //sa1_rom_map_read[map_get_handler(adr)](adr); +} + +void sa1_cpuWrite(uint32_t adr, uint8_t val) { + acc_cyc(); + openbus = val; + + sa1_rom_map_write[map_get_handler(adr)](adr, val); +} diff --git a/src/burn/drv/snes/sa1.h b/src/burn/drv/snes/sa1.h new file mode 100644 index 000000000..da3eec50f --- /dev/null +++ b/src/burn/drv/snes/sa1.h @@ -0,0 +1,15 @@ +void snes_sa1_init(void *mem, uint8_t *srom, int32_t sromsize, void *s_ram, int32_t s_ram_size); +void snes_sa1_run(); +void snes_sa1_exit(); +void snes_sa1_reset(); +uint8_t snes_sa1_cart_read(uint32_t address); +void snes_sa1_cart_write(uint32_t address, uint8_t data); +void snes_sa1_handleState(StateHandler* sh); + +uint8_t sa1_cpuRead(uint32_t adr); +void sa1_cpuWrite(uint32_t adr, uint8_t val); +void sa1_cpuIdle(); +uint64_t sa1_getcycles(); +bool sa1_isrom_address(uint32_t address); +bool sa1_snes_rom_conflict(); +uint32_t sa1_snes_lastSpeed(); diff --git a/src/burn/drv/snes/sdd1.cpp b/src/burn/drv/snes/sdd1.cpp new file mode 100644 index 000000000..616addb3b --- /dev/null +++ b/src/burn/drv/snes/sdd1.cpp @@ -0,0 +1,594 @@ +// SDD-1 Decoder by Andreas Naive (Public Domain) +// Mapper, everything else by dink + +#include "snes.h" +#include "sdd1.h" + +static uint8_t *rom; +static int32_t rom_mask; +static uint8_t *sram; +static int32_t sram_mask; + +static uint8_t dma_enable[2]; +static uint8_t banks[4]; + +static uint32_t dma_address[8]; +static uint16_t dma_size[8]; +static bool dma_initxfer; + +static uint8_t rom_read(uint32_t address) { + return rom[(banks[(address >> 20) & 3] << 20) + (address & 0x0fffff)]; +} + +#define set_byte(var, data, offset) (var = (var & (~(0xff << (((offset) & 3) * 8)))) | (data << (((offset) & 3) * 8))) + +struct SDD1_IM { + uint32_t byte_address; + uint8_t bit_count; + + void init() + { + byte_address = 0; + bit_count = 0; + } + + void prepareDecomp(uint32_t in_buf) + { + byte_address = in_buf; + bit_count = 4; + } + + uint8_t getCodeword(const uint8_t code_len) + { + uint8_t codeword = rom_read(byte_address) << bit_count; + + ++bit_count; + + if (codeword & 0x80) { + codeword |= rom_read(byte_address + 1) >> (9 - bit_count); + bit_count += code_len; + } + + if (bit_count & 0x08) { + byte_address++; + bit_count &= 0x07; + } + + return codeword; + } +}; + +static SDD1_IM IM; + +struct SDD1_GCD { + void GCD_getRunCount(uint8_t code_num, uint8_t* MPScount, uint8_t* LPSind) + { + const uint8_t run_count[] = + { + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x02, 0x00, + 0x07, 0x03, 0x05, 0x01, 0x06, 0x02, 0x04, 0x00, + 0x0f, 0x07, 0x0b, 0x03, 0x0d, 0x05, 0x09, 0x01, + 0x0e, 0x06, 0x0a, 0x02, 0x0c, 0x04, 0x08, 0x00, + 0x1f, 0x0f, 0x17, 0x07, 0x1b, 0x0b, 0x13, 0x03, + 0x1d, 0x0d, 0x15, 0x05, 0x19, 0x09, 0x11, 0x01, + 0x1e, 0x0e, 0x16, 0x06, 0x1a, 0x0a, 0x12, 0x02, + 0x1c, 0x0c, 0x14, 0x04, 0x18, 0x08, 0x10, 0x00, + 0x3f, 0x1f, 0x2f, 0x0f, 0x37, 0x17, 0x27, 0x07, + 0x3b, 0x1b, 0x2b, 0x0b, 0x33, 0x13, 0x23, 0x03, + 0x3d, 0x1d, 0x2d, 0x0d, 0x35, 0x15, 0x25, 0x05, + 0x39, 0x19, 0x29, 0x09, 0x31, 0x11, 0x21, 0x01, + 0x3e, 0x1e, 0x2e, 0x0e, 0x36, 0x16, 0x26, 0x06, + 0x3a, 0x1a, 0x2a, 0x0a, 0x32, 0x12, 0x22, 0x02, + 0x3c, 0x1c, 0x2c, 0x0c, 0x34, 0x14, 0x24, 0x04, + 0x38, 0x18, 0x28, 0x08, 0x30, 0x10, 0x20, 0x00, + 0x7f, 0x3f, 0x5f, 0x1f, 0x6f, 0x2f, 0x4f, 0x0f, + 0x77, 0x37, 0x57, 0x17, 0x67, 0x27, 0x47, 0x07, + 0x7b, 0x3b, 0x5b, 0x1b, 0x6b, 0x2b, 0x4b, 0x0b, + 0x73, 0x33, 0x53, 0x13, 0x63, 0x23, 0x43, 0x03, + 0x7d, 0x3d, 0x5d, 0x1d, 0x6d, 0x2d, 0x4d, 0x0d, + 0x75, 0x35, 0x55, 0x15, 0x65, 0x25, 0x45, 0x05, + 0x79, 0x39, 0x59, 0x19, 0x69, 0x29, 0x49, 0x09, + 0x71, 0x31, 0x51, 0x11, 0x61, 0x21, 0x41, 0x01, + 0x7e, 0x3e, 0x5e, 0x1e, 0x6e, 0x2e, 0x4e, 0x0e, + 0x76, 0x36, 0x56, 0x16, 0x66, 0x26, 0x46, 0x06, + 0x7a, 0x3a, 0x5a, 0x1a, 0x6a, 0x2a, 0x4a, 0x0a, + 0x72, 0x32, 0x52, 0x12, 0x62, 0x22, 0x42, 0x02, + 0x7c, 0x3c, 0x5c, 0x1c, 0x6c, 0x2c, 0x4c, 0x0c, + 0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, + 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08, + 0x70, 0x30, 0x50, 0x10, 0x60, 0x20, 0x40, 0x00, + }; + + uint8_t codeword = IM.getCodeword(code_num); + + if (codeword & 0x80) { + *LPSind = 1; + *MPScount = run_count[codeword >> (code_num ^ 0x07)]; + } else { + *MPScount = (1 << code_num); + } + } +}; + +static SDD1_GCD GCD; + +struct SDD1_BG { + uint8_t code_num; + uint8_t MPScount; + uint8_t LPSind; + + void init(int code) + { + code_num = code; + MPScount = 0; + LPSind = 0; + } + + void prepareDecomp() + { + MPScount = 0; + LPSind = 0; + } + + uint8_t getBit(uint8_t* endOfRun) + { + uint8_t bit; + + if (!(MPScount || LPSind)) { + GCD.GCD_getRunCount(code_num, &MPScount, &LPSind); + } + + if (MPScount) { + bit = 0; + MPScount--; + } else { + bit = 1; + LPSind = 0; + } + + if (MPScount || LPSind) { + (*endOfRun) = 0; + } else { + (*endOfRun) = 1; + } + + return bit; + } +}; + +static SDD1_BG BG[8]; + +struct SDD1_PEM_state +{ + uint8_t code_num; + uint8_t nextIfMPS; + uint8_t nextIfLPS; +}; + +static const SDD1_PEM_state PEM_evolution_table[33] = +{ + { 0,25,25}, + { 0, 2, 1}, + { 0, 3, 1}, + { 0, 4, 2}, + { 0, 5, 3}, + { 1, 6, 4}, + { 1, 7, 5}, + { 1, 8, 6}, + { 1, 9, 7}, + { 2,10, 8}, + { 2,11, 9}, + { 2,12,10}, + { 2,13,11}, + { 3,14,12}, + { 3,15,13}, + { 3,16,14}, + { 3,17,15}, + { 4,18,16}, + { 4,19,17}, + { 5,20,18}, + { 5,21,19}, + { 6,22,20}, + { 6,23,21}, + { 7,24,22}, + { 7,24,23}, + { 0,26, 1}, + { 1,27, 2}, + { 2,28, 4}, + { 3,29, 8}, + { 4,30,12}, + { 5,31,16}, + { 6,32,18}, + { 7,24,22} +}; + +struct SDD1_PEM_ContextInfo +{ + uint8_t status; + uint8_t MPS; +}; + +struct SDD1_PEM { + SDD1_PEM_ContextInfo contextInfo[32]; + + void prepareDecomp() + { + for (int i = 0; i < 32; i++) + { + contextInfo[i].status = 0; + contextInfo[i].MPS = 0; + } + } + + uint8_t getBit(uint8_t context) + { + uint8_t endOfRun; + uint8_t bit; + + SDD1_PEM_ContextInfo *pContInfo = &(contextInfo)[context]; + uint8_t currStatus = pContInfo->status; + const SDD1_PEM_state* pState = &(PEM_evolution_table[currStatus]); + uint8_t currentMPS = pContInfo->MPS; + + bit = BG[pState->code_num].getBit(&endOfRun); + + if (endOfRun) { + if (bit) { + if (!(currStatus & 0xfe)) { + (pContInfo->MPS) ^= 0x01; + } + pContInfo->status = pState->nextIfLPS; + } else { + pContInfo->status = pState->nextIfMPS; + } + } + + return bit ^ currentMPS; + } +}; + +static SDD1_PEM PEM; + +struct SDD1_CM { + uint8_t bitplanesInfo; + uint8_t contextBitsInfo; + uint8_t bit_number; + uint8_t currBitplane; + uint16_t prevBitplaneBits[8]; + + void init() + { + bitplanesInfo = 0; + contextBitsInfo = 0; + bit_number = 0; + currBitplane = 0; + for (int i = 0; i < 8; i++) { + prevBitplaneBits[i]; + } + } + + void prepareDecomp(uint32_t first_byte) + { + bitplanesInfo = rom_read(first_byte) & 0xc0; + contextBitsInfo = rom_read(first_byte) & 0x30; + bit_number = 0; + for (int i = 0; i < 8; i++) { + prevBitplaneBits[i] = 0; + } + switch (bitplanesInfo) { + case 0x00: + currBitplane = 1; + break; + case 0x40: + currBitplane = 7; + break; + case 0x80: + currBitplane = 3; + break; + } + } + + uint8_t getBit() + { + uint8_t currContext; + uint16_t *context_bits; + + switch (bitplanesInfo) { + case 0x00: + currBitplane ^= 0x01; + break; + case 0x40: + currBitplane ^= 0x01; + if (!(bit_number & 0x7f)) + currBitplane = ((currBitplane + 2) & 0x07); + break; + case 0x80: + currBitplane ^= 0x01; + if (!(bit_number & 0x7f)) + currBitplane ^= 0x02; + break; + case 0xc0: + currBitplane = bit_number & 0x07; + break; + } + + context_bits = &(prevBitplaneBits)[currBitplane]; + + currContext = (currBitplane & 0x01) << 4; + switch (contextBitsInfo) { + case 0x00: + currContext |= ((*context_bits & 0x01c0) >> 5) | (*context_bits & 0x0001); + break; + case 0x10: + currContext |= ((*context_bits & 0x0180) >> 5) | (*context_bits & 0x0001); + break; + case 0x20: + currContext |= ((*context_bits & 0x00c0) >> 5) | (*context_bits & 0x0001); + break; + case 0x30: + currContext |= ((*context_bits & 0x0180) >> 5) | (*context_bits & 0x0003); + break; + } + + uint8_t bit = PEM.getBit(currContext); + + *context_bits <<= 1; + *context_bits |= bit; + + bit_number++; + + return bit; + } +}; + +static SDD1_CM CM; + +struct SDD1_OL { + uint8_t bitplanesInfo; + uint16_t length; + uint8_t i; + uint8_t register1; + uint8_t register2; + + void init() + { + bitplanesInfo = 0; + length = 0; + i = 0; + register1 = 0; + register2 = 0; + } + + void prepareDecomp(uint32_t first_byte, uint16_t out_len) + { + bitplanesInfo = rom_read(first_byte) & 0xc0; + length = out_len; + + i = 1; + register1 = 0; + register2 = 0; + } + + uint16_t Get8Bits() // hi byte = status, 0x100 = end of transfer + { + if (length == 0) return 0x100; + + switch (bitplanesInfo) + { + case 0x00: + case 0x40: + case 0x80: + if (!i) { + i = ~i; + length--; + return register2 | (length == 0 ? 0x100 : 0); + } else { + for (register1 = register2 = 0, i = 0x80; i; i >>= 1) { + if (CM.getBit()) + register1 |= i; + + if (CM.getBit()) + register2 |= i; + } + length--; + return register1 | (length == 0 ? 0x100 : 0); + } + break; + case 0xc0: + for (register1 = 0, i = 0x01; i; i <<= 1) { + if (CM.getBit()) + register1 |= i; + } + length--; + return register1 | (length == 0 ? 0x100 : 0); + } + return 0x100; + } +}; + +static SDD1_OL OL; + +static void SDD1emu_begin_decompress(uint32_t start_address, uint16_t out_len) +{ + IM.prepareDecomp(start_address); + BG[0].prepareDecomp(); + BG[1].prepareDecomp(); + BG[2].prepareDecomp(); + BG[3].prepareDecomp(); + BG[4].prepareDecomp(); + BG[5].prepareDecomp(); + BG[6].prepareDecomp(); + BG[7].prepareDecomp(); + PEM.prepareDecomp(); + CM.prepareDecomp(start_address); + OL.prepareDecomp(start_address, out_len); +} + +void snes_sdd1_init(uint8_t *s_rom, int32_t rom_size, void *s_ram, int32_t sram_size) +{ + rom = s_rom; + rom_mask = rom_size - 1; + bprintf(0, _T("sdd1 rom mask %x\n"), rom_mask); + + sram_mask = (sram_mask != 0) ? (sram_size - 1) : 0; + sram = (uint8_t*)s_ram; +} + +void snes_sdd1_exit() +{ +} + +void snes_sdd1_reset() +{ + dma_enable[0] = dma_enable[1] = 0; + + banks[0] = 0; + banks[1] = 1; + banks[2] = 2; + banks[3] = 3; + + IM.init(); + CM.init(); + OL.init(); + + for (int i = 0; i < 8; i++) { + BG[i].init(i); + + dma_address[i] = 0; + dma_size[i] = 0; + } +} + +void snes_sdd1_handleState(StateHandler* sh) { + sh_handleBools(sh, &dma_initxfer, NULL); + sh_handleBytes(sh, &dma_enable[0], &dma_enable[1], &banks[0], &banks[1], &banks[2], &banks[3], NULL); + sh_handleWords(sh, &dma_size[0], &dma_size[1], &dma_size[2], &dma_size[3], &dma_size[4], &dma_size[5], &dma_size[6], &dma_size[7], NULL); + sh_handleInts(sh, &dma_address[0], &dma_address[1], &dma_address[2], &dma_address[3], &dma_address[4], &dma_address[5], &dma_address[6], &dma_address[7], NULL); + + sh_handleBytes(sh, &BG[0].code_num, &BG[0].MPScount, &BG[0].LPSind, &BG[1].code_num, &BG[1].MPScount, &BG[1].LPSind, &BG[2].code_num, &BG[2].MPScount, &BG[2].LPSind, &BG[3].code_num, &BG[3].MPScount, &BG[3].LPSind, NULL); + sh_handleBytes(sh, &BG[4].code_num, &BG[4].MPScount, &BG[4].LPSind, &BG[5].code_num, &BG[5].MPScount, &BG[5].LPSind, &BG[6].code_num, &BG[6].MPScount, &BG[6].LPSind, &BG[7].code_num, &BG[7].MPScount, &BG[7].LPSind, NULL); + + sh_handleBytes(sh, &IM.bit_count, &CM.bitplanesInfo, &CM.contextBitsInfo, &CM.bit_number, &CM.currBitplane, &OL.bitplanesInfo, &OL.i, &OL.register1, &OL.register2, NULL); + sh_handleWords(sh, &CM.prevBitplaneBits[0], &CM.prevBitplaneBits[1], &CM.prevBitplaneBits[2], &CM.prevBitplaneBits[3], &CM.prevBitplaneBits[4], &CM.prevBitplaneBits[5], &CM.prevBitplaneBits[6], &CM.prevBitplaneBits[7], &OL.length, NULL); + sh_handleInts(sh, &IM.byte_address, NULL); + + sh_handleByteArray(sh, (uint8_t*)&PEM.contextInfo, sizeof(PEM.contextInfo)); +} + +static uint8_t sdd1_mapper_read(uint32_t address) +{ + switch (address) { + case 0x4804: + case 0x4805: + case 0x4806: + case 0x4807: + return banks[address & 3]; + } + + return 0xff; +} + + +static void sdd1_mapper_write(uint32_t address, uint8_t data) +{ + switch (address) { + case 0x4800: + case 0x4801: + dma_enable[address & 1] = data; + break; + + case 0x4804: + case 0x4805: + case 0x4806: + case 0x4807: + banks[address & 3] = data & 0xf; + break; + } + + if (address >= 0x4300 && address <= 0x437f) { + switch(address & 0xf) { + case 2: + case 3: + case 4: + set_byte(dma_address[(address >> 4) & 7], data, (address & 0xf) - 2); + break; + + case 5: + case 6: + set_byte(dma_size[(address >> 4) & 7], data, (address & 0xf) - 5); + break; + } + } +} + +static uint8_t sdd1_bankedarea_dma_read(uint32_t address) +{ + const uint8_t dma_active = dma_enable[0] & dma_enable[1]; + + if (dma_active) { + for (int i = 0; i < 8; i++) { + if (dma_active & (1 << i) && address == dma_address[i]) { + if (dma_initxfer == false) { + //bprintf(0, _T("dma, r: %x dma_addr[%x]: %x size: %x\n"), address, i, dma_address[i], dma_size[i]); + SDD1emu_begin_decompress(address, dma_size[i]); + dma_initxfer = true; + } + + uint16_t data = OL.Get8Bits(); + + if (data & 0x100) { // EOT + dma_initxfer = false; + dma_enable[1] &= ~(1 << i); + } + + return data & 0xff; + } + } + } + + return rom_read(address); +} + +uint8_t snes_sdd1_cart_read(uint32_t address) +{ + const uint32_t bank = (address & 0xff0000) >> 16; + + if ((bank & 0xc0) == 0xc0) { + return sdd1_bankedarea_dma_read(address); + } + + if ( (bank & 0x7f) < 0x40 && (address & 0xf000) == 0x4000 ) { + return sdd1_mapper_read(address & 0xffff); + } + + if ( (bank & 0x7f) < 0x40 && (address & 0x8000) ) { // LoROM accessor + return rom[(((bank & 0x7f) << 15) + (address & 0x7fff)) & rom_mask]; + } + + if ( (bank >= 0x70 && bank <= 0x73) || ((bank & 0x7f) <= 0x3f && (address & 0xe000) == 0x6000) ) { + if (sram_mask) { + return sram[address & sram_mask]; + } + } + + bprintf(0, _T("sdd1 - unmap_read: %x\n"), address); + + return 0xff; +} + +void snes_sdd1_cart_write(uint32_t address, uint8_t data) +{ + const uint32_t bank = (address & 0xff0000) >> 16; + + if ( (bank & 0x7f) < 0x40 && (address & 0xf000) == 0x4000 ) { + sdd1_mapper_write(address & 0xffff, data); + return; + } + + if ( (bank >= 0x70 && bank <= 0x73) || ((bank & 0x7f) <= 0x3f && (address & 0xe000) == 0x6000) ) { + if (sram_mask) { + sram[address & sram_mask] = data; + } + return; + } +} diff --git a/src/burn/drv/snes/sdd1.h b/src/burn/drv/snes/sdd1.h new file mode 100644 index 000000000..c0f62251b --- /dev/null +++ b/src/burn/drv/snes/sdd1.h @@ -0,0 +1,6 @@ +void snes_sdd1_init(uint8_t *s_rom, int32_t rom_size, void *s_ram, int32_t sram_size); +void snes_sdd1_exit(); +void snes_sdd1_reset(); +void snes_sdd1_handleState(StateHandler* sh); +uint8_t snes_sdd1_cart_read(uint32_t address); +void snes_sdd1_cart_write(uint32_t address, uint8_t data); diff --git a/src/burn/drv/snes/snes.cpp b/src/burn/drv/snes/snes.cpp new file mode 100644 index 000000000..469a022e8 --- /dev/null +++ b/src/burn/drv/snes/snes.cpp @@ -0,0 +1,696 @@ + +#include +#include +#include +#include +#include + +#include "snes.h" +#include "cpu.h" +#include "apu.h" +#include "spc.h" +#include "dma.h" +#include "ppu.h" +#include "cart.h" +#include "cx4.h" +#include "input.h" +#include "statehandler.h" + +#include "sa1.h" // debug + +static void snes_runCycle(Snes* snes); +static void snes_catchupApu(Snes* snes); +static void snes_doAutoJoypad(Snes* snes); +static uint8_t snes_readReg(Snes* snes, uint16_t adr); +static void snes_writeReg(Snes* snes, uint16_t adr, uint8_t val); +static uint8_t snes_rread(Snes* snes, uint32_t adr); // wrapped by read, to set open bus +static int snes_getAccessTime(Snes* snes, uint32_t adr); +static void build_accesstime(Snes* snes); +static void free_accesstime(); + +static uint8_t *access_time; + +Snes* snes_init(void) { + Snes* snes = (Snes*)BurnMalloc(sizeof(Snes)); + cpu_init(snes); //, snes_cpuRead, snes_cpuWrite, snes_cpuIdle); + snes->apu = apu_init(snes); + snes->dma = dma_init(snes); + ppu_init(snes); + snes->cart = cart_init(snes); + snes->input1 = input_init(snes, 1); + snes->input2 = input_init(snes, 2); + snes->palTiming = false; + + return snes; +} + +void snes_free(Snes* snes) { + cpu_free(); + apu_free(snes->apu); + dma_free(snes->dma); + ppu_free(); + cart_free(snes->cart); + input_free(snes->input1); + input_free(snes->input2); + free_accesstime(); + BurnFree(snes); +} + +void snes_reset(Snes* snes, bool hard) { + cpu_reset(hard); + apu_reset(snes->apu); + dma_reset(snes->dma); + ppu_reset(); + input_reset(snes->input1); + input_reset(snes->input2); + cart_reset(snes->cart); + if(hard) memset(snes->ram, snes->ramFill, sizeof(snes->ram)); + snes->ramAdr = 0; + snes->hPos = 0; + snes->vPos = 0; + snes->frames = 0; + snes->cycles = 0; + snes->syncCycle = 0; + snes->hIrqEnabled = false; + snes->vIrqEnabled = false; + snes->nmiEnabled = false; + snes->hTimer = 0x1ff * 4; + snes->vTimer = 0x1ff; + snes->hvTimer = 0; + snes->inNmi = false; + snes->irqCondition = false; + snes->inIrq = false; + snes->inVblank = false; + snes->inRefresh = false; + memset(snes->portAutoRead, 0, sizeof(snes->portAutoRead)); + snes->autoJoyRead = false; + snes->autoJoyTimer = 0; + snes->ppuLatch = true; + snes->multiplyA = 0xff; + snes->multiplyResult = 0xfe01; + snes->divideA = 0xffff; + snes->divideResult = 0x101; + snes->fastMem = false; + snes->openBus = 0; + + build_accesstime(snes); + + snes->nextHoriEvent = 16; +} + +void snes_handleState(Snes* snes, StateHandler* sh) { + sh_handleBools(sh, + &snes->palTiming, &snes->hIrqEnabled, &snes->vIrqEnabled, &snes->nmiEnabled, &snes->inNmi, &snes->irqCondition, + &snes->inIrq, &snes->inVblank, &snes->autoJoyRead, &snes->ppuLatch, &snes->fastMem, NULL + ); + sh_handleBytes(sh, &snes->multiplyA, &snes->openBus, NULL); + sh_handleWords(sh, + &snes->hPos, &snes->vPos, &snes->hTimer, &snes->vTimer, + &snes->portAutoRead[0], &snes->portAutoRead[1], &snes->portAutoRead[2], &snes->portAutoRead[3], + &snes->multiplyResult, &snes->divideA, &snes->divideResult, NULL + ); + sh_handleInts(sh, &snes->hvTimer, &snes->ramAdr, &snes->frames, &snes->nextHoriEvent, NULL); + sh_handleLongLongs(sh, &snes->cycles, &snes->syncCycle, &snes->autoJoyTimer, NULL); + sh_handleByteArray(sh, snes->ram, 0x20000); + // components + cpu_handleState(sh); + dma_handleState(snes->dma, sh); + ppu_handleState(sh); + apu_handleState(snes->apu, sh); + input_handleState(snes->input1, sh); + input_handleState(snes->input2, sh); + cart_handleState(snes->cart, sh); +} + +#define DEBUG_CYC 0 + +void snes_runFrame(Snes* snes) { +#if DEBUG_CYC + uint32_t apu_cyc_start = apu_cycles(snes->apu); + uint64_t cpu_cyc_start = snes->cycles; + bprintf(0, _T("fr. %d: cycles start frame: %I64u\n"), nCurrentFrame, snes->cycles); +#endif + + while(snes->inVblank) { + cpu_runOpcode(); + } + // then run until we are at vblank, or we end up at next frame (DMA caused vblank to be skipped) + uint32_t frame = snes->frames; + while(!snes->inVblank && frame == snes->frames) { + cpu_runOpcode(); + } + +#if DEBUG_CYC + uint32_t apu_cyc_end = apu_cycles(snes->apu); + uint64_t cpu_cyc_end = snes->cycles; + bprintf(0, _T("%04d: apu / cpu cycles ran: %d\t\t%I64u\n"), nCurrentFrame, apu_cyc_end - apu_cyc_start, cpu_cyc_end - cpu_cyc_start); + bprintf(0, _T("fr. %d: cycles -end- frame: %I64u\n"), nCurrentFrame, snes->cycles); +#endif +} + +void snes_runCycles(Snes* snes, int cycles) { + for(int i = 0; i < cycles; i += 2) { + snes_runCycle(snes); + } +} + +void snes_runCycles4(Snes* snes) { + snes_runCycle(snes); + snes_runCycle(snes); +} + +void snes_runCycles6(Snes* snes) { + snes_runCycle(snes); + snes_runCycle(snes); + snes_runCycle(snes); +} + +void snes_runCycles8(Snes* snes) { + snes_runCycle(snes); + snes_runCycle(snes); + snes_runCycle(snes); + snes_runCycle(snes); +} + +void snes_syncCycles(Snes* snes, bool start, int syncCycles) { + if(start) { + snes->syncCycle = snes->cycles; + int count = syncCycles - (snes->cycles % syncCycles); + snes_runCycles(snes, count); + } else { + int count = syncCycles - ((snes->cycles - snes->syncCycle) % syncCycles); + snes_runCycles(snes, count); + } +} + +int snes_verticalLinecount(Snes* snes) { + if(!snes->palTiming) { + // even interlace frame is 263 lines + return (!ppu_frameInterlace() || !ppu_evenFrame()) ? 262 : 263; + } else { + // even interlace frame is 313 lines + return (!ppu_frameInterlace() || !ppu_evenFrame()) ? 312 : 313; + } +} + +static void snes_runCycle(Snes* snes) { + snes->cycles += 2; + if(snes->cart->heavySync) { + cart_run(); // run spetzi chippy + } + if ((snes->hPos & 2) == 0) { + // check for h/v timer irq's every 4 cycles + if (snes->hvTimer > 0) { + snes->hvTimer -= 2; + if (snes->hvTimer == 0) { +// bprintf(0, _T("IRQ @ %d,%d\n"),snes->hPos,snes->vPos); + snes->inIrq = true; + cpu_setIrq(true); + } + } + const bool condition = ( + (snes->vIrqEnabled || snes->hIrqEnabled) && + (snes->vPos == snes->vTimer || !snes->vIrqEnabled) && + (snes->hPos == snes->hTimer || !snes->hIrqEnabled) + ); + if(!snes->irqCondition && condition) { + snes->hvTimer = 4; + } + snes->irqCondition = condition; + } + // increment position + snes->hPos += 2; // must come after irq checks! (hagane, cybernator) + // handle positional stuff + if (snes->hPos == snes->nextHoriEvent) { + switch (snes->hPos) { + case 16: { + snes->nextHoriEvent = 22; + if(snes->vPos == 0) snes->dma->hdmaInitRequested = true; + } break; + case 22: { + snes->nextHoriEvent = 512; + if(!snes->inVblank && snes->vPos > 0) ppu_latchMode7(snes->vPos); + } break; + case 512: { + snes->nextHoriEvent = 538; + // render the line halfway of the screen for better compatibility + if(!snes->inVblank && snes->vPos > 0) ppu_runLine(snes->vPos); + } break; + case 538: { + snes->nextHoriEvent = 1104; + // +40cycle dram refresh + snes->inRefresh = true; + snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); + snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); + snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); + snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); snes_runCycle(snes); + snes->inRefresh = false; + } break; + case 1104: { + if(!snes->inVblank) snes->dma->hdmaRunRequested = true; + if(!snes->palTiming) { + // line 240 of odd frame with no interlace is 4 cycles shorter + // if((snes->hPos == 1360 && snes->vPos == 240 && !ppu_evenFrame() && !ppu_frameInterlace()) || snes->hPos == 1364) { + snes->nextHoriEvent = (snes->vPos == 240 && !ppu_evenFrame() && !ppu_frameInterlace()) ? 1360 : 1364; + //bprintf(0, _T("%d,"),snes->nextHoriEvent); + } else { + // line 311 of odd frame with interlace is 4 cycles longer + // if((snes->hPos == 1364 && (snes->vPos != 311 || ppu_evenFrame() || !ppu_frameInterlace())) || snes->hPos == 1368) + snes->nextHoriEvent = (snes->vPos != 311 || ppu_evenFrame() || !ppu_frameInterlace()) ? 1364 : 1368; + } + } break; + case 1360: + case 1364: + case 1368: { // this is the end (of the h-line) + snes->nextHoriEvent = 16; + + snes->hPos = 0; + snes->vPos++; + if(!snes->palTiming) { + // even interlace frame is 263 lines + if((snes->vPos == 262 && (!ppu_frameInterlace() || !ppu_evenFrame())) || snes->vPos == 263) { + cart_run(); + snes->vPos = 0; + snes->frames++; + } + } else { + // even interlace frame is 313 lines + if((snes->vPos == 312 && (!ppu_frameInterlace() || !ppu_evenFrame())) || snes->vPos == 313) { + cart_run(); + snes->vPos = 0; + snes->frames++; + } + } + + // end of hblank, do most vPos-tests + bool startingVblank = false; + if(snes->vPos == 0) { + // end of vblank + snes->inVblank = false; + snes->inNmi = false; + ppu_handleFrameStart(); + } else if(snes->vPos == 225) { + // ask the ppu if we start vblank now or at vPos 240 (overscan) + startingVblank = !ppu_checkOverscan(); + } else if(snes->vPos == 240){ + // if we are not yet in vblank, we had an overscan frame, set startingVblank + if(!snes->inVblank) startingVblank = true; + } + if(startingVblank) { + // catch up the apu at end of emulated frame (we end frame @ start of vblank) + snes_catchupApu(snes); + // notify dsp of frame-end, because sometimes dma will extend much further past vblank (or even into the next frame) + // Megaman X2 (titlescreen animation), Tales of Phantasia (game demo), Actraiser 2 (fade-in @ bootup) + dsp_newFrame(snes->apu->dsp); + + // we are starting vblank + ppu_handleVblank(); + snes->inVblank = true; + snes->inNmi = true; + if(snes->autoJoyRead) { + // TODO: this starts a little after start of vblank + snes->autoJoyTimer = snes->cycles; // 4224; + snes_doAutoJoypad(snes); + } + if(snes->nmiEnabled) { + cpu_nmi(); + } + } + } break; + } + } +} + +static void snes_catchupApu(Snes* snes) { + apu_runCycles(snes->apu); +} + +static void snes_doAutoJoypad(Snes* snes) { + memset(snes->portAutoRead, 0, sizeof(snes->portAutoRead)); + // latch controllers + input_latch(snes->input1, true); + input_latch(snes->input2, true); + input_latch(snes->input1, false); + input_latch(snes->input2, false); + for(int i = 0; i < 16; i++) { + uint8_t val = input_read(snes->input1); + snes->portAutoRead[0] |= ((val & 1) << (15 - i)); + snes->portAutoRead[2] |= (((val >> 1) & 1) << (15 - i)); + val = input_read(snes->input2); + snes->portAutoRead[1] |= ((val & 1) << (15 - i)); + snes->portAutoRead[3] |= (((val >> 1) & 1) << (15 - i)); + } +} + +uint8_t snes_readBBus(Snes* snes, uint8_t adr) { + if(adr < 0x40) { + return ppu_read(adr); + } + if(adr < 0x80) { + snes_catchupApu(snes); // catch up the apu before reading + // bprintf(0, _T("SR:%x %x\t\t%I64u\t\tpc: %x\n"), adr&3,snes->apu->outPorts[adr & 0x3],snes->apu->cycles,snes->apu->spc->pc); + return snes->apu->outPorts[adr & 0x3]; + } + if(adr == 0x80) { + uint8_t ret = snes->ram[snes->ramAdr++]; + snes->ramAdr &= 0x1ffff; + return ret; + } + return snes->openBus; +} + +void snes_writeBBus(Snes* snes, uint8_t adr, uint8_t val) { + if(adr < 0x40) { + ppu_write(adr, val); + return; + } + if(adr < 0x80) { + snes_catchupApu(snes); // catch up the apu before writing +// bprintf(0, _T("SW:%x %x\t\t%I64u\t\tpc: %x\n"), adr&3,val,snes->apu->cycles,snes->apu->spc->pc); + snes->apu->inPorts[adr & 0x3] = val; + return; + } + switch(adr) { + case 0x80: { + snes->ram[snes->ramAdr++] = val; + snes->ramAdr &= 0x1ffff; + break; + } + case 0x81: { + snes->ramAdr = (snes->ramAdr & 0x1ff00) | val; + break; + } + case 0x82: { + snes->ramAdr = (snes->ramAdr & 0x100ff) | (val << 8); + break; + } + case 0x83: { + snes->ramAdr = (snes->ramAdr & 0x0ffff) | ((val & 1) << 16); + break; + } + } +} + +static uint8_t snes_readReg(Snes* snes, uint16_t adr) { + switch(adr) { + case 0x4210: { + uint8_t val = 0x2; // CPU version (4 bit) + val |= snes->inNmi << 7; + snes->inNmi = false; + return val | (snes->openBus & 0x70); + } + case 0x4211: { +// bprintf(0, _T("TIMEUP 0x%x @ %d %d inirq %x\n"), adr, snes->hPos, snes->vPos,snes->inIrq); + uint8_t val = snes->inIrq << 7; + snes->inIrq = false; + cpu_setIrq(false); + return val | (snes->openBus & 0x7f); + } + case 0x4212: { + uint8_t val = ((snes->cycles - snes->autoJoyTimer) <= 4224); + val |= (snes->hPos < 4 || snes->hPos >= 1096) << 6; + val |= snes->inVblank << 7; + return val | (snes->openBus & 0x3e); + } + case 0x4213: { + return snes->ppuLatch << 7; // IO-port + } + case 0x4214: { + return snes->divideResult & 0xff; + } + case 0x4215: { + return snes->divideResult >> 8; + } + case 0x4216: { + return snes->multiplyResult & 0xff; + } + case 0x4217: { + return snes->multiplyResult >> 8; + } + case 0x4218: + case 0x421a: + case 0x421c: + case 0x421e: { + return snes->portAutoRead[(adr - 0x4218) / 2] & 0xff; + } + case 0x4219: + case 0x421b: + case 0x421d: + case 0x421f: { + return snes->portAutoRead[(adr - 0x4219) / 2] >> 8; + } + default: { + return snes->openBus; + } + } +} + +static void snes_writeReg(Snes* snes, uint16_t adr, uint8_t val) { + //bprintf(0, _T("write 0x%x %x @ %d %d\n"), adr, val, snes->hPos, snes->vPos); + switch(adr) { + case 0x4200: { + snes->autoJoyRead = val & 0x1; + if(!snes->autoJoyRead) snes->autoJoyTimer = 0; + snes->hIrqEnabled = val & 0x10; + snes->vIrqEnabled = val & 0x20; + if(!snes->hIrqEnabled && !snes->vIrqEnabled) { + snes->inIrq = false; + cpu_setIrq(false); + } + // if nmi is enabled while inNmi is still set, immediately generate nmi + if(!snes->nmiEnabled && (val & 0x80) && snes->inNmi) { + cpu_nmi(); + } + snes->nmiEnabled = val & 0x80; + cpu_setIntDelay(); // nmi is delayed by 1 opcode + break; + } + case 0x4201: { + if(!(val & 0x80) && snes->ppuLatch) { + // latch the ppu h/v registers + ppu_latchHV(); + } + snes->ppuLatch = val & 0x80; + break; + } + case 0x4202: { + snes->multiplyA = val; + break; + } + case 0x4203: { + snes->multiplyResult = snes->multiplyA * val; + break; + } + case 0x4204: { + snes->divideA = (snes->divideA & 0xff00) | val; + break; + } + case 0x4205: { + snes->divideA = (snes->divideA & 0x00ff) | (val << 8); + break; + } + case 0x4206: { + if(val == 0) { + snes->divideResult = 0xffff; + snes->multiplyResult = snes->divideA; + } else { + snes->divideResult = snes->divideA / val; + snes->multiplyResult = snes->divideA % val; + } + break; + } + case 0x4207: { + //snes->hTimer = (snes->hTimer & 0x100) | val; + snes->hTimer = (snes->hTimer & 0x400) | (val << 2); + //bprintf(0, _T("hTimer.l %x both %x\n"), val<<2, snes->hTimer); + break; + } + case 0x4208: { + //snes->hTimer = (snes->hTimer & 0x0ff) | ((val & 1) << 8); + snes->hTimer = (snes->hTimer & 0x03fc) | ((val & 1) << 10); + //bprintf(0, _T("hTimer.h %x both %x\n"), (val&1)<<10, snes->hTimer); + break; + } + case 0x4209: { + snes->vTimer = (snes->vTimer & 0x100) | val; + //bprintf(0, _T("vTimer.l %x both %x\n"), val, snes->vTimer); + break; + } + case 0x420a: { + snes->vTimer = (snes->vTimer & 0x0ff) | ((val & 1) << 8); + //bprintf(0, _T("vTimer.h %x both %x\n"), ((val & 1) << 8), snes->vTimer); + break; + } + case 0x420b: { + dma_startDma(snes->dma, val, false); + break; + } + case 0x420c: { + dma_startDma(snes->dma, val, true); + break; + } + case 0x420d: { + snes->fastMem = val & 0x1; + //bprintf(0, _T("fastMem %x\n"), val); + break; + } + default: { + break; + } + } +} + +static uint8_t snes_rread(Snes* snes, uint32_t adr) { + const uint8_t bank = adr >> 16; + adr &= 0xffff; + if(bank == 0x7e || bank == 0x7f) { + return snes->ram[((bank & 1) << 16) | adr]; // ram + } + if(bank < 0x40 || (bank >= 0x80 && bank < 0xc0)) { + if(adr < 0x2000) { + return snes->ram[adr]; // ram mirror + } + if(adr >= 0x2100 && adr < 0x2200) { + return snes_readBBus(snes, adr & 0xff); // B-bus + } + if(adr == 0x4016) { + return input_read(snes->input1) | (snes->openBus & 0xfc); + } + if(adr == 0x4017) { + return input_read(snes->input2) | (snes->openBus & 0xe0) | 0x1c; + } + if(adr >= 0x4200 && adr < 0x4220) { + return snes_readReg(snes, adr); // internal registers + } + if(adr >= 0x4300 && adr < 0x4380) { + return dma_read(snes->dma, adr); // dma registers + } + } + // read from cart + return cart_read(snes->cart, bank, adr); +} + +void snes_write(Snes* snes, uint32_t adr, uint8_t val) { + snes->openBus = val; + snes->adrBus = adr; + const uint8_t bank = adr >> 16; + adr &= 0xffff; + if(bank == 0x7e || bank == 0x7f) { + snes->ram[((bank & 1) << 16) | adr] = val; // ram + } + if(bank < 0x40 || (bank >= 0x80 && bank < 0xc0)) { + if(adr < 0x2000) { + snes->ram[adr] = val; // ram mirror + } + if(adr >= 0x2100 && adr < 0x2200) { + snes_writeBBus(snes, adr & 0xff, val); // B-bus + } + if(adr == 0x4016) { + input_latch(snes->input1, val & 1); // input latch + input_latch(snes->input2, val & 1); + } + if(adr >= 0x4200 && adr < 0x4220) { + snes_writeReg(snes, adr, val); // internal registers + } + if(adr >= 0x4300 && adr < 0x4380) { + dma_write(snes->dma, adr, val); // dma registers + } + } + // write to cart + cart_write(snes->cart, bank, adr, val); +} + +#if 0 +static int snes_getAccessTime(Snes* snes, uint32_t adr) { + uint8_t bank = adr >> 16; + adr &= 0xffff; + if((bank < 0x40 || (bank >= 0x80 && bank < 0xc0)) && adr < 0x8000) { + // 00-3f,80-bf:0-7fff + if(adr < 0x2000 || adr >= 0x6000) return 8; // 0-1fff, 6000-7fff + if(adr < 0x4000 || adr >= 0x4200) return 6; // 2000-3fff, 4200-5fff + return 12; // 4000-41ff + } + // 40-7f,co-ff:0000-ffff, 00-3f,80-bf:8000-ffff + return (snes->fastMem && bank >= 0x80) ? 6 : 8; // depends on setting in banks 80+ +} +#endif + +static inline int snes_getAccessTime(Snes* snes, UINT32 adr) +{ + if ((adr & 0x408000) == 0) + { + adr &= 0xffff; + // 00-3f,80-bf:0-7fff + if(adr < 0x2000 || adr >= 0x6000) return 8; // 0-1fff, 6000-7fff + if(adr < 0x4000 || adr >= 0x4200) return 6; // 2000-3fff, 4200-5fff + return 12; // 4000-41ff + } + + // 40-7f,co-ff:0000-ffff, 00-3f,80-bf:8000-ffff + return (snes->fastMem && (adr & 0x800000)) ? 6 : 8; // depends on setting in banks 80+ +} + +static void build_accesstime(Snes* snes) { + if (access_time == NULL) { + access_time = (uint8_t *)BurnMalloc(0x1000000 * 2); + } + snes->fastMem = 0; + for (int i = 0; i < 0x1000000; i++) { + access_time[i] = snes_getAccessTime(snes, i); + } + snes->fastMem = 1; + for (int i = 0x1000000; i < 0x2000000; i++) { + access_time[i] = snes_getAccessTime(snes, i & 0xffffff); + } + snes->fastMem = 0; +} + +static void free_accesstime() { + BurnFree(access_time); +} + +uint8_t snes_read(Snes* snes, uint32_t adr) { + snes->adrBus = adr; + uint8_t val = snes_rread(snes, adr); + snes->openBus = val; + return val; +} + +void snes_cpuIdle(void* mem, bool waiting) { + Snes* snes = (Snes*) mem; + dma_handleDma(snes->dma, 6); + snes_runCycles6(snes); +} + +uint8_t snes_cpuRead(void* mem, uint32_t adr) { + Snes* snes = (Snes*) mem; + const int cycles = access_time[adr + (snes->fastMem << 24)]; +// const int cycles = snes_getAccessTime(snes, adr); + dma_handleDma(snes->dma, cycles); + snes->adrBus = adr; + snes_runCycles(snes, cycles - 4); + const uint8_t rv = snes_read(snes, adr); + snes_runCycles4(snes); + return rv; +} + +void snes_cpuWrite(void* mem, uint32_t adr, uint8_t val) { + Snes* snes = (Snes*) mem; + const int cycles = access_time[adr + (snes->fastMem << 24)]; + //const int cycles = snes_getAccessTime(snes, adr); + dma_handleDma(snes->dma, cycles); + snes->adrBus = adr; + snes_runCycles(snes, cycles); + snes_write(snes, adr, val); +} + +// debugging + +void snes_runCpuCycle(Snes* snes) { + cpu_runOpcode(); +} + +void snes_runSpcCycle(Snes* snes) { + // TODO: apu catchup is not aware of this, SPC runs extra cycle(s) + spc_runOpcode(snes->apu->spc); +} diff --git a/src/burn/drv/snes/snes.h b/src/burn/drv/snes/snes.h new file mode 100644 index 000000000..5d1f1dc41 --- /dev/null +++ b/src/burn/drv/snes/snes.h @@ -0,0 +1,102 @@ + +#ifndef SNES_H +#define SNES_H + +#include "burnint.h" + +typedef struct Snes Snes; + +#include "cpu.h" +#include "apu.h" +#include "dma.h" +#include "ppu.h" +#include "cart.h" +#include "input.h" +#include "statehandler.h" + +struct Snes { + Cpu* cpu; + Apu* apu; + Dma* dma; + Cart* cart; + bool palTiming; + // input + Input* input1; + Input* input2; + // ram + uint8_t ram[0x20000]; + uint32_t ramAdr; + uint8_t ramFill; + // frame timing + int16_t hPos; + uint16_t vPos; + uint32_t frames; + uint64_t cycles; + uint64_t syncCycle; + uint32_t nextHoriEvent; + // cpu handling + // nmi / irq + bool hIrqEnabled; + bool vIrqEnabled; + bool nmiEnabled; + uint16_t hTimer; + uint16_t vTimer; + uint32_t hvTimer; + bool inNmi; + bool irqCondition; + bool inIrq; + bool inVblank; + bool inRefresh; + // joypad handling + uint16_t portAutoRead[4]; // as read by auto-joypad read + bool autoJoyRead; + uint64_t autoJoyTimer; // times how long until reading is done + bool ppuLatch; + // multiplication/division + uint8_t multiplyA; + uint16_t multiplyResult; + uint16_t divideA; + uint16_t divideResult; + // misc + bool fastMem; + uint32_t adrBus; + uint8_t openBus; +}; + +Snes* snes_init(void); +void snes_free(Snes* snes); +void snes_reset(Snes* snes, bool hard); +void snes_handleState(Snes* snes, StateHandler* sh); +void snes_runFrame(Snes* snes); +// used by dma, cpu +void snes_runCycles(Snes* snes, int cycles); +void snes_runCycles4(Snes* snes); +void snes_runCycles6(Snes* snes); +void snes_runCycles8(Snes* snes); +void snes_syncCycles(Snes* snes, bool start, int syncCycles); +uint8_t snes_readBBus(Snes* snes, uint8_t adr); +void snes_writeBBus(Snes* snes, uint8_t adr, uint8_t val); +uint8_t snes_read(Snes* snes, uint32_t adr); +void snes_write(Snes* snes, uint32_t adr, uint8_t val); +void snes_cpuIdle(void* mem, bool waiting); +uint8_t snes_cpuRead(void* mem, uint32_t adr); +void snes_cpuWrite(void* mem, uint32_t adr, uint8_t val); +int snes_verticalLinecount(Snes* snes); +// debugging +void snes_runCpuCycle(Snes* snes); +void snes_runSpcCycle(Snes* snes); + +// snes_other.c functions: + +bool snes_loadRom(Snes* snes, const uint8_t* data, int length, uint8_t* biosdata, int bioslength); +void snes_setButtonState(Snes* snes, int player, int button, int pressed, int device); +void snes_setMouseState(Snes* snes, int player, int16_t x, int16_t y, uint8_t buttonA, uint8_t buttonB); +void snes_setPixels(Snes* snes, uint8_t* pixelData, int height); +void snes_setSamples(Snes* snes, int16_t* sampleData, int samplesPerFrame); +int snes_saveBattery(Snes* snes, uint8_t* data); +bool snes_loadBattery(Snes* snes, uint8_t* data, int size); +int snes_saveState(Snes* snes, uint8_t* data); +bool snes_loadState(Snes* snes, uint8_t* data, int size); +bool snes_isPal(Snes* snes); + +#endif diff --git a/src/burn/drv/snes/snes_other.cpp b/src/burn/drv/snes/snes_other.cpp new file mode 100644 index 000000000..85ec7c6e7 --- /dev/null +++ b/src/burn/drv/snes/snes_other.cpp @@ -0,0 +1,398 @@ + +#include +#include +#include +#include +#include + +#include "snes.h" +#include "cart.h" +#include "ppu.h" +#include "dsp.h" +#include "statehandler.h" + +static const int stateVersion = 1; + +typedef struct CartHeader { + // normal header + uint8_t headerVersion; // 1, 2, 3 + char name[22]; // $ffc0-$ffd4 (max 21 bytes + \0), $ffd4=$00: header V2 + uint8_t speed; // $ffd5.7-4 (always 2 or 3) + uint8_t type; // $ffd5.3-0 + uint8_t coprocessor; // $ffd6.7-4 + uint8_t chips; // $ffd6.3-0 + uint32_t romSize; // $ffd7 (0x400 << x) + uint32_t ramSize; // $ffd8 (0x400 << x) + uint8_t region; // $ffd9 (also NTSC/PAL) + uint8_t maker; // $ffda ($33: header V3) + uint8_t version; // $ffdb + uint16_t checksumComplement; // $ffdc,$ffdd + uint16_t checksum; // $ffde,$ffdf + // v2/v3 (v2 only exCoprocessor) + char makerCode[3]; // $ffb0,$ffb1: (2 chars + \0) + char gameCode[5]; // $ffb2-$ffb5: (4 chars + \0) + uint32_t flashSize; // $ffbc (0x400 << x) + uint32_t exRamSize; // $ffbd (0x400 << x) (used for GSU?) + uint8_t specialVersion; // $ffbe + uint8_t exCoprocessor; // $ffbf (if coprocessor = $f) + // calculated stuff + int16_t score; // score for header, to see which mapping is most likely + bool pal; // if this is a rom for PAL regions instead of NTSC + uint8_t cartType; // calculated type + bool hasBattery; // battery +} CartHeader; + +static void readHeader(const uint8_t* data, int length, int location, CartHeader* header); + +bool snes_loadRom(Snes* snes, const uint8_t* data, int length, uint8_t* biosdata, int bioslength) { + // if smaller than smallest possible, don't load + if(length < 0x8000) { + printf("Failed to load rom: rom to small (%d bytes)\n", length); + return false; + } + // check headers + const int max_headers = 8; + CartHeader headers[max_headers]; + memset(headers, 0, sizeof(headers)); + for(int i = 0; i < max_headers; i++) { + headers[i].score = -50; + } + if(length >= 0x8000) readHeader(data, length, 0x7fc0, &headers[0]); // lorom + if(length >= 0x8200) readHeader(data, length, 0x81c0, &headers[1]); // lorom + header + if(length >= 0x10000) readHeader(data, length, 0xffc0, &headers[2]); // hirom + if(length >= 0x10200) readHeader(data, length, 0x101c0, &headers[3]); // hirom + header + if(length >= 0x410000) readHeader(data, length, 0x407fc0, &headers[4]); // exlorom + if(length >= 0x410200) readHeader(data, length, 0x4081c0, &headers[5]); // exlorom + header + if(length >= 0x410000) readHeader(data, length, 0x40ffc0, &headers[6]); // exhirom + if(length >= 0x410200) readHeader(data, length, 0x4101c0, &headers[7]); // exhirom + header + // see which it is, go backwards to allow picking ExHiROM over HiROM for roms with headers in both spots + int max = 0; + int used = 0; + for(int i = max_headers-1; i >= 0; i--) { + if(headers[i].score > max) { + max = headers[i].score; + used = i; + } + } + bprintf(0, _T("header used %d\n"), used); + if(used & 1) { + // odd-numbered ones are for headered roms + data += 0x200; // move pointer past header + length -= 0x200; // and subtract from size + } + // check if we can load it + if(headers[used].cartType > 4) { + bprintf(0, _T("Failed to load rom: unsupported type (%d)\n"), headers[used].cartType); + return false; + } + // expand to a power of 2 + int newLength = 0x8000; + while(true) { + if(length <= newLength) { + break; + } + newLength *= 2; + } + uint8_t* newData = BurnMalloc(newLength); + memcpy(newData, data, length); + int test = 1; + while(length != newLength) { + if(length & test) { + memcpy(newData + length, newData + length - test, test); + length += test; + } + test *= 2; + } + + // coprocessor check + if (headers[used].exCoprocessor == 0x10) { + headers[used].cartType = CART_CX4; // cx4 + } + + // -- cart specific config -- + snes->ramFill = 0x00; // default, 00-fill + if (!strcmp(headers[used].name, "DEATH BRADE") || !strcmp(headers[used].name, "POWERDRIVE")) { + snes->ramFill = 0xff; // games prefer 0xff fill + } + if (!strcmp(headers[used].name, "ASHITANO JOE") || !strcmp(headers[used].name, "SUCCESS JOE")) { + snes->ramFill = 0x3f; // game prefers 0x3f fill + } + if (!strcmp(headers[used].name, "PGA TOUR GOLF")) { + snes->ramFill = 0x3f; + } + if (!strcmp(headers[used].name, "SUPER MARIO KART")) { + snes->ramFill = 0x3f; // start always select 2p if 00-fill + } + if (!strcmp(headers[used].name, "BATMAN--REVENGE JOKER")) { + headers[used].cartType = CART_LOROM; // it's detected as HiROM but actually LoROM (prototype) + } + + switch (headers[used].coprocessor) { + case 2: + headers[used].cartType = CART_LOROMOBC1; + break; + case 3: + headers[used].cartType = CART_LOROMSA1; + break; + case 4: + headers[used].cartType = CART_LOROMSDD1; + } + + switch (bioslength) { + case 0x2800: // DSP1-4 + bprintf(0, _T("-we have dsp bios, lets go!\n")); + switch (headers[used].cartType) { + case CART_LOROM: + headers[used].cartType = CART_LOROMDSP; + break; + case CART_HIROM: + headers[used].cartType = CART_HIROMDSP; + break; + } + break; + case 0x11000: // st010/st011 + bprintf(0, _T("-we have st010/st011 bios, lets go!\n")); + headers[used].cartType = CART_LOROMSETA;; + break; + } + + // load it + const char* typeNames[12] = {"(none)", "LoROM", "HiROM", "ExLoROM", "ExHiROM", "CX4", "LoROM-DSP", "HiROM-DSP", "LoROM-SeTa", "LoROM-SA1", "LoROM-OBC1", "LoROM-SDD1"}; + enum { CART_NONE = 0, CART_LOROM, CART_HIROM, CART_EXLOROM, CART_EXHIROM, CART_CX4, CART_LOROMDSP, CART_HIROMDSP, CART_LOROMSETA, CART_LOROMSA1, CART_LOROMOBC1, CART_LOROMSDD1 }; + + bprintf(0, _T("Loaded %S rom (%S)\n"), typeNames[headers[used].cartType], headers[used].pal ? "PAL" : "NTSC"); + bprintf(0, _T("\"%S\"\n"), headers[used].name); + + int bankSize = 0; + switch (headers[used].cartType) { + case CART_HIROM: + case CART_EXHIROM: + case CART_HIROMDSP: + bankSize = 0x10000; + break; + default: + bankSize = 0x8000; + break; + } + + bprintf( + 0, _T("%dK banks: %d, ramsize: %d%S, coprocessor: %x\n"), + bankSize / 1024, newLength / bankSize, headers[used].chips > 0 ? headers[used].ramSize : 0, (headers[used].hasBattery) ? " (battery-backed)" : "", headers[used].exCoprocessor + ); + + cart_load( + snes->cart, headers[used].cartType, + newData, newLength, biosdata, bioslength, headers[used].chips > 0 ? headers[used].ramSize : 0, + headers[used].hasBattery + ); + + snes_reset(snes, true); // reset after loading + snes->palTiming = headers[used].pal; // set region + BurnFree(newData); + return true; +} + +bool snes_isPal(Snes* snes) { + return snes->palTiming; +} + +void snes_setButtonState(Snes* snes, int player, int button, int pressed, int device) { + // set key in controller + Input* input = (player == 1) ? snes->input1 : snes->input2; + uint32_t *c_state = &input->currentState; + + input_setType(input, device); + + if(pressed) { + *c_state |= 1 << button; + } else { + *c_state &= ~(1 << button); + } + + if (device == DEVICE_SUPERSCOPE) { + static uint8_t button8_9[2] = { 0, 0 }; + + switch (button) { + case 8: + case 9: + button8_9[button & 1] = pressed; + break; + case 11: // last button + *c_state |= 0xff00; + if (*c_state & SCOPE_FIRE || *c_state & SCOPE_CURSOR) { + ppu_latchScope(button8_9[0], button8_9[1]); + } + break; + } + } +} + +void snes_setMouseState(Snes* snes, int player, int16_t x, int16_t y, uint8_t buttonA, uint8_t buttonB) { + Input* input = (player == 1) ? snes->input1 : snes->input2; + input_setType(input, DEVICE_MOUSE); + input_setMouse(input, x, y, buttonA, buttonB); +} + +void snes_setPixels(Snes* snes, uint8_t* pixelData, int height) { + // size is 4 (rgba) * 512 (w) * 480 (h) + ppu_putPixels(pixelData, height); +} + +void snes_setSamples(Snes* snes, int16_t* sampleData, int samplesPerFrame) { + // size is 2 (int16) * 2 (stereo) * samplesPerFrame + // sets samples in the sampleData + dsp_getSamples(snes->apu->dsp, sampleData, samplesPerFrame); +} + +int snes_saveBattery(Snes* snes, uint8_t* data) { + int size = 0; + cart_handleBattery(snes->cart, true, data, &size); + return size; +} + +bool snes_loadBattery(Snes* snes, uint8_t* data, int size) { + return cart_handleBattery(snes->cart, false, data, &size); +} + +int snes_saveState(Snes* snes, uint8_t* data) { + StateHandler* sh = sh_init(true, NULL, 0); + uint32_t id = 0x4653534c; // 'LSSF' LakeSnes State File + uint32_t version = stateVersion; + sh_handleInts(sh, &id, &version, &version, NULL); // second version to be overridden by length + cart_handleTypeState(snes->cart, sh); + // save data + snes_handleState(snes, sh); + // store + sh_placeInt(sh, 8, sh->offset); + if(data != NULL) memcpy(data, sh->data, sh->offset); + int size = sh->offset; + sh_free(sh); + return size; +} + +bool snes_loadState(Snes* snes, uint8_t* data, int size) { + StateHandler* sh = sh_init(false, data, size); + uint32_t id = 0, version = 0, length = 0; + sh_handleInts(sh, &id, &version, &length, NULL); + bool cartMatch = cart_handleTypeState(snes->cart, sh); + if(id != 0x4653534c || version != stateVersion || length != size || !cartMatch) { + sh_free(sh); + return false; + } + // load data + snes_handleState(snes, sh); + // finish + sh_free(sh); + return true; +} + +static void readHeader(const uint8_t* data, int length, int location, CartHeader* header) { + // read name, TODO: non-ASCII names? + for(int i = 0; i < 21; i++) { + uint8_t ch = data[location + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->name[i] = ch; + } else { + header->name[i] = '.'; + } + } + header->name[21] = 0; + // clean name (strip end space) + int slen = strlen(header->name); + while (slen > 0 && header->name[slen-1] == ' ') { + header->name[slen-1] = '\0'; + slen--; + } + // read rest + header->speed = data[location + 0x15] >> 4; + header->type = data[location + 0x15] & 0xf; + header->coprocessor = data[location + 0x16] >> 4; + header->chips = data[location + 0x16] & 0xf; + bprintf(0, _T("cart type, copro, chips: %x, %x, %x\n"), header->type, header->coprocessor, header->chips); + header->hasBattery = (header->chips == 0x02 || header->chips == 0x05 || header->chips == 0x06); + header->romSize = 0x400 << data[location + 0x17]; + header->ramSize = 0x400 << data[location + 0x18]; + header->region = data[location + 0x19]; + header->maker = data[location + 0x1a]; + header->version = data[location + 0x1b]; + header->checksumComplement = (data[location + 0x1d] << 8) + data[location + 0x1c]; + header->checksum = (data[location + 0x1f] << 8) + data[location + 0x1e]; + // read v3 and/or v2 + header->headerVersion = 1; + if(header->maker == 0x33) { + header->headerVersion = 3; + // maker code + for(int i = 0; i < 2; i++) { + uint8_t ch = data[location - 0x10 + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->makerCode[i] = ch; + } else { + header->makerCode[i] = '.'; + } + } + header->makerCode[2] = 0; + // game code + for(int i = 0; i < 4; i++) { + uint8_t ch = data[location - 0xe + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->gameCode[i] = ch; + } else { + header->gameCode[i] = '.'; + } + } + header->gameCode[4] = 0; + header->flashSize = 0x400 << data[location - 4]; + header->exRamSize = 0x400 << data[location - 3]; + header->specialVersion = data[location - 2]; + header->exCoprocessor = data[location - 1]; + } else if(data[location + 0x14] == 0) { + header->headerVersion = 2; + header->exCoprocessor = data[location - 1]; + } + //bprintf(0, _T("ramsize %x exramsize %x\n"),header->ramSize, header->exRamSize); + //bprintf(0, _T("exCoprocessor %x\n"), header->exCoprocessor); + // get region + header->pal = (header->region >= 0x2 && header->region <= 0xc) || header->region == 0x11; + header->cartType = location < 0x9000 ? CART_LOROM : CART_HIROM; + if(location > 0x400000) { + // Ex... + if (location == 0x407fc0 || location == 0x4081c0) { + header->cartType = CART_EXLOROM; // ExLoROM + } else { + header->cartType = CART_EXHIROM; // ExHiROM + } + } + // get score + // TODO: check name, maker/game-codes (if V3) for ASCII, more vectors, + // more first opcode, rom-sizes (matches?), type (matches header location?) + int score = 0; + score += (header->speed == 2 || header->speed == 3) ? 5 : -4; + score += (header->type <= 3 || header->type == 5) ? 5 : -2; + score += (header->coprocessor <= 5 || header->coprocessor >= 0xe) ? 5 : -2; + score += (header->chips <= 6 || header->chips == 9 || header->chips == 0xa) ? 5 : -2; + score += (header->region <= 0x14) ? 5 : -2; + score += (header->checksum + header->checksumComplement == 0xffff) ? 8 : -6; + uint16_t resetVector = data[location + 0x3c] | (data[location + 0x3d] << 8); + score += (resetVector >= 0x8000) ? 8 : -20; + // check first opcode after reset + int opcodeLoc = location + 0x40 - 0x8000 + (resetVector & 0x7fff); + uint8_t opcode = 0xff; + if(opcodeLoc < length) { + opcode = data[opcodeLoc]; + } else { + score -= 14; + } + if(opcode == 0x78 || opcode == 0x18) { + // sei, clc (for clc:xce) + score += 6; + } + if(opcode == 0x4c || opcode == 0x5c || opcode == 0x9c) { + // jmp abs, jml abl, stz abs + score += 3; + } + if(opcode == 0x00 || opcode == 0xff || opcode == 0xdb) { + // brk, sbc alx, stp + score -= 6; + } + header->score = score; +} diff --git a/src/burn/drv/snes/spc.cpp b/src/burn/drv/snes/spc.cpp new file mode 100644 index 000000000..ddb76ab28 --- /dev/null +++ b/src/burn/drv/snes/spc.cpp @@ -0,0 +1,1937 @@ + +#include +#include +#include +#include +#include + +#include "spc.h" +#include "statehandler.h" + +static uint8_t spc_read(Spc* spc, uint16_t adr); +static void spc_write(Spc* spc, uint16_t adr, uint8_t val); +static void spc_idle(Spc* spc); +static void spc_idleWait(Spc* spc); +static uint8_t spc_readOpcode(Spc* spc); +static uint16_t spc_readOpcodeWord(Spc* spc); +static uint8_t spc_getFlags(Spc* spc); +static void spc_setFlags(Spc* spc, uint8_t value); +static void spc_setZN(Spc* spc, uint8_t value); +static void spc_doBranch(Spc* spc, uint8_t value, bool check); +static uint8_t spc_pullByte(Spc* spc); +static void spc_pushByte(Spc* spc, uint8_t value); +static uint16_t spc_pullWord(Spc* spc); +static void spc_pushWord(Spc* spc, uint16_t value); +static uint16_t spc_readWord(Spc* spc, uint16_t adrl, uint16_t adrh); +//static void spc_writeWord(Spc* spc, uint16_t adrl, uint16_t adrh, uint16_t value); +static void spc_doOpcode(Spc* spc, uint8_t opcode); + +// addressing modes and opcode functions not declared, only used after defintions + +Spc* spc_init(void* mem, SpcReadHandler read, SpcWriteHandler write, SpcIdleHandler idle) { + Spc* spc = (Spc*)BurnMalloc(sizeof(Spc)); + spc->mem = mem; + spc->read = read; + spc->write = write; + spc->idle = idle; + return spc; +} + +void spc_free(Spc* spc) { + BurnFree(spc); +} + +void spc_reset(Spc* spc, bool hard) { + if(hard) { + spc->a = 0; + spc->x = 0; + spc->y = 0; + spc->sp = 0; + spc->pc = 0; + spc->c = false; + spc->z = false; + spc->v = false; + spc->n = false; + spc->i = false; + spc->h = false; + spc->p = false; + spc->b = false; + } + spc->stopped = false; + spc->resetWanted = true; + spc->step = 0; +} + +void spc_handleState(Spc* spc, StateHandler* sh) { + sh_handleBools(sh, + &spc->c, &spc->z, &spc->v, &spc->n, &spc->i, &spc->h, &spc->p, &spc->b, &spc->stopped, + &spc->resetWanted, NULL + ); + sh_handleBytes(sh, &spc->a, &spc->x, &spc->y, &spc->sp, &spc->opcode, &spc->dat, &spc->param, NULL); + sh_handleWords(sh, &spc->pc, &spc->adr, &spc->adr1, &spc->dat16, NULL); + sh_handleInts(sh, &spc->step, &spc->bstep, NULL); +} + +// Actraiser 2, Rendering Ranger B2, and a handful of other games have +// very tight timing constraints while processing uploads from the main cpu. +// Certain select opcodes as well as all 2-cycle (1 fetch, 1 exec_insn) run +// in single-cycle mode. -dink sept 15, 2023 + +void spc_runOpcode(Spc* spc) { + if(spc->resetWanted) { + // based on 6502, brk without writes + spc->resetWanted = false; + spc_read(spc, spc->pc); + spc_read(spc, spc->pc); + spc_read(spc, 0x100 | spc->sp--); + spc_read(spc, 0x100 | spc->sp--); + spc_read(spc, 0x100 | spc->sp--); + spc_idle(spc); + spc->i = false; + spc->pc = spc_readWord(spc, 0xfffe, 0xffff); + return; + } + if(spc->stopped) { + spc_idleWait(spc); + return; + } + if (spc->step == 0) { + spc->bstep = 0; + spc->opcode = spc_readOpcode(spc); +// extern int counter; +// if (counter) bprintf(0, _T("op: %02x pc: %x, \n"), spc->opcode, spc->pc); + spc->step = 1; + return; + } + spc_doOpcode(spc, spc->opcode); + if (spc->step == 1) spc->step = 0; // reset step for non cycle-stepped opcodes. +} + +static uint8_t spc_read(Spc* spc, uint16_t adr) { + return spc->read(spc->mem, adr); +} + +static void spc_write(Spc* spc, uint16_t adr, uint8_t val) { + spc->write(spc->mem, adr, val); +} + +static void spc_idle(Spc* spc) { + spc->idle(spc->mem, false); +} + +static void spc_idleWait(Spc* spc) { + spc->idle(spc->mem, true); +} + +static uint8_t spc_readOpcode(Spc* spc) { + return spc_read(spc, spc->pc++); +} + +static uint16_t spc_readOpcodeWord(Spc* spc) { + uint8_t low = spc_readOpcode(spc); + return low | (spc_readOpcode(spc) << 8); +} + +static uint8_t spc_getFlags(Spc* spc) { + uint8_t val = spc->n << 7; + val |= spc->v << 6; + val |= spc->p << 5; + val |= spc->b << 4; + val |= spc->h << 3; + val |= spc->i << 2; + val |= spc->z << 1; + val |= spc->c; + return val; +} + +static void spc_setFlags(Spc* spc, uint8_t val) { + spc->n = val & 0x80; + spc->v = val & 0x40; + spc->p = val & 0x20; + spc->b = val & 0x10; + spc->h = val & 8; + spc->i = val & 4; + spc->z = val & 2; + spc->c = val & 1; +} + +static void spc_setZN(Spc* spc, uint8_t value) { + spc->z = value == 0; + spc->n = value & 0x80; +} + +static void spc_doBranch(Spc* spc, uint8_t value, bool check) { + if(check) { + // taken branch: 2 extra cycles + spc_idle(spc); + spc_idle(spc); + spc->pc += (int8_t) value; + } +} + +static uint8_t spc_pullByte(Spc* spc) { + spc->sp++; + return spc_read(spc, 0x100 | spc->sp); +} + +static void spc_pushByte(Spc* spc, uint8_t value) { + spc_write(spc, 0x100 | spc->sp, value); + spc->sp--; +} + +static uint16_t spc_pullWord(Spc* spc) { + uint8_t value = spc_pullByte(spc); + return value | (spc_pullByte(spc) << 8); +} + +static void spc_pushWord(Spc* spc, uint16_t value) { + spc_pushByte(spc, value >> 8); + spc_pushByte(spc, value & 0xff); +} + +static uint16_t spc_readWord(Spc* spc, uint16_t adrl, uint16_t adrh) { + uint8_t value = spc_read(spc, adrl); + return value | (spc_read(spc, adrh) << 8); +} + +#if 0 +// NOT USED +static void spc_writeWord(Spc* spc, uint16_t adrl, uint16_t adrh, uint16_t value) { + spc_write(spc, adrl, value & 0xff); + spc_write(spc, adrh, value >> 8); +} +#endif + +// adressing modes + +static uint16_t spc_adrDp(Spc* spc) { + return spc_readOpcode(spc) | (spc->p << 8); +} + +static uint16_t spc_adrAbs(Spc* spc) { + return spc_readOpcodeWord(spc); +} + +static void spc_adrAbs_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc->adr |= (spc_readOpcode(spc) << 8); spc->bstep = 0; break; + } +} + +static uint16_t spc_adrInd(Spc* spc) { + spc_read(spc, spc->pc); + return spc->x | (spc->p << 8); +} + +static uint16_t spc_adrIdx(Spc* spc) { + uint8_t pointer = spc_readOpcode(spc); + spc_idle(spc); + return spc_readWord(spc, ((pointer + spc->x) & 0xff) | (spc->p << 8), ((pointer + spc->x + 1) & 0xff) | (spc->p << 8)); +} + +static void spc_adrIdx_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->param = spc_readOpcode(spc); break; + case 1: spc_idle(spc); break; + case 2: break; + case 3: spc->adr = spc_readWord(spc, ((spc->param + spc->x) & 0xff) | (spc->p << 8), ((spc->param + spc->x + 1) & 0xff) | (spc->p << 8)); spc->bstep = 0; break; + } +} + +static uint16_t spc_adrImm(Spc* spc) { + return spc->pc++; +} + +static uint16_t spc_adrDpx(Spc* spc) { + uint16_t res = ((spc_readOpcode(spc) + spc->x) & 0xff) | (spc->p << 8); + spc_idle(spc); + return res; +} + +static void spc_adrDpx_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc_idle(spc); spc->adr = ((spc->adr + spc->x) & 0xff) | (spc->p << 8); spc->bstep = 0; break; + } +} + +#if 0 +// deprecated/unused! +static uint16_t spc_adrDpy(Spc* spc) { + uint16_t res = ((spc_readOpcode(spc) + spc->y) & 0xff) | (spc->p << 8); + spc_idle(spc); + return res; +} +#endif + +static void spc_adrDpy_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc_idle(spc); spc->adr = ((spc->adr + spc->y) & 0xff) | (spc->p << 8); spc->bstep = 0; break; + } +} + +static uint16_t spc_adrAbx(Spc* spc) { + uint16_t res = (spc_readOpcodeWord(spc) + spc->x) & 0xffff; + spc_idle(spc); + return res; +} + +static void spc_adrAbx_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc->adr |= (spc_readOpcode(spc) << 8); break; + case 2: spc_idle(spc); spc->adr = (spc->adr + spc->x) & 0xffff; spc->bstep = 0; break; + } +} + +static uint16_t spc_adrAby(Spc* spc) { + uint16_t res = (spc_readOpcodeWord(spc) + spc->y) & 0xffff; + spc_idle(spc); + return res; +} + +static void spc_adrAby_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc->adr |= (spc_readOpcode(spc) << 8); break; + case 2: spc_idle(spc); spc->adr = (spc->adr + spc->y) & 0xffff; spc->bstep = 0; break; + } +} + +static uint16_t spc_adrIdy(Spc* spc) { + uint8_t pointer = spc_readOpcode(spc); + uint16_t adr = spc_readWord(spc, pointer | (spc->p << 8), ((pointer + 1) & 0xff) | (spc->p << 8)); + spc_idle(spc); + return (adr + spc->y) & 0xffff; +} + +static void spc_adrIdy_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->dat = spc_readOpcode(spc); break; + case 1: spc->adr = spc_read(spc, spc->dat | (spc->p << 8)); break; + case 2: spc->adr |= (spc_read(spc, ((spc->dat + 1) & 0xff) | (spc->p << 8)) << 8); break; + case 3: spc_idle(spc); spc->adr = (spc->adr + spc->y) & 0xffff; spc->bstep = 0; break; + } +} + +static uint16_t spc_adrDpDp(Spc* spc, uint8_t* srcVal) { + *srcVal = spc_read(spc, spc_readOpcode(spc) | (spc->p << 8)); + return spc_readOpcode(spc) | (spc->p << 8); +} + +static void spc_adrDpDp_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->dat = spc_readOpcode(spc); break; + case 1: spc->dat = spc_read(spc, spc->dat | (spc->p << 8)); break; + case 2: spc->adr = spc_readOpcode(spc) | (spc->p << 8); spc->bstep = 0; break; + } +} + +static uint16_t spc_adrDpImm(Spc* spc, uint8_t* srcVal) { + *srcVal = spc_readOpcode(spc); + return spc_readOpcode(spc) | (spc->p << 8); +} + +static uint16_t spc_adrIndInd(Spc* spc, uint8_t* srcVal) { + spc_read(spc, spc->pc); + *srcVal = spc_read(spc, spc->y | (spc->p << 8)); + return spc->x | (spc->p << 8); +} + +static uint8_t spc_adrAbsBit(Spc* spc, uint16_t* adr) { + uint16_t adrBit = spc_readOpcodeWord(spc); + *adr = adrBit & 0x1fff; + return adrBit >> 13; +} + +static void spc_adrAbsBit_stepped(Spc* spc) { + switch (spc->bstep++) { + case 0: spc->adr = spc_readOpcode(spc); break; + case 1: spc->adr |= (spc_readOpcode(spc) << 8); spc->dat = spc->adr >> 13; spc->adr &= 0x1fff; spc->bstep = 0; break; + } +} + +static uint16_t spc_adrDpWord(Spc* spc, uint16_t* low) { + uint8_t adr = spc_readOpcode(spc); + *low = adr | (spc->p << 8); + return ((adr + 1) & 0xff) | (spc->p << 8); +} + +static uint16_t spc_adrIndP(Spc* spc) { + spc_read(spc, spc->pc); + return spc->x++ | (spc->p << 8); +} + +// opcode functions + +static void spc_and(Spc* spc, uint16_t adr) { + spc->a &= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_andm(Spc* spc, uint16_t dst, uint8_t value) { + uint8_t result = spc_read(spc, dst) & value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_or(Spc* spc, uint16_t adr) { + spc->a |= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_orm(Spc* spc, uint16_t dst, uint8_t value) { + uint8_t result = spc_read(spc, dst) | value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_eor(Spc* spc, uint16_t adr) { + spc->a ^= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_eorm(Spc* spc, uint16_t dst, uint8_t value) { + uint8_t result = spc_read(spc, dst) ^ value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_adc(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr); + int result = spc->a + value + spc->c; + spc->v = (spc->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((spc->a & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc->a = result; + spc_setZN(spc, spc->a); +} + +static void spc_adcm(Spc* spc, uint16_t dst, uint8_t value) { + uint8_t applyOn = spc_read(spc, dst); + int result = applyOn + value + spc->c; + spc->v = (applyOn & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((applyOn & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_sbc(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->a + value + spc->c; + spc->v = (spc->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((spc->a & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc->a = result; + spc_setZN(spc, spc->a); +} + +static void spc_sbcm(Spc* spc, uint16_t dst, uint8_t value) { + value ^= 0xff; + uint8_t applyOn = spc_read(spc, dst); + int result = applyOn + value + spc->c; + spc->v = (applyOn & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((applyOn & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_cmp(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->a + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpx(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->x + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpy(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->y + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpm(Spc* spc, uint16_t dst, uint8_t value) { + value ^= 0xff; + int result = spc_read(spc, dst) + value + 1; + spc->c = result > 0xff; + spc_idle(spc); + spc_setZN(spc, result); +} + +static void spc_mov(Spc* spc, uint16_t adr) { + spc->a = spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_movx(Spc* spc, uint16_t adr) { + spc->x = spc_read(spc, adr); + spc_setZN(spc, spc->x); +} + +static void spc_movy(Spc* spc, uint16_t adr) { + spc->y = spc_read(spc, adr); + spc_setZN(spc, spc->y); +} + +static void spc_movs(Spc* spc, uint16_t adr) { + switch (spc->bstep++) { + case 0: spc_read(spc, adr); break; + case 1: spc_write(spc, adr, spc->a); spc->bstep = 0; break; + } +} + +static void spc_movsx(Spc* spc, uint16_t adr) { + switch (spc->bstep++) { + case 0: spc_read(spc, adr); break; + case 1: spc_write(spc, adr, spc->x); spc->bstep = 0; break; + } +} + +static void spc_movsy(Spc* spc, uint16_t adr) { + switch (spc->bstep++) { + case 0: spc_read(spc, adr); break; + case 1: spc_write(spc, adr, spc->y); spc->bstep = 0; break; + } +} + +static void spc_asl(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + spc->c = val & 0x80; + val <<= 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_lsr(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + spc->c = val & 1; + val >>= 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_rol(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + bool newC = val & 0x80; + val = (val << 1) | spc->c; + spc->c = newC; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_ror(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + bool newC = val & 1; + val = (val >> 1) | (spc->c << 7); + spc->c = newC; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_inc(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr) + 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_dec(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr) - 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_doOpcode(Spc* spc, uint8_t opcode) { + switch(opcode) { + case 0x00: { // nop imp + spc_read(spc, spc->pc); + // no operation + break; + } + case 0x01: + case 0x11: + case 0x21: + case 0x31: + case 0x41: + case 0x51: + case 0x61: + case 0x71: + case 0x81: + case 0x91: + case 0xa1: + case 0xb1: + case 0xc1: + case 0xd1: + case 0xe1: + case 0xf1: { // tcall imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc_pushWord(spc, spc->pc); + spc_idle(spc); + uint16_t adr = 0xffde - (2 * (opcode >> 4)); + spc->pc = spc_readWord(spc, adr, adr + 1); + break; + } + case 0x02: + case 0x22: + case 0x42: + case 0x62: + case 0x82: + case 0xa2: + case 0xc2: + case 0xe2: { // set1 dp + uint16_t adr = spc_adrDp(spc); + spc_write(spc, adr, spc_read(spc, adr) | (1 << (opcode >> 5))); + break; + } + case 0x12: + case 0x32: + case 0x52: + case 0x72: + case 0x92: + case 0xb2: + case 0xd2: + case 0xf2: { // clr1 dp + uint16_t adr = spc_adrDp(spc); + spc_write(spc, adr, spc_read(spc, adr) & ~(1 << (opcode >> 5))); + break; + } + case 0x03: + case 0x23: + case 0x43: + case 0x63: + case 0x83: + case 0xa3: + case 0xc3: + case 0xe3: { // bbs dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)); + spc_idle(spc); + spc_doBranch(spc, spc_readOpcode(spc), val & (1 << (opcode >> 5))); + break; + } + case 0x13: + case 0x33: + case 0x53: + case 0x73: + case 0x93: + case 0xb3: + case 0xd3: + case 0xf3: { // bbc dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)); + spc_idle(spc); + spc_doBranch(spc, spc_readOpcode(spc), (val & (1 << (opcode >> 5))) == 0); + break; + } + case 0x04: { // or dp + spc_or(spc, spc_adrDp(spc)); + break; + } + case 0x05: { // or abs + spc_or(spc, spc_adrAbs(spc)); + break; + } + case 0x06: { // or ind + spc_or(spc, spc_adrInd(spc)); + break; + } + case 0x07: { // or idx + spc_or(spc, spc_adrIdx(spc)); + break; + } + case 0x08: { // or imm + spc_or(spc, spc_adrImm(spc)); + break; + } + case 0x09: { // orm dp, dp + uint8_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x0a: { // or1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c | ((spc_read(spc, adr) >> bit) & 1); + spc_idle(spc); + break; + } + case 0x0b: { // asl dp + spc_asl(spc, spc_adrDp(spc)); + break; + } + case 0x0c: { // asl abs + spc_asl(spc, spc_adrAbs(spc)); + break; + } + case 0x0d: { // pushp imp + spc_read(spc, spc->pc); + spc_pushByte(spc, spc_getFlags(spc)); + spc_idle(spc); + break; + } + case 0x0e: { // tset1 abs + uint16_t adr = spc_adrAbs(spc); + uint8_t val = spc_read(spc, adr); + spc_read(spc, adr); + uint8_t result = spc->a + (val ^ 0xff) + 1; + spc_setZN(spc, result); + spc_write(spc, adr, val | spc->a); + break; + } + case 0x0f: { // brk imp + spc_read(spc, spc->pc); + spc_pushWord(spc, spc->pc); + spc_pushByte(spc, spc_getFlags(spc)); + spc_idle(spc); + spc->i = false; + spc->b = true; + spc->pc = spc_readWord(spc, 0xffde, 0xffdf); + break; + } + case 0x10: { // bpl rel (!spc->n) + switch (spc->step++) { + case 1: spc->dat = spc_readOpcode(spc); if (spc->n) spc->step = 0; break; + case 2: spc_idle(spc); break; + case 3: spc_idle(spc); spc->pc += (int8_t) spc->dat; spc->step = 0; break; + } + break; + } + case 0x14: { // or dpx + spc_or(spc, spc_adrDpx(spc)); + break; + } + case 0x15: { // or abx + spc_or(spc, spc_adrAbx(spc)); + break; + } + case 0x16: { // or aby + spc_or(spc, spc_adrAby(spc)); + break; + } + case 0x17: { // or idy + spc_or(spc, spc_adrIdy(spc)); + break; + } + case 0x18: { // orm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x19: { // orm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x1a: { // decw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_read(spc, low) - 1; + spc_write(spc, low, value & 0xff); + value += spc_read(spc, high) << 8; + spc_write(spc, high, value >> 8); + spc->z = value == 0; + spc->n = value & 0x8000; + break; + } + case 0x1b: { // asl dpx + spc_asl(spc, spc_adrDpx(spc)); + break; + } + case 0x1c: { // asla imp + spc_read(spc, spc->pc); + spc->c = spc->a & 0x80; + spc->a <<= 1; + spc_setZN(spc, spc->a); + break; + } + case 0x1d: { // decx imp + spc_read(spc, spc->pc); + spc->x--; + spc_setZN(spc, spc->x); + break; + } + case 0x1e: { // cmpx abs + spc_cmpx(spc, spc_adrAbs(spc)); + break; + } + case 0x1f: { // jmp iax + uint16_t pointer = spc_readOpcodeWord(spc); + spc_idle(spc); + spc->pc = spc_readWord(spc, (pointer + spc->x) & 0xffff, (pointer + spc->x + 1) & 0xffff); + break; + } + case 0x20: { // clrp imp + spc_read(spc, spc->pc); + spc->p = false; + break; + } + case 0x24: { // and dp + spc_and(spc, spc_adrDp(spc)); + break; + } + case 0x25: { // and abs + spc_and(spc, spc_adrAbs(spc)); + break; + } + case 0x26: { // and ind + spc_and(spc, spc_adrInd(spc)); + break; + } + case 0x27: { // and idx + spc_and(spc, spc_adrIdx(spc)); + break; + } + case 0x28: { // and imm + spc_and(spc, spc_adrImm(spc)); + break; + } + case 0x29: { // andm dp, dp + uint8_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x2a: { // or1n abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c | (~(spc_read(spc, adr) >> bit) & 1); + spc_idle(spc); + break; + } + case 0x2b: { // rol dp + spc_rol(spc, spc_adrDp(spc)); + break; + } + case 0x2c: { // rol abs + spc_rol(spc, spc_adrAbs(spc)); + break; + } + case 0x2d: { // pusha imp + spc_read(spc, spc->pc); + spc_pushByte(spc, spc->a); + spc_idle(spc); + break; + } + case 0x2e: { // cbne dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)) ^ 0xff; + spc_idle(spc); + uint8_t result = spc->a + val + 1; + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0x2f: { // bra rel + spc_doBranch(spc, spc_readOpcode(spc), true); + break; + } + case 0x30: { // bmi rel + spc_doBranch(spc, spc_readOpcode(spc), spc->n); + break; + } + case 0x34: { // and dpx + spc_and(spc, spc_adrDpx(spc)); + break; + } + case 0x35: { // and abx + spc_and(spc, spc_adrAbx(spc)); + break; + } + case 0x36: { // and aby + spc_and(spc, spc_adrAby(spc)); + break; + } + case 0x37: { // and idy + spc_and(spc, spc_adrIdy(spc)); + break; + } + case 0x38: { // andm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x39: { // andm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x3a: { // incw dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDpWord(spc, &spc->adr1); break; + case 2: spc->dat16 = spc_read(spc, spc->adr1) + 1; break; + case 3: spc_write(spc, spc->adr1, spc->dat16 & 0xff); break; + case 4: spc->dat16 += spc_read(spc, spc->adr) << 8; break; + case 5: + spc_write(spc, spc->adr, spc->dat16 >> 8); + spc->z = spc->dat16 == 0; + spc->n = spc->dat16 & 0x8000; + spc->step = 0; + break; + } + break; + } + case 0x3b: { // rol dpx + spc_rol(spc, spc_adrDpx(spc)); + break; + } + case 0x3c: { // rola imp + spc_read(spc, spc->pc); + bool newC = spc->a & 0x80; + spc->a = (spc->a << 1) | spc->c; + spc->c = newC; + spc_setZN(spc, spc->a); + break; + } + case 0x3d: { // incx imp + spc_read(spc, spc->pc); + spc->x++; + spc_setZN(spc, spc->x); + break; + } + case 0x3e: { // cmpx dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_cmpx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0x3f: { // call abs + uint16_t dst = spc_readOpcodeWord(spc); + spc_idle(spc); + spc_pushWord(spc, spc->pc); + spc_idle(spc); + spc_idle(spc); + spc->pc = dst; + break; + } + case 0x40: { // setp imp + spc_read(spc, spc->pc); + spc->p = true; + break; + } + case 0x44: { // eor dp + spc_eor(spc, spc_adrDp(spc)); + break; + } + case 0x45: { // eor abs + spc_eor(spc, spc_adrAbs(spc)); + break; + } + case 0x46: { // eor ind + spc_eor(spc, spc_adrInd(spc)); + break; + } + case 0x47: { // eor idx + spc_eor(spc, spc_adrIdx(spc)); + break; + } + case 0x48: { // eor imm + spc_eor(spc, spc_adrImm(spc)); + break; + } + case 0x49: { // eorm dp, dp + uint8_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x4a: { // and1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c & ((spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x4b: { // lsr dp + spc_lsr(spc, spc_adrDp(spc)); + break; + } + case 0x4c: { // lsr abs + spc_lsr(spc, spc_adrAbs(spc)); + break; + } + case 0x4d: { // pushx imp + spc_read(spc, spc->pc); + spc_pushByte(spc, spc->x); + spc_idle(spc); + break; + } + case 0x4e: { // tclr1 abs + uint16_t adr = spc_adrAbs(spc); + uint8_t val = spc_read(spc, adr); + spc_read(spc, adr); + uint8_t result = spc->a + (val ^ 0xff) + 1; + spc_setZN(spc, result); + spc_write(spc, adr, val & ~spc->a); + break; + } + case 0x4f: { // pcall dp + uint8_t dst = spc_readOpcode(spc); + spc_idle(spc); + spc_pushWord(spc, spc->pc); + spc_idle(spc); + spc->pc = 0xff00 | dst; + break; + } + case 0x50: { // bvc rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->v); + break; + } + case 0x54: { // eor dpx + spc_eor(spc, spc_adrDpx(spc)); + break; + } + case 0x55: { // eor abx + spc_eor(spc, spc_adrAbx(spc)); + break; + } + case 0x56: { // eor aby + spc_eor(spc, spc_adrAby(spc)); + break; + } + case 0x57: { // eor idy + spc_eor(spc, spc_adrIdy(spc)); + break; + } + case 0x58: { // eorm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x59: { // eorm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x5a: { // cmpw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high) ^ 0xffff; + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value + 1; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + break; + } + case 0x5b: { // lsr dpx + spc_lsr(spc, spc_adrDpx(spc)); + break; + } + case 0x5c: { // lsra imp + spc_read(spc, spc->pc); + spc->c = spc->a & 1; + spc->a >>= 1; + spc_setZN(spc, spc->a); + break; + } + case 0x5d: { // movxa imp + spc_read(spc, spc->pc); + spc->x = spc->a; + spc_setZN(spc, spc->x); + break; + } + case 0x5e: { // cmpy abs + spc_cmpy(spc, spc_adrAbs(spc)); + break; + } + case 0x5f: { // jmp abs + spc->pc = spc_readOpcodeWord(spc); + break; + } + case 0x60: { // clrc imp + spc_read(spc, spc->pc); + spc->c = false; + break; + } + case 0x64: { // cmp dp + spc_cmp(spc, spc_adrDp(spc)); + break; + } + case 0x65: { // cmp abs + spc_cmp(spc, spc_adrAbs(spc)); + break; + } + case 0x66: { // cmp ind + spc_cmp(spc, spc_adrInd(spc)); + break; + } + case 0x67: { // cmp idx + spc_cmp(spc, spc_adrIdx(spc)); + break; + } + case 0x68: { // cmp imm + spc_cmp(spc, spc_adrImm(spc)); + break; + } + case 0x69: { // cmpm dp, dp + switch (spc->step++) { + case 1: spc_adrDpDp_stepped(spc); break; + case 2: spc_adrDpDp_stepped(spc); break; + case 3: spc_adrDpDp_stepped(spc); break; + case 4: spc->dat ^= 0xff; spc->dat16 = spc_read(spc, spc->adr) + spc->dat + 1; break; + case 5: spc->c = spc->dat16 > 0xff; spc_idle(spc); spc_setZN(spc, spc->dat16); spc->step = 0; break; + } + break; + } + case 0x6a: { // and1n abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c & (~(spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x6b: { // ror dp + spc_ror(spc, spc_adrDp(spc)); + break; + } + case 0x6c: { // ror abs + spc_ror(spc, spc_adrAbs(spc)); + break; + } + case 0x6d: { // pushy imp + spc_read(spc, spc->pc); + spc_pushByte(spc, spc->y); + spc_idle(spc); + break; + } + case 0x6e: { // dbnz dp, rel + uint16_t adr = spc_adrDp(spc); + uint8_t result = spc_read(spc, adr) - 1; + spc_write(spc, adr, result); + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0x6f: { // ret imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->pc = spc_pullWord(spc); + break; + } + case 0x70: { // bvs rel + spc_doBranch(spc, spc_readOpcode(spc), spc->v); + break; + } + case 0x74: { // cmp dpx + spc_cmp(spc, spc_adrDpx(spc)); + break; + } + case 0x75: { // cmp abx + spc_cmp(spc, spc_adrAbx(spc)); + break; + } + case 0x76: { // cmp aby + spc_cmp(spc, spc_adrAby(spc)); + break; + } + case 0x77: { // cmp idy + spc_cmp(spc, spc_adrIdy(spc)); + break; + } + case 0x78: { // cmpm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_cmpm(spc, dst, src); + break; + } + case 0x79: { // cmpm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_cmpm(spc, dst, src); + break; + } + case 0x7a: { // addw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint8_t vall = spc_read(spc, low); + spc_idle(spc); + uint16_t value = vall | (spc_read(spc, high) << 8); + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value; + spc->v = (ya & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + spc->h = ((ya & 0xfff) + (value & 0xfff)) > 0xfff; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + spc->a = result & 0xff; + spc->y = result >> 8; + break; + } + case 0x7b: { // ror dpx + spc_ror(spc, spc_adrDpx(spc)); + break; + } + case 0x7c: { // rora imp + spc_read(spc, spc->pc); + bool newC = spc->a & 1; + spc->a = (spc->a >> 1) | (spc->c << 7); + spc->c = newC; + spc_setZN(spc, spc->a); + break; + } + case 0x7d: { // movax imp + spc_read(spc, spc->pc); + spc->a = spc->x; + spc_setZN(spc, spc->a); + break; + } + case 0x7e: { // cmpy dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_cmpy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0x7f: { // reti imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc_setFlags(spc, spc_pullByte(spc)); + spc->pc = spc_pullWord(spc); + break; + } + case 0x80: { // setc imp + spc_read(spc, spc->pc); + spc->c = true; + break; + } + case 0x84: { // adc dp + spc_adc(spc, spc_adrDp(spc)); + break; + } + case 0x85: { // adc abs + spc_adc(spc, spc_adrAbs(spc)); + break; + } + case 0x86: { // adc ind + spc_adc(spc, spc_adrInd(spc)); + break; + } + case 0x87: { // adc idx + spc_adc(spc, spc_adrIdx(spc)); + break; + } + case 0x88: { // adc imm + spc_adc(spc, spc_adrImm(spc)); + break; + } + case 0x89: { // adcm dp, dp + uint8_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x8a: { // eor1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c ^ ((spc_read(spc, adr) >> bit) & 1); + spc_idle(spc); + break; + } + case 0x8b: { // dec dp + spc_dec(spc, spc_adrDp(spc)); + break; + } + case 0x8c: { // dec abs + spc_dec(spc, spc_adrAbs(spc)); + break; + } + case 0x8d: { // movy imm + switch (spc->step++) { + case 1: spc->adr = spc_adrImm(spc); break; + case 2: spc_movy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0x8e: { // popp imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc_setFlags(spc, spc_pullByte(spc)); + break; + } + case 0x8f: { // movm dp, imm + switch (spc->step++) { + case 1: spc->dat = spc_readOpcode(spc); break; + case 2: spc->adr = spc_readOpcode(spc) | (spc->p << 8); break; + case 3: spc_read(spc, spc->adr); break; + case 4: spc_write(spc, spc->adr, spc->dat); spc->step = 0; break; + } + break; + } + case 0x90: { // bcc rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->c); + break; + } + case 0x94: { // adc dpx + spc_adc(spc, spc_adrDpx(spc)); + break; + } + case 0x95: { // adc abx + spc_adc(spc, spc_adrAbx(spc)); + break; + } + case 0x96: { // adc aby + spc_adc(spc, spc_adrAby(spc)); + break; + } + case 0x97: { // adc idy + spc_adc(spc, spc_adrIdy(spc)); + break; + } + case 0x98: { // adcm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x99: { // adcm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x9a: { // subw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint8_t vall = spc_read(spc, low); + spc_idle(spc); + uint16_t value = (vall | (spc_read(spc, high) << 8)) ^ 0xffff; + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value + 1; + spc->v = (ya & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + spc->h = ((ya & 0xfff) + (value & 0xfff) + 1) > 0xfff; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + spc->a = result & 0xff; + spc->y = result >> 8; + break; + } + case 0x9b: { // dec dpx + spc_dec(spc, spc_adrDpx(spc)); + break; + } + case 0x9c: { // deca imp + spc_read(spc, spc->pc); + spc->a--; + spc_setZN(spc, spc->a); + break; + } + case 0x9d: { // movxp imp + spc_read(spc, spc->pc); + spc->x = spc->sp; + spc_setZN(spc, spc->x); + break; + } + case 0x9e: { // div imp + spc_read(spc, spc->pc); + for(int i = 0; i < 10; i++) spc_idle(spc); + spc->h = (spc->x & 0xf) <= (spc->y & 0xf); + int yva = (spc->y << 8) | spc->a; + int x = spc->x << 9; + for(int i = 0; i < 9; i++) { + yva <<= 1; + yva |= (yva & 0x20000) ? 1 : 0; + yva &= 0x1ffff; + if(yva >= x) yva ^= 1; + if(yva & 1) yva -= x; + yva &= 0x1ffff; + } + spc->y = yva >> 9; + spc->v = yva & 0x100; + spc->a = yva & 0xff; + spc_setZN(spc, spc->a); + break; + } + case 0x9f: { // xcn imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc_idle(spc); + spc_idle(spc); + spc->a = (spc->a >> 4) | (spc->a << 4); + spc_setZN(spc, spc->a); + break; + } + case 0xa0: { // ei imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->i = true; + break; + } + case 0xa4: { // sbc dp + spc_sbc(spc, spc_adrDp(spc)); + break; + } + case 0xa5: { // sbc abs + spc_sbc(spc, spc_adrAbs(spc)); + break; + } + case 0xa6: { // sbc ind + spc_sbc(spc, spc_adrInd(spc)); + break; + } + case 0xa7: { // sbc idx + spc_sbc(spc, spc_adrIdx(spc)); + break; + } + case 0xa8: { // sbc imm + spc_sbc(spc, spc_adrImm(spc)); + break; + } + case 0xa9: { // sbcm dp, dp + uint8_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xaa: { // mov1 abs.bit + switch (spc->step++) { + case 1: spc_adrAbsBit_stepped(spc); break; + case 2: spc_adrAbsBit_stepped(spc); break; + case 3: spc->c = (spc_read(spc, spc->adr) >> spc->dat) & 1; spc->step = 0; break; + } + break; + } + case 0xab: { // inc dp + spc_inc(spc, spc_adrDp(spc)); + break; + } + case 0xac: { // inc abs + spc_inc(spc, spc_adrAbs(spc)); + break; + } + case 0xad: { // cmpy imm + spc_cmpy(spc, spc_adrImm(spc)); + break; + } + case 0xae: { // popa imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->a = spc_pullByte(spc); + break; + } + case 0xaf: { // movs ind+ + switch (spc->step++) { + case 1: spc->adr = spc_adrIndP(spc); break; + case 2: spc_idle(spc); break; + case 3: spc_write(spc, spc->adr, spc->a); spc->step = 0; break; + } + break; + } + case 0xb0: { // bcs rel (spc->c) + switch (spc->step++) { + case 1: spc->dat = spc_readOpcode(spc); if (!spc->c) spc->step = 0; break; + case 2: spc_idle(spc); break; + case 3: spc_idle(spc); spc->pc += (int8_t) spc->dat; spc->step = 0; break; + } + break; + } + case 0xb4: { // sbc dpx + spc_sbc(spc, spc_adrDpx(spc)); + break; + } + case 0xb5: { // sbc abx + spc_sbc(spc, spc_adrAbx(spc)); + break; + } + case 0xb6: { // sbc aby + spc_sbc(spc, spc_adrAby(spc)); + break; + } + case 0xb7: { // sbc idy + spc_sbc(spc, spc_adrIdy(spc)); + break; + } + case 0xb8: { // sbcm dp, imm + uint8_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xb9: { // sbcm ind, ind + uint8_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xba: { // movw dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDpWord(spc, &spc->adr1); break; + case 2: spc->dat = spc_read(spc, spc->adr1); break; + case 3: spc_idle(spc); break; + case 4: + spc->dat16 = spc->dat | (spc_read(spc, spc->adr) << 8); + spc->a = spc->dat16 & 0xff; + spc->y = spc->dat16 >> 8; + spc->z = spc->dat16 == 0; + spc->n = spc->dat16 & 0x8000; + spc->step = 0; + break; + } + break; + } + case 0xbb: { // inc dpx + spc_inc(spc, spc_adrDpx(spc)); + break; + } + case 0xbc: { // inca imp + spc_read(spc, spc->pc); + spc->a++; + spc_setZN(spc, spc->a); + break; + } + case 0xbd: { // movpx imp + spc_read(spc, spc->pc); + spc->sp = spc->x; + break; + } + case 0xbe: { // das imp + spc_read(spc, spc->pc); + spc_idle(spc); + if(spc->a > 0x99 || !spc->c) { + spc->a -= 0x60; + spc->c = false; + } + if((spc->a & 0xf) > 9 || !spc->h) { + spc->a -= 6; + } + spc_setZN(spc, spc->a); + break; + } + case 0xbf: { // mov ind+ + switch (spc->step++) { + case 1: spc->adr = spc_adrIndP(spc); break; + case 2: spc->a = spc_read(spc, spc->adr); break; + case 3: spc_idle(spc); spc_setZN(spc, spc->a); spc->step = 0; break; + } + break; + } + case 0xc0: { // di imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->i = false; + break; + } + case 0xc4: { // movs dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_movs(spc, spc->adr); break; + case 3: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xc5: { // movs abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_movs(spc, spc->adr); break; + case 4: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xc6: { // movs ind + switch (spc->step++) { + case 1: spc->adr = spc_adrInd(spc); break; + case 2: spc_movs(spc, spc->adr); break; + case 3: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xc7: { // movs idx + switch (spc->step++) { + case 1: spc_adrIdx_stepped(spc); break; + case 2: spc_adrIdx_stepped(spc); break; + case 3: spc_adrIdx_stepped(spc); break; + case 4: spc_adrIdx_stepped(spc); break; + case 5: spc_movs(spc, spc->adr); break; + case 6: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xc8: { // cmpx imm + spc_cmpx(spc, spc_adrImm(spc)); + break; + } + case 0xc9: { // movsx abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_movsx(spc, spc->adr); break; + case 4: spc_movsx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xca: { // mov1s abs.bit + switch (spc->step++) { + case 1: spc_adrAbsBit_stepped(spc); break; + case 2: spc_adrAbsBit_stepped(spc); break; + case 3: spc->dat = (spc_read(spc, spc->adr) & (~(1 << spc->dat))) | (spc->c << spc->dat); break; + case 4: spc_idle(spc); break; + case 5: spc_write(spc, spc->adr, spc->dat); spc->step = 0; break; + } + break; + } + case 0xcb: { // movsy dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_movsy(spc, spc->adr); break; + case 3: spc_movsy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xcc: { // movsy abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_movsy(spc, spc->adr); break; + case 4: spc_movsy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xcd: { // movx imm + switch (spc->step++) { + case 1: spc->adr = spc_adrImm(spc); break; + case 2: spc_movx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xce: { // popx imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->x = spc_pullByte(spc); + break; + } + case 0xcf: { // mul imp + spc_read(spc, spc->pc); + for(int i = 0; i < 7; i++) spc_idle(spc); + uint16_t result = spc->a * spc->y; + spc->a = result & 0xff; + spc->y = result >> 8; + spc_setZN(spc, spc->y); + break; + } + case 0xd0: { // bne rel (!spc->z) + switch (spc->step++) { + case 1: spc->dat = spc_readOpcode(spc); if (spc->z) spc->step = 0; break; + case 2: spc_idle(spc); break; + case 3: spc_idle(spc); spc->pc += (int8_t) spc->dat; spc->step = 0; break; + } + break; + } + case 0xd4: { // movs dpx + switch (spc->step++) { + case 1: spc_adrDpx_stepped(spc); break; + case 2: spc_adrDpx_stepped(spc); break; + case 3: spc_movs(spc, spc->adr); break; + case 4: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xd5: { // movs abx + switch (spc->step++) { + case 1: spc_adrAbx_stepped(spc); break; + case 2: spc_adrAbx_stepped(spc); break; + case 3: spc_adrAbx_stepped(spc); break; + case 4: spc_movs(spc, spc->adr); break; + case 5: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xd6: { // movs aby + switch (spc->step++) { + case 1: spc_adrAby_stepped(spc); break; + case 2: spc_adrAby_stepped(spc); break; + case 3: spc_adrAby_stepped(spc); break; + case 4: spc_movs(spc, spc->adr); break; + case 5: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xd7: { // movs idy + switch (spc->step++) { + case 1: spc_adrIdy_stepped(spc); break; + case 2: spc_adrIdy_stepped(spc); break; + case 3: spc_adrIdy_stepped(spc); break; + case 4: spc_adrIdy_stepped(spc); break; + case 5: spc_movs(spc, spc->adr); break; + case 6: spc_movs(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xd8: { // movsx dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_movsx(spc, spc->adr); break; + case 3: spc_movsx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xd9: { // movsx dpy + switch (spc->step++) { + case 1: spc_adrDpy_stepped(spc); break; + case 2: spc_adrDpy_stepped(spc); break; + case 3: spc_movsx(spc, spc->adr); break; + case 4: spc_movsx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xda: { // movws dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDpWord(spc, &spc->adr1); break; + case 2: spc_read(spc, spc->adr1); break; + case 3: spc_write(spc, spc->adr1, spc->a); break; + case 4: spc_write(spc, spc->adr, spc->y); spc->step = 0; break; + } + break; + } + case 0xdb: { // movsy dpx + switch (spc->step++) { + case 1: spc_adrDpx_stepped(spc); break; + case 2: spc_adrDpx_stepped(spc); break; + case 3: spc_movsy(spc, spc->adr); break; + case 4: spc_movsy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xdc: { // decy imp + spc_read(spc, spc->pc); + spc->y--; + spc_setZN(spc, spc->y); + break; + } + case 0xdd: { // movay imp + spc_read(spc, spc->pc); + spc->a = spc->y; + spc_setZN(spc, spc->a); + break; + } + case 0xde: { // cbne dpx, rel + uint8_t val = spc_read(spc, spc_adrDpx(spc)) ^ 0xff; + spc_idle(spc); + uint8_t result = spc->a + val + 1; + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0xdf: { // daa imp + spc_read(spc, spc->pc); + spc_idle(spc); + if(spc->a > 0x99 || spc->c) { + spc->a += 0x60; + spc->c = true; + } + if((spc->a & 0xf) > 9 || spc->h) { + spc->a += 6; + } + spc_setZN(spc, spc->a); + break; + } + case 0xe0: { // clrv imp + spc_read(spc, spc->pc); + spc->v = false; + spc->h = false; + break; + } + case 0xe4: { // mov dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xe5: { // mov abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xe6: { // mov ind + switch (spc->step++) { + case 1: spc->adr = spc_adrInd(spc); break; + case 2: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xe7: { // mov idx + switch (spc->step++) { + case 1: spc_adrIdx_stepped(spc); break; + case 2: spc_adrIdx_stepped(spc); break; + case 3: spc_adrIdx_stepped(spc); break; + case 4: spc_adrIdx_stepped(spc); break; + case 5: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xe8: { // mov imm + switch (spc->step++) { + case 1: spc->adr = spc_adrImm(spc); break; + case 2: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xe9: { // movx abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_movx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xea: { // not1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + uint8_t result = spc_read(spc, adr) ^ (1 << bit); + spc_write(spc, adr, result); + break; + } + case 0xeb: { // movy dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_movy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xec: { // movy abs + switch (spc->step++) { + case 1: spc_adrAbs_stepped(spc); break; + case 2: spc_adrAbs_stepped(spc); break; + case 3: spc_movy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xed: { // notc imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->c = !spc->c; + break; + } + case 0xee: { // popy imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->y = spc_pullByte(spc); + break; + } + case 0xef: { // sleep imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->stopped = true; // no interrupts, so sleeping stops as well + break; + } + case 0xf0: { // beq rel (spc->z) + switch (spc->step++) { + case 1: spc->dat = spc_readOpcode(spc); if (!spc->z) spc->step = 0; break; + case 2: spc_idle(spc); break; + case 3: spc_idle(spc); spc->pc += (int8_t) spc->dat; spc->step = 0; break; + } + break; + } + case 0xf4: { // mov dpx + switch (spc->step++) { + case 1: spc_adrDpx_stepped(spc); break; + case 2: spc_adrDpx_stepped(spc); break; + case 3: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xf5: { // mov abx + switch (spc->step++) { + case 1: spc_adrAbx_stepped(spc); break; + case 2: spc_adrAbx_stepped(spc); break; + case 3: spc_adrAbx_stepped(spc); break; + case 4: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xf6: { // mov aby + switch (spc->step++) { + case 1: spc_adrAby_stepped(spc); break; + case 2: spc_adrAby_stepped(spc); break; + case 3: spc_adrAby_stepped(spc); break; + case 4: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xf7: { // mov idy + switch (spc->step++) { + case 1: spc_adrIdy_stepped(spc); break; + case 2: spc_adrIdy_stepped(spc); break; + case 3: spc_adrIdy_stepped(spc); break; + case 4: spc_adrIdy_stepped(spc); break; + case 5: spc_mov(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xf8: { // movx dp + switch (spc->step++) { + case 1: spc->adr = spc_adrDp(spc); break; + case 2: spc_movx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xf9: { // movx dpy + switch (spc->step++) { + case 1: spc_adrDpy_stepped(spc); break; + case 2: spc_adrDpy_stepped(spc); break; + case 3: spc_movx(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xfa: { // movm dp, dp + switch (spc->step++) { + case 1: spc_adrDpDp_stepped(spc); break; + case 2: spc_adrDpDp_stepped(spc); break; + case 3: spc_adrDpDp_stepped(spc); break; + case 4: spc_write(spc, spc->adr, spc->dat); spc->step = 0; break; + } + break; + } + case 0xfb: { // movy dpx + switch (spc->step++) { + case 1: spc_adrDpx_stepped(spc); break; + case 2: spc_adrDpx_stepped(spc); break; + case 3: spc_movy(spc, spc->adr); spc->step = 0; break; + } + break; + } + case 0xfc: { // incy imp + spc_read(spc, spc->pc); + spc->y++; + spc_setZN(spc, spc->y); + break; + } + case 0xfd: { // movya imp + spc_read(spc, spc->pc); + spc->y = spc->a; + spc_setZN(spc, spc->y); + break; + } + case 0xfe: { // dbnzy rel + switch (spc->step++) { + case 1: spc_read(spc, spc->pc); break; + case 2: spc_idle(spc); spc->y--; break; + case 3: spc->dat = spc_readOpcode(spc); if (!(spc->y != 0)) spc->step = 0; break; + case 4: spc_idle(spc); break; + case 5: spc_idle(spc); spc->pc += (int8_t) spc->dat; spc->step = 0; break; + } + break; + } + case 0xff: { // stop imp + spc_read(spc, spc->pc); + spc_idle(spc); + spc->stopped = true; + break; + } + } +} diff --git a/src/burn/drv/snes/spc.h b/src/burn/drv/snes/spc.h new file mode 100644 index 000000000..919fb40f3 --- /dev/null +++ b/src/burn/drv/snes/spc.h @@ -0,0 +1,59 @@ + +#ifndef SPC_H +#define SPC_H + +#include +#include +#include "burnint.h" + +#include "statehandler.h" + +typedef uint8_t (*SpcReadHandler)(void* mem, uint16_t adr); +typedef void (*SpcWriteHandler)(void* mem, uint16_t adr, uint8_t val); +typedef void (*SpcIdleHandler)(void* mem, bool waiting); + +typedef struct Spc Spc; + +struct Spc { + // reference to memory handler, pointers to read/write/idle handlers + void* mem; + SpcReadHandler read; + SpcWriteHandler write; + SpcIdleHandler idle; + // registers + uint8_t a; + uint8_t x; + uint8_t y; + uint8_t sp; + uint16_t pc; + // flags + bool c; + bool z; + bool v; + bool n; + bool i; + bool h; + bool p; + bool b; + // stopping + bool stopped; + // reset + bool resetWanted; + // single-cycle + uint8_t opcode; + uint32_t step; + uint32_t bstep; + uint16_t adr; + uint16_t adr1; + uint8_t dat; + uint16_t dat16; + uint8_t param; +}; + +Spc* spc_init(void* mem, SpcReadHandler read, SpcWriteHandler write, SpcIdleHandler idle); +void spc_free(Spc* spc); +void spc_reset(Spc* spc, bool hard); +void spc_handleState(Spc* spc, StateHandler* sh); +void spc_runOpcode(Spc* spc); + +#endif diff --git a/src/burn/drv/snes/statehandler.cpp b/src/burn/drv/snes/statehandler.cpp new file mode 100644 index 000000000..2fe51a3b8 --- /dev/null +++ b/src/burn/drv/snes/statehandler.cpp @@ -0,0 +1,259 @@ + +#include +#include +#include +#include +#include +#include + +#include "statehandler.h" + +static void sh_writeByte(StateHandler* sh, uint8_t val); +static uint8_t sh_readByte(StateHandler* sh); + +StateHandler* sh_init(bool saving, const uint8_t* data, int size) { + StateHandler* sh = (StateHandler*)BurnMalloc(sizeof(StateHandler)); + sh->saving = saving; + sh->offset = 0; + if(!saving) { + sh->data = BurnMalloc(size); + memcpy(sh->data, data, size); + sh->allocSize = size; + } else { + sh->data = BurnMalloc(512 * 1024); + sh->allocSize = 512 * 1024; + } + return sh; +} + +void sh_free(StateHandler* sh) { + BurnFree(sh->data); + BurnFree(sh); +} + +static void sh_writeByte(StateHandler* sh, uint8_t val) { + if(sh->offset >= sh->allocSize) { + // realloc + sh->data = BurnRealloc(sh->data, sh->allocSize * 2); + sh->allocSize *= 2; + } + sh->data[sh->offset++] = val; +} + +static uint8_t sh_readByte(StateHandler* sh) { + if(sh->offset >= sh->allocSize) { + bprintf(0, _T("offset >= allocSize! %x %x\n"), sh->offset, sh->allocSize); + // reading above data (should never happen) + return 0; + } + return sh->data[sh->offset++]; +} + +void sh_handleBools(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + bool* v = va_arg(args, bool*); + if(v == NULL) break; + if(sh->saving) { + sh_writeByte(sh, *v ? 1 : 0); + } else { + *v = sh_readByte(sh) > 0 ? true : false; + } + } + va_end(args); +} + +void sh_handleBytes(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + uint8_t* v = va_arg(args, uint8_t*); + if(v == NULL) break; + if(sh->saving) { + sh_writeByte(sh, *v); + } else { + *v = sh_readByte(sh); + } + } + va_end(args); +} + +void sh_handleBytesS(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + int8_t* v = va_arg(args, int8_t*); + if(v == NULL) break; + if(sh->saving) { + sh_writeByte(sh, (uint8_t) *v); + } else { + *v = (int8_t) sh_readByte(sh); + } + } + va_end(args); +} + +void sh_handleWords(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + uint16_t* v = va_arg(args, uint16_t*); + if(v == NULL) break; + if(sh->saving) { + uint16_t val = *v; + for(int i = 0; i < 16; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint16_t val = 0; + for(int i = 0; i < 16; i += 8) val |= sh_readByte(sh) << i; + *v = val; + } + } + va_end(args); +} + +void sh_handleWordsS(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + int16_t* v = va_arg(args, int16_t*); + if(v == NULL) break; + if(sh->saving) { + uint16_t val = (uint16_t) *v; + for(int i = 0; i < 16; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint16_t val = 0; + for(int i = 0; i < 16; i += 8) val |= sh_readByte(sh) << i; + *v = (int16_t) val; + } + } + va_end(args); +} + +void sh_handleLongLongs(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + uint64_t* v = va_arg(args, uint64_t*); + if(v == NULL) break; + if(sh->saving) { + uint64_t val = *v; + for(int i = 0; i < 64; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint64_t val = 0; + for(int i = 0; i < 64; i += 8) val |= (uint64_t)sh_readByte(sh) << i; + *v = val; + } + } + va_end(args); +} + +void sh_handleInts(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + uint32_t* v = va_arg(args, uint32_t*); + if(v == NULL) break; + if(sh->saving) { + uint32_t val = *v; + for(int i = 0; i < 32; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint32_t val = 0; + for(int i = 0; i < 32; i += 8) val |= sh_readByte(sh) << i; + *v = val; + } + } + va_end(args); +} + +void sh_handleIntsS(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + int32_t* v = va_arg(args, int32_t*); + if(v == NULL) break; + if(sh->saving) { + uint32_t val = (uint32_t) *v; + for(int i = 0; i < 32; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint32_t val = 0; + for(int i = 0; i < 32; i += 8) val |= sh_readByte(sh) << i; + *v = (int32_t) val; + } + } + va_end(args); +} + +void sh_handleFloats(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + float* v = va_arg(args, float*); + if(v == NULL) break; + if(sh->saving) { + uint8_t valData[4] = {}; + *((float*) valData) = *v; + uint32_t val = *((uint32_t*) valData); + for(int i = 0; i < 32; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint32_t val = 0; + for(int i = 0; i < 32; i += 8) val |= sh_readByte(sh) << i; + uint8_t valData[4] = {}; + *((uint32_t*) valData) = val; + *v = *((float*) valData); + } + } + va_end(args); +} + +void sh_handleDoubles(StateHandler* sh, ...) { + va_list args; + va_start(args, sh); + while(true) { + double* v = va_arg(args, double*); + if(v == NULL) break; + if(sh->saving) { + uint8_t valData[8] = {}; + *((double*) valData) = *v; + uint64_t val = *((uint64_t*) valData); + for(int i = 0; i < 64; i += 8) sh_writeByte(sh, (val >> i) & 0xff); + } else { + uint64_t val = 0; + for(int i = 0; i < 64; i += 8) val |= (uint64_t)sh_readByte(sh) << i; + uint8_t valData[8] = {}; + *((uint64_t*) valData) = val; + *v = *((double*) valData); + } + } + va_end(args); +} + +void sh_handleByteArray(StateHandler* sh, uint8_t* data, int size) { + for(int i = 0; i < size; i++) { + if(sh->saving) { + sh_writeByte(sh, data[i]); + } else { + data[i] = sh_readByte(sh); + } + } +} + +void sh_handleWordArray(StateHandler* sh, uint16_t* data, int size) { + for(int i = 0; i < size; i++) { + if(sh->saving) { + sh_writeByte(sh, data[i] & 0xff); + sh_writeByte(sh, (data[i] >> 8) & 0xff); + } else { + data[i] = sh_readByte(sh); + data[i] |= sh_readByte(sh) << 8; + } + } +} + +void sh_placeInt(StateHandler* sh, int location, uint32_t value) { + while(sh->offset < location + 4) sh_writeByte(sh, 0); + sh->data[location] = value & 0xff; + sh->data[location + 1] = (value >> 8) & 0xff; + sh->data[location + 2] = (value >> 16) & 0xff; + sh->data[location + 3] = (value >> 24) & 0xff; +} diff --git a/src/burn/drv/snes/statehandler.h b/src/burn/drv/snes/statehandler.h new file mode 100644 index 000000000..602f37cb8 --- /dev/null +++ b/src/burn/drv/snes/statehandler.h @@ -0,0 +1,33 @@ + +#ifndef STATEHANDLER_H +#define STATEHANDLER_H + +#include +#include +#include "burnint.h" + +typedef struct StateHandler { + bool saving; + int offset; + uint8_t* data; + int allocSize; +} StateHandler; + +StateHandler* sh_init(bool saving, const uint8_t* data, int size); +void sh_free(StateHandler* sh); + +void sh_handleBools(StateHandler* sh, ...); +void sh_handleBytes(StateHandler* sh, ...); +void sh_handleBytesS(StateHandler* sh, ...); +void sh_handleWords(StateHandler* sh, ...); +void sh_handleWordsS(StateHandler* sh, ...); +void sh_handleLongLongs(StateHandler* sh, ...); +void sh_handleInts(StateHandler* sh, ...); +void sh_handleIntsS(StateHandler* sh, ...); +void sh_handleFloats(StateHandler* sh, ...); +void sh_handleDoubles(StateHandler* sh, ...); +void sh_handleByteArray(StateHandler* sh, uint8_t* data, int size); +void sh_handleWordArray(StateHandler* sh, uint16_t* data, int size); +void sh_placeInt(StateHandler* sh, int location, uint32_t value); + +#endif diff --git a/src/burner/burner.h b/src/burner/burner.h index 4dc37d25f..a822ad8f6 100644 --- a/src/burner/burner.h +++ b/src/burner/burner.h @@ -134,6 +134,8 @@ struct tIniStruct { extern tIniStruct gamehw_cfg[]; +UINT32 GameInputGetHWFlag(); + void GetHistoryDatHardwareToken(char *to_string); // inp_interface.cpp @@ -223,8 +225,9 @@ void ComputeGammaLUT(); #define DAT_NEOGEO_ONLY 11 #define DAT_NES_ONLY 12 #define DAT_FDS_ONLY 13 -#define DAT_NGP_ONLY 14 -#define DAT_CHANNELF_ONLY 15 +#define DAT_SNES_ONLY 14 +#define DAT_NGP_ONLY 15 +#define DAT_CHANNELF_ONLY 16 INT32 write_datfile(INT32 bType, FILE* fDat); INT32 create_datfile(TCHAR* szFilename, INT32 bType); diff --git a/src/burner/dat.cpp b/src/burner/dat.cpp index 8c0071244..98f83a2cc 100644 --- a/src/burner/dat.cpp +++ b/src/burner/dat.cpp @@ -123,6 +123,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) if (bType == DAT_NEOGEO_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - Neo Geo Games\n"); if (bType == DAT_NES_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - NES Games\n"); if (bType == DAT_FDS_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - FDS Games\n"); + if (bType == DAT_SNES_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - SNES Games\n"); if (bType == DAT_NGP_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - Neo Geo Pocket Games\n"); if (bType == DAT_CHANNELF_ONLY) fprintf(fDat, "\t\t" APP_TITLE " - Fairchild Channel F Games\n"); @@ -140,6 +141,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) if (bType == DAT_NEOGEO_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" Neo Geo Games\n"), szAppBurnVer); if (bType == DAT_NES_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" NES Games\n"), szAppBurnVer); if (bType == DAT_FDS_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" FDS Games\n"), szAppBurnVer); + if (bType == DAT_SNES_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" SNES Games\n"), szAppBurnVer); if (bType == DAT_NGP_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" Neo Geo Pocket Games\n"), szAppBurnVer); if (bType == DAT_CHANNELF_ONLY) _ftprintf(fDat, _T("\t\t") _T(APP_TITLE) _T(" v%s") _T(" Fairchild Channel F Games\n"), szAppBurnVer); fprintf(fDat, "\t\tStandard DatFile\n"); @@ -182,6 +184,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SPECTRUM) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_NES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_FDS) + || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NGP) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CHANNELF) ) && (bType == DAT_ARCADE_ONLY)) { @@ -236,6 +239,10 @@ INT32 write_datfile(INT32 bType, FILE* fDat) continue; } + if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SNES) && (bType == DAT_SNES_ONLY)) { + continue; + } + if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SNK_NGP) && (bType == DAT_NGP_ONLY)) { continue; } @@ -334,6 +341,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) remove_driver_leader(HARDWARE_SPECTRUM, 5, 1) remove_driver_leader(HARDWARE_NES, 4, 1) remove_driver_leader(HARDWARE_FDS, 4, 1) + remove_driver_leader(HARDWARE_SNES, 5, 1) remove_driver_leader(HARDWARE_SNK_NGP, 4, 1) remove_driver_leader(HARDWARE_CHANNELF, 4, 1) @@ -640,6 +648,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SPECTRUM) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_NES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_FDS) + || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NGP) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CHANNELF) ) && (bType == DAT_ARCADE_ONLY)) { @@ -694,6 +703,10 @@ INT32 write_datfile(INT32 bType, FILE* fDat) continue; } + if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SNES) && (bType == DAT_SNES_ONLY)) { + continue; + } + if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SNK_NGP) && (bType == DAT_NGP_ONLY)) { continue; } @@ -725,6 +738,7 @@ INT32 write_datfile(INT32 bType, FILE* fDat) remove_driver_leader(HARDWARE_SPECTRUM, 5, 0) remove_driver_leader(HARDWARE_NES, 4, 0) remove_driver_leader(HARDWARE_FDS, 4, 0) + remove_driver_leader(HARDWARE_SNES, 5, 0) remove_driver_leader(HARDWARE_SNK_NGP, 4, 0) remove_driver_leader(HARDWARE_CHANNELF, 4, 0) diff --git a/src/burner/gami.cpp b/src/burner/gami.cpp index 0a5a8cfb6..6a8682a59 100644 --- a/src/burner/gami.cpp +++ b/src/burner/gami.cpp @@ -2165,6 +2165,8 @@ tIniStruct gamehw_cfg[] = { {_T("Neo Geo Pocket C hardware"), _T("config/presets/ngp.ini"), { HARDWARE_SNK_NGPC, 0 }, "\t\t\t= 400 && nBmapHeight >= 400) { + if (bDrvOkay && nWindowSize > 1 && nBmapWidth >= 400 && nBmapHeight >= 400) { // For Popeye, Hole Land and Syvalion, MCR..etc. when running Windowed: Double Size bprintf(PRINT_NORMAL, _T(" * Game is double-sized to begin with.\n")); - nMaxSize = 1; + nMaxSize--; } } else { if (nBmapWidth < nBmapHeight) { diff --git a/src/burner/win32/sel.cpp b/src/burner/win32/sel.cpp index 2bec09dbd..c984697cb 100644 --- a/src/burner/win32/sel.cpp +++ b/src/burner/win32/sel.cpp @@ -128,6 +128,7 @@ HTREEITEM hFilterPce = NULL; HTREEITEM hFilterMsx = NULL; HTREEITEM hFilterNes = NULL; HTREEITEM hFilterFds = NULL; +HTREEITEM hFilterSnes = NULL; HTREEITEM hFilterNgp = NULL; HTREEITEM hFilterChannelF = NULL; HTREEITEM hFilterSms = NULL; @@ -274,17 +275,17 @@ static UINT64 MASKMIDWAY = 1 << MidwayValue; static UINT64 NesValue = HARDWARE_PREFIX_NES >> 24; static UINT64 MASKNES = 1 << NesValue; +// this is where things start going above the 32bit-zone. *solved w/64bit UINT?* static UINT64 FdsValue = (UINT64)HARDWARE_PREFIX_FDS >> 24; static UINT64 MASKFDS = (UINT64)1 << FdsValue; // 1 << 0x1f - needs casting or.. bonkers! - -// this is where things start going above the 32bit-zone. *solved w/64bit UINT?* +static UINT64 SnesValue = (UINT64)HARDWARE_PREFIX_SNES >> 24; +static UINT64 MASKSNES = (UINT64)1 << SnesValue; static UINT64 NgpValue = (UINT64)HARDWARE_PREFIX_NGP >> 24; static UINT64 MASKNGP = (UINT64)1 << NgpValue; - static UINT64 ChannelFValue = (UINT64)HARDWARE_PREFIX_CHANNELF >> 24; static UINT64 MASKCHANNELF = (UINT64)1 << ChannelFValue; -static UINT64 MASKALL = ((UINT64)MASKCAPMISC | MASKCAVE | MASKCPS | MASKCPS2 | MASKCPS3 | MASKDATAEAST | MASKGALAXIAN | MASKIREM | MASKKANEKO | MASKKONAMI | MASKNEOGEO | MASKPACMAN | MASKPGM | MASKPSIKYO | MASKSEGA | MASKSETA | MASKTAITO | MASKTECHNOS | MASKTOAPLAN | MASKMISCPRE90S | MASKMISCPOST90S | MASKMEGADRIVE | MASKPCENGINE | MASKSMS | MASKGG | MASKSG1000 | MASKCOLECO | MASKMSX | MASKSPECTRUM | MASKMIDWAY | MASKNES | MASKFDS | MASKNGP | MASKCHANNELF ); +static UINT64 MASKALL = ((UINT64)MASKCAPMISC | MASKCAVE | MASKCPS | MASKCPS2 | MASKCPS3 | MASKDATAEAST | MASKGALAXIAN | MASKIREM | MASKKANEKO | MASKKONAMI | MASKNEOGEO | MASKPACMAN | MASKPGM | MASKPSIKYO | MASKSEGA | MASKSETA | MASKTAITO | MASKTECHNOS | MASKTOAPLAN | MASKMISCPRE90S | MASKMISCPOST90S | MASKMEGADRIVE | MASKPCENGINE | MASKSMS | MASKGG | MASKSG1000 | MASKCOLECO | MASKMSX | MASKSPECTRUM | MASKMIDWAY | MASKNES | MASKFDS | MASKSNES | MASKNGP | MASKCHANNELF ); #define UNAVAILABLE (1 << 27) #define AVAILABLE (1 << 28) @@ -998,7 +999,7 @@ static void RefreshPanel() EnableWindow(hInfoLabel[i], FALSE); } - CheckDlgButton(hSelDlg, IDC_CHECKAUTOEXPAND, (nLoadMenuShowY & AUTOEXPAND) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hSelDlg, IDC_CHECKAUTOEXPAND, (nLoadMenuShowY & AUTOEXPAND) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hSelDlg, IDC_CHECKAVAILABLE, (nLoadMenuShowY & AVAILABLE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hSelDlg, IDC_CHECKUNAVAILABLE, (nLoadMenuShowY & UNAVAILABLE) ? BST_CHECKED : BST_UNCHECKED); @@ -1479,6 +1480,7 @@ static void CreateFilters() _TVCreateFiltersA(hHardware , IDS_SEL_SPECTRUM , hFilterSpectrum , nLoadMenuShowX & MASKSPECTRUM ); _TVCreateFiltersA(hHardware , IDS_SEL_NES , hFilterNes , nLoadMenuShowX & MASKNES ); _TVCreateFiltersA(hHardware , IDS_SEL_FDS , hFilterFds , nLoadMenuShowX & MASKFDS ); + _TVCreateFiltersA(hHardware , IDS_SEL_SNES , hFilterSnes , nLoadMenuShowX & MASKSNES ); _TVCreateFiltersA(hHardware , IDS_SEL_NGP , hFilterNgp , nLoadMenuShowX & MASKNGP ); _TVCreateFiltersA(hHardware , IDS_SEL_CHANNELF , hFilterChannelF , nLoadMenuShowX & MASKCHANNELF ); _TVCreateFiltersA(hHardware , IDS_SEL_MISCPRE90S , hFilterMiscPre90s , nLoadMenuShowX & MASKMISCPRE90S ); @@ -1496,7 +1498,7 @@ static void CreateFilters() TreeView_SelectSetFirstVisible(hFilterList, hFavorites); } -#define ICON_MAXCONSOLES 12 +#define ICON_MAXCONSOLES 13 enum { ICON_MEGADRIVE = 0, @@ -1509,8 +1511,9 @@ enum { ICON_SPECTRUM = 7, ICON_NES = 8, ICON_FDS = 9, - ICON_NGP = 10, - ICON_CHANNELF = 11 + ICON_SNES = 10, + ICON_NGP = 11, + ICON_CHANNELF = 12 }; static HICON hConsDrvIcon[ICON_MAXCONSOLES]; @@ -1565,6 +1568,9 @@ void LoadDrvIcons() _stprintf(szIcon, _T("%sfds_icon.ico"), szAppIconsPath); hConsDrvIcon[ICON_FDS] = (HICON)LoadImage(hAppInst, szIcon, IMAGE_ICON, nIconsSizeXY, nIconsSizeXY, LR_LOADFROMFILE); + _stprintf(szIcon, _T("%ssnes_icon.ico"), szAppIconsPath); + hConsDrvIcon[ICON_SNES] = (HICON)LoadImage(hAppInst, szIcon, IMAGE_ICON, nIconsSizeXY, nIconsSizeXY, LR_LOADFROMFILE); + _stprintf(szIcon, _T("%sngp_icon.ico"), szAppIconsPath); hConsDrvIcon[ICON_NGP] = (HICON)LoadImage(hAppInst, szIcon, IMAGE_ICON, nIconsSizeXY, nIconsSizeXY, LR_LOADFROMFILE); @@ -1590,6 +1596,7 @@ void LoadDrvIcons() || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SPECTRUM) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_NES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_FDS) + || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NGP) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CHANNELF) )) { @@ -1648,6 +1655,11 @@ void LoadDrvIcons() continue; } + if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNES) { + hDrvIcon[nDrvIndex] = hConsDrvIcon[ICON_SNES]; + continue; + } + if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NGP) { hDrvIcon[nDrvIndex] = hConsDrvIcon[ICON_NGP]; continue; @@ -1855,6 +1867,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP _TreeView_SetCheckState(hFilterList, hFilterSpectrum, FALSE); _TreeView_SetCheckState(hFilterList, hFilterNes, FALSE); _TreeView_SetCheckState(hFilterList, hFilterFds, FALSE); + _TreeView_SetCheckState(hFilterList, hFilterSnes, FALSE); _TreeView_SetCheckState(hFilterList, hFilterNgp, FALSE); _TreeView_SetCheckState(hFilterList, hFilterChannelF, FALSE); _TreeView_SetCheckState(hFilterList, hFilterMidway, FALSE); @@ -1896,6 +1909,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP _TreeView_SetCheckState(hFilterList, hFilterSpectrum, TRUE); _TreeView_SetCheckState(hFilterList, hFilterNes, TRUE); _TreeView_SetCheckState(hFilterList, hFilterFds, TRUE); + _TreeView_SetCheckState(hFilterList, hFilterSnes, TRUE); _TreeView_SetCheckState(hFilterList, hFilterNgp, TRUE); _TreeView_SetCheckState(hFilterList, hFilterChannelF, TRUE); _TreeView_SetCheckState(hFilterList, hFilterMidway, TRUE); @@ -2141,6 +2155,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP if (hItemChanged == hFilterSpectrum) _ToggleGameListing(nLoadMenuShowX, MASKSPECTRUM); if (hItemChanged == hFilterNes) _ToggleGameListing(nLoadMenuShowX, MASKNES); if (hItemChanged == hFilterFds) _ToggleGameListing(nLoadMenuShowX, MASKFDS); + if (hItemChanged == hFilterSnes) _ToggleGameListing(nLoadMenuShowX, MASKSNES); if (hItemChanged == hFilterNgp) _ToggleGameListing(nLoadMenuShowX, MASKNGP); if (hItemChanged == hFilterChannelF) _ToggleGameListing(nLoadMenuShowX, MASKCHANNELF); if (hItemChanged == hFilterMidway) _ToggleGameListing(nLoadMenuShowX, MASKMIDWAY); @@ -2257,17 +2272,17 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP } break; case IDC_SEL_IPSMANAGER: - if (bDrvSelected) { - int nOldnBurnDrvActive = nBurnDrvActive; + if (bDrvSelected) { + int nOldnBurnDrvActive = nBurnDrvActive; IpsManagerCreate(hSelDlg); - nBurnDrvActive = nOldnBurnDrvActive; // due to some weird bug in sel.cpp, nBurnDrvActive can sometimes change when clicking in new dialogs. + nBurnDrvActive = nOldnBurnDrvActive; // due to some weird bug in sel.cpp, nBurnDrvActive can sometimes change when clicking in new dialogs. LoadIpsActivePatches(); if (GetIpsNumActivePatches()) { EnableWindow(GetDlgItem(hDlg, IDC_SEL_APPLYIPS), TRUE); } else { EnableWindow(GetDlgItem(hDlg, IDC_SEL_APPLYIPS), FALSE); } - SetFocus(hSelList); + SetFocus(hSelList); } else { MessageBox(hSelDlg, FBALoadStringEx(hAppInst, IDS_ERR_NO_DRIVER_SELECTED, true), FBALoadStringEx(hAppInst, IDS_ERR_ERROR, true), MB_OK); } @@ -2451,8 +2466,8 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP { nLoadMenuExpand &= ~TvhFilterToBitmask(curItem.hItem); } - else if (pnmtv->action == TVE_EXPAND) - { + else if (pnmtv->action == TVE_EXPAND) + { nLoadMenuExpand |= TvhFilterToBitmask(curItem.hItem); } } @@ -2488,7 +2503,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP TreeView_HitTest(pNmHdr->hwndFrom, &thi); HTREEITEM hSelectHandle = thi.hItem; - if(hSelectHandle == NULL) return 1; + if(hSelectHandle == NULL) return 1; TreeView_SelectItem(hSelList, hSelectHandle); @@ -2536,7 +2551,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP TvItem.mask = TVIF_PARAM | TVIF_STATE | TVIF_CHILDREN; SendMessage(hSelList, TVM_GETITEM, 0, (LPARAM)&TvItem); -// dprintf(_T(" - Item (%i×%i) - (%i×%i) %hs\n"), lplvcd->nmcd.rc.left, lplvcd->nmcd.rc.top, lplvcd->nmcd.rc.right, lplvcd->nmcd.rc.bottom, ((NODEINFO*)TvItem.lParam)->pszROMName); +// dprintf(_T(" - Item (%i?i) - (%i?i) %hs\n"), lplvcd->nmcd.rc.left, lplvcd->nmcd.rc.top, lplvcd->nmcd.rc.right, lplvcd->nmcd.rc.bottom, ((NODEINFO*)TvItem.lParam)->pszROMName); // Set the foreground and background colours unless the item is highlighted if (!(TvItem.state & (TVIS_SELECTED | TVIS_DROPHILITED))) { @@ -2704,9 +2719,9 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP } } - CheckDlgButton(hDlg, IDC_SEL_APPLYIPS, BST_UNCHECKED); + CheckDlgButton(hDlg, IDC_SEL_APPLYIPS, BST_UNCHECKED); - if (GetIpsNumPatches()) { + if (GetIpsNumPatches()) { if (!nShowMVSCartsOnly) { EnableWindow(GetDlgItem(hDlg, IDC_SEL_IPSMANAGER), TRUE); LoadIpsActivePatches(); @@ -2869,7 +2884,7 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP TreeView_HitTest(pNmHdr->hwndFrom, &thi); HTREEITEM hSelectHandle = thi.hItem; - if(hSelectHandle == NULL) return 1; + if(hSelectHandle == NULL) return 1; TreeView_SelectItem(hSelList, hSelectHandle); diff --git a/src/burner/win32/string.rc b/src/burner/win32/string.rc index c0ecd9f94..3dc63a44a 100644 --- a/src/burner/win32/string.rc +++ b/src/burner/win32/string.rc @@ -194,7 +194,6 @@ BEGIN IDS_SEL_GENUINE "Genuine" IDS_SEL_SETSTATUS "Showing %i of %i sets [%i Unavailable sets]" IDS_SEL_KANEKO "Kaneko" - IDS_SEL_SNES "SNES" IDS_SEL_DATAEAST "Data East" IDS_SEL_CAPCOM_MISC "Capcom (Other)" IDS_SEL_SETA "Seta" @@ -207,6 +206,7 @@ BEGIN IDS_SEL_MSX "MSX" IDS_SEL_NES "NES" IDS_SEL_FDS "FDS" + IDS_SEL_SNES "SNES" IDS_SEL_NGP "Neo Geo Pocket" IDS_SEL_CHANNELF "Fairchild Channel F" IDS_SEL_SPECTRUM "ZX Spectrum" From 44e92351a44e985c19939e5334540c41120ccc81 Mon Sep 17 00:00:00 2001 From: dinkc64 Date: Sat, 9 Nov 2024 01:47:44 -0500 Subject: [PATCH 4/5] sdl makefile, add -Wno-sign-compare --- makefile.sdl | 2 +- makefile.sdl2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/makefile.sdl b/makefile.sdl index 03ae45e96..e2ba73bd0 100644 --- a/makefile.sdl +++ b/makefile.sdl @@ -173,7 +173,7 @@ CFLAGS = -O2 -fomit-frame-pointer -Wno-write-strings \ $(PLATFLAGS) $(DEF) $(incdir) CXXFLAGS = -O2 -fomit-frame-pointer -Wno-write-strings \ - -Wall -W -Wno-long-long \ + -Wall -W -Wno-long-long -Wno-sign-compare \ -Wunknown-pragmas -Wundef -Wconversion -Wno-missing-braces \ -Wuninitialized -Wpointer-arith -Winline -Wno-multichar \ -Wno-conversion -Wno-attributes \ diff --git a/makefile.sdl2 b/makefile.sdl2 index 081c86a63..72ed5883b 100644 --- a/makefile.sdl2 +++ b/makefile.sdl2 @@ -198,7 +198,7 @@ CFLAGS = -O2 -fomit-frame-pointer -Wno-write-strings \ $(PLATFLAGS) $(DEF) $(incdir) CXXFLAGS = -O2 -fomit-frame-pointer -Wno-write-strings \ - -Wall -W -Wno-long-long \ + -Wall -W -Wno-long-long -Wno-sign-compare \ -Wunknown-pragmas -Wundef -Wconversion -Wno-missing-braces \ -Wuninitialized -Wpointer-arith -Winline -Wno-multichar \ -Wno-conversion -Wno-attributes \ From 96b0b94e3774c904f4136b465118f07ef0249f79 Mon Sep 17 00:00:00 2001 From: barbudreadmon Date: Sat, 9 Nov 2024 10:06:25 +0100 Subject: [PATCH 5/5] fix sdl build --- makefile.sdl | 2 +- src/burner/sdl/{input.cpp => input_sdl.cpp} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/burner/sdl/{input.cpp => input_sdl.cpp} (100%) diff --git a/makefile.sdl b/makefile.sdl index e2ba73bd0..477155e65 100644 --- a/makefile.sdl +++ b/makefile.sdl @@ -69,7 +69,7 @@ depobj += neocdlist.o \ \ inp_sdl.o aud_sdl.o support_paths.o ips_manager.o scrn.o localise_gamelist.o \ cd_sdl2.o config.o main.o run.o stringset.o bzip.o drv.o media.o romdata.o \ - inpdipsw.o vid_sdlfx.o inputbuf.o replay.o vid_sdlopengl.o input.o stated.o + inpdipsw.o vid_sdlfx.o inputbuf.o replay.o vid_sdlopengl.o input_sdl.o stated.o ifdef INCLUDE_7Z_SUPPORT depobj += un7z.o \ diff --git a/src/burner/sdl/input.cpp b/src/burner/sdl/input_sdl.cpp similarity index 100% rename from src/burner/sdl/input.cpp rename to src/burner/sdl/input_sdl.cpp