From 2d138c60bd7eb30ab8c8e9bbc077bc458677505b Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sat, 15 Oct 2022 17:58:24 -0700 Subject: [PATCH] Match and link GBA.c Former-commit-id: 024fb634e9c7da9697b9df50fbbc4be6ba1b5b57 --- .vscode/settings.json | 4 +- Makefile | 2 + asm/Dolphin/GBA/GBA.s | 14 ++--- configure.py | 2 +- include/dolphin/GBAPriv.h | 59 +++++++++++++++++++++ obj_files.mk | 4 +- src/Dolphin/GBA/GBA.c | 109 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 include/dolphin/GBAPriv.h create mode 100644 src/Dolphin/GBA/GBA.c diff --git a/.vscode/settings.json b/.vscode/settings.json index b5aac4f3..57b359fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,7 +15,9 @@ "errno.h": "c", "ansi_files.h": "c", "types.h": "c", - "gba.h": "c" + "gba.h": "c", + "gbapriv.h": "c", + "os.h": "c" }, "files.autoSave": "onFocusChange", "files.insertFinalNewline": true, diff --git a/Makefile b/Makefile index a394a9d9..f97732f6 100644 --- a/Makefile +++ b/Makefile @@ -153,6 +153,8 @@ $(SI_FILES): MWCC_VERSION := 1.2.5 $(SI_FILES): CFLAGS := $(CFLAGS_BASE) $(DB_FILES): MWCC_VERSION := 1.2.5 $(DB_FILES): CFLAGS := $(CFLAGS_BASE) +$(GBA_FILES): MWCC_VERSION := 1.2.5 +$(GBA_FILES): CFLAGS := $(CFLAGS_BASE) #------------------------------------------------------------------------------- # Recipes diff --git a/asm/Dolphin/GBA/GBA.s b/asm/Dolphin/GBA/GBA.s index ed90915f..5cef974d 100644 --- a/asm/Dolphin/GBA/GBA.s +++ b/asm/Dolphin/GBA/GBA.s @@ -3,8 +3,8 @@ .section .bss .balign 8 -.global lbl_8056A0A0 -lbl_8056A0A0: +.global SecParams +SecParams: .skip 0x100 .global __GBA __GBA: @@ -19,7 +19,7 @@ __GBAReset: .section .data, "wa" .balign 8 -lbl_803F7160: +ResetFunctionInfo: .4byte OnReset .4byte 127 .4byte 0 @@ -71,8 +71,8 @@ GBAInit: /* 803C9680 003C65E0 7C 03 00 16 */ mulhwu r0, r3, r0 /* 803C9684 003C65E4 54 00 8B FE */ srwi r0, r0, 0xf /* 803C9688 003C65E8 1C 00 00 3C */ mulli r0, r0, 0x3c -/* 803C968C 003C65EC 3C 60 80 57 */ lis r3, lbl_8056A0A0@ha -/* 803C9690 003C65F0 3B 83 A0 A0 */ addi r28, r3, lbl_8056A0A0@l +/* 803C968C 003C65EC 3C 60 80 57 */ lis r3, SecParams@ha +/* 803C9690 003C65F0 3B 83 A0 A0 */ addi r28, r3, SecParams@l /* 803C9694 003C65F4 54 1E E8 FE */ srwi r30, r0, 3 lbl_803C9698: /* 803C9698 003C65F8 93 DD 00 34 */ stw r30, 0x34(r29) @@ -88,9 +88,9 @@ lbl_803C9698: /* 803C96C0 003C6620 4B FB 49 A5 */ bl OSInitAlarm /* 803C96C4 003C6624 4B FA 63 41 */ bl DSPInit /* 803C96C8 003C6628 38 00 00 00 */ li r0, 0 -/* 803C96CC 003C662C 3C 60 80 3F */ lis r3, lbl_803F7160@ha +/* 803C96CC 003C662C 3C 60 80 3F */ lis r3, ResetFunctionInfo@ha /* 803C96D0 003C6630 90 0D B1 58 */ stw r0, __GBAReset@sda21(r13) -/* 803C96D4 003C6634 38 63 71 60 */ addi r3, r3, lbl_803F7160@l +/* 803C96D4 003C6634 38 63 71 60 */ addi r3, r3, ResetFunctionInfo@l /* 803C96D8 003C6638 4B FB 99 55 */ bl OSRegisterResetFunction /* 803C96DC 003C663C BB 61 00 0C */ lmw r27, 0xc(r1) /* 803C96E0 003C6640 80 01 00 24 */ lwz r0, 0x24(r1) diff --git a/configure.py b/configure.py index b4f85b38..e9b66ae0 100755 --- a/configure.py +++ b/configure.py @@ -1010,7 +1010,7 @@ LIBS = [ "mwcc_version": "1.2.5", "cflags": "$cflags_base", "objects": [ - "Dolphin/GBA/GBA", + ["Dolphin/GBA/GBA", True], "Dolphin/GBA/GBAGetProcessStatus", "Dolphin/GBA/GBAJoyBoot", "Dolphin/GBA/GBARead", diff --git a/include/dolphin/GBAPriv.h b/include/dolphin/GBAPriv.h new file mode 100644 index 00000000..6294b83f --- /dev/null +++ b/include/dolphin/GBAPriv.h @@ -0,0 +1,59 @@ +#ifndef _DOLPHIN_GBAPRIV +#define _DOLPHIN_GBAPRIV + +#include "types.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct GBASecParams { + u8 data[0x40]; +} GBASecParams; + +typedef struct GBA { + u8 command; + u8 src[4]; + u8 _05; + u8 _06; + s8 _07; + s8 _08; + s8 _09; + s8 _0a; + s8 _0b; + s32 _0c; + s32 _10; + u8* status; + u8* buffer; + GBACallback callback; + s32 result; + OSThreadQueue thread_queue; + OSTime poll_time; + char data1[0x40u - 0x38u]; + s32 palette_color; + s32 palette_speed; + u8* program; + s32 program_length; + s32 jboot_status; + GBACallback jboot_callback; + char data2[0x74u - 0x58u]; + u8* challenge_cipher; + char data3[0xf8 - 0x78u]; + GBASecParams* param; + char data4[0x100u - 0xfcu]; +} GBA; + + +extern GBA __GBA[4]; +extern BOOL __GBAReset; + +void __GBASyncCallback(s32 chan, s32 ret); +s32 __GBASync(s32 chan); + +#ifdef __cplusplus +} +#endif + +#endif // _DOLPHIN_GBAPRIV diff --git a/obj_files.mk b/obj_files.mk index 7c09728a..156473a8 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -850,7 +850,9 @@ THP_FILES :=\ $(BUILD_DIR)/asm/Dolphin/thp/THPAudio.o GBA_FILES :=\ - $(BUILD_DIR)/asm/Dolphin/GBA/GBA.o\ + $(BUILD_DIR)/src/Dolphin/GBA/GBA.o\ + $(BUILD_DIR)/asm/Dolphin/GBA/GBAGetProcessStatus.o\ + $(BUILD_DIR)/asm/Dolphin/GBA/GBAJoyBoot.o\ $(BUILD_DIR)/asm/Dolphin/GBA/GBARead.o\ $(BUILD_DIR)/asm/Dolphin/GBA/GBAWrite.o\ $(BUILD_DIR)/asm/Dolphin/GBA/GBAXfer.o\ diff --git a/src/Dolphin/GBA/GBA.c b/src/Dolphin/GBA/GBA.c new file mode 100644 index 00000000..6947eefd --- /dev/null +++ b/src/Dolphin/GBA/GBA.c @@ -0,0 +1,109 @@ +#include "dolphin/GBAPriv.h" + +static GBASecParams SecParams[4]; +GBA __GBA[4]; +BOOL __GBAReset = FALSE; + +static BOOL OnReset(BOOL); + +static OSResetFunctionInfo ResetFunctionInfo = { + OnReset, + 127 +}; + +void ShortCommandProc(s32 chan, s32 ret) { + GBA* gba; + gba = &__GBA[chan]; + + if (gba->result != 0) { + return; + } + + if (gba->_05 != 0 || gba->_06 != 4) { + gba->result = 1; + return; + } + + gba->status[0] = gba->_07 & 0x3a; +} + +void GBAInit() { + s32 i; + GBA* gba; + for (i = 0; i < 4; ++i) { + gba = &__GBA[i]; + gba->poll_time = OSMicrosecondsToTicks(60); + OSInitThreadQueue(&gba->thread_queue); + gba->param = &SecParams[i]; + + // ASSERTMSG((u32) gba->param % 32 == 0) + } + + OSInitAlarm(); + DSPInit(); + __GBAReset = FALSE; + + OSRegisterResetFunction(&ResetFunctionInfo); +} + +s32 GBAGetStatusAsync(s32 chan, u8* status, GBACallback callback) { + GBA* gba; + s32 ret; + gba = &__GBA[chan]; + if (gba->callback != NULL) { + ret = 2; + } else { + gba->command = 0; + gba->status = status; + gba->callback = callback; + ret = __GBATransfer(chan, 1, 3, ShortCommandProc); + } + + return ret; +} + + +s32 GBAGetStatus(s32 chan, u8* status) { + s32 ret; + ret = GBAGetStatusAsync(chan, status, __GBASyncCallback); + + if (ret != 0) { + return ret; + } + + return __GBASync(chan); +} + + +s32 GBAResetAsync(s32 chan, u8* status, GBACallback callback) { + GBA* gba; + s32 ret; + gba = &__GBA[chan]; + if (gba->callback != NULL) { + ret = 2; + } else { + gba->command = 0xFF; + gba->status = status; + gba->callback = callback; + ret = __GBATransfer(chan, 1, 3, ShortCommandProc); + } + + return ret; +} + + +s32 GBAReset(s32 chan, u8* status) { + s32 ret; + + ret = GBAResetAsync(chan, status, __GBASyncCallback); + if (ret != 0) { + return ret; + } + + return __GBASync(chan); +} + +BOOL OnReset(BOOL) { + __GBAReset = TRUE; + return TRUE; +}