save_gymmick.c

This commit is contained in:
PikalaxALT 2022-02-04 16:44:00 -05:00
parent 1224e160ac
commit f708f218b5
11 changed files with 143 additions and 253 deletions

View File

@ -1,155 +0,0 @@
.include "asm/macros.inc"
.include "global.inc"
.bss
_021D2210:
.space 0xC
.text
thumb_func_start Init_Timer3
Init_Timer3: ; 0x02025404
push {r3, lr}
ldr r0, _0202542C ; =_021D2210
mov r2, #0
str r2, [r0, #4]
str r2, [r0, #8]
ldr r1, _02025430 ; =0x0400010E
str r2, [r0]
strh r2, [r1]
sub r0, r1, #2
strh r2, [r0]
mov r0, #0xc1
strh r0, [r1]
ldr r1, _02025434 ; =sub_02025438
mov r0, #0x40
bl OS_SetIrqFunction
mov r0, #0x40
bl OS_EnableIrqMask
pop {r3, pc}
.balign 4, 0
_0202542C: .word _021D2210
_02025430: .word 0x0400010E
_02025434: .word sub_02025438
thumb_func_end Init_Timer3
thumb_func_start sub_02025438
sub_02025438: ; 0x02025438
ldr r0, _02025470 ; =_021D2210
mov r3, #0
ldr r1, [r0, #4]
ldr r2, [r0, #8]
add r1, r1, #1
adc r2, r3
str r1, [r0, #4]
str r2, [r0, #8]
ldr r1, [r0]
cmp r1, #0
beq _0202545C
ldr r2, _02025474 ; =0x0400010E
strh r3, [r2]
sub r1, r2, #2
strh r3, [r1]
mov r1, #0xc1
strh r1, [r2]
str r3, [r0]
_0202545C:
ldr r3, _02025478 ; =OS_IRQTable
ldr r1, _0202547C ; =0x00003FF8
mov r0, #0x40
ldr r2, [r3, r1]
orr r2, r0
str r2, [r3, r1]
ldr r3, _02025480 ; =OS_SetIrqFunction
ldr r1, _02025484 ; =sub_02025438
bx r3
nop
_02025470: .word _021D2210
_02025474: .word 0x0400010E
_02025478: .word OS_IRQTable
_0202547C: .word 0x00003FF8
_02025480: .word OS_SetIrqFunction
_02025484: .word sub_02025438
thumb_func_end sub_02025438
thumb_func_start sub_02025488
sub_02025488: ; 0x02025488
push {r4, r5, lr}
sub sp, #0xc
bl OS_DisableInterrupts
ldr r1, _020254EC ; =0x0400010C
add r3, sp, #0
ldrh r1, [r1]
ldr r2, _020254F0 ; =0x0000FFFF
strh r1, [r3]
ldr r1, _020254F4 ; =_021D2210
ldr r5, [r1, #4]
ldr r4, [r1, #8]
mov r1, #0
mvn r1, r1
and r1, r5
str r1, [sp, #4]
and r2, r4
ldr r1, _020254F8 ; =0x04000214
str r2, [sp, #8]
ldr r2, [r1]
mov r1, #0x40
tst r2, r1
beq _020254CC
ldrh r2, [r3]
lsl r1, r1, #9
tst r1, r2
bne _020254CC
ldr r2, [sp, #4]
mov r1, #0
ldr r3, [sp, #8]
add r2, r2, #1
adc r3, r1
str r2, [sp, #4]
str r3, [sp, #8]
_020254CC:
bl OS_RestoreInterrupts
ldr r2, [sp, #4]
ldr r1, [sp, #8]
lsr r0, r2, #0x10
lsl r1, r1, #0x10
orr r1, r0
add r0, sp, #0
lsl r3, r2, #0x10
ldrh r2, [r0]
asr r0, r2, #0x1f
orr r1, r0
add r0, r3, #0
orr r0, r2
add sp, #0xc
pop {r4, r5, pc}
.balign 4, 0
_020254EC: .word 0x0400010C
_020254F0: .word 0x0000FFFF
_020254F4: .word _021D2210
_020254F8: .word 0x04000214
thumb_func_end sub_02025488
thumb_func_start sub_020254FC
sub_020254FC: ; 0x020254FC
ldr r3, _02025500 ; =sub_02025488
bx r3
.balign 4, 0
_02025500: .word sub_02025488
thumb_func_end sub_020254FC
thumb_func_start sub_02025504
sub_02025504: ; 0x02025504
push {r3, lr}
lsr r2, r0, #0x1a
lsl r1, r1, #6
orr r1, r2
ldr r2, _02025518 ; =0x01FF6210
lsl r0, r0, #6
mov r3, #0
bl _ll_udiv
pop {r3, pc}
.balign 4, 0
_02025518: .word 0x01FF6210
thumb_func_end sub_02025504

View File

@ -1,45 +0,0 @@
.include "asm/macros.inc"
.include "global.inc"
.text
thumb_func_start SavGymmick_Clear
SavGymmick_Clear: ; 0x0202AE8C
ldr r3, _0202AE94 ; =MI_CpuFill8
mov r1, #0
mov r2, #0x24
bx r3
.balign 4, 0
_0202AE94: .word MI_CpuFill8
thumb_func_end SavGymmick_Clear
thumb_func_start SavGymmick_Init
SavGymmick_Init: ; 0x0202AE98
push {r3, r4, r5, lr}
add r5, r0, #0
add r4, r1, #0
bl SavGymmick_Clear
str r4, [r5]
add r0, r5, #4
pop {r3, r4, r5, pc}
thumb_func_end SavGymmick_Init
thumb_func_start SavGymmick_AssertMagic_GetData
SavGymmick_AssertMagic_GetData: ; 0x0202AEA8
push {r4, lr}
add r4, r0, #0
ldr r0, [r4]
cmp r0, r1
beq _0202AEB6
bl GF_AssertFail
_0202AEB6:
add r0, r4, #4
pop {r4, pc}
.balign 4, 0
thumb_func_end SavGymmick_AssertMagic_GetData
thumb_func_start SavGymmick_GetType
SavGymmick_GetType: ; 0x0202AEBC
ldr r0, [r0]
bx lr
thumb_func_end SavGymmick_GetType

View File

@ -6,7 +6,8 @@
.rodata
_02100038:
.byte 0x00, 0x01, 0x00, 0x00
.byte 0x00, 0x01, 0x00
.balign 4, 0
_0210003C:
.word 0xF4, 0xF6, 0xF5
_02100048:
@ -35,7 +36,7 @@ _02100048:
.word 0xEF
_021000A4:
.byte 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x00, 0x01
.byte 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00
.byte 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00
.text

View File

@ -46,10 +46,15 @@ typedef struct GXBanksConfig {
GXVRamTexPltt texpltt;
} GF_GXBanksConfig;
void GX_SetBanks(const GF_GXBanksConfig *banks);
void GX_DisableEngineALayers(void);
void GX_DisableEngineBLayers(void);
void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle enable);
void GX_EngineASetLayers(u32 layers);
void GX_DisableEngineBLayers(void);
void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle enable);
void GX_EngineBSetLayers(u32 layers);
void GX_BothDispOn(void);
void GX_SwapDisplay(void);
u32 GX_EngineAGetLayers(void);
#endif //POKEHEARTGOLD_GX_LAYERS_H

View File

@ -12,40 +12,45 @@
#define GYMMICK_VIRIDIAN 8
#define GYMMICK_SINJOH 9
union GymmickUnion {
u8 raw[0x20];
struct {
u8 candles[4];
} ecruteak;
struct {
BOOL winch;
} cianwood;
struct {
u8 switches[2];
u8 gates[2];
} vermilion;
struct {
BOOL liftState;
} violet;
struct {
u8 spiders[4];
int switches;
} azalea;
struct {
u16 x[3];
u16 z[3];
u8 rot[3];
} blackthorn;
u8 fuchsia; // unused
u8 viridian; // unused
struct {
u32 choice;
} sinjoh;
};
struct Gymmick {
int kind;
union {
u8 raw[0x20];
struct {
u8 candles[4];
} ecruteak;
struct {
BOOL winch;
} cianwood;
struct {
u8 switches[2];
u8 gates[2];
} vermilion;
struct {
BOOL liftState;
} violet;
struct {
u8 spiders[4];
int switches;
} azalea;
struct {
u16 x[3];
u16 z[3];
u8 rot[3];
} blackthorn;
u8 fuchsia; // unused
u8 viridian; // unused
struct {
u32 choice;
} sinjoh;
};
union GymmickUnion data;
};
void SavGymmick_Clear(struct Gymmick *gymmick);
union GymmickUnion *SavGymmick_Init(struct Gymmick *gymmick, int kind);
union GymmickUnion *SavGymmick_AssertMagic_GetData(struct Gymmick *gymmick, int kind);
int SavGymmick_GetType(struct Gymmick *gymmick);
#endif //POKEHEARTGOLD_GYMMICK_H

View File

@ -2,5 +2,8 @@
#define POKEHEARTGOLD_TIMER_3_H
void Init_Timer3(void);
u64 sub_02025488(void);
u64 sub_020254FC(void);
u64 sub_02025504(u64 a0);
#endif //POKEHEARTGOLD_TIMER_3_H

View File

@ -48,6 +48,10 @@ static inline void MI_CpuFillFast(void *dst, int data, u32 size) {
MIi_CpuClearFast(data, dst, size);
}
static inline void MI_CpuClear8(void *dst, u32 size) {
MI_CpuFill8(dst, 0, size);
}
void MI_Copy36B(const void *pSrc, void *pDst);
#endif //NITRO_MI_MEMORY_H

View File

@ -97,7 +97,7 @@ Static main
Object save_misc.o
Object options.o
Object apricorn_tree_sys.o
Object unk_0202AE8C.o
Object save_gymmick.o
Object unk_0202AEC0.o
Object mail.o
Object unk_0202B614.o

View File

@ -1,8 +1,8 @@
#include "gx_layers.h"
#include "system.h"
u32 _021D21FC = 0;
u32 _021D2200 = 0;
static u32 sEngineBLayers = 0;
static u32 sEngineALayers = 0;
void GX_SetBanks(const GF_GXBanksConfig *banks) {
GX_ResetBankForBG();
@ -29,50 +29,50 @@ void GX_SetBanks(const GF_GXBanksConfig *banks) {
}
void GX_DisableEngineALayers(void) {
(void)_021D21FC;
_021D2200 = 0;
(void)sEngineBLayers;
sEngineALayers = 0;
}
void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle enable) {
if (enable == GX_LAYER_TOGGLE_ON) {
if (_021D2200 & layer_mask) {
if (sEngineALayers & layer_mask) {
return;
}
} else {
if (!(_021D2200 & layer_mask)) {
if (!(sEngineALayers & layer_mask)) {
return;
}
}
_021D2200 ^= layer_mask;
GX_SetVisiblePlane(_021D2200);
sEngineALayers ^= layer_mask;
GX_SetVisiblePlane(sEngineALayers);
}
void GX_EngineASetLayers(u32 layers) {
_021D2200 = layers;
GX_SetVisiblePlane(_021D2200);
sEngineALayers = layers;
GX_SetVisiblePlane(sEngineALayers);
}
void GX_DisableEngineBLayers(void) {
_021D21FC = 0;
sEngineBLayers = 0;
}
void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle enable) {
if (enable == GX_LAYER_TOGGLE_ON) {
if (_021D21FC & layer_mask) {
if (sEngineBLayers & layer_mask) {
return;
}
} else {
if (!(_021D21FC & layer_mask)) {
if (!(sEngineBLayers & layer_mask)) {
return;
}
}
_021D21FC ^= layer_mask;
GXS_SetVisiblePlane(_021D21FC);
sEngineBLayers ^= layer_mask;
GXS_SetVisiblePlane(sEngineBLayers);
}
void GX_EngineBSetLayers(u32 layers) {
_021D21FC = layers;
GXS_SetVisiblePlane(_021D21FC);
sEngineBLayers = layers;
GXS_SetVisiblePlane(sEngineBLayers);
}
void GX_BothDispOn(void) {
@ -89,5 +89,5 @@ void GX_SwapDisplay(void) {
}
u32 GX_EngineAGetLayers(void) {
return _021D2200;
return sEngineALayers;
}

20
src/save_gymmick.c Normal file
View File

@ -0,0 +1,20 @@
#include "gymmick.h"
void SavGymmick_Clear(struct Gymmick *gymmick) {
MI_CpuClear8(gymmick, sizeof(struct Gymmick));
}
union GymmickUnion *SavGymmick_Init(struct Gymmick *gymmick, int kind) {
SavGymmick_Clear(gymmick);
gymmick->kind = kind;
return &gymmick->data;
}
union GymmickUnion *SavGymmick_AssertMagic_GetData(struct Gymmick *gymmick, int kind) {
GF_ASSERT(gymmick->kind == kind);
return &gymmick->data;
}
int SavGymmick_GetType(struct Gymmick *gymmick) {
return gymmick->kind;
}

52
src/timer3.c Normal file
View File

@ -0,0 +1,52 @@
#include "timer_3.h"
vu64 _021D2214;
int _021D2210;
static void sub_02025438(void);
void Init_Timer3(void) {
_021D2214 = 0;
_021D2210 = 0;
OS_SetTimerControl(OS_TIMER_3, 0);
OS_SetTimerCount(OS_TIMER_3, 0);
OS_SetTimerControl(OS_TIMER_3, (OS_TIMER_PRESCALER_64 << REG_OS_TM3CNT_H_PS_SHIFT) | (1 << REG_OS_TM3CNT_H_I_SHIFT) | (1 << REG_OS_TM3CNT_H_E_SHIFT));
OS_SetIrqFunction(OS_IE_TIMER3, sub_02025438);
OS_EnableIrqMask(OS_IE_TIMER3);
}
static void sub_02025438(void) {
_021D2214++;
if (_021D2210) {
OS_SetTimerControl(OS_TIMER_3, 0);
OS_SetTimerCount(OS_TIMER_3, 0);
OS_SetTimerControl(OS_TIMER_3, (OS_TIMER_PRESCALER_64 << REG_OS_TM3CNT_H_PS_SHIFT) | (1 << REG_OS_TM3CNT_H_I_SHIFT) | (1 << REG_OS_TM3CNT_H_E_SHIFT));
_021D2210 = 0;
}
OS_SetIrqCheckFlag(OS_IE_TIMER3);
OS_SetIrqFunction(OS_IE_TIMER3, sub_02025438);
}
u64 sub_02025488(void) {
vu16 count_lo;
vu64 count_hi;
OSIntrMode bak_psr;
bak_psr = OS_DisableInterrupts();
count_lo = *(REGType16 *)((u32)(REG_TM0CNT_L_ADDR + 4 * OS_TIMER_3));
count_hi = _021D2214 & 0x0000FFFFFFFFFFFFull;
if ((reg_OS_IF & OS_IE_TIMER3) && !(count_lo & 0x8000)) {
count_hi++;
}
OS_RestoreInterrupts(bak_psr);
return (count_hi << 16) | count_lo;
}
u64 sub_020254FC(void) {
return sub_02025488();
}
u64 sub_02025504(u64 a0) {
return (a0 * 64) / OS_SYSTEM_CLOCK;
}