Compare commits

...

9 Commits

19 changed files with 154 additions and 260 deletions

View File

@ -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")

View File

@ -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

View File

@ -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++)

View File

@ -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/)

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }
} }

View File

@ -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
} }

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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;