about summary refs log tree commit diff stats
path: root/gba/source
diff options
context:
space:
mode:
Diffstat (limited to 'gba/source')
-rw-r--r--gba/source/link.c22
-rw-r--r--gba/source/link.h2
-rw-r--r--gba/source/main.c57
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
30u32 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
30void sendS32(s32 val) 45void 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
55void 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
12void initializeLink(); 12void initializeLink();
13void waitForAck(); 13void waitForAck();
14u32 waitForResponse();
14void sendS32(s32 val); 15void sendS32(s32 val);
15void sendU32(u32 val); 16void sendU32(u32 val);
17void 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
11int main(void) 11int 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}