Match and link OSResetSW

This commit is contained in:
Phillip Stephens 2022-12-22 15:11:03 -08:00
parent 91462f47d1
commit dd742bcc8c
5 changed files with 348 additions and 49 deletions

View File

@ -2,27 +2,22 @@
.section .sbss
.balign 8
.global lbl_805A9900
lbl_805A9900:
.global ResetCallback
ResetCallback:
.skip 0x4
.global lbl_805A9904
lbl_805A9904:
.global Down
Down:
.skip 0x4
.global lbl_805A9908
lbl_805A9908:
.global LastState
LastState:
.skip 0x4
.skip 0x4
.global HoldUp
HoldUp:
.skip 0x8
.global HoldDown
HoldDown:
.skip 0x8
.global lbl_805A9910
lbl_805A9910:
.skip 0x4
.global lbl_805A9914
lbl_805A9914:
.skip 0x4
.global lbl_805A9918
lbl_805A9918:
.skip 0x4
.global lbl_805A991C
lbl_805A991C:
.skip 0x4
.section .text, "ax"
@ -37,11 +32,11 @@ __OSResetSWInterruptHandler:
/* 803834B0 00380410 93 A1 00 1C */ stw r29, 0x1c(r1)
/* 803834B4 00380414 48 00 1F 15 */ bl __OSGetSystemTime
/* 803834B8 00380418 3C A0 80 00 */ lis r5, 0x800000F8@ha
/* 803834BC 0038041C 90 8D AD 5C */ stw r4, lbl_805A991C@sda21(r13)
/* 803834BC 0038041C 90 8D AD 5C */ stw r4, HoldDown+4@sda21(r13)
/* 803834C0 00380420 80 05 00 F8 */ lwz r0, 0x800000F8@l(r5)
/* 803834C4 00380424 3C 80 43 1C */ lis r4, 0x431BDE83@ha
/* 803834C8 00380428 38 84 DE 83 */ addi r4, r4, 0x431BDE83@l
/* 803834CC 0038042C 90 6D AD 58 */ stw r3, lbl_805A9918@sda21(r13)
/* 803834CC 0038042C 90 6D AD 58 */ stw r3, HoldDown@sda21(r13)
/* 803834D0 00380430 54 00 F0 BE */ srwi r0, r0, 2
/* 803834D4 00380434 7C 04 00 16 */ mulhwu r0, r4, r0
/* 803834D8 00380438 54 00 8B FE */ srwi r0, r0, 0xf
@ -51,9 +46,9 @@ __OSResetSWInterruptHandler:
/* 803834E8 00380448 3F E0 CC 00 */ lis r31, 0xcc00
lbl_803834EC:
/* 803834EC 0038044C 48 00 1E DD */ bl __OSGetSystemTime
/* 803834F0 00380450 80 CD AD 5C */ lwz r6, lbl_805A991C@sda21(r13)
/* 803834F0 00380450 80 CD AD 5C */ lwz r6, HoldDown+4@sda21(r13)
/* 803834F4 00380454 6F C5 80 00 */ xoris r5, r30, 0x8000
/* 803834F8 00380458 80 0D AD 58 */ lwz r0, lbl_805A9918@sda21(r13)
/* 803834F8 00380458 80 0D AD 58 */ lwz r0, HoldDown@sda21(r13)
/* 803834FC 0038045C 7C 86 20 10 */ subfc r4, r6, r4
/* 80383500 00380460 7C 00 19 10 */ subfe r0, r0, r3
/* 80383504 00380464 6C 03 80 00 */ xoris r3, r0, 0x8000
@ -71,16 +66,16 @@ lbl_80383528:
/* 80383530 00380490 54 00 03 DF */ rlwinm. r0, r0, 0, 0xf, 0xf
/* 80383534 00380494 40 82 00 34 */ bne lbl_80383568
/* 80383538 00380498 38 00 00 01 */ li r0, 1
/* 8038353C 0038049C 90 0D AD 44 */ stw r0, lbl_805A9904@sda21(r13)
/* 8038353C 0038049C 90 0D AD 44 */ stw r0, Down@sda21(r13)
/* 80383540 003804A0 38 60 02 00 */ li r3, 0x200
/* 80383544 003804A4 90 0D AD 48 */ stw r0, lbl_805A9908@sda21(r13)
/* 80383544 003804A4 90 0D AD 48 */ stw r0, LastState@sda21(r13)
/* 80383548 003804A8 4B FF E4 E1 */ bl __OSMaskInterrupts
/* 8038354C 003804AC 81 8D AD 40 */ lwz r12, lbl_805A9900@sda21(r13)
/* 8038354C 003804AC 81 8D AD 40 */ lwz r12, ResetCallback@sda21(r13)
/* 80383550 003804B0 28 0C 00 00 */ cmplwi r12, 0
/* 80383554 003804B4 41 82 00 14 */ beq lbl_80383568
/* 80383558 003804B8 38 00 00 00 */ li r0, 0
/* 8038355C 003804BC 7D 88 03 A6 */ mtlr r12
/* 80383560 003804C0 90 0D AD 40 */ stw r0, lbl_805A9900@sda21(r13)
/* 80383560 003804C0 90 0D AD 40 */ stw r0, ResetCallback@sda21(r13)
/* 80383564 003804C4 4E 80 00 21 */ blrl
lbl_80383568:
/* 80383568 003804C8 38 00 00 02 */ li r0, 2
@ -109,41 +104,41 @@ OSGetResetButtonState:
/* 803835B8 00380518 80 05 30 00 */ lwz r0, 0xCC003000@l(r5)
/* 803835BC 0038051C 54 00 03 DF */ rlwinm. r0, r0, 0, 0xf, 0xf
/* 803835C0 00380520 40 82 00 DC */ bne lbl_8038369C
/* 803835C4 00380524 80 0D AD 44 */ lwz r0, lbl_805A9904@sda21(r13)
/* 803835C4 00380524 80 0D AD 44 */ lwz r0, Down@sda21(r13)
/* 803835C8 00380528 2C 00 00 00 */ cmpwi r0, 0
/* 803835CC 0038052C 40 82 00 40 */ bne lbl_8038360C
/* 803835D0 00380530 80 0D AD 50 */ lwz r0, lbl_805A9910@sda21(r13)
/* 803835D0 00380530 80 0D AD 50 */ lwz r0, HoldUp@sda21(r13)
/* 803835D4 00380534 38 C0 00 00 */ li r6, 0
/* 803835D8 00380538 80 AD AD 54 */ lwz r5, lbl_805A9914@sda21(r13)
/* 803835D8 00380538 80 AD AD 54 */ lwz r5, HoldUp+4@sda21(r13)
/* 803835DC 0038053C 38 E0 00 01 */ li r7, 1
/* 803835E0 00380540 7C 00 32 78 */ xor r0, r0, r6
/* 803835E4 00380544 7C A5 32 78 */ xor r5, r5, r6
/* 803835E8 00380548 90 ED AD 44 */ stw r7, lbl_805A9904@sda21(r13)
/* 803835E8 00380548 90 ED AD 44 */ stw r7, Down@sda21(r13)
/* 803835EC 0038054C 7C A0 03 79 */ or. r0, r5, r0
/* 803835F0 00380550 41 82 00 08 */ beq lbl_803835F8
/* 803835F4 00380554 48 00 00 08 */ b lbl_803835FC
lbl_803835F8:
/* 803835F8 00380558 7C C7 33 78 */ mr r7, r6
lbl_803835FC:
/* 803835FC 0038055C 90 8D AD 5C */ stw r4, lbl_805A991C@sda21(r13)
/* 803835FC 0038055C 90 8D AD 5C */ stw r4, HoldDown+4@sda21(r13)
/* 80383600 00380560 7C FD 3B 78 */ mr r29, r7
/* 80383604 00380564 90 6D AD 58 */ stw r3, lbl_805A9918@sda21(r13)
/* 80383604 00380564 90 6D AD 58 */ stw r3, HoldDown@sda21(r13)
/* 80383608 00380568 48 00 01 48 */ b lbl_80383750
lbl_8038360C:
/* 8038360C 0038056C 80 0D AD 50 */ lwz r0, lbl_805A9910@sda21(r13)
/* 8038360C 0038056C 80 0D AD 50 */ lwz r0, HoldUp@sda21(r13)
/* 80383610 00380570 39 20 00 00 */ li r9, 0
/* 80383614 00380574 80 AD AD 54 */ lwz r5, lbl_805A9914@sda21(r13)
/* 80383614 00380574 80 AD AD 54 */ lwz r5, HoldUp+4@sda21(r13)
/* 80383618 00380578 39 40 00 01 */ li r10, 1
/* 8038361C 0038057C 7C 00 4A 78 */ xor r0, r0, r9
/* 80383620 00380580 7C A5 4A 78 */ xor r5, r5, r9
/* 80383624 00380584 7C A0 03 79 */ or. r0, r5, r0
/* 80383628 00380588 40 82 00 58 */ bne lbl_80383680
/* 8038362C 0038058C 3C C0 80 00 */ lis r6, 0x800000F8@ha
/* 80383630 00380590 80 AD AD 5C */ lwz r5, lbl_805A991C@sda21(r13)
/* 80383630 00380590 80 AD AD 5C */ lwz r5, HoldDown+4@sda21(r13)
/* 80383634 00380594 80 E6 00 F8 */ lwz r7, 0x800000F8@l(r6)
/* 80383638 00380598 3C C0 43 1C */ lis r6, 0x431BDE83@ha
/* 8038363C 0038059C 39 06 DE 83 */ addi r8, r6, 0x431BDE83@l
/* 80383640 003805A0 80 0D AD 58 */ lwz r0, lbl_805A9918@sda21(r13)
/* 80383640 003805A0 80 0D AD 58 */ lwz r0, HoldDown@sda21(r13)
/* 80383644 003805A4 54 E6 F0 BE */ srwi r6, r7, 2
/* 80383648 003805A8 7C C8 30 16 */ mulhwu r6, r8, r6
/* 8038364C 003805AC 54 C6 8B FE */ srwi r6, r6, 0xf
@ -170,26 +165,26 @@ lbl_80383694:
/* 80383694 003805F4 7C 1D 03 78 */ mr r29, r0
/* 80383698 003805F8 48 00 00 B8 */ b lbl_80383750
lbl_8038369C:
/* 8038369C 003805FC 80 0D AD 44 */ lwz r0, lbl_805A9904@sda21(r13)
/* 8038369C 003805FC 80 0D AD 44 */ lwz r0, Down@sda21(r13)
/* 803836A0 00380600 2C 00 00 00 */ cmpwi r0, 0
/* 803836A4 00380604 41 82 00 34 */ beq lbl_803836D8
/* 803836A8 00380608 80 AD AD 48 */ lwz r5, lbl_805A9908@sda21(r13)
/* 803836A8 00380608 80 AD AD 48 */ lwz r5, LastState@sda21(r13)
/* 803836AC 0038060C 38 00 00 00 */ li r0, 0
/* 803836B0 00380610 90 0D AD 44 */ stw r0, lbl_805A9904@sda21(r13)
/* 803836B0 00380610 90 0D AD 44 */ stw r0, Down@sda21(r13)
/* 803836B4 00380614 2C 05 00 00 */ cmpwi r5, 0
/* 803836B8 00380618 3B A5 00 00 */ addi r29, r5, 0
/* 803836BC 0038061C 41 82 00 10 */ beq lbl_803836CC
/* 803836C0 00380620 90 8D AD 54 */ stw r4, lbl_805A9914@sda21(r13)
/* 803836C4 00380624 90 6D AD 50 */ stw r3, lbl_805A9910@sda21(r13)
/* 803836C0 00380620 90 8D AD 54 */ stw r4, HoldUp+4@sda21(r13)
/* 803836C4 00380624 90 6D AD 50 */ stw r3, HoldUp@sda21(r13)
/* 803836C8 00380628 48 00 00 88 */ b lbl_80383750
lbl_803836CC:
/* 803836CC 0038062C 90 0D AD 54 */ stw r0, lbl_805A9914@sda21(r13)
/* 803836D0 00380630 90 0D AD 50 */ stw r0, lbl_805A9910@sda21(r13)
/* 803836CC 0038062C 90 0D AD 54 */ stw r0, HoldUp+4@sda21(r13)
/* 803836D0 00380630 90 0D AD 50 */ stw r0, HoldUp@sda21(r13)
/* 803836D4 00380634 48 00 00 7C */ b lbl_80383750
lbl_803836D8:
/* 803836D8 00380638 80 CD AD 50 */ lwz r6, lbl_805A9910@sda21(r13)
/* 803836D8 00380638 80 CD AD 50 */ lwz r6, HoldUp@sda21(r13)
/* 803836DC 0038063C 39 00 00 00 */ li r8, 0
/* 803836E0 00380640 80 ED AD 54 */ lwz r7, lbl_805A9914@sda21(r13)
/* 803836E0 00380640 80 ED AD 54 */ lwz r7, HoldUp+4@sda21(r13)
/* 803836E4 00380644 7C C0 42 78 */ xor r0, r6, r8
/* 803836E8 00380648 7C E5 42 78 */ xor r5, r7, r8
/* 803836EC 0038064C 7C A0 03 79 */ or. r0, r5, r0
@ -215,12 +210,12 @@ lbl_803836D8:
/* 8038373C 0038069C 48 00 00 14 */ b lbl_80383750
lbl_80383740:
/* 80383740 003806A0 38 00 00 00 */ li r0, 0
/* 80383744 003806A4 90 0D AD 54 */ stw r0, lbl_805A9914@sda21(r13)
/* 80383744 003806A4 90 0D AD 54 */ stw r0, HoldUp+4@sda21(r13)
/* 80383748 003806A8 3B A0 00 00 */ li r29, 0
/* 8038374C 003806AC 90 0D AD 50 */ stw r0, lbl_805A9910@sda21(r13)
/* 8038374C 003806AC 90 0D AD 50 */ stw r0, HoldUp@sda21(r13)
lbl_80383750:
/* 80383750 003806B0 3C A0 80 00 */ lis r5, 0x800030E3@ha
/* 80383754 003806B4 93 AD AD 48 */ stw r29, lbl_805A9908@sda21(r13)
/* 80383754 003806B4 93 AD AD 48 */ stw r29, LastState@sda21(r13)
/* 80383758 003806B8 88 05 30 E3 */ lbz r0, 0x800030E3@l(r5)
/* 8038375C 003806BC 54 00 06 BF */ clrlwi. r0, r0, 0x1a
/* 80383760 003806C0 41 82 00 A0 */ beq lbl_80383800

View File

@ -820,7 +820,7 @@ LIBS = [
["Dolphin/os/OSMutex", True],
"Dolphin/os/OSReboot",
["Dolphin/os/OSReset", True],
"Dolphin/os/OSResetSW",
["Dolphin/os/OSResetSW", True],
["Dolphin/os/OSRtc", True],
["Dolphin/os/OSSync", True],
["Dolphin/os/OSThread", True],

View File

@ -164,6 +164,7 @@ void OSFatal(GXColor fg, GXColor bg, const char* msg);
#include <dolphin/os/OSModule.h>
#include <dolphin/os/OSMutex.h>
#include <dolphin/os/OSReset.h>
#include <dolphin/os/OSResetSW.h>
#include <dolphin/os/OSSerial.h>
#include <dolphin/os/OSThread.h>
#endif // _DOLPHIN_OS

View File

@ -0,0 +1,22 @@
#ifndef _DOLPHIN_OSRESETSW
#define _DOLPHIN_OSRESETSW
#include <dolphin/os/OSContext.h>
#include <dolphin/types.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*OSResetCallback)(void);
BOOL OSGetResetButtonState(void);
BOOL OSGetResetSwitchState(void);
OSResetCallback OSSetResetCallback(OSResetCallback callback);
#ifdef __cplusplus
}
#endif
#endif // _DOLPHIN_OSRESETSW

281
src/Dolphin/os/OSResetSW.c Normal file
View File

@ -0,0 +1,281 @@
#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;
}
#if NONMATCHING
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);
/* clang-format off */
#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
/* clang-format on */
#endif