diff --git a/Makefile.gc b/Makefile.gc index 9650172cf..ca8f23974 100644 --- a/Makefile.gc +++ b/Makefile.gc @@ -7,7 +7,7 @@ ifeq ($(strip $(DEVKITPPC)),) $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC) endif -include $(DEVKITPPC)/gamecube_rules +include $(DEVKITPRO)/libogc2/gamecube_rules #--------------------------------------------------------------------------------- # TARGET is the name of the output diff --git a/builds/genplus_cube.dol b/builds/genplus_cube.dol index 7e26b0329..f39ebc7a8 100644 Binary files a/builds/genplus_cube.dol and b/builds/genplus_cube.dol differ diff --git a/builds/genplus_wii.dol b/builds/genplus_wii.dol index d4a47526f..361aa19f7 100644 Binary files a/builds/genplus_wii.dol and b/builds/genplus_wii.dol differ diff --git a/gx/fileio/file_load.c b/gx/fileio/file_load.c index 0aa6980ba..2b6c977f3 100644 --- a/gx/fileio/file_load.c +++ b/gx/fileio/file_load.c @@ -44,6 +44,7 @@ #include "filesel.h" #include "file_slot.h" +#include #include #ifdef HW_RVL #include @@ -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 @@ -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; } @@ -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; @@ -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) @@ -303,10 +263,8 @@ int ParseDirectory(void) } nbfiles++; } - - /* next entry */ - entry = readdir(dir); } + while ((entry != NULL || errno == EOVERFLOW) && (nbfiles < MAXFILES)); /* close directory */ closedir(dir); diff --git a/gx/fileio/file_slot.c b/gx/fileio/file_slot.c index f12ff56b8..9d31bf6a4 100644 --- a/gx/fileio/file_slot.c +++ b/gx/fileio/file_slot.c @@ -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 */ @@ -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; } @@ -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 */ @@ -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; @@ -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 */ @@ -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 */ @@ -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); @@ -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 */ @@ -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; @@ -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); diff --git a/gx/gui/gui.c b/gx/gui/gui.c index 8475c1c72..0dc749a9c 100644 --- a/gx/gui/gui.c +++ b/gx/gui/gui.c @@ -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)) @@ -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); } } @@ -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); } } } @@ -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); } } @@ -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) @@ -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); } } diff --git a/gx/gui/menu.c b/gx/gui/menu.c index 0964fe1b9..5173374ac 100644 --- a/gx/gui/menu.c +++ b/gx/gui/menu.c @@ -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 () @@ -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"); @@ -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; @@ -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 } diff --git a/gx/gx_audio.c b/gx/gx_audio.c index 1e619bc5c..fdc991ada 100644 --- a/gx/gx_audio.c +++ b/gx/gx_audio.c @@ -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); } } diff --git a/gx/gx_video.c b/gx/gx_video.c index 6a00bee0b..87ef596b0 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -359,8 +359,7 @@ static u8 screenDisplayList[32] ATTRIBUTE_ALIGN(32) = static void vi_callback(u32 cnt) { /* get audio DMA remaining length */ - vu16* const _dspReg = (u16*)0xCC005000; - u16 remain = _dspReg[29]; + u16 remain = AUDIO_GetDMABytesLeft() / 32; /* adjust desired output samplerate if audio playback is not perfectly in sync with video */ if (remain > 0) @@ -1885,7 +1884,7 @@ void gx_video_Init(void) /* Configure VI */ 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(); /* Allocate framebuffers */ @@ -1893,7 +1892,7 @@ void gx_video_Init(void) xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); /* 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 */ VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK); diff --git a/gx/main.c b/gx/main.c index 352285dd5..0f51fea63 100644 --- a/gx/main.c +++ b/gx/main.c @@ -319,8 +319,8 @@ void shutdown(void) #ifdef HW_RVL /* unmount all devices */ ISO9660_Unmount("dvd:"); - fatUnmount("sd"); - fatUnmount("usb"); + fatUnmount("sd:"); + fatUnmount("usb:"); /* shutdown all devices */ DI_Close(); diff --git a/gx/utils/oggplayer.c b/gx/utils/oggplayer.c index 2dcd37b8d..63aa31dff 100644 --- a/gx/utils/oggplayer.c +++ b/gx/utils/oggplayer.c @@ -452,7 +452,7 @@ int PlayOgg(char * buf, int buflen, int time_pos, int mode) private_ogg.mode = mode; private_ogg.eof = 0; - private_ogg.volume = 127; + private_ogg.volume = MID_VOLUME; private_ogg.flag = 0; private_ogg.seek_time = -1;