From 6f226f584cf939015ccc3376f23c798833db4e83 Mon Sep 17 00:00:00 2001 From: Rangi Date: Tue, 8 Dec 2020 21:24:48 -0500 Subject: [PATCH] Identify link.asm WRAM labels based on ax6's research notes --- constants/serial_constants.asm | 8 ++ engine/link/link.asm | 139 +++++++++++++++++---------------- wram.asm | 115 ++++++++++++++++----------- 3 files changed, 147 insertions(+), 115 deletions(-) diff --git a/constants/serial_constants.asm b/constants/serial_constants.asm index 97c6a9b04..e8e6929bb 100644 --- a/constants/serial_constants.asm +++ b/constants/serial_constants.asm @@ -22,17 +22,25 @@ USING_EXTERNAL_CLOCK EQU $01 USING_INTERNAL_CLOCK EQU $02 CONNECTION_NOT_ESTABLISHED EQU $ff +; length of a patch list (less than any of the signal bytes) +SERIAL_PATCH_LIST_LENGTH EQU $fc ; signals the start of an array of bytes transferred over the link cable SERIAL_PREAMBLE_BYTE EQU $fd ; this byte is used when there is no data to send SERIAL_NO_DATA_BYTE EQU $fe ; signals the end of one part of a patch list (there are two parts) for player/enemy party data SERIAL_PATCH_LIST_PART_TERMINATOR EQU $ff +; used to replace SERIAL_NO_DATA_BYTE +SERIAL_PATCH_REPLACEMENT_BYTE EQU $ff SERIAL_PREAMBLE_LENGTH EQU 6 SERIAL_RN_PREAMBLE_LENGTH EQU 7 SERIAL_RNS_LENGTH EQU 10 +SERIAL_MAIL_PREAMBLE_BYTE EQU $20 +SERIAL_MAIL_REPLACEMENT_BYTE EQU $21 +SERIAL_MAIL_PREAMBLE_LENGTH EQU 5 + ; timeout duration after exchanging a byte SERIAL_LINK_BYTE_TIMEOUT EQU $5000 diff --git a/engine/link/link.asm b/engine/link/link.asm index ddda92dbe..5ea0e10fe 100644 --- a/engine/link/link.asm +++ b/engine/link/link.asm @@ -82,14 +82,14 @@ Gen2ToGen1LinkComms: ld [de], a ld hl, wLinkData - ld de, wOTPlayerName - ld bc, $1a8 + ld de, wOTPartyData + ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3 call Serial_ExchangeBytes ld a, SERIAL_NO_DATA_BYTE ld [de], a - ld hl, wLink_c608 - ld de, wTrademons + ld hl, wPlayerPatchLists + ld de, wOTPatchLists ld bc, 200 call Serial_ExchangeBytes @@ -100,7 +100,7 @@ Gen2ToGen1LinkComms: call Link_CopyRandomNumbers - ld hl, wOTPlayerName + ld hl, wOTPartyData call Link_FindFirstNonControlCharacter_SkipZero push hl ld bc, NAME_LENGTH @@ -113,11 +113,11 @@ Gen2ToGen1LinkComms: jp nc, ExitLinkCommunications ld de, wLinkData - ld bc, $1a2 + ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3 call Link_CopyOTData - ld de, wPlayerTrademon - ld hl, wTimeCapsulePlayerData + ld de, wOTPatchLists + ld hl, wLinkPatchList1 ld c, 2 .loop ld a, [de] @@ -143,7 +143,7 @@ Gen2ToGen1LinkComms: jr .loop .next - ld hl, wc90f + ld hl, wLinkPatchList2 dec c jr nz, .loop @@ -156,6 +156,7 @@ Gen2ToGen1LinkComms: ld a, [hli] ld [de], a inc de + .party_loop ld a, [hli] cp -1 @@ -238,23 +239,23 @@ Gen2ToGen2LinkComms: ld [de], a ld hl, wLinkData - ld de, wOTPlayerName - ld bc, $1c2 + ld de, wOTPartyData + ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3 call Serial_ExchangeBytes ld a, SERIAL_NO_DATA_BYTE ld [de], a - ld hl, wLink_c608 - ld de, wTrademons + ld hl, wPlayerPatchLists + ld de, wOTPatchLists ld bc, 200 call Serial_ExchangeBytes ld a, [wLinkMode] cp LINK_TRADECENTER jr nz, .not_trading - ld hl, wc9f4 - ld de, wcb84 - ld bc, $186 + ld hl, wLinkPlayerMail + ld de, wLinkOTMail + ld bc, wLinkPlayerMailEnd - wLinkPlayerMail call ExchangeBytes .not_trading @@ -267,14 +268,14 @@ Gen2ToGen2LinkComms: call Link_CopyRandomNumbers - ld hl, wOTPlayerName + ld hl, wOTPartyData call Link_FindFirstNonControlCharacter_SkipZero ld de, wLinkData - ld bc, $1b9 + ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH call Link_CopyOTData ld de, wPlayerTrademon - ld hl, wLinkPlayerData + ld hl, wLinkPatchList1 ld c, 2 .loop1 ld a, [de] @@ -300,33 +301,33 @@ Gen2ToGen2LinkComms: jr .loop1 .next1 - ld hl, wc90f + ld hl, wLinkPatchList2 dec c jr nz, .loop1 ld a, [wLinkMode] cp LINK_TRADECENTER jp nz, .skip_mail - ld hl, wcb84 + ld hl, wLinkOTMail .loop2 ld a, [hli] - cp MAIL_MSG_LENGTH + cp SERIAL_MAIL_PREAMBLE_BYTE jr nz, .loop2 .loop3 ld a, [hli] cp SERIAL_NO_DATA_BYTE jr z, .loop3 - cp MAIL_MSG_LENGTH + cp SERIAL_MAIL_PREAMBLE_BYTE jr z, .loop3 dec hl - ld de, wcb84 - ld bc, $190 ; 400 + ld de, wLinkOTMail + ld bc, wLinkDataEnd - wLinkOTMail ; should be wLinkOTMailEnd - wLinkOTMail call CopyBytes - ld hl, wcb84 - ld bc, $c6 ; 198 + ld hl, wLinkOTMail + ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH .loop4 ld a, [hl] - cp MAIL_MSG_LENGTH + 1 + cp SERIAL_MAIL_REPLACEMENT_BYTE jr nz, .okay1 ld [hl], SERIAL_NO_DATA_BYTE .okay1 @@ -335,13 +336,13 @@ Gen2ToGen2LinkComms: ld a, b or c jr nz, .loop4 - ld de, wcc9e + ld de, wOTPlayerMailPatchSet .loop5 ld a, [de] inc de cp SERIAL_PATCH_LIST_PART_TERMINATOR jr z, .start_copying_mail - ld hl, wcc4a + ld hl, wLinkOTMailMetadata dec a ld b, 0 ld c, a @@ -350,8 +351,8 @@ Gen2ToGen2LinkComms: jr .loop5 .start_copying_mail - ld hl, wcb84 - ld de, wc9f4 + ld hl, wLinkOTMail + ld de, wLinkReceivedMail ld b, PARTY_LENGTH .copy_mail_loop push bc @@ -366,7 +367,7 @@ Gen2ToGen2LinkComms: pop bc dec b jr nz, .copy_mail_loop - ld de, wc9f4 + ld de, wLinkReceivedMail ld b, PARTY_LENGTH .copy_author_loop push bc @@ -382,7 +383,7 @@ Gen2ToGen2LinkComms: dec b jr nz, .copy_author_loop ld b, PARTY_LENGTH - ld de, wc9f4 + ld de, wLinkReceivedMail .fix_mail_loop push bc push de @@ -409,7 +410,7 @@ Gen2ToGen2LinkComms: pop bc dec b jr nz, .fix_mail_loop - ld de, wcb0e + ld de, wLinkReceivedMailEnd xor a ld [de], a @@ -605,7 +606,7 @@ FixDataForLinkTransfer: dec b jr nz, .rn_loop - ld hl, wLink_c608 + ld hl, wPlayerPatchLists ld a, SERIAL_PREAMBLE_BYTE ld [hli], a ld [hli], a @@ -618,13 +619,13 @@ FixDataForLinkTransfer: dec b jr nz, .loop1 - ld hl, wTimeCapsulePlayerData - 1 + PARTY_LENGTH - ld de, wc612 + ld hl, (wLinkData + SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1) - 1 + ld de, wPlayerPatchLists + 10 ; ??? lb bc, 0, 0 .loop2 inc c ld a, c - cp SERIAL_PREAMBLE_BYTE + cp SERIAL_PATCH_LIST_LENGTH + 1 jr z, .next1 ld a, b dec a @@ -632,9 +633,9 @@ FixDataForLinkTransfer: push bc ld a, [wLinkMode] cp LINK_TIMECAPSULE - ld b, $d + ld b, REDMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1 jr z, .got_value - ld b, $27 + ld b, 2 + PARTYMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1 .got_value ld a, c cp b @@ -648,7 +649,7 @@ FixDataForLinkTransfer: ld a, c ld [de], a inc de - ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR + ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE jr .loop2 .next1 @@ -872,12 +873,12 @@ Link_PrepPartyData_Gen2: cp LINK_TRADECENTER ret nz -; Fill 5 bytes at wc9f4 with $20 - ld de, wc9f4 - ld a, $20 +; Fill 5 bytes at wLinkPlayerMailPreamble with $20 + ld de, wLinkPlayerMailPreamble + ld a, SERIAL_MAIL_PREAMBLE_BYTE call Link_CopyMailPreamble -; Copy all the mail messages to wc9f9 +; Copy all the mail messages to wLinkPlayerMailMessages ld a, BANK(sPartyMail) call OpenSRAM ld hl, sPartyMail @@ -886,26 +887,26 @@ Link_PrepPartyData_Gen2: push bc ld bc, MAIL_MSG_LENGTH + 1 call CopyBytes - ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor + ld bc, MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1) add hl, bc pop bc dec b jr nz, .loop2 -; Copy the mail data to wcabf +; Copy the mail data to wLinkPlayerMailMetadata ld hl, sPartyMail ld b, PARTY_LENGTH .loop3 push bc ld bc, MAIL_MSG_LENGTH + 1 add hl, bc - ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor + ld bc, MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1) call CopyBytes pop bc dec b jr nz, .loop3 ld b, PARTY_LENGTH ld de, sPartyMail - ld hl, wc9f9 + ld hl, wLinkPlayerMailMessages .loop4 push bc push hl @@ -931,20 +932,20 @@ Link_PrepPartyData_Gen2: ld d, h ld e, l pop hl - ld bc, sPartyMon1MailAuthor - sPartyMon1Mail + ld bc, MAIL_MSG_LENGTH + 1 add hl, bc pop bc dec b jr nz, .loop4 call CloseSRAM - ld hl, wc9f9 - ld bc, PARTY_LENGTH * (sPartyMon1MailAuthor - sPartyMon1Mail) + ld hl, wLinkPlayerMailMessages + ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH .loop5 ld a, [hl] cp SERIAL_NO_DATA_BYTE jr nz, .skip2 - ld [hl], sPartyMon1MailAuthor - sPartyMon1Mail + ld [hl], SERIAL_MAIL_REPLACEMENT_BYTE .skip2 inc hl dec bc @@ -952,16 +953,16 @@ Link_PrepPartyData_Gen2: or c jr nz, .loop5 - ld hl, wcabf - ld de, wcb13 - ld b, PARTY_LENGTH * (sPartyMon1MailEnd - sPartyMon1MailAuthor) - ld c, $0 + ld hl, wLinkPlayerMailMetadata + ld de, wLinkPlayerMailPatchSet + ld b, (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH + ld c, 0 .loop6 inc c ld a, [hl] cp SERIAL_NO_DATA_BYTE jr nz, .skip3 - ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR + ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE ld a, c ld [de], a inc de @@ -976,7 +977,7 @@ Link_PrepPartyData_Gen2: Link_CopyMailPreamble: ; fill 5 bytes with the value of a, starting at de - ld c, 5 + ld c, SERIAL_MAIL_PREAMBLE_LENGTH .loop ld [de], a inc de @@ -989,7 +990,7 @@ Link_ConvertPartyStruct1to2: ld d, h ld e, l ld bc, wLinkOTPartyMonTypes - ld hl, wcbe8 + ld hl, wCurLinkOTPartyMonTypePtr ld a, c ld [hli], a ld [hl], b @@ -1039,7 +1040,7 @@ Link_ConvertPartyStruct1to2: ld a, [de] inc de ld [hl], a - ld hl, wcbe8 + ld hl, wCurLinkOTPartyMonTypePtr ld a, [hli] ld h, [hl] ld l, a @@ -1050,9 +1051,9 @@ Link_ConvertPartyStruct1to2: ld [hli], a inc de ld a, l - ld [wcbe8], a + ld [wCurLinkOTPartyMonTypePtr], a ld a, h - ld [wcbe8 + 1], a + ld [wCurLinkOTPartyMonTypePtr + 1], a push bc ld hl, MON_ITEM add hl, bc @@ -1481,7 +1482,7 @@ LinkTrade_TradeStatsMenu: farcall CheckAnyOtherAliveMonsForTrade jp nc, LinkTrade xor a - ld [wcf57], a + ld [wUnusedLinkAction], a ld [wOtherPlayerLinkAction], a hlcoord 0, 12 ld b, 4 @@ -1495,7 +1496,7 @@ LinkTrade_TradeStatsMenu: .abnormal xor a - ld [wcf57], a + ld [wUnusedLinkAction], a ld [wOtherPlayerLinkAction], a ld a, [wCurOTTradePartyMon] ld hl, wOTPartySpecies @@ -1655,7 +1656,7 @@ LinkEngine_FillBox: LinkTrade: xor a - ld [wcf57], a + ld [wUnusedLinkAction], a ld [wOtherPlayerLinkAction], a hlcoord 0, 12 ld b, 4 @@ -1784,7 +1785,7 @@ LinkTrade: ld bc, MAIL_STRUCT_LENGTH call AddNTimes push hl - ld hl, wc9f4 + ld hl, wLinkPlayerMail ld a, [wCurOTTradePartyMon] ld bc, MAIL_STRUCT_LENGTH call AddNTimes @@ -2554,7 +2555,7 @@ Link_ResetSerialRegistersAfterLinkClosure: Link_EnsureSync: add $d0 ld [wPlayerLinkAction], a - ld [wcf57], a + ld [wUnusedLinkAction], a ld a, $2 ldh [hVBlank], a call DelayFrame diff --git a/wram.asm b/wram.asm index 64fcd5273..a2f07359c 100644 --- a/wram.asm +++ b/wram.asm @@ -683,7 +683,12 @@ wPuzzlePieces:: ds 6 * 6 wUnownPuzzleEnd:: NEXTU -wMobileTransferData:: ds $1e0 +; link patch lists +wPlayerPatchLists:: ds 200 +wOTPatchLists:: ds 200 + +NEXTU +wMobileTransferData:: ds 480 NEXTU @@ -702,11 +707,6 @@ NEXTU ; hall of fame temp struct wHallOfFameTemp:: hall_of_fame wHallOfFameTemp -NEXTU -; link engine data -wLink_c608:: ds 10 -wc612:: ds 10 - NEXTU ; odd egg wOddEgg:: party_struct wOddEgg @@ -796,7 +796,6 @@ wPokegearRadioMusicPlaying:: db NEXTU ; trade -wTrademons:: wPlayerTrademon:: trademon wPlayerTrademon wOTTrademon:: trademon wOTTrademon wTradeAnimAddress:: dw @@ -967,29 +966,7 @@ wDebugOriginalColors:: ds 256 * 4 NEXTU ; raw link data -wLinkData:: ds 271 -wc90f:: ds 229 -wc9f4:: ds 5 -wc9f9:: ds 198 -wcabf:: ds 79 -wcb0e:: ds 5 -wcb13:: ds 113 -wcb84:: ds 100 -wcbe8:: dw -wLinkOTPartyMonTypes:: ds 2 * PARTY_LENGTH - ds 84 -wcc4a:: ds 22 -wcc60:: ds 1 -wcc61:: ds 1 -wcc62:: ds 2 -wcc64:: ds 1 -wcc65:: ds 57 -wcc9e:: ds 22 -wccb4:: ds 1 -wccb5:: ds 3 -wccb8:: ds 1 -wccb9:: ds 1 -wccba:: ds 90 +wLinkData:: ds 1300 wLinkDataEnd:: NEXTU @@ -1000,18 +977,6 @@ wLinkPartySpecies:: ds PARTY_LENGTH wLinkPartyEnd:: db ; older code doesn't check PartyCount UNION -; time capsule party data -wTimeCapsulePlayerData:: -wTimeCapsulePartyMon1:: red_party_struct wTimeCapsulePartyMon1 -wTimeCapsulePartyMon2:: red_party_struct wTimeCapsulePartyMon2 -wTimeCapsulePartyMon3:: red_party_struct wTimeCapsulePartyMon3 -wTimeCapsulePartyMon4:: red_party_struct wTimeCapsulePartyMon4 -wTimeCapsulePartyMon5:: red_party_struct wTimeCapsulePartyMon5 -wTimeCapsulePartyMon6:: red_party_struct wTimeCapsulePartyMon6 -wTimeCapsulePartyMonOTNames:: ds PARTY_LENGTH * NAME_LENGTH -wTimeCapsulePartyMonNicks:: ds PARTY_LENGTH * MON_NAME_LENGTH - -NEXTU ; link player data wLinkPlayerData:: wLinkPlayerPartyMon1:: party_struct wLinkPlayerPartyMon1 @@ -1020,10 +985,56 @@ wLinkPlayerPartyMon3:: party_struct wLinkPlayerPartyMon3 wLinkPlayerPartyMon4:: party_struct wLinkPlayerPartyMon4 wLinkPlayerPartyMon5:: party_struct wLinkPlayerPartyMon5 wLinkPlayerPartyMon6:: party_struct wLinkPlayerPartyMon6 -wLinkPlayerPartyMonOTNames:: ds PARTY_LENGTH * NAME_LENGTH -wLinkPlayerPartyMonNicks:: ds PARTY_LENGTH * MON_NAME_LENGTH +wLinkPlayerPartyMonOTNames:: ds NAME_LENGTH * PARTY_LENGTH +wLinkPlayerPartyMonNicks:: ds MON_NAME_LENGTH * PARTY_LENGTH + +NEXTU +; time capsule party data +wTimeCapsulePlayerData:: +wTimeCapsulePartyMon1:: red_party_struct wTimeCapsulePartyMon1 +wTimeCapsulePartyMon2:: red_party_struct wTimeCapsulePartyMon2 +wTimeCapsulePartyMon3:: red_party_struct wTimeCapsulePartyMon3 +wTimeCapsulePartyMon4:: red_party_struct wTimeCapsulePartyMon4 +wTimeCapsulePartyMon5:: red_party_struct wTimeCapsulePartyMon5 +wTimeCapsulePartyMon6:: red_party_struct wTimeCapsulePartyMon6 +wTimeCapsulePartyMonOTNames:: ds NAME_LENGTH * PARTY_LENGTH +wTimeCapsulePartyMonNicks:: ds MON_NAME_LENGTH * PARTY_LENGTH + +NEXTU +; link patch lists +wLinkPatchList1:: ds SERIAL_PATCH_LIST_LENGTH +wLinkPatchList2:: ds SERIAL_PATCH_LIST_LENGTH ENDU +NEXTU +; link data prep + ds 1000 +wCurLinkOTPartyMonTypePtr:: dw +wLinkOTPartyMonTypes:: ds 2 * PARTY_LENGTH + +NEXTU +; link mail data + ds 500 +wLinkPlayerMail:: +wLinkPlayerMailPreamble:: ds SERIAL_MAIL_PREAMBLE_LENGTH +wLinkPlayerMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH +wLinkPlayerMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH +wLinkPlayerMailPatchSet:: ds 103 +wLinkPlayerMailEnd:: + ds 10 +wLinkOTMail:: +wLinkOTMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH +wLinkOTMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH +wOTPlayerMailPatchSet:: ds 103 + SERIAL_MAIL_PREAMBLE_LENGTH +wLinkOTMailEnd:: + ds 10 + +NEXTU +; received link mail data + ds 500 +wLinkReceivedMail:: ds MAIL_STRUCT_LENGTH * PARTY_LENGTH +wLinkReceivedMailEnd:: db + NEXTU ; mystery gift data wMysteryGiftStaging:: ds 80 @@ -1099,7 +1110,18 @@ wc822:: ds 525 wMobileSDK_ReceivePacketBufferAlt:: ds 11 wMobileSDK_ReceivedBytes:: dw wMobileSDK_ReceivePacketBuffer:: ds 267 -wMobileSDK_PacketBuffer:: ds 461 +wMobileSDK_PacketBuffer:: ds 281 +wcc60:: ds 1 +wcc61:: ds 1 +wcc62:: ds 2 +wcc64:: ds 1 +wcc65:: ds 57 + ds 22 +wccb4:: ds 1 +wccb5:: ds 3 +wccb8:: ds 1 +wccb9:: ds 1 +wccba:: ds 90 if DEF(_DEBUG) NEXTU @@ -1337,7 +1359,7 @@ wOtherPlayerLinkMode:: db wOtherPlayerLinkAction:: db ds 3 wPlayerLinkAction:: db -wcf57:: db +wUnusedLinkAction:: db ds 3 wLinkTimeoutFrames:: dw wLinkByteTimeout:: dw @@ -2512,6 +2534,7 @@ wUnusedEggHatchFlag:: db NEXTU ; enemy party +wOTPartyData:: wOTPlayerName:: ds NAME_LENGTH wOTPlayerID:: dw ds 8