#include <dolphin/os.h>
extern OSTime __OSGetSystemTime();
u8 GameChoice : (OS_BASE_CACHED | 0x30E3);
vu32 __PIRegs[12] : 0xCC003000;
extern OSTime __OSStartTime;
static OSResetCallback ResetCallback;
static BOOL Down;
static BOOL LastState;
static OSTime HoldUp;
static OSTime HoldDown;
void __OSResetSWInterruptHandler(__OSInterrupt interrupt, OSContext* context) {
OSResetCallback callback;
HoldDown = __OSGetSystemTime();
while (__OSGetSystemTime() - HoldDown < OSMicrosecondsToTicks(100) &&
!(__PIRegs[0] & 0x00010000)) {
;
}
if (!(__PIRegs[0] & 0x00010000)) {
LastState = Down = TRUE;
__OSMaskInterrupts(OS_INTERRUPTMASK_PI_RSW);
if (ResetCallback) {
callback = ResetCallback;
ResetCallback = NULL;
callback();
}
}
__PIRegs[0] = 2;
}
#ifdef FULL_FRANK
BOOL OSGetResetButtonState(void) {
BOOL enabled;
BOOL state;
u32 reg;
OSTime now;
enabled = OSDisableInterrupts();
now = __OSGetSystemTime();
reg = __PIRegs[0];
if (!(reg & 0x00010000)) {
if (!Down) {
Down = TRUE;
state = HoldUp ? TRUE : FALSE;
HoldDown = now;
} else {
state = (HoldUp || (OSMicrosecondsToTicks(100) < now - HoldDown)) ? TRUE : FALSE;
}
} else if (Down) {
Down = FALSE;
state = LastState;
if (state) {
HoldUp = now;
} else {
HoldUp = 0;
}
} else if (HoldUp && (now - HoldUp < OSMillisecondsToTicks(40))) {
state = TRUE;
} else {
state = FALSE;
HoldUp = 0;
}
LastState = state;
if (GameChoice & 0x3f) {
OSTime fire = (GameChoice & 0x3f) * 60;
fire = __OSStartTime + OSSecondsToTicks(fire);
if (fire < now) {
now -= fire;
now = OSTicksToSeconds(now) / 2;
if ((now & 1) == 0) {
state = TRUE;
} else {
state = FALSE;
}
}
}
OSRestoreInterrupts(enabled);
return state;
}
#else
extern void __div2i(void);
#pragma push
#pragma optimization_level
#pragma optimizewithasm off
asm BOOL OSGetResetButtonState(void) {
nofralloc
mflr r0
stw r0, 4(r1)
stwu r1, -0x18(r1)
stw r31, 0x14(r1)
stw r30, 0x10(r1)
stw r29, 0xc(r1)
bl OSDisableInterrupts
mr r30, r3
bl __OSGetSystemTime
lis r5, __PIRegs@ha
lwz r0, __PIRegs@l(r5)
rlwinm. r0, r0, 0, 0xf, 0xf
bne lbl_8038369C
lwz r0, Down
cmpwi r0, 0
bne lbl_8038360C
lwz r0, HoldUp
li r6, 0
lwz r5, HoldUp+4
li r7, 1
xor r0, r0, r6
xor r5, r5, r6
stw r7, Down
or. r0, r5, r0
beq lbl_803835F8
b lbl_803835FC
lbl_803835F8:
mr r7, r6
lbl_803835FC:
stw r4, HoldDown+4
mr r29, r7
stw r3, HoldDown
b lbl_80383750
lbl_8038360C:
lwz r0, HoldUp
li r9, 0
lwz r5, HoldUp+4
li r10, 1
xor r0, r0, r9
xor r5, r5, r9
or. r0, r5, r0
bne lbl_80383680
lis r6, __OSBusClock@ha
lwz r5, HoldDown+4
lwz r7, __OSBusClock@l(r6)
lis r6, 0x431BDE83@ha
addi r8, r6, 0x431BDE83@l
lwz r0, HoldDown
srwi r6, r7, 2
mulhwu r6, r8, r6
srwi r6, r6, 0xf
mulli r6, r6, 0x64
subfc r7, r5, r4
subfe r0, r0, r3
srwi r8, r6, 3
xoris r5, r0, 0x8000
xoris r6, r9, 0x8000
subfc r0, r7, r8
subfe r5, r5, r6
subfe r5, r6, r6
neg. r5, r5
bne lbl_80383680
mr r10, r9
lbl_80383680:
cmpwi r10, 0
beq lbl_80383690
li r0, 1
b lbl_80383694
lbl_80383690:
li r0, 0
lbl_80383694:
mr r29, r0
b lbl_80383750
lbl_8038369C:
lwz r0, Down
cmpwi r0, 0
beq lbl_803836D8
lwz r5, LastState
li r0, 0
stw r0, Down
cmpwi r5, 0
addi r29, r5, 0
beq lbl_803836CC
stw r4, HoldUp+4
stw r3, HoldUp
b lbl_80383750
lbl_803836CC:
stw r0, HoldUp+4
stw r0, HoldUp
b lbl_80383750
lbl_803836D8:
lwz r6, HoldUp
li r8, 0
lwz r7, HoldUp+4
xor r0, r6, r8
xor r5, r7, r8
or. r0, r5, r0
beq lbl_80383740
lis r5, __OSBusClock@ha
lwz r0, __OSBusClock@l(r5)
lis r5, 0x10624DD3@ha
addi r5, r5, 0x10624DD3@l
srwi r0, r0, 2
mulhwu r0, r5, r0
srwi r0, r0, 6
mulli r0, r0, 0x28
subfc r7, r7, r4
subfe r5, r6, r3
xoris r6, r5, 0x8000
xoris r5, r8, 0x8000
subfc r0, r0, r7
subfe r5, r5, r6
subfe r5, r6, r6
neg. r5, r5
beq lbl_80383740
li r29, 1
b lbl_80383750
lbl_80383740:
li r0, 0
stw r0, HoldUp+4
li r29, 0
stw r0, HoldUp
lbl_80383750:
lis r5, GameChoice@ha
stw r29, LastState
lbz r0, GameChoice@l(r5)
clrlwi. r0, r0, 0x1a
beq lbl_80383800
mulli r10, r0, 0x3c
lwz r0, 0xf8(r5)
lwz r9, __OSStartTime+4
lwz r8, __OSStartTime
srwi r6, r0, 2
srawi r0, r10, 0x1f
mullw r7, r0, r6
mulhwu r0, r10, r6
mullw r5, r10, r6
addc r9, r9, r5
li r31, 0
add r7, r7, r0
mullw r0, r10, r31
add r0, r7, r0
adde r8, r8, r0
xoris r7, r8, 0x8000
xoris r5, r3, 0x8000
subfc r0, r4, r9
subfe r5, r5, r7
subfe r5, r7, r7
neg. r5, r5
beq lbl_80383800
subfc r4, r9, r4
subfe r3, r8, r3
li r5, 0
bl __div2i
li r5, 0
li r6, 2
bl __div2i
li r0, 1
and r4, r4, r0
and r0, r3, r31
xor r3, r4, r31
xor r0, r0, r31
or. r0, r3, r0
bne lbl_803837FC
li r29, 1
b lbl_80383800
lbl_803837FC:
li r29, 0
lbl_80383800:
mr r3, r30
bl OSRestoreInterrupts
mr r3, r29
lwz r0, 0x1c(r1)
lwz r31, 0x14(r1)
lwz r30, 0x10(r1)
lwz r29, 0xc(r1)
addi r1, r1, 0x18
mtlr r0
blr
}
#pragma pop
#endif