-fixed missing background music

-back to the entry point we had before
-set up cache to 32 again, seems to make wiiflow faster
-changed few things about memory management again
-made a few free safe again in code
This commit is contained in:
fix94.1 2012-05-16 14:48:01 +00:00
parent 678dc5ac0d
commit 1f5d72f2a4
12 changed files with 60 additions and 65 deletions

View File

@ -73,7 +73,7 @@ ios := 249
CFLAGS = -g -Os -Wall -Wextra -Wno-multichar $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H CFLAGS = -g -Os -Wall -Wextra -Wno-multichar $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H
CXXFLAGS = $(CFLAGS) CXXFLAGS = $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80A80000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project # any extra libraries we wish to link with the project

View File

@ -42,7 +42,7 @@
#define PARTITION_TYPE_WIN95_EXTENDED 0x0F /* Windows 95 extended partition */ #define PARTITION_TYPE_WIN95_EXTENDED 0x0F /* Windows 95 extended partition */
#define PARTITION_TYPE_GPT_TABLE 0xEE /* New Standard */ #define PARTITION_TYPE_GPT_TABLE 0xEE /* New Standard */
#define CACHE 8 #define CACHE 32
#define SECTORS 64 #define SECTORS 64
extern const DISC_INTERFACE __io_sdhc; extern const DISC_INTERFACE __io_sdhc;

View File

@ -171,8 +171,8 @@ void CVideo::init(void)
GX_SetNumChans(0); GX_SetNumChans(0);
GX_SetZCompLoc(GX_ENABLE); GX_SetZCompLoc(GX_ENABLE);
setup2DProjection(); setup2DProjection();
m_stencil = smartMemAlign32(CVideo::_stencilWidth * CVideo::_stencilHeight); m_stencil = MEM1_memalign(32, CVideo::_stencilWidth * CVideo::_stencilHeight);
memset(m_stencil.get(), 0, CVideo::_stencilWidth * CVideo::_stencilHeight); memset(m_stencil, 0, CVideo::_stencilWidth * CVideo::_stencilHeight);
} }
void CVideo::set2DViewport(u32 w, u32 h, int x, int y) void CVideo::set2DViewport(u32 w, u32 h, int x, int y)
@ -238,7 +238,6 @@ void CVideo::cleanup(void)
VIDEO_WaitVSync(); VIDEO_WaitVSync();
if (m_rmode->viTVMode & VI_NON_INTERLACE) if (m_rmode->viTVMode & VI_NON_INTERLACE)
VIDEO_WaitVSync(); VIDEO_WaitVSync();
//MEM1_free(m_fifo);
} }
void CVideo::prepareAAPass(int aaStep) void CVideo::prepareAAPass(int aaStep)
@ -407,7 +406,7 @@ int CVideo::stencilVal(int x, int y)
u32 i = coordsI8(x, y, (u32)CVideo::_stencilWidth); u32 i = coordsI8(x, y, (u32)CVideo::_stencilWidth);
if (i >= (u32)(CVideo::_stencilWidth * CVideo::_stencilHeight)) if (i >= (u32)(CVideo::_stencilWidth * CVideo::_stencilHeight))
return 0; return 0;
return m_stencil.get()[i]; return ((u8*)m_stencil)[i];
} }
void CVideo::prepareStencil(void) void CVideo::prepareStencil(void)
@ -427,9 +426,9 @@ void CVideo::renderStencil(void)
GX_SetCopyFilter(GX_FALSE, NULL, GX_FALSE, NULL); GX_SetCopyFilter(GX_FALSE, NULL, GX_FALSE, NULL);
GX_SetTexCopySrc(0, 0, CVideo::_stencilWidth, CVideo::_stencilHeight); GX_SetTexCopySrc(0, 0, CVideo::_stencilWidth, CVideo::_stencilHeight);
GX_SetTexCopyDst(CVideo::_stencilWidth, CVideo::_stencilHeight, GX_CTF_R8, GX_FALSE); GX_SetTexCopyDst(CVideo::_stencilWidth, CVideo::_stencilHeight, GX_CTF_R8, GX_FALSE);
GX_CopyTex(m_stencil.get(), GX_TRUE); GX_CopyTex(m_stencil, GX_TRUE);
GX_PixModeSync(); GX_PixModeSync();
DCFlushRange(m_stencil.get(), CVideo::_stencilWidth * CVideo::_stencilHeight); DCFlushRange(m_stencil, CVideo::_stencilWidth * CVideo::_stencilHeight);
GX_SetCopyFilter(m_rmode->aa, m_rmode->sample_pattern, GX_TRUE, m_rmode->vfilter); GX_SetCopyFilter(m_rmode->aa, m_rmode->sample_pattern, GX_TRUE, m_rmode->vfilter);
} }

View File

@ -78,6 +78,7 @@ private:
void *m_frameBuf[2]; void *m_frameBuf[2];
int m_curFB; int m_curFB;
void *m_fifo; void *m_fifo;
void *m_stencil;
float m_yScale; float m_yScale;
u32 m_xfbHeight; u32 m_xfbHeight;
bool m_wide; bool m_wide;
@ -90,7 +91,6 @@ private:
bool m_aaAlpha; bool m_aaAlpha;
int m_aaWidth; int m_aaWidth;
int m_aaHeight; int m_aaHeight;
SmartBuf m_stencil;
SmartBuf m_aaBuffer[8]; SmartBuf m_aaBuffer[8];
u32 m_aaBufferSize[8]; u32 m_aaBufferSize[8];
float m_vpX; float m_vpX;

View File

@ -1,13 +1,6 @@
#ifndef _DISC_H_ #ifndef _DISC_H_
#define _DISC_H_ #define _DISC_H_
#ifndef APPLOADER_START
#define APPLOADER_START (void *)0x81200000
#endif
#ifndef APPLOADER_END
#define APPLOADER_END (void *)0x81700000
#endif
#define Sys_Magic ((vu32*)0x80000020) #define Sys_Magic ((vu32*)0x80000020)
#define Version ((vu32*)0x80000024) #define Version ((vu32*)0x80000024)
#define Arena_L ((vu32*)0x80000030) #define Arena_L ((vu32*)0x80000030)

View File

@ -36,14 +36,14 @@ extern "C"
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
__exception_setreload(5); __exception_setreload(5);
MEM2_init(52);
geckoinit = InitGecko();
gprintf(" \nWelcome to %s (%s-r%s)!\nThis is the debug output.\n", APP_NAME, APP_VERSION, SVN_REV);
// Init video // Init video
CVideo vid; CVideo vid;
vid.init(); vid.init();
MEM2_init(52);
geckoinit = InitGecko();
gprintf(" \nWelcome to %s (%s-r%s)!\nThis is the debug output.\n", APP_NAME, APP_VERSION, SVN_REV);
vid.waitMessage(0.2f); vid.waitMessage(0.2f);
char *gameid = NULL; char *gameid = NULL;

View File

@ -6,7 +6,6 @@
#include "mem2.hpp" #include "mem2.hpp"
#include "mem2alloc.hpp" #include "mem2alloc.hpp"
#include "gecko.h" #include "gecko.h"
#include "disc.h"
// Forbid the use of MEM2 through malloc // Forbid the use of MEM2 through malloc
u32 MALLOC_MEM2 = 0; u32 MALLOC_MEM2 = 0;
@ -44,10 +43,10 @@ void MEM1_free(void *p)
__real_free(p); __real_free(p);
} }
void MEM2_init(unsigned int mem2Size) void MEM2_init(unsigned int mem2Size)
{ {
g_mem2gp.init(mem2Size); g_mem2gp.init(mem2Size);
g_mem2gp.clear();
} }
void MEM2_cleanup(void) void MEM2_cleanup(void)
@ -90,7 +89,7 @@ void *__wrap_malloc(size_t size)
void *p; void *p;
if ((SYS_GetArena1Lo() >= MAX_MEM1_ARENA_LO) || size >= MEM2_PRIORITY_SIZE) if ((SYS_GetArena1Lo() >= MAX_MEM1_ARENA_LO) || size >= MEM2_PRIORITY_SIZE)
{ {
p = MEM2_alloc(size); p = g_mem2gp.allocate(size);
if(p != 0) if(p != 0)
return p; return p;
return __real_malloc(size); return __real_malloc(size);
@ -98,7 +97,7 @@ void *__wrap_malloc(size_t size)
p = __real_malloc(size); p = __real_malloc(size);
if(p != 0) if(p != 0)
return p; return p;
return MEM2_alloc(size); return g_mem2gp.allocate(size);
} }
void *__wrap_calloc(size_t n, size_t size) void *__wrap_calloc(size_t n, size_t size)
@ -106,7 +105,7 @@ void *__wrap_calloc(size_t n, size_t size)
void *p; void *p;
if ((SYS_GetArena1Lo() >= MAX_MEM1_ARENA_LO) || (n * size) >= MEM2_PRIORITY_SIZE) if ((SYS_GetArena1Lo() >= MAX_MEM1_ARENA_LO) || (n * size) >= MEM2_PRIORITY_SIZE)
{ {
p = MEM2_alloc(n * size); p = g_mem2gp.allocate(n * size);
if (p != 0) if (p != 0)
{ {
memset(p, 0, n * size); memset(p, 0, n * size);
@ -118,7 +117,7 @@ void *__wrap_calloc(size_t n, size_t size)
p = __real_calloc(n, size); p = __real_calloc(n, size);
if (p != 0) return p; if (p != 0) return p;
p = MEM2_alloc(n * size); p = g_mem2gp.allocate(n * size);
if (p != 0) if (p != 0)
memset(p, 0, n * size); memset(p, 0, n * size);
return p; return p;
@ -131,7 +130,7 @@ void *__wrap_memalign(size_t a, size_t size)
{ {
if (a <= 32 && 32 % a == 0) if (a <= 32 && 32 % a == 0)
{ {
p = MEM2_alloc(size); p = g_mem2gp.allocate(size);
if (p != 0) if (p != 0)
return p; return p;
} }
@ -140,7 +139,7 @@ void *__wrap_memalign(size_t a, size_t size)
p = __real_memalign(a, size); p = __real_memalign(a, size);
if(p != 0) if(p != 0)
return p; return p;
return MEM2_alloc(size); return g_mem2gp.allocate(size);
} }
void __wrap_free(void *p) void __wrap_free(void *p)
@ -160,7 +159,7 @@ void *__wrap_realloc(void *p, size_t size)
// ptr from mem2 // ptr from mem2
if (((u32)p & 0x10000000) != 0 || (p == 0 && size > MEM2_PRIORITY_SIZE)) if (((u32)p & 0x10000000) != 0 || (p == 0 && size > MEM2_PRIORITY_SIZE))
{ {
n = MEM2_realloc(p, size); n = g_mem2gp.reallocate(p, size);
if (n != 0) if (n != 0)
return n; return n;
n = __real_malloc(size); n = __real_malloc(size);
@ -169,7 +168,7 @@ void *__wrap_realloc(void *p, size_t size)
if (p != 0) if (p != 0)
{ {
memcpy(n, p, MEM2_usableSize(p) < size ? MEM2_usableSize(p) : size); memcpy(n, p, MEM2_usableSize(p) < size ? MEM2_usableSize(p) : size);
MEM2_free(p); g_mem2gp.release(p);
} }
return n; return n;
} }
@ -177,7 +176,7 @@ void *__wrap_realloc(void *p, size_t size)
n = __real_realloc(p, size); n = __real_realloc(p, size);
if (n != 0) if (n != 0)
return n; return n;
n = MEM2_alloc(size); n = g_mem2gp.allocate(size);
if (n == 0) if (n == 0)
return 0; return 0;
if (p != 0) if (p != 0)
@ -191,7 +190,7 @@ void *__wrap_realloc(void *p, size_t size)
size_t __wrap_malloc_usable_size(void *p) size_t __wrap_malloc_usable_size(void *p)
{ {
if(((u32)p & 0x10000000) != 0) if(((u32)p & 0x10000000) != 0)
return MEM2_usableSize(p); return CMEM2Alloc::usableSize(p);
return __real_malloc_usable_size(p); return __real_malloc_usable_size(p);
} }

View File

@ -9,7 +9,7 @@ extern "C"
{ {
#endif #endif
#define MAX_MEM1_ARENA_LO ((void *) (((u32)APPLOADER_START)-size)) #define MAX_MEM1_ARENA_LO ((void *)(0x81700000-size))
#define MEM2_PRIORITY_SIZE 0x1000 #define MEM2_PRIORITY_SIZE 0x1000
void *MEM1_alloc(unsigned int s); void *MEM1_alloc(unsigned int s);

View File

@ -1,4 +1,3 @@
#include "mem2alloc.hpp" #include "mem2alloc.hpp"
#include <ogc/system.h> #include <ogc/system.h>
@ -7,13 +6,15 @@
#include "lockMutex.hpp" #include "lockMutex.hpp"
#define IOS_RELOAD_AREA 0x90200000
void CMEM2Alloc::init(unsigned int size) void CMEM2Alloc::init(unsigned int size)
{ {
m_baseAddress = (SBlock *)(((u32)SYS_GetArena2Lo() + 31) & ~31); m_baseAddress = (SBlock *) std::max(((u32)SYS_GetArena2Lo() + 31) & ~31, IOS_RELOAD_AREA);
m_endAddress = (SBlock *)((char *)m_baseAddress + std::min(size * 0x100000, (SYS_GetArena2Size() - 0x20 - 31) & ~31)); // Round down - an extra 32 for wdvd_unencrypted read m_endAddress = (SBlock *)((char *)m_baseAddress + std::min(size * 0x100000, SYS_GetArena2Size() & ~31));
if (m_endAddress > (SBlock *)0x93000000) if (m_endAddress > (SBlock *)0x93000000)
m_endAddress = (SBlock *)0x93000000; m_endAddress = (SBlock *)0x93000000;
SYS_SetArena2Lo(m_endAddress + 0x20); SYS_SetArena2Lo(m_endAddress);
LWP_MutexInit(&m_mutex, 0); LWP_MutexInit(&m_mutex, 0);
} }
@ -148,7 +149,6 @@ void *CMEM2Alloc::reallocate(void *p, unsigned int s)
if (s == 0) if (s == 0)
s = 1; s = 1;
if (p == 0) if (p == 0)
return allocate(s); return allocate(s);
@ -157,7 +157,7 @@ void *CMEM2Alloc::reallocate(void *p, unsigned int s)
{ {
LockMutex lock(m_mutex); LockMutex lock(m_mutex);
// Check for out of memory (dimok) //out of memory /* Dimok */
if (i + s + 1 >= m_endAddress) if (i + s + 1 >= m_endAddress)
{ {
return 0; return 0;

View File

@ -1289,7 +1289,7 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
SDHC_Init(); SDHC_Init();
// clear mem1 main // clear mem1 main
u32 size = (u32)0x80A80000 - (u32)0x80004000; u32 size = (u32)0x80A00000 - (u32)0x80004000;
memset((void*)0x80004000, 0, size); memset((void*)0x80004000, 0, size);
DCFlushRange((void*)0x80004000, size); DCFlushRange((void*)0x80004000, size);
@ -1299,10 +1299,9 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
u64 offset; u64 offset;
Disc_FindPartition(&offset); Disc_FindPartition(&offset);
u32 AppEntryPoint = RunApploader(offset, videoMode, vipatch, countryPatch, patchVidMode, disableIOSreload, aspectRatio); u32 AppEntryPoint = RunApploader(offset, videoMode, vipatch, countryPatch, patchVidMode, disableIOSreload, aspectRatio);
gprintf("\n\nEntry Point is: 0x%08x\n", AppEntryPoint);
DeviceHandler::DestroyInstance(); DeviceHandler::DestroyInstance();
USBStorage_Deinit(); USBStorage_Deinit();
gprintf("\n\nEntry Point is: 0x%08x\n", AppEntryPoint);
usleep(100 * 1000);
if (Disc_WiiBoot(AppEntryPoint) < 0) if (Disc_WiiBoot(AppEntryPoint) < 0)
Sys_LoadMenu(); Sys_LoadMenu();
} }

View File

@ -26,6 +26,8 @@
#include "mem2.hpp" #include "mem2.hpp"
#include "BufferCircle.hpp" #include "BufferCircle.hpp"
#define ALIGN32(x) (((x) + 31) & ~31)
BufferCircle::BufferCircle() BufferCircle::BufferCircle()
{ {
which = 0; which = 0;
@ -49,9 +51,9 @@ void BufferCircle::SetBufferBlockSize(int size)
for(int i = 0; i < Size(); i++) for(int i = 0; i < Size(); i++)
{ {
if(SoundBuffer[i] != NULL)
MEM1_free(SoundBuffer[i]); MEM1_free(SoundBuffer[i]);
SoundBuffer[i] = (u8 *)MEM1_memalign(32, ALIGN32(BufferBlockSize));
SoundBuffer[i] = (u8 *)MEM1_memalign(32, BufferBlockSize);
BufferSize[i] = 0; BufferSize[i] = 0;
BufferReady[i] = false; BufferReady[i] = false;
} }
@ -71,7 +73,7 @@ void BufferCircle::Resize(int size)
for(int i = oldSize; i < Size(); i++) for(int i = oldSize; i < Size(); i++)
{ {
if(BufferBlockSize > 0) if(BufferBlockSize > 0)
SoundBuffer[i] = (u8 *)MEM1_memalign(32, BufferBlockSize); SoundBuffer[i] = (u8 *)MEM1_memalign(32, ALIGN32(BufferBlockSize));
else else
SoundBuffer[i] = NULL; SoundBuffer[i] = NULL;
BufferSize[i] = 0; BufferSize[i] = 0;
@ -84,6 +86,7 @@ void BufferCircle::RemoveBuffer(int pos)
if(!Valid(pos)) if(!Valid(pos))
return; return;
if(SoundBuffer[pos] != NULL)
MEM1_free(SoundBuffer[pos]); MEM1_free(SoundBuffer[pos]);
SoundBuffer.erase(SoundBuffer.begin()+pos); SoundBuffer.erase(SoundBuffer.begin()+pos);
@ -105,6 +108,7 @@ void BufferCircle::FreeBuffer()
{ {
for(int i = 0; i < Size(); i++) for(int i = 0; i < Size(); i++)
{ {
if(SoundBuffer[i] != NULL)
MEM1_free(SoundBuffer[i]); MEM1_free(SoundBuffer[i]);
BufferSize[i] = 0; BufferSize[i] = 0;
BufferReady[i] = false; BufferReady[i] = false;

View File

@ -59,6 +59,7 @@ SoundHandler::~SoundHandler()
ThreadSignal(); ThreadSignal();
LWP_JoinThread(SoundThread, NULL); LWP_JoinThread(SoundThread, NULL);
SoundThread = LWP_THREAD_NULL; SoundThread = LWP_THREAD_NULL;
if(ThreadStack != NULL)
MEM1_free(ThreadStack); MEM1_free(ThreadStack);
ClearDecoderList(); ClearDecoderList();