Merge remote-tracking branch 'refs/remotes/pret/master'

# Conflicts:
#	asm/libagbbackup.s
#	asm/save.s
#	asm/save_failed_screen.s
#	sym_bss.txt
#	sym_common.txt
This commit is contained in:
Diegoisawesome 2016-11-01 17:50:47 -05:00
commit 06a8cfc9f8
3 changed files with 52 additions and 67 deletions

View File

@ -2,16 +2,16 @@
#define GPU_REG_BUF_SIZE 0x60 #define GPU_REG_BUF_SIZE 0x60
#define GPU_REG_BUF(offset) (*(u16 *)(&gGpuRegBuffer[offset])) #define GPU_REG_BUF(offset) (*(u16 *)(&sGpuRegBuffer[offset]))
#define GPU_REG(offset) (*(vu16 *)(REG_BASE + offset)) #define GPU_REG(offset) (*(vu16 *)(REG_BASE + offset))
#define EMPTY_SLOT 0xFF #define EMPTY_SLOT 0xFF
extern u8 gGpuRegBuffer[GPU_REG_BUF_SIZE]; static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE];
extern u8 gGpuRegWaitingList[GPU_REG_BUF_SIZE]; static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE];
extern bool8 gGpuRegBufferLocked; static bool8 sGpuRegBufferLocked;
extern bool8 gShouldSyncRegIE; static bool8 sShouldSyncRegIE;
extern u16 gRegIE; static u16 sRegIE;
static void CopyBufferedValueToGpuReg(u8 regOffset); static void CopyBufferedValueToGpuReg(u8 regOffset);
static void SyncRegIE(); static void SyncRegIE();
@ -22,13 +22,13 @@ void InitGpuRegManager()
s32 i; s32 i;
for (i = 0; i < GPU_REG_BUF_SIZE; i++) { for (i = 0; i < GPU_REG_BUF_SIZE; i++) {
gGpuRegBuffer[i] = 0; sGpuRegBuffer[i] = 0;
gGpuRegWaitingList[i] = EMPTY_SLOT; sGpuRegWaitingList[i] = EMPTY_SLOT;
} }
gGpuRegBufferLocked = FALSE; sGpuRegBufferLocked = FALSE;
gShouldSyncRegIE = FALSE; sShouldSyncRegIE = FALSE;
gRegIE = 0; sRegIE = 0;
} }
static void CopyBufferedValueToGpuReg(u8 regOffset) static void CopyBufferedValueToGpuReg(u8 regOffset)
@ -43,15 +43,15 @@ static void CopyBufferedValueToGpuReg(u8 regOffset)
void CopyBufferedValuesToGpuRegs() void CopyBufferedValuesToGpuRegs()
{ {
if (!gGpuRegBufferLocked) { if (!sGpuRegBufferLocked) {
s32 i; s32 i;
for (i = 0; i < GPU_REG_BUF_SIZE; i++) { for (i = 0; i < GPU_REG_BUF_SIZE; i++) {
u8 regOffset = gGpuRegWaitingList[i]; u8 regOffset = sGpuRegWaitingList[i];
if (regOffset == EMPTY_SLOT) if (regOffset == EMPTY_SLOT)
return; return;
CopyBufferedValueToGpuReg(regOffset); CopyBufferedValueToGpuReg(regOffset);
gGpuRegWaitingList[i] = EMPTY_SLOT; sGpuRegWaitingList[i] = EMPTY_SLOT;
} }
} }
} }
@ -71,17 +71,17 @@ void SetGpuReg(u8 regOffset, u16 value)
} else { } else {
s32 i; s32 i;
gGpuRegBufferLocked = TRUE; sGpuRegBufferLocked = TRUE;
for (i = 0; i < GPU_REG_BUF_SIZE && gGpuRegWaitingList[i] != EMPTY_SLOT; i++) { for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) {
if (gGpuRegWaitingList[i] == regOffset) { if (sGpuRegWaitingList[i] == regOffset) {
gGpuRegBufferLocked = FALSE; sGpuRegBufferLocked = FALSE;
return; return;
} }
} }
gGpuRegWaitingList[i] = regOffset; sGpuRegWaitingList[i] = regOffset;
gGpuRegBufferLocked = FALSE; sGpuRegBufferLocked = FALSE;
} }
} }
} }
@ -97,17 +97,17 @@ void SetGpuReg_ForcedBlank(u8 regOffset, u16 value)
} else { } else {
s32 i; s32 i;
gGpuRegBufferLocked = TRUE; sGpuRegBufferLocked = TRUE;
for (i = 0; i < GPU_REG_BUF_SIZE && gGpuRegWaitingList[i] != EMPTY_SLOT; i++) { for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) {
if (gGpuRegWaitingList[i] == regOffset) { if (sGpuRegWaitingList[i] == regOffset) {
gGpuRegBufferLocked = FALSE; sGpuRegBufferLocked = FALSE;
return; return;
} }
} }
gGpuRegWaitingList[i] = regOffset; sGpuRegWaitingList[i] = regOffset;
gGpuRegBufferLocked = FALSE; sGpuRegBufferLocked = FALSE;
} }
} }
} }
@ -137,29 +137,29 @@ void ClearGpuRegBits(u8 regOffset, u16 mask)
static void SyncRegIE() static void SyncRegIE()
{ {
if (gShouldSyncRegIE) { if (sShouldSyncRegIE) {
u16 temp = REG_IME; u16 temp = REG_IME;
REG_IME = 0; REG_IME = 0;
REG_IE = gRegIE; REG_IE = sRegIE;
REG_IME = temp; REG_IME = temp;
gShouldSyncRegIE = FALSE; sShouldSyncRegIE = FALSE;
} }
} }
void EnableInterrupts(u16 mask) void EnableInterrupts(u16 mask)
{ {
gRegIE |= mask; sRegIE |= mask;
gShouldSyncRegIE = TRUE; sShouldSyncRegIE = TRUE;
SyncRegIE(); SyncRegIE();
UpdateRegDispstatIntrBits(gRegIE); UpdateRegDispstatIntrBits(sRegIE);
} }
void DisableInterrupts(u16 mask) void DisableInterrupts(u16 mask)
{ {
gRegIE &= ~mask; sRegIE &= ~mask;
gShouldSyncRegIE = TRUE; sShouldSyncRegIE = TRUE;
SyncRegIE(); SyncRegIE();
UpdateRegDispstatIntrBits(gRegIE); UpdateRegDispstatIntrBits(sRegIE);
} }
static void UpdateRegDispstatIntrBits(u16 regIE) static void UpdateRegDispstatIntrBits(u16 regIE)

View File

@ -1,7 +1,7 @@
#include "global.h" #include "global.h"
extern void *gHeapStart; static void *sHeapStart;
extern u32 gHeapSize; static u32 sHeapSize;
#define MALLOC_SYSTEM_ID 0xA3A3 #define MALLOC_SYSTEM_ID 0xA3A3
@ -15,10 +15,10 @@ struct MemBlock {
// Size of the block (not including this header struct). // Size of the block (not including this header struct).
u32 size; u32 size;
// Previous block pointer. Equals gHeapStart if this is the first block. // Previous block pointer. Equals sHeapStart if this is the first block.
struct MemBlock *prev; struct MemBlock *prev;
// Next block pointer. Equals gHeapStart if this is the last block. // Next block pointer. Equals sHeapStart if this is the last block.
struct MemBlock *next; struct MemBlock *next;
// Data in the memory block. (Arrays of length 0 are a GNU extension.) // Data in the memory block. (Arrays of length 0 are a GNU extension.)
@ -169,40 +169,40 @@ bool32 CheckMemBlockInternal(void *heapStart, void *pointer)
void InitHeap(void *heapStart, u32 heapSize) void InitHeap(void *heapStart, u32 heapSize)
{ {
gHeapStart = heapStart; sHeapStart = heapStart;
gHeapSize = heapSize; sHeapSize = heapSize;
PutFirstMemBlockHeader(heapStart, heapSize); PutFirstMemBlockHeader(heapStart, heapSize);
} }
void *Alloc(u32 size) void *Alloc(u32 size)
{ {
AllocInternal(gHeapStart, size); AllocInternal(sHeapStart, size);
} }
void *AllocZeroed(u32 size) void *AllocZeroed(u32 size)
{ {
AllocZeroedInternal(gHeapStart, size); AllocZeroedInternal(sHeapStart, size);
} }
void Free(void *pointer) void Free(void *pointer)
{ {
FreeInternal(gHeapStart, pointer); FreeInternal(sHeapStart, pointer);
} }
bool32 CheckMemBlock(void *pointer) bool32 CheckMemBlock(void *pointer)
{ {
return CheckMemBlockInternal(gHeapStart, pointer); return CheckMemBlockInternal(sHeapStart, pointer);
} }
bool32 CheckHeap() bool32 CheckHeap()
{ {
struct MemBlock *pos = (struct MemBlock *)gHeapStart; struct MemBlock *pos = (struct MemBlock *)sHeapStart;
do { do {
if (!CheckMemBlockInternal(gHeapStart, pos->data)) if (!CheckMemBlockInternal(sHeapStart, pos->data))
return FALSE; return FALSE;
pos = pos->next; pos = pos->next;
} while (pos != (struct MemBlock *)gHeapStart); } while (pos != (struct MemBlock *)sHeapStart);
return TRUE; return TRUE;
} }

View File

@ -1,12 +1,9 @@
gUnknown_03000000: @ 3000000 gUnknown_03000000: @ 3000000
.space 0x4 .space 0x4
gHeapStart: @ 3000004 .include "src/malloc.o"
.space 0x4
gHeapSize: @ 3000008
.space 0x8
.align 4
gDma3Requests: @ 3000010 gDma3Requests: @ 3000010
.space 0xC .space 0xC
@ -25,21 +22,9 @@ gDma3ManagerLocked: @ 3000810
gDma3RequestCursor: @ 3000811 gDma3RequestCursor: @ 3000811
.space 0x7 .space 0x7
gGpuRegBuffer: @ 3000818 .include "src/gpu_regs.o"
.space 0x60
gGpuRegWaitingList: @ 3000878
.space 0x60
gGpuRegBufferLocked: @ 30008D8
.space 0x1
gShouldSyncRegIE: @ 30008D9
.space 0x1
gRegIE: @ 30008DA
.space 0x6
.align 4
gUnknown_030008E0: @ 30008E0 gUnknown_030008E0: @ 30008E0
.space 0x18 .space 0x18