- preliminary Wii DVD support (with libdi)

- misc small dvd fixes
This commit is contained in:
michniewski 2008-08-19 06:05:57 +00:00
parent 0ca6590c3f
commit 30dd0d1a0d
6 changed files with 106 additions and 47 deletions

View File

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

View File

@ -12,6 +12,10 @@
#include <stdlib.h>
#include <string.h>
#ifdef WII_DVD
#include <di/di.h>
#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

View File

@ -19,6 +19,10 @@
#include <wiiuse/wpad.h>
#include <sys/dir.h>
#ifdef WII_DVD
#include <di/di.h>
#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

View File

@ -18,6 +18,10 @@
#include <string.h>
#include <wiiuse/wpad.h>
#ifdef WII_DVD
#include <di/di.h>
#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)

View File

@ -165,6 +165,10 @@
#include <sdcard/card_io.h>
#include <fat.h>
#ifdef WII_DVD
#include <di/di.h>
#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 ***/

View File

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