From 30dd0d1a0da1f0354354bc4c5dff9f956e8cbdad Mon Sep 17 00:00:00 2001 From: michniewski Date: Tue, 19 Aug 2008 06:05:57 +0000 Subject: [PATCH] - preliminary Wii DVD support (with libdi) - misc small dvd fixes --- Makefile.wii | 10 ++--- source/ngc/dvd.cpp | 95 ++++++++++++++++++++++++++--------------- source/ngc/filesel.cpp | 19 +++++++++ source/ngc/menu.cpp | 11 ++++- source/ngc/snes9xGX.cpp | 16 +++++-- source/ngc/video.cpp | 2 +- 6 files changed, 106 insertions(+), 47 deletions(-) diff --git a/Makefile.wii b/Makefile.wii index cf1083c..db7a909 100644 --- a/Makefile.wii +++ b/Makefile.wii @@ -21,27 +21,27 @@ TARGET := executables/snes9xgx-$(VERSION)-wii BUILD := build_wii SOURCES := source/snes9x source/ngc DATA := data -INCLUDES := source/snes9x source/ngc +INCLUDES := source/snes9x source/ngc #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \ - -DNGC -DHW_RVL -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \ + -DNGC -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \ -DSPC700_SHUTDOWN -DNEW_COLOUR_BLENDING \ -DNO_INLINE_GET_SET -DSDD1_DECOMP -DCORRECT_VRAM_READS \ -DDETECT_NASTY_FX_INTERLEAVE -DNGC_ZOOM -DSDUSE_LFN \ - -DFORCE_WII=1 $(CUSTOMFLAGS) \ + -DFORCE_WII -DWII_DVD $(CUSTOMFLAGS) \ -fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -pipe CXXFLAGS = $(CFLAGS) -LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--cref +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lpng -lmxml -lfat -lwiiuse -lz -lbte -logc -lm -lfreetype -ltinysmb +LIBS := -ldi -lpng -lmxml -lfat -lwiiuse -lz -lbte -logc -lm -lfreetype -ltinysmb #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/source/ngc/dvd.cpp b/source/ngc/dvd.cpp index 6a34333..58310b5 100644 --- a/source/ngc/dvd.cpp +++ b/source/ngc/dvd.cpp @@ -12,6 +12,10 @@ #include #include +#ifdef WII_DVD +#include +#endif + #include "menudraw.h" #include "snes9xGx.h" #include "unzip.h" @@ -24,8 +28,10 @@ u64 dvddir = 0; u64 dvdrootdir = 0; int dvddirlength = 0; +#ifdef HW_DOL /** DVD I/O Address base **/ volatile unsigned long *dvd = (volatile unsigned long *) 0xCC006000; +#endif /** Due to lack of memory, we'll use this little 2k keyhole for all DVD operations **/ unsigned char DVDreadbuffer[2048] ATTRIBUTE_ALIGN (32); @@ -37,10 +43,11 @@ unsigned char dvdbuffer[2048]; * * Gets and returns the dvd driveid **/ -static unsigned char *inquiry=(unsigned char *)0x80000004; - +#ifdef HW_DOL int dvd_driveid() { + static unsigned char *inquiry=(unsigned char *)0x80000004; + dvd[0] = 0x2e; dvd[1] = 0; dvd[2] = 0x12000000; @@ -56,44 +63,59 @@ int dvd_driveid() return (int)inquiry[2]; } +#endif + /** * dvd_read * * The only DVD function we need - you gotta luv gc-linux self-boots! + * returns: 1 - ok ; 0 - error */ int dvd_read (void *dst, unsigned int len, u64 offset) { - unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer; + unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer; - if (len > 2048) - return 1; /*** We only allow 2k reads **/ + if (len > 2048) + return 0; /*** We only allow 2k reads **/ - DCInvalidateRange ((void *) buffer, len); + DCInvalidateRange ((void *) buffer, len); - if(offset < 0x57057C00 || (isWii == true && offset < 0x118244F00LL)) // don't read past the end of the DVD - { - offset >>= 2; - dvd[0] = 0x2E; - dvd[1] = 0; - dvd[2] = 0xA8000000; - dvd[3] = (u32)offset; - dvd[4] = len; - dvd[5] = (unsigned long) buffer; - dvd[6] = len; - dvd[7] = 3; /*** Enable reading with DMA ***/ - while (dvd[7] & 1); - memcpy (dst, buffer, len); - } - else // Let's not read past end of DVD - return 0; - - if (dvd[0] & 0x4) /* Ensure it has completed */ - return 0; - - return 1; + if(offset < 0x57057C00 || (isWii == true && offset < 0x118244F00LL)) // don't read past the end of the DVD + { + offset >>= 2; + + #ifdef HW_DOL + + dvd[0] = 0x2E; + dvd[1] = 0; + dvd[2] = 0xA8000000; + dvd[3] = (u32)offset; + dvd[4] = len; + dvd[5] = (u32) buffer; + dvd[6] = len; + dvd[7] = 3; /*** Enable reading with DMA ***/ + while (dvd[7] & 1); + memcpy (dst, buffer, len); + + if (dvd[0] & 0x4) /* Ensure it has completed */ + return 0; + + return 1; + + #elif WII_DVD + int ret = 1; + ret = DI_ReadDVD(dst, (u32)len, (u32)offset); + if (ret==0) + return 1; + else + return 0; + #endif + } + else // Let's not read past end of DVD + return 0; } @@ -127,7 +149,7 @@ getpvd () /** Look for Joliet PVD first **/ while (sector < 32) { - if (dvd_read (dvdbuffer, 2048, (u64)(sector << 11))) + if (dvd_read (&dvdbuffer, 2048, (u64)(sector << 11))) { if (memcmp (&dvdbuffer, "\2CD001\1", 8) == 0) { @@ -138,7 +160,7 @@ getpvd () memcpy (&dvddirlength, &dvdbuffer[PVDROOT + FILE_LENGTH], 4); IsJoliet = 1; break; - } + } } else return 0; /*** Can't read sector! ***/ @@ -180,14 +202,15 @@ getpvd () ****************************************************************************/ bool TestDVD() { - // DVD not available on Wii - disable - #ifdef HW_RVL - return false; - #endif if (!getpvd()) { + #ifdef HW_DOL DVD_Mount(); + #elif WII_DVD + DI_Mount(); + while(DI_GetStatus() & DVD_INIT); + #endif if (!getpvd()) return false; } @@ -250,7 +273,7 @@ getentry (int entrycount) fname[j] = 0; if (strlen (fname) >= MAXJOLIET) - fname[MAXJOLIET] = 0; + fname[MAXJOLIET - 1] = 0; if (strlen (fname) == 0) fname[0] = filename[0]; @@ -285,7 +308,7 @@ getentry (int entrycount) *rr = 0; strcpy (filelist[entrycount].filename, fname); - fname[MAXDISPLAY] = 0; + fname[MAXDISPLAY - 1] = 0; strcpy (filelist[entrycount].displayname, fname); memcpy (&offset32, &dvdbuffer[diroffset + EXTENT], 4); @@ -488,6 +511,7 @@ LoadDVDFile (unsigned char *buffer) * * libOGC tends to foul up if you don't, and sometimes does if you do! ****************************************************************************/ +#ifdef HW_DOL void uselessinquiry () { dvd[0] = 0; @@ -518,4 +542,5 @@ void dvd_motor_off( ) dvd[0] = 0x14; dvd[1] = 0; } +#endif diff --git a/source/ngc/filesel.cpp b/source/ngc/filesel.cpp index 3808159..c2ddee5 100644 --- a/source/ngc/filesel.cpp +++ b/source/ngc/filesel.cpp @@ -19,6 +19,10 @@ #include #include +#ifdef WII_DVD +#include +#endif + #include "snes9x.h" #include "memmap.h" @@ -454,10 +458,25 @@ OpenDVD (int method) if (!getpvd()) { ShowAction((char*) "Loading DVD..."); + #ifdef HW_DOL DVD_Mount(); // mount the DVD unit again + #elif WII_DVD + u32 val; + DI_GetCoverRegister(&val); + if(val & 0x1) // True if no disc inside, use (val & 0x2) for true if disc inside. + { + WaitPrompt("No disc inserted!"); + return 0; + } + DI_Mount(); + while(DI_GetStatus() & DVD_INIT); + #endif if (!getpvd()) + { + WaitPrompt ((char *)"Invalid DVD."); return 0; // not a ISO9660 DVD + } } maxfiles = ParseDVDdirectory(); // load root folder diff --git a/source/ngc/menu.cpp b/source/ngc/menu.cpp index b167fe1..0a81330 100644 --- a/source/ngc/menu.cpp +++ b/source/ngc/menu.cpp @@ -18,6 +18,10 @@ #include #include +#ifdef WII_DVD +#include +#endif + #include "snes9x.h" #include "memmap.h" #include "debug.h" @@ -150,8 +154,8 @@ PreferencesMenu () GCSettings.SaveMethod++; #endif - // disable DVD access in Wii mode - #ifdef HW_RVL + // check if DVD access in Wii mode is disabled + #ifndef WII_DVD if(GCSettings.LoadMethod == METHOD_DVD) GCSettings.LoadMethod++; #endif @@ -977,6 +981,9 @@ mainmenu (int selectedMenu) case 6: // Exit to Loader #ifdef HW_RVL + #ifdef WII_DVD + DI_Close(); + #endif exit(0); #else // gamecube if (psoid[0] == PSOSDLOADID) diff --git a/source/ngc/snes9xGX.cpp b/source/ngc/snes9xGX.cpp index 19e5196..b79d40f 100644 --- a/source/ngc/snes9xGX.cpp +++ b/source/ngc/snes9xGX.cpp @@ -165,6 +165,10 @@ #include #include +#ifdef WII_DVD +#include +#endif + #include "snes9x.h" #include "memmap.h" #include "debug.h" @@ -578,7 +582,7 @@ NGCReportButtons () if ( GCSettings.AutoSave == 1 ) { - SaveSRAM(GCSettings.SaveMethod, SILENT ); + SaveSRAM ( GCSettings.SaveMethod, SILENT ); } else if ( GCSettings.AutoSave == 2 ) { @@ -831,15 +835,19 @@ emulate () int main () { +#ifdef WII_DVD + DI_Init(); // first +#endif + unsigned int save_flags; int selectedMenu = -1; - - #ifdef HW_RVL + +#ifdef HW_RVL WPAD_Init(); // read wiimote accelerometer and IR data WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL,640,480); - #endif +#endif /*** Initialise GC ***/ InitGCVideo (); /*** Get the ball rolling ***/ diff --git a/source/ngc/video.cpp b/source/ngc/video.cpp index c94fc73..14b6b97 100644 --- a/source/ngc/video.cpp +++ b/source/ngc/video.cpp @@ -401,7 +401,7 @@ clearscreen (int colour) memcpy ((char *) xfb[whichfb], (char *) backdrop, 640 * screenheight * 2); #else // on gc copy from aram - ARAMFetch ((char *) xfb[whichfb], (char *) AR_BACKDROP, 640 * screenheight * 2); // FIX + ARAMFetch ((char *) xfb[whichfb], (char *) AR_BACKDROP, 640 * screenheight * 2); #endif }