summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/gba/io_reg.h38
-rw-r--r--include/gba/types.h46
-rw-r--r--include/global.h6
-rw-r--r--include/link.h182
-rw-r--r--include/link/.gitignore2
-rw-r--r--include/main.h6
-rw-r--r--include/task.h4
-rw-r--r--include/text.h1
8 files changed, 273 insertions, 12 deletions
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 87c167ab6..3c30c494e 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -350,6 +350,7 @@
#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS)
#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS)
#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS)
+#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA)
#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)
#define REG_NR10 (*(vu8 *)REG_ADDR_NR10)
@@ -433,9 +434,21 @@
#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L)
#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H)
+#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT)
+#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8)
+#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
+#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
+#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
+#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
+#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
+#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
+#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3)
+
#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT)
#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
+#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
+
#define REG_IME (*(vu16 *)REG_ADDR_IME)
#define REG_IE (*(vu16 *)REG_ADDR_IE)
#define REG_IF (*(vu16 *)REG_ADDR_IF)
@@ -526,6 +539,31 @@
#define TIMER_INTR_ENABLE 0x40
#define TIMER_ENABLE 0x80
+// serial
+#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
+#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
+#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
+#define SIO_UART_MODE 0x3000 // UART communication mode
+
+#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
+#define SIO_38400_BPS 0x0001 // 38400 bps
+#define SIO_57600_BPS 0x0002 // 57600 bps
+#define SIO_115200_BPS 0x0003 // 115200 bps
+
+#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
+#define SIO_MULTI_SD 0x0008 // SD terminal
+
+#define SIO_ERROR 0x0040 // Detect error
+#define SIO_START 0x0080 // Start transfer
+#define SIO_ENABLE 0x0080 // Enable SIO
+
+#define SIO_INTR_ENABLE 0x4000
+
+#define SIO_MULTI_SI_SHIFT 2
+#define SIO_MULTI_SI_MASK 0x1
+#define SIO_MULTI_DI_SHIFT 3
+#define SIO_MULTI_DI_MASK 0x1
+
// keys
#define A_BUTTON 0x0001
#define B_BUTTON 0x0002
diff --git a/include/gba/types.h b/include/gba/types.h
index 4e1ab3003..1274d4f0d 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -1,19 +1,23 @@
#ifndef GUARD_GBA_TYPES_H
#define GUARD_GBA_TYPES_H
-typedef unsigned char u8;
-typedef unsigned short u16;
-typedef unsigned int u32;
-typedef signed char s8;
-typedef signed short s16;
-typedef signed int s32;
-
-typedef volatile u8 vu8;
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+typedef signed char s8;
+typedef signed short s16;
+typedef signed int s32;
+typedef signed long long s64;
+
+typedef volatile u8 vu8;
typedef volatile u16 vu16;
typedef volatile u32 vu32;
-typedef volatile s8 vs8;
+typedef volatile u64 vu64;
+typedef volatile s8 vs8;
typedef volatile s16 vs16;
typedef volatile s32 vs32;
+typedef volatile s64 vs64;
typedef float f32;
typedef double f64;
@@ -67,4 +71,28 @@ struct ObjAffineSrcData
u16 rotation;
};
+// Multi-player SIO Control Structure
+struct SioMultiCnt
+{
+ u16 baudRate:2; // baud rate
+ u16 si:1; // SI terminal
+ u16 sd:1; // SD terminal
+ u16 id:2; // ID
+ u16 error:1; // error flag
+ u16 enable:1; // SIO enable
+ u16 unused_11_8:4;
+ u16 mode:2; // communication mode (should equal 2)
+ u16 intrEnable:1; // IRQ enable
+ u16 unused_15:1;
+ u16 data; // data
+};
+
+#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
+
+// baud rate
+#define ST_SIO_9600_BPS 0 // 9600 bps
+#define ST_SIO_38400_BPS 1 // 38400 bps
+#define ST_SIO_57600_BPS 2 // 57600 bps
+#define ST_SIO_115200_BPS 3 // 115200 bps
+
#endif // GUARD_GBA_TYPES_H
diff --git a/include/global.h b/include/global.h
index 21b1e41af..5e6bd5bd4 100644
--- a/include/global.h
+++ b/include/global.h
@@ -10,6 +10,8 @@
// Prevent cross-jump optimization.
#define BLOCK_CROSS_JUMP asm("");
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
+
extern u8 gStringVar1[];
extern u8 gStringVar2[];
extern u8 gStringVar3[];
@@ -38,8 +40,8 @@ struct SaveBlock2
{
u8 playerName[8];
u8 playerGender;
- u16 playerTrainerId;
- u16 playerSecretId;
+ u8 sb2_field_9;
+ u8 playerTrainerId[4];
u16 playTimeHours;
u8 playTimeMinutes;
u8 playTimeSeconds;
diff --git a/include/link.h b/include/link.h
new file mode 100644
index 000000000..ba6bcd6f9
--- /dev/null
+++ b/include/link.h
@@ -0,0 +1,182 @@
+#ifndef GUARD_LINK_H
+#define GUARD_LINK_H
+
+#include "global.h"
+
+#define MAX_LINK_PLAYERS 4
+#define CMD_LENGTH 8
+#define QUEUE_CAPACITY 50
+#define BLOCK_BUFFER_SIZE 0x100
+
+#define LINK_STAT_LOCAL_ID 0x00000003
+#define LINK_STAT_PLAYER_COUNT 0x0000001C
+#define LINK_STAT_PLAYER_COUNT_SHIFT 2
+#define LINK_STAT_MASTER 0x00000020
+#define LINK_STAT_MASTER_SHIFT 5
+#define LINK_STAT_CONN_ESTABLISHED 0x00000040
+#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6
+#define LINK_STAT_RECEIVED_NOTHING 0x00000100
+#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
+#define LINK_STAT_ERRORS 0x0007F000
+
+#define EXTRACT_PLAYER_COUNT(status) \
+(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)
+#define EXTRACT_MASTER(status) \
+(((status) >> LINK_STAT_MASTER_SHIFT) & 1)
+#define EXTRACT_CONN_ESTABLISHED(status) \
+(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)
+#define EXTRACT_RECEIVED_NOTHING(status) \
+(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)
+
+#define MASTER_HANDSHAKE 0x8FFF
+#define SLAVE_HANDSHAKE 0xB9A0
+
+enum
+{
+ LINK_STATE_START0,
+ LINK_STATE_START1,
+ LINK_STATE_HANDSHAKE,
+ LINK_STATE_INIT_TIMER,
+ LINK_STATE_CONN_ESTABLISHED,
+};
+
+enum
+{
+ EXCHANGE_NOT_STARTED,
+ EXCHANGE_COMPLETE,
+ EXCHANGE_TIMED_OUT,
+ EXCHANGE_IN_PROGRESS,
+};
+
+enum
+{
+ QUEUE_FULL_NONE,
+ QUEUE_FULL_SEND,
+ QUEUE_FULL_RECV,
+};
+
+enum
+{
+ LAG_NONE,
+ LAG_MASTER,
+ LAG_SLAVE,
+};
+
+struct LinkPlayer
+{
+ u16 version;
+ u16 lp_field_2;
+ u32 trainerId;
+ u8 name[11];
+ u8 gender;
+ u32 linkType;
+ u16 lp_field_18;
+ u16 language;
+};
+
+struct LinkPlayerBlock
+{
+ u8 magic1[16];
+ struct LinkPlayer linkPlayer;
+ u8 magic2[16];
+};
+
+// circular queues
+
+struct SendQueue
+{
+ u16 data[CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct RecvQueue
+{
+ u16 data[MAX_LINK_PLAYERS][CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct Link
+{
+ u8 isMaster; // 0: slave, 8: master
+ u8 state;
+ u8 localId; // local multi-player ID
+ u8 playerCount;
+ u16 tempRecvBuffer[4];
+ bool8 receivedNothing;
+ s8 serialIntrCounter;
+ bool8 handshakeAsMaster;
+ u8 link_field_F;
+
+ // error conditions
+ bool8 hardwareError; // hardware reported an error
+ bool8 badChecksum; // checksum didn't match between devices
+ u8 queueFull; // send or recv queue out of space
+ u8 lag; // connection is lagging
+
+ u16 checksum;
+
+ u8 sendCmdIndex;
+ u8 recvCmdIndex;
+
+ struct SendQueue sendQueue;
+ struct RecvQueue recvQueue;
+};
+
+extern struct Link gLink;
+extern u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS];
+extern u32 gLinkStatus;
+extern u16 gSendCmd[CMD_LENGTH];
+extern u8 gShouldAdvanceLinkState;
+
+void Task_DestroySelf(u8);
+void sub_8007270(u8);
+void OpenLink(void);
+void CloseLink(void);
+u16 LinkMain2(u16 *);
+void sub_8007B14(void);
+bool32 sub_8007B24(void);
+void ClearLinkCallback(void);
+void ClearLinkCallback_2(void);
+u8 GetLinkPlayerCount(void);
+void OpenLinkTimed(void);
+u8 GetLinkPlayerDataExchangeStatusTimed(void);
+bool8 IsLinkPlayerDataExchangeComplete(void);
+u32 GetLinkPlayerTrainerId(u8);
+void ResetLinkPlayers(void);
+void sub_8007E24(void);
+void sub_8007E4C(void);
+u8 GetMultiplayerId(void);
+u8 bitmask_all_link_players_but_self(void);
+bool8 SendBlock(u8, void *, u16);
+bool8 sub_8007E9C(u8);
+bool8 sub_8007ECC(void);
+u8 GetBlockRecievedStatus(void);
+void ResetBlockReceivedFlags(void);
+void ResetBlockReceivedFlag(u8);
+void sub_8007F4C(void);
+void SetLinkDebugValues(u32, u32);
+u8 sub_8008198(void);
+void sub_80081C8(u8);
+u8 sub_800820C(void);
+u8 sub_8008218(void);
+void sub_800826C(void);
+void sub_80082EC(void);
+u8 GetLinkPlayerCount_2(void);
+bool8 IsLinkMaster(void);
+void sub_800832C(void);
+void sub_8008480(void);
+void sub_80084A4(void);
+void CB2_LinkError(void);
+u8 GetSioMultiSI(void);
+bool8 IsLinkConnectionEstablished(void);
+void SetSuppressLinkErrorMessage(bool8);
+bool8 HasLinkErrorOccurred(void);
+void ResetSerial(void);
+u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+void LinkVSync(void);
+void Timer3Intr(void);
+void SerialCB(void);
+
+#endif // GUARD_LINK_H
diff --git a/include/link/.gitignore b/include/link/.gitignore
new file mode 100644
index 000000000..266afbe6e
--- /dev/null
+++ b/include/link/.gitignore
@@ -0,0 +1,2 @@
+digit_tiles.h
+digit_palette.h
diff --git a/include/main.h b/include/main.h
index 2f6671967..dda18889a 100644
--- a/include/main.h
+++ b/include/main.h
@@ -42,6 +42,12 @@ struct Main
u8 oamLoadDisabled:1;
};
+extern u8 gUnknown_3001764;
extern struct Main gMain;
+extern u8 gUnknown_3001BB4;
+extern bool8 gLinkVSyncDisabled;
+
+extern const u8 gGameVersion;
+extern const u8 gGameLanguage;
#endif // GUARD_MAIN_H
diff --git a/include/task.h b/include/task.h
index cb01efbef..a536bcab5 100644
--- a/include/task.h
+++ b/include/task.h
@@ -10,9 +10,11 @@ struct Task
u8 prev;
u8 next;
u8 priority;
- u16 data[16];
+ s16 data[16];
};
+extern struct Task gTasks[];
+
void ResetTasks();
u8 CreateTask(TaskFunc func, u8 priority);
void DestroyTask(u8 taskId);
diff --git a/include/text.h b/include/text.h
index a1de98166..030d51188 100644
--- a/include/text.h
+++ b/include/text.h
@@ -76,5 +76,6 @@ extern const struct WindowConfig gWindowConfig_81E7278;
extern const struct WindowConfig gWindowConfig_81E7294;
u8 GetExtCtrlCodeLength(u8 code);
+void ConvertInternationalString(u8 *s, u8 language);
#endif // GUARD_TEXT_H