mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-06-02 16:48:43 +02:00
Compare commits
9 Commits
fdf7cfcdae
...
5eb1e83c18
Author | SHA1 | Date | |
---|---|---|---|
|
5eb1e83c18 | ||
|
0c45a8a8ab | ||
|
dbdb18eb50 | ||
|
dd619513a4 | ||
|
351d052e84 | ||
|
7f88a7c7f8 | ||
|
a0d68063ae | ||
|
a40d037d21 | ||
|
cd67bc5d5d |
|
@ -58,9 +58,10 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
|
||||||
* fixed byte access to font data registers
|
* fixed byte access to font data registers
|
||||||
* fixed memory mode register bits masking when read from MAIN-CPU and SUB-CPU (verified on real hardware, cf. Krikzz's mcd-verificator)
|
* fixed memory mode register bits masking when read from MAIN-CPU and SUB-CPU (verified on real hardware, cf. Krikzz's mcd-verificator)
|
||||||
* fixed pending level 1 interrupts when GFX interrupt is disabled (fixes random freezes when exiting "Batman Returns" option menu)
|
* fixed pending level 1 interrupts when GFX interrupt is disabled (fixes random freezes when exiting "Batman Returns" option menu)
|
||||||
* fixed CDD seek command again (Final Fight CD freeze with model 2 BIOS)
|
* fixed CDD seek command again (fixes Final Fight CD freeze with model 2 BIOS)
|
||||||
* fixed CDD status reported during seek/access time (fixes sound effect synchronization issue in Bari Arm)
|
* fixed CDD status reported during seek/access time (fixes sound effect synchronization issue in Bari Arm)
|
||||||
* fixed CDD position reset when disc is stopped (fixes random freezes in Spiderman vs Kingpin when switching between audio tracks)
|
* fixed CDD position reset when disc is stopped (fixes random freezes in Spiderman vs Kingpin when switching between audio tracks)
|
||||||
|
* fixed CDD seeking start delay (fixes Radical Rex incorrect PRG-RAM & Word-RAM initialization, causing missing sprites during intro) */
|
||||||
* fixed word access to CDD control register (fixes spurious audio track playback on startup with Mode 1 patched games using MSU-MD driver)
|
* fixed word access to CDD control register (fixes spurious audio track playback on startup with Mode 1 patched games using MSU-MD driver)
|
||||||
* fixed CD communication registers state on peripheral reset (fixes SUB-CPU side initialization in MSU-MD sample demo and some Mode 1 patched games using MSU-MD driver)
|
* fixed CD communication registers state on peripheral reset (fixes SUB-CPU side initialization in MSU-MD sample demo and some Mode 1 patched games using MSU-MD driver)
|
||||||
* fixed 32x32 pixels stamp index masking during GFX operation (fixes graphics rotation/scaling effects in "Chuck Rock II - Son of Chuck")
|
* fixed 32x32 pixels stamp index masking during GFX operation (fixes graphics rotation/scaling effects in "Chuck Rock II - Son of Chuck")
|
||||||
|
|
|
@ -7,7 +7,7 @@ ifeq ($(strip $(DEVKITPPC)),)
|
||||||
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC)
|
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(DEVKITPPC)/gamecube_rules
|
include $(DEVKITPRO)/libogc2/gamecube_rules
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# TARGET is the name of the output
|
# TARGET is the name of the output
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 3.8 MiB After Width: | Height: | Size: 3.8 MiB |
Binary file not shown.
Before Width: | Height: | Size: 4.0 MiB After Width: | Height: | Size: 4.0 MiB |
|
@ -2,7 +2,7 @@
|
||||||
* Genesis Plus
|
* Genesis Plus
|
||||||
* Mega Drive cartridge hardware support
|
* Mega Drive cartridge hardware support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2023 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2024 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Many cartridge protections were initially documented by Haze
|
* Many cartridge protections were initially documented by Haze
|
||||||
* (http://haze.mameworld.info/)
|
* (http://haze.mameworld.info/)
|
||||||
|
@ -465,7 +465,10 @@ void md_cart_init(void)
|
||||||
memset(&cart.hw, 0, sizeof(cart.hw));
|
memset(&cart.hw, 0, sizeof(cart.hw));
|
||||||
|
|
||||||
/* initialize default $200000-$20ffff mapping (for games using SRAM & ROM bankswitching) */
|
/* initialize default $200000-$20ffff mapping (for games using SRAM & ROM bankswitching) */
|
||||||
cart.hw.regs[0] = (0x200000 & cart.mask) >> 16;
|
if (m68k.memory_map[0x20].base == sram.sram)
|
||||||
|
{
|
||||||
|
cart.hw.regs[0] = (0x200000 & cart.mask) >> 16;
|
||||||
|
}
|
||||||
|
|
||||||
/* search for game into database */
|
/* search for game into database */
|
||||||
for (i=0; i<(sizeof(rom_database)/sizeof(md_entry_t)); i++)
|
for (i=0; i<(sizeof(rom_database)/sizeof(md_entry_t)); i++)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Genesis Plus
|
* Genesis Plus
|
||||||
* Mega Drive cartridge hardware support
|
* Mega Drive cartridge hardware support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2023 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2024 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Most cartridge protections were initially documented by Haze
|
* Most cartridge protections were initially documented by Haze
|
||||||
* (http://haze.mameworld.info/)
|
* (http://haze.mameworld.info/)
|
||||||
|
|
196
core/cd_hw/cdd.c
196
core/cd_hw/cdd.c
|
@ -1893,6 +1893,79 @@ void cdd_update(void)
|
||||||
/* udpate current track index */
|
/* udpate current track index */
|
||||||
cdd.index = index;
|
cdd.index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* seeking should start with at least one interrupt delay (fixes Radical Rex incorrect PRG-RAM & Word-RAM initialization, causing missing sprites during intro) */
|
||||||
|
if (scd.regs[0x38>>1].byte.h == CD_SEEK)
|
||||||
|
{
|
||||||
|
/* reset track index */
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
/* new LBA position */
|
||||||
|
int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 +
|
||||||
|
(scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 +
|
||||||
|
(scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150;
|
||||||
|
|
||||||
|
/* CD drive latency */
|
||||||
|
if (!cdd.latency)
|
||||||
|
{
|
||||||
|
/* Fixes a few games hanging because they expect data to be read with some delay */
|
||||||
|
/* Wolf Team games (Annet Futatabi, Aisle Lord, Cobra Command, Earnest Evans, Road Avenger & Time Gal) need at least 11 interrupts delay */
|
||||||
|
/* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 11 is OK) */
|
||||||
|
/* By default, at least two interrupts latency is required by current emulation model (BIOS hangs otherwise) */
|
||||||
|
cdd.latency = 2 + 9*config.cd_latency;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CD drive seek time */
|
||||||
|
/* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */
|
||||||
|
/* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */
|
||||||
|
/* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */
|
||||||
|
/* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */
|
||||||
|
/* It also works fine for Switch/Panic! intro (at least 30 interrupts are needed while seeking from 00:05:63 */
|
||||||
|
/* to 24:03:19 in Switch or when seeking from 00:05:60 to 24:06:07 in Panic!). */
|
||||||
|
if (lba > cdd.lba)
|
||||||
|
{
|
||||||
|
cdd.latency += (((lba - cdd.lba) * 120 * config.cd_latency) / 270000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cdd.latency += (((cdd.lba - lba) * 120 * config.cd_latency) / 270000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update current LBA */
|
||||||
|
cdd.lba = lba;
|
||||||
|
|
||||||
|
/* get track index */
|
||||||
|
while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last))
|
||||||
|
index++;
|
||||||
|
|
||||||
|
/* audio track ? */
|
||||||
|
if (cdd.toc.tracks[index].type == TYPE_AUDIO)
|
||||||
|
{
|
||||||
|
/* stay within track limits when seeking files */
|
||||||
|
if (lba < cdd.toc.tracks[index].start)
|
||||||
|
{
|
||||||
|
lba = cdd.toc.tracks[index].start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* seek to current track sector */
|
||||||
|
cdd_seek_audio(index, lba);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update current track index */
|
||||||
|
cdd.index = index;
|
||||||
|
|
||||||
|
/* seek to current subcode position */
|
||||||
|
if (cdd.toc.sub)
|
||||||
|
{
|
||||||
|
cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no audio track playing (yet) */
|
||||||
|
scd.regs[0x36>>1].byte.h = 0x01;
|
||||||
|
|
||||||
|
/* update CDD status to either PLAY or PAUSE depending on host command (will be reported to host once seeking has ended) */
|
||||||
|
cdd.status = scd.regs[0x42>>1].byte.h & 0x05;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cdd_process(void)
|
void cdd_process(void)
|
||||||
|
@ -2069,73 +2142,7 @@ void cdd_process(void)
|
||||||
|
|
||||||
case 0x03: /* Play */
|
case 0x03: /* Play */
|
||||||
{
|
{
|
||||||
/* reset track index */
|
/* RS0 should indicate seeking until drive is ready (fixes audio delay in Bari Arm) */
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
/* new LBA position */
|
|
||||||
int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 +
|
|
||||||
(scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 +
|
|
||||||
(scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150;
|
|
||||||
|
|
||||||
/* CD drive latency */
|
|
||||||
if (!cdd.latency)
|
|
||||||
{
|
|
||||||
/* Fixes a few games hanging because they expect data to be read with some delay */
|
|
||||||
/* Wolf Team games (Annet Futatabi, Aisle Lord, Cobra Command, Earnest Evans, Road Avenger & Time Gal) need at least 11 interrupts delay */
|
|
||||||
/* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 11 is OK) */
|
|
||||||
/* By default, at least two interrupts latency is required by current emulation model (BIOS hangs otherwise) */
|
|
||||||
cdd.latency = 2 + 9*config.cd_latency;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* CD drive seek time */
|
|
||||||
/* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */
|
|
||||||
/* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */
|
|
||||||
/* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */
|
|
||||||
/* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */
|
|
||||||
if (lba > cdd.lba)
|
|
||||||
{
|
|
||||||
cdd.latency += (((lba - cdd.lba) * 120 * config.cd_latency) / 270000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cdd.latency += (((cdd.lba - lba) * 120 * config.cd_latency) / 270000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update current LBA */
|
|
||||||
cdd.lba = lba;
|
|
||||||
|
|
||||||
/* get track index */
|
|
||||||
while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++;
|
|
||||||
|
|
||||||
/* audio track ? */
|
|
||||||
if (cdd.toc.tracks[index].type == TYPE_AUDIO)
|
|
||||||
{
|
|
||||||
/* stay within track limits when seeking files */
|
|
||||||
if (lba < cdd.toc.tracks[index].start)
|
|
||||||
{
|
|
||||||
lba = cdd.toc.tracks[index].start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* seek to current track sector */
|
|
||||||
cdd_seek_audio(index, lba);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update current track index */
|
|
||||||
cdd.index = index;
|
|
||||||
|
|
||||||
/* seek to current subcode position */
|
|
||||||
if (cdd.toc.sub)
|
|
||||||
{
|
|
||||||
cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no audio track playing (yet) */
|
|
||||||
scd.regs[0x36>>1].byte.h = 0x01;
|
|
||||||
|
|
||||||
/* update status (reported to host once seeking has ended) */
|
|
||||||
cdd.status = CD_PLAY;
|
|
||||||
|
|
||||||
/* RS0 should indicates seeking until drive is ready (fixes audio delay in Bari Arm) */
|
|
||||||
/* RS1=0xf to invalidate track infos in RS2-RS8 until drive is ready (fixes Snatcher Act 2 start cutscene) */
|
/* RS1=0xf to invalidate track infos in RS2-RS8 until drive is ready (fixes Snatcher Act 2 start cutscene) */
|
||||||
scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f;
|
scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f;
|
||||||
scd.regs[0x3a>>1].w = 0x0000;
|
scd.regs[0x3a>>1].w = 0x0000;
|
||||||
|
@ -2147,61 +2154,6 @@ void cdd_process(void)
|
||||||
|
|
||||||
case 0x04: /* Seek */
|
case 0x04: /* Seek */
|
||||||
{
|
{
|
||||||
/* reset track index */
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
/* new LBA position */
|
|
||||||
int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 +
|
|
||||||
(scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 +
|
|
||||||
(scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150;
|
|
||||||
|
|
||||||
/* CD drive seek time */
|
|
||||||
/* We are using similar linear model as above, although still not exactly accurate, */
|
|
||||||
/* it works fine for Switch/Panic! intro (Switch needs at least 30 interrupts while */
|
|
||||||
/* seeking from 00:05:63 to 24:03:19, Panic! when seeking from 00:05:60 to 24:06:07) */
|
|
||||||
if (lba > cdd.lba)
|
|
||||||
{
|
|
||||||
cdd.latency = ((lba - cdd.lba) * 120 * config.cd_latency) / 270000;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cdd.latency = ((cdd.lba - lba) * 120 * config.cd_latency) / 270000;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update current LBA */
|
|
||||||
cdd.lba = lba;
|
|
||||||
|
|
||||||
/* get current track index */
|
|
||||||
while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++;
|
|
||||||
|
|
||||||
/* audio track ? */
|
|
||||||
if (cdd.toc.tracks[index].type == TYPE_AUDIO)
|
|
||||||
{
|
|
||||||
/* stay within track limits when seeking files */
|
|
||||||
if (lba < cdd.toc.tracks[index].start)
|
|
||||||
{
|
|
||||||
lba = cdd.toc.tracks[index].start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* seek to current track sector */
|
|
||||||
cdd_seek_audio(index, lba);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update current track index */
|
|
||||||
cdd.index = index;
|
|
||||||
|
|
||||||
/* seek to current subcode position */
|
|
||||||
if (cdd.toc.sub)
|
|
||||||
{
|
|
||||||
cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no audio track playing */
|
|
||||||
scd.regs[0x36>>1].byte.h = 0x01;
|
|
||||||
|
|
||||||
/* update status (reported to host once seeking has ended) */
|
|
||||||
cdd.status = CD_PAUSE;
|
|
||||||
|
|
||||||
/* RS1=0xf to invalidate track infos in RS2-RS8 while seeking (fixes Final Fight CD intro when seek time is emulated) */
|
/* RS1=0xf to invalidate track infos in RS2-RS8 while seeking (fixes Final Fight CD intro when seek time is emulated) */
|
||||||
scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f;
|
scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f;
|
||||||
scd.regs[0x3a>>1].w = 0x0000;
|
scd.regs[0x3a>>1].w = 0x0000;
|
||||||
|
|
|
@ -292,7 +292,7 @@ void m68k_run(unsigned int cycles)
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
/* Trigger execution hook */
|
/* Trigger execution hook */
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_E, 0, REG_PC, 0);
|
cpu_hook(HOOK_M68K_E, 0, REG_PC, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -859,7 +859,7 @@ INLINE uint m68ki_read_8(uint address)
|
||||||
else val = READ_BYTE(temp->base, (address) & 0xffff);
|
else val = READ_BYTE(temp->base, (address) & 0xffff);
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_R, 1, address, val);
|
cpu_hook(HOOK_M68K_R, 1, address, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -879,7 +879,7 @@ INLINE uint m68ki_read_16(uint address)
|
||||||
else val = *(uint16 *)(temp->base + ((address) & 0xffff));
|
else val = *(uint16 *)(temp->base + ((address) & 0xffff));
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_R, 2, address, val);
|
cpu_hook(HOOK_M68K_R, 2, address, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -899,7 +899,7 @@ INLINE uint m68ki_read_32(uint address)
|
||||||
else val = m68k_read_immediate_32(address);
|
else val = m68k_read_immediate_32(address);
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_R, 4, address, val);
|
cpu_hook(HOOK_M68K_R, 4, address, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -913,7 +913,7 @@ INLINE void m68ki_write_8(uint address, uint value)
|
||||||
m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_W, 1, address, value);
|
cpu_hook(HOOK_M68K_W, 1, address, value);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -930,7 +930,7 @@ INLINE void m68ki_write_16(uint address, uint value)
|
||||||
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA); /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA); /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_W, 2, address, value);
|
cpu_hook(HOOK_M68K_W, 2, address, value);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -947,7 +947,7 @@ INLINE void m68ki_write_32(uint address, uint value)
|
||||||
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
m68ki_check_address_error(address, MODE_WRITE, FLAG_S | FUNCTION_CODE_USER_DATA) /* auto-disable (see m68kcpu.h) */
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_M68K_W, 4, address, value);
|
cpu_hook(HOOK_M68K_W, 4, address, value);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,15 @@
|
||||||
#define ALIGNED_(x) __attribute__ ((aligned(x)))
|
#define ALIGNED_(x) __attribute__ ((aligned(x)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Provide the compiler with branch prediction information */
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define LIKELY(x) __builtin_expect(!!(x), 1)
|
||||||
|
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
|
||||||
|
#else
|
||||||
|
#define LIKELY(x) x
|
||||||
|
#define UNLIKELY(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Default CD image file access (read-only) functions */
|
/* Default CD image file access (read-only) functions */
|
||||||
/* If you need to override default stdio.h functions with custom filesystem API,
|
/* If you need to override default stdio.h functions with custom filesystem API,
|
||||||
redefine following macros in platform specific include file (osd.h) or Makefile
|
redefine following macros in platform specific include file (osd.h) or Makefile
|
||||||
|
|
|
@ -2162,7 +2162,7 @@ static void vdp_bus_w(unsigned int data)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_VRAM_W, 2, addr, data);
|
cpu_hook(HOOK_VRAM_W, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2211,7 +2211,7 @@ static void vdp_bus_w(unsigned int data)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_CRAM_W, 2, addr, data);
|
cpu_hook(HOOK_CRAM_W, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2237,7 +2237,7 @@ static void vdp_bus_w(unsigned int data)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_VSRAM_W, 2, addr, data);
|
cpu_hook(HOOK_VSRAM_W, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2448,7 +2448,7 @@ static unsigned int vdp_68k_data_r_m5(void)
|
||||||
data = *(uint16 *)&vram[addr & 0xFFFE];
|
data = *(uint16 *)&vram[addr & 0xFFFE];
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_VRAM_R, 2, addr, data);
|
cpu_hook(HOOK_VRAM_R, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2477,7 +2477,7 @@ static unsigned int vdp_68k_data_r_m5(void)
|
||||||
data |= (fifo[fifo_idx] & ~0x7FF);
|
data |= (fifo[fifo_idx] & ~0x7FF);
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_VSRAM_R, 2, addr, data);
|
cpu_hook(HOOK_VSRAM_R, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2499,7 +2499,7 @@ static unsigned int vdp_68k_data_r_m5(void)
|
||||||
data |= (fifo[fifo_idx] & ~0xEEE);
|
data |= (fifo[fifo_idx] & ~0xEEE);
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_CRAM_R, 2, addr, data);
|
cpu_hook(HOOK_CRAM_R, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2518,7 +2518,7 @@ static unsigned int vdp_68k_data_r_m5(void)
|
||||||
data |= (fifo[fifo_idx] & ~0xFF);
|
data |= (fifo[fifo_idx] & ~0xFF);
|
||||||
|
|
||||||
#ifdef HOOK_CPU
|
#ifdef HOOK_CPU
|
||||||
if (cpu_hook)
|
if (UNLIKELY(cpu_hook))
|
||||||
cpu_hook(HOOK_VRAM_R, 2, addr, data);
|
cpu_hook(HOOK_VRAM_R, 2, addr, data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "filesel.h"
|
#include "filesel.h"
|
||||||
#include "file_slot.h"
|
#include "file_slot.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <iso9660.h>
|
#include <iso9660.h>
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
#include <di/di.h>
|
#include <di/di.h>
|
||||||
|
@ -81,8 +82,6 @@ static u8 dvdInited = 0;
|
||||||
static u8 dvdMounted = 0;
|
static u8 dvdMounted = 0;
|
||||||
|
|
||||||
#ifndef HW_RVL
|
#ifndef HW_RVL
|
||||||
static u8 dvdBuffer[2048] ATTRIBUTE_ALIGN(32);
|
|
||||||
|
|
||||||
static bool dvdStartup()
|
static bool dvdStartup()
|
||||||
{
|
{
|
||||||
DVD_Mount();
|
DVD_Mount();
|
||||||
|
@ -93,56 +92,6 @@ static bool dvdIsInserted()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool dvdReadSectors(u32 offset,u32 len,void *buffer)
|
|
||||||
{
|
|
||||||
vu32* const dvd = (u32*)0xCC006000;
|
|
||||||
offset = offset << 9;
|
|
||||||
len = len << 11;
|
|
||||||
|
|
||||||
/* DVD transfer must be done into a 32-byte aligned buffer */
|
|
||||||
while (len >= 2048)
|
|
||||||
{
|
|
||||||
DCInvalidateRange((void *)dvdBuffer, 2048);
|
|
||||||
dvd[0] = 0x2E;
|
|
||||||
dvd[1] = 0;
|
|
||||||
dvd[2] = 0xA8000000;
|
|
||||||
dvd[3] = offset;
|
|
||||||
dvd[4] = 2048;
|
|
||||||
dvd[5] = (u32) dvdBuffer;
|
|
||||||
dvd[6] = 2048;
|
|
||||||
dvd[7] = 3;
|
|
||||||
while (dvd[7] & 1);
|
|
||||||
if (dvd[0] & 4) return false;
|
|
||||||
memcpy (buffer, dvdBuffer, 2048);
|
|
||||||
len -= 2048;
|
|
||||||
buffer += 2048;
|
|
||||||
offset += 512;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process remaining bytes (normally not needed since libiso9960 already deals with this but you never know) */
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
/* DVD transfer length should be aligned to 32 bytes */
|
|
||||||
u32 dmasize = (len + 0x1f) & ~0x1f;
|
|
||||||
|
|
||||||
DCInvalidateRange((void *)dvdBuffer, dmasize);
|
|
||||||
dvd[0] = 0x2E;
|
|
||||||
dvd[1] = 0;
|
|
||||||
dvd[2] = 0xA8000000;
|
|
||||||
dvd[3] = offset;
|
|
||||||
dvd[4] = dmasize;
|
|
||||||
dvd[5] = (u32) dvdBuffer;
|
|
||||||
dvd[6] = dmasize;
|
|
||||||
dvd[7] = 3;
|
|
||||||
while (dvd[7] & 1);
|
|
||||||
if (dvd[0] & 4) return false;
|
|
||||||
|
|
||||||
memcpy (buffer, dvdBuffer, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -165,7 +114,6 @@ static int MountDVD(void)
|
||||||
/* patch libogc DVD interface which appears to be broken on Gamecube */
|
/* patch libogc DVD interface which appears to be broken on Gamecube */
|
||||||
dvd->startup = (FN_MEDIUM_STARTUP)dvdStartup;
|
dvd->startup = (FN_MEDIUM_STARTUP)dvdStartup;
|
||||||
dvd->isInserted = (FN_MEDIUM_ISINSERTED)dvdIsInserted;
|
dvd->isInserted = (FN_MEDIUM_ISINSERTED)dvdIsInserted;
|
||||||
dvd->readSectors = (FN_MEDIUM_READSECTORS)dvdReadSectors;
|
|
||||||
#endif
|
#endif
|
||||||
dvdInited = 1;
|
dvdInited = 1;
|
||||||
}
|
}
|
||||||
|
@ -284,11 +232,19 @@ int ParseDirectory(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dirent *entry = readdir(dir);
|
struct dirent *entry = NULL;
|
||||||
|
|
||||||
/* list entries */
|
/* list entries */
|
||||||
while ((entry != NULL)&& (nbfiles < MAXFILES))
|
do
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
/* next entry */
|
||||||
|
entry = readdir(dir);
|
||||||
|
if (entry == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* filter entries */
|
/* filter entries */
|
||||||
if ((entry->d_name[0] != '.')
|
if ((entry->d_name[0] != '.')
|
||||||
&& strncasecmp(".wav", &entry->d_name[strlen(entry->d_name) - 4], 4)
|
&& strncasecmp(".wav", &entry->d_name[strlen(entry->d_name) - 4], 4)
|
||||||
|
@ -303,10 +259,8 @@ int ParseDirectory(void)
|
||||||
}
|
}
|
||||||
nbfiles++;
|
nbfiles++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* next entry */
|
|
||||||
entry = readdir(dir);
|
|
||||||
}
|
}
|
||||||
|
while ((entry != NULL || errno == EOVERFLOW) && (nbfiles < MAXFILES));
|
||||||
|
|
||||||
/* close directory */
|
/* close directory */
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
|
|
@ -70,21 +70,9 @@ static u8 brm_format[0x40] =
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static int CardMount(int slot)
|
static int CardMount(int slot)
|
||||||
{
|
{
|
||||||
int tries = 0;
|
while (CARD_ProbeEx(slot, NULL, NULL) == CARD_ERROR_BUSY);
|
||||||
#ifdef HW_RVL
|
if (CARD_Mount(slot, SysArea, NULL) == CARD_ERROR_READY)
|
||||||
*(unsigned long *) (0xCD006800) |= 1 << 13; /*** Disable Encryption ***/
|
return 1;
|
||||||
#else
|
|
||||||
*(unsigned long *) (0xCC006800) |= 1 << 13; /*** Disable Encryption ***/
|
|
||||||
#endif
|
|
||||||
while (tries < 10)
|
|
||||||
{
|
|
||||||
VIDEO_WaitVSync ();
|
|
||||||
if (CARD_Mount(slot, SysArea, NULL) == CARD_ERROR_READY)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
EXI_ProbeReset ();
|
|
||||||
tries++;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +297,6 @@ void slot_autodetect(int slot, int device, t_slot *ptr)
|
||||||
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);
|
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);
|
||||||
|
|
||||||
/* Initialise the CARD system */
|
/* Initialise the CARD system */
|
||||||
memset(&SysArea, 0, CARD_WORKAREA);
|
|
||||||
CARD_Init("GENP", "00");
|
CARD_Init("GENP", "00");
|
||||||
|
|
||||||
/* CARD slot */
|
/* CARD slot */
|
||||||
|
@ -325,7 +312,7 @@ void slot_autodetect(int slot, int device, t_slot *ptr)
|
||||||
/* Retrieve date & close */
|
/* Retrieve date & close */
|
||||||
card_stat CardStatus;
|
card_stat CardStatus;
|
||||||
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
|
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
|
||||||
time_t rawtime = CardStatus.time;
|
time_t rawtime = CardStatus.time + 946684800;
|
||||||
struct tm *timeinfo = localtime(&rawtime);
|
struct tm *timeinfo = localtime(&rawtime);
|
||||||
ptr->year = 1900 + timeinfo->tm_year;
|
ptr->year = 1900 + timeinfo->tm_year;
|
||||||
ptr->month = timeinfo->tm_mon + 1;
|
ptr->month = timeinfo->tm_mon + 1;
|
||||||
|
@ -373,7 +360,6 @@ int slot_delete(int slot, int device)
|
||||||
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);
|
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);
|
||||||
|
|
||||||
/* Initialise the CARD system */
|
/* Initialise the CARD system */
|
||||||
memset(&SysArea, 0, CARD_WORKAREA);
|
|
||||||
CARD_Init("GENP", "00");
|
CARD_Init("GENP", "00");
|
||||||
|
|
||||||
/* CARD slot */
|
/* CARD slot */
|
||||||
|
@ -477,7 +463,6 @@ int slot_load(int slot, int device)
|
||||||
|
|
||||||
/* Initialise the CARD system */
|
/* Initialise the CARD system */
|
||||||
char action[64];
|
char action[64];
|
||||||
memset(&SysArea, 0, CARD_WORKAREA);
|
|
||||||
CARD_Init("GENP", "00");
|
CARD_Init("GENP", "00");
|
||||||
|
|
||||||
/* CARD slot */
|
/* CARD slot */
|
||||||
|
@ -530,12 +515,7 @@ int slot_load(int slot, int device)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read file sectors */
|
/* Read file sectors */
|
||||||
while (filesize > 0)
|
CARD_Read(&CardFile, &in[done], filesize, done);
|
||||||
{
|
|
||||||
CARD_Read(&CardFile, &in[done], SectorSize, done);
|
|
||||||
done += SectorSize;
|
|
||||||
filesize -= SectorSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Close file */
|
/* Close file */
|
||||||
CARD_Close(&CardFile);
|
CARD_Close(&CardFile);
|
||||||
|
@ -715,7 +695,6 @@ int slot_save(int slot, int device)
|
||||||
|
|
||||||
/* Initialise the CARD system */
|
/* Initialise the CARD system */
|
||||||
char action[64];
|
char action[64];
|
||||||
memset(&SysArea, 0, CARD_WORKAREA);
|
|
||||||
CARD_Init("GENP", "00");
|
CARD_Init("GENP", "00");
|
||||||
|
|
||||||
/* CARD slot */
|
/* CARD slot */
|
||||||
|
@ -763,6 +742,7 @@ int slot_save(int slot, int device)
|
||||||
|
|
||||||
/* compress file */
|
/* compress file */
|
||||||
compress2 ((Bytef *)&out[2112 + 4], &filesize, (Bytef *)buffer, done, 9);
|
compress2 ((Bytef *)&out[2112 + 4], &filesize, (Bytef *)buffer, done, 9);
|
||||||
|
done = 0;
|
||||||
|
|
||||||
/* Adjust file size */
|
/* Adjust file size */
|
||||||
filesize = filesize + 4 + 2112;
|
filesize = filesize + 4 + 2112;
|
||||||
|
@ -820,20 +800,24 @@ int slot_save(int slot, int device)
|
||||||
time(&rawtime);
|
time(&rawtime);
|
||||||
card_stat CardStatus;
|
card_stat CardStatus;
|
||||||
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
|
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
|
||||||
CardStatus.icon_addr = 0x0;
|
CardStatus.icon_addr = 0;
|
||||||
CardStatus.icon_fmt = 2;
|
CardStatus.icon_fmt = CARD_ICON_RGB;
|
||||||
CardStatus.icon_speed = 1;
|
CardStatus.icon_speed = CARD_SPEED_FAST;
|
||||||
CardStatus.comment_addr = 2048;
|
CardStatus.comment_addr = 2048;
|
||||||
CardStatus.time = rawtime;
|
CardStatus.time = rawtime - 946684800;
|
||||||
CARD_SetStatus(device, CardFile.filenum, &CardStatus);
|
CARD_SetStatus(device, CardFile.filenum, &CardStatus);
|
||||||
|
|
||||||
/* Write file sectors */
|
/* Write file sectors */
|
||||||
|
#ifdef HW_RVL
|
||||||
while (filesize > 0)
|
while (filesize > 0)
|
||||||
{
|
{
|
||||||
CARD_Write(&CardFile, &out[done], SectorSize, done);
|
CARD_Write(&CardFile, &out[done], SectorSize, done);
|
||||||
filesize -= SectorSize;
|
filesize -= SectorSize;
|
||||||
done += SectorSize;
|
done += SectorSize;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
CARD_Write(&CardFile, &out[done], filesize, done);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Close file */
|
/* Close file */
|
||||||
CARD_Close(&CardFile);
|
CARD_Close(&CardFile);
|
||||||
|
|
12
gx/gui/gui.c
12
gx/gui/gui.c
|
@ -791,7 +791,7 @@ int GUI_UpdateMenu(gui_menu *menu)
|
||||||
if (button->state & BUTTON_OVER_SFX)
|
if (button->state & BUTTON_OVER_SFX)
|
||||||
{
|
{
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (selected < (max_buttons + 2))
|
else if (selected < (max_buttons + 2))
|
||||||
|
@ -801,7 +801,7 @@ int GUI_UpdateMenu(gui_menu *menu)
|
||||||
if (button->state & BUTTON_OVER_SFX)
|
if (button->state & BUTTON_OVER_SFX)
|
||||||
{
|
{
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -832,7 +832,7 @@ int GUI_UpdateMenu(gui_menu *menu)
|
||||||
if (button->state & BUTTON_SELECT_SFX)
|
if (button->state & BUTTON_SELECT_SFX)
|
||||||
{
|
{
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_select_pcm,button_select_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_select_pcm,button_select_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1183,7 +1183,7 @@ int GUI_OptionWindow(gui_menu *parent, char *title, char *infos, char *items[],
|
||||||
if (selected >= 0)
|
if (selected >= 0)
|
||||||
{
|
{
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1455,7 +1455,7 @@ void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *optio
|
||||||
|
|
||||||
/* play sound effect */
|
/* play sound effect */
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
|
|
||||||
/* option callback */
|
/* option callback */
|
||||||
if (cb)
|
if (cb)
|
||||||
|
@ -1700,7 +1700,7 @@ void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1,
|
||||||
modified = 0;
|
modified = 0;
|
||||||
/* play sound effect */
|
/* play sound effect */
|
||||||
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size,
|
||||||
((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL);
|
((int)config.sfx_volume * MAX_VOLUME) / 100,((int)config.sfx_volume * MAX_VOLUME) / 100,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -702,7 +702,7 @@ static void update_screen_w(void)
|
||||||
|
|
||||||
static void update_bgm(void)
|
static void update_bgm(void)
|
||||||
{
|
{
|
||||||
SetVolumeOgg(((int)config.bgm_volume * 255) / 100);
|
SetVolumeOgg(((int)config.bgm_volume * MAX_VOLUME) / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prefmenu ()
|
static void prefmenu ()
|
||||||
|
@ -718,10 +718,10 @@ static void prefmenu ()
|
||||||
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
|
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
|
||||||
else sprintf (items[2].text, "Auto Saves: NONE");
|
else sprintf (items[2].text, "Auto Saves: NONE");
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB");
|
if (config.l_device == TYPE_USB) sprintf (items[3].text, "ROM Load Device: USB");
|
||||||
else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD");
|
else if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
|
||||||
#else
|
#else
|
||||||
if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD");
|
if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
|
||||||
#endif
|
#endif
|
||||||
else sprintf (items[3].text, "ROM Load Device: SD");
|
else sprintf (items[3].text, "ROM Load Device: SD");
|
||||||
if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A");
|
if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A");
|
||||||
|
@ -771,12 +771,12 @@ static void prefmenu ()
|
||||||
|
|
||||||
case 3: /*** Default ROM device ***/
|
case 3: /*** Default ROM device ***/
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
config.l_device = (config.l_device + 1) % 3;
|
config.l_device = (config.l_device + 1) % (TYPE_DVD + 1);
|
||||||
if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB");
|
if (config.l_device == TYPE_USB) sprintf (items[3].text, "ROM Load Device: USB");
|
||||||
else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD");
|
else if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
|
||||||
#else
|
#else
|
||||||
config.l_device ^= 1;
|
config.l_device ^= 1;
|
||||||
if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD");
|
if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
|
||||||
#endif
|
#endif
|
||||||
else sprintf (items[3].text, "ROM Load Device: SD");
|
else sprintf (items[3].text, "ROM Load Device: SD");
|
||||||
break;
|
break;
|
||||||
|
@ -871,21 +871,13 @@ static void prefmenu ()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stop DVD drive when not in use */
|
/* stop DVD drive when not in use */
|
||||||
if (config.l_device != 2)
|
if (config.l_device != TYPE_DVD)
|
||||||
{
|
{
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
DI_StopMotor();
|
DI_StopMotor();
|
||||||
#else
|
#else
|
||||||
vu32* const dvd = (u32*)0xCC006000;
|
dvdcmdblk blk;
|
||||||
dvd[0] = 0x2e;
|
DVD_StopMotor(&blk);
|
||||||
dvd[1] = 0;
|
|
||||||
dvd[2] = 0xe3000000;
|
|
||||||
dvd[3] = 0;
|
|
||||||
dvd[4] = 0;
|
|
||||||
dvd[5] = 0;
|
|
||||||
dvd[6] = 0;
|
|
||||||
dvd[7] = 1;
|
|
||||||
while (dvd[7] & 1);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -218,6 +218,6 @@ void gx_audio_Stop(void)
|
||||||
{
|
{
|
||||||
PauseOgg(0);
|
PauseOgg(0);
|
||||||
PlayOgg((char *)Bg_music_ogg, Bg_music_ogg_size, 0, OGG_INFINITE_TIME);
|
PlayOgg((char *)Bg_music_ogg, Bg_music_ogg_size, 0, OGG_INFINITE_TIME);
|
||||||
SetVolumeOgg(((int)config.bgm_volume * 255) / 100);
|
SetVolumeOgg(((int)config.bgm_volume * MAX_VOLUME) / 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -359,8 +359,7 @@ static u8 screenDisplayList[32] ATTRIBUTE_ALIGN(32) =
|
||||||
static void vi_callback(u32 cnt)
|
static void vi_callback(u32 cnt)
|
||||||
{
|
{
|
||||||
/* get audio DMA remaining length */
|
/* get audio DMA remaining length */
|
||||||
vu16* const _dspReg = (u16*)0xCC005000;
|
u16 remain = AUDIO_GetDMABytesLeft() / 32;
|
||||||
u16 remain = _dspReg[29];
|
|
||||||
|
|
||||||
/* adjust desired output samplerate if audio playback is not perfectly in sync with video */
|
/* adjust desired output samplerate if audio playback is not perfectly in sync with video */
|
||||||
if (remain > 0)
|
if (remain > 0)
|
||||||
|
@ -1885,7 +1884,7 @@ void gx_video_Init(void)
|
||||||
/* Configure VI */
|
/* Configure VI */
|
||||||
VIDEO_Configure(vmode);
|
VIDEO_Configure(vmode);
|
||||||
|
|
||||||
/* Initialize font first (to ensure IPL font buffer is allocated in MEM1 as DMA from EXI bus to MEM2 is apparently not possible) */
|
/* Initialize font first (to ensure IPL font buffer is allocated in MEM1 as DMA from EXI bus to MEM2 is apparently not possible with libogc) */
|
||||||
FONT_Init();
|
FONT_Init();
|
||||||
|
|
||||||
/* Allocate framebuffers */
|
/* Allocate framebuffers */
|
||||||
|
@ -1893,7 +1892,7 @@ void gx_video_Init(void)
|
||||||
xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i));
|
xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i));
|
||||||
|
|
||||||
/* Define a console */
|
/* Define a console */
|
||||||
console_init(xfb[0], 20, 64, 640, 574, 574 * 2);
|
console_init(xfb[0], 0, 0, vmode->fbWidth, vmode->xfbHeight, vmode->fbWidth * VI_DISPLAY_PIX_SZ);
|
||||||
|
|
||||||
/* Clear framebuffer to black */
|
/* Clear framebuffer to black */
|
||||||
VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK);
|
VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK);
|
||||||
|
|
|
@ -452,7 +452,7 @@ int PlayOgg(char * buf, int buflen, int time_pos, int mode)
|
||||||
|
|
||||||
private_ogg.mode = mode;
|
private_ogg.mode = mode;
|
||||||
private_ogg.eof = 0;
|
private_ogg.eof = 0;
|
||||||
private_ogg.volume = 127;
|
private_ogg.volume = MID_VOLUME;
|
||||||
private_ogg.flag = 0;
|
private_ogg.flag = 0;
|
||||||
private_ogg.seek_time = -1;
|
private_ogg.seek_time = -1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user