Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate GameCube port to libogc2 #538

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile.gc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC)
endif

include $(DEVKITPPC)/gamecube_rules
include $(DEVKITPRO)/libogc2/gamecube_rules

#---------------------------------------------------------------------------------
# TARGET is the name of the output
Expand Down
Binary file modified builds/genplus_cube.dol
Binary file not shown.
Binary file modified builds/genplus_wii.dol
Binary file not shown.
82 changes: 20 additions & 62 deletions gx/fileio/file_load.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include "filesel.h"
#include "file_slot.h"

#include <errno.h>
#include <iso9660.h>
#ifdef HW_RVL
#include <di/di.h>
Expand Down Expand Up @@ -81,66 +82,14 @@ static u8 dvdInited = 0;
static u8 dvdMounted = 0;

#ifndef HW_RVL
static u8 dvdBuffer[2048] ATTRIBUTE_ALIGN(32);

static bool dvdStartup()
static bool dvdStartup(DISC_INTERFACE *disc)
{
DVD_Mount();
return true;
}

static bool dvdIsInserted()
{
return true;
}

static bool dvdReadSectors(u32 offset,u32 len,void *buffer)
static bool dvdIsInserted(DISC_INTERFACE *disc)
{
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
Expand All @@ -163,9 +112,8 @@ static int MountDVD(void)
DVD_Init();

/* patch libogc DVD interface which appears to be broken on Gamecube */
dvd->startup = (FN_MEDIUM_STARTUP)dvdStartup;
dvd->isInserted = (FN_MEDIUM_ISINSERTED)dvdIsInserted;
dvd->readSectors = (FN_MEDIUM_READSECTORS)dvdReadSectors;
*(FN_MEDIUM_STARTUP *)&dvd->startup = dvdStartup;
*(FN_MEDIUM_ISINSERTED *)&dvd->isInserted = dvdIsInserted;
#endif
dvdInited = 1;
}
Expand All @@ -179,7 +127,11 @@ static int MountDVD(void)
}

/* check if disc is found */
#ifdef HW_RVL
if(!dvd->isInserted())
#else
if(!dvd->isInserted(dvd))
#endif
{
GUI_WaitPrompt("Error","No Disc inserted !");
return 0;
Expand Down Expand Up @@ -284,11 +236,19 @@ int ParseDirectory(void)
return -1;
}

struct dirent *entry = readdir(dir);
struct dirent *entry = NULL;

/* list entries */
while ((entry != NULL)&& (nbfiles < MAXFILES))
do
{
errno = 0;
/* next entry */
entry = readdir(dir);
if (entry == NULL)
{
continue;
}

/* filter entries */
if ((entry->d_name[0] != '.')
&& strncasecmp(".wav", &entry->d_name[strlen(entry->d_name) - 4], 4)
Expand All @@ -303,10 +263,8 @@ int ParseDirectory(void)
}
nbfiles++;
}

/* next entry */
entry = readdir(dir);
}
while ((entry != NULL || errno == EOVERFLOW) && (nbfiles < MAXFILES));

/* close directory */
closedir(dir);
Expand Down
47 changes: 17 additions & 30 deletions gx/fileio/file_slot.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
/**
* libOGC CARD System Work Area
*/
#ifndef CARD_WORKAREA
#define CARD_WORKAREA CARD_WORKAREA_SIZE
#endif
static u8 SysArea[CARD_WORKAREA] ATTRIBUTE_ALIGN (32);

/* Mega CD backup RAM stuff */
Expand All @@ -70,21 +73,9 @@ static u8 brm_format[0x40] =
*****************************************************************************/
static int CardMount(int slot)
{
int tries = 0;
#ifdef HW_RVL
*(unsigned long *) (0xCD006800) |= 1 << 13; /*** Disable Encryption ***/
#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++;
}
while (CARD_ProbeEx(slot, NULL, NULL) == CARD_ERROR_BUSY);
if (CARD_Mount(slot, SysArea, NULL) == CARD_ERROR_READY)
return 1;
return 0;
}

Expand Down Expand Up @@ -309,7 +300,6 @@ void slot_autodetect(int slot, int device, t_slot *ptr)
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);

/* Initialise the CARD system */
memset(&SysArea, 0, CARD_WORKAREA);
CARD_Init("GENP", "00");

/* CARD slot */
Expand All @@ -325,7 +315,7 @@ void slot_autodetect(int slot, int device, t_slot *ptr)
/* Retrieve date & close */
card_stat CardStatus;
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
time_t rawtime = CardStatus.time;
time_t rawtime = CardStatus.time + 946684800;
struct tm *timeinfo = localtime(&rawtime);
ptr->year = 1900 + timeinfo->tm_year;
ptr->month = timeinfo->tm_mon + 1;
Expand Down Expand Up @@ -373,7 +363,6 @@ int slot_delete(int slot, int device)
sprintf(filename,"MD-%04X.srm", rominfo.realchecksum);

/* Initialise the CARD system */
memset(&SysArea, 0, CARD_WORKAREA);
CARD_Init("GENP", "00");

/* CARD slot */
Expand Down Expand Up @@ -477,7 +466,6 @@ int slot_load(int slot, int device)

/* Initialise the CARD system */
char action[64];
memset(&SysArea, 0, CARD_WORKAREA);
CARD_Init("GENP", "00");

/* CARD slot */
Expand Down Expand Up @@ -530,12 +518,7 @@ int slot_load(int slot, int device)
}

/* Read file sectors */
while (filesize > 0)
{
CARD_Read(&CardFile, &in[done], SectorSize, done);
done += SectorSize;
filesize -= SectorSize;
}
CARD_Read(&CardFile, &in[done], filesize, done);

/* Close file */
CARD_Close(&CardFile);
Expand Down Expand Up @@ -715,7 +698,6 @@ int slot_save(int slot, int device)

/* Initialise the CARD system */
char action[64];
memset(&SysArea, 0, CARD_WORKAREA);
CARD_Init("GENP", "00");

/* CARD slot */
Expand Down Expand Up @@ -763,6 +745,7 @@ int slot_save(int slot, int device)

/* compress file */
compress2 ((Bytef *)&out[2112 + 4], &filesize, (Bytef *)buffer, done, 9);
done = 0;

/* Adjust file size */
filesize = filesize + 4 + 2112;
Expand Down Expand Up @@ -820,20 +803,24 @@ int slot_save(int slot, int device)
time(&rawtime);
card_stat CardStatus;
CARD_GetStatus(device, CardFile.filenum, &CardStatus);
CardStatus.icon_addr = 0x0;
CardStatus.icon_fmt = 2;
CardStatus.icon_speed = 1;
CardStatus.icon_addr = 0;
CardStatus.icon_fmt = CARD_ICON_RGB;
CardStatus.icon_speed = CARD_SPEED_FAST;
CardStatus.comment_addr = 2048;
CardStatus.time = rawtime;
CardStatus.time = rawtime - 946684800;
CARD_SetStatus(device, CardFile.filenum, &CardStatus);

/* Write file sectors */
#ifdef HW_RVL
while (filesize > 0)
{
CARD_Write(&CardFile, &out[done], SectorSize, done);
filesize -= SectorSize;
done += SectorSize;
}
#else
CARD_Write(&CardFile, &out[done], filesize, done);
#endif

/* Close file */
CARD_Close(&CardFile);
Expand Down
12 changes: 6 additions & 6 deletions gx/gui/gui.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@ int GUI_UpdateMenu(gui_menu *menu)
if (button->state & BUTTON_OVER_SFX)
{
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))
Expand All @@ -801,7 +801,7 @@ int GUI_UpdateMenu(gui_menu *menu)
if (button->state & BUTTON_OVER_SFX)
{
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);
}
}

Expand Down Expand Up @@ -832,7 +832,7 @@ int GUI_UpdateMenu(gui_menu *menu)
if (button->state & BUTTON_SELECT_SFX)
{
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);
}
}
}
Expand Down Expand Up @@ -1183,7 +1183,7 @@ int GUI_OptionWindow(gui_menu *parent, char *title, char *infos, char *items[],
if (selected >= 0)
{
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);
}
}

Expand Down Expand Up @@ -1455,7 +1455,7 @@ void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *optio

/* play sound effect */
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 */
if (cb)
Expand Down Expand Up @@ -1700,7 +1700,7 @@ void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1,
modified = 0;
/* play sound effect */
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);
}
}

Expand Down
30 changes: 11 additions & 19 deletions gx/gui/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ static void update_screen_w(void)

static void update_bgm(void)
{
SetVolumeOgg(((int)config.bgm_volume * 255) / 100);
SetVolumeOgg(((int)config.bgm_volume * MAX_VOLUME) / 100);
}

static void prefmenu ()
Expand All @@ -718,10 +718,10 @@ static void prefmenu ()
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
else sprintf (items[2].text, "Auto Saves: NONE");
#ifdef HW_RVL
if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB");
else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD");
if (config.l_device == TYPE_USB) sprintf (items[3].text, "ROM Load Device: USB");
else if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
#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
else sprintf (items[3].text, "ROM Load Device: SD");
if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A");
Expand Down Expand Up @@ -771,12 +771,12 @@ static void prefmenu ()

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, "ROM Load Device: USB");
else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD");
config.l_device = (config.l_device + 1) % (TYPE_DVD + 1);
if (config.l_device == TYPE_USB) sprintf (items[3].text, "ROM Load Device: USB");
else if (config.l_device == TYPE_DVD) sprintf (items[3].text, "ROM Load Device: DVD");
#else
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
else sprintf (items[3].text, "ROM Load Device: SD");
break;
Expand Down Expand Up @@ -871,21 +871,13 @@ static void prefmenu ()
}

/* stop DVD drive when not in use */
if (config.l_device != 2)
if (config.l_device != TYPE_DVD)
{
#ifdef HW_RVL
DI_StopMotor();
#else
vu32* const dvd = (u32*)0xCC006000;
dvd[0] = 0x2e;
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);
dvdcmdblk blk;
DVD_StopMotor(&blk);
#endif
}

Expand Down
2 changes: 1 addition & 1 deletion gx/gx_audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,6 @@ void gx_audio_Stop(void)
{
PauseOgg(0);
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);
}
}
Loading