diff options
author | YamaArashi <shadow962@live.com> | 2016-06-03 23:27:19 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-06-05 13:43:46 -0700 |
commit | 2998cc719a41e38568468006d41539d1886412df (patch) | |
tree | 8cd0b9e274caf61efd70c6ace731637ad16e3df6 /include | |
parent | 2405230037bdc7804834eb10aed91bd538dabb4e (diff) |
link.c
Diffstat (limited to 'include')
-rw-r--r-- | include/gba/io_reg.h | 38 | ||||
-rw-r--r-- | include/gba/types.h | 46 | ||||
-rw-r--r-- | include/global.h | 6 | ||||
-rw-r--r-- | include/link.h | 182 | ||||
-rw-r--r-- | include/link/.gitignore | 2 | ||||
-rw-r--r-- | include/main.h | 6 | ||||
-rw-r--r-- | include/task.h | 4 | ||||
-rw-r--r-- | include/text.h | 1 |
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 |