I’m trying to figure out how the serial communication between two first generation Pokemon games works.
Reading the section in the CPU manual about serial communication, I found that it uses two registers at addresses
ff02. Grepping the source reveals
constants/hardware_constants.asm that defines
Grepping those leads me to
engine/overworld/cable_club_npc.asm. I’m not sure which does what, but in the former I find a promising label called
Serial_ExchangeBytes. Grepping for that leads me to
The function is called 3 times in this file. Looking at the comments and at my opcode reference, it seems to be using
ld to load 3 16 bit registers for the arguments.
hl stores the data to send,
de the data to receive, and
bc the number of bytes to send.
wSerialRandomNumberListBlock leads me to
wram.asm where all 3 are defined. Looking in the manual, WRAM refers to the 8 4Kb RAM banks that can be mapped into certain address spaces. I’m assuming
ds n means a data section of n bytes, but I’m not sure.
So the first command sends 17 bytes of random data, while
wSerialRandomNumberListBlock is only 7, but followed by 10 bytes of
wLinkBattleRandomNumberList. I could grep further, but it’s random data, so whatever. On to
This block contains all the good stuff. We know we are looking for 424 bytes of data, but here we see them clearly labeled.
First there is a preamble, like with the random block. No idea what it’s for. Then there is space for the player name, followed by the number of Pokemon you cary and their ID.
PARTY_LENGTH is just defined as 6.
Then there are 6
party_struct that contain more info about your Pokemon. I know because I found this page earlier.
I’m grepping for those bytes in the preamble. They seem to be used for a bunch of other things, completely unrelated to the player data.
I’m just randomly trying to read bit and pieces of the code and comparing with bytes coming out of the Game Boy. In the data I see a lot of
FD, and in the code I found
SERIAL_PREAMBLE_BYTE which so happens to be defined as
FD. These seem to be for synchronisation only.
That’s it for now. There is plenty of stuff I don’t understand, but at least I know the structure of the data that is sent over the link cable.