mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-09-09 19:01:16 -04:00
Implement & link JoyBoot.c
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#ifndef GBAPRIV
|
||||
#define GBAPRIV
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#include "GBA/gba.h"
|
||||
#include "dolphin/os.h"
|
||||
#include "dolphin/dsp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (*GBATransferCallback)(s32 chan);
|
||||
|
||||
typedef struct GBASecParam {
|
||||
u8 readbuf[4];
|
||||
s32 paletteColor;
|
||||
s32 paletteSpeed;
|
||||
s32 length;
|
||||
u32* out;
|
||||
u8 _padding0[12];
|
||||
u32 keyA;
|
||||
s32 keyB;
|
||||
u8 _padding1[24];
|
||||
} GBASecParam;
|
||||
|
||||
typedef struct GBABootInfo {
|
||||
s32 paletteColor;
|
||||
s32 paletteSpeed;
|
||||
u8* programp;
|
||||
s32 length;
|
||||
u8* status;
|
||||
GBACallback callback;
|
||||
u8 readbuf[4];
|
||||
u8 writebuf[4];
|
||||
int i;
|
||||
OSTick start;
|
||||
OSTime begin;
|
||||
int firstXfer;
|
||||
int curOffset;
|
||||
u32 crc;
|
||||
u32 dummyWord[7];
|
||||
u32 keyA;
|
||||
s32 keyB;
|
||||
u32 initialCode;
|
||||
int realLength;
|
||||
} GBABootInfo;
|
||||
|
||||
typedef struct GBAControl {
|
||||
u8 output[5];
|
||||
u8 input[5];
|
||||
s32 outputBytes;
|
||||
s32 inputBytes;
|
||||
u8* status;
|
||||
u8* ptr;
|
||||
GBACallback callback;
|
||||
s32 ret;
|
||||
OSThreadQueue threadQueue;
|
||||
OSTime delay;
|
||||
GBATransferCallback proc;
|
||||
GBABootInfo bootInfo;
|
||||
DSPTaskInfo task;
|
||||
GBASecParam* param;
|
||||
} GBAControl;
|
||||
|
||||
extern GBAControl __GBA[4];
|
||||
extern BOOL __GBAReset;
|
||||
|
||||
void __GBAHandler(s32 chan, u32 error, OSContext* context);
|
||||
void __GBASyncCallback(s32 chan, s32 ret);
|
||||
s32 __GBASync(s32 chan);
|
||||
OSTime __GBASetDelay(s32 chan, OSTime delay);
|
||||
s32 __GBATransfer(s32 chan, s32 w1, s32 w2, GBATransferCallback callback);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,65 @@
|
||||
#ifndef GBA
|
||||
#define GBA
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define GBA_CHAN0 0
|
||||
#define GBA_CHAN1 1
|
||||
#define GBA_CHAN2 2
|
||||
#define GBA_CHAN3 3
|
||||
#define GBA_MAX_CHAN 4
|
||||
|
||||
#define GBA_ALL_KEY_MASK 0x03ff
|
||||
#define GBA_A_BUTTON 0x0001
|
||||
#define GBA_B_BUTTON 0x0002
|
||||
#define GBA_SELECT_BUTTON 0x0004
|
||||
#define GBA_START_BUTTON 0x0008
|
||||
#define GBA_R_KEY 0x0010
|
||||
#define GBA_L_KEY 0x0020
|
||||
#define GBA_U_KEY 0x0040
|
||||
#define GBA_D_KEY 0x0080
|
||||
#define GBA_R_BUTTON 0x0100
|
||||
#define GBA_L_BUTTON 0x0200
|
||||
|
||||
#define GBA_JSTAT_MASK 0x3a
|
||||
#define GBA_JSTAT_FLAGS_SHIFT 4
|
||||
#define GBA_JSTAT_FLAGS_MASK 0x30
|
||||
#define GBA_JSTAT_PSF1 0x20
|
||||
#define GBA_JSTAT_PSF0 0x10
|
||||
#define GBA_JSTAT_SEND 0x08
|
||||
#define GBA_JSTAT_RECV 0x02
|
||||
|
||||
#define GBA_READY 0
|
||||
#define GBA_NOT_READY 1
|
||||
#define GBA_BUSY 2
|
||||
#define GBA_JOYBOOT_UNKNOWN_STATE 3
|
||||
#define GBA_JOYBOOT_ERR_INVALID 4
|
||||
|
||||
#define GBA_JOYBOOT_PROGRAM_SIZE_MAX 0x40000
|
||||
|
||||
#define GBA_JOYBOOT_BOOTPARAM_OFFSET 0xc8
|
||||
#define GBA_JOYBOOT_BOOTPARAM_SIZE 0x18
|
||||
typedef void (*GBACallback)(s32 chan, s32 ret);
|
||||
void GBAInit(void);
|
||||
s32 GBAGetStatus(s32 chan, u8* status);
|
||||
s32 GBAGetStatusAsync(s32 chan, u8* status, GBACallback callback);
|
||||
s32 GBAReset(s32 chan, u8* status);
|
||||
s32 GBAResetAsync(s32 chan, u8* status, GBACallback callback);
|
||||
s32 GBAGetProcessStatus(s32 chan, u8* percentp);
|
||||
s32 GBARead(s32 chan, u8* dst, u8* status);
|
||||
s32 GBAReadAsync(s32 chan, u8* dst, u8* status, GBACallback callback);
|
||||
s32 GBAWrite(s32 chan, u8* src, u8* status);
|
||||
s32 GBAWriteAsync(s32 chan, u8* src, u8* status, GBACallback callback);
|
||||
s32 GBAJoyBoot(s32 chan, s32 palette_color, s32 palette_speed, u8* programp, s32 length,
|
||||
u8* status);
|
||||
s32 GBAJoyBootAsync(s32 chan, s32 palette_color, s32 palette_speed, u8* programp, s32 length,
|
||||
u8* status, GBACallback callback);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,126 @@
|
||||
#ifndef GBA2_H
|
||||
#define GBA2_H
|
||||
|
||||
#include "types.h"
|
||||
#include "GBA/gba.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define EAPPLI_LOAD_PROG_MAGIC 'PSAE'
|
||||
#define EAPPLI_PROGRAM_CHECK_MAGIC_GC 'GAFJ'
|
||||
#define EAPPLI_PROGRAM_CHECK_MAGIC_GBA 'AAFJ'
|
||||
|
||||
#define GBA2_GBA_STATE_ERROR -1
|
||||
#define GBA2_GBA_STATE_ALREADY_EXIST 0
|
||||
#define GBA2_GBA_STATE_SUCCESS 1
|
||||
#define GBA2_GBA_STATE_TRANSMITTING 9
|
||||
|
||||
#define GBA2_EAPPLI_TRANSMITTING -1
|
||||
#define GBA2_EAPPLI_SUCCESS 0
|
||||
#define GBA2_EAPPLI_FAILURE_XFER_ERROR 1
|
||||
#define GBA2_EAPPLI_FAILURE_NO_GBA 2
|
||||
|
||||
#define GBA2_SEND_RECV_TRIES 7
|
||||
#define GBA2_CONNECTED_TRIES 45
|
||||
#define GBA2_DEFAULT_TRIES 120
|
||||
#define GBA2_READ_TRIES 1200
|
||||
|
||||
enum eappli_type {
|
||||
GBA2_EAPPLI_TYPE_NEEDLEWORK, /* Able Sisters' design program */
|
||||
GBA2_EAPPLI_TYPE_MUSICSCORE, /* Town tune editor program */
|
||||
GBA2_EAPPLI_TYPE_PTERMINAL, /* e-Card scanning program */
|
||||
|
||||
GBA2_EAPPLI_TYPE_NUM
|
||||
};
|
||||
|
||||
enum send_eappli_state {
|
||||
SEND_EAPPLI_STATE_WAIT_FOR_GBA, /* GC awaits load magic (PSAE) from GBA */
|
||||
SEND_EAPPLI_STATE_GC_ACKNOWLEDGE_TO_GBA, /* GC sends load magic (PSAE) back to GBA to acknowledge it is there */
|
||||
SEND_EAPPLI_STATE_2, /* skipped/unused state */
|
||||
SEND_EAPPLI_STATE_GC_SEND_EAPPLI_SIZE_TO_GBA, /* GC sends eAppli program data size to GBA */
|
||||
SEND_EAPPLI_STATE_WAIT_FOR_GBA_ACKNOWLEDGED_EAPPLI_SIZE, /* GC awaits GBA is ready for eAppli data */
|
||||
SEND_EAPPLI_STATE_GC_SEND_EAPPLI_DATA_TO_GBA, /* GC sends eAppli data to GBA */
|
||||
SEND_EAPPLI_STATE_GC_OPEN_JOY_SIO_CONNECTION, /* GC attempts to open connection with GBA eAppli program */
|
||||
SEND_EAPPLI_STATE_JOY_SIO_CONNECTION_OPEN /* GC <-> GBA connection is open */
|
||||
};
|
||||
|
||||
enum send_eappli_status {
|
||||
SEND_EAPPLI_STATUS_SUCCESS, /* Program successfully sent & loaded */
|
||||
SEND_EAPPLI_STATUS_FAILED_GBA_NOT_DETECTED, /* GBA was not detected during first stage */
|
||||
SEND_EAPPLI_STATUS_FAILED_TRANSMISSION_ERROR, /* Transmission error occurred */
|
||||
SEND_EAPPLI_STATUS_SENDING /* Transmission is in progress */
|
||||
};
|
||||
|
||||
#define GBA2_MAKE_ACKNOWLEDGE_CODE(dev, state) (0xFFFE0000 | ((dev) << 8) | (state))
|
||||
|
||||
enum gba_gc_device {
|
||||
GBA2_DEVICE_NONE,
|
||||
GBA2_DEVICE_GC,
|
||||
GBA2_DEVICE_GBA
|
||||
};
|
||||
|
||||
enum gba_gc_command {
|
||||
GBA2_CMD_CHECK_STATE = 1,
|
||||
GBA2_CMD_WRITE = 2,
|
||||
GBA2_CMD_START_RECV = 4,
|
||||
GBA2_CMD_VALID_CHKSUM = 6,
|
||||
GBA2_CMD_INVALID_CHKSUM = 7,
|
||||
GBA2_CMD_READY_FOR_XFER = 8,
|
||||
GBA2_CMD_XFER_START = 9,
|
||||
GBA2_CMD_XFER_FINISHED = 10,
|
||||
};
|
||||
|
||||
typedef struct gba2_joywork_s {
|
||||
int unused0;
|
||||
|
||||
u32 packet_block_checksum;
|
||||
u32 total_xfer_checksum;
|
||||
int packets_processed;
|
||||
int readwrite_ofs;
|
||||
|
||||
int unused14;
|
||||
|
||||
int cmd_attempts;
|
||||
|
||||
u8 unused1C;
|
||||
|
||||
u8 checksum_valid;
|
||||
u8 checksum_invalid;
|
||||
|
||||
u8 unused1F;
|
||||
|
||||
u8 status;
|
||||
u8 cmd_stage;
|
||||
u8 recv_state;
|
||||
u8 send_state;
|
||||
|
||||
u8 port_connection_states[GBA_MAX_CHAN];
|
||||
|
||||
u8 scan_state;
|
||||
u8 gba_awaiting_ack;
|
||||
|
||||
int recv_wait;
|
||||
} Joy_wrk_c;
|
||||
|
||||
extern int Port;
|
||||
|
||||
extern void mGcgba_Init();
|
||||
extern void mGcgba_InitVar();
|
||||
extern void mGcgba_EndComm();
|
||||
extern int mGcgba_ConnectEnabled();
|
||||
extern int mGcgba_Boot(u8* data_buf, size_t buf_size);
|
||||
extern int mGcgba_IsEditor();
|
||||
extern int mGcgba_IsIsland();
|
||||
extern int mGcgba_Recv(u8* recv_bufp, size_t recv_buf_size);
|
||||
extern int mGcgba_Read(u8* read_buf, size_t read_buf_size, u8 prog_type);
|
||||
extern int mGcgba_CheckRecv(u8* recv_bufp, size_t recv_buf_size);
|
||||
extern int mGcgba_Send(u8* send_bufp, size_t send_buf_size);
|
||||
extern int mGcgba_send_eAppri(u8* eappli_p, size_t eappli_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,70 @@
|
||||
#ifndef DSP_H
|
||||
#define DSP_H
|
||||
|
||||
#include "types.h"
|
||||
#include "dolphin/os/OSTime.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DSP_TASK_FLAG_CLEARALL 0x00000000
|
||||
#define DSP_TASK_FLAG_ATTACHED 0x00000001
|
||||
#define DSP_TASK_FLAG_CANCEL 0x00000002
|
||||
|
||||
#define DSP_TASK_STATE_INIT 0
|
||||
#define DSP_TASK_STATE_RUN 1
|
||||
#define DSP_TASK_STATE_YIELD 2
|
||||
#define DSP_TASK_STATE_DONE 3
|
||||
|
||||
typedef void (*DSPCallback)(void* task);
|
||||
|
||||
typedef struct STRUCT_DSP_TASK {
|
||||
vu32 state;
|
||||
vu32 priority;
|
||||
vu32 flags;
|
||||
u16* iram_mmem_addr;
|
||||
u32 iram_length;
|
||||
u32 iram_addr;
|
||||
|
||||
u16* dram_mmem_addr;
|
||||
u32 dram_length;
|
||||
u32 dram_addr;
|
||||
|
||||
u16 dsp_init_vector;
|
||||
u16 dsp_resume_vector;
|
||||
|
||||
DSPCallback init_cb;
|
||||
DSPCallback res_cb;
|
||||
DSPCallback done_cb;
|
||||
DSPCallback req_cb;
|
||||
|
||||
struct STRUCT_DSP_TASK* next;
|
||||
struct STRUCT_DSP_TASK* prev;
|
||||
|
||||
OSTime t_context;
|
||||
OSTime t_task;
|
||||
|
||||
} DSPTaskInfo;
|
||||
|
||||
void DSPInit();
|
||||
void DSPReset();
|
||||
void DSPHalt();
|
||||
void DSPSendMailToDSP(u32 mail);
|
||||
u32 DSPCheckMailToDSP();
|
||||
u32 DSPCheckMailFromDSP();
|
||||
u32 DSPGetDMAStatus();
|
||||
|
||||
DSPTaskInfo* DSPAddTask(DSPTaskInfo* task);
|
||||
|
||||
void __DSP_exec_task(DSPTaskInfo* curr, DSPTaskInfo* next);
|
||||
void __DSP_boot_task(DSPTaskInfo* task);
|
||||
void __DSP_remove_task(DSPTaskInfo* task);
|
||||
void __DSP_add_task(DSPTaskInfo* task);
|
||||
void __DSP_debug_printf(const char* fmt, ...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -13,6 +13,19 @@ extern "C" {
|
||||
#define OS_RESET_HOTRESET 1 /* Soft reset */
|
||||
#define OS_RESET_SHUTDOWN 2
|
||||
|
||||
typedef BOOL (*OSResetFunction)(BOOL final);
|
||||
typedef struct OSResetFunctionInfo OSResetFunctionInfo;
|
||||
|
||||
struct OSResetFunctionInfo {
|
||||
// public
|
||||
OSResetFunction func;
|
||||
u32 priority;
|
||||
|
||||
// private
|
||||
OSResetFunctionInfo* next;
|
||||
OSResetFunctionInfo* prev;
|
||||
};
|
||||
|
||||
u32 OSGetResetCode();
|
||||
void OSResetSystem(int reset, u32 resetCode, BOOL forceMenu);
|
||||
BOOL OSGetResetSwitchState();
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#ifndef DOLPHIN_OSSERIAL
|
||||
#define DOLPHIN_OSSERIAL
|
||||
|
||||
#include <types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SI_MAX_CHAN 4
|
||||
#define SI_MAX_COMCSR_INLNGTH 128
|
||||
#define SI_MAX_COMCSR_OUTLNGTH 128
|
||||
#define SI_ERROR_UNDER_RUN 0x0001
|
||||
#define SI_ERROR_OVER_RUN 0x0002
|
||||
#define SI_ERROR_COLLISION 0x0004
|
||||
#define SI_ERROR_NO_RESPONSE 0x0008
|
||||
#define SI_ERROR_WRST 0x0010
|
||||
#define SI_ERROR_RDST 0x0020
|
||||
#define SI_ERROR_UNKNOWN 0x0040
|
||||
#define SI_ERROR_BUSY 0x0080
|
||||
#define SI_CHAN0 0
|
||||
#define SI_CHAN1 1
|
||||
#define SI_CHAN2 2
|
||||
#define SI_CHAN3 3
|
||||
#define SI_CHAN0_BIT 0x80000000
|
||||
#define SI_CHAN1_BIT 0x40000000
|
||||
#define SI_CHAN2_BIT 0x20000000
|
||||
#define SI_CHAN3_BIT 0x10000000
|
||||
#define SI_CHAN_BIT(chan) (SI_CHAN0_BIT >> (chan))
|
||||
#define SI_TYPE_MASK 0x18000000u
|
||||
#define SI_TYPE_N64 0x00000000u
|
||||
#define SI_TYPE_DOLPHIN 0x08000000u
|
||||
#define SI_TYPE_GC SI_TYPE_DOLPHIN
|
||||
#define SI_GC_WIRELESS 0x80000000
|
||||
#define SI_GC_NOMOTOR 0x20000000
|
||||
#define SI_GC_STANDARD 0x01000000
|
||||
#define SI_WIRELESS_RECEIVED 0x40000000
|
||||
#define SI_WIRELESS_IR 0x04000000
|
||||
#define SI_WIRELESS_STATE 0x02000000
|
||||
#define SI_WIRELESS_ORIGIN 0x00200000
|
||||
#define SI_WIRELESS_FIX_ID 0x00100000
|
||||
#define SI_WIRELESS_TYPE 0x000f0000
|
||||
#define SI_WIRELESS_LITE_MASK 0x000c0000
|
||||
#define SI_WIRELESS_LITE 0x00040000
|
||||
#define SI_WIRELESS_CONT_MASK 0x00080000
|
||||
#define SI_WIRELESS_CONT 0x00000000
|
||||
#define SI_WIRELESS_ID 0x00c0ff00
|
||||
#define SI_WIRELESS_TYPE_ID (SI_WIRELESS_TYPE | SI_WIRELESS_ID)
|
||||
#define SI_N64_CONTROLLER (SI_TYPE_N64 | 0x05000000)
|
||||
#define SI_N64_MIC (SI_TYPE_N64 | 0x00010000)
|
||||
#define SI_N64_KEYBOARD (SI_TYPE_N64 | 0x00020000)
|
||||
#define SI_N64_MOUSE (SI_TYPE_N64 | 0x02000000)
|
||||
#define SI_GBA (SI_TYPE_N64 | 0x00040000)
|
||||
#define SI_GC_CONTROLLER (SI_TYPE_GC | SI_GC_STANDARD)
|
||||
#define SI_GC_RECEIVER (SI_TYPE_GC | SI_GC_WIRELESS)
|
||||
#define SI_GC_WAVEBIRD \
|
||||
(SI_TYPE_GC | SI_GC_WIRELESS | SI_GC_STANDARD | SI_WIRELESS_STATE | SI_WIRELESS_FIX_ID)
|
||||
#define SI_GC_KEYBOARD (SI_TYPE_GC | 0x00200000)
|
||||
#define SI_GC_STEERING (SI_TYPE_GC | 0x00000000)
|
||||
|
||||
u32 SIProbe(s32 chan);
|
||||
char* SIGetTypeString(u32 type);
|
||||
void SIRefreshSamplingRate(void);
|
||||
void SISetSamplingRate(u32 msec);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
#ifndef DOLPHIN_SIPRIV
|
||||
#define DOLPHIN_SIPRIV
|
||||
|
||||
#include "types.h"
|
||||
#include "dolphin/os.h"
|
||||
#include "dolphin/os/OSTime.h"
|
||||
#include "dolphin/os/OSInterrupt.h"
|
||||
#include "dolphin/os/OSSerial.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (*SICallback)(s32 chan, u32 sr, OSContext* context);
|
||||
typedef void (*SITypeAndStatusCallback)(s32 chan, u32 type);
|
||||
|
||||
typedef struct SIPacket {
|
||||
s32 chan;
|
||||
void* output;
|
||||
u32 outputBytes;
|
||||
void* input;
|
||||
u32 inputBytes;
|
||||
SICallback callback;
|
||||
OSTime fire;
|
||||
} SIPacket;
|
||||
|
||||
void SIInit(void);
|
||||
u32 SIGetStatus(s32 chan);
|
||||
|
||||
BOOL SIBusy(void);
|
||||
BOOL SIIsChanBusy(s32 chan);
|
||||
|
||||
BOOL SITransfer(s32 chan, void* output, u32 outputBytes, void* input, u32 inputBytes,
|
||||
SICallback callback, OSTime delay);
|
||||
u32 SISync(void);
|
||||
|
||||
void SISetCommand(s32 chan, u32 command);
|
||||
u32 SIGetCommand(s32 chan);
|
||||
void SITransferCommands(void);
|
||||
u32 SISetXY(u32 x, u32 y);
|
||||
u32 SIEnablePolling(u32 poll);
|
||||
u32 SIDisablePolling(u32 poll);
|
||||
BOOL SIGetResponse(s32 chan, void* data);
|
||||
|
||||
BOOL SIRegisterPollingHandler(OSInterruptHandler handler);
|
||||
BOOL SIUnregisterPollingHandler(OSInterruptHandler handler);
|
||||
|
||||
u32 SIGetType(s32 chan);
|
||||
u32 SIGetTypeAsync(s32 chan, SITypeAndStatusCallback callback);
|
||||
u32 SIDecodeType(u32 type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -22,6 +22,9 @@ typedef struct gameAlloc_s {
|
||||
} GameAlloc;
|
||||
|
||||
extern void* gamealloc_malloc(GameAlloc* gamealloc, size_t size);
|
||||
extern void gamealloc_free(GameAlloc* gamealloc, void* ptr);
|
||||
extern void gamealloc_cleanup(GameAlloc* gamealloc);
|
||||
extern void gamealloc_init(GameAlloc* gamealloc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user