Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

Game Boy Wars 3/ROM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for Game Boy Wars 3.

Block 1 (000000-004000)

  • 058D-0592 ~ load [$FF81] and [$4000] with A
  • 0593-059A ~ [$0000] = 10
  • 059B-05A1 ~ [$0000] = 0
  • 08BB-08BE ~ HL = [HL] 2 byte, jump to new HL
  • 08C0-08C4 ~ [HL] 2 byte = DE (pointer storage)
  • 090B-0926 ~ A = [$D000 + A * 16 + C]
  • 097A-0984 ~ HL = $D000 + L * 16
  • 0ED4-0EE3 ~ HL = $9800 + (C%128 * 2 + C/128) * 16 + B
  • 0F02-0F1B ~ loads $9800~9BFF with 0
  • 0F1C-0F2C ~ ldi [HL], A; bit 7,[$C00F] = 1 involves $0F2E stuff
  • 0F2E-0F40 ~ repeatedly forces Enable Interrupt then Disable Interrupt during "Searching OAM-RAM" or "Transfering Data to LCD Driver", ends with Interrupt enabled and [HL] = A
  • 15F8-1606 ~ HL = $D000 + B + C * 64
  • 1607-1613 ~ HL = $1C16 + A * 8
  • 18AB-18D5 ~ terrain base IDs
  • 28A0-28D8 ~ [$CA21~$CA4E] holds [3 Byte Pointer~3 Byte Pointer+61], each byte of [$CA41~$CA48] that would be 0 becomes 32 ($CA1A holds 3 Byte Pointer)
  • 28D9-28FC ~ B = B + [$28FD + C%1 * 16 + E * 2], C = C + [$28FE + C%1 * 16 + E * 2], sets Carry Flag by either cp B,map width or cp C,map height (BC is coordinates, E is adjacent space to check)
  • 28FD-290C ~ table holding -1/-1, 0/-1, -1/0, 1/0, -1/1, 0/1, 0/0, 0/0
  • 28FD-290C ~ table holding 0/-1, 1/-1, -1/0, 1/0, 0/1, 1/1, 0/0, 0/0
  • 291D-294A ~ A = space difference (BC and DE hold comparison coordinates)
  • 2960-297D ~ [$CAAC] (2 bytes) is multiplied by 5 and then 1 is added
  • 297E-298E ~ A = ((A % 160) / 10) * 16 + (A % 10), add 1 if A is an even number at least 160
  • 298F-2994 ~ A = A or (256 - A) (whichever one is no more than 128)
  • 2995-29AC ~ HL = A * B
  • 29AD-29BB ~ HL *= 100
  • 29BC-29C2 ~ HL += A
  • 29C3-29C9 ~ HL -= DE
  • 29CA-29D7 ~ Carry Flag active if DE < HL, A = 0 if DE = HL
  • 29D8-2A1C ~ HL *= DE (Signed)
  • 2A1D-2A20 ~ HL = 0
  • 2A21-2A6F ~ DE / BC: DE holds rounded down answer, BC holds remainder
  • 2A70-2A78 ~ [HL] -= 1, BC *= -1
  • 2A79-2A81 ~ [HL] -= 1, DE *= -1
  • 2B38-2B8A ~ [$9800] 1024 byte string holds dialogue (BC is starting coordinates, HL is dialogue pointer)
  • 2E9A-2EAD ~ A = [$D000 + A * 16 + B]
  • 2F5F-2F78 ~ set 0, [$D000 + A * 16] (an even number has 1 added; an odd number is unchanged)
  • 3048-3055 ~ HL = $D000 + A * 16 + B
  • 34D8-34EC ~ when [$FFC8] != [$FFC9] - 1 (loops until that's the case), A -> [$C300 + [$FFC8]] and [$FFC8] += 1
  • 350F-352D ~ load [$C300 + [$FFC8] + 0~(2+B)] with B, E, modded D, [HL]...[HL+B-1]; increment [$FFCA], B = 0, HL = $FFCA, A = [HL+B-1] (D is modded to be D - 128 if [$FFCB] = 1 and D > 128)
  • 3843-385D ~ seems to mute music
  • 3844-385D ~ seems to load up music (A = track number)
  • 38D4-392F ~ 2 byte tables with the following: 80A0, 80A2, 80A4, 80A6, 80A8, 80AA, 01A0, 01B0, 02A0, 06A0, 06B0, 02B0, 03A0, 03B0, 06A0, 06B0, 04A0, 04B0, 05A0, 06A0, 06B0, 05B0, 05B0, 05B0, 05B0, 05B0, 06A0, 06A0, 06A0, 06A0, 06A0, 06B0, 06B0, 06B0, 06B0, 06B0, 07A0, 07B0, 08A0, 08B0, 09A0, 09B0, 0AA0, 0AB0, 0BA0, 0BB0
  • 3A93-3A9D ~ HL = [HL + 2A]
  • 3A9E-3AC6 ~ HL = [HL + 2 * (# of 0s right of rightmost 1 bit in A)]
  • 3AC7-3AD0 ~ A = [HL + (A/8)] AND 2^(A%8)
  • 3AD1-3ADB ~ [HL + (A/8)] = [HL + (A/8)] OR 2^(A%8)
  • 3AE9-3B05 ~ HL += (A / 8): C holds 2^Remainder, HL holds rounded down answer
  • 3B50-3B58 ~ ldi [HL],[DE]; inc DE, dec BC, repeat if BC != 0
  • 3B59-3B78 ~ a version of $3B50 stuff that repeatedly forces Enable Interrupt then Disable Interrupt during "Searching OAM-RAM" or "Transfering Data to LCD Driver", ending with Interrupt enabled (bit 7,[$C00F] being 0 actually simplifies this to the $3B50 stuff)
  • 3B79-3B83 ~ [HL], [HL+1]...[HL+BC-1] = A
  • 3BA5-3BAE ~ ldi [HL],DE; inc HL, dec BC, repeat if BC != 0

Block 2 (004000-008000)

Block 3 (008000-00C000)

Block 4 (00C000-010000)

Block 5 (010000-014000)

Block 6 (014000-018000)

Block 7 (018000-01C000)

Block 8 (01C000-020000)

Block 9 (020000-024000)

Block 10 (024000-028000)

Block 11 (028000-02C000)

Block 12 (02C000-030000)

  • 411B-415E ~ establishes starting Gold and Materials
  • 415F-416C ~ used Gold bytes carry starting Gold (DE = Starting Gold value, gets multiplied by 1000)
  • 416D-4177 ~ used Materials bytes carry starting Materials (DE = Starting Materials value, gets multiplied by 10)
  • 4700-4706 ~ set 0, [D000 + [C98D] * 16]
  • 4707-4713 ~ A = [18AB + A] (used to determine property's base value or such)
  • 4714-4729 ~ A = [D000 + B + C * 64]
  • 472A-473F ~ A = [D000 + B + C * 64]
  • 4770-4775 ~ A = ([D000 + B + C * 64]%64)
  • 4792-4797 ~ A = ([D000 + B + C * 64]%128)
  • 47BF-47E0 ~ if A = 0, res 7,[$D000 + B + C * 64]; otherwise, [$D000 + B + C * 64] = AND [$D000 + B + C * 64],rrca(rrca(NOT a)))
  • 480E-4821 ~ res 7,[$D000 + B + C * 64]
  • 5539-555E ~ A = min(Movement Power, Fuel), [CD43] stuff (Movement Costs) is set up
  • 59BD-5A0C ~ A = property number value if controlled by active player and within 3 spaces of their Capital; otherwise, A = 0 (BC holds current coordinates)
  • 5C1F-5C67 ~ A = 1 if not enough Gold, 2 if not enough Materials, 3 if 50 units are available, or 0 if none of the above
  • 7B43-7B53 ~ A = 0 if current coordinates is equal to coordinates stored in BC, -1 otherwise
  • 7B6F-7B97 ~ adds DE to used Gold bytes, caps at 99999. Narrowly avoids a capping bug: 2 Capitals and 98 Cities provide 30200G Income total at max property strength. Otherwise, the byte allowing funds past 65535G is not forced to be 1, allowing an Income value exceeding 31071G to break the cap badly.
  • 7BB0-7BCC ~ Carry Flag toggle by not having enough Gold
  • 7BCD-7BDB ~ HL = first used available Gold byte
  • 7BDC-7BEB ~ HL = available Materials
  • 7BEC-7C12 ~ adds DE to used Materials bytes, caps at 999
  • 7CF7-7D23 ~ A = 0 for active player's property, 1 for opposing player's property, 2 for neutral property, or 3 for non-property terrain (A = terrain value)

Block 13 (030000-034000)

  • 4861-486C ~ digs up used Cover value
  • 486D-4883 ~ Cover values (Null, HQ, City, Ruined City, Factory, Ruined Factory, Airport, Ruined Airport, Simple Airport, Harbor, Ruined Harbor, Communication Tower, Plains, Road, Bridge, ?, Mountain, Forest, Moor, Desert, River, Sea, Beach) (guesses)
  • 4991-499C - digs up used Level value
  • 499D-49A1 - Level values (Ranks D to A then S)
  • 49A2-49CB ~ HL = Attack mutiplier with L using the float portion (A, B, and C use Support, Level, and Flank values respectively)
  • 49CC-49FB ~ HL = Defense multiplier with L using the float portion (A, B, and C use Cover, Level, and Flank values respectively and get halved and truncated in the process)
  • 49FC-4A20 ~ HL = Stat * HP * Multiplier; Float error results in slight decrease if the intended multiplier doesn't divide by 0.25 into a whole number
  • 4A21-4A25 ~ HL = 2 * Stat * HP * Multiplier; Float error results in slight decrease if the intended multiplier doesn't divide by 0.25 into a whole number
  • 4A26-4A97 ~ calculates new HP for attacker's unit, rounds up, range from 0 to old HP
  • 4A98-4B09 ~ calculates new HP for defender's unit, rounds up, range from 0 to old HP
    • Total ATK is calculated with 49FC, multiplier uses 49A2 and Stat is ATK
    • Total DEF is calculated with 4A21, multiplier uses 49CC and Stat is DEF
    • New HP is (Total DEF - Total ATK) / (2 * DEF)
    • Default to 0 and end procedure immediately if result is negative, round up, and then default to Old HP if result exceeds it
    • Effective damage formula is as follows: ATK * Attacker's HP * (100 + ATK boosts) / (200 * DEF) - DEF boosts * Defender's HP / 200. Truncation is only done after full damage is calculated.
  • 4B0A-4B66 ~ calculates New HP values for both sides using attack order
    • 4B18-4B34 ~ Attacker's Focus 10s digit exceeds Defender's
    • 4B35-4B51 ~ Defender's Focus 10s digit exceeds Attacker's
    • 4B52-4B65 ~ Focus 10s digit is equal for both sides; old HP is used for both players
  • 4B67-4BBF ~ hardcodes ammo reductions and participation EXP
  • 4BC0-4BD4 ~ hardcodes attacker's Ammo reduction and participation EXP
  • 4BD5-4BE9 ~ hardcodes defender's Ammo reduction and participation EXP
  • 4BEA-4BFB ~ hardcodes the Ammo reduction from battle
  • 4BFC-4C26 ~ hardcodes participation EXP. 2 EXP for (counter)attacking, 1 EXP for defending against an attack.
  • 4C27-4CF6 ~ hardcodes damage-related EXP for both sides. Formula is (Damage Done + Kill Coefficient) * Underdog Coefficient. Kill Coefficient is 1 if the opposing unit is defeated, 0 otherwise; Underdog Coefficient is 2 if the opposing unit is defeated AND the victorious unit has lower ATK, 1 otherwise.
  • 4E0A-4E11 ~ attack order text pointers (invalid, same time, first, second)
  • 4E12-4E25 ~ attack order text (first, second, same time, invalid)

Block 14 (034000-038000)

  • 6618-664F ~ establishes player and AI control in [$C631] and [$C632]
  • 670E-671E ~ HL = total HP * Gold Cost / 1000G of the given side's active units (B = first unit #)
  • 671F-6757 ~ DE = HP * Gold Cost / 1000G if unit exists and isn't in Reserve; DE = 0 otherwise (A is the Unit #)

Block 15 (038000-03C000)

Block 16 (03C000-040000)

Block 17 (040000-044000)

  • 4BC4-4BD2 ~ if CA94 = 2, load C632; otherwise, load C631

Block 18 (044000-048000)

  • 4A12-4A43 ~ checks if Master Wars Medal and Super Prize should be given out ([$C68F] 6 bytes holds cleared Campaign maps, [$C784] 45 bytes number of clears for each Campaign map in each byte--the Super Prize won't be rewarded if the total is 55 or more)
  • 4A59-4B27 ~ checks if the following Medals should be given out: Gold/Silver Car, Gold/Silver Tank, Gold/Silver Plane, Gold/Silver Ship, Gold/Silver Flag, Gold/Silver Worker, Reaper ([$C770] 2 byte is destroyed Lite Land, [$C772] 2 byte is destroyed Armor, [$C774] 2 byte is destroyed Air, [$C776] 2 byte is destroyed Ship, [$C778] 2 byte is captured properties, [$C77A] 2 byte is developed properties, and [$C77C] is declined Yields)
  • 4B28-4B40 ~ checks if All Unit Medal should be given out ([$C77D] 7 byte holds procured unit flags)
  • 4BC4-4BD2 ~ if [CA94] = 2, A = [C632]; otherwise, A = [C631]
  • 4BD3-4BD9 ~ just obtained Medal flag set at [C62B] (A is just obtained Medal)
  • 4C4D-4C5A ~ floors [$C68B] at A, A is set to -1 if no changes are heeded
  • 4D3F-4D59 ~ if [C62F] != 1 && [C633]%2 = 1, [C77D + A/16] = [C77D + A/16] OR 2^((A/2)%8)
  • 4DDF-4DEC ~ Carry Flag active if [DE] 2 byte < HL, A = 0 if [DE] 2 byte = HL

Block 19 (048000-04C000)

  • 4000-401F ~ RAM addresses $D000~$D63F set to 0
  • 4020-4028 ~ HL = Unit Type's stats starting location (A is Unit Type)
  • 4029-4036 ~ HL = Unit's stats starting location (A is Unit #)
  • 4037-4042 ~ A = Unit Type's used stat (A is Unit Type, C is used stat)
  • 4043-404E ~ DE = Unit Type's used stat (2 bytes) (A is Unit Type, C is used stat)
  • 404F-4065 ~ RAM addresses $CD28~$CD31 set to hold Unit Type's name
  • 4066-4082 ~ A = Unit's used stat (A is Unit #, C is used stat)
  • 4083-40A0 ~ DE = Unit's used stat (2 bytes) (A is Unit #, C is used stat)
  • 40A1-40BC ~ B -> Unit's used stat (A is Unit #, C is used stat)
  • 40BD-40DA ~ DE -> Unit's used stat (2 bytes) (A is Unit #, C is used stat)
  • 40DB-40F4 ~ Adding the unit's EXP in, checking for 400 EXP cap (A is Unit #, HL is gained EXP)
  • 40F5-4105 ~ A = Unit's Level - 1 (A is Unit #)
  • 4106-412A ~ RAM addresses $CCDD~$CCED set to hold selected Unit's stats
  • 412B-414D ~ selected Unit's stats moved from $CCDD~$CCED to $D000 list
  • 414E-4188 ~ A = Unit # of primary unit on coordinates held by BC, -1 if there is none
  • 4189-41E2 ~ changes coordinates of any Loaded units (A is Loading unit, BC is Loading unit's new coordinates); recursion accounts for stack-loading
  • 41E3-41F6 ~ 42F6 stuff, then 41F7 stuff if A != -1 from 42F6 stuff (A is Unit Type, B and C are coordinates)
  • 41F7-4240 ~ establishes new unit's stats in HL string, increments side's current unit count (A and D are Unit Type, B and C are coordinates)
  • 4241-425B ~ increments side's Built Units by 1 to cap of 65,535 (A's Odd/Even bit determines side)
  • 425C-42B1 ~ handles unit defeat including Loaded units (A is Unit #); Loaded status check done to avoid redundancy with primary unit
  • 42B2-42F5 ~ decrements side's current unit count, erases defeated unit's stats, increments side's lost unit count to cap of 65,535 (A is Unit #)
  • 42F6-4328 ~ A = side's current unit count, or -1 instead if it's already 50 (A is the given side); HL is set to ($D000 + $320 * side + $32 * units)
  • 4329-4350 ~ A != 0 && Z Flag Set: Loading Valid (A is 1st Unit's #, B is 2nd Unit's #)
  • 4351-43B8 ~ A = prevent Supply flag (A is receiving unit, B is giving unit)
  • 43B9-43F3 ~ $CD33 holds number of units Loaded, $CD34-$CD37 holds ID #s of units Loaded (A is primary Unit #)
  • 43F4-4435 ~ list of buyable units for property using 12:4436 (A is terrain type byte)
  • 4436-4457 ~ $CD0B holds available Unit Type count, $CD0C, etc. holds Unit Type choices for property (B is starting Unit Type, C is number of Unit Types to check)
  • 4458-446F ~ Mercenary Unit equivalent of 12:4436
  • 4470-447C ~ if unit is buyable, A = 0; else, A = 2 (A is Unit Type)
  • 447D-448C ~ if unit is allowed by given unused lists, A = 0; else, A = 2
  • 448D-4497 ~ $4986 stuff, if unit is allowed, A sets corresponding bit; else, A = 0
  • 4498-44B7 ~ if Unit is at S-Rank, A = promoted Unit Type # * 2 + country bit; else, A = 0 (A is Unit #)
  • 44B8-44BF ~ promoted Unit Type #
  • 44C0-4509 ~ confirmed promotion procedure
  • 450A-4584 ~ establishes which surrounding units can supply the selected unit using $CD3A-$CD40
  • 4585-4596 ~ Unit's End Turn bit set
  • 4597-45DF ~ all Units for the given side have their End Turn bit reset and bit 7 for occupied terrain tiles reset as well (A is the given side)
  • 45E0-4617 ~ resets Supply Flag for all units on the given side (A is the given side)
  • 4618-4655 ~ A = number of units supplied (A is the given side)
  • 4656-46C7 ~ A = 0 if terrain is viable for resupply, -1 if not (A is Unit #, B is Unit Type)
  • 46C8-46DF ~ A = 0 if terrain is viable for repairs, -1 if not (A is Unit #, B is Unit Type)
  • 46E0-4740 ~ A = 0 if terrain is viable for repairs, -1 if not (A is Unit Type, B is terrain type)
  • 4741-4757 ~ Unit's 8th stat = Unit Type's Fuel
  • 4758-477C ~ Unit's 9th and 10th stats = Unit Type's Ammo (each weapon)
  • 477D-479E ~ recover HP (B = HP recovery amount)
  • 479F-47AC ~ A = used Movement Cost
  • 47AD-47CD ~ [CD44-CD76] holds selected unit's Movement Costs (A is Movement Type)
  • 47CE-4800 ~ [C6A8-C77F] holds units' Types and EXP values; every 4 bytes is set to 255
  • 4801-4836 ~ reserved units' stats established
  • 4837-4854 ~ [CD28-CD2F] holds weapon's name (A is Unit Type, C is 14 or 16)
  • 4855-4861 ~ A = weapon's used stat value (A is Weapon ID, C is used stat); HL is also set to [$5256 + 2A] + 1
  • 4862-48FB ~ CCED to CD08 hold both weapons' stats (for each weapon: Name (9 characters), Weapon ID, Current Ammo, Min Range, Max Range, Max Ammo) (A is Unit #)
  • 48FC-490A ~ A = used Weapon ATK (A is Unit Type, B is Weapon ID)
  • 490B-4925 ~ empties $D640 to $D95F
  • 4926-4949 ~ put unit's stats in [$D640 + B * 16] to [$D64F + B * 16] (A is Unit #)
  • 494A-4957 ~ HL = $D640 + A * 16
  • 4958-497E ~ put given army's stats in $D640 to $D95F
  • 497F-4985 ~ buyable units
  • 4986-49A5 ~ pointers for unused allowed unit lists
  • 49A5-4A0E ~ unused allowed unit lists
    • List 1 - Grunt and Buggy
    • List 2 - List 1 plus Convoy, Humvee, and APC
    • List 3 - List 2 plus Bazooka, Supply Truck, Artillery, and Hunter Tank
    • List 4 - List 3 plus Rocket Launcher, IFV, and MB Tank
    • List 5 - List 4 plus Anti-Air Tank and Transport Helicopter
    • List 6 - List 5 plus Work Car
    • List 7 - List 6 plus Anti-Air Missile Launcher and Gunship
    • List 8 - List 7 plus Lite Fighter
    • List 9 - List 8 plus Lite Attacker and Transport Plane
    • List 10 - List 9 plus Fighter, Attacker, and Bomber
    • List 11 - List 10 plus Supply Plane
    • List 12 - List 11 plus Small Aircraft Carrier and Lander
    • List 13 - List 12 plus Aegis Warship and Large Aircraft Carrier
    • List 14 - List 13 plus Ship Buster and Submarine
    • List 15 - List 14 plus Tanker
  • 4A0F-4A42 ~ promoted Unit Type #
  • 4A43-4AAC ~ Unit Type stat pointers
  • 4AAD-5255 ~ Unit Type stats
    • 0-9 ~ name characters
    • A ~ Max HP
    • B ~ Max Fuel
    • C ~ Movement Power
    • D ~ Transport Capacity
    • E ~ ?
      • 1 ~ Work Car, Supply Truck, Convoy, Rocket Launcher, IFV, Hunter Tank, MB Tank
      • 2 ~ AA Tank, Artillery
      • 3 - infantry, APC, AA Missile Launcher, Transport Helicopter, Lander, Tanker
      • 4 - Humvee, Gunship, Ship Buster, Transport Helicopter+
      • 5 - Buggy, Humvee+, Lite Attacker, Transport Plane, Supply Plane, Gunship+, Submarine
      • 6 - Buggy+, Lite Fighter, Attacker, Small Aircraft Carrier, Submarine+
      • 7 - Fighter, Lite Bomber, Bomber, Large Aircraft Carrier
      • 8 - Interceptor, Mercenary Bomber, Aegis Warship
      • 9 - Mercenary Ship
    • F ~ Fuel Upkeep
    • 10, 11 ~ Gold Cost / 100G
    • 12, 13 ~ Materials Cost
    • 14 ~ Primary Weapon Type
    • 15 ~ Primary Weapon Ammo
    • 16 ~ Secondary Weapon Type
    • 17 ~ Secondary Weapon Ammo
    • 18 ~ Unit Family
    • 19 ~ Movement Type
    • 1A ~ Carrying Type
    • 1B, 1C, 1D ~ Carried Type
    • 1E-22 ~ DEF values
    • 23 ~ Base Focus
    • 24 ~ Focus Loss
  • 5256-5297 ~ Weapon stat pointers (pointers)
  • 5298-54A7 ~ Weapon stats
    • 0~7 ~ name characters
    • 8 ~ Minimum Range
    • 9 ~ Maximum Range
    • A-E ~ ATK (Armor, Lite Land, Air, Ship, Sub)
    • F ~ Cost per shot
  • 54A8-54C5 ~ Movement Cost pointers
  • 54C6-561E ~ Movement Costs

Block 20 (04C000-050000)

  • 402F-403A ~ [$C631] = 1
  • 4031-403A ~ [($C631 + A)] = 1
  • 5DCC-5E1D ~ [$CA1A] = 7 + A/2, [$CA1B] = 0, [$CA1C] = 160 + A%2 * 16, [$CA1D] = 2 * ([$A00F + (A/8)] AND 2^(A%8)), [$CA21~CA4E] = [$A000~$A02D] or [$B000~$B02D]

Block 21 (050000-054000)

  • 5F8D-5FBC ~ Medal descriptions pointers
  • 5FBD-5FEC ~ Medal names pointers
  • 5FED-6148 ~ Medal names
  • 6149-6322 ~ Medal descriptions
  • 6323-6330 ~ Unobtained Medal description

Block 22 (054000-058000)

Block 23 (058000-05C000)

Block 24 (05C000-060000)

Block 25 (060000-064000)

Block 26 (064000-068000)

Block 27 (068000-06C000)

Block 28 (06C000-070000)

Block 29 (070000-074000)

Block 30 (074000-078000)

Block 31 (078000-07C000)

Block 32 (07C000-080000)

Block 33 (080000-084000)

Block 34 (084000-088000)

Block 35 (088000-08C000)

Block 36 (08C000-090000)

Block 37 (090000-094000)

Block 38 (094000-098000)

  • 4000-4059 ~ Campaign Mode slow clear dialogue pointers
  • 405A-40B3 ~ Campaign Mode briefing pointers
  • 40B4-40B5 ~ Campaign Mode defeat dialogue pointer
  • 40B6-410F ~ Campaign Mode fast clear dialogue pointers
  • 448C-4498 ~ digs up destination value (A is just cleared map, B is whether or not the map has been cleared fast)
  • 4499-44F2 ~ post-clear destinations table for Campaign, any value above $7F leads to an ending and its respective Medal instead (tabled in twos for each map, with Slow Clear destination listed first and Fast Clear destination listed second)
  • 4BA9-4BC8 ~ Beginner Mode briefing pointers
  • 4BC9-4BCA ~ Standard Mode briefing pointer
  • 4BCB-5BE8 ~ Beginner Mode briefing dialogue
  • 5BE9-5C14 ~ Standard Mode briefing dialogue

Block 39 (098000-09C000)

Block 40 (09C000-0A0000)

Block 41 (0A0000-0A4000)

  • 4000-4023 ~ [$CA1A] 3 bytes holds Beginner Map pointer, [$CA1D] bit 0 is set if map is already cleared, [$CA1E] is 0, [$CA1F] holds A, [$CA21~$CA4E] holds first 46 bytes of map with [$CA41~$CA48] holding maps name (A is Beginner Map #, [$C68D] holds cleared Beginner Mode maps)
  • 4024-4059 ~ [$CA1A] 3 bytes holds Campaign Map pointer, [$CA1D] bit 0 is set if map is already cleared, [$CA1D] bit 2 is set if [$C69D + (A/8)] AND 2^(A%8) = 1, [$CA1E] is 1, [$CA1F] holds A, [$CA21~$CA4E] holds first 46 bytes of map with [$CA41~$CA48] holding maps name (A is Campaign Map #, [$C68F] holds cleared Campaign Mode maps)
  • 405A-407D ~ [$CA1A] 3 bytes holds Standard Map pointer, [$CA1D] bit 0 is set if map is already cleared, [$CA1E] is 2, [$CA1F] holds A, [$CA21~$CA4E] holds first 46 bytes of map with [$CA41~$CA48] holding maps name (A is Standard Map #, [$C695] holds cleared Standard Mode maps)
  • 407E-409C ~ empties [$CA1A] to [$CA4F], then sets [$CA1A] 3 bytes to [HL + A * 3] 3 bytes, [$CA1E] to B, and [$CA1F] to A
  • 409D-40AD ~ empties [$CA1A] to [$CA4F]
  • 40EE-4134 ~ A = Standard Mode unlock status number ([$C695] 8 byte is cleared Standard Mode maps flags)
  • 4135-4148 ~ A = 1 if all Beginner Mode maps are cleared, 0 if not ([$C68D] 2 byte is cleared Beginner Mode maps flags)
  • 4149-4156 ~ if HL bits 0~C are all active, A = 1 (followed by AND A to handle flags); otherwise, end early with Zero Flag active
  • 4157-415F ~ A = Campaign Map Day limit (A = Campaign Map #)
  • 4160-4169 ~ A = Campaign Map fast Day limit (A = Campaign Map #)
  • 416A-41C3 ~ Campaign Mode map Day limits; each map is tabled for 2 bytes with hard limit then fast clear limit
  • 41C4-41CB ~ Beginner Mode map's Day limit (A is Beginner Map #)
  • 41CC-41DB ~ Beginner Mode map Day limits
  • 41DC-428F ~ Standard Mode map pointers
  • 4290-4292 ~ Demo 02 Map pointer
  • 4293-42C2 ~ Beginner Mode map pointers
  • 42C3-4349 ~ Campaign Mode map pointers

Block 42 (0A4000-0A8000)

Map data

Block 43 (0A8000-0AC000)

Map data

Block 44 (0AC000-0B0000)

Map data

Block 45 (0B0000-0B4000)

Map data (ends Standard, covers Beginner)

Block 46 (0B4000-0B8000)

Map data (campaign)

Block 47 (0B8000-0BC000)

Map data

Block 48 (0BC000-0C0000)

Map data

Block 49 (0C0000-0C4000)

Block 50 (0C4000-0C8000)

Block 51 (0C8000-0CC000)

  • 58AA-5911 ~ Unit description pointers
  • 5912-59B3 ~ Terrain description pointers
  • 59BC-6FE2 ~ Unit descriptions
  • 6FE3-7B6A ~ Terrain descriptions
  • 7B6B-7C92 ~ Fuel discussion
  • 7C93-7D21 ~ Focus discussion
  • 7D22-7DFC ~ Promotion discussion

Block 52 (0CC000-0D0000)

Dialogue stuff

Block 53 (0D0000-0D4000)

Empty (all FFs)

Block 54 (0D4000-0D8000)

Empty (all FFs)

Block 55 (0D8000-0DC000)

Empty (all FFs)

Block 56 (0DC000-0E0000)

Empty (all FFs)

Block 57 (0E0000-0E4000)

Empty (all FFs)

Block 58 (0E4000-0E8000)

Empty (all FFs)

Block 59 (0E8000-0EC000)

Empty (all FFs)

Block 60 (0EC000-0F0000)

Empty (all FFs)

Block 61 (0F0000-0F4000)

Empty (all FFs)

Block 62 (0F4000-0F8000)

Empty (all FFs)

Block 63 (0F8000-0FC000)

Block 64 (0FC000-100000)