decompile window.s
This commit is contained in:
parent
6f03356237
commit
7daeebd3f4
6 changed files with 972 additions and 1289 deletions
1221
asm/window.s
1221
asm/window.s
File diff suppressed because it is too large
Load diff
8
include/malloc.h
Normal file
8
include/malloc.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef GUARD_MALLOC_H
|
||||||
|
#define GUARD_MALLOC_H
|
||||||
|
|
||||||
|
void *Alloc(u32 size);
|
||||||
|
void *AllocZeroed(u32 size);
|
||||||
|
void Free(void *pointer);
|
||||||
|
|
||||||
|
#endif // GUARD_MALLOC_H
|
|
@ -1,6 +1,20 @@
|
||||||
#ifndef GUARD_WINDOW_H
|
#ifndef GUARD_WINDOW_H
|
||||||
#define GUARD_WINDOW_H
|
#define GUARD_WINDOW_H
|
||||||
|
|
||||||
|
#define WINDOWS_MAX 32
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
WINDOW_PRIORITY,
|
||||||
|
WINDOW_TILEMAP_LEFT,
|
||||||
|
WINDOW_TILEMAP_TOP,
|
||||||
|
WINDOW_WIDTH,
|
||||||
|
WINDOW_HEIGHT,
|
||||||
|
WINDOW_PALETTE_NUM,
|
||||||
|
WINDOW_BASE_BLOCK,
|
||||||
|
WINDOW_TILE_DATA
|
||||||
|
};
|
||||||
|
|
||||||
struct WindowTemplate
|
struct WindowTemplate
|
||||||
{
|
{
|
||||||
u8 priority;
|
u8 priority;
|
||||||
|
@ -18,4 +32,6 @@ struct Window
|
||||||
u8 *tileData;
|
u8 *tileData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct Window gWindows[WINDOWS_MAX];
|
||||||
|
|
||||||
#endif // GUARD_WINDOW_H
|
#endif // GUARD_WINDOW_H
|
||||||
|
|
|
@ -48,7 +48,6 @@ SECTIONS {
|
||||||
asm/bg.o(.text);
|
asm/bg.o(.text);
|
||||||
asm/blit.o(.text);
|
asm/blit.o(.text);
|
||||||
src/window.o(.text);
|
src/window.o(.text);
|
||||||
asm/window.o(.text);
|
|
||||||
src/text.o(.text);
|
src/text.o(.text);
|
||||||
asm/sprite.o(.text);
|
asm/sprite.o(.text);
|
||||||
src/string_util.o(.text);
|
src/string_util.o(.text);
|
||||||
|
|
897
src/window.c
897
src/window.c
|
@ -1,27 +1,32 @@
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
#include "malloc.h"
|
||||||
|
|
||||||
extern u8 gUnknown_03002F60;
|
extern u8 gUnknown_03002F60;
|
||||||
extern void* gUnknown_03002F70[];
|
extern void* gUnknown_03002F70[];
|
||||||
extern u32 gUnneededFireRedVariable;
|
extern u32 gUnneededFireRedVariable;
|
||||||
EWRAM_DATA struct Window gWindows[20];
|
|
||||||
|
EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};
|
||||||
|
EWRAM_DATA static struct Window* sWindowPtr = NULL;
|
||||||
|
EWRAM_DATA static u16 sWindowSize = 0;
|
||||||
|
|
||||||
extern void* GetBgTilemapBuffer(u8 bg);
|
extern void* GetBgTilemapBuffer(u8 bg);
|
||||||
extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int);
|
extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int);
|
||||||
extern u16 GetBgAttribute(u8 bg, u8 attributeId);
|
extern u16 GetBgAttribute(u8 bg, u8 attributeId);
|
||||||
extern void *AllocZeroed(u16 size);
|
|
||||||
extern void FreeAllWindowBuffers(void);
|
extern void FreeAllWindowBuffers(void);
|
||||||
extern void SetBgTilemapBuffer(u8 bg, void *tilemap);
|
extern void SetBgTilemapBuffer(u8 bg, void *tilemap);
|
||||||
extern u8 GetNumActiveWindowsOnBg(u8 bgId);
|
extern u8 GetNumActiveWindowsOnBg(u8 bgId);
|
||||||
extern void Free(void *pointer);
|
|
||||||
extern void CopyBgTilemapBufferToVram(u8 bg);
|
extern void CopyBgTilemapBufferToVram(u8 bg);
|
||||||
extern u8 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset);
|
extern u8 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset);
|
||||||
extern void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, u16 tileNumDelta);
|
extern void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, u16 tileNumDelta);
|
||||||
extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
|
extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
|
||||||
extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey);
|
extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey);
|
||||||
|
extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum);
|
||||||
extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
|
extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
|
||||||
|
extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
|
||||||
|
|
||||||
void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
|
void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
|
||||||
|
u8 GetNumActiveWindowsOnBg8Bit(u8 bgId);
|
||||||
|
|
||||||
extern const struct WindowTemplate gDummyWindowTemplate;
|
extern const struct WindowTemplate gDummyWindowTemplate;
|
||||||
|
|
||||||
|
@ -86,7 +91,7 @@ bool16 InitWindows(struct WindowTemplate *templates)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allocatedTilemapBuffer = AllocZeroed(0x20 * (templates[i].width * templates[i].height));
|
allocatedTilemapBuffer = AllocZeroed((u16)(0x20 * (templates[i].width * templates[i].height)));
|
||||||
|
|
||||||
if (allocatedTilemapBuffer == NULL)
|
if (allocatedTilemapBuffer == NULL)
|
||||||
{
|
{
|
||||||
|
@ -161,7 +166,7 @@ u16 AddWindow(struct WindowTemplate *template)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allocatedTilemapBuffer = AllocZeroed(0x20 * (template->width * template->height));
|
allocatedTilemapBuffer = AllocZeroed((u16)(0x20 * (template->width * template->height)));
|
||||||
|
|
||||||
if (allocatedTilemapBuffer == NULL)
|
if (allocatedTilemapBuffer == NULL)
|
||||||
{
|
{
|
||||||
|
@ -459,3 +464,885 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue)
|
||||||
int fillSize = gWindows[windowId].window.width * gWindows[windowId].window.height;
|
int fillSize = gWindows[windowId].window.width * gWindows[windowId].window.height;
|
||||||
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
|
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// functionally equivalent, its fucking hard to match
|
||||||
|
#ifdef NONMATCHING
|
||||||
|
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||||
|
{
|
||||||
|
s32 i, id1, id2, size;
|
||||||
|
u32 distanceLoop, toFill, width;
|
||||||
|
u8 *tileData;
|
||||||
|
struct WindowTemplate window;
|
||||||
|
|
||||||
|
tileData = gWindows[windowId].tileData;
|
||||||
|
toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
|
||||||
|
window = gWindows[windowId].window;
|
||||||
|
size = 0x20 * (window.height * window.width);
|
||||||
|
width = window.width;
|
||||||
|
if (direction != 1)
|
||||||
|
{
|
||||||
|
s32 signedDirection = direction;
|
||||||
|
if (signedDirection <= 1)
|
||||||
|
{
|
||||||
|
if (signedDirection == 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < size; i += 0x20)
|
||||||
|
{
|
||||||
|
distanceLoop = distance;
|
||||||
|
id1 = i + 0;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 4;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 8;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 12;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 16;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 20;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 24;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 28;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData + id1) = toFill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tileData += size - 4;
|
||||||
|
for (i = 0; i < size; i += 0x20)
|
||||||
|
{
|
||||||
|
distanceLoop = distance;
|
||||||
|
id1 = i + 0;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 4;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 8;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 12;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 16;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 20;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 24;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
|
||||||
|
distanceLoop++;
|
||||||
|
id1 = i + 28;
|
||||||
|
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||||
|
if (id2 < size)
|
||||||
|
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||||
|
else
|
||||||
|
*(u32*)(tileData - id1) = toFill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
__attribute__((naked))
|
||||||
|
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||||
|
{
|
||||||
|
asm(".syntax unified\n\
|
||||||
|
push {r4-r7,lr}\n\
|
||||||
|
mov r7, r10\n\
|
||||||
|
mov r6, r9\n\
|
||||||
|
mov r5, r8\n\
|
||||||
|
push {r5-r7}\n\
|
||||||
|
sub sp, 0x8\n\
|
||||||
|
lsls r0, 24\n\
|
||||||
|
lsrs r0, 24\n\
|
||||||
|
lsls r1, 24\n\
|
||||||
|
lsrs r1, 24\n\
|
||||||
|
mov r8, r1\n\
|
||||||
|
lsls r2, 24\n\
|
||||||
|
lsrs r2, 24\n\
|
||||||
|
str r2, [sp]\n\
|
||||||
|
lsls r3, 24\n\
|
||||||
|
lsrs r3, 24\n\
|
||||||
|
ldr r2, =gWindows\n\
|
||||||
|
lsls r1, r0, 1\n\
|
||||||
|
adds r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r4, r1, r2\n\
|
||||||
|
adds r2, 0x8\n\
|
||||||
|
adds r1, r2\n\
|
||||||
|
ldr r5, [r1]\n\
|
||||||
|
lsls r7, r3, 24\n\
|
||||||
|
lsls r0, r3, 16\n\
|
||||||
|
orrs r7, r0\n\
|
||||||
|
lsls r0, r3, 8\n\
|
||||||
|
orrs r7, r0\n\
|
||||||
|
orrs r7, r3\n\
|
||||||
|
ldr r1, [r4]\n\
|
||||||
|
ldr r2, [r4, 0x4]\n\
|
||||||
|
ldrb r3, [r4, 0x4]\n\
|
||||||
|
lsrs r0, r1, 24\n\
|
||||||
|
muls r0, r3\n\
|
||||||
|
lsls r6, r0, 5\n\
|
||||||
|
lsrs r1, 24\n\
|
||||||
|
mov r12, r1\n\
|
||||||
|
mov r0, r8\n\
|
||||||
|
cmp r0, 0x1\n\
|
||||||
|
bne _08003CE8\n\
|
||||||
|
b _08003E9E\n\
|
||||||
|
_08003CE8:\n\
|
||||||
|
cmp r0, 0x1\n\
|
||||||
|
ble _08003CEE\n\
|
||||||
|
b _08004046\n\
|
||||||
|
_08003CEE:\n\
|
||||||
|
cmp r0, 0\n\
|
||||||
|
beq _08003CF4\n\
|
||||||
|
b _08004046\n\
|
||||||
|
_08003CF4:\n\
|
||||||
|
movs r4, 0\n\
|
||||||
|
cmp r4, r6\n\
|
||||||
|
blt _08003CFC\n\
|
||||||
|
b _08004046\n\
|
||||||
|
_08003CFC:\n\
|
||||||
|
movs r1, 0x8\n\
|
||||||
|
negs r1, r1\n\
|
||||||
|
mov r9, r1\n\
|
||||||
|
movs r2, 0x7\n\
|
||||||
|
mov r8, r2\n\
|
||||||
|
mov r10, r5\n\
|
||||||
|
_08003D08:\n\
|
||||||
|
ldr r3, [sp]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r2, r8\n\
|
||||||
|
ands r0, r2\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003D34\n\
|
||||||
|
adds r0, r5, r1\n\
|
||||||
|
ldr r0, [r0]\n\
|
||||||
|
mov r1, r10\n\
|
||||||
|
str r0, [r1]\n\
|
||||||
|
b _08003D38\n\
|
||||||
|
.pool\n\
|
||||||
|
_08003D34:\n\
|
||||||
|
mov r2, r10\n\
|
||||||
|
str r7, [r2]\n\
|
||||||
|
_08003D38:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0x4\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003D64\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003D68\n\
|
||||||
|
_08003D64:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003D68:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x8\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003D96\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003D9A\n\
|
||||||
|
_08003D96:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003D9A:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0xC\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003DC8\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003DCC\n\
|
||||||
|
_08003DC8:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003DCC:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x10\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003DFA\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003DFE\n\
|
||||||
|
_08003DFA:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003DFE:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x14\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003E2C\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003E30\n\
|
||||||
|
_08003E2C:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003E30:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x18\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003E5E\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003E62\n\
|
||||||
|
_08003E5E:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003E62:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x1C\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
adds r0, r1, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r3, r1\n\
|
||||||
|
orrs r0, r3\n\
|
||||||
|
lsls r0, 2\n\
|
||||||
|
adds r1, r4, r0\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003E8C\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
adds r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003E90\n\
|
||||||
|
_08003E8C:\n\
|
||||||
|
adds r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003E90:\n\
|
||||||
|
movs r2, 0x20\n\
|
||||||
|
add r10, r2\n\
|
||||||
|
adds r4, 0x20\n\
|
||||||
|
cmp r4, r6\n\
|
||||||
|
bge _08003E9C\n\
|
||||||
|
b _08003D08\n\
|
||||||
|
_08003E9C:\n\
|
||||||
|
b _08004046\n\
|
||||||
|
_08003E9E:\n\
|
||||||
|
subs r0, r6, 0x4\n\
|
||||||
|
adds r5, r0\n\
|
||||||
|
movs r4, 0\n\
|
||||||
|
cmp r4, r6\n\
|
||||||
|
blt _08003EAA\n\
|
||||||
|
b _08004046\n\
|
||||||
|
_08003EAA:\n\
|
||||||
|
movs r0, 0x8\n\
|
||||||
|
negs r0, r0\n\
|
||||||
|
mov r9, r0\n\
|
||||||
|
movs r1, 0x7\n\
|
||||||
|
mov r8, r1\n\
|
||||||
|
mov r10, r5\n\
|
||||||
|
_08003EB6:\n\
|
||||||
|
ldr r3, [sp]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r2, r9\n\
|
||||||
|
ands r0, r2\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r2, r8\n\
|
||||||
|
ands r0, r2\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003EDC\n\
|
||||||
|
subs r0, r5, r1\n\
|
||||||
|
ldr r0, [r0]\n\
|
||||||
|
mov r1, r10\n\
|
||||||
|
str r0, [r1]\n\
|
||||||
|
b _08003EE0\n\
|
||||||
|
_08003EDC:\n\
|
||||||
|
mov r2, r10\n\
|
||||||
|
str r7, [r2]\n\
|
||||||
|
_08003EE0:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0x4\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003F0C\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003F10\n\
|
||||||
|
_08003F0C:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003F10:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x8\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003F3E\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003F42\n\
|
||||||
|
_08003F3E:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003F42:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0xC\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003F70\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003F74\n\
|
||||||
|
_08003F70:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003F74:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x10\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003FA2\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003FA6\n\
|
||||||
|
_08003FA2:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003FA6:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x14\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08003FD4\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08003FD8\n\
|
||||||
|
_08003FD4:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08003FD8:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x18\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
str r1, [sp, 0x4]\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
ldr r1, [sp, 0x4]\n\
|
||||||
|
orrs r1, r0\n\
|
||||||
|
lsls r1, 2\n\
|
||||||
|
adds r1, r4, r1\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08004006\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _0800400A\n\
|
||||||
|
_08004006:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_0800400A:\n\
|
||||||
|
adds r3, 0x1\n\
|
||||||
|
adds r2, r4, 0\n\
|
||||||
|
adds r2, 0x1C\n\
|
||||||
|
adds r0, r3, 0\n\
|
||||||
|
mov r1, r9\n\
|
||||||
|
ands r0, r1\n\
|
||||||
|
mov r1, r12\n\
|
||||||
|
muls r1, r0\n\
|
||||||
|
adds r0, r1, 0\n\
|
||||||
|
mov r1, r8\n\
|
||||||
|
ands r3, r1\n\
|
||||||
|
orrs r0, r3\n\
|
||||||
|
lsls r0, 2\n\
|
||||||
|
adds r1, r4, r0\n\
|
||||||
|
cmp r1, r6\n\
|
||||||
|
bge _08004034\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
subs r1, r5, r1\n\
|
||||||
|
ldr r1, [r1]\n\
|
||||||
|
str r1, [r0]\n\
|
||||||
|
b _08004038\n\
|
||||||
|
_08004034:\n\
|
||||||
|
subs r0, r5, r2\n\
|
||||||
|
str r7, [r0]\n\
|
||||||
|
_08004038:\n\
|
||||||
|
movs r2, 0x20\n\
|
||||||
|
negs r2, r2\n\
|
||||||
|
add r10, r2\n\
|
||||||
|
adds r4, 0x20\n\
|
||||||
|
cmp r4, r6\n\
|
||||||
|
bge _08004046\n\
|
||||||
|
b _08003EB6\n\
|
||||||
|
_08004046:\n\
|
||||||
|
add sp, 0x8\n\
|
||||||
|
pop {r3-r5}\n\
|
||||||
|
mov r8, r3\n\
|
||||||
|
mov r9, r4\n\
|
||||||
|
mov r10, r5\n\
|
||||||
|
pop {r4-r7}\n\
|
||||||
|
pop {r0}\n\
|
||||||
|
bx r0\n\
|
||||||
|
.syntax divided");
|
||||||
|
}
|
||||||
|
#endif // NONMATCHING
|
||||||
|
|
||||||
|
void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8))
|
||||||
|
{
|
||||||
|
struct WindowTemplate window = gWindows[windowId].window;
|
||||||
|
func(window.priority, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value)
|
||||||
|
{
|
||||||
|
switch (attributeId)
|
||||||
|
{
|
||||||
|
case WINDOW_TILEMAP_LEFT:
|
||||||
|
gWindows[windowId].window.tilemapLeft = value;
|
||||||
|
return FALSE;
|
||||||
|
case WINDOW_TILEMAP_TOP:
|
||||||
|
gWindows[windowId].window.tilemapTop = value;
|
||||||
|
return FALSE;
|
||||||
|
case WINDOW_PALETTE_NUM:
|
||||||
|
gWindows[windowId].window.paletteNum = value;
|
||||||
|
return FALSE;
|
||||||
|
case WINDOW_BASE_BLOCK:
|
||||||
|
gWindows[windowId].window.baseBlock = value;
|
||||||
|
return FALSE;
|
||||||
|
case WINDOW_TILE_DATA:
|
||||||
|
gWindows[windowId].tileData = (u8*)(value);
|
||||||
|
return TRUE;
|
||||||
|
case WINDOW_PRIORITY:
|
||||||
|
case WINDOW_WIDTH:
|
||||||
|
case WINDOW_HEIGHT:
|
||||||
|
default:
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 GetWindowAttribute(u8 windowId, u8 attributeId)
|
||||||
|
{
|
||||||
|
switch (attributeId)
|
||||||
|
{
|
||||||
|
case WINDOW_PRIORITY:
|
||||||
|
return gWindows[windowId].window.priority;
|
||||||
|
case WINDOW_TILEMAP_LEFT:
|
||||||
|
return gWindows[windowId].window.tilemapLeft;
|
||||||
|
case WINDOW_TILEMAP_TOP:
|
||||||
|
return gWindows[windowId].window.tilemapTop;
|
||||||
|
case WINDOW_WIDTH:
|
||||||
|
return gWindows[windowId].window.width;
|
||||||
|
case WINDOW_HEIGHT:
|
||||||
|
return gWindows[windowId].window.height;
|
||||||
|
case WINDOW_PALETTE_NUM:
|
||||||
|
return gWindows[windowId].window.paletteNum;
|
||||||
|
case WINDOW_BASE_BLOCK:
|
||||||
|
return gWindows[windowId].window.baseBlock;
|
||||||
|
case WINDOW_TILE_DATA:
|
||||||
|
return (u32)(gWindows[windowId].tileData);
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 GetNumActiveWindowsOnBg(u8 bgId)
|
||||||
|
{
|
||||||
|
u8 windowsNum = 0;
|
||||||
|
s32 i;
|
||||||
|
for (i = 0; i < WINDOWS_MAX; i++)
|
||||||
|
{
|
||||||
|
if (gWindows[i].window.priority == bgId)
|
||||||
|
windowsNum++;
|
||||||
|
}
|
||||||
|
return windowsNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nullsub_9(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 AddWindow8Bit(struct WindowTemplate *template)
|
||||||
|
{
|
||||||
|
u16 windowId;
|
||||||
|
u8* memAddress;
|
||||||
|
u8 bgLayer;
|
||||||
|
|
||||||
|
for (windowId = 0; windowId < 32; windowId++)
|
||||||
|
{
|
||||||
|
if (gWindows[windowId].window.priority == 0xFF)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (windowId == WINDOWS_MAX)
|
||||||
|
return 0xFF;
|
||||||
|
bgLayer = template->priority;
|
||||||
|
if (gUnknown_03002F70[bgLayer] == 0)
|
||||||
|
{
|
||||||
|
u16 attribute = GetBgAttribute(bgLayer, 8);
|
||||||
|
if (attribute != 0xFFFF)
|
||||||
|
{
|
||||||
|
s32 i;
|
||||||
|
memAddress = Alloc(attribute);
|
||||||
|
if (memAddress == NULL)
|
||||||
|
return 0xFF;
|
||||||
|
for (i = 0; i < attribute; i++) // if we're going to zero out the memory anyway, why not call AllocZeroed?
|
||||||
|
memAddress[i] = 0;
|
||||||
|
gUnknown_03002F70[bgLayer] = memAddress;
|
||||||
|
SetBgTilemapBuffer(bgLayer, memAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memAddress = Alloc((u16)(0x40 * (template->width * template->height)));
|
||||||
|
if (memAddress == NULL)
|
||||||
|
{
|
||||||
|
if (GetNumActiveWindowsOnBg8Bit(bgLayer) == 0 && gUnknown_03002F70[bgLayer] != nullsub_9)
|
||||||
|
{
|
||||||
|
Free(gUnknown_03002F70[bgLayer]);
|
||||||
|
gUnknown_03002F70[bgLayer] = NULL;
|
||||||
|
}
|
||||||
|
return 0xFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gWindows[windowId].tileData = memAddress;
|
||||||
|
gWindows[windowId].window = *template;
|
||||||
|
return windowId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue)
|
||||||
|
{
|
||||||
|
s32 i;
|
||||||
|
s32 size;
|
||||||
|
|
||||||
|
size = (u16)(0x40 * (gWindows[windowId].window.width * gWindows[windowId].window.height));
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
gWindows[windowId].tileData[i] = fillValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height)
|
||||||
|
{
|
||||||
|
struct Bitmap pixelRect;
|
||||||
|
|
||||||
|
pixelRect.pixels = gWindows[windowId].tileData;
|
||||||
|
pixelRect.width = 8 * gWindows[windowId].window.width;
|
||||||
|
pixelRect.height = 8 * gWindows[windowId].window.height;
|
||||||
|
|
||||||
|
FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum)
|
||||||
|
{
|
||||||
|
struct Bitmap sourceRect;
|
||||||
|
struct Bitmap destRect;
|
||||||
|
|
||||||
|
sourceRect.pixels = (u8*)pixels;
|
||||||
|
sourceRect.width = srcWidth;
|
||||||
|
sourceRect.height = srcHeight;
|
||||||
|
|
||||||
|
destRect.pixels = gWindows[windowId].tileData;
|
||||||
|
destRect.width = 8 * gWindows[windowId].window.width;
|
||||||
|
destRect.height = 8 * gWindows[windowId].window.height;
|
||||||
|
|
||||||
|
BlitBitmapRect4BitTo8Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0, paletteNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CopyWindowToVram8Bit(u8 windowId, u8 mode)
|
||||||
|
{
|
||||||
|
sWindowPtr = &gWindows[windowId];
|
||||||
|
sWindowSize = 0x40 * (sWindowPtr->window.width * sWindowPtr->window.height);
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
CopyBgTilemapBufferToVram(sWindowPtr->window.priority);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
LoadBgTiles(sWindowPtr->window.priority, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
LoadBgTiles(sWindowPtr->window.priority, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
|
||||||
|
CopyBgTilemapBufferToVram(sWindowPtr->window.priority);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 GetNumActiveWindowsOnBg8Bit(u8 bgId)
|
||||||
|
{
|
||||||
|
u8 windowsNum = 0;
|
||||||
|
s32 i;
|
||||||
|
for (i = 0; i < WINDOWS_MAX; i++)
|
||||||
|
{
|
||||||
|
if (gWindows[i].window.priority == bgId)
|
||||||
|
windowsNum++;
|
||||||
|
}
|
||||||
|
return windowsNum;
|
||||||
|
}
|
||||||
|
|
|
@ -1,14 +1,8 @@
|
||||||
gTrainerId: @ 2020000
|
gTrainerId: @ 2020000
|
||||||
.space 0x4
|
.space 0x4
|
||||||
|
|
||||||
gWindows: @ 2020004
|
.include "src/window.o"
|
||||||
.space 0x180
|
.align 2
|
||||||
|
|
||||||
gUnknown_02020184: @ 2020184
|
|
||||||
.space 0x4
|
|
||||||
|
|
||||||
gUnknown_02020188: @ 2020188
|
|
||||||
.space 0x4
|
|
||||||
|
|
||||||
gTempTextPrinter: @ 202018C
|
gTempTextPrinter: @ 202018C
|
||||||
.space 0x24
|
.space 0x24
|
||||||
|
|
Loading…
Reference in a new issue