mirror of
https://github.com/pret/pokeheartgold.git
synced 2025-02-24 23:33:27 +00:00
save_gymmick.c
This commit is contained in:
parent
1224e160ac
commit
f708f218b5
155
asm/timer3.s
155
asm/timer3.s
@ -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
|
@ -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
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
2
main.lsf
2
main.lsf
@ -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
|
||||
|
@ -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
20
src/save_gymmick.c
Normal 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
52
src/timer3.c
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user