-Fixes to get compile in GC & Wii

-Rearrange of some functions
This commit is contained in:
askot.altair 2008-07-04 03:50:38 +00:00
parent 6f1dea5b2d
commit 8cdf9df10c
11 changed files with 206 additions and 178 deletions

View File

@ -19,7 +19,6 @@ static int whichab = 0; /*** Which Audio Buffer is in use ***/
static int isPlaying; /*** Is Playing ***/
static void AudioSwitchBuffers()
{
if ( buffSize[whichab] ) {
AUDIO_StopDMA();
AUDIO_InitDMA((u32)audiobuffer[whichab], buffSize[whichab]);
@ -34,13 +33,8 @@ static void AudioSwitchBuffers()
void InitialiseSound()
{
AUDIO_Init(NULL); /*** Start audio subsystem ***/
/*** Set default samplerate to 48khz ***/
AUDIO_SetDSPSampleRate(AI_SAMPLERATE_48KHZ);
/*** and the DMA Callback ***/
AUDIO_RegisterDMACallback( AudioSwitchBuffers );
buffSize[0] = buffSize[1] = 0;

View File

@ -12,19 +12,27 @@
#include <string.h>
#include <gctypes.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <unistd.h>
#include "gcdvd.h"
#include "iplfont.h"
#ifdef __gamecube__
#include "sz.h"
#endif
FILE *filehandle = NULL;
#define MAXFILES 1000
// From libfat MAX_FILENAME_LENGTH
#define MAX_PATH_LEN 768
typedef struct {
/*typedef struct {
char filename[MAX_PATH_LEN+1];
u64 offset;
unsigned int length;
char flags;
}FILEENTRIES;
}FILEENTRIES;*/
/*** Simplified Directory Entry Record
I only care about a couple of values ***/
@ -52,10 +60,13 @@ volatile long *dvd=(volatile long *)0xCC006000;
extern void SendDriveCode( int model );
extern int font_height;
extern bool isZipFile();
extern void writex(int x, int y, int sx, int sy, char *string, unsigned int selected);
extern int unzipDVDFile(unsigned char *outbuffer, unsigned int discoffset, unsigned int length);
//extern void writex(int x, int y, int sx, int sy, char *string, unsigned int selected);
extern unsigned char *nesromptr;
extern int IsXenoGCImage( char *buffer );
int LoadDVDFile( unsigned char *buffer );
void GetSDInfo ();
extern u8 ChosenSlot;
@ -66,9 +77,7 @@ u8 UseSDCARD = 0;
u8 UseWiiSDCARD = 0;
char rootSDdir[MAX_PATH_LEN];
char rootWiiSDdir[MAX_PATH_LEN];
int haveSDdir = 0;
int haveWiiSDdir = 0;
int sdslot = 0;
/****************************************************************************
@ -426,6 +435,33 @@ int parsedir() {
}
#endif
/***************************************************************************
* FileSortCallback
*
* Quick sort callback to sort file entries with the following order:
* .
* ..
* <dirs>
* <files>
***************************************************************************/
static int FileSortCallback(const void *f1, const void *f2)
{
/* Special case for implicit directories */
if(((FILEENTRIES *)f1)->filename[0] == '.' || ((FILEENTRIES *)f2)->filename[0] == '.')
{
if(strcmp(((FILEENTRIES *)f1)->filename, ".") == 0) { return -1; }
if(strcmp(((FILEENTRIES *)f2)->filename, ".") == 0) { return 1; }
if(strcmp(((FILEENTRIES *)f1)->filename, "..") == 0) { return -1; }
if(strcmp(((FILEENTRIES *)f2)->filename, "..") == 0) { return 1; }
}
/* If one is a file and one is a directory the directory is first. */
if(((FILEENTRIES *)f1)->flags == 1 && ((FILEENTRIES *)f2)->flags == 0) return -1;
if(((FILEENTRIES *)f1)->flags == 0 && ((FILEENTRIES *)f2)->flags == 1) return 1;
return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename);
}
/***************************************************************************
* Update SDCARD curent directory name
***************************************************************************/
@ -467,7 +503,7 @@ int updateSDdirname() {
sprintf(rootSDdir,"fat:/");
/* update current directory name */
sprintf(rootSDdir, "%s\\%s",rootSDdir, filelist[selection].filename);
sprintf(rootSDdir, "%s/%s",rootSDdir, filelist[selection].filename);
return 1;
} else {
WaitPrompt ("Dirname is too long !");
@ -494,7 +530,6 @@ int parseSDdirectory() {
if (sddir == NULL) {
strcpy(rootSDdir, "fat:/");
sddir = diropen(rootSDdir);
WaitPrompt(msg);
if (sddir == NULL) {
sprintf(msg, "Error opening %s", rootSDdir);
WaitPrompt(msg);
@ -508,16 +543,15 @@ int parseSDdirectory() {
strncpy(filelist[numstored].filename, filename, MAX_PATH_LEN);
filelist[numstored].length = filestat.st_size;
filelist[numstored].flags = (filestat.st_mode & S_IFDIR) ? 1 : 0;
sprintf(msg, "Found #%d: %s", numstored, filename);
ShowAction(msg);
numstored++;
}
}
dirclose(sddir);
sprintf(msg, "Found %d items.", numstored);
WaitPrompt(msg);
_break();
/* Sort the file list */
qsort(filelist, numstored, sizeof(FILEENTRIES), FileSortCallback);
return numstored;
}
@ -545,8 +579,6 @@ void ShowFiles( int offset, int selection ) {
char dir[1024];
if (UseSDCARD)
strcpy(dir, rootSDdir);
else if (UseWiiSDCARD)
strcpy(dir, rootWiiSDdir);
else
dir[0] = 0;
@ -623,16 +655,15 @@ void FileSelector() {
}
if ( p & PAD_BUTTON_A ) {
_break();
if ( filelist[selection].flags ) { /*** This is directory ***/
if (UseSDCARD) {
//if ( filelist[selection].filename[0] == 0x2e) {
/* update current directory and set new entry list if directory has changed */
int status = updateSDdirname();
if (status == 1) {
maxfiles = parseSDdirectory();
if (!maxfiles) {
WaitPrompt ("Error reading directory !");
WaitPrompt ((char*)"Error reading directory !");
haverom = 1; // quit SD menu
haveSDdir = 0; // reset everything at next access
}
@ -640,23 +671,27 @@ _break();
haverom = 1; // quit SD menu
haveSDdir = 0; // reset everything at next access
}
}
#ifdef __gamecube__
} else { // DVD
else { // DVD
rootdir = filelist[selection].offset;
rootdirlength = filelist[selection].length;
offset = selection = 0;
maxfiles = parsedir();
}
#endif
}
#ifdef __gamecube__
} else if (selection == 0 && inSz == true) {
else if (selection == 0 && inSz == true) {
rootdir = filelist[1].offset;
rootdirlength = filelist[1].length;
offset = 0;
maxfiles = parsedir();
inSz = false;
SzClose();
} else if (inSz == false && SzDvdIsArchive(filelist[selection].offset) == SZ_OK) {
}
else if (inSz == false && SzDvdIsArchive(filelist[selection].offset) == SZ_OK) {
// parse the 7zip file
ShowAction("Found 7z");
SzParse();
@ -666,7 +701,8 @@ _break();
} else {
SzDisplayError(SzRes);
}
} else if (inSz == true) {
}
else if (inSz == true) {
// extract the selected ROM from the 7zip file to the buffer
if(SzExtractROM(filelist[selection].offset, nesromptr) == true) {
haverom = 1;
@ -678,8 +714,9 @@ _break();
offset = selection = 0;
maxfiles = parsedir();
}
}
#endif
} else {
else {
rootdir = filelist[selection].offset;
rootdirlength = filelist[selection].length;
// Now load the DVD file to it's offset
@ -699,39 +736,25 @@ int LoadDVDFile( unsigned char *buffer ) {
int blocks;
int i;
u64 discoffset;
char fname[MAX_PATH_LEN];
/*** SDCard Addition ***/
if (UseSDCARD) GetSDInfo();
if (rootdirlength == 0) return 0;
/* Check filename length */
if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < MAX_PATH_LEN)
sprintf(fname, "%s/%s",rootSDdir,filelist[selection].filename);
else {
WaitPrompt ("Maximum Filename Length reached !");
haveSDdir = 0; // reset everything before next access
}
filehandle = fopen(fname, "rb");
if (filehandle == NULL) {
WaitPrompt ("Unable to open file!");
return 0;
}
/*** How many 2k blocks to read ***/
blocks = rootdirlength / 2048;
offset = 0;
discoffset = rootdir;
ShowAction("Loading ... Wait");
if (UseSDCARD) fread(&readbuffer, 2048, 1, filehandle);
if (UseSDCARD) fread(&readbuffer, 1, 2048, filehandle);
else dvd_read(&readbuffer, 2048, discoffset);
if (isZipFile() == false) {
if (UseSDCARD) fseek(filehandle, 0, SEEK_SET);
for ( i = 0; i < blocks; i++ ) {
if (UseSDCARD) fread(&readbuffer, 2048, 1, filehandle);
if (UseSDCARD) fread(&readbuffer, 1, 2048, filehandle);
else dvd_read(&readbuffer, 2048, discoffset);
memcpy(&buffer[offset], &readbuffer, 2048);
offset += 2048;
@ -741,7 +764,7 @@ int LoadDVDFile( unsigned char *buffer ) {
/*** And final cleanup ***/
if( rootdirlength % 2048 ) {
i = rootdirlength % 2048;
if (UseSDCARD) fread(&readbuffer, i, 1, filehandle);
if (UseSDCARD) fread(&readbuffer, 1, i, filehandle);
else dvd_read(&readbuffer, 2048, discoffset);
memcpy(&buffer[offset], &readbuffer, i);
}
@ -769,12 +792,12 @@ int OpenDVD() {
// Mount the DVD if necessary
if (!IsPVD()) {
ShowAction("Mounting DVD");
ShowAction((char*)"Mounting DVD");
DVD_Mount();
ShowAction("Done Mounting");
ShowAction((char*)"Done Mounting");
haveDVDdir = 0;
if (!IsPVD()) {
WaitPrompt("No vallid ISO9660 DVD");
WaitPrompt((char*)"No vallid ISO9660 DVD");
return 0; // No correct ISO9660 DVD
}
}
@ -813,11 +836,11 @@ int OpenSD() {
sprintf(rootSDdir,"/%s/%s", FCEUDIR, ROMSDIR);
/* Parse initial root directory and get entries list */
ShowAction("Reading Directory ...");
//_break();
maxfiles = parseSDdirectory();
if (maxfiles) {
sprintf (msg, "Found %d entries", maxfiles);
WaitPrompt(msg);
//sprintf (msg, "Found %d entries", maxfiles);
//WaitPrompt(msg);
/* Select an entry */
FileSelector();
@ -840,17 +863,26 @@ int OpenSD() {
* SDCard Get Info
****************************************************************************/
void GetSDInfo () {
char fname[MAX_PATH_LEN];
struct stat fstat;
DIR_ITER *dir;
char fname[MAXPATHLEN];
rootdirlength = 0;
dir = diropen(rootSDdir);
if (dir != NULL) {
while(dirnext(dir, fname, &fstat) == 0) {
if (strcmp(fname, filelist[selection].filename) == 0)
rootdirlength = fstat.st_size;
/* Check filename length */
if ((strlen(rootSDdir)+1+strlen(filelist[selection].filename)) < MAXPATHLEN)
sprintf(fname, "%s/%s",rootSDdir,filelist[selection].filename);
else
{
WaitPrompt ((char*)"Maximum Filename Length reached !");
haveSDdir = 0; // reset everything before next access
}
dirclose(dir);
filehandle = fopen(fname, "rb");
if (filehandle == NULL)
{
WaitPrompt ((char*)"Unable to open file!");
return;
}
fseek(filehandle, 0, SEEK_END);
rootdirlength = ftell(filehandle);
fseek(filehandle, 0, SEEK_SET);
}

View File

@ -0,0 +1,13 @@
#define MAXJOLIET 256
#define MAXFILES 1000
typedef struct {
char filename[MAXJOLIET];
char sdcardpath[256];
u64 offset;
unsigned int length;
char flags;
}FILEENTRIES;
extern FILEENTRIES filelist[MAXFILES];

View File

@ -6,8 +6,10 @@
#include <gccore.h>
#include <ogcsys.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../../iplfont/iplfont.h"
#include "iplfont.h"
#include "nesback.h"
#include "intl.h"
@ -43,79 +45,6 @@ int whichfb = 0;
extern int font_height;
int copynow = GX_FALSE;
extern int font_width;
int GetTextWidth(char *text) {
unsigned int i, w = 0;
for (i = 0; i < strlen(text); i++)
w += font_width;
return w;
}
int CentreTextPosition(char *text) {
return ((640 - GetTextWidth(text)) >> 1);
}
void WriteCentre(int y, char *text) {
write_font(CentreTextPosition(text), y, text);
}
void WaitPrompt(char *msg) {
int quit = 0;
while (PAD_ButtonsDown(0) & PAD_BUTTON_A) {} ;
while(!(PAD_ButtonsDown(0) & PAD_BUTTON_A) && (quit == 0)) {
ClearScreen();
WriteCentre(220, msg);
WriteCentre(220 + font_height, MENU_PRESS_A);
if (PAD_ButtonsDown(0) & PAD_BUTTON_A)
quit = 1;
SetScreen();
}
}
/**
* Wait for user to press A or B. Returns 0 = B; 1 = A
*/
int WaitButtonAB() {
int btns;
while ((PAD_ButtonsDown (0) & (PAD_BUTTON_A | PAD_BUTTON_B)));
while (1) {
btns = PAD_ButtonsDown (0);
if (btns & PAD_BUTTON_A)
return 1;
else if (btns & PAD_BUTTON_B)
return 0;
}
}
/**
* Show a prompt with choice of two options. Returns 1 if A button was pressed
and 0 if B button was pressed.
*/
int WaitPromptChoice(char *msg, char *bmsg, char *amsg) {
char choiceOption[80];
sprintf (choiceOption, "B = %s : A = %s", bmsg, amsg);
ClearScreen ();
WriteCentre(220, msg);
WriteCentre(220 + font_height, choiceOption);
SetScreen ();
return WaitButtonAB ();
}
void ShowAction(char *msg) {
memcpy (xfb[whichfb], &backdrop, 1280 * 480);
/*ClearScreen();*/
WriteCentre(220 + (font_height >> 1), msg);
SetScreen();
}
/****************************************************************************
* GX Chip Copy to XFB
****************************************************************************/

View File

@ -88,8 +88,7 @@ bool isZipFile() {
*
* Unzip terminates on Z_END_STREAM.
***************************************************************************/
int unzipDVDFile(unsigned char *outbuffer,
unsigned int discoffset, unsigned int length) {
int unzipDVDFile(unsigned char *outbuffer, unsigned int discoffset, unsigned int length) {
PKZIPHEADER pkzip;
int zipoffset = 0;
int zipchunk = 0;

View File

@ -8,7 +8,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "iplfont/iplfont.h"
#include "iplfont.h"
#include "intl.h"
#define MARGIN 0
@ -30,9 +30,18 @@ extern void ManageSettings(int mode, int slot, int device, int quiet);
extern void StartGX();
extern void scroller(int y, unsigned char text[][512], int nlines);
extern void FCEUI_DisableFourScore(int a);
extern void FCEUI_SetVidSystem(int a);
extern unsigned char DecodeJoy( unsigned short pp );
extern unsigned char GetAnalog(int Joy);
extern void dvd_motor_off();
extern void uselessinquiry();
extern int OpenDVD();
extern int OpenSD();
extern void ResetNES(void);
extern int GCMemROM();
extern signed int CARDSLOT;
extern u8 PADCAL;
extern u8 PADTUR;
@ -289,21 +298,6 @@ extern int font_size[256];
extern int font_height;
extern u8 screenscaler;
/****************************************************************************
* SetScreen
****************************************************************************/
void SetScreen() {
VIDEO_SetNextFramebuffer( xfb[whichfb] );
VIDEO_Flush();
VIDEO_WaitVSync();
}
void ClearScreen() {
whichfb ^= 1;
/*VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], 0x258e2573);*/
memcpy (xfb[whichfb], &backdrop, 1280 * 480);
}
/***************************************************************************
* Configuration Menu
*

View File

@ -3,6 +3,7 @@
#include <sys/time.h>
#include <gctypes.h>
#include <ogc/system.h>
#include <fat.h>
#include "../../types.h"
#include "common.h"
@ -75,7 +76,6 @@ int main(int argc, char *argv[]) {
DVD_Init();
dvd_inquiry();
#endif
DEBUG_Init(0, 1);
/*** Minimal Emulation Loop ***/
if ( !FCEUI_Initialize() ) {

View File

@ -12,6 +12,7 @@
#include "../../types.h"
#include "../../state.h"
#include "saveicon.h"
#include "iplfont.h"
#include "intl.h"
#define FCEUDIR "fceu"
@ -403,7 +404,7 @@ void MC_ManageState(int mode, int slot) {
CardError = CARD_Close(&CardFile);
sprintf(debug, "Saved %d bytes successfully!", savedBytes);
ShowAction(debug);
WaitPrompt(debug);
} else {
WaitPrompt("Save Failed");
}
@ -451,7 +452,7 @@ void MC_ManageState(int mode, int slot) {
CARD_Unmount(CARDSLOT);
sprintf(debug, "Loaded %d bytes successfully!", savedBytes);
ShowAction(debug);
WaitPrompt(debug);
}
break; /*** End load ***/
@ -488,11 +489,11 @@ void SD_ManageState(int mode, int slot) {
len = fwrite(statebuffer, filesize, 1, handle);
fclose(handle);
if (len != filesize){
/*if (len != filesize){
sprintf (msg, "Error writing %s", path);
WaitPrompt (msg);
return;
}
}*/
sprintf (msg, "Saved %d bytes successfully", filesize);
WaitPrompt (msg);
@ -503,7 +504,7 @@ void SD_ManageState(int mode, int slot) {
fclose(handle);
sprintf (msg, "Loaded %d bytes successfully", offset);
ShowAction(msg);
WaitPrompt(msg);
GCFCEUSS_Load();
return;

View File

@ -7,20 +7,24 @@
****************************************************************************/
#ifdef HW_DOL // only do 7zip in Gamecube mode for now...
#include "iplfont.h"
#include "sz.h"
#include "gcdvd.h"
extern u8 UseSDCARD;
extern u8 UseWiiSDCARD;
extern sd_file *filehandle;
extern FILE *filehandle;
extern void GetSDInfo();
// 7zip error list
char szerrormsg[][30] = {"7z: Data error",
char szerrormsg[][30] = {
"7z: Data error",
"7z: Out of memory",
"7z: CRC Error",
"7z: Not implemented",
"7z: Fail",
"7z: Archive error"};
"7z: Archive error"
};
SZ_RESULT SzRes;
@ -36,7 +40,7 @@ CFileItem *SzF;
char sz_buffer[2048];
// needed because there are no header files -.-
#include <sdcard.h>
//#include <sdcard.h>
#define MAXFILES 1000
#define MAXJOLIET 256
@ -68,8 +72,9 @@ int dvd_buffered_read(void *dst, u32 len, u64 offset) {
if (UseSDCARD) {
if (filehandle == NULL)
GetSDInfo();
SDCARD_SeekFile(filehandle, offset, SDCARD_SEEK_SET);
SDCARD_ReadFile(filehandle, &dvdsf_buffer, len);
fseek(filehandle, offset, SEEK_SET);
fread(&dvdsf_buffer, len, 1, filehandle);
} else if (!UseWiiSDCARD)
ret = dvd_read(&dvdsf_buffer, len, offset);
dvdsf_last_offset = offset;
@ -218,14 +223,14 @@ SZ_RESULT SzDvdIsArchive(u64 dvd_offset) {
// read the data from the DVD
int res = dvd_safe_read (&Candidate, 6, dvd_offset);
char msg[1024];
sprintf(msg, "7zSig: %02X %02X %02X %02X %02X %02X",
/*sprintf(msg, "7zSig: %02X %02X %02X %02X %02X %02X",
Candidate[0],
Candidate[1],
Candidate[2],
Candidate[3],
Candidate[4],
Candidate[5]);
WaitPrompt(msg);
WaitPrompt(msg);*/
size_t i;
for(i = 0; i < 6; i++) {
@ -336,7 +341,7 @@ bool SzExtractROM(int i, unsigned char *buffer)
SzOffset = 0;
// Unzip the file
ShowAction("Un7zipping file. Please wait...");
//ShowAction("Un7zipping file. Please wait...");
WaitPrompt("Un7zipping file. Please wait...");
SzRes = SzExtract2(
&SzArchiveStream.InStream,

View File

@ -7,7 +7,7 @@
#include <gccore.h>
#include <string.h>
#include "sfont.h"
#include "intl.h"
#define MARGIN 0 //42
@ -88,7 +88,7 @@ int scrollerx = 320 - MARGIN;
void scroller(int y, unsigned char text[][512], int nlines)
{
int a;
int b;
int b=0;
int f;
int l;
int s = 0;
@ -144,5 +144,58 @@ memcpy (&xfb[whichfb][y*320], &backdrop[y*1280], 1280 * SFONTHEIGHT);
line++;
if (line >= nlines) line = 0;
}
}
/****************************************************************************
* SetScreen
****************************************************************************/
void SetScreen() {
VIDEO_SetNextFramebuffer( xfb[whichfb] );
VIDEO_Flush();
VIDEO_WaitVSync();
}
void ClearScreen() {
whichfb ^= 1;
/*VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], 0x258e2573);*/
memcpy (xfb[whichfb], &backdrop, 1280 * 480);
}
int GetTextWidth(char *text) {
unsigned int i, w = 0;
for (i = 0; i < strlen(text); i++)
w += font_width;
return w;
}
int CentreTextPosition(char *text) {
return ((640 - GetTextWidth(text)) >> 1);
}
void WriteCentre(int y, char *text) {
write_font(CentreTextPosition(text), y, text);
}
void WaitPrompt(char *msg) {
int quit = 0;
while (PAD_ButtonsDown(0) & PAD_BUTTON_A) {} ;
while(!(PAD_ButtonsDown(0) & PAD_BUTTON_A) && (quit == 0)) {
ClearScreen();
WriteCentre(220, msg);
WriteCentre(220 + font_height, MENU_PRESS_A);
if (PAD_ButtonsDown(0) & PAD_BUTTON_A)
quit = 1;
SetScreen();
}
}
void ShowAction(char *msg) {
memcpy (xfb[whichfb], &backdrop, 1280 * 480);
/*ClearScreen();*/
WriteCentre(220 + (font_height >> 1), msg);
SetScreen();
}

View File

@ -2,7 +2,7 @@
* IPL_FONT HEADER
****************************************************************************/
#define MARGIN 42
//#define MARGIN 42
void init_font(void);
void write_font(int x, int y, const char *string);
@ -10,3 +10,11 @@ void writex(int x, int y, int sx, int sy, const unsigned char *string, int looku
void scroller(int y, unsigned char text[][512], int nlines);
int scrollerx;
void SetScreen();
void ClearScreen();
int GetTextWidth(char *text);
int CentreTextPosition(char *text);
void WriteCentre(int y, char *text);
void WaitPrompt(char *msg);
void ShowAction(char *msg);