mirror of
https://github.com/dborth/vbagx.git
synced 2024-12-26 02:31:50 +01:00
re-enable gamecube VM
This commit is contained in:
parent
f743ba405a
commit
802ca50107
@ -25,6 +25,7 @@
|
|||||||
#include "../RTC.h"
|
#include "../RTC.h"
|
||||||
#include "../Sound.h"
|
#include "../Sound.h"
|
||||||
#include "agbprint.h"
|
#include "agbprint.h"
|
||||||
|
#include "vmmem.h" // Nintendo GC Virtual Memory
|
||||||
|
|
||||||
extern const u32 objTilesAddress[3];
|
extern const u32 objTilesAddress[3];
|
||||||
|
|
||||||
@ -52,15 +53,73 @@ extern int timer3Ticks;
|
|||||||
extern int timer3ClockReload;
|
extern int timer3ClockReload;
|
||||||
extern int cpuTotalTicks;
|
extern int cpuTotalTicks;
|
||||||
|
|
||||||
#define CPUReadByteQuick(addr) \
|
/*****************************************************************************
|
||||||
|
* Nintendo GC Virtual Memory function override
|
||||||
|
* Tantric September 2008
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define CPUReadByteQuickDef(addr) \
|
||||||
map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]
|
map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]
|
||||||
|
|
||||||
#define CPUReadHalfWordQuick(addr) \
|
#define CPUReadHalfWordQuickDef(addr) \
|
||||||
READ16LE(((u16*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
|
READ16LE(((u16*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
|
||||||
|
|
||||||
#define CPUReadMemoryQuick(addr) \
|
#define CPUReadMemoryQuickDef(addr) \
|
||||||
READ32LE(((u32*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
|
READ32LE(((u32*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
|
||||||
|
|
||||||
|
u8 inline CPUReadByteQuick( u32 addr )
|
||||||
|
{
|
||||||
|
switch(addr >> 24 )
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
case 10:
|
||||||
|
case 12:
|
||||||
|
return VMRead8( addr & 0x1FFFFFF );
|
||||||
|
|
||||||
|
default:
|
||||||
|
return CPUReadByteQuickDef(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 inline CPUReadHalfWordQuick( u32 addr )
|
||||||
|
{
|
||||||
|
switch(addr >> 24)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
case 10:
|
||||||
|
case 12:
|
||||||
|
return VMRead16( addr & 0x1FFFFFF );
|
||||||
|
default:
|
||||||
|
return CPUReadHalfWordQuickDef(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 inline CPUReadMemoryQuick( u32 addr )
|
||||||
|
{
|
||||||
|
switch(addr >> 24)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
case 10:
|
||||||
|
case 12:
|
||||||
|
return VMRead32( addr & 0x1FFFFFF );
|
||||||
|
default:
|
||||||
|
return CPUReadMemoryQuickDef(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* End of NGC VM override
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
static inline u32 CPUReadMemory(u32 address)
|
static inline u32 CPUReadMemory(u32 address)
|
||||||
{
|
{
|
||||||
#ifdef GBA_LOGGING
|
#ifdef GBA_LOGGING
|
||||||
@ -126,7 +185,11 @@ static inline u32 CPUReadMemory(u32 address)
|
|||||||
case 10:
|
case 10:
|
||||||
case 11:
|
case 11:
|
||||||
case 12:
|
case 12:
|
||||||
value = READ32LE(((u32 *)&rom[address&0x1FFFFFC]));
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
|
value = VMRead32( address & 0x1FFFFFC );
|
||||||
|
#else
|
||||||
|
value = READ32LE(((u32 *)&rom[address&0x1FFFFFC]));
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
if(cpuEEPROMEnabled)
|
if(cpuEEPROMEnabled)
|
||||||
@ -151,10 +214,19 @@ static inline u32 CPUReadMemory(u32 address)
|
|||||||
value = cpuDmaLast;
|
value = cpuDmaLast;
|
||||||
} else {
|
} else {
|
||||||
if(armState) {
|
if(armState) {
|
||||||
value = CPUReadMemoryQuick(reg[15].I);
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
|
value = CPUReadMemoryQuick(reg[15].I);
|
||||||
|
#else
|
||||||
|
value = CPUReadMemoryQuickDef(reg[15].I);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
value = CPUReadHalfWordQuick(reg[15].I) |
|
value = CPUReadHalfWordQuick(reg[15].I) |
|
||||||
CPUReadHalfWordQuick(reg[15].I) << 16;
|
CPUReadHalfWordQuick(reg[15].I) << 16;
|
||||||
|
#else
|
||||||
|
value = CPUReadHalfWordQuickDef(reg[15].I) |
|
||||||
|
CPUReadHalfWordQuickDef(reg[15].I) << 16;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -265,7 +337,11 @@ static inline u32 CPUReadHalfWord(u32 address)
|
|||||||
if(address == 0x80000c4 || address == 0x80000c6 || address == 0x80000c8)
|
if(address == 0x80000c4 || address == 0x80000c6 || address == 0x80000c8)
|
||||||
value = rtcRead(address);
|
value = rtcRead(address);
|
||||||
else
|
else
|
||||||
value = READ16LE(((u16 *)&rom[address & 0x1FFFFFE]));
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
|
value = VMRead16( address & 0x1FFFFFE );
|
||||||
|
#else
|
||||||
|
value = READ16LE(((u16 *)&rom[address & 0x1FFFFFE]));
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
if(cpuEEPROMEnabled)
|
if(cpuEEPROMEnabled)
|
||||||
@ -289,9 +365,17 @@ static inline u32 CPUReadHalfWord(u32 address)
|
|||||||
value = cpuDmaLast & 0xFFFF;
|
value = cpuDmaLast & 0xFFFF;
|
||||||
} else {
|
} else {
|
||||||
if(armState) {
|
if(armState) {
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
value = CPUReadHalfWordQuick(reg[15].I + (address & 2));
|
value = CPUReadHalfWordQuick(reg[15].I + (address & 2));
|
||||||
} else {
|
#else
|
||||||
|
value = CPUReadHalfWordQuickDef(reg[15].I + (address & 2));
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
value = CPUReadHalfWordQuick(reg[15].I);
|
value = CPUReadHalfWordQuick(reg[15].I);
|
||||||
|
#else
|
||||||
|
value = CPUReadHalfWordQuickDef(reg[15].I);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -352,7 +436,11 @@ static inline u8 CPUReadByte(u32 address)
|
|||||||
case 10:
|
case 10:
|
||||||
case 11:
|
case 11:
|
||||||
case 12:
|
case 12:
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
|
return VMRead8( address & 0x1FFFFFF );
|
||||||
|
#else
|
||||||
return rom[address & 0x1FFFFFF];
|
return rom[address & 0x1FFFFFF];
|
||||||
|
#endif
|
||||||
case 13:
|
case 13:
|
||||||
if(cpuEEPROMEnabled)
|
if(cpuEEPROMEnabled)
|
||||||
return eepromRead(address);
|
return eepromRead(address);
|
||||||
@ -385,9 +473,17 @@ static inline u8 CPUReadByte(u32 address)
|
|||||||
return cpuDmaLast & 0xFF;
|
return cpuDmaLast & 0xFF;
|
||||||
} else {
|
} else {
|
||||||
if(armState) {
|
if(armState) {
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
return CPUReadByteQuick(reg[15].I+(address & 3));
|
return CPUReadByteQuick(reg[15].I+(address & 3));
|
||||||
|
#else
|
||||||
|
return CPUReadByteQuickDef(reg[15].I+(address & 3));
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef USE_VM // Nintendo GC Virtual Memory
|
||||||
return CPUReadByteQuick(reg[15].I+(address & 1));
|
return CPUReadByteQuick(reg[15].I+(address & 1));
|
||||||
|
#else
|
||||||
|
return CPUReadByteQuickDef(reg[15].I+(address & 1));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user