Every note the source marks, with its line: BUG for a bug the original game has, kept with its fix behind BUGFIX; DEAD for code the cartridge keeps that cannot change the result; FAKEMATCH for a device that steers the compiler, by kind, with what it changes.
Untyped FAKEMATCH tags predate the kinds.
| Where | Note |
| include/graphics/graphics.h:14 | volatile makes every access to this cell a load or store of its |
| include/graphics/graphics.h:23 | volatile makes every access to this cell a load or store of its |
| include/lib/call.h:10 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:16 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:22 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:28 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:35 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:42 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:50 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:56 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:62 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:68 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:74 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:80 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:87 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/lib/call.h:94 | forwarding through the pointer prevents GCC 2.96 from sharing |
| include/menu_list.h:70 | the one-pass block keeps both attribute words ahead of the stores |
| include/oambuf.h:12 | the OAM shadow words are volatile, the form the bytes prove in all |
| include/ram_buffer.h:30 | Ram_WorkSlot stays gWorkSlot's linked address as a constant |
| include/ram_buffer.h:39 | Ram_WorkSlot stays gWorkSlot's linked address as a constant |
| include/sound/audio_engine_types.h:394 | volatile steers library C only: without it |
| include/system/callback_scheduler.h:39 | volatile makes every access to this cell a load or store of its |
| include/system/mem.h:17 | the inline call prevents size sharing, avoiding 12 extra fade |
| include/system/serial_runtime.h:134 | volatile makes every access to this cell a load or store of its |
| src/battle/battle/sprites.c:164 | below. |
| src/debug/level.c:438 | an unread 32-byte text buffer, the native frame's 32 extra |
| src/debug/test.c:406 | the benchmark's buffer, unused outside Japanese, keeps the |
| src/effect/parts/atalanta.c:102 | the one-pass block keeps the table address after the second |
| src/effect/parts/atalanta.c:254 | the named result pointer gives the 124-byte frame |
| src/effect/parts/blitter.c:322 | one-pass blocks keep each writing step together and in list |
| src/effect/parts/blitter.c:329 | a one-pass block, as PUT's tag explains; written as plain |
| src/effect/parts/blitter.c:352 | a one-pass block, as PUT's tag explains; written as a plain |
| src/effect/parts/bolt.c:47 | frame local: the unused second blitter word fills four bytes of |
| src/effect/parts/casting_impact.c:52 | inline scope keeps each resource call's arguments local for |
| src/effect/parts/casting_impact.c:61 | keep packing arguments within their own inline scope; |
| src/effect/parts/casting_impact.c:70 | inline scope reloads each image address at its drawing |
| src/effect/parts/casting_impact.c:79 | derive height inside the inline scope so the dimension stores |
| src/effect/parts/casting_impact.c:90 | subtract the scrolled part inside the drawing scope; |
| src/effect/parts/casting_impact.c:100 | forwarding inline; the cropped height stays inside its scope. |
| src/effect/parts/casting_impact.c:272 | local dimensions preserve the packing argument order; as |
| src/effect/parts/casting_impact.c:388 | retain each output pointer while preparing its call; as |
| src/effect/parts/casting_impact.c:482 | restart the pointer's lifetime after gathering so the |
| src/effect/parts/casting_impact.c:1200 | a zero offset known only after gcse keeps the origin copy |
| src/effect/parts/casting_impact.c:1211 | the zero bias above; see there. |
| src/effect/parts/casting_impact.c:1250 | calculate each center before the shared centered draw; |
| src/effect/parts/condemn.c:38 | the unused second position gives the frame its native 76 |
| src/effect/parts/condemn.c:49 | the zero is held in sl through the setup calls. |
| src/effect/parts/condemn.c:170 | i is 160 here, so this is 0: a literal 0 |
| src/effect/parts/death_plunge.c:40 | frame local: an unused second blitter word fills the frame's |
| src/effect/parts/death_plunge.c:410 | the cancelling pointer updates retain work's allocation |
| src/effect/parts/death_plunge.c:504 | cancelling frame updates preserve the allocation lifetimes; |
| src/effect/parts/death_plunge.c:548 | never read: the native frame keeps 12 unused bytes at |
| src/effect/parts/djinn_heal.c:197 | the size series A draws its sparks |
| src/effect/parts/eruption.c:51 | only draw[0] is used; the unused second word fills four bytes |
| src/effect/parts/falling.c:119 | the slot read through union HeapState keeps its load and |
| src/effect/parts/frost.c:59 | the motes, columns, chips and puffs draw through a pointer |
| src/effect/parts/growth.c:121 | the columns draw through a second pointer to the pair, whose |
| src/effect/parts/growth.c:249 | the scan reuses length as its puff pointer; as a |
| src/effect/parts/judgment.c:171 | the amplitude is a value the native hoists into sl; as 255 |
| src/effect/parts/judgment.c:174 | the velocities' zero is a value loop.c hoists into r8; as 0 |
| src/effect/parts/judgment.c:194 | the frame > 143 block calls through a pointer to the slot |
| src/effect/parts/judgment.c:398 | the height is a value, so high / 2 is hoisted into fp; as |
| src/effect/parts/judgment.c:619 | palette RAM through a volatile pointer: the native keeps |
| src/effect/parts/judgment.c:723 | the size is a value, so 5 and 20 are hoisted into fp and sl; |
| src/effect/parts/judgment.c:759 | a dead branch restores the label CSE and reload saw |
| src/effect/parts/judgment.c:800 | a dead branch restores the label CSE and reload saw |
| src/effect/parts/judgment.c:972 | forced temporary: the shake value through an s32 keeps the |
| src/effect/parts/lobbed_shells.c:203 | restores the CSE block boundary after the hit block, so |
| src/effect/parts/lobbed_shells.c:235 | the table address loads before the row; as |
| src/effect/parts/lobbed_shells.c:247 | restores the CSE block boundary between group's |
| src/effect/parts/neptune.c:526 | the mask set before the call that it masks; as |
| src/effect/parts/orbiting.c:130 | only draw[0] is used: the second word fills |
| src/effect/parts/orbiting.c:159 | a one-pass block sets the seed counter before its pointer; as |
| src/effect/parts/orbiting.c:186 | pins rec to r0 so loop.c cannot hoist the point's address |
| src/effect/parts/orbiting.c:196 | a one-pass block puts this store before the spark |
| src/effect/parts/particle_streams.c:159 | test through direction so CSE retains the mode reload in this |
| src/effect/parts/particle_streams.c:302 | count fixed in r2 keeps the division temp canonical in cse |
| src/effect/parts/particle_streams.c:306 | work's copy in r0; else it and the 0x778c reload swap r0/r1. |
| src/effect/parts/particle_streams.c:315 | count read and base passed through keep count's load apart |
| src/effect/parts/particle_streams.c:330 | hold takes r7 across the call, so heat takes r4 and its |
| src/effect/parts/particle_streams.c:334 | r6 is clobbered across the call. |
| src/effect/parts/particle_streams.c:338 | hold's use after the call. |
| src/effect/parts/particle_streams.c:349 | reuse blue for the biased signed quotient. A |
| src/effect/parts/particle_streams.c:353 | level in r2; as an ordinary local, 42 of 1532 |
| src/effect/parts/planet_diver.c:180 | the mask set before the Random16() call it masks; as |
| src/effect/parts/plasma.c:355 | this fill calls the fixed entry itself; |
| src/effect/parts/positions.c:119 | the unused 12-byte vector preserves both stack |
| src/effect/parts/projectiles.c:707 | cancelling updates under if (target) end CSE |
| src/effect/parts/projectiles.c:718 | the same CSE block end keeps the opposite sign |
| src/effect/parts/ramses.c:269 | the mask set before the Random16() call it masks; as |
| src/effect/parts/rushing_strike.c:77 | the blitter and camera declarations and store order keep the |
| src/effect/parts/spider_web.c:44 | only draw[0] is used: the second word fills |
| src/effect/parts/spider_web.c:155 | pins the frame counter to r9, as native; plain, it takes sl and |
| src/effect/parts/spider_web.c:160 | size and transparent first hold the slot table and blend |
| src/effect/parts/stars.c:34 | only draw[0] is used; the unused second word fills four bytes |
| src/effect/parts/stars.c:216 | only draw[0] is used; the unused second word fills four bytes |
| src/effect/parts/streaks.c:377 | the mask set before the Random16() call it masks; as |
| src/effect/parts/target_motes.c:475 | the family's blitter pair: this effect loads |
| src/effect/parts/thor.c:37 | the mask set before the Random16() call it masks; as \ |
| src/effect/parts/thor.c:83 | frame local: the unused second blitter word fills four bytes of |
| src/effect/parts/thor.c:336 | the barrier keeps fullWidth's 32 in this loop's |
| src/effect/parts/titan_blade.c:104 | the mask is loaded into the magnitude before the random word |
| src/game/game/battle_calc.c:292 | the psySeal, confusion and haunt reads go through state[offset] |
| src/game/game/levels.c:205 | the slot offset index * 4 + 88 is recomputed each pass as the |
| src/game/game/units.c:81 | a low-register use keeps mov r3, lr; without it, 1 of 28 |
| src/game/game/units.c:204 | the one-pass block keeps the defense load after the |
| src/graphics/credits/credits.c:1058 | unused local; its 32 bytes are the native frame space no |
| src/graphics/title/intro.c:113 | the OAM shadow it builds is struct OamShadow, volatile words |
| src/graphics/title/intro.c:626 | needed to match: workIndex carries the decode destination |
| src/graphics/title/intro.c:795 | the reversible XOR initialization of green folds late, |
| src/graphics/title/intro.c:804 | needed to match: green is 8, so this pair changes no |
| src/runtime/runtime/fade.c:45 | an explicit libgcc call clobbers memory, so the zero test |
| src/runtime/runtime/frame.c:10 | the restart entry is called as returning s32, so its address is |
| src/runtime/runtime/frame.c:251 | tying the old base to the hardware read keeps the 8-byte |
| src/runtime/runtime/frame.c:256 | needed to match: the volatile reread keeps this saved-size |
| src/runtime/runtime/frame.c:264 | complementary conditions, which emit nothing, end the |
| src/runtime/runtime/scheduler.c:48 | the initializer repeats the first pass's assignment, so the |
| src/runtime/runtime/serial.c:34 | IRQ_LOCK written out with the IME address set inside the save |
| src/runtime/runtime/serial.c:56 | Dma_Fill32's fill word is volatile, so the zero is stored |
| src/runtime/runtime/serial.c:247 | volatile keeps the second load of sr->sendBuffer[0], as the |
| src/runtime/runtime/serial.c:549 | gSerialSendSize and gSerialBlockSequence are volatile |
| src/runtime/runtime/serial.c:556 | the halfword record is a HImode 1 loaded from the pool into r8 |
| src/runtime/runtime/transform.c:269 | the normalization keeps its CSE block, so the third product |
| src/scene/altmiller_cave.c:1962 | the three callbacks are stored as s32, so the entrance read |
| src/scene/colosseum_entrance.c:50 | forwarded inline for Event_CrowdRecognizesIsaac's one call; |
| src/scene/colosso_log.c:718 | the last place is set at the top as a forced temporary, so the |
| src/scene/colosso_log.c:1470 | called through a cast to the s32 call type the bytes show, |
| src/scene/colosso_log.c:1802 | called through a cast to the s32 call type the bytes show, its |
| src/scene/colosso_log.c:1813 | called through the s32 cast, its result discarded, as in the |
| src/scene/colosso_log.c:1955 | the void function is called as returning s32, which loads r1 |
| src/scene/colosso_log.c:1961 | called as returning s32, as in the first arm; by its |
| src/scene/colosso_river.c:496 | base is 0 from the top of the function, so 0 - approach + 1 is |
| src/scene/colosso_river.c:965 | called as returning a value, the call sets r0 after both |
| src/scene/colosso_river.c:1019 | called through a cast to the s32 call type the bytes show, its |
| src/scene/colosso_river.c:1156 | called through a cast to the s32 call type the bytes show, its |
| src/scene/colosso_river.c:1167 | called through a cast to the s32 call type the bytes show, its |
| src/scene/colosso_river.c:1316 | the void function is called as returning s32, the call the |
| src/scene/colosso_river.c:1322 | the same call as returning s32; by its prototype, 2 |
| src/scene/colosso_wall.c:709 | resultBase, set to 2 at the top, keeps the sum unfolded; as |
| src/scene/colosso_wall.c:1057 | called through a cast to the s32 call type the bytes show, |
| src/scene/colosso_wall.c:1115 | called through a cast to the s32 call type the bytes show, |
| src/scene/colosso_wall.c:1390 | called through a cast to the s32 call type the bytes show, its |
| src/scene/colosso_wall.c:1400 | called through the s32 cast like the call above; as a direct |
| src/scene/colosso_wall.c:1547 | called through a cast to the s32 call type the bytes show; as |
| src/scene/colosso_wall.c:1554 | the same cast as above; as a call by its prototype, 2 |
| src/scene/crossbone_isle.c:292 | retain the scalar scene-slot address calculation; direct |
| src/scene/crossbone_isle_pillar_rooms.c:362 | a one-pass block around the object and height issues the |
| src/scene/crossbone_isle_pillar_rooms.c:989 | the u8 view keeps these flag updates out of the record's |
| src/scene/imil.c:149 | retain row 10's talk-facing byte access (10 * 24 + 22); |
| src/scene/imil.c:538 | called through a cast to the value-returning call the bytes |
| src/scene/imil.c:1292 | retain the byte access to steeringFlags; as the direct field, |
| src/scene/imil_fuchin_falls.c:1126 | needed to match: the shared zero/address-word lifetime avoids |
| src/scene/imil_fuchin_falls.c:1301 | needed to match: copying three scripts keeps the 12-byte frame |
| src/scene/kalay_tolbi_docks.c:310 | needed to match: one coin-label selector preserves its saved |
| src/scene/kolima_forest_bend.c:417 | y is updated through an s32 lvalue, since the union's s16 |
| src/scene/kolima_forest_bridge.c:1090 | called through a cast to the call type the bytes show; called by |
| src/scene/lamakan_desert.c:453 | pins the byte offset to r6, where the game keeps it with the |
| src/scene/lemurian_ship.c:206 | volatile restores the form the bytes prove: blend lives at sp+18 |
| src/scene/lemurian_ship.c:600 | volatile restores the form the bytes prove: cnt lives at sp+6 |
| src/scene/lemurian_ship.c:696 | volatile restores the form the bytes prove: cnt lives at sp+2 |
| src/scene/lunpa_fortress.c:3110 | the three section attributes below place non-const tables in |
| src/scene/mccoy_palace.c:103 | a byte view of placement rows 6 to 9 keeps the native |
| src/scene/mccoy_palace_garden.c:195 | a value-returning cast loads the actor id after the two |
| src/scene/mccoy_palace_garden.c:199 | the one-pass block keeps r0 last among the call above's |
| src/scene/mercury_lighthouse.c:564 | width and height in locals, so loop.c hoists copyWidth's 2 |
| src/scene/mercury_lighthouse.c:2477 | called through an unprototyped cast, which loads r1 before |
| src/scene/mercury_lighthouse.c:2489 | called through an unprototyped cast, which loads r1 |
| src/scene/mercury_lighthouse_aerie.c:1722 | the byte view keeps this store ahead of the beacon's reload; the |
| src/scene/sol_sanctum_elemental_star_room.c:536 | the bit held in the loop counter itemSlot keeps the 1 in r5 |
| src/scene/sol_sanctum_luna_sol_rooms.c:1174 | the zero goes through the sprite variable, whose pseudo has |
| src/scene/sol_sanctum_luna_sol_rooms.c:1208 | the mask temporary puts the flags in r2 and the motion |
| src/scene/tolbi_ship_deck.c:1396 | the do/while sets r0 = 21 first, straight after the call; as a |
| src/scene/tolbi_ship_deck.c:1798 | the work pointer read as a word may alias the facing stores, so |
| src/scene/tolbi_spring.c:570 | keep message in r10 and label in r9; as whole marker ids, the |
| src/scene/tolbi_spring.c:575 | keep the coin label in r9; otherwise the repeated marker takes |
| src/scene/tolbi_spring.c:709 | the pointer pair recomputes the prize-weight base in r0 |
| src/scene/tolbi_spring.c:715 | keeps the slot in r1 and state + 1 in r0; as a plain |
| src/scene/tolbi_spring.c:726 | keeps state + 1 in r0 as the native does. |
| src/scene/tolbi_spring.c:730 | the native recomputes state + 1 after the call. |
| src/scene/tret_tree_interiors.c:845 | the explicit libgcc call keeps the final count's reload in r3; |
| src/scene/tret_tree_interiors.c:880 | the counter pointer is taken again here so it is dead across |
| src/scene/vale.c:1588 | repairActor's dead zero initializer and the stoppedMotionFlags |
| src/scene/vale_home.c:84 | forwarding inline for Event_DepartForQuest's three calls; |
| src/scene/vale_home.c:94 | forwarding inline called as returning a value, its result |
| src/scene/vault.c:960 | reuse the coordinate local for the direction mask. With the |
| src/scene/vault.c:988 | preserve the sprite-flags address scheduling boundary. As |
| src/scene/vault_cave.c:165 | DIRECTION_STEP reads the s16-pair table (x high, z low) as one |
| src/scene/vault_interiors.c:2984 | the used-stop test reads the stopIndex through a volatile |
| src/scene/vault_interiors.c:3108 | a dead store keeps this empty branch through the first jump |
| src/scene/venus_lighthouse.c:1794 | forced temporary: the search counter's zero, set before the |
| src/scene/venus_lighthouse.c:2463 | the empty asm gives the zero the refs that put it in r3 |
| src/scene/venus_lighthouse.c:2467 | needed to match: this CSE block keeps the blend |
| src/scene/venus_lighthouse.c:2526 | a value-returning cast keeps this call from cross-jumping |
| src/scene/world_map.c:1727 | a second clear through a byte pointer, removed after reload, |
| src/shop/shop/artifacts.c:348 | only the copy read is volatile, so its lifetime stays |
| src/window/battle_command/command_row.c:128 | vram, offset and mask keep the row loop's index |
| src/window/battle_command/command_row.c:135 | tmp, set twice, is no giv, so the tile is |
| src/window/battle_command/command_row.c:168 | as in mode 1: vram, offset and mask keep the tile |
| src/window/battle_command/command_row.c:174 | needed to match: tmp, as in mode 1 (271 differ |
| src/window/battle_command/debug.c:448 | the count-derived mask keeps the mask in r9 and work in fp; as |
| src/window/battle_command/debug.c:451 | defining the offset before the loop keeps its load in r1; |
| src/window/battle_command/djinn_menu.c:160 | the flag, zero on every continuation, keeps k an |
| src/window/battle_command/djinn_preview.c:143 | this char store and the two typed stores below keep the |
| src/window/battle_command/djinn_preview.c:158 | typed like the window pointer, the word store waits for the |
| src/window/battle_command/djinn_preview.c:163 | a pointer-typed clear does not wait for the x and y stores |
| src/window/battle_command/icon_menu.c:103 | needed to match: reading the y halfword through attr |
| src/window/battle_command/joined.c:34 | the shared cursor union preserves pointer-store ordering; an |
| src/window/battle_command/party_commands.c:212 | called through a cast as returning a doubleword, the call |
| src/window/battle_command/save.c:112 | the signed cursor from the party tail keeps the native literal |
| src/window/battle_command/summon_menu.c:230 | the cursor pushed through sprite, re-pointed at it here, keeps |
| src/window/battle_command/targets.c:81 | this value-preserving null initializer keeps infoWin in r10; |
| src/window/battle_command/targets.c:192 | the separate switch arms, which emit no branch, end CSE |
| src/window/glyph_arm.c:65 | these records reserve the native frame's 64-byte unused area. |
| src/window/glyph_arm.c:119 | needed to match: the row increment is written in both |
| src/window/window/decode.c:691 | value counts the letters, compared unsigned, for the |
| src/window/window/frames.c:353 | never read: the native frame keeps 8 bytes above the two |
| src/window/window/icons.c:191 | three more names of the one table keep each case's own literal |
| src/window/window/options.c:312 | the shared cursor union keeps pointer stores before window |
| src/window/window/selection.c:14 | the helper takes the node's base field, so each row store forms |
| src/window/window/sprites.c:226 | needed to match: the embedded OAM view preserves |
| src/window/window/sprites.c:250 | this XOR pair folds away but keeps work and base as separate |
| src/window/window/sprites.c:292 | needed to match: the embedded OAM view preserves |
| src/window/window/sprites.c:429 | needed to match: the unsigned halfword read of the x cell; a |
| src/window/window/text_tiles.c:83 | needed to match: an unread 32-byte reserve, the native frame's |
| src/window/window/windows.c:480 | storing the new tail as a RenderOutput * keeps both stores in |