[Core/MD] added support for MegaSD CD hardware overlay (MD+ hacks) and extended SSF2 / ROM write mappers

This commit is contained in:
ekeeke 2021-09-13 19:32:52 +02:00
parent 7989db2806
commit dfe3672878
31 changed files with 251 additions and 114 deletions

View File

@ -54,6 +54,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
* added support for more X-in-1 pirate mappers * added support for more X-in-1 pirate mappers
* added support for some new unlicensed games with copy protection (Thunderbolt II, Tom Clown, Chaoji Puke / Super Poker, Rock Heaven, Rock World) * added support for some new unlicensed games with copy protection (Thunderbolt II, Tom Clown, Chaoji Puke / Super Poker, Rock Heaven, Rock World)
* added support for Everdrive extended SSF mapper * added support for Everdrive extended SSF mapper
* added support for MegaSD CD hardware overlay (MD+ hacks) and extended SSF2 / ROM write mappers
* added (very basic) emulation of Flashkit MD hardware * added (very basic) emulation of Flashkit MD hardware
* added emulation of Micro Machines USA on-board TMSS bypass logic hardware * added emulation of Micro Machines USA on-board TMSS bypass logic hardware
* added SRAM support for games larger than 8MB * added SRAM support for games larger than 8MB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 MiB

After

Width:  |  Height:  |  Size: 4.0 MiB

View File

@ -44,6 +44,7 @@
#include "shared.h" #include "shared.h"
#include "eeprom_i2c.h" #include "eeprom_i2c.h"
#include "eeprom_spi.h" #include "eeprom_spi.h"
#include "megasd.h"
/* Cart database entry */ /* Cart database entry */
typedef struct typedef struct
@ -518,6 +519,21 @@ void md_cart_init(void)
/* cartridge ROM mapping is reinitialized on /VRES */ /* cartridge ROM mapping is reinitialized on /VRES */
cart.hw.bankshift = 1; cart.hw.bankshift = 1;
} }
else if ((strstr(rominfo.consoletype,"SEGA SSF2") != NULL) && (cart.romsize <= 0x800000))
{
/* MegaSD enhanced SSF2 mapper (max. 8MB ROM) */
cart.special |= HW_MEGASD;
cart.hw.time_w = megasd_enhanced_ssf2_mapper_w;
/* cartridge ROM mapping is reinitialized on /VRES */
cart.hw.bankshift = 1;
}
else if ((strstr(rominfo.consoletype,"SEGA MEGASD") != NULL) && (cart.romsize <= 0x400000))
{
/* MegaSD ROM write mapper (max. 4MB ROM) */
cart.special |= HW_MEGASD;
cart.hw.time_w = megasd_rom_mapper_w;
}
else if (strstr(rominfo.domestic,"SUPER STREET FIGHTER2")) else if (strstr(rominfo.domestic,"SUPER STREET FIGHTER2"))
{ {
/* SSF2 mapper */ /* SSF2 mapper */
@ -760,6 +776,26 @@ void md_cart_init(void)
break; break;
} }
} }
/**********************************************
MEGASD ADD-ON
***********************************************/
/* enable MegaSD overlay for cartridge ROM (max. 8MB) when Mega CD hardware is disabled and either MegaSD add-on is forced enabled or automatic add-on detection is enabled and MegaSD compatible disc image is loaded */
if ((cart.romsize <= 0x800000) && (system_hw == SYSTEM_MD) && ((config.add_on == HW_ADDON_MEGASD) || ((config.add_on | cdd.loaded) == HW_ADDON_MEGASD)))
{
cart.special |= HW_MEGASD;
}
/* force Mega CD sound hardware initialization when MegaSD overlay is enabled (if not already initialized) */
if ((cart.special & HW_MEGASD) && !snd.blips[1] && !snd.blips[2])
{
/* allocate blip buffers for PCM and CD-DA audio streams */
snd.blips[1] = blip_new(snd.sample_rate / 10);
snd.blips[2] = blip_new(snd.sample_rate / 10);
/* initialize PCM and CD-DA audio */
audio_set_rate(snd.sample_rate, snd.frame_rate);
}
} }
/* hardware that need to be reseted on power on */ /* hardware that need to be reseted on power on */
@ -775,7 +811,13 @@ void md_cart_reset(int hard_reset)
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask); m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
} }
} }
/* MegaSD hardware */
if (cart.special & HW_MEGASD)
{
megasd_reset();
}
/* SVP chip */ /* SVP chip */
if (svp) if (svp)
{ {
@ -828,7 +870,7 @@ int md_cart_context_save(uint8 *state)
{ {
/* get base address */ /* get base address */
base = m68k.memory_map[i].base; base = m68k.memory_map[i].base;
if (base == sram.sram) if (base == sram.sram)
{ {
/* SRAM */ /* SRAM */
@ -857,6 +899,12 @@ int md_cart_context_save(uint8 *state)
save_param(&svp->ssp1601,sizeof(ssp1601_t)); save_param(&svp->ssp1601,sizeof(ssp1601_t));
} }
/* MegaSD hardware */
if (cart.special & HW_MEGASD)
{
bufferptr += megasd_context_save(&state[bufferptr]);
}
return bufferptr; return bufferptr;
} }
@ -913,6 +961,12 @@ int md_cart_context_load(uint8 *state)
load_param(&svp->ssp1601,sizeof(ssp1601_t)); load_param(&svp->ssp1601,sizeof(ssp1601_t));
} }
/* MegaSD hardware */
if (cart.special & HW_MEGASD)
{
bufferptr += megasd_context_load(&state[bufferptr]);
}
return bufferptr; return bufferptr;
} }

View File

@ -55,9 +55,16 @@
#define TYPE_AR 0x02 /* (Pro) Action Replay */ #define TYPE_AR 0x02 /* (Pro) Action Replay */
#define TYPE_SK 0x03 /* Sonic & Knuckles */ #define TYPE_SK 0x03 /* Sonic & Knuckles */
/* CD hardware add-on (MD mode) */
#define HW_ADDON_AUTO 0x00
#define HW_ADDON_MEGACD 0x01
#define HW_ADDON_MEGASD 0x02
#define HW_ADDON_NONE 0x03
/* Special hardware (0x01 & 0x02 reserved for Master System 3-D glasses & Terebi Oekaki) */ /* Special hardware (0x01 & 0x02 reserved for Master System 3-D glasses & Terebi Oekaki) */
#define HW_J_CART 0x04 #define HW_J_CART 0x04
#define HW_LOCK_ON 0x08 #define HW_LOCK_ON 0x08
#define HW_MEGASD 0x10
/* Cartridge extra hardware */ /* Cartridge extra hardware */
typedef struct typedef struct

View File

@ -36,6 +36,7 @@
* *
****************************************************************************************/ ****************************************************************************************/
#include "shared.h" #include "shared.h"
#include "megasd.h"
#if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#define SUPPORTED_EXT 20 #define SUPPORTED_EXT 20
@ -363,8 +364,9 @@ int cdd_load(char *filename, char *header)
char *ptr, *lptr; char *ptr, *lptr;
cdStream *fd; cdStream *fd;
/* assume CD image file by default */ /* assume normal CD image file by default */
int isCDfile = 1; int isCDfile = 1;
int isMSDfile = 0;
/* first unmount any loaded disc */ /* first unmount any loaded disc */
cdd_unload(); cdd_unload();
@ -395,7 +397,7 @@ int cdd_load(char *filename, char *header)
/* retrieve CHD header */ /* retrieve CHD header */
head = chd_get_header(cdd.chd.file); head = chd_get_header(cdd.chd.file);
/* detect invalid hunk size */ /* detect invalid hunk size */
if ((head->hunkbytes == 0) || (head->hunkbytes % CD_FRAME_SIZE)) if ((head->hunkbytes == 0) || (head->hunkbytes % CD_FRAME_SIZE))
{ {
@ -526,7 +528,7 @@ int cdd_load(char *filename, char *header)
cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end;
/* CD mounted */ /* CD mounted */
cdd.loaded = 1; cdd.loaded = HW_ADDON_MEGACD;
return 1; return 1;
} }
@ -537,8 +539,9 @@ int cdd_load(char *filename, char *header)
} }
#endif #endif
/* save a copy of base filename */ /* save a copy of base filename (max. 255 characters) */
strncpy(fname, filename, 256); strncpy(fname, filename, 255);
fname[256] = 0;
/* check loaded file extension */ /* check loaded file extension */
if (memcmp("cue", &filename[strlen(filename) - 3], 3) && memcmp("CUE", &filename[strlen(filename) - 3], 3)) if (memcmp("cue", &filename[strlen(filename) - 3], 3) && memcmp("CUE", &filename[strlen(filename) - 3], 3))
@ -794,6 +797,28 @@ int cdd_load(char *filename, char *header)
} }
} }
/* decode REM LOOP xxx command (MegaSD specific command) */
else if (sscanf(lptr, "REM LOOP %d", &bb) == 1)
{
cdd.toc.tracks[cdd.toc.last].loopEnabled = 1;
cdd.toc.tracks[cdd.toc.last].loopOffset = bb;
isMSDfile = 1;
}
/* decode REM LOOP command (MegaSD specific command) */
else if (strstr(lptr,"REM LOOP"))
{
cdd.toc.tracks[cdd.toc.last].loopEnabled = 1;
isMSDfile = 1;
}
/* decode REM NOLOOP command (MegaSD specific command) */
else if (strstr(lptr,"REM NOLOOP"))
{
cdd.toc.tracks[cdd.toc.last].loopEnabled = -1;
isMSDfile = 1;
}
/* decode PREGAP commands */ /* decode PREGAP commands */
else if (sscanf(lptr, "PREGAP %02d:%02d:%02d", &mm, &ss, &bb) == 3) else if (sscanf(lptr, "PREGAP %02d:%02d:%02d", &mm, &ss, &bb) == 3)
{ {
@ -1211,7 +1236,7 @@ int cdd_load(char *filename, char *header)
cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end;
/* CD mounted */ /* CD mounted */
cdd.loaded = 1; cdd.loaded = isMSDfile ? HW_ADDON_MEGASD : HW_ADDON_MEGACD;
/* Automatically try to open associated subcode data file */ /* Automatically try to open associated subcode data file */
memcpy(&fname[strlen(fname) - 4], ".sub", 4); memcpy(&fname[strlen(fname) - 4], ".sub", 4);
@ -1617,6 +1642,12 @@ void cdd_read_audio(unsigned int samples)
/* save last audio output for next frame */ /* save last audio output for next frame */
cdd.audio[0] = prev_l; cdd.audio[0] = prev_l;
cdd.audio[1] = prev_r; cdd.audio[1] = prev_r;
/* check CD-DA track end (Mega SD add-on specific)*/
if (cart.special & HW_MEGASD)
{
megasd_update_cdda(samples);
}
} }
else else
{ {

View File

@ -86,6 +86,8 @@ typedef struct
int start; int start;
int end; int end;
int type; int type;
int loopEnabled;
int loopOffset;
} track_t; } track_t;
/* CD TOC */ /* CD TOC */

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* PCM sound chip (315-5476A) (RF5C164 compatible) * PCM sound chip (315-5476A) (RF5C164 compatible)
* *
* Copyright (C) 2012-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2012-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -226,10 +226,10 @@ void pcm_update(unsigned int samples)
pcm.cycles = 0; pcm.cycles = 0;
} }
void pcm_write(unsigned int address, unsigned char data) void pcm_write(unsigned int address, unsigned char data, unsigned int cycles)
{ {
/* synchronize PCM chip with SUB-CPU */ /* synchronize PCM chip with CPU */
int clocks = s68k.cycles - pcm.cycles; int clocks = cycles - pcm.cycles;
if (clocks > 0) if (clocks > 0)
{ {
/* number of internal clocks (samples) to run */ /* number of internal clocks (samples) to run */
@ -350,10 +350,10 @@ void pcm_write(unsigned int address, unsigned char data)
} }
} }
unsigned char pcm_read(unsigned int address) unsigned char pcm_read(unsigned int address, unsigned int cycles)
{ {
/* synchronize PCM chip with SUB-CPU */ /* synchronize PCM chip with SUB-CPU */
int clocks = s68k.cycles - pcm.cycles; int clocks = cycles - pcm.cycles;
if (clocks > 0) if (clocks > 0)
{ {
/* number of internal clocks (samples) to run */ /* number of internal clocks (samples) to run */

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* PCM sound chip (315-5476A) (RF5C164 compatible) * PCM sound chip (315-5476A) (RF5C164 compatible)
* *
* Copyright (C) 2012-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2012-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -70,8 +70,8 @@ extern void pcm_reset(void);
extern int pcm_context_save(uint8 *state); extern int pcm_context_save(uint8 *state);
extern int pcm_context_load(uint8 *state); extern int pcm_context_load(uint8 *state);
extern void pcm_update(unsigned int samples); extern void pcm_update(unsigned int samples);
extern void pcm_write(unsigned int address, unsigned char data); extern void pcm_write(unsigned int address, unsigned char data, unsigned int cycles);
extern unsigned char pcm_read(unsigned int address); extern unsigned char pcm_read(unsigned int address, unsigned int cycles);
extern void pcm_ram_dma_w(unsigned int words); extern void pcm_ram_dma_w(unsigned int words);
#endif #endif

View File

@ -482,7 +482,7 @@ static unsigned int scd_read_byte(unsigned int address)
/* get /LDS only */ /* get /LDS only */
if (address & 1) if (address & 1)
{ {
return pcm_read((address >> 1) & 0x1fff); return pcm_read((address >> 1) & 0x1fff, s68k.cycles);
} }
return s68k_read_bus_8(address); return s68k_read_bus_8(address);
@ -601,7 +601,7 @@ static unsigned int scd_read_word(unsigned int address)
if (!(address & 0x8000)) if (!(address & 0x8000))
{ {
/* get /LDS only */ /* get /LDS only */
return pcm_read((address >> 1) & 0x1fff); return pcm_read((address >> 1) & 0x1fff, s68k.cycles);
} }
#ifdef LOG_SCD #ifdef LOG_SCD
@ -764,7 +764,7 @@ static void scd_write_byte(unsigned int address, unsigned int data)
/* get /LDS only */ /* get /LDS only */
if (address & 1) if (address & 1)
{ {
pcm_write((address >> 1) & 0x1fff, data); pcm_write((address >> 1) & 0x1fff, data, s68k.cycles);
return; return;
} }
@ -1028,7 +1028,7 @@ static void scd_write_word(unsigned int address, unsigned int data)
if (!(address & 0x8000)) if (!(address & 0x8000))
{ {
/* get /LDS only */ /* get /LDS only */
pcm_write((address >> 1) & 0x1fff, data); pcm_write((address >> 1) & 0x1fff, data & 0xff, s68k.cycles);
return; return;
} }

View File

@ -3,7 +3,7 @@
* ROM Loading Support * ROM Loading Support
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2020 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -58,20 +58,21 @@
#define ROMMEMO 456 #define ROMMEMO 456
#define ROMCOUNTRY 496 #define ROMCOUNTRY 496
#define P3BUTTONS 1 #define P3BUTTONS 0x0001
#define P6BUTTONS 2 #define P6BUTTONS 0x0002
#define PKEYBOARD 4 #define PKEYBOARD 0x0004
#define PPRINTER 8 #define PPRINTER 0x0008
#define PBALL 16 #define PBALL 0x0010
#define PFLOPPY 32 #define PFLOPPY 0x0020
#define PACTIVATOR 64 #define PACTIVATOR 0x0040
#define PTEAMPLAYER 128 #define PTEAMPLAYER 0x0080
#define PMSYSTEMPAD 256 #define PMSYSTEMPAD 0x0100
#define PSERIAL 512 #define PSERIAL 0x0200
#define PTABLET 1024 #define PTABLET 0x0400
#define PPADDLE 2048 #define PPADDLE 0x0800
#define PCDROM 4096 #define PCDROM 0x1000
#define PMOUSE 8192 #define PMOUSE 0x2000
#define PMENACER 0x4000
#define MAXCOMPANY 64 #define MAXCOMPANY 64
#define MAXPERIPHERALS 15 #define MAXPERIPHERALS 15
@ -288,7 +289,7 @@ void getrominfo(char *romheader)
/* Supported peripherals */ /* Supported peripherals */
rominfo.peripherals = 0; rominfo.peripherals = 0;
for (i = 0; i < 14; i++) for (i = 0; i < 14; i++)
for (j=0; j < 14; j++) for (j=0; j < MAXPERIPHERALS; j++)
if (romheader[ROMIOSUPPORT+i] == peripheralinfo[j].pID[0]) if (romheader[ROMIOSUPPORT+i] == peripheralinfo[j].pID[0])
rominfo.peripherals |= (1 << j); rominfo.peripherals |= (1 << j);
} }
@ -581,9 +582,6 @@ int load_rom(char *filename)
{ {
/* enable CD hardware */ /* enable CD hardware */
system_hw = SYSTEM_MCD; system_hw = SYSTEM_MCD;
/* boot from CD hardware */
scd.cartridge.boot = 0x00;
} }
else else
{ {
@ -710,10 +708,10 @@ int load_rom(char *filename)
/* Save auto-detected system hardware */ /* Save auto-detected system hardware */
romtype = system_hw; romtype = system_hw;
/* CD image file */ /* CD image file */
if (system_hw == SYSTEM_MCD) if (system_hw == SYSTEM_MCD)
{ {
/* try to load CD BOOTROM for selected region */ /* try to load CD BOOTROM for selected region */
if (!load_bios(SYSTEM_MCD)) if (!load_bios(SYSTEM_MCD))
{ {
@ -723,6 +721,9 @@ int load_rom(char *filename)
/* error booting from CD */ /* error booting from CD */
return (0); return (0);
} }
/* boot from CD hardware */
scd.cartridge.boot = 0x00;
} }
/* CD BOOTROM */ /* CD BOOTROM */
@ -744,44 +745,26 @@ int load_rom(char *filename)
system_bios = (system_bios & 0xf0) | (region_code >> 4); system_bios = (system_bios & 0xf0) | (region_code >> 4);
} }
/* ROM cartridge (max. 8MB) with CD loaded */ /* 16-bit ROM cartridge (max. 8MB) with optional CD hardware add-on support enabled */
else if ((cart.romsize <= 0x800000) && cdd.loaded) else if ((system_hw == SYSTEM_MD) && (cart.romsize <= 0x800000) && (config.add_on != HW_ADDON_NONE))
{ {
/* try to load CD BOOTROM */ if ((rominfo.peripherals & PCDROM) || (strstr(rominfo.domestic,"FLUX") != NULL) ||
if (load_bios(SYSTEM_MCD)) (config.add_on == HW_ADDON_MEGACD) || ((config.add_on | cdd.loaded) == HW_ADDON_MEGACD))
{ {
/* enable CD hardware */ /* try to load CD BOOTROM for selected region */
system_hw = SYSTEM_MCD;
/* boot from cartridge */
scd.cartridge.boot = 0x40;
}
else
{
/* unmount CD image */
cdd_unload();
}
}
/* ROM cartridge with CD support */
else if ((strstr(rominfo.domestic,"FLUX") != NULL) ||
(strstr(rominfo.domestic,"WONDER LIBRARY") != NULL) ||
(strstr(rominfo.product,"T-5740") != NULL))
{
/* check if console hardware is set to AUTO */
if (!config.system)
{
/* try to load CD BOOTROM */
if (load_bios(SYSTEM_MCD)) if (load_bios(SYSTEM_MCD))
{ {
char fname[256]; /* automatically try to load associated .iso file if no CD image loaded yet */
int len = strlen(filename); if (!cdd.loaded)
{
/* automatically try to load associated .iso file */ char fname[256];
while ((len && (filename[len] != '.')) || (len > 251)) len--; int len = strlen(filename);
strncpy(fname, filename, len); while ((len && (filename[len] != '.')) || (len > 251)) len--;
strcpy(&fname[len], ".iso"); strncpy(fname, filename, len);
cdd_load(fname, (char *)cdc.ram); strcpy(&fname[len], ".iso");
fname[len+4] = 0;
cdd_load(fname, (char *)cdc.ram);
}
/* enable CD hardware */ /* enable CD hardware */
system_hw = SYSTEM_MCD; system_hw = SYSTEM_MCD;
@ -789,6 +772,11 @@ int load_rom(char *filename)
/* boot from cartridge */ /* boot from cartridge */
scd.cartridge.boot = 0x40; scd.cartridge.boot = 0x40;
} }
else
{
/* unmount any loaded CD image */
cdd_unload();
}
} }
} }

View File

@ -3,7 +3,7 @@
* ROM Loading Support * ROM Loading Support
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2020 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -5,7 +5,7 @@
* Support for 16-bit & 8-bit hardware modes * Support for 16-bit & 8-bit hardware modes
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2018 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -130,8 +130,8 @@ void audio_set_rate(int samplerate, double framerate)
/* resampled to desired rate at the end of each frame, using Blip Buffer. */ /* resampled to desired rate at the end of each frame, using Blip Buffer. */
blip_set_rates(snd.blips[0], mclk, samplerate); blip_set_rates(snd.blips[0], mclk, samplerate);
/* Mega CD sound hardware */ /* Mega CD sound hardware enabled ? */
if (system_hw == SYSTEM_MCD) if (snd.blips[1] && snd.blips[2])
{ {
/* number of SCD master clocks run per second */ /* number of SCD master clocks run per second */
mclk = (mclk / system_clock) * SCD_CLOCK; mclk = (mclk / system_clock) * SCD_CLOCK;
@ -195,8 +195,8 @@ int audio_update(int16 *buffer)
/* run sound chips until end of frame */ /* run sound chips until end of frame */
int size = sound_update(mcycles_vdp); int size = sound_update(mcycles_vdp);
/* Mega CD specific */ /* Mega CD sound hardware enabled ? */
if (system_hw == SYSTEM_MCD) if (snd.blips[1] && snd.blips[2])
{ {
/* sync PCM chip with other sound chips */ /* sync PCM chip with other sound chips */
pcm_update(size); pcm_update(size);

View File

@ -5,7 +5,7 @@
* Support for 16-bit & 8-bit hardware modes * Support for 16-bit & 8-bit hardware modes
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2018 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2021 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -88,7 +88,8 @@ OBJECTS += $(OBJDIR)/sram.o \
$(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_i2c.o \
$(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/eeprom_spi.o \
$(OBJDIR)/md_cart.o \ $(OBJDIR)/md_cart.o \
$(OBJDIR)/sms_cart.o $(OBJDIR)/sms_cart.o \
$(OBJDIR)/megasd.o
OBJECTS += $(OBJDIR)/scd.o \ OBJECTS += $(OBJDIR)/scd.o \
$(OBJDIR)/cdd.o \ $(OBJDIR)/cdd.o \

View File

@ -62,7 +62,8 @@ void set_config_defaults(void)
config.force_dtack = 0; config.force_dtack = 0;
config.addr_error = 1; config.addr_error = 1;
config.bios = 0; config.bios = 0;
config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.lock_on = 0; /* = OFF (or TYPE_SK, TYPE_GG & TYPE_AR) */
config.add_on = 0; /* = HW_ADDON_AUTO (or HW_ADDON_MEGACD, HW_ADDON_MEGASD & HW_ADDON_NONE) */
config.ntsc = 0; config.ntsc = 0;
config.lcd = 0; /* 0.8 fixed point */ config.lcd = 0; /* 0.8 fixed point */

View File

@ -40,6 +40,7 @@ typedef struct
uint8 addr_error; uint8 addr_error;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 add_on;
uint8 hot_swap; uint8 hot_swap;
uint8 invert_mouse; uint8 invert_mouse;
uint8 gun_cursor[2]; uint8 gun_cursor[2];

View File

@ -122,6 +122,7 @@ void config_default(void)
config.addr_error = 1; config.addr_error = 1;
config.bios = 0; config.bios = 0;
config.lock_on = 0; config.lock_on = 0;
config.add_on = HW_ADDON_AUTO;
config.hot_swap = 0; config.hot_swap = 0;
/* video options */ /* video options */

View File

@ -71,6 +71,7 @@ typedef struct
uint8 addr_error; uint8 addr_error;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 add_on;
uint8 hot_swap; uint8 hot_swap;
uint8 invert_mouse; uint8 invert_mouse;
uint8 gun_cursor[2]; uint8 gun_cursor[2];

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX menu * Genesis Plus GX menu
* *
* Copyright Eke-Eke (2009-2019) * Copyright Eke-Eke (2009-2021)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -385,6 +385,7 @@ static gui_item items_system[] =
{NULL,NULL,"System Boot: BIOS&CART", "Select system booting method", 56,132,276,48}, {NULL,NULL,"System Boot: BIOS&CART", "Select system booting method", 56,132,276,48},
{NULL,NULL,"System Lockups: ON", "Enable/Disable original system lock-ups", 56,132,276,48}, {NULL,NULL,"System Lockups: ON", "Enable/Disable original system lock-ups", 56,132,276,48},
{NULL,NULL,"68k Address Error: ON", "Enable/Disable 68k address error exceptions", 56,132,276,48}, {NULL,NULL,"68k Address Error: ON", "Enable/Disable 68k address error exceptions", 56,132,276,48},
{NULL,NULL,"CD Add-on: MEGA/SEGA CD", "Select cartridge mode CD hardware add-on", 56,132,276,48},
{NULL,NULL,"Lock-on: OFF", "Select Lock-On cartridge type", 56,132,276,48}, {NULL,NULL,"Lock-on: OFF", "Select Lock-On cartridge type", 56,132,276,48},
{NULL,NULL,"Cartridge Swap: OFF", "Enable/Disable cartridge hot swap", 56,132,276,48}, {NULL,NULL,"Cartridge Swap: OFF", "Enable/Disable cartridge hot swap", 56,132,276,48},
{NULL,NULL,"BIOS & Lock-On ROM paths","Configure BIOS & Lock-On ROM paths", 56,132,276,48}, {NULL,NULL,"BIOS & Lock-On ROM paths","Configure BIOS & Lock-On ROM paths", 56,132,276,48},
@ -1311,25 +1312,34 @@ static void systemmenu ()
sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON"); sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON");
sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
if (config.lock_on == TYPE_GG) if (config.add_on == HW_ADDON_AUTO)
sprintf (items[7].text, "Lock-On: GAME GENIE"); sprintf (items[7].text, "CD Add-on: AUTO");
else if (config.lock_on == TYPE_AR) else if (config.add_on == HW_ADDON_MEGACD)
sprintf (items[7].text, "Lock-On: ACTION REPLAY"); sprintf (items[7].text, "CD Add-on: MEGA/SEGA CD");
else if (config.lock_on == TYPE_SK) else if (config.add_on == HW_ADDON_MEGASD)
sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); sprintf (items[7].text, "CD Add-on: MEGASD");
else else
sprintf (items[7].text, "Lock-On: OFF"); sprintf (items[7].text, "CD Add-on: NONE");
sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); if (config.lock_on == TYPE_GG)
sprintf (items[8].text, "Lock-On: GAME GENIE");
else if (config.lock_on == TYPE_AR)
sprintf (items[8].text, "Lock-On: ACTION REPLAY");
else if (config.lock_on == TYPE_SK)
sprintf (items[8].text, "Lock-On: SONIC&KNUCKLES");
else
sprintf (items[8].text, "Lock-On: OFF");
sprintf (items[9].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF");
if (svp) if (svp)
{ {
sprintf (items[10].text, "SVP Cycles: %d", SVP_cycles); sprintf (items[11].text, "SVP Cycles: %d", SVP_cycles);
m->max_items = 11; m->max_items = 12;
} }
else else
{ {
m->max_items = 10; m->max_items = 11;
} }
GUI_InitMenu(m); GUI_InitMenu(m);
@ -1520,17 +1530,31 @@ static void systemmenu ()
break; break;
} }
case 7: /*** Cart Lock-On ***/ case 7: /*** CD add-on ***/
{
config.add_on = (config.add_on + 1) % (HW_ADDON_NONE + 1);
if (config.add_on == HW_ADDON_AUTO)
sprintf (items[7].text, "CD Add-on: AUTO");
else if (config.add_on == HW_ADDON_MEGACD)
sprintf (items[7].text, "CD Add-on: MEGA/SEGA CD");
else if (config.add_on == HW_ADDON_MEGASD)
sprintf (items[7].text, "CD Add-on: MEGASD");
else
sprintf (items[7].text, "CD Add-on: NONE");
break;
}
case 8: /*** Cart Lock-On ***/
{ {
config.lock_on = (config.lock_on + 1) % (TYPE_SK + 1); config.lock_on = (config.lock_on + 1) % (TYPE_SK + 1);
if (config.lock_on == TYPE_GG) if (config.lock_on == TYPE_GG)
sprintf (items[7].text, "Lock-On: GAME GENIE"); sprintf (items[8].text, "Lock-On: GAME GENIE");
else if (config.lock_on == TYPE_AR) else if (config.lock_on == TYPE_AR)
sprintf (items[7].text, "Lock-On: ACTION REPLAY"); sprintf (items[8].text, "Lock-On: ACTION REPLAY");
else if (config.lock_on == TYPE_SK) else if (config.lock_on == TYPE_SK)
sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); sprintf (items[8].text, "Lock-On: SONIC&KNUCKLES");
else else
sprintf (items[7].text, "Lock-On: OFF"); sprintf (items[8].text, "Lock-On: OFF");
if ((system_hw == SYSTEM_MD) || (system_hw == SYSTEM_PICO)) if ((system_hw == SYSTEM_MD) || (system_hw == SYSTEM_PICO))
{ {
@ -1564,14 +1588,14 @@ static void systemmenu ()
break; break;
} }
case 8: /*** Cartridge Hot Swap ***/ case 9: /*** Cartridge Hot Swap ***/
{ {
config.hot_swap ^= 1; config.hot_swap ^= 1;
sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); sprintf (items[9].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF");
break; break;
} }
case 9: /*** System ROM paths ***/ case 10: /*** System ROM paths ***/
{ {
GUI_DeleteMenu(m); GUI_DeleteMenu(m);
rompathmenu(); rompathmenu();
@ -1579,10 +1603,10 @@ static void systemmenu ()
break; break;
} }
case 10: /*** SVP cycles per line ***/ case 11: /*** SVP cycles per line ***/
{ {
GUI_OptionBox(m,0,"SVP Cycles",(void *)&SVP_cycles,1,1,1500,1); GUI_OptionBox(m,0,"SVP Cycles",(void *)&SVP_cycles,1,1,1500,1);
sprintf (items[10].text, "SVP Cycles: %d", SVP_cycles); sprintf (items[11].text, "SVP Cycles: %d", SVP_cycles);
break; break;
} }

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX menus * Genesis Plus GX menus
* *
* Copyright Eke-Eke (2009-2019) * Copyright Eke-Eke (2009-2021)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX libretro port * Genesis Plus GX libretro port
* *
* Copyright Eke-Eke (2007-2020) * Copyright Eke-Eke (2007-2021)
* *
* Copyright Daniel De Matteis (2012-2016) * Copyright Daniel De Matteis (2012-2016)
* *
@ -608,6 +608,7 @@ static void config_default(void)
config.addr_error = 1; config.addr_error = 1;
config.bios = 0; config.bios = 0;
config.lock_on = 0; config.lock_on = 0;
config.add_on = HW_ADDON_AUTO;
config.lcd = 0; /* 0.8 fixed point */ config.lcd = 0; /* 0.8 fixed point */
#ifdef HAVE_OVERCLOCK #ifdef HAVE_OVERCLOCK
config.overclock = 100; config.overclock = 100;
@ -1104,6 +1105,21 @@ static void check_variables(void)
m68k.aerr_enabled = config.addr_error = 0; m68k.aerr_enabled = config.addr_error = 0;
} }
var.key = "genesis_plus_gx_add_on";
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
{
orig_value = config.add_on;
if (var.value && !strcmp(var.value, "sega/mega cd"))
config.add_on = HW_ADDON_MEGACD;
else if (var.value && !strcmp(var.value, "megasd"))
config.add_on = HW_ADDON_MEGASD;
else if (var.value && !strcmp(var.value, "none"))
config.add_on = HW_ADDON_NONE;
else
config.add_on = HW_ADDON_AUTO;
/* note: game needs to be reloaded for change to take effect */
}
var.key = "genesis_plus_gx_lock_on"; var.key = "genesis_plus_gx_lock_on";
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
{ {
@ -1986,6 +2002,7 @@ void retro_set_environment(retro_environment_t cb)
{ "genesis_plus_gx_bios", "System bootrom; disabled|enabled" }, { "genesis_plus_gx_bios", "System bootrom; disabled|enabled" },
{ "genesis_plus_gx_bram", "CD System BRAM; per bios|per game" }, { "genesis_plus_gx_bram", "CD System BRAM; per bios|per game" },
{ "genesis_plus_gx_addr_error", "68k address error; enabled|disabled" }, { "genesis_plus_gx_addr_error", "68k address error; enabled|disabled" },
{ "genesis_plus_gx_add_on", "CD add-on (MD mode); auto|sega/mega cd|megasd|none" },
{ "genesis_plus_gx_lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" }, { "genesis_plus_gx_lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" },
{ "genesis_plus_gx_ym2413", "Master System FM (YM2413); auto|disabled|enabled" }, { "genesis_plus_gx_ym2413", "Master System FM (YM2413); auto|disabled|enabled" },
#ifdef HAVE_OPLL_CORE #ifdef HAVE_OPLL_CORE

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX libretro port * Genesis Plus GX libretro port
* *
* Copyright Eke-Eke (2007-2016) * Copyright Eke-Eke (2007-2021)
* *
* Copyright Daniel De Matteis (2012-2016) * Copyright Daniel De Matteis (2012-2016)
* *
@ -118,6 +118,7 @@ typedef struct
uint8 addr_error; uint8 addr_error;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 add_on;
uint8 overscan; uint8 overscan;
uint8 aspect_ratio; uint8 aspect_ratio;
uint8 ntsc; uint8 ntsc;

View File

@ -86,7 +86,8 @@ OBJECTS += $(OBJDIR)/sram.o \
$(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_i2c.o \
$(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/eeprom_spi.o \
$(OBJDIR)/md_cart.o \ $(OBJDIR)/md_cart.o \
$(OBJDIR)/sms_cart.o $(OBJDIR)/sms_cart.o \
$(OBJDIR)/megasd.o
OBJECTS += $(OBJDIR)/scd.o \ OBJECTS += $(OBJDIR)/scd.o \
$(OBJDIR)/cdd.o \ $(OBJDIR)/cdd.o \

View File

@ -32,6 +32,7 @@ void set_config_defaults(void)
config.addr_error = 1; config.addr_error = 1;
config.bios = 0; config.bios = 0;
config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */
config.add_on = 0; /* = HW_ADDON_AUTO (or HW_ADDON_MEGACD, HW_ADDON_MEGASD & HW_ADDON_NONE) */
config.ntsc = 0; config.ntsc = 0;
config.lcd = 0; /* 0.8 fixed point */ config.lcd = 0; /* 0.8 fixed point */

View File

@ -39,6 +39,7 @@ typedef struct
uint8 addr_error; uint8 addr_error;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 add_on;
uint8 hot_swap; uint8 hot_swap;
uint8 invert_mouse; uint8 invert_mouse;
uint8 gun_cursor[2]; uint8 gun_cursor[2];

View File

@ -96,7 +96,8 @@ OBJECTS += $(OBJDIR)/sram.o \
$(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_i2c.o \
$(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/eeprom_spi.o \
$(OBJDIR)/md_cart.o \ $(OBJDIR)/md_cart.o \
$(OBJDIR)/sms_cart.o $(OBJDIR)/sms_cart.o \
$(OBJDIR)/megasd.o
OBJECTS += $(OBJDIR)/scd.o \ OBJECTS += $(OBJDIR)/scd.o \
$(OBJDIR)/cdd.o \ $(OBJDIR)/cdd.o \

View File

@ -96,7 +96,8 @@ OBJECTS += $(OBJDIR)/sram.o \
$(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_i2c.o \
$(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/eeprom_spi.o \
$(OBJDIR)/md_cart.o \ $(OBJDIR)/md_cart.o \
$(OBJDIR)/sms_cart.o $(OBJDIR)/sms_cart.o \
$(OBJDIR)/megasd.o
OBJECTS += $(OBJDIR)/scd.o \ OBJECTS += $(OBJDIR)/scd.o \
$(OBJDIR)/cdd.o \ $(OBJDIR)/cdd.o \

View File

@ -34,7 +34,8 @@ void set_config_defaults(void)
config.force_dtack = 0; config.force_dtack = 0;
config.addr_error = 1; config.addr_error = 1;
config.bios = 0; config.bios = 0;
config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.lock_on = 0; /* = OFF (or TYPE_SK, TYPE_GG & TYPE_AR) */
config.add_on = 0; /* = HW_ADDON_AUTO (or HW_ADDON_MEGACD, HW_ADDON_MEGASD & HW_ADDON_ONE) */
config.ntsc = 0; config.ntsc = 0;
config.lcd = 0; /* 0.8 fixed point */ config.lcd = 0; /* 0.8 fixed point */

View File

@ -39,6 +39,7 @@ typedef struct
uint8 addr_error; uint8 addr_error;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 add_on;
uint8 hot_swap; uint8 hot_swap;
uint8 invert_mouse; uint8 invert_mouse;
uint8 gun_cursor[2]; uint8 gun_cursor[2];