- annual code cleanup ;-)
- added port $3E emulation (SMS, GG) - added SMS & GG BIOS support - added an option to run BIOS without cartridge - added separate ROM browsers for SG-1000, Master System, Game Gear & Mega Drive / Genesis - changed Cheat menu icon - moved ROM device selection (SD,USB,DVD) to menu options - moved savestate compression/decompression out of emulator core - removed useless background images & background color option - prevented deletion of cheat files when no valid codes are found left - added IOS patch on startup to fix Homebrew Channel network bug when <no_ios_reload> option is used [GUI] -
@ -199,44 +199,39 @@ void md_cart_init(void)
|
||||
CARTRIDGE ROM MIRRORING
|
||||
***************************************************************************************************************
|
||||
|
||||
Cartridge area is mapped to $000000-$3fffff:
|
||||
MD Cartridge area is mapped to $000000-$3fffff:
|
||||
|
||||
-> when accessing ROM, 68k address lines A1 to A21 are used by the internal cartridge hardware to decode the
|
||||
-> when accessing ROM, 68k address lines A1 to A21 can be used by the internal cartridge hardware to decode
|
||||
full 4MB address range.
|
||||
-> depending on the ROM total size, some address lines might be ignored, resulting in ROM mirroring.
|
||||
|
||||
-> depending on ROM total size and additional decoding hardware, some address lines might be ignored,
|
||||
resulting in ROM mirroring.
|
||||
|
||||
Cartridges can use either 8-bits (x2) or 16-bits (x1, x2) Mask ROM chips, each chip size is a factor of 2 bytes:
|
||||
|
||||
-> two 8-bits chips are equivalent to one 16-bits chip, no specific address decoding is required, needed
|
||||
address lines are simply connected to each chip, upper address lines are ignored and data lines are
|
||||
connected appropriately to each chip (D0-D7 to one chip, D8-D15 to the other one).
|
||||
ROM is mirrored each N bytes where N=2^(k+1) is the total ROM size (ROM1+ROM2,ROM1+ROM2,...).
|
||||
ROM is generally mirrored each N bytes where N=2^(k+1) is the total ROM size (ROM1+ROM2,ROM1+ROM2,...)
|
||||
|
||||
-> one single 16-bits chip do not need specific address decoding, address lines are simply connected
|
||||
depending on the ROM size, upper address lines being ignored.
|
||||
ROM is mirrored each N bytes where N=2^k is the size of the ROM chip (ROM1,ROM1,ROM1,...).
|
||||
ROM is generally mirrored each N bytes where N=2^k is the size of the ROM chip (ROM1,ROM1,ROM1,...)
|
||||
|
||||
-> two 16-bits chips of the same size are equivalent to one chip of double size, address decoding generally
|
||||
is the same except that specific hardware is used (one address line is generally used for chip selection,
|
||||
lower ones being used to address the chips and upper ones being ignored).
|
||||
ROM is mirrored continuously each N bytes where N=2^(k+1) is the total ROM size (ROM1,ROM2,ROM1,ROM2,...).
|
||||
ROM is generally mirrored each N bytes where N=2^(k+1) is the total ROM size (ROM1,ROM2,ROM1,ROM2,...)
|
||||
|
||||
-> two 16-bits chips with different size are mapped differently. Address decoding is done the same way as
|
||||
above (one address line used for chip selection) but the ignored & required address lines differ from
|
||||
one chip to another, which makes ROM mirroring different.
|
||||
ROM2 size is generally half of ROM1 size and ROM are mirrored like that : ROM1,ROM2,ROM2,ROM1,ROM2,ROM2,...
|
||||
ROM2 size is generally half of ROM1 size and upper half ignored (ROM1,ROM2,XXXX,ROM1,ROM2,XXXX,...)
|
||||
|
||||
From the emulator point of view, we only need to distinguish 3 cases:
|
||||
From the emulator point of view, we only need to distinguish 2 cases:
|
||||
|
||||
1/ total ROM size is a factor of 2: ROM is mirrored each 2^k bytes.
|
||||
|
||||
2/ total ROM size is not a factor of 2 and cartridge uses one or two chips of the same size (Type A):
|
||||
ROM is padded up to 2^k and mirrored each 2^k bytes.
|
||||
|
||||
3/ total ROM size is not a factor of 2 and cartridge uses two chips of different sizes (Type B):
|
||||
ROM is not padded and the first 2^(k-1) bytes are mirrored each 2^k bytes while the next 2^(k-2) bytes are
|
||||
mirrored in the last 2^(k-2) bytes.
|
||||
2/ total ROM size is not a factor of 2: ROM is padded up to 2^k then mirrored each 2^k bytes.
|
||||
|
||||
******************************************************************************************************************/
|
||||
|
||||
@ -246,20 +241,11 @@ void md_cart_init(void)
|
||||
size <<= 1;
|
||||
|
||||
/* total ROM size is not a factor of 2 */
|
||||
/* TODO: handle more possible ROM configurations (using cartridge database ???) */
|
||||
/* TODO: handle all possible ROM configurations using cartridge database */
|
||||
if ((size < MAXROMSIZE) && (cart.romsize < size))
|
||||
{
|
||||
/* two chips with different size */
|
||||
if (config.romtype)
|
||||
{
|
||||
/* third ROM section is mirrored in the last section */
|
||||
memcpy(cart.rom + cart.romsize, cart.rom + 2*cart.romsize - size, size - cart.romsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ROM is padded up to 2^k bytes */
|
||||
memset(cart.rom + cart.romsize, 0xff, size - cart.romsize);
|
||||
}
|
||||
/* ROM is padded up to 2^k bytes */
|
||||
memset(cart.rom + cart.romsize, 0xff, size - cart.romsize);
|
||||
}
|
||||
|
||||
/* special case: Sonic & Knuckles */
|
||||
@ -521,47 +507,43 @@ void md_cart_init(void)
|
||||
|
||||
case TYPE_SK:
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
/* store S&K ROM above cartridge ROM + SRAM */
|
||||
if (cart.romsize > 0x600000) break;
|
||||
|
||||
/* load Sonic & Knuckles ROM (2 MBytes) */
|
||||
FILE *f = fopen(SK_ROM,"r+b");
|
||||
f = fopen(SK_ROM,"r+b");
|
||||
if (!f) break;
|
||||
int done = 0;
|
||||
while (done < 0x200000)
|
||||
for (i=0; i<0x200000; i+=0x1000)
|
||||
{
|
||||
fread(cart.rom + 0x600000 + done, 2048, 1, f);
|
||||
done += 2048;
|
||||
fread(cart.rom + 0x600000 + i, 0x1000, 1, f);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
/* load Sonic 2 UPMEM ROM (256 KBytes) */
|
||||
f = fopen(SK_UPMEM,"r+b");
|
||||
if (!f) break;
|
||||
done = 0;
|
||||
while (done < 0x40000)
|
||||
for (i=0; i<0x40000; i+=0x1000)
|
||||
{
|
||||
fread(cart.rom + 0x800000 + done, 2048, 1, f);
|
||||
done += 2048;
|
||||
fread(cart.rom + 0x800000 + i, 0x1000, 1, f);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
#ifdef LSB_FIRST
|
||||
/* Byteswap ROM */
|
||||
int i;
|
||||
uint8 temp;
|
||||
for(i = 0; i < 0x240000; i += 2)
|
||||
for (i=0; i<0x240000; i+=2)
|
||||
{
|
||||
temp = cart.rom[i + 0x600000];
|
||||
/* Byteswap ROM */
|
||||
uint8 temp = cart.rom[i + 0x600000];
|
||||
cart.rom[i + 0x600000] = cart.rom[i + 0x600000 + 1];
|
||||
cart.rom[i + 0x600000 + 1] = temp;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*$000000-$1FFFFF is mapped to S&K ROM */
|
||||
/* $000000-$1FFFFF is mapped to S&K ROM */
|
||||
for (i=0x00; i<0x20; i++)
|
||||
{
|
||||
m68k_memory_map[i].base = (cart.rom + 0x600000) + (i<<16);
|
||||
m68k_memory_map[i].base = cart.rom + 0x600000 + (i << 16);
|
||||
}
|
||||
|
||||
cart.special |= HW_LOCK_ON;
|
||||
@ -586,11 +568,12 @@ void md_cart_init(void)
|
||||
if ((rominfo.checksum == rom_database[i].chk_1) &&
|
||||
(rominfo.realchecksum == rom_database[i].chk_2))
|
||||
{
|
||||
int j = rom_database[i].bank_start;
|
||||
|
||||
/* retrieve hardware information */
|
||||
memcpy(&cart.hw, &(rom_database[i].cart_hw), sizeof(T_CART_HW));
|
||||
|
||||
/* initialize memory handlers for $400000-$7FFFFF region */
|
||||
int j = rom_database[i].bank_start;
|
||||
while (j <= rom_database[i].bank_end)
|
||||
{
|
||||
if (cart.hw.regs_r)
|
||||
@ -739,9 +722,6 @@ void md_cart_reset(int hard_reset)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* save default cartridge slot mapping */
|
||||
cart.base = m68k_memory_map[0].base;
|
||||
}
|
||||
|
||||
int md_cart_context_save(uint8 *state)
|
||||
@ -880,17 +860,17 @@ static void mapper_sega_w(uint32 data)
|
||||
static void mapper_ssf2_w(uint32 address, uint32 data)
|
||||
{
|
||||
/* 8 x 512k banks */
|
||||
uint32 dst = (address << 2) & 0x38;
|
||||
address = (address << 2) & 0x38;
|
||||
|
||||
/* bank 0 remains unchanged */
|
||||
if (dst)
|
||||
if (address)
|
||||
{
|
||||
uint32 i;
|
||||
uint8 *src = cart.rom + (data << 19);
|
||||
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
m68k_memory_map[dst++].base = src + (i<<16);
|
||||
m68k_memory_map[address++].base = src + (i<<16);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -946,16 +926,18 @@ static void mapper_realtec_w(uint32 address, uint32 data)
|
||||
/* 00000yy1 */
|
||||
cart.hw.regs[1] = data & 6;
|
||||
|
||||
/* mapped start address is 00yy xxx0 0000 0000 0000 0000 */
|
||||
uint32 base = (cart.hw.regs[0] << 1) | (cart.hw.regs[1] << 3);
|
||||
|
||||
/* ensure mapped size is not null */
|
||||
if (cart.hw.regs[2])
|
||||
{
|
||||
/* mapped start address is 00yy xxx0 0000 0000 0000 0000 */
|
||||
uint32 base = (cart.hw.regs[0] << 1) | (cart.hw.regs[1] << 3);
|
||||
|
||||
/* selected blocks are mirrored into the whole cartridge area */
|
||||
int i;
|
||||
for (i=0x00; i<0x40; i++)
|
||||
{
|
||||
m68k_memory_map[i].base = &cart.rom[(base + (i % cart.hw.regs[2])) << 16];
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -1144,6 +1126,8 @@ static void default_regs_w(uint32 address, uint32 data)
|
||||
/* custom register hardware (Top Fighter, Lion King III, Super Donkey Kong 99, Mulan, Pocket Monsters II, Pokemon Stadium) */
|
||||
static void custom_regs_w(uint32 address, uint32 data)
|
||||
{
|
||||
uint8 temp;
|
||||
|
||||
/* ROM bankswitch */
|
||||
if ((address >> 16) > 0x6f)
|
||||
{
|
||||
@ -1155,7 +1139,7 @@ static void custom_regs_w(uint32 address, uint32 data)
|
||||
default_regs_w(address, data);
|
||||
|
||||
/* bitswapping */
|
||||
uint32 temp = cart.hw.regs[0];
|
||||
temp = cart.hw.regs[0];
|
||||
switch (cart.hw.regs[1] & 3)
|
||||
{
|
||||
case 0:
|
||||
|
@ -39,13 +39,14 @@
|
||||
#ifndef _SMS_CART_H_
|
||||
#define _SMS_CART_H_
|
||||
|
||||
/* Special hardware (0x01 reserved for Master System 3-D glasses) */
|
||||
/* Special hardware */
|
||||
#define HW_3D_GLASSES 0x01
|
||||
#define HW_TEREBI_OEKAKI 0x02
|
||||
|
||||
/* Function prototypes */
|
||||
extern void sms_cart_init(void);
|
||||
extern void sms_cart_reset(void);
|
||||
extern void sms_cart_switch(int enabled);
|
||||
extern void sms_cart_switch(uint8 mode);
|
||||
extern int sms_cart_region_detect(void);
|
||||
extern int sms_cart_context_save(uint8 *state);
|
||||
extern int sms_cart_context_load(uint8 *state);
|
||||
|
@ -59,7 +59,7 @@ void sram_init()
|
||||
{
|
||||
memset (&sram, 0, sizeof (T_SRAM));
|
||||
|
||||
/* store SRAM into cartridge area */
|
||||
/* SRAM data is stored above cartridge ROM area, at $500000-$50FFFF (max. 64K) */
|
||||
if (cart.romsize > 0x500000) return;
|
||||
sram.sram = cart.rom + 0x500000;
|
||||
|
||||
@ -87,13 +87,14 @@ void sram_init()
|
||||
}
|
||||
else
|
||||
{
|
||||
/* default SRAM region */
|
||||
sram.start = 0x200000;
|
||||
sram.end = 0x20ffff;
|
||||
|
||||
/* enable SRAM only if ROM < 2MB */
|
||||
if (cart.romsize <= sram.start)
|
||||
/* by default, enable SRAM only for ROM <= 2MB */
|
||||
if (cart.romsize <= 0x200000)
|
||||
{
|
||||
/* SRAM mapped to $200000-$20ffff */
|
||||
sram.start = 0x200000;
|
||||
sram.end = 0x20ffff;
|
||||
sram.on = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* autodetect some games with bad header or specific configuration */
|
||||
|
@ -41,16 +41,15 @@
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
uint8 tmss[4]; /* TMSS security register */
|
||||
uint8 bios_rom[0x800]; /* OS ROM */
|
||||
uint8 boot_rom[0x800]; /* Genesis BOOT ROM */
|
||||
uint8 work_ram[0x10000]; /* 68K RAM */
|
||||
uint8 zram[0x2000]; /* Z80 RAM */
|
||||
uint32 zbank; /* Z80 bank window address */
|
||||
uint8 zstate; /* Z80 bus state (d0 = BUSACK, d1 = /RESET) */
|
||||
uint8 pico_current; /* PICO current page */
|
||||
uint8 pico_page[7]; /* PICO page registers */
|
||||
|
||||
/* PICO data */
|
||||
uint8 pico_current;
|
||||
uint8 pico_page[7];
|
||||
static uint8 tmss[4]; /* TMSS security register */
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* Init, reset, shutdown functions */
|
||||
@ -90,7 +89,7 @@ void gen_init(void)
|
||||
m68k_memory_map[i].read16 = NULL;
|
||||
m68k_memory_map[i].write8 = NULL;
|
||||
m68k_memory_map[i].write16 = NULL;
|
||||
zbank_memory_map[i].read = NULL;
|
||||
zbank_memory_map[i].read = zbank_unused_r;
|
||||
zbank_memory_map[i].write = NULL;
|
||||
}
|
||||
|
||||
@ -153,13 +152,13 @@ void gen_init(void)
|
||||
|
||||
/* page registers */
|
||||
pico_current = 0x00;
|
||||
pico_page[0] = 0x00;
|
||||
pico_page[1] = 0x01;
|
||||
pico_page[2] = 0x03;
|
||||
pico_page[3] = 0x07;
|
||||
pico_page[4] = 0x0F;
|
||||
pico_page[5] = 0x1F;
|
||||
pico_page[6] = 0x3F;
|
||||
pico_regs[0] = 0x00;
|
||||
pico_regs[1] = 0x01;
|
||||
pico_regs[2] = 0x03;
|
||||
pico_regs[3] = 0x07;
|
||||
pico_regs[4] = 0x0F;
|
||||
pico_regs[5] = 0x1F;
|
||||
pico_regs[6] = 0x3F;
|
||||
|
||||
/* initialize cartridge hardware */
|
||||
md_cart_init();
|
||||
@ -219,9 +218,9 @@ void gen_reset(int hard_reset)
|
||||
/* System Reset */
|
||||
if (hard_reset)
|
||||
{
|
||||
/* clear RAM */
|
||||
memset (work_ram, 0x00, sizeof (work_ram));
|
||||
memset (zram, 0x00, sizeof (zram));
|
||||
/* clear RAM (TODO: use random bit patterns as on real hardware) */
|
||||
memset(work_ram, 0x00, sizeof (work_ram));
|
||||
memset(zram, 0x00, sizeof (zram));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -232,9 +231,10 @@ void gen_reset(int hard_reset)
|
||||
/* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */
|
||||
mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX));
|
||||
|
||||
/* Genesis / Master System modes */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
/* reset cartridge hardware */
|
||||
/* reset cartridge hardware & mapping */
|
||||
md_cart_reset(hard_reset);
|
||||
|
||||
/* Z80 bus is released & Z80 is reseted */
|
||||
@ -247,17 +247,18 @@ void gen_reset(int hard_reset)
|
||||
/* assume default bank is $000000-$007FFF */
|
||||
zbank = 0;
|
||||
|
||||
/* TMSS & OS ROM support */
|
||||
if (config.tmss & 1)
|
||||
/* TMSS support */
|
||||
if ((config.bios & 1) && (system_hw != SYSTEM_PICO))
|
||||
{
|
||||
/* on HW reset only */
|
||||
if (hard_reset)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* clear TMSS register */
|
||||
memset(tmss, 0x00, sizeof(tmss));
|
||||
|
||||
/* VDP access is locked by default */
|
||||
int i;
|
||||
for (i=0xc0; i<0xe0; i+=8)
|
||||
{
|
||||
m68k_memory_map[i].read8 = m68k_lockup_r_8;
|
||||
@ -268,10 +269,14 @@ void gen_reset(int hard_reset)
|
||||
zbank_memory_map[i].write = zbank_lockup_w;
|
||||
}
|
||||
|
||||
/* OS ROM is mapped at $000000-$0007FF */
|
||||
if (config.tmss & 2)
|
||||
/* check if BOOT ROM is loaded */
|
||||
if (config.bios & SYSTEM_MD)
|
||||
{
|
||||
m68k_memory_map[0].base = bios_rom;
|
||||
/* save default cartridge slot mapping */
|
||||
cart.base = m68k_memory_map[0].base;
|
||||
|
||||
/* BOOT ROM is mapped at $000000-$0007FF */
|
||||
m68k_memory_map[0].base = boot_rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -281,16 +286,13 @@ void gen_reset(int hard_reset)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Z80 cycles should a multiple of 15 to avoid rounding errors */
|
||||
/* Z80 cycles should be a multiple of 15 to avoid rounding errors */
|
||||
mcycles_z80 = (mcycles_z80 / 15) * 15;
|
||||
|
||||
/* reset cartridge hardware */
|
||||
sms_cart_reset();
|
||||
|
||||
/* Z80 is running */
|
||||
zstate = 1;
|
||||
|
||||
/* 68k is halted (/VRES is forced low) */
|
||||
/* halt 68k (/VRES is forced low) */
|
||||
m68k_pulse_halt();
|
||||
}
|
||||
|
||||
@ -310,11 +312,12 @@ void gen_shutdown(void)
|
||||
|
||||
void gen_tmss_w(unsigned int offset, unsigned int data)
|
||||
{
|
||||
/* write TMSS regisiter */
|
||||
int i;
|
||||
|
||||
/* write TMSS register */
|
||||
WRITE_WORD(tmss, offset, data);
|
||||
|
||||
/* VDP requires "SEGA" value to be written in TMSS register */
|
||||
int i;
|
||||
if (strncmp((char *)tmss, "SEGA", 4) == 0)
|
||||
{
|
||||
for (i=0xc0; i<0xe0; i+=8)
|
||||
@ -343,23 +346,15 @@ void gen_tmss_w(unsigned int offset, unsigned int data)
|
||||
|
||||
void gen_bankswitch_w(unsigned int data)
|
||||
{
|
||||
/* OS ROM has not been loaded yet */
|
||||
if (!(config.tmss & 2))
|
||||
{
|
||||
config.tmss |= 2;
|
||||
memcpy(bios_rom, cart.rom, 0x800);
|
||||
memset(cart.rom, 0xff, cart.romsize);
|
||||
}
|
||||
|
||||
if (data & 1)
|
||||
{
|
||||
/* enable CART */
|
||||
/* enable cartridge ROM */
|
||||
m68k_memory_map[0].base = cart.base;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* enable internal BIOS ROM */
|
||||
m68k_memory_map[0].base = bios_rom;
|
||||
/* enable internal BOOT ROM */
|
||||
m68k_memory_map[0].base = boot_rom;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,8 +43,7 @@
|
||||
#define _GENESIS_H_
|
||||
|
||||
/* Global variables */
|
||||
extern uint8 tmss[4];
|
||||
extern uint8 bios_rom[0x800];
|
||||
extern uint8 boot_rom[0x800];
|
||||
extern uint8 work_ram[0x10000];
|
||||
extern uint8 zram[0x2000];
|
||||
extern uint32 zbank;
|
||||
|
@ -109,9 +109,8 @@ void config_default(void)
|
||||
config.region_detect = 0; /* AUTO */
|
||||
config.force_dtack = 0;
|
||||
config.addr_error = 1;
|
||||
config.tmss = 0;
|
||||
config.bios = 0;
|
||||
config.lock_on = 0;
|
||||
config.romtype = 0;
|
||||
config.hot_swap = 0;
|
||||
|
||||
/* video options */
|
||||
@ -154,29 +153,44 @@ void config_default(void)
|
||||
#endif
|
||||
config.s_default = 1;
|
||||
config.s_device = 0;
|
||||
config.bg_type = 0;
|
||||
config.bg_overlay = 1;
|
||||
config.l_device = 0;
|
||||
config.bg_overlay = 0;
|
||||
config.screen_w = 658;
|
||||
config.bgm_volume = 100.0;
|
||||
config.sfx_volume = 100.0;
|
||||
|
||||
/* default ROM directories */
|
||||
#ifdef HW_RVL
|
||||
sprintf (config.lastdir[TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[TYPE_USB], "usb:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[3][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[0][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[1][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[2][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[3][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
#else
|
||||
sprintf (config.lastdir[TYPE_SD], "%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[3][TYPE_SD], "%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
|
||||
#endif
|
||||
|
||||
/* try to restore settings from config file */
|
||||
if (!config_load()) GUI_WaitPrompt("Info","Default Settings restored");
|
||||
|
||||
/* hot swap requires at least a first initialization */
|
||||
config.hot_swap &= 1;
|
||||
|
||||
/* restore inputs */
|
||||
input_init();
|
||||
|
||||
/* restore menu settings */
|
||||
menu_configure();
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#define CONFIG_VERSION "GENPLUS-GX 1.6.0"
|
||||
#define CONFIG_VERSION "GENPLUS-GX 1.6.1"
|
||||
|
||||
/****************************************************************************
|
||||
* Config Option
|
||||
@ -68,9 +68,9 @@ typedef struct
|
||||
uint8 force_dtack;
|
||||
uint8 addr_error;
|
||||
uint8 tmss;
|
||||
uint8 bios;
|
||||
uint8 lock_on;
|
||||
uint8 hot_swap;
|
||||
uint8 romtype;
|
||||
uint8 invert_mouse;
|
||||
uint8 gun_cursor[2];
|
||||
uint8 overscan;
|
||||
@ -97,16 +97,15 @@ typedef struct
|
||||
uint8 s_auto;
|
||||
uint8 s_default;
|
||||
uint8 s_device;
|
||||
uint8 autocheats;
|
||||
int8 bg_type;
|
||||
int8 bg_overlay;
|
||||
uint8 l_device;
|
||||
uint8 bg_overlay;
|
||||
int16 screen_w;
|
||||
float bgm_volume;
|
||||
float sfx_volume;
|
||||
#ifdef HW_RVL
|
||||
char lastdir[3][MAXPATHLEN];
|
||||
char lastdir[4][3][MAXPATHLEN];
|
||||
#else
|
||||
char lastdir[2][MAXPATHLEN];
|
||||
char lastdir[4][2][MAXPATHLEN];
|
||||
#endif
|
||||
} t_config;
|
||||
|
||||
|
@ -71,6 +71,9 @@ static char *fileDir;
|
||||
/* current device */
|
||||
static int deviceType = -1;
|
||||
|
||||
/* current file type */
|
||||
static int fileType = -1;
|
||||
|
||||
/* DVD status flag */
|
||||
static u8 dvd_mounted = 0;
|
||||
|
||||
@ -139,16 +142,6 @@ static int FileSortCallback(const void *f1, const void *f2)
|
||||
return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* GetCurrentDirectory
|
||||
*
|
||||
* Return current browser directory
|
||||
***************************************************************************/
|
||||
char *GetCurrentDirectory(int selection)
|
||||
{
|
||||
return (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* UpdateDirectory
|
||||
*
|
||||
@ -248,10 +241,11 @@ int ParseDirectory(void)
|
||||
****************************************************************************/
|
||||
int LoadFile(int selection)
|
||||
{
|
||||
int filetype;
|
||||
char filename[MAXPATHLEN];
|
||||
|
||||
/* file path */
|
||||
char *filepath = GetCurrentDirectory(selection);
|
||||
char *filepath = (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir;
|
||||
|
||||
/* full filename */
|
||||
sprintf(filename, "%s%s", filepath, filelist[selection].filename);
|
||||
@ -273,37 +267,35 @@ int LoadFile(int selection)
|
||||
|
||||
if (size > 0)
|
||||
{
|
||||
/* add/move the file to the top of the history. */
|
||||
history_add_file(filepath, filelist[selection].filename);
|
||||
|
||||
/* recent file list has changed */
|
||||
if (deviceType == TYPE_RECENT) deviceType = -1;
|
||||
|
||||
/* auto-save previous game state */
|
||||
if (config.s_auto & 2)
|
||||
{
|
||||
slot_autosave(config.s_default,config.s_device);
|
||||
}
|
||||
|
||||
/* ROM pathname for screenshot, save & cheat files */
|
||||
/* update ROM pathname for screenshot, save & cheat files */
|
||||
if (!strnicmp(".sms", &filename[strlen(filename) - 4], 4))
|
||||
{
|
||||
/* Master System ROM file */
|
||||
filetype = 1;
|
||||
sprintf(rom_filename,"ms/%s",filelist[selection].filename);
|
||||
}
|
||||
else if (!strnicmp(".gg", &filename[strlen(filename) - 3], 3))
|
||||
{
|
||||
/* Game Gear ROM file */
|
||||
filetype = 2;
|
||||
sprintf(rom_filename,"gg/%s",filelist[selection].filename);
|
||||
}
|
||||
else if (!strnicmp(".sg", &filename[strlen(filename) - 3], 3))
|
||||
{
|
||||
/* SG-1000 ROM file */
|
||||
/* SG-1000 ROM file */
|
||||
filetype = 3;
|
||||
sprintf(rom_filename,"sg/%s",filelist[selection].filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* otherwise, it's Genesis ROM file */
|
||||
/* by default, Genesis ROM file */
|
||||
filetype = 0;
|
||||
sprintf(rom_filename,"md/%s",filelist[selection].filename);
|
||||
}
|
||||
|
||||
@ -312,6 +304,12 @@ int LoadFile(int selection)
|
||||
while ((i > 0) && (rom_filename[i] != '.')) i--;
|
||||
if (i > 0) rom_filename[i] = 0;
|
||||
|
||||
/* add/move the file to the top of the history. */
|
||||
history_add_file(filepath, filelist[selection].filename, filetype);
|
||||
|
||||
/* recent file list may have changed */
|
||||
if (deviceType == TYPE_RECENT) deviceType = -1;
|
||||
|
||||
/* valid ROM has been loaded */
|
||||
return 1;
|
||||
}
|
||||
@ -324,7 +322,7 @@ int LoadFile(int selection)
|
||||
*
|
||||
* Function to open a directory and load ROM file list.
|
||||
****************************************************************************/
|
||||
int OpenDirectory(int device)
|
||||
int OpenDirectory(int device, int type)
|
||||
{
|
||||
int max = 0;
|
||||
|
||||
@ -368,7 +366,7 @@ int OpenDirectory(int device)
|
||||
}
|
||||
|
||||
/* parse last directory */
|
||||
fileDir = config.lastdir[device];
|
||||
fileDir = config.lastdir[type][device];
|
||||
max = ParseDirectory();
|
||||
if (max <= 0)
|
||||
{
|
||||
@ -390,11 +388,12 @@ int OpenDirectory(int device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check if device type has changed */
|
||||
if (device != deviceType)
|
||||
/* check if device or file type has changed */
|
||||
if ((device != deviceType) || (type != fileType))
|
||||
{
|
||||
/* reset current device type */
|
||||
/* reset current types */
|
||||
deviceType = device;
|
||||
fileType = type;
|
||||
|
||||
/* reset File selector */
|
||||
ClearSelector(max);
|
||||
|
@ -52,8 +52,7 @@
|
||||
|
||||
#define CHUNKSIZE (2048)
|
||||
|
||||
extern int OpenDirectory(int device);
|
||||
extern char *GetCurrentDirectory(int selection);
|
||||
extern int OpenDirectory(int device, int type);
|
||||
extern int UpdateDirectory(bool go_up, char *filename);
|
||||
extern int ParseDirectory(void);
|
||||
extern int LoadFile(int selection);
|
||||
|
@ -51,7 +51,7 @@ t_history history;
|
||||
* already in the list then the existing entry is (in effect) moved to the
|
||||
* top instead.
|
||||
****************************************************************************/
|
||||
void history_add_file(char *filepath, char *filename)
|
||||
void history_add_file(char *filepath, char *filename, u8 filetype)
|
||||
{
|
||||
/* Create the new entry for this path. */
|
||||
t_history_entry newentry;
|
||||
@ -59,6 +59,7 @@ void history_add_file(char *filepath, char *filename)
|
||||
strncpy(newentry.filename, filename, MAXJOLIET - 1);
|
||||
newentry.filepath[MAXJOLIET - 1] = '\0';
|
||||
newentry.filename[MAXJOLIET - 1] = '\0';
|
||||
newentry.filetype = filetype;
|
||||
|
||||
t_history_entry oldentry; /* Old entry is the one being shuffled down a spot. */
|
||||
t_history_entry currentry; /* Curr entry is the one that just replaced old path. */
|
||||
@ -112,7 +113,13 @@ void history_load(void)
|
||||
if (fp)
|
||||
{
|
||||
/* read file */
|
||||
fread(&history, sizeof(history), 1, fp);
|
||||
if (fread(&history, sizeof(history), 1, fp) != 1)
|
||||
{
|
||||
/* an error ocurred, better clear hoistory */
|
||||
memset(&history, 0, sizeof(history));
|
||||
}
|
||||
|
||||
/* close file */
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ typedef struct
|
||||
{
|
||||
char filepath[MAXJOLIET];
|
||||
char filename[MAXJOLIET];
|
||||
u8 filetype;
|
||||
} t_history_entry;
|
||||
|
||||
typedef struct
|
||||
@ -60,7 +61,7 @@ typedef struct
|
||||
} t_history;
|
||||
|
||||
extern t_history history;
|
||||
extern void history_add_file(char *filepath, char *filename);
|
||||
extern void history_add_file(char *filepath, char *filename, u8 filetype);
|
||||
extern void history_save(void);
|
||||
extern void history_load(void);
|
||||
extern void history_default(void);
|
||||
|
@ -131,7 +131,7 @@ static gui_item action_select =
|
||||
/*****************************************************************************/
|
||||
static gui_image bg_cheats[7] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,374,140,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255},
|
||||
@ -830,26 +830,6 @@ void CheatMenu(void)
|
||||
/* reset scrolling */
|
||||
string_offset = 0;
|
||||
|
||||
/* background type */
|
||||
if (config.bg_type > 0)
|
||||
{
|
||||
bg_cheats[0].state &= ~IMAGE_REPEAT;
|
||||
bg_cheats[0].data = (config.bg_type > 1) ? Bg_main_png : Bg_main_2_png;
|
||||
bg_cheats[0].x = 374;
|
||||
bg_cheats[0].y = 140;
|
||||
bg_cheats[0].w = 284;
|
||||
bg_cheats[0].h = 288;
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_cheats[0].state |= IMAGE_REPEAT;
|
||||
bg_cheats[0].data = Bg_layer_png;
|
||||
bg_cheats[0].x = 0;
|
||||
bg_cheats[0].y = 0;
|
||||
bg_cheats[0].w = 640;
|
||||
bg_cheats[0].h = 480;
|
||||
}
|
||||
|
||||
/* background overlay */
|
||||
if (config.bg_overlay)
|
||||
{
|
||||
@ -1327,11 +1307,6 @@ void CheatMenu(void)
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* delete cheat file */
|
||||
remove(temp);
|
||||
}
|
||||
|
||||
/* unlock background elements */
|
||||
m->bg_images[2].state |= IMAGE_SLIDE_TOP;
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "font.h"
|
||||
#include "gui.h"
|
||||
#include "file_load.h"
|
||||
#include "history.h"
|
||||
|
||||
#ifdef HW_RVL
|
||||
#include <wiiuse/wpad.h>
|
||||
@ -54,7 +55,10 @@
|
||||
|
||||
extern const u8 Browser_dir_png[];
|
||||
extern const u8 Snap_empty_png[];
|
||||
extern const u8 Snap_frame_png[];
|
||||
extern const u8 Cart_md_png[];
|
||||
extern const u8 Cart_ms_png[];
|
||||
extern const u8 Cart_gg_png[];
|
||||
extern const u8 Cart_sg_png[];
|
||||
|
||||
FILEENTRIES filelist[MAXFILES];
|
||||
|
||||
@ -103,18 +107,37 @@ static gui_item action_select =
|
||||
/*****************************************************************************/
|
||||
/* GUI Background images */
|
||||
/*****************************************************************************/
|
||||
static gui_image bg_filesel[10] =
|
||||
static gui_image bg_filesel[13] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,374,140,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255},
|
||||
{NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255},
|
||||
{NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,152},
|
||||
{NULL,Frame_s2_png,0,384,264,248,140,152},
|
||||
{NULL,Snap_empty_png,IMAGE_VISIBLE,422,114,164,116,255},
|
||||
{NULL,NULL,0,424,116,160,112,255},
|
||||
{NULL,Snap_frame_png,IMAGE_VISIBLE,388,112,236,148,255}
|
||||
{NULL,Snap_empty_png,IMAGE_VISIBLE,424,148,160,112,255},
|
||||
{NULL,NULL,0,424,148,160,112,255},
|
||||
{NULL,NULL,0,388,147,240,152,255},
|
||||
{NULL,NULL,0,392,118,232,148,255},
|
||||
{NULL,NULL,0,414,116,184,188,255},
|
||||
{NULL,NULL,0,416,144,180,228,255}
|
||||
};
|
||||
|
||||
static const u8 *Cart_png[4] =
|
||||
{
|
||||
Cart_md_png,
|
||||
Cart_ms_png,
|
||||
Cart_gg_png,
|
||||
Cart_sg_png
|
||||
};
|
||||
|
||||
static const char *Cart_dir[4] =
|
||||
{
|
||||
"md",
|
||||
"ms",
|
||||
"gg",
|
||||
"sg"
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -124,7 +147,7 @@ static gui_menu menu_selector =
|
||||
{
|
||||
"Game Selection",
|
||||
-1,-1,
|
||||
0,0,10,0,
|
||||
0,0,13,0,
|
||||
NULL,
|
||||
NULL,
|
||||
bg_filesel,
|
||||
@ -241,7 +264,7 @@ static void selector_cb(void)
|
||||
* return ROM size
|
||||
*
|
||||
****************************************************************************/
|
||||
int FileSelector(void)
|
||||
int FileSelector(int type)
|
||||
{
|
||||
short p;
|
||||
int i;
|
||||
@ -255,27 +278,7 @@ int FileSelector(void)
|
||||
gui_butn *button;
|
||||
#endif
|
||||
|
||||
/* background type */
|
||||
if (config.bg_type > 0)
|
||||
{
|
||||
bg_filesel[0].state &= ~IMAGE_REPEAT;
|
||||
bg_filesel[0].data = (config.bg_type > 1) ? Bg_main_png : Bg_main_2_png;
|
||||
bg_filesel[0].x = 374;
|
||||
bg_filesel[0].y = 140;
|
||||
bg_filesel[0].w = 284;
|
||||
bg_filesel[0].h = 288;
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_filesel[0].state |= IMAGE_REPEAT;
|
||||
bg_filesel[0].data = Bg_layer_png;
|
||||
bg_filesel[0].x = 0;
|
||||
bg_filesel[0].y = 0;
|
||||
bg_filesel[0].w = 640;
|
||||
bg_filesel[0].h = 480;
|
||||
}
|
||||
|
||||
/* background overlay */
|
||||
/* Background overlay */
|
||||
if (config.bg_overlay)
|
||||
{
|
||||
bg_filesel[1].state |= IMAGE_VISIBLE;
|
||||
@ -285,6 +288,34 @@ int FileSelector(void)
|
||||
bg_filesel[1].state &= ~IMAGE_VISIBLE;
|
||||
}
|
||||
|
||||
/* Hide all cartridge labels */
|
||||
bg_filesel[9].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[10].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[11].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[12].state &= ~IMAGE_VISIBLE;
|
||||
|
||||
/* Cartridge type */
|
||||
if (type < 0)
|
||||
{
|
||||
/* Recent game list -> select all cartridge type */
|
||||
bg_filesel[9].data = Cart_png[0];
|
||||
bg_filesel[10].data = Cart_png[1];
|
||||
bg_filesel[11].data = Cart_png[2];
|
||||
bg_filesel[12].data = Cart_png[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Clear all cartridges type */
|
||||
bg_filesel[9].data = NULL;
|
||||
bg_filesel[10].data = NULL;
|
||||
bg_filesel[11].data = NULL;
|
||||
bg_filesel[12].data = NULL;
|
||||
|
||||
/* Select cartridge type */
|
||||
bg_filesel[9 + type].data = Cart_png[type];
|
||||
bg_filesel[9 + type].state |= IMAGE_VISIBLE;
|
||||
}
|
||||
|
||||
/* Initialize Menu */
|
||||
GUI_InitMenu(m);
|
||||
string_offset = 0;
|
||||
@ -303,48 +334,33 @@ int FileSelector(void)
|
||||
|
||||
if (!filelist[selection].flags)
|
||||
{
|
||||
/* get compressed file name */
|
||||
sprintf(fname, "%s/%s", GetCurrentDirectory(selection), filelist[selection].filename);
|
||||
get_zipfilename(fname);
|
||||
/* recent game list -> variable game types */
|
||||
if (type < 0)
|
||||
{
|
||||
/* hide all cartridge labels */
|
||||
bg_filesel[9].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[10].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[11].state &= ~IMAGE_VISIBLE;
|
||||
bg_filesel[12].state &= ~IMAGE_VISIBLE;
|
||||
|
||||
/* auto-detect file type */
|
||||
if (!strnicmp(".sms", &fname[strlen(fname) - 4], 4))
|
||||
{
|
||||
/* Master System ROM file */
|
||||
sprintf(fname, "%s/snaps/ms/%s", DEFAULT_PATH, filelist[selection].filename);
|
||||
}
|
||||
else if (!strnicmp(".gg", &fname[strlen(fname) - 3], 3))
|
||||
{
|
||||
/* Game Gear ROM file */
|
||||
sprintf(fname, "%s/snaps/gg/%s", DEFAULT_PATH, filelist[selection].filename);
|
||||
}
|
||||
else if (!strnicmp(".sg", &fname[strlen(fname) - 3], 3))
|
||||
{
|
||||
/* SG-1000 ROM file */
|
||||
sprintf(fname, "%s/snaps/sg/%s", DEFAULT_PATH, filelist[selection].filename);
|
||||
}
|
||||
else if ((!strnicmp(".md", &fname[strlen(fname) - 3], 3)) ||
|
||||
(!strnicmp(".gen", &fname[strlen(fname) - 4], 4)) ||
|
||||
(!strnicmp(".bin", &fname[strlen(fname) - 4], 4)) ||
|
||||
(!strnicmp(".mdx", &fname[strlen(fname) - 4], 4)) ||
|
||||
(!strnicmp(".smd", &fname[strlen(fname) - 4], 4)))
|
||||
{
|
||||
/* Genesis ROM file */
|
||||
sprintf(fname, "%s/snaps/md/%s", DEFAULT_PATH, filelist[selection].filename);
|
||||
/* detect cartridge type (0-3) */
|
||||
type = history.entries[selection].filetype;
|
||||
|
||||
/* show selected cartridge label */
|
||||
bg_filesel[9 + type].state |= IMAGE_VISIBLE;
|
||||
|
||||
/* default screenshot file path */
|
||||
sprintf(fname,"%s/snaps/%s/%s", DEFAULT_PATH, Cart_dir[type], filelist[selection].filename);
|
||||
|
||||
/* restore recent type flag */
|
||||
type = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fname[0] = 0;
|
||||
/* default screenshot file path */
|
||||
sprintf(fname,"%s/snaps/%s/%s", DEFAULT_PATH, Cart_dir[type], filelist[selection].filename);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fname[0] = 0;
|
||||
}
|
||||
|
||||
/* Supported ROM file found ? */
|
||||
if (fname[0])
|
||||
{
|
||||
/* remove original file extension */
|
||||
i = strlen(fname) - 1;
|
||||
while ((i > 0) && (fname[i] != '.')) i--;
|
||||
@ -353,7 +369,7 @@ int FileSelector(void)
|
||||
/* add PNG file extension */
|
||||
strcat(fname, ".png");
|
||||
|
||||
/* try to load screenshot */
|
||||
/* try to load screenshot file */
|
||||
snap = fopen(fname, "rb");
|
||||
if (snap)
|
||||
{
|
||||
@ -563,7 +579,7 @@ int FileSelector(void)
|
||||
selection = offset = 0;
|
||||
old = -1;
|
||||
}
|
||||
else if (fname[0])
|
||||
else
|
||||
{
|
||||
/* load ROM file from device */
|
||||
int ret = LoadFile(selection);
|
||||
@ -574,11 +590,6 @@ int FileSelector(void)
|
||||
/* return ROM size (or zero if an error occured) */
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Unsupported ROM file */
|
||||
GUI_WaitPrompt("Error","Unsupported ROM type !");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HW_RVL
|
||||
@ -605,7 +616,6 @@ int FileSelector(void)
|
||||
offset += 10;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ typedef struct
|
||||
}FILEENTRIES;
|
||||
|
||||
/* Globals */
|
||||
extern int FileSelector(void);
|
||||
extern int FileSelector(int type);
|
||||
extern void ClearSelector(u32 max);
|
||||
extern FILEENTRIES filelist[MAXFILES];
|
||||
|
||||
|
@ -51,31 +51,10 @@ u8 SILENT = 0;
|
||||
static gui_message message_box;
|
||||
static lwp_t msgboxthread;
|
||||
|
||||
/* background color */
|
||||
static GXColor bg_color;
|
||||
/* background color (black) */
|
||||
static const GXColor bg_color = {0x00,0x00,0x00,0xff};
|
||||
|
||||
/* various background colors */
|
||||
static GXColor bg_colors[BG_COLOR_MAX]=
|
||||
{
|
||||
{0x00,0x00,0x00,0xff}, /* black */
|
||||
{0xd4,0xd0,0xc8,0xff}, /* cream */
|
||||
{0xbb,0xb0,0x99,0xff}, /* gold */
|
||||
{0xd6,0xcb,0xba,0xff}, /* light gold */
|
||||
{0xcc,0xcc,0xcc,0xff}, /* light grey */
|
||||
{0x66,0x66,0x66,0xff}, /* faded grey */
|
||||
{0x50,0x51,0x5b,0xff}, /* grey blue */
|
||||
{0xb8,0xc7,0xda,0xff}, /* light blue */
|
||||
{0xc0,0xcf,0xe7,0xff}, /* sky blue */
|
||||
{0x98,0xb1,0xd8,0xff}, /* sea blue */
|
||||
{0x7b,0x8c,0xa6,0xff}, /* violet */
|
||||
{0xa9,0xc7,0xc6,0xff}, /* green blue */
|
||||
{0x7d,0xa4,0x9f,0xff}, /* darker green blue */
|
||||
{0x22,0x52,0x74,0xff}, /* dark blue */
|
||||
{0x33,0x33,0x33,0xff} /* dark grey */
|
||||
};
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************************************************************/
|
||||
/* Generic GUI routines */
|
||||
/*****************************************************************************/
|
||||
|
||||
@ -1987,22 +1966,3 @@ void GUI_FadeOut()
|
||||
alpha +=3;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return background color */
|
||||
GXColor *GUI_GetBgColor(void)
|
||||
{
|
||||
return &bg_color;
|
||||
}
|
||||
|
||||
/* Select background color */
|
||||
void GUI_SetBgColor(u8 color)
|
||||
{
|
||||
if (color < BG_COLOR_MAX)
|
||||
{
|
||||
bg_color.r = bg_colors[color].r;
|
||||
bg_color.g = bg_colors[color].g;
|
||||
bg_color.b = bg_colors[color].b;
|
||||
bg_color.a = bg_colors[color].a;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,15 +170,10 @@ extern gx_texture *w_pointer;
|
||||
|
||||
/* Generic backgrounds */
|
||||
extern const u8 Bg_layer_png[];
|
||||
extern const u8 Bg_main_png[];
|
||||
extern const u8 Bg_main_2_png[];
|
||||
extern const u8 Bg_overlay_png[];
|
||||
extern const u8 Banner_main_png[];
|
||||
extern const u8 Banner_bottom_png[];
|
||||
extern const u8 Banner_top_png[];
|
||||
extern const u8 Banner_main_2_png[];
|
||||
extern const u8 Banner_bottom_2_png[];
|
||||
extern const u8 Banner_top_2_png[];
|
||||
extern const u8 Main_logo_png[];
|
||||
|
||||
/* Generic frames */
|
||||
|
@ -45,7 +45,6 @@ extern const u8 Bg_intro_c1_png[];
|
||||
extern const u8 Bg_intro_c2_png[];
|
||||
extern const u8 Bg_intro_c3_png[];
|
||||
extern const u8 Bg_intro_c4_png[];
|
||||
extern const u8 Bg_intro_c5_png[];
|
||||
|
||||
/*
|
||||
* This is the legal stuff - which must be shown at program startup
|
||||
@ -95,16 +94,12 @@ void legal ()
|
||||
#else
|
||||
gx_texture *button = gxTextureOpenPNG(Key_A_gcn_png,0);
|
||||
#endif
|
||||
|
||||
gx_texture *logo_left= gxTextureOpenPNG(Bg_intro_c5_png,0);
|
||||
gx_texture *logo_right = gxTextureOpenPNG(Bg_intro_c4_png,0);
|
||||
gx_texture *logo = gxTextureOpenPNG(Bg_intro_c4_png,0);
|
||||
|
||||
gxClearScreen((GXColor)BLACK);
|
||||
show_disclaimer(56);
|
||||
gxDrawTexture(logo_left, (640-logo_left->width-logo_right->width -32)/2, 480-logo_left->height-24, logo_left->width, logo_left->height,255);
|
||||
gxDrawTexture(logo_right, (640-logo_left->width-logo_right->width -32)/2+logo_left->width+32, 480-logo_right->height-24, logo_right->width, logo_right->height,255);
|
||||
gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255);
|
||||
gxSetScreen();
|
||||
|
||||
sleep(1);
|
||||
|
||||
while (!(m_input.keys & PAD_BUTTON_A) && (count > 0))
|
||||
@ -117,15 +112,13 @@ void legal ()
|
||||
FONT_writeCenter("Press button to continue.",24,0,640,366,(GXColor)SKY_BLUE);
|
||||
gxDrawTexture(button, 220, 366-24+(24-button->height)/2, button->width, button->height,255);
|
||||
}
|
||||
gxDrawTexture(logo_left, (640-logo_left->width-logo_right->width -32)/2, 480-logo_left->height-24, logo_left->width, logo_left->height,255);
|
||||
gxDrawTexture(logo_right, (640-logo_left->width-logo_right->width -32)/2+logo_left->width+32, 480-logo_right->height-24, logo_right->width, logo_right->height,255);
|
||||
gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255);
|
||||
gxSetScreen();
|
||||
count--;
|
||||
}
|
||||
|
||||
gxTextureClose(&button);
|
||||
gxTextureClose(&logo_left);
|
||||
gxTextureClose(&logo_right);
|
||||
gxTextureClose(&logo);
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
|
@ -62,7 +62,7 @@ extern const u8 Main_options_png[];
|
||||
extern const u8 Main_quit_png[];
|
||||
extern const u8 Main_file_png[];
|
||||
extern const u8 Main_reset_png[];
|
||||
extern const u8 Main_ggenie_png[];
|
||||
extern const u8 Main_cheats_png[];
|
||||
extern const u8 Main_showinfo_png[];
|
||||
extern const u8 Main_takeshot_png[];
|
||||
#ifdef HW_RVL
|
||||
@ -80,11 +80,10 @@ extern const u8 Option_system_png[];
|
||||
|
||||
/* Load ROM menu */
|
||||
extern const u8 Load_recent_png[];
|
||||
extern const u8 Load_sd_png[];
|
||||
extern const u8 Load_dvd_png[];
|
||||
#ifdef HW_RVL
|
||||
extern const u8 Load_usb_png[];
|
||||
#endif
|
||||
extern const u8 Load_md_png[];
|
||||
extern const u8 Load_ms_png[];
|
||||
extern const u8 Load_gg_png[];
|
||||
extern const u8 Load_sg_png[];
|
||||
|
||||
/* Save Manager menu */
|
||||
extern const u8 Button_load_png[];
|
||||
@ -216,13 +215,12 @@ static gui_item action_select =
|
||||
NULL,Key_A_png,"","",602,422,28,28
|
||||
};
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI backgrounds images */
|
||||
/*****************************************************************************/
|
||||
static gui_image bg_main[4] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,178,74,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_main_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,340,640,140,255},
|
||||
{NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,202,362,232,56,255}
|
||||
@ -230,7 +228,7 @@ static gui_image bg_main[4] =
|
||||
|
||||
static gui_image bg_misc[5] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,178,96,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255},
|
||||
@ -239,7 +237,7 @@ static gui_image bg_misc[5] =
|
||||
|
||||
static gui_image bg_ctrls[8] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,374,140,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255},
|
||||
@ -251,7 +249,7 @@ static gui_image bg_ctrls[8] =
|
||||
|
||||
static gui_image bg_list[6] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,374,140,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255},
|
||||
@ -262,7 +260,7 @@ static gui_image bg_list[6] =
|
||||
static gui_image bg_saves[8] =
|
||||
{
|
||||
{NULL,NULL,0,0,0,0,0,255},
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,374,140,284,288,255},
|
||||
{NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255},
|
||||
@ -283,7 +281,7 @@ static gui_item items_main[10] =
|
||||
{NULL,Main_quit_png ,"","",460,170,52,84},
|
||||
{NULL,Main_file_png ,"","",114,216,80,92},
|
||||
{NULL,Main_reset_png ,"","",282,224,76,84},
|
||||
{NULL,Main_ggenie_png ,"","",450,224,72,84},
|
||||
{NULL,Main_cheats_png ,"","",454,218,64,92},
|
||||
{NULL,NULL ,"","", 10,334,84,32},
|
||||
#ifdef HW_RVL
|
||||
{NULL,Main_play_wii_png,"","", 10,372,84,32},
|
||||
@ -313,28 +311,23 @@ static gui_item items_ctrls[13] =
|
||||
};
|
||||
|
||||
/* Load menu */
|
||||
static gui_item items_load[4] =
|
||||
static gui_item items_load[5] =
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
{NULL,Load_recent_png,"","Load recent ROM files" ,276,120,88,96},
|
||||
{NULL,Load_sd_png ,"","Load ROM files from SD card" ,110,266,88,96},
|
||||
{NULL,Load_usb_png ,"","Load ROM files from USB drive" ,276,266,88,96},
|
||||
{NULL,Load_dvd_png ,"","Load ROM files from DVD" ,442,266,88,96}
|
||||
#else
|
||||
{NULL,Load_recent_png,"","Load recent ROM files (USB/SD)" ,110,192,88,96},
|
||||
{NULL,Load_sd_png ,"","Load ROM files from SD card" ,276,192,88,96},
|
||||
{NULL,Load_dvd_png ,"","Load ROM files from DVD" ,442,192,88,96}
|
||||
#endif
|
||||
{NULL,Load_recent_png,"","Load recently played games", 200,144,72, 92},
|
||||
{NULL,Load_md_png, "","Load Mega Drive/Genesis games", 362,141,84, 92},
|
||||
{NULL,Load_ms_png, "","Load Master System games", 114,284,84, 96},
|
||||
{NULL,Load_gg_png, "","Load Game Gear games", 278,283,84,100},
|
||||
{NULL,Load_sg_png, "","Load SG-1000 games", 455,281,64, 96}
|
||||
};
|
||||
|
||||
/* Option menu */
|
||||
static gui_item items_options[5] =
|
||||
{
|
||||
{NULL,Option_system_png,"","System settings", 114,142,80,92},
|
||||
{NULL,Option_video_png ,"","Video settings", 288,150,64,84},
|
||||
{NULL,Option_sound_png ,"","Audio settings", 464,154,44,80},
|
||||
{NULL,Option_ctrl_png ,"","Controllers settings", 192,286,88,92},
|
||||
{NULL,Option_menu_png ,"","Menu settings", 370,286,60,92}
|
||||
{NULL,Option_video_png, "","Video settings", 288,150,64,84},
|
||||
{NULL,Option_sound_png, "","Audio settings", 464,154,44,80},
|
||||
{NULL,Option_ctrl_png, "","Controllers settings", 192,286,88,92},
|
||||
{NULL,Option_menu_png, "","Menu settings", 370,286,60,92}
|
||||
};
|
||||
|
||||
/* Audio options */
|
||||
@ -358,14 +351,14 @@ static gui_item items_audio[13] =
|
||||
/* System options */
|
||||
static gui_item items_system[8] =
|
||||
{
|
||||
{NULL,NULL,"Console Hardware: AUTO", "Select system hardware model", 56,132,276,48},
|
||||
{NULL,NULL,"Console Region: AUTO", "Select system region", 56,132,276,48},
|
||||
{NULL,NULL,"System Lockups: OFF", "Enable/disable original system lock-ups", 56,132,276,48},
|
||||
{NULL,NULL,"68k Address Error: ON", "Enable/disable 68k Address Error", 56,132,276,48},
|
||||
{NULL,NULL,"System BIOS: OFF", "Enable/disable TMSS BIOS support", 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,"SVP Cycles: 1500", "Adjust SVP chip emulation speed", 56,132,276,48}
|
||||
{NULL,NULL,"Console Hardware: AUTO", "Select system hardware model", 56,132,276,48},
|
||||
{NULL,NULL,"Console Region: AUTO", "Select system region", 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,"68k Address Error: ON", "Enable/disable 68k address error exceptions", 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,"SVP Cycles: 1500", "Adjust SVP chip emulation speed", 56,132,276,48}
|
||||
};
|
||||
|
||||
/* Video options */
|
||||
@ -392,13 +385,13 @@ static gui_item items_video[8] =
|
||||
/* Menu options */
|
||||
static gui_item items_prefs[9] =
|
||||
{
|
||||
{NULL,NULL,"Auto ROM Load: OFF","Enable/Disable automatic ROM loading on startup", 56,132,276,48},
|
||||
{NULL,NULL,"Auto Cheats: OFF", "Enable/Disable automatic cheats activation", 56,132,276,48},
|
||||
{NULL,NULL,"Auto ROM Load: OFF","Enable/Disable automatic ROM loading on startup", 56,132,276,48},
|
||||
{NULL,NULL,"Auto Cheats: OFF", "Enable/Disable automatic cheats activation", 56,132,276,48},
|
||||
{NULL,NULL,"Auto Saves: OFF", "Enable/Disable automatic saves", 56,132,276,48},
|
||||
{NULL,NULL,"Saves Device: FAT", "Configure default device for saves", 56,132,276,48},
|
||||
{NULL,NULL,"ROM Device: SD", "Configure default device for ROM files", 56,132,276,48},
|
||||
{NULL,NULL,"Saves Device: FAT", "Configure default device for Save files", 56,132,276,48},
|
||||
{NULL,NULL,"SFX Volume: 100", "Adjust sound effects volume", 56,132,276,48},
|
||||
{NULL,NULL,"BGM Volume: 100", "Adjust background music volume", 56,132,276,48},
|
||||
{NULL,NULL,"BG Color: DEFAULT", "Select background color", 56,132,276,48},
|
||||
{NULL,NULL,"BG Overlay: ON", "Enable/disable background overlay", 56,132,276,48},
|
||||
{NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48},
|
||||
};
|
||||
@ -468,18 +461,13 @@ static gui_butn buttons_ctrls[13] =
|
||||
};
|
||||
|
||||
/* Load Game menu */
|
||||
static gui_butn buttons_load[4] =
|
||||
static gui_butn buttons_load[5] =
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,0,1},246,102,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,1,1}, 80,248,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,0,1,1},246,248,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,0},412,248,148,132}
|
||||
#else
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,0,1}, 80,174,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,1,1},246,174,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,0},412,174,148,132}
|
||||
#endif
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,0,1},162,120,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,1,0},330,120,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,0,0,1}, 80,264,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,0,1,1},246,264,148,132},
|
||||
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,0},412,264,148,132}
|
||||
};
|
||||
|
||||
/* Options menu */
|
||||
@ -543,11 +531,7 @@ static gui_menu menu_load =
|
||||
{
|
||||
"Load Game",
|
||||
0,0,
|
||||
#ifdef HW_RVL
|
||||
4,4,5,0,
|
||||
#else
|
||||
3,3,5,0,
|
||||
#endif
|
||||
5,5,5,0,
|
||||
items_load,
|
||||
buttons_load,
|
||||
bg_misc,
|
||||
@ -575,7 +559,7 @@ static gui_menu menu_system =
|
||||
{
|
||||
"System Settings",
|
||||
0,0,
|
||||
7,4,7,0,
|
||||
8,4,6,0,
|
||||
items_system,
|
||||
buttons_list,
|
||||
bg_list,
|
||||
@ -670,13 +654,18 @@ static void prefmenu ()
|
||||
else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY");
|
||||
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
|
||||
else sprintf (items[2].text, "Auto Saves: NONE");
|
||||
if (config.s_device == 1) sprintf (items[3].text, "Saves Device: MCARD A");
|
||||
else if (config.s_device == 2) sprintf (items[3].text, "Saves Device: MCARD B");
|
||||
else sprintf (items[3].text, "Saves Device: FAT");
|
||||
sprintf (items[4].text, "SFX Volume: %1.1f", config.sfx_volume);
|
||||
sprintf (items[5].text, "BGM Volume: %1.1f", config.bgm_volume);
|
||||
if (config.bg_type) sprintf (items[6].text, "BG Type: COLOR %d", config.bg_type - 1);
|
||||
else sprintf (items[6].text, "BG Type: DEFAULT");
|
||||
#ifdef HW_RVL
|
||||
if (config.l_device == 1) sprintf (items[3].text, "Default ROM Device: USB");
|
||||
else if (config.l_device == 2) sprintf (items[3].text, "Default ROM Device: DVD");
|
||||
#else
|
||||
if (config.l_device == 1) sprintf (items[3].text, "Default ROM Device: DVD");
|
||||
#endif
|
||||
else sprintf (items[3].text, "Default ROM Device: SD");
|
||||
if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A");
|
||||
else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B");
|
||||
else sprintf (items[4].text, "Saves Device: FAT");
|
||||
sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume);
|
||||
sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume);
|
||||
sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
|
||||
sprintf (items[8].text, "Screen Width: %d", config.screen_w);
|
||||
|
||||
@ -707,39 +696,55 @@ static void prefmenu ()
|
||||
else sprintf (items[2].text, "Auto Saves: NONE");
|
||||
break;
|
||||
|
||||
case 3: /*** Default saves device ***/
|
||||
case 3: /*** Default ROM device ***/
|
||||
#ifdef HW_RVL
|
||||
config.l_device = (config.l_device + 1) % 3;
|
||||
if (config.l_device == 1) sprintf (items[3].text, "Default ROM Device: USB");
|
||||
else if (config.l_device == 2) sprintf (items[3].text, "Default ROM Device: DVD");
|
||||
#else
|
||||
config.l_device ^= 1;
|
||||
if (config.l_device == 1) sprintf (items[3].text, "Default ROM Device: DVD");
|
||||
#endif
|
||||
else sprintf (items[3].text, "Default ROM Device: SD");
|
||||
break;
|
||||
|
||||
case 4: /*** Default saves device ***/
|
||||
config.s_device = (config.s_device + 1) % 3;
|
||||
if (config.s_device == 1) sprintf (items[3].text, "Saves Device: MCARD A");
|
||||
else if (config.s_device == 2) sprintf (items[3].text, "Saves Device: MCARD B");
|
||||
else sprintf (items[3].text, "Saves Device: FAT");
|
||||
if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A");
|
||||
else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B");
|
||||
else sprintf (items[4].text, "Saves Device: FAT");
|
||||
break;
|
||||
|
||||
case 4: /*** Sound effects volume ***/
|
||||
case 5: /*** Sound effects volume ***/
|
||||
GUI_OptionBox(m,0,"SFX Volume",(void *)&config.sfx_volume,10.0,0.0,100.0,0);
|
||||
sprintf (items[4].text, "SFX Volume: %1.1f", config.sfx_volume);
|
||||
sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume);
|
||||
break;
|
||||
|
||||
case 5: /*** Background music volume ***/
|
||||
case 6: /*** Background music volume ***/
|
||||
GUI_OptionBox(m,update_bgm,"BGM Volume",(void *)&config.bgm_volume,10.0,0.0,100.0,0);
|
||||
sprintf (items[5].text, "BGM Volume: %1.1f", config.bgm_volume);
|
||||
break;
|
||||
|
||||
case 6: /*** Background type ***/
|
||||
if (ret < 0) config.bg_type --;
|
||||
else config.bg_type++;
|
||||
if (config.bg_type < 0) config.bg_type = BG_COLOR_MAX;
|
||||
else if (config.bg_type > BG_COLOR_MAX) config.bg_type = 0;
|
||||
if (config.bg_type) sprintf (items[6].text, "BG Type: COLOR %d", config.bg_type - 1);
|
||||
else sprintf (items[6].text, "BG Type: DEFAULT");
|
||||
GUI_DeleteMenu(m);
|
||||
menu_configure();
|
||||
GUI_InitMenu(m);
|
||||
sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume);
|
||||
break;
|
||||
|
||||
case 7: /*** Background overlay ***/
|
||||
config.bg_overlay ^= 1;
|
||||
sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
|
||||
menu_configure();
|
||||
if (config.bg_overlay)
|
||||
{
|
||||
bg_main[1].state |= IMAGE_VISIBLE;
|
||||
bg_misc[1].state |= IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state |= IMAGE_VISIBLE;
|
||||
bg_list[1].state |= IMAGE_VISIBLE;
|
||||
bg_saves[2].state |= IMAGE_VISIBLE;
|
||||
sprintf (items[7].text, "BG Overlay: ON");
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_main[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_misc[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_list[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_saves[2].state &= ~IMAGE_VISIBLE;
|
||||
sprintf (items[7].text, "BG Overlay: OFF");
|
||||
}
|
||||
break;
|
||||
|
||||
case 8: /*** Screen Width ***/
|
||||
@ -1085,9 +1090,9 @@ static void systemmenu ()
|
||||
else if (config.region_detect == 3)
|
||||
sprintf (items[1].text, "Console Region: JAPAN");
|
||||
|
||||
sprintf (items[2].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON");
|
||||
sprintf (items[3].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
|
||||
sprintf (items[4].text, "System TMSS: %s", (config.tmss & 1) ? "ON":"OFF");
|
||||
sprintf (items[2].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART" : "BIOS ONLY") : "CART");
|
||||
sprintf (items[3].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON");
|
||||
sprintf (items[4].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
|
||||
|
||||
if (config.lock_on == TYPE_GG)
|
||||
sprintf (items[5].text, "Lock-On: GAME GENIE");
|
||||
@ -1225,7 +1230,7 @@ static void systemmenu ()
|
||||
region_autodetect();
|
||||
if (system_hw == SYSTEM_MD)
|
||||
{
|
||||
io_reg[0x00] = 0x20 | region_code | (config.tmss & 1);
|
||||
io_reg[0x00] = 0x20 | region_code | (config.bios & 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1271,14 +1276,36 @@ static void systemmenu ()
|
||||
break;
|
||||
}
|
||||
|
||||
case 2: /*** force DTACK ***/
|
||||
case 2: /*** BIOS support ***/
|
||||
{
|
||||
config.force_dtack ^= 1;
|
||||
sprintf (items[2].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON");
|
||||
uint8 temp = config.bios & 3;
|
||||
config.bios &= ~3;
|
||||
if (temp == 0) config.bios |= 3;
|
||||
else if (temp == 3) config.bios |= 1;
|
||||
sprintf (items[2].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART " : "BIOS ONLY") : "CART");
|
||||
if (cart.romsize && ((system_hw == SYSTEM_MD) || (system_hw & SYSTEM_GG) || (system_hw & SYSTEM_SMS)))
|
||||
{
|
||||
/* reset emulation */
|
||||
system_init();
|
||||
system_reset();
|
||||
|
||||
/* restore SRAM */
|
||||
if (config.s_auto & 1)
|
||||
{
|
||||
slot_autoload(0,config.s_device);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: /*** 68k Address Error ***/
|
||||
case 3: /*** force DTACK ***/
|
||||
{
|
||||
config.force_dtack ^= 1;
|
||||
sprintf (items[3].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON");
|
||||
break;
|
||||
}
|
||||
|
||||
case 4: /*** 68k Address Error ***/
|
||||
{
|
||||
config.addr_error ^= 1;
|
||||
if (cart.romsize && ((system_hw & SYSTEM_PBC) == SYSTEM_MD))
|
||||
@ -1291,26 +1318,7 @@ static void systemmenu ()
|
||||
slot_autoload(0,config.s_device);
|
||||
}
|
||||
}
|
||||
sprintf (items[3].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
|
||||
break;
|
||||
}
|
||||
|
||||
case 4: /*** BIOS support ***/
|
||||
{
|
||||
config.tmss ^= 1;
|
||||
sprintf (items[4].text, "System TMSS: %s", (config.tmss & 1) ? "ON":"OFF");
|
||||
if (cart.romsize && ((system_hw & SYSTEM_PBC) == SYSTEM_MD))
|
||||
{
|
||||
/* restart emulation */
|
||||
system_init();
|
||||
system_reset();
|
||||
|
||||
/* restore SRAM */
|
||||
if (config.s_auto & 1)
|
||||
{
|
||||
slot_autoload(0,config.s_device);
|
||||
}
|
||||
}
|
||||
sprintf (items[4].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3012,7 +3020,7 @@ static int savemenu(void)
|
||||
****************************************************************************/
|
||||
static int loadgamemenu ()
|
||||
{
|
||||
int ret;
|
||||
int ret, filetype;
|
||||
gui_menu *m = &menu_load;
|
||||
GUI_InitMenu(m);
|
||||
GUI_DrawMenuFX(m,30,0);
|
||||
@ -3032,19 +3040,23 @@ static int loadgamemenu ()
|
||||
/*** Load from selected device */
|
||||
default:
|
||||
{
|
||||
/* ROM File type */
|
||||
filetype = ret - 1;
|
||||
|
||||
/* Try to open current directory */
|
||||
if (ret > 0)
|
||||
{
|
||||
ret = OpenDirectory(ret - 1);
|
||||
ret = OpenDirectory(config.l_device, filetype);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = OpenDirectory(TYPE_RECENT);
|
||||
ret = OpenDirectory(TYPE_RECENT, filetype);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
{
|
||||
GUI_DeleteMenu(m);
|
||||
if (FileSelector())
|
||||
if (FileSelector(filetype))
|
||||
{
|
||||
/* directly jump to game */
|
||||
return 1;
|
||||
@ -3320,7 +3332,7 @@ static void mainmenu_cb(void)
|
||||
}
|
||||
}
|
||||
|
||||
int menu_execute(void)
|
||||
void mainmenu(void)
|
||||
{
|
||||
char filename[MAXPATHLEN];
|
||||
int status, quit = 0;
|
||||
@ -3349,6 +3361,22 @@ int menu_execute(void)
|
||||
/* Update main menu */
|
||||
if (!m->screenshot && cart.romsize)
|
||||
{
|
||||
if (config.bg_overlay)
|
||||
{
|
||||
bg_main[1].state |= IMAGE_VISIBLE;
|
||||
bg_misc[1].state |= IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state |= IMAGE_VISIBLE;
|
||||
bg_list[1].state |= IMAGE_VISIBLE;
|
||||
bg_saves[2].state |= IMAGE_VISIBLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_main[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_misc[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_list[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_saves[2].state &= ~IMAGE_VISIBLE;
|
||||
}
|
||||
m->screenshot = 128;
|
||||
m->bg_images[0].state &= ~IMAGE_VISIBLE;
|
||||
m->items[0].y -= 90;
|
||||
@ -3392,6 +3420,9 @@ int menu_execute(void)
|
||||
|
||||
if (loadgamemenu())
|
||||
{
|
||||
/* restart emulation */
|
||||
reloadrom();
|
||||
|
||||
/* check current controller configuration */
|
||||
if (!gx_input_FindDevices())
|
||||
{
|
||||
@ -3404,7 +3435,7 @@ int menu_execute(void)
|
||||
/* exit to game and reinitialize emulation */
|
||||
gxClearScreen((GXColor)BLACK);
|
||||
gxSetScreen();
|
||||
quit = 2;
|
||||
quit = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3569,64 +3600,4 @@ int menu_execute(void)
|
||||
MOUSE_Deinit();
|
||||
}
|
||||
#endif
|
||||
|
||||
return (quit >> 1);
|
||||
}
|
||||
|
||||
void menu_configure(void)
|
||||
{
|
||||
/* background type */
|
||||
if (config.bg_type > 0)
|
||||
{
|
||||
GUI_SetBgColor((u8)(config.bg_type - 1));
|
||||
bg_main[0].state &= ~IMAGE_REPEAT;
|
||||
bg_misc[0].state &= ~IMAGE_REPEAT;
|
||||
bg_ctrls[0].state &= ~IMAGE_REPEAT;
|
||||
bg_list[0].state &= ~IMAGE_REPEAT;
|
||||
bg_saves[1].state &= ~IMAGE_REPEAT;
|
||||
if (config.bg_type > 1)
|
||||
{
|
||||
bg_main[0].data = bg_misc[0].data = bg_ctrls[0].data = bg_list[0].data = bg_saves[1].data = Bg_main_png;
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_main[0].data = bg_misc[0].data = bg_ctrls[0].data = bg_list[0].data = bg_saves[1].data = Bg_main_2_png;
|
||||
}
|
||||
bg_main[0].x = bg_misc[0].x = bg_ctrls[0].x = bg_list[0].x = bg_saves[1].x = 374;
|
||||
bg_main[0].y = bg_misc[0].y = bg_ctrls[0].y = bg_list[0].y = bg_saves[1].y = 140;
|
||||
bg_main[0].w = bg_misc[0].w = bg_ctrls[0].w = bg_list[0].w = bg_saves[1].w = 284;
|
||||
bg_main[0].h = bg_misc[0].h = bg_ctrls[0].h = bg_list[0].h = bg_saves[1].h = 288;
|
||||
}
|
||||
else
|
||||
{
|
||||
GUI_SetBgColor(0);
|
||||
bg_main[0].state |= IMAGE_REPEAT;
|
||||
bg_misc[0].state |= IMAGE_REPEAT;
|
||||
bg_ctrls[0].state |= IMAGE_REPEAT;
|
||||
bg_list[0].state |= IMAGE_REPEAT;
|
||||
bg_saves[1].state |= IMAGE_REPEAT;
|
||||
bg_main[0].data = bg_misc[0].data = bg_ctrls[0].data = bg_list[0].data = bg_saves[1].data = Bg_layer_png;
|
||||
bg_main[0].x = bg_misc[0].x = bg_ctrls[0].x = bg_list[0].x = bg_saves[1].x = 0;
|
||||
bg_main[0].y = bg_misc[0].y = bg_ctrls[0].y = bg_list[0].y = bg_saves[1].y = 0;
|
||||
bg_main[0].w = bg_misc[0].w = bg_ctrls[0].w = bg_list[0].w = bg_saves[1].w = 640;
|
||||
bg_main[0].h = bg_misc[0].h = bg_ctrls[0].h = bg_list[0].h = bg_saves[1].h = 480;
|
||||
}
|
||||
|
||||
/* background overlay */
|
||||
if (config.bg_overlay)
|
||||
{
|
||||
bg_main[1].state |= IMAGE_VISIBLE;
|
||||
bg_misc[1].state |= IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state |= IMAGE_VISIBLE;
|
||||
bg_list[1].state |= IMAGE_VISIBLE;
|
||||
bg_saves[2].state |= IMAGE_VISIBLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_main[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_misc[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_ctrls[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_list[1].state &= ~IMAGE_VISIBLE;
|
||||
bg_saves[2].state &= ~IMAGE_VISIBLE;
|
||||
}
|
||||
}
|
||||
|
@ -40,9 +40,7 @@
|
||||
#ifndef _MENU_H
|
||||
#define _MENU_H
|
||||
|
||||
extern int menu_execute(void);
|
||||
extern void menu_configure(void);
|
||||
|
||||
extern void mainmenu(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1400,7 +1400,7 @@ void gx_input_UpdateEmu(void)
|
||||
RAMCheatUpdate();
|
||||
}
|
||||
|
||||
/* Menu inputs update function (done by Video Interrupt callback) */
|
||||
/* Menu inputs update function */
|
||||
void gx_input_UpdateMenu(void)
|
||||
{
|
||||
/* Check if inputs update are disabled */
|
||||
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 72 KiB |
BIN
source/gx/images/Cart_gg.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
source/gx/images/Cart_md.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
source/gx/images/Cart_ms.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
source/gx/images/Cart_sg.png
Normal file
After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 12 KiB |
BIN
source/gx/images/Load_gg.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
source/gx/images/Load_md.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
source/gx/images/Load_ms.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 12 KiB |
BIN
source/gx/images/Load_sg.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 12 KiB |
BIN
source/gx/images/Main_cheats.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 22 KiB |
308
source/gx/main.c
@ -50,7 +50,6 @@
|
||||
#include <fat.h>
|
||||
|
||||
#ifdef HW_RVL
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <ogc/machine/processor.h>
|
||||
#endif
|
||||
|
||||
@ -66,6 +65,46 @@ u32 ConfigRequested = 1;
|
||||
u32 frameticker;
|
||||
|
||||
#ifdef HW_RVL
|
||||
|
||||
/****************************************************************************
|
||||
* Force AHBPROT flags when IOS is reloaded
|
||||
* Credits to DaveBaol for the original patch
|
||||
***************************************************************************/
|
||||
int Patch_IOS(void)
|
||||
{
|
||||
/* full hardware access is initially required */
|
||||
if (read32(0xd800064) == 0xffffffff)
|
||||
{
|
||||
/* disable MEM2 protection */
|
||||
write16(0xd8b420a, 0);
|
||||
|
||||
/* IOS area (top of MEM2, above IOS Heap area) */
|
||||
u8 *ptr_start = (u8*)*((u32*)0x80003134);
|
||||
u8 *ptr_end = (u8*)0x94000000;
|
||||
|
||||
/* Make sure start pointer is valid */
|
||||
if (((u32)ptr_start < 0x90000000) || (ptr_start >= ptr_end))
|
||||
{
|
||||
/* use libogc default value (longer but safer) */
|
||||
ptr_start = (u8*) SYS_GetArena2Hi();
|
||||
}
|
||||
|
||||
/* Search specific code pattern */
|
||||
const u8 es_set_ahbprot_pattern[] = { 0x68, 0x5B, 0x22, 0xEC, 0x00, 0x52, 0x18, 0x9B, 0x68, 0x1B, 0x46, 0x98, 0x07, 0xDB };
|
||||
while (ptr_start < (ptr_end - sizeof(es_set_ahbprot_pattern)))
|
||||
{
|
||||
if (!memcmp(ptr_start, es_set_ahbprot_pattern, sizeof(es_set_ahbprot_pattern)))
|
||||
{
|
||||
/* patch IOS (force AHBPROT bit to be set when launching titles) */
|
||||
ptr_start[25] = 0x01;
|
||||
DCFlushRange(ptr_start + 25, 1);
|
||||
}
|
||||
ptr_start++; /* could be optimized ? not sure if pattern coincides with instruction start */
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Power Button callback
|
||||
***************************************************************************/
|
||||
@ -83,12 +122,12 @@ static void Reset_cb(void)
|
||||
{
|
||||
if (system_hw & SYSTEM_MD)
|
||||
{
|
||||
/* SOFT-RESET */
|
||||
/* Soft Reset */
|
||||
gen_reset(0);
|
||||
}
|
||||
else if (system_hw == SYSTEM_SMS)
|
||||
{
|
||||
/* assert RESET input */
|
||||
/* assert RESET input (Master System model 1 only) */
|
||||
io_reg[0x0D] &= ~IO_RESET_HI;
|
||||
}
|
||||
}
|
||||
@ -97,34 +136,30 @@ static void Reset_cb(void)
|
||||
* Genesis Plus Virtual Machine
|
||||
*
|
||||
***************************************************************************/
|
||||
static void load_bios(void)
|
||||
{
|
||||
/* clear BIOS detection flag */
|
||||
config.tmss &= ~2;
|
||||
|
||||
/* open BIOS file */
|
||||
FILE *fp = fopen(OS_ROM, "rb");
|
||||
if (fp == NULL) return;
|
||||
|
||||
/* read file */
|
||||
fread(bios_rom, 1, 0x800, fp);
|
||||
fclose(fp);
|
||||
|
||||
/* check ROM file */
|
||||
if (!strncmp((char *)(bios_rom + 0x120),"GENESIS OS", 10))
|
||||
{
|
||||
/* valid BIOS detected */
|
||||
config.tmss |= 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void init_machine(void)
|
||||
{
|
||||
/* allocate cart.rom here (10 MBytes) */
|
||||
/* allocate cartridge ROM here (10 MB) */
|
||||
cart.rom = memalign(32, MAXROMSIZE);
|
||||
|
||||
/* BIOS support */
|
||||
load_bios();
|
||||
/* mark all BIOS as unloaded */
|
||||
config.bios &= 0x03;
|
||||
|
||||
/* Genesis BOOT ROM support (2KB max) */
|
||||
memset(boot_rom, 0xFF, 0x800);
|
||||
FILE *fp = fopen(MD_BIOS, "rb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
/* read BOOT ROM */
|
||||
fread(boot_rom, 1, 0x800, fp);
|
||||
fclose(fp);
|
||||
|
||||
/* check BOOT ROM */
|
||||
if (!strncmp((char *)(boot_rom + 0x120),"GENESIS OS", 10))
|
||||
{
|
||||
/* mark Genesis BIOS as loaded */
|
||||
config.bios |= SYSTEM_MD;
|
||||
}
|
||||
}
|
||||
|
||||
/* allocate global work bitmap */
|
||||
memset(&bitmap, 0, sizeof (bitmap));
|
||||
@ -138,14 +173,133 @@ static void init_machine(void)
|
||||
bitmap.data = texturemem;
|
||||
}
|
||||
|
||||
static void run_emulation(void)
|
||||
{
|
||||
/* main emulation loop */
|
||||
while (1)
|
||||
{
|
||||
/* emulated system */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
/* Mega Drive type hardware */
|
||||
while (!ConfigRequested)
|
||||
{
|
||||
/* automatic frame skipping (only needed when running Virtua Racing on Gamecube) */
|
||||
if (frameticker > 1)
|
||||
{
|
||||
/* skip frame */
|
||||
system_frame_gen(1);
|
||||
frameticker = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* render frame */
|
||||
frameticker = 0;
|
||||
system_frame_gen(0);
|
||||
|
||||
/* update video */
|
||||
gx_video_Update();
|
||||
}
|
||||
|
||||
/* update audio */
|
||||
gx_audio_Update();
|
||||
|
||||
/* check interlaced mode change */
|
||||
if (bitmap.viewport.changed & 4)
|
||||
{
|
||||
/* VSYNC "original" mode */
|
||||
if (!config.render && (gc_pal == vdp_pal))
|
||||
{
|
||||
/* framerate has changed, reinitialize audio timings */
|
||||
if (vdp_pal)
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 50.00 : (1000000.0/19968.0));
|
||||
}
|
||||
else
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 59.94 : (1000000.0/16715.0));
|
||||
}
|
||||
|
||||
/* reinitialize sound chips */
|
||||
sound_restore();
|
||||
}
|
||||
|
||||
/* clear flag */
|
||||
bitmap.viewport.changed &= ~4;
|
||||
}
|
||||
|
||||
/* wait for next frame */
|
||||
while (frameticker < 1) usleep(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Master System type hardware */
|
||||
while (!ConfigRequested)
|
||||
{
|
||||
/* render frame (no frameskipping needed) */
|
||||
frameticker = 0;
|
||||
system_frame_sms(0);
|
||||
|
||||
/* update video */
|
||||
gx_video_Update();
|
||||
|
||||
/* update audio */
|
||||
gx_audio_Update();
|
||||
|
||||
/* check interlaced mode change */
|
||||
if (bitmap.viewport.changed & 4)
|
||||
{
|
||||
/* VSYNC "original" mode */
|
||||
if (!config.render && (gc_pal == vdp_pal))
|
||||
{
|
||||
/* framerate has changed, reinitialize audio timings */
|
||||
if (vdp_pal)
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 50.00 : (1000000.0/19968.0));
|
||||
}
|
||||
else
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 59.94 : (1000000.0/16715.0));
|
||||
}
|
||||
|
||||
/* reinitialize sound chips */
|
||||
sound_restore();
|
||||
}
|
||||
|
||||
/* clear flag */
|
||||
bitmap.viewport.changed &= ~4;
|
||||
}
|
||||
|
||||
/* wait for next frame */
|
||||
while (frameticker < 1) usleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* stop video & audio */
|
||||
gx_audio_Stop();
|
||||
gx_video_Stop();
|
||||
|
||||
/* show menu */
|
||||
ConfigRequested = 0;
|
||||
mainmenu();
|
||||
|
||||
/* restart video & audio */
|
||||
gx_video_Start();
|
||||
gx_audio_Start();
|
||||
frameticker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
Restart emulation when loading a new game
|
||||
********************************************/
|
||||
static void reload(void)
|
||||
void reloadrom(void)
|
||||
{
|
||||
/* Cartridge Hot Swap (make sure system has already been inited once) */
|
||||
if (config.hot_swap && snd.enabled)
|
||||
if (config.hot_swap == 3)
|
||||
{
|
||||
/* Initialize cartridge hardware only */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
md_cart_init();
|
||||
@ -177,6 +331,9 @@ static void reload(void)
|
||||
/* Switch virtual system on */
|
||||
system_init();
|
||||
system_reset();
|
||||
|
||||
/* Allow hot swap */
|
||||
config.hot_swap |= 2;
|
||||
}
|
||||
|
||||
/* Auto-Load SRAM file */
|
||||
@ -195,81 +352,6 @@ static void reload(void)
|
||||
CheatLoad();
|
||||
}
|
||||
|
||||
static void run_emulation(void)
|
||||
{
|
||||
/* main emulation loop */
|
||||
while (1)
|
||||
{
|
||||
/* Main Menu request */
|
||||
if (ConfigRequested)
|
||||
{
|
||||
/* stop video & audio */
|
||||
gx_audio_Stop();
|
||||
gx_video_Stop();
|
||||
|
||||
/* show menu */
|
||||
ConfigRequested = 0;
|
||||
if (menu_execute())
|
||||
{
|
||||
/* new ROM has been loaded */
|
||||
reload();
|
||||
}
|
||||
|
||||
/* start video & audio */
|
||||
gx_video_Start();
|
||||
gx_audio_Start();
|
||||
frameticker = 1;
|
||||
}
|
||||
|
||||
/* automatic frame skipping (only necessary for Virtua Racing in Gamecube mode) */
|
||||
if (frameticker > 1)
|
||||
{
|
||||
/* skip frame */
|
||||
system_frame(1);
|
||||
frameticker = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* render frame */
|
||||
frameticker = 0;
|
||||
system_frame(0);
|
||||
|
||||
/* update video */
|
||||
gx_video_Update();
|
||||
}
|
||||
|
||||
/* update audio */
|
||||
gx_audio_Update();
|
||||
|
||||
/* check interlaced mode change */
|
||||
if (bitmap.viewport.changed & 4)
|
||||
{
|
||||
/* VSYNC "original" mode */
|
||||
if (!config.render && (gc_pal == vdp_pal))
|
||||
{
|
||||
/* framerate has changed, reinitialize audio timings */
|
||||
if (vdp_pal)
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 50.00 : (1000000.0/19968.0));
|
||||
}
|
||||
else
|
||||
{
|
||||
audio_init(SAMPLERATE_48KHZ, interlaced ? 59.94 : (1000000.0/16715.0));
|
||||
}
|
||||
|
||||
/* reinitialize sound chips */
|
||||
sound_restore();
|
||||
}
|
||||
|
||||
/* clear flag */
|
||||
bitmap.viewport.changed &= ~4;
|
||||
}
|
||||
|
||||
/* wait for next frame */
|
||||
while (frameticker < 1) usleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
Shutdown everything properly
|
||||
***************************************************/
|
||||
@ -301,7 +383,19 @@ void shutdown(void)
|
||||
***************************************************************************/
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
#ifdef HW_RVL
|
||||
/* Temporary fix for HBC bug when using no_ios_reload with no connected network */
|
||||
/* Try to patch current IOS to force AHBPROT flags being set on reload */
|
||||
if (Patch_IOS())
|
||||
{
|
||||
/* reload IOS (full hardware access should now be preserved after reload) */
|
||||
IOS_ReloadIOS(IOS_GetVersion());
|
||||
|
||||
/* enable DVD video commands */
|
||||
write32(0xd800180, read32(0xd800180) & ~0x00200000);
|
||||
usleep(200000);
|
||||
}
|
||||
|
||||
/* enable 64-byte fetch mode for L2 cache */
|
||||
L2Enhance();
|
||||
|
||||
@ -422,11 +516,11 @@ int main (int argc, char *argv[])
|
||||
if (config.autoload)
|
||||
{
|
||||
SILENT = 1;
|
||||
if (OpenDirectory(TYPE_RECENT))
|
||||
if (OpenDirectory(TYPE_RECENT, -1))
|
||||
{
|
||||
if (LoadFile(0))
|
||||
{
|
||||
reload();
|
||||
reloadrom();
|
||||
gx_video_Start();
|
||||
gx_audio_Start();
|
||||
frameticker = 1;
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <unistd.h>
|
||||
#include <asndlib.h>
|
||||
#include <oggplayer.h>
|
||||
#include <zlib.h>
|
||||
|
||||
#ifdef HW_RVL
|
||||
#include <di/di.h>
|
||||
@ -27,22 +28,23 @@
|
||||
#define DEFAULT_PATH "/genplus"
|
||||
#define GG_ROM "/genplus/ggenie.bin"
|
||||
#define AR_ROM "/genplus/areplay.bin"
|
||||
#define OS_ROM "/genplus/bios.bin"
|
||||
#define SK_ROM "/genplus/sk.bin"
|
||||
#define SK_UPMEM "/genplus/sk2chip.bin"
|
||||
#define MD_BIOS "/genplus/bios.bin"
|
||||
#define MS_BIOS "/genplus/bios.sms"
|
||||
#define GG_BIOS "/genplus/bios.gg"
|
||||
|
||||
#ifdef HW_RVL
|
||||
#define VERSION "Genesis Plus GX 1.6.0 (WII)"
|
||||
#define VERSION "Genesis Plus GX 1.6.1 (WII)"
|
||||
#else
|
||||
#define VERSION "Genesis Plus GX 1.6.0 (GCN)"
|
||||
#define VERSION "Genesis Plus GX 1.6.1 (GCN)"
|
||||
#endif
|
||||
|
||||
#define osd_input_Update() gx_input_UpdateEmu()
|
||||
|
||||
/* globals */
|
||||
extern void error(char *format, ...);
|
||||
extern void legal(void);
|
||||
extern void reloadrom (char *name);
|
||||
extern void reloadrom(void);
|
||||
extern void shutdown(void);
|
||||
extern u32 frameticker;
|
||||
extern u32 Shutdown;
|
||||
|
@ -256,7 +256,7 @@ void io_reset(void)
|
||||
/* Reset I/O registers */
|
||||
if (system_hw == SYSTEM_MD)
|
||||
{
|
||||
io_reg[0x00] = 0x20 | region_code | (config.tmss & 1);
|
||||
io_reg[0x00] = region_code | 0x20 | (config.bios & 1);
|
||||
io_reg[0x01] = 0x00;
|
||||
io_reg[0x02] = 0x00;
|
||||
io_reg[0x03] = 0x00;
|
||||
@ -429,24 +429,11 @@ void io_z80_write(unsigned int offset, unsigned int data, unsigned int cycles)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Memory Control register */
|
||||
if (data & 0x40)
|
||||
{
|
||||
/* Assume only BIOS would disable Cartridge ROM */
|
||||
if (data & 0x08)
|
||||
{
|
||||
/* BIOS ROM disabled */
|
||||
sms_cart_switch(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* BIOS ROM enabled */
|
||||
sms_cart_switch(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update Memory Control register */
|
||||
io_reg[0x0E] = data;
|
||||
|
||||
/* Switch cartridge & BIOS ROM */
|
||||
sms_cart_switch(~data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,6 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <zlib.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "macros.h"
|
||||
|
@ -38,20 +38,9 @@
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
int state_load(unsigned char *buffer)
|
||||
int state_load(unsigned char *state)
|
||||
{
|
||||
/* buffer size */
|
||||
int bufferptr = 0;
|
||||
|
||||
/* first allocate state buffer */
|
||||
unsigned char *state = (unsigned char *)malloc(STATE_SIZE);
|
||||
if (!state) return 0;
|
||||
|
||||
/* uncompress savestate */
|
||||
unsigned long inbytes, outbytes;
|
||||
memcpy(&inbytes, buffer, 4);
|
||||
outbytes = STATE_SIZE;
|
||||
uncompress ((Bytef *)state, &outbytes, (Bytef *)(buffer + 4), inbytes);
|
||||
int i, bufferptr = 0;
|
||||
|
||||
/* signature check (GENPLUS-GX x.x.x) */
|
||||
char version[17];
|
||||
@ -59,21 +48,30 @@ int state_load(unsigned char *buffer)
|
||||
version[16] = 0;
|
||||
if (strncmp(version,STATE_VERSION,11))
|
||||
{
|
||||
free(state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* version check (1.5.0 and above) */
|
||||
if ((version[11] < 0x31) || ((version[11] == 0x31) && (version[13] < 0x35)))
|
||||
/* version check (1.6.0 and above) */
|
||||
if ((version[11] < 0x31) || ((version[11] == 0x31) && (version[13] < 0x36)))
|
||||
{
|
||||
free(state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* reset system */
|
||||
system_reset();
|
||||
|
||||
// GENESIS
|
||||
/* enable VDP access for TMSS systems */
|
||||
for (i=0xc0; i<0xe0; i+=8)
|
||||
{
|
||||
m68k_memory_map[i].read8 = vdp_read_byte;
|
||||
m68k_memory_map[i].read16 = vdp_read_word;
|
||||
m68k_memory_map[i].write8 = vdp_write_byte;
|
||||
m68k_memory_map[i].write16 = vdp_write_word;
|
||||
zbank_memory_map[i].read = zbank_read_vdp;
|
||||
zbank_memory_map[i].write = zbank_write_vdp;
|
||||
}
|
||||
|
||||
/* GENESIS */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
load_param(work_ram, sizeof(work_ram));
|
||||
@ -100,28 +98,34 @@ int state_load(unsigned char *buffer)
|
||||
load_param(work_ram, 0x2000);
|
||||
}
|
||||
|
||||
/* extended state */
|
||||
/* CPU cycles */
|
||||
load_param(&mcycles_68k, sizeof(mcycles_68k));
|
||||
load_param(&mcycles_z80, sizeof(mcycles_z80));
|
||||
|
||||
// IO
|
||||
/* IO */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
load_param(io_reg, sizeof(io_reg));
|
||||
io_reg[0] = region_code | 0x20 | (config.tmss & 1);
|
||||
io_reg[0] = region_code | 0x20 | (config.bios & 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 1.6.1 specific (keep support for previous state format) */
|
||||
if ((version[11] == 0x31) && (version[13] == 0x36) && (version[15] == 0x31))
|
||||
{
|
||||
load_param(&io_reg[0x0E], 1);
|
||||
}
|
||||
|
||||
load_param(&io_reg[0x0F], 1);
|
||||
}
|
||||
|
||||
// VDP
|
||||
bufferptr += vdp_context_load(&state[bufferptr], version);
|
||||
/* VDP */
|
||||
bufferptr += vdp_context_load(&state[bufferptr]);
|
||||
|
||||
// SOUND
|
||||
bufferptr += sound_context_load(&state[bufferptr], version);
|
||||
/* SOUND */
|
||||
bufferptr += sound_context_load(&state[bufferptr]);
|
||||
|
||||
// 68000
|
||||
/* 68000 */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
uint16 tmp16;
|
||||
@ -147,11 +151,11 @@ int state_load(unsigned char *buffer)
|
||||
load_param(&tmp32, 4); m68k_set_reg(M68K_REG_USP,tmp32);
|
||||
}
|
||||
|
||||
// Z80
|
||||
/* Z80 */
|
||||
load_param(&Z80, sizeof(Z80_Regs));
|
||||
Z80.irq_callback = z80_irq_callback;
|
||||
|
||||
// Cartridge HW
|
||||
/* Cartridge HW */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
bufferptr += md_cart_context_load(&state[bufferptr]);
|
||||
@ -159,27 +163,28 @@ int state_load(unsigned char *buffer)
|
||||
else
|
||||
{
|
||||
bufferptr += sms_cart_context_load(&state[bufferptr]);
|
||||
|
||||
/* 1.6.1 specific (keep support for previous state format) */
|
||||
if ((version[11] == 0x31) && (version[13] == 0x36) && (version[15] == 0x31))
|
||||
{
|
||||
sms_cart_switch(~io_reg[0x0E]);
|
||||
}
|
||||
}
|
||||
|
||||
free(state);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int state_save(unsigned char *buffer)
|
||||
int state_save(unsigned char *state)
|
||||
{
|
||||
/* buffer size */
|
||||
int bufferptr = 0;
|
||||
|
||||
/* first allocate state buffer */
|
||||
unsigned char *state = (unsigned char *)malloc(STATE_SIZE);
|
||||
if (!state) return 0;
|
||||
|
||||
/* version string */
|
||||
char version[16];
|
||||
strncpy(version,STATE_VERSION,16);
|
||||
save_param(version, 16);
|
||||
|
||||
// GENESIS
|
||||
/* GENESIS */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
save_param(work_ram, sizeof(work_ram));
|
||||
@ -191,26 +196,29 @@ int state_save(unsigned char *buffer)
|
||||
{
|
||||
save_param(work_ram, 0x2000);
|
||||
}
|
||||
|
||||
/* CPU cycles */
|
||||
save_param(&mcycles_68k, sizeof(mcycles_68k));
|
||||
save_param(&mcycles_z80, sizeof(mcycles_z80));
|
||||
|
||||
// IO
|
||||
/* IO */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
save_param(io_reg, sizeof(io_reg));
|
||||
}
|
||||
else
|
||||
{
|
||||
save_param(&io_reg[0x0E], 1);
|
||||
save_param(&io_reg[0x0F], 1);
|
||||
}
|
||||
|
||||
// VDP
|
||||
/* VDP */
|
||||
bufferptr += vdp_context_save(&state[bufferptr]);
|
||||
|
||||
// SOUND
|
||||
/* SOUND */
|
||||
bufferptr += sound_context_save(&state[bufferptr]);
|
||||
|
||||
// 68000
|
||||
/* 68000 */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
uint16 tmp16;
|
||||
@ -236,10 +244,10 @@ int state_save(unsigned char *buffer)
|
||||
tmp32 = m68k_get_reg(M68K_REG_USP); save_param(&tmp32, 4);
|
||||
}
|
||||
|
||||
// Z80
|
||||
/* Z80 */
|
||||
save_param(&Z80, sizeof(Z80_Regs));
|
||||
|
||||
// Cartridge HW
|
||||
/* Cartridge HW */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
bufferptr += md_cart_context_save(&state[bufferptr]);
|
||||
@ -249,13 +257,6 @@ int state_save(unsigned char *buffer)
|
||||
bufferptr += sms_cart_context_save(&state[bufferptr]);
|
||||
}
|
||||
|
||||
/* compress state file */
|
||||
unsigned long inbytes = bufferptr;
|
||||
unsigned long outbytes = STATE_SIZE;
|
||||
compress2 ((Bytef *)(buffer + 4), &outbytes, (Bytef *)state, inbytes, 9);
|
||||
memcpy(buffer, &outbytes, 4);
|
||||
free(state);
|
||||
|
||||
/* return total size */
|
||||
return (outbytes + 4);
|
||||
return bufferptr;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@
|
||||
#define _STATE_H_
|
||||
|
||||
#define STATE_SIZE 0x48100
|
||||
#define STATE_VERSION "GENPLUS-GX 1.6.0"
|
||||
#define STATE_VERSION "GENPLUS-GX 1.6.1"
|
||||
|
||||
#define load_param(param, size) \
|
||||
memcpy(param, &state[bufferptr], size); \
|
||||
@ -51,7 +51,7 @@
|
||||
bufferptr+= size;
|
||||
|
||||
/* Function prototypes */
|
||||
extern int state_load(unsigned char *buffer);
|
||||
extern int state_save(unsigned char *buffer);
|
||||
extern int state_load(unsigned char *state);
|
||||
extern int state_save(unsigned char *state);
|
||||
|
||||
#endif
|
||||
|
@ -49,11 +49,9 @@ t_snd snd;
|
||||
uint32 mcycles_vdp;
|
||||
uint32 mcycles_z80;
|
||||
uint32 mcycles_68k;
|
||||
int16 SVP_cycles = 800;
|
||||
uint8 system_hw;
|
||||
void (*system_frame)(int do_skip);
|
||||
|
||||
static void system_frame_gen(int do_skip);
|
||||
static void system_frame_sms(int do_skip);
|
||||
static uint8 pause_b;
|
||||
static EQSTATE eq;
|
||||
static int32 llp,rrp;
|
||||
@ -62,7 +60,7 @@ static int32 llp,rrp;
|
||||
* Audio subsystem
|
||||
****************************************************************/
|
||||
|
||||
int audio_init (int samplerate, float framerate)
|
||||
int audio_init(int samplerate, float framerate)
|
||||
{
|
||||
/* Shutdown first */
|
||||
audio_shutdown();
|
||||
@ -77,11 +75,11 @@ int audio_init (int samplerate, float framerate)
|
||||
/* Calculate the sound buffer size (for one frame) */
|
||||
snd.buffer_size = (int)(samplerate / framerate) + 32;
|
||||
|
||||
/* SN76489 stream buffers */
|
||||
/* SN76489 stream buffer */
|
||||
snd.psg.buffer = (int16 *) malloc(snd.buffer_size * sizeof(int16));
|
||||
if (!snd.psg.buffer) return (-1);
|
||||
|
||||
/* YM2612 stream buffers */
|
||||
/* YM2612 stream buffer */
|
||||
snd.fm.buffer = (int32 *) malloc(snd.buffer_size * sizeof(int32) * 2);
|
||||
if (!snd.fm.buffer) return (-1);
|
||||
|
||||
@ -149,7 +147,7 @@ void audio_shutdown(void)
|
||||
Fir_Resampler_shutdown();
|
||||
}
|
||||
|
||||
int audio_update (void)
|
||||
int audio_update(void)
|
||||
{
|
||||
int32 i, l, r;
|
||||
int32 ll = llp;
|
||||
@ -234,8 +232,8 @@ int audio_update (void)
|
||||
|
||||
/* update sound buffer */
|
||||
#ifndef NGC
|
||||
snd.buffer[0][i] = r;
|
||||
snd.buffer[1][i] = l;
|
||||
snd.buffer[0][i] = l;
|
||||
snd.buffer[1][i] = r;
|
||||
#else
|
||||
*sb++ = r;
|
||||
*sb++ = l;
|
||||
@ -267,22 +265,6 @@ void system_init(void)
|
||||
vdp_init();
|
||||
render_init();
|
||||
sound_init();
|
||||
|
||||
switch (system_hw)
|
||||
{
|
||||
case SYSTEM_MD:
|
||||
case SYSTEM_PICO:
|
||||
{
|
||||
system_frame = system_frame_gen;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
system_frame = system_frame_sms;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
@ -304,10 +286,10 @@ void system_shutdown (void)
|
||||
SN76489_Shutdown();
|
||||
}
|
||||
|
||||
static void system_frame_gen(int do_skip)
|
||||
void system_frame_gen(int do_skip)
|
||||
{
|
||||
/* line counter */
|
||||
int line = 0;
|
||||
/* line counters */
|
||||
int start, end, line = 0;
|
||||
|
||||
/* Z80 interrupt flag */
|
||||
int zirq = 1;
|
||||
@ -331,11 +313,10 @@ static void system_frame_gen(int do_skip)
|
||||
/* display changed during VBLANK */
|
||||
if (bitmap.viewport.changed & 2)
|
||||
{
|
||||
bitmap.viewport.changed &= ~2;
|
||||
|
||||
/* interlaced modes */
|
||||
int old_interlaced = interlaced;
|
||||
int old_interlaced = interlaced;
|
||||
interlaced = (reg[12] & 0x02) >> 1;
|
||||
|
||||
if (old_interlaced != interlaced)
|
||||
{
|
||||
/* double resolution mode */
|
||||
@ -362,6 +343,11 @@ static void system_frame_gen(int do_skip)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* clear flag */
|
||||
bitmap.viewport.changed &= ~2;
|
||||
}
|
||||
|
||||
/* active screen height */
|
||||
if (reg[1] & 0x04)
|
||||
@ -494,8 +480,8 @@ static void system_frame_gen(int do_skip)
|
||||
status |= 0x08;
|
||||
|
||||
/* overscan area */
|
||||
int start = lines_per_frame - bitmap.viewport.y;
|
||||
int end = bitmap.viewport.h + bitmap.viewport.y;
|
||||
start = lines_per_frame - bitmap.viewport.y;
|
||||
end = bitmap.viewport.h + bitmap.viewport.y;
|
||||
|
||||
/* check viewport changes */
|
||||
if ((bitmap.viewport.w != bitmap.viewport.ow) || (bitmap.viewport.h != bitmap.viewport.oh))
|
||||
@ -646,10 +632,10 @@ static void system_frame_gen(int do_skip)
|
||||
}
|
||||
|
||||
|
||||
static void system_frame_sms(int do_skip)
|
||||
void system_frame_sms(int do_skip)
|
||||
{
|
||||
/* line counter */
|
||||
int line = 0;
|
||||
int start, end, line = 0;
|
||||
|
||||
/* reload H Counter */
|
||||
int h_counter = reg[10];
|
||||
@ -774,7 +760,7 @@ static void system_frame_sms(int do_skip)
|
||||
}
|
||||
|
||||
/* 3-D glasses faking: skip rendering of left lens frame */
|
||||
do_skip |= (work_ram[0x1ffb] & cart.special);
|
||||
do_skip |= (work_ram[0x1ffb] & cart.special & HW_3D_GLASSES);
|
||||
|
||||
/* Mega Drive VDP specific */
|
||||
if (system_hw & SYSTEM_MD)
|
||||
@ -894,8 +880,8 @@ static void system_frame_sms(int do_skip)
|
||||
}
|
||||
|
||||
/* overscan area */
|
||||
int start = lines_per_frame - bitmap.viewport.y;
|
||||
int end = bitmap.viewport.h + bitmap.viewport.y;
|
||||
start = lines_per_frame - bitmap.viewport.y;
|
||||
end = bitmap.viewport.h + bitmap.viewport.y;
|
||||
|
||||
/* check viewport changes */
|
||||
if ((bitmap.viewport.w != bitmap.viewport.ow) || (bitmap.viewport.h != bitmap.viewport.oh))
|
||||
|
@ -104,6 +104,7 @@ extern t_snd snd;
|
||||
extern uint32 mcycles_z80;
|
||||
extern uint32 mcycles_68k;
|
||||
extern uint32 mcycles_vdp;
|
||||
extern int16 SVP_cycles;
|
||||
extern uint8 system_hw;
|
||||
|
||||
/* Function prototypes */
|
||||
@ -115,7 +116,8 @@ extern void audio_set_equalizer(void);
|
||||
extern void system_init(void);
|
||||
extern void system_reset(void);
|
||||
extern void system_shutdown(void);
|
||||
extern void (*system_frame)(int do_skip);
|
||||
extern void system_frame_gen(int do_skip);
|
||||
extern void system_frame_sms(int do_skip);
|
||||
|
||||
#endif /* _SYSTEM_H_ */
|
||||
|
||||
|
@ -29,9 +29,8 @@ void set_config_defaults(void)
|
||||
config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */
|
||||
config.force_dtack = 0;
|
||||
config.addr_error = 1;
|
||||
config.tmss = 0;
|
||||
config.bios = 0;
|
||||
config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */
|
||||
config.romtype = 0; /* ROM mirroring type (see md_cart_hw.c) */
|
||||
|
||||
/* display options */
|
||||
config.overscan = 3; /* = both ON (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */
|
||||
|
@ -32,9 +32,9 @@ typedef struct
|
||||
uint8 force_dtack;
|
||||
uint8 addr_error;
|
||||
uint8 tmss;
|
||||
uint8 bios;
|
||||
uint8 lock_on;
|
||||
uint8 hot_swap;
|
||||
uint8 romtype;
|
||||
uint8 invert_mouse;
|
||||
uint8 gun_cursor[2];
|
||||
uint8 overscan;
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#include "osd.h"
|
||||
|
||||
FILE *error_log;
|
||||
static FILE *error_log;
|
||||
|
||||
void error_init(void)
|
||||
{
|
||||
@ -16,15 +16,20 @@ void error_init(void)
|
||||
|
||||
void error_shutdown(void)
|
||||
{
|
||||
#ifdef LOGERROR
|
||||
if(error_log) fclose(error_log);
|
||||
#endif
|
||||
}
|
||||
|
||||
void error(char *format, ...)
|
||||
{
|
||||
if (!log_error) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
if(error_log) vfprintf(error_log, format, ap);
|
||||
va_end(ap);
|
||||
#ifdef LOGERROR
|
||||
if (log_error)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
if(error_log) vfprintf(error_log, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,10 @@
|
||||
|
||||
#ifndef _ERROR_H_
|
||||
#define _ERROR_H_
|
||||
|
||||
/* Global variables */
|
||||
FILE *error_log;
|
||||
|
||||
/* Function prototypes */
|
||||
void error_init(void);
|
||||
void error_shutdown(void);
|
||||
void error(char *format, ...);
|
||||
|
||||
#endif /* _ERROR_H_ */
|
||||
|
||||
|
@ -44,6 +44,9 @@
|
||||
#include <windows.h>
|
||||
#include <zlib.h>
|
||||
|
||||
static int check_zip(char *filename);
|
||||
static int gzsize(gzFile *gd);
|
||||
|
||||
int load_archive(char *filename)
|
||||
{
|
||||
int size = 0;
|
||||
@ -147,7 +150,7 @@ int load_archive(char *filename)
|
||||
Verifies if a file is a ZIP archive or not.
|
||||
Returns: 1= ZIP archive, 0= not a ZIP archive
|
||||
*/
|
||||
int check_zip(char *filename)
|
||||
static int check_zip(char *filename)
|
||||
{
|
||||
uint8 buf[2];
|
||||
FILE *fd = fopen(filename, "rb");
|
||||
@ -162,7 +165,7 @@ int check_zip(char *filename)
|
||||
/*
|
||||
Returns the size of a GZ compressed file.
|
||||
*/
|
||||
int gzsize(gzFile *gd)
|
||||
static int gzsize(gzFile *gd)
|
||||
{
|
||||
#define CHUNKSIZE (0x10000)
|
||||
int size = 0, length = 0;
|
||||
|
@ -43,8 +43,6 @@
|
||||
#define _FILEIO_H_
|
||||
|
||||
/* Function prototypes */
|
||||
int load_archive(char *filename);
|
||||
int check_zip(char *filename);
|
||||
int gzsize(gzFile *gd);
|
||||
extern int load_archive(char *filename);
|
||||
|
||||
#endif /* _FILEIO_H_ */
|
||||
|
@ -144,7 +144,14 @@ static int sdl_video_init()
|
||||
|
||||
static void sdl_video_update()
|
||||
{
|
||||
system_frame(0);
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
system_frame_gen(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
system_frame_sms(0);
|
||||
}
|
||||
|
||||
/* viewport size changed */
|
||||
if(bitmap.viewport.changed & 1)
|
||||
@ -240,8 +247,8 @@ struct {
|
||||
|
||||
static Uint32 sdl_sync_timer_callback(Uint32 interval)
|
||||
{
|
||||
SDL_SemPost(sdl_sync.sem_sync);
|
||||
char caption[100];
|
||||
SDL_SemPost(sdl_sync.sem_sync);
|
||||
sdl_sync.ticks++;
|
||||
if (sdl_sync.ticks == (vdp_pal ? 50 : 20))
|
||||
{
|
||||
@ -302,7 +309,10 @@ static int sdl_control_update(SDLKey keystate)
|
||||
|
||||
case SDLK_F3:
|
||||
{
|
||||
config.render ^=1;
|
||||
int temp = config.bios & 3;
|
||||
config.bios &= ~3;
|
||||
if (temp == 0) config.bios |= 3;
|
||||
else if (temp == 3) config.bios |= 1;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -352,14 +362,11 @@ static int sdl_control_update(SDLKey keystate)
|
||||
|
||||
case SDLK_F9:
|
||||
{
|
||||
vdp_pal ^= 1;
|
||||
|
||||
/* reset region code */
|
||||
region_code &= ~0x40;
|
||||
region_code |= (vdp_pal << 6);
|
||||
config.region_detect = (config.region_detect + 1) % 5;
|
||||
region_autodetect();
|
||||
if (system_hw == SYSTEM_MD)
|
||||
{
|
||||
io_reg[0x00] = 0x20 | region_code | (config.tmss & 1);
|
||||
io_reg[0x00] = 0x20 | region_code | (config.bios & 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -369,9 +376,6 @@ static int sdl_control_update(SDLKey keystate)
|
||||
/* reinitialize audio timings */
|
||||
audio_init(snd.sample_rate, snd.frame_rate);
|
||||
|
||||
/* reinitialize sound emulation */
|
||||
sound_restore();
|
||||
|
||||
/* reintialize VDP */
|
||||
vdp_init();
|
||||
|
||||
@ -380,7 +384,7 @@ static int sdl_control_update(SDLKey keystate)
|
||||
{
|
||||
status = (status & ~1) | vdp_pal;
|
||||
}
|
||||
|
||||
|
||||
/* reinitialize VC max value */
|
||||
switch (bitmap.viewport.h)
|
||||
{
|
||||
@ -395,8 +399,8 @@ static int sdl_control_update(SDLKey keystate)
|
||||
break;
|
||||
}
|
||||
|
||||
/* reinitialize display area */
|
||||
bitmap.viewport.changed = 3;
|
||||
/* reinitialize sound emulation */
|
||||
sound_restore();
|
||||
break;
|
||||
}
|
||||
|
||||
@ -636,6 +640,7 @@ int sdl_input_update(void)
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
FILE *fp;
|
||||
int running = 1;
|
||||
|
||||
/* Print help if no game specified */
|
||||
@ -662,23 +667,37 @@ int main (int argc, char **argv)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* load BIOS */
|
||||
memset(bios_rom, 0, sizeof(bios_rom));
|
||||
FILE *f = fopen(OS_ROM, "rb");
|
||||
if (f!=NULL)
|
||||
/* mark all BIOS as unloaded */
|
||||
config.bios &= 0x01;
|
||||
|
||||
/* Genesis BOOT ROM support (2KB max) */
|
||||
memset(boot_rom, 0xFF, 0x800);
|
||||
fp = fopen(MD_BIOS, "rb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
fread(&bios_rom, 0x800,1,f);
|
||||
fclose(f);
|
||||
int i;
|
||||
for(i = 0; i < 0x800; i += 2)
|
||||
|
||||
/* read BOOT ROM */
|
||||
fread(boot_rom, 1, 0x800, fp);
|
||||
fclose(fp);
|
||||
|
||||
/* check BOOT ROM */
|
||||
if (!strncmp((char *)(boot_rom + 0x120),"GENESIS OS", 10))
|
||||
{
|
||||
uint8 temp = bios_rom[i];
|
||||
bios_rom[i] = bios_rom[i+1];
|
||||
bios_rom[i+1] = temp;
|
||||
/* mark Genesis BIOS as loaded */
|
||||
config.bios |= SYSTEM_MD;
|
||||
}
|
||||
|
||||
/* Byteswap ROM */
|
||||
for (i=0; i<0x800; i+=2)
|
||||
{
|
||||
uint8 temp = boot_rom[i];
|
||||
boot_rom[i] = boot_rom[i+1];
|
||||
boot_rom[i+1] = temp;
|
||||
}
|
||||
config.tmss |= 2;
|
||||
}
|
||||
|
||||
|
||||
/* initialize SDL */
|
||||
if(SDL_Init(0) < 0)
|
||||
{
|
||||
@ -714,11 +733,11 @@ int main (int argc, char **argv)
|
||||
system_init();
|
||||
|
||||
/* load SRAM */
|
||||
f = fopen("./game.srm", "rb");
|
||||
if (f!=NULL)
|
||||
fp = fopen("./game.srm", "rb");
|
||||
if (fp!=NULL)
|
||||
{
|
||||
fread(sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
fread(sram.sram,0x10000,1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
/* reset emulation */
|
||||
@ -759,11 +778,11 @@ int main (int argc, char **argv)
|
||||
}
|
||||
|
||||
/* save SRAM */
|
||||
f = fopen("./game.srm", "wb");
|
||||
if (f!=NULL)
|
||||
fp = fopen("./game.srm", "wb");
|
||||
if (fp!=NULL)
|
||||
{
|
||||
fwrite(sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
fwrite(sram.sram,0x10000,1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
system_shutdown();
|
||||
|
@ -6,5 +6,6 @@
|
||||
|
||||
extern int debug_on;
|
||||
extern int log_error;
|
||||
extern int sdl_input_update(void);
|
||||
|
||||
#endif /* _MAIN_H_ */
|
||||
|
@ -22,8 +22,10 @@
|
||||
|
||||
#define GG_ROM "./ggenie.bin"
|
||||
#define AR_ROM "./areplay.bin"
|
||||
#define OS_ROM "./bios.bin"
|
||||
#define SK_ROM "./sk.bin"
|
||||
#define SK_UPMEM "./sk2chip.bin"
|
||||
#define MD_BIOS "./bios.bin"
|
||||
#define MS_BIOS "./bios.sms"
|
||||
#define GG_BIOS "./bios.gg"
|
||||
|
||||
#endif /* _OSD_H_ */
|
||||
|