diff options
Diffstat (limited to 'gba')
-rw-r--r-- | gba/source/link.c | 22 | ||||
-rw-r--r-- | gba/source/link.h | 2 | ||||
-rw-r--r-- | gba/source/main.c | 57 |
3 files changed, 81 insertions, 0 deletions
diff --git a/gba/source/link.c b/gba/source/link.c index acadf3b..26443c8 100644 --- a/gba/source/link.c +++ b/gba/source/link.c | |||
@@ -27,6 +27,21 @@ void waitForAck() | |||
27 | REG_HS_CTRL |= JOY_RW; | 27 | REG_HS_CTRL |= JOY_RW; |
28 | } | 28 | } |
29 | 29 | ||
30 | u32 waitForResponse() | ||
31 | { | ||
32 | u32 val; | ||
33 | |||
34 | REG_JOYTR = 1; | ||
35 | while ((REG_HS_CTRL & JOY_WRITE) == 0); | ||
36 | val = REG_JOYRE; | ||
37 | REG_HS_CTRL |= JOY_RW; | ||
38 | REG_JOYTR = 0; | ||
39 | while ((REG_HS_CTRL & JOY_WRITE) == 0); | ||
40 | REG_HS_CTRL |= JOY_RW; | ||
41 | |||
42 | return val; | ||
43 | } | ||
44 | |||
30 | void sendS32(s32 val) | 45 | void sendS32(s32 val) |
31 | { | 46 | { |
32 | REG_JOYTR = val; | 47 | REG_JOYTR = val; |
@@ -36,3 +51,10 @@ void sendU32(u32 val) | |||
36 | { | 51 | { |
37 | REG_JOYTR = val; | 52 | REG_JOYTR = val; |
38 | } | 53 | } |
54 | |||
55 | void directSendU32(u32 val) | ||
56 | { | ||
57 | REG_JOYTR = val; | ||
58 | while ((REG_HS_CTRL & JOY_READ) == 0); | ||
59 | REG_HS_CTRL |= JOY_RW; | ||
60 | } | ||
diff --git a/gba/source/link.h b/gba/source/link.h index 08fd998..38d1c39 100644 --- a/gba/source/link.h +++ b/gba/source/link.h | |||
@@ -11,7 +11,9 @@ | |||
11 | 11 | ||
12 | void initializeLink(); | 12 | void initializeLink(); |
13 | void waitForAck(); | 13 | void waitForAck(); |
14 | u32 waitForResponse(); | ||
14 | void sendS32(s32 val); | 15 | void sendS32(s32 val); |
15 | void sendU32(u32 val); | 16 | void sendU32(u32 val); |
17 | void directSendU32(u32 val); | ||
16 | 18 | ||
17 | #endif | 19 | #endif |
diff --git a/gba/source/main.c b/gba/source/main.c index 6207685..14d2f1d 100644 --- a/gba/source/main.c +++ b/gba/source/main.c | |||
@@ -10,6 +10,10 @@ | |||
10 | 10 | ||
11 | int main(void) | 11 | int main(void) |
12 | { | 12 | { |
13 | // This possibly increases stability, I don't rightly know, this is all black | ||
14 | // magic, will test more later. | ||
15 | REG_IME = 0; | ||
16 | |||
13 | initializeLink(); | 17 | initializeLink(); |
14 | 18 | ||
15 | // Identify the host game. | 19 | // Identify the host game. |
@@ -105,4 +109,57 @@ int main(void) | |||
105 | 109 | ||
106 | sendU32(tti); | 110 | sendU32(tti); |
107 | waitForAck(); | 111 | waitForAck(); |
112 | |||
113 | // Does the player want to import this game? | ||
114 | if (waitForResponse() == 0) | ||
115 | { | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | // Send Pokédex data | ||
120 | u8* pokedexSeen = 0; | ||
121 | if (GAME_RS) | ||
122 | { | ||
123 | pokedexSeen = SaveBlock2->rs.pokedex.seen; | ||
124 | } else if (GAME_FRLG) | ||
125 | { | ||
126 | pokedexSeen = SaveBlock2->frlg.pokedex.seen; | ||
127 | } else if (GAME_EM) | ||
128 | { | ||
129 | pokedexSeen = SaveBlock2->e.pokedex.seen; | ||
130 | } | ||
131 | |||
132 | for (int i=0; i<13; i++) | ||
133 | { | ||
134 | u32 psi = | ||
135 | (pokedexSeen[i*4]) | ||
136 | | (pokedexSeen[i*4+1] << 8) | ||
137 | | (pokedexSeen[i*4+2] << 16) | ||
138 | | (pokedexSeen[i*4+3] << 24); | ||
139 | |||
140 | directSendU32(psi); | ||
141 | } | ||
142 | |||
143 | u8* pokedexCaught = 0; | ||
144 | if (GAME_RS) | ||
145 | { | ||
146 | pokedexCaught = SaveBlock2->rs.pokedex.owned; | ||
147 | } else if (GAME_FRLG) | ||
148 | { | ||
149 | pokedexCaught = SaveBlock2->frlg.pokedex.owned; | ||
150 | } else if (GAME_EM) | ||
151 | { | ||
152 | pokedexCaught = SaveBlock2->e.pokedex.owned; | ||
153 | } | ||
154 | |||
155 | for (int i=0; i<13; i++) | ||
156 | { | ||
157 | u32 psi = | ||
158 | (pokedexCaught[i*4]) | ||
159 | | (pokedexCaught[i*4+1] << 8) | ||
160 | | (pokedexCaught[i*4+2] << 16) | ||
161 | | (pokedexCaught[i*4+3] << 24); | ||
162 | |||
163 | directSendU32(psi); | ||
164 | } | ||
108 | } | 165 | } |