summaryrefslogtreecommitdiff
path: root/src/rom_1068C.c
blob: 297f9821d79d631b01d9aa2973fc16009ac772e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "global.h"
#include "main.h"

void sub_1068C(int a, int b, int c, int d, u16 e)
{
    u16 i;
    u16 j;

    for (i = 0; i < d; i++)
    {
        for (j = 0; j < c; j++)
        {
            u16 index = b * 32 + a + i * 32 + j;

            gUnknown_03005C00[index] = (gUnknown_03005C00[index] & 0xFFF) | (e << 12);
        }
    }
}

// This requires volatile parameters to match. There is no reason, *ever*, to do this.
void sub_10708(void *volatile src, void *volatile dest, s16 numTilesX, s16 numTilesY)
{
    int i;

    for (i = 0; i < numTilesY; i++)
    {
        DmaCopy16(3, (u8 *)src + 0x400 * i, (u8 *)dest + 0x400 * i, numTilesX * 32);
    }
}

void sub_10750(void *volatile src, void *volatile dest, s16 numTilesX, s16 numTilesY)
{
    int i;

    for (i = 0; i < numTilesY; i++)
    {
        DmaCopy16(3, (u8 *)src + 0x40 * i, (u8 *)dest + 0x40 * i, numTilesX * 2);
    }
}

void sub_10798(void *a, void *b, void (*func)(void))
{
    u16 i;

    DmaCopy16(3, a, gUnknown_0201A920, 0x200);
    DmaCopy16(3, b, gUnknown_0201A920 + 0x200, 0x200);
    DmaFill16(3, 0x7FFF, gUnknown_0201A920 - 0x200, 0x400);
    DmaCopy16(3, gUnknown_0201A920 - 0x200, gUnknown_0201A920 + 0x200, 0x400);
    DmaCopy16(3, gUnknown_0201A920 + 0x200, (void *)PLTT, 0x400);

    sub_1050C();
    gMain.unk16 = REG_DISPCNT;

    for (i = 0; i <= 32; i += 16)
    {
        if (func != NULL)
            func();
        sub_1001C(i);
        MainLoopIter();
        if (i == 32)
        {
            DmaCopy16(3, gUnknown_0201A920, (void *)PLTT, 0x400);
        }
        else
        {
            DmaCopy16(3, gUnknown_0201AD20, (void *)PLTT, 0x400);
        }
    }
}

void sub_10860(void (*func)(void))
{
    u16 i;

    DmaCopy16(3, (void *)PLTT, gUnknown_0201A520, 0x400);
    DmaFill16(3, 0x7FFF, gUnknown_0201A520 + 0x200, 0x400);
    DmaCopy16(3, gUnknown_0201A520, gUnknown_0201A520 + 0x400, 0x400);

    for (i = 0; i <= 32; i += 16)
    {
        if (func != NULL)
            func();
        sub_1001C(i);
        MainLoopIter();
        if (i == 32)
        {
            DmaCopy16(3, gUnknown_0201A920, (void *)PLTT, 0x400);
        }
        else
        {
            DmaCopy16(3, gUnknown_0201AD20, (void *)PLTT, 0x400);
        }
    }
    MainLoopIter();
}

#ifdef NONMATCHING
// Like sub_C24, it matches except for that damn 'push {lr}/pop {lr}'
void ClearSomeArray(void)
{
    int i;
    
    for (i = 0; i < 4; i++)
        gUnknown_0201A500[i] = 0;
}
#else
NAKED
void ClearSomeArray(void)
{
    asm_unified("\n\
	ldr r1, _08010920 @ =gUnknown_0201A500\n\
	movs r2, #0\n\
	adds r0, r1, #0\n\
	adds r0, #0xc\n\
_08010914:\n\
	str r2, [r0]\n\
	subs r0, #4\n\
	cmp r0, r1\n\
	bge _08010914\n\
	bx lr\n\
	.align 2, 0\n\
_08010920: .4byte gUnknown_0201A500");
}
#endif