about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--gba/source/link.c22
-rw-r--r--gba/source/link.h2
-rw-r--r--gba/source/main.c57
-rw-r--r--source/main.c55
4 files changed, 135 insertions, 1 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}
diff --git a/source/main.c b/source/main.c index 128feb9..dd252b5 100644 --- a/source/main.c +++ b/source/main.c
@@ -240,12 +240,29 @@ u32 getMsg()
240 } 240 }
241 241
242 send(0); 242 send(0);
243 while (recv()!=0) {sleep(1);}; 243 while (recv()!=0) {sleep(1);}
244 send(0); 244 send(0);
245 245
246 return val; 246 return val;
247} 247}
248 248
249void getMsgArr(u32* arr, int len)
250{
251 for (int i=0; i<len; i++)
252 {
253 *(vu32*)(arr+i) = __builtin_bswap32(recv());
254 usleep(500000);
255 }
256}
257
258void sendMsg(u32 msg)
259{
260 while (recv()==0) {sleep(1);}
261 send(msg);
262 while (recv()!=0) {sleep(1);}
263 send(0);
264}
265
249int main(int argc, char *argv[]) 266int main(int argc, char *argv[])
250{ 267{
251 void *xfb = NULL; 268 void *xfb = NULL;
@@ -520,8 +537,44 @@ int main(int argc, char *argv[])
520 537
521 if (waitForButtons(PAD_BUTTON_A | PAD_BUTTON_B) & PAD_BUTTON_B) 538 if (waitForButtons(PAD_BUTTON_A | PAD_BUTTON_B) & PAD_BUTTON_B)
522 { 539 {
540 printf("Cancelling...\n");
541 VIDEO_WaitVSync();
542
543 sendMsg(0);
544
523 continue; 545 continue;
524 } 546 }
547
548 printf("Importing...\n");
549 VIDEO_WaitVSync();
550
551 sendMsg(1);
552
553 // Get Pokédex data
554 u32 pokedexSeen[13];
555 u32 pokedexCaught[13];
556
557 getMsgArr(pokedexSeen, 13);
558 getMsgArr(pokedexCaught, 13);
559 int numCaught = 0;
560 int numSeen = 0;
561 for (int i=0; i<(13*32); i++)
562 {
563 if (pokedexCaught[i >> 5] >> (i & 31) & 1)
564 {
565 //printf("Caught #%d\n", i);
566 numCaught++;
567 numSeen++;
568 } else if (pokedexSeen[i >> 5] >> (i & 31) & 1)
569 {
570 //printf("Saw #%d\n", i);
571 numSeen++;
572 }
573 }
574
575 printf("Caught: %d\nSeen: %d\n", numCaught, numSeen);
576
577 waitForButtons(PAD_BUTTON_START);
525 } 578 }
526 } 579 }
527 580