• Contact
  • Journal
  • Home
  • Arcade
  • Frogger (Sound)
  • RAMUse
  • Site
  • Page
  • Amiga
    • Rainbow Islands
      • 1loader-dec
      • 1loader
      • boot
      • orig-boot
      • Journal
  • Arcade
    • Asteroids 80%
      • Hardware
      • RAMUse
      • Code

      • DVG
      • VectorROM

      • Journal
    • Crazy Climber 1%
      • BigSpriteGraphics.pdf
      • Buildings.pdf
      • cclimber.asm
      • CharEnc.inc
      • CrazyClimberMemoryMapInfo.pdf
      • GraphicsAndCharacterAssetInfo.pdf
      • MemoryMap.inc
    • Defender 75%
      • RAMUse
      • Hardware
      • Bank1
      • Bank2
      • Bank3
      • Bank7
      • BankFixed
      • Mapping.txt
      • SoundHardware
      • SoundRAMUse
      • SoundCode
      • Defender-Theory-Early.pdf
      • Defender-Theory-Later.pdf
      • Defender.CPU.jpg
      • Defender.ROM.B&W.jpg
      • Defender.Vid.B&W.jpg
      • SoundROM.txt
    • DonkeyKong
      • Hardware
      • RAMUse
      • Code
    • Frogger (Sound)
      • SoundHardware
      • SoundRAMUse
      • SoundCode

      • Hardware
      • RAMUse
      • Code

      • GFX

      • Journal
    • Galaga 5%
      • CPU1 (Main)
      • CPU2 (Secondary)
      • CPU3 (Sound)
      • GFX1 (Characters)
      • GFX2 (Sprites)
      • PROMcolors
      • PROMpaletteChar
      • PROMpaletteSprite

      • CPU1Fix

      • Journal
    • Moon Patrol 75%
      • Hardware
      • RAMUse
      • Code

      • GFX1 (Text)
      • GFX2 (Sprites)
      • GFX3 (Mountains)
      • GFX4 (Hills)
      • GFX5 (City)
      • ImageBackgroundColors
      • SpriteColors
      • SpriteColorSets
      • TextColors

      • MoonPatrolSound
      • SoundHardware
      • SoundRAMUse
      • SoundCode

      • Journal
    • Omega Race 10%
      • Hardware
      • RAMUse
      • MainBoard

      • SoundHardware
      • SoundRAMUse
      • SoundBoard

      • DVGPROM
      • VectorROM

      • Journal
    • Phoenix 90%
      • Hardware
      • RAMUse
      • Code

      • Background
      • Foreground

      • Journal

      • Scramble HHi
        • phoenixj-func-main2.pdf
        • phoenixj-func-main2.scap
        • phoenixj.asm-may2025.txt
        • phoenixj.asm-may2025.txt.pdf
    • Space Invaders
      • invaders.asm
      • Hardware
      • RAMUse
      • Code

      • Journal
    • The Pit
      • Hardware
      • RAMUse
      • Code
    • Time Pilot (Sound)
      • SoundHardware
      • SoundRAMUse
      • SoundCode

      • Hardware
      • RAMUse
      • Code

      • Journal
    • Sea Wolf 1%
      • Hardware
      • RAMUse
      • Code

      • Journal
    • Scramble 1%
      • SoundHardware
      • SoundRAMUse
      • SoundCode

      • Journal
  • Atari2600
    • Stella (Hardware Info)
    • Asteroids 5%
      • RAMUse
      • Code

      • Journal
    • Battle Zone 1%
      • RAMUse
      • Code

      • Journal
    • Chess 1%
      • RAMUse
      • Code

      • Journal
    • Combat 10%
      • RAMUse
      • Code
      • CodePAL

      • Journal
    • Double Gap
      • Code
      • DoubleGap.asm

      • Journal
    • Entombed 1%
      • RAMUse
      • Code

      • Journal
    • ET 1%
      • RAMUse
      • Code

      • Journal
    • Burger Time 1%
      • RAMUse
      • CodeBank0
      • CodeBank1
      • CodeBank2
      • CodeBank3
      • CodeBank4
      • CodeBank5
      • CodeBank6
      • CodeBank7

      • Journal
    • Missile Command 1%
      • RAMUse
      • Code

      • Journal
    • Space Invaders 1%
      • RAMUse
      • Code

      • Journal
  • ColossalCave
    • CodeOrg
    • DataOrg

    • Code350
    • Data350
  • CoCo
    • Hardware
    • Early Work
    • Pyramid
      • RAMUse
      • Code

      • Journal
    • Raaka Tu
      • RAMUse
      • Code

      • Journal
    • Bedlam
      • RAMUse
      • Code

      • Journal
    • Madness & Minotaur
      • Walk Through
        • after_start.txt
        • after_start.cas
        • after_1.txt
        • after_1.cas
        • after_2.txt
        • after_2.cas
        • after_3.txt
        • after_3.cas
        • after_4.txt
        • after_4.cas
        • after_5.txt
        • after_5.cas
        • after_6.txt
        • after_6.cas
        • after_7.txt
        • after_7.cas
        • after_8.txt
        • after_8.cas
        • after_9.txt
        • after_9.cas
        • after_10.txt
        • after_10.cas
        • after_11.txt
        • after_11.cas
        • after_12.txt
        • after_12.cas
        • after_13.txt
        • after_13.cas
        • after_14.txt
        • after_14.cas
        • after_15.txt
        • after_15.cas
        • after_16.txt
        • after_16.cas
        • after_17.txt
        • after_17.cas
        • after_18.txt
        • after_18.cas
        • after_19.txt
        • after_19.cas
        • after_20.txt
        • after_20.cas
        • after_21.txt
        • after_21.cas
        • after_22.txt
        • after_22.cas
        • after_23.txt
        • after_23.cas
        • after_24.txt
        • after_24.cas
        • after_25.txt
        • after_25.cas
      • RAMUse
      • Code

      • SaveGameViewer

      • Journal
    • Mega-Bug
      • RAMUse
      • Code

      • Journal
    • Popcorn
      • RAMUse
      • Code

      • Journal
    • Daggorath
      • RAMUse
      • Code

      • Level Maps

      • Journal
    • Downland 5%
      • RAMUse
      • Code

      • Journal
    • Audio Analyzer 5%
      • RAMUse
      • Code

      • Journal
    • Doubleback
      • RAMUse
      • Code

      • Journal
  • NES
    • Zelda 5%
      • Hardware
      • RAMUse
      • Bank0
      • Bank1
      • Bank2
      • Bank3
      • Bank4
      • Bank5
      • Bank6
      • Bank7

      • Journal
    • Kid Icarus 1%
      • Hardware
      • RAMUse
      • Bank0
      • Bank1
      • Bank2
      • Bank3
      • Bank4
      • Bank5
      • Bank6
      • Bank7

      • Journal
  • Gameboy
    • Hardware
    • Link's Awakening 1%
      • RAMUse
      • Bank00
      • Bank01
      • Bank02
      • Bank03
      • Bank04
      • Bank05
      • Bank06
      • Bank07
      • Bank08
      • Bank09
      • Bank0A
      • Bank0B
      • Bank0C
      • Bank0D
      • Bank0E
      • Bank0F
      • Bank10
      • Bank11
      • Bank12
      • Bank13
      • Bank14
      • Bank15
      • Bank16
      • Bank17
      • Bank18
      • Bank19
      • Bank1A
      • Bank1B
      • Bank1C
      • Bank1D
      • Bank1E
      • Bank1F

      • Journal
    • Tetris 1%
      • RAMUse
      • Code

      • Journal
  • TRS80
    • HardwareLevel2
    • HardwareLevel1
    • HardwareDisk
    • HauntedHouse
      • RAMUse1
      • Code1
      • RAMUse2
      • Code2

      • Journal
    • Pyramid
      • RAMUse
      • Code

      • RAMUse1
      • Code1

      • Journal
    • RaakaTu
      • RAMUse
      • Code

      • Journal
    • Bedlam
      • RAMUse
      • Code

      • Journal
    • Xenos
      • RAMUse
      • Code
      • Section1
      • Section2
      • Section3
      • Section4
      • Section5
      • Section6
      • Section7
      • Section8
      • Section9
      • SSVDOBJS
      • USVDOBJS

      • Journal
  • Virus
    • Morris Worm 1%
      • Journal
    • Stoned
      • Journal

  • Tools
    • Blend
      • blend.zip

      • Journal
  • RAM Usage

RAM Usage

Work RAM lives at `0x8000`–`0x87FF`. Each name below describes the cell by its role in the running game; the hex address is the stable identity. Cells that share a byte, or whose role is only partly pinned, carry a terse caveat.

Address Name Description
8001 scrollCopySrcPtr scroll-copy source-pointer scratch (word); blitScrollTileGrid saves the source pointer here and the per-column loop reloads it
8003 scrollCopyRowcount scroll-copy row-count scratch; blitScrollTileGrid saves the row count here and the per-column loop reloads it
8004 holdFlag hold flag / object-frog hit flag; stampHomeBaySlot stamps the slot but leaves the selector pending when non-zero, flagSpriteObjectFrogHit sets it to 1 (with gate loc_842c) when a sprite object overlaps the frog
8007 objectReady0 object-ready flag; loc_1952 sets it to 1 after the frog render (with 0x8009/0x800b)
8008 spriteShadowSrcBase work-RAM source of the per-frame sprite-shadow DMA (0x8008-0x803f, nibble-swapped, -> OBJRAM 0xb008)
8009 objectReady1 object-ready flag; loc_1952 sets it to 1 after the frog render
800b objectReady2 object-ready flag; loc_1952 sets it to 1 after the frog render
800c liveObjectPage demo object block base; clearObjectBlocksAndMirrorToObjRam clears 44 bytes here + mirrors 43 to OBJRAM, swapOutActivePlayerPages banks/restores its 43-byte object page
800d objectAnimState800d object-animation state block base; seedObjectAnimationState seeds 10 stride-2 cells (0x800d-0x801f) from a fixed table at board init
800f demoScrollRegister demo scroll register; loc_0de0 writes 3 here (paired with OBJECT_ANIM_STATE_800D) each dwell tick
8014 freeRunningPosCounter free-running position counter (rises +1/frame, wraps 0xff->0x00, independent of the frog); sprite-object motion arms drift each object toward it -- NOT the frog X (frog X is 0x8044/0x8047)
8015 objectAnimState8015 object-animation state cell in the 0x800d-0x801f block; dispatchGameModeFrame zeroes it on the mode-5 reset, seedObjectAnimationState seeds it at board init
8019 objectAnimState8019 object/animation-state cell in the 0x800d-0x801f block; renderMode3ScoreRankingScreen seeds it =3 at the mode-3 ranking-screen draw (a work cell, not a screen-id)
801b introCounter801b intro counter; loc_2d88 seeds it to 5 during the mode-2 setup -- ALSO a mode-4 sprite-record CODE cell renderMode4PointTablePhase seeds =3 (-> OBJRAM); shared work RAM, per-mode use
801d pointTableSpriteAttr801d mode-4 point-table sprite-record ATTR/Y field; renderMode4PointTablePhase phase 4 seeds it 6 (-> OBJRAM 0xB01d)
801f objectAnimState801f top of the 0x800d-0x801f object/animation work block; base of renderMode3ScoreRankingScreen's 5-cell 4-strided clear (0x801f/8023/8027/802b/802f) that wipes leftover attract-demo objects off the ranking page
8021 objectAnimState8021 object-animation cell block base; seedObjectAnimationState seeds 14 stride-2 cells (0x8021-0x803b) from a fixed table at board init -- renderMode4PointTablePhase writes a mode-4 sprite CODE (=3) into this same object table
8023 screenModeState screen/mode state byte; blitPlayerSelectPrompt sets it to 3 on the two-player prompt arm -- ALSO a mode-4 sprite-record ATTR/Y field renderMode4PointTablePhase seeds =6 (-> OBJRAM); shared, per-mode use
8027 pointTableSpriteCode8027 mode-4 point-table sprite-record CODE field; renderMode4PointTablePhase phase 4 seeds it 3 (-> OBJRAM 0xB027)
8029 pointTableSpriteAttr8029 mode-4 point-table sprite-record ATTR/Y field; renderMode4PointTablePhase phase 4 seeds it 6 (-> OBJRAM 0xB029)
802b introCounter802b intro counter; loc_2d88 seeds it to 3 (also the store target of loc_0c4a) -- ALSO re-stamped =4 by placeScoreRankMarkers on the mode-3 ranking screen (rank-marker tile)
802d pointTableSpriteCode802d mode-4 point-table sprite-record CODE field; renderMode4PointTablePhase phase 4 seeds it 3 (-> OBJRAM 0xB02d)
802f laneLowBoundSelector lane low-bound selector; loc_12e4 branches on it (<128 vs >=128) to pick the offset (12 vs 3) added to FROG_X — also a mode-4 sprite ATTR/Y field renderMode4PointTablePhase seeds =6; shared, per-mode use
8039 mode3StripState mode-3 final-strip state cell; zeroed by blitMode3FinalStrip before the strip blit
803f objramCol3fAttrShadow work-RAM shadow of OBJRAM col-0x3f attribute byte 0xB03F (DMA'd 0x8007-803f -> 0xb007-b03f each frame); display routines write it (never read as a flag) to set col 0x3f's attribute (not a page-swap-done flag)
8040 flySpriteX fly sprite X / base of the 4-cell block armHomeGoalSprite arms; driveFlyPatrol writes FLY_DRIFT_COUNTER + path-table offset, armHomeGoalSprite arms the lead byte + fixed tail 25,3,16
8041 flySpriteCode fly sprite code; driveFlyPatrol sets it at the timer midpoint (33 or flipped 0xA1) and to the turn sprite (30) at an endpoint
8043 flySpriteY fly/goal sprite Y (byte3 of the 0x8040-0x8043 block, FLY_SPRITE_X base); cocktail +2 source for OBJRAM 0xb043
8044 frogX frog X (game-space horizontal; watched 0x84->0x90 as the demo frog moved right) and frog object block base; activateFrogObject/resetFrogObject write the object bytes, the move dispatcher scans lanes against it
8045 frogSpriteCode frog sprite/tile code; activateFrogObject clears it on activate, the river-ride handlers stamp the ride/move/home tile codes into it
8046 frogObjAttr frog object attribute byte (between the sprite code and Y); set to 7 as the death phase advances
8047 frogY frog Y / row (game-space vertical position); frog object sub-field -- activateFrogObject clears it when activating the frog, the move dispatcher keys its lane-scan arm on it
8048 spriteObjectSlotA sprite-object slot A base (the IY slot the sprite-object dispatchers write; blitSpriteShadow mirrors 6x4 bytes to 0xb048)
8050 spriteObjectSlotASecond IY slot for dispatcher-A's 2nd pass (level count >= 6)
8058 spriteObjectSlotB shared 4-byte sprite-object block; loc_2bab clears it (with the 16-byte IX struct) when an object reaches its target and despawns
805c goalAwardRecord home-bay goal-award 4-byte record (0x805C-5F); sub_2673 writes it on a home arrival and starts the goal-celebration countdown (0xA0), clearFourByteCounterBlock zeros it on drain (NOT a generic counter, not on the river-ride path)
80ff laneObjectIndex lane-object walk index (0..10); moveLaneObjectsAndCarryFrog increments it per object, wrapping to 0 after object 10 — also the base of the 183-byte per-player object page swapIn/swapOutActivePlayerPages bank
8100 spriteBlock2Base second work-RAM sprite block base; clearObjectBlocksAndMirrorToObjRam zeroes 99 bytes from here
8101 figureAnimPhase animateTwoPairFigure idle-clears the figure-animation phase when this is 0, else runs the animation
8107 scrollEdgeFlag scroll edge flag; stampScrollRevealColumn clears it on the 128/176 arm and sets it to 1 on the 160 arm
8108 scrollWrapLatch scroll wrap-latch; blitScrollBand raises it to 1 on the mode-80 phase and clears it on the mode-48/96 phases
8109 laneObjlist8109 loc_12e4 scans it as a lane object list (count byte then object X positions, band width 31); loc_1058 arms both plot cursors (IX/IY) to it for the frog-anim render loop
8110 scrollStampPhase scroll-phase selector; stampScrollRevealColumn dispatches on it (80/208, 128/176, 160) to pick the stamp table
8111 scrollBandPhase scroll-phase mode; blitScrollBand dispatches the source-row choice on it (0/112->A, 48/96->B, 80->C), loc_2005 steps it by 2
8112 laneObjlist8112 lane object list (count byte then object X positions), band width 92; loc_12e4 scans it for an object in the frog's move band
8118 frogAnimBlitTrigger frog-anim blit trigger; blitFrogAnimColumnOnTrigger blits the tile pair when non-zero then clears it to 0, else returns at once
8119 scrollBandRowspan scroll row-span shadow; blitScrollBand stores row count - 1 here at exit
811a scrollStampRowcount scroll-object row-count mirror; stampScrollRevealColumn writes (row-count field - 1) here before returning
811b laneObjlist811b lane object list (count byte then object X positions), band width 44; loc_12e4 scans it for an object in the frog's move band
811c flyDriftCounter drifting counter in the 0x811b block; the block-mover advances it +1 ~every 6 frames (wraps 0xff->0, ~25.6s); its wrap-to-0 is the FLY-APPEARANCE trigger (animateFlyEatCollision arms the tongue at 0), and driveFlyPatrol adds it as the fly X base (NOT a fly-path X base)
8120 homeBaySlotCursorMirror home-bay slot cursor mirror; stampHomeBayGatorEmerging writes the slot value here, stampHomeBayGatorFull reads it as its 1..5 home-slot index, stampHomeBaySlot clears it with PENDING_HOME_BAY_SLOT
8121 pendingHomeBaySlot pending home-bay slot selector (1..5); stampHomeBayFly/stampHomeBayGatorFull write it, stampHomeBaySlot dispatches on it to pick a bay and clears it after stamping
8122 scrollTimerCounter per-frame counter driving the fly/gator/slot arms (orchestrateCollisionsAndFrogInput)
8123 homeBaySlotCursor home-bay slot cursor (mod 6); loc_23eb increments-and-wraps it, stampHomeBayFly/stampHomeBayGatorEmerging read it as the 1..5 home-slot index and mirror it (not a river/scroll phase)
8124 laneObjlist8124 lane object list (count byte then object X positions), band width 47; loc_12e4 scans it for an object in the frog's move band
8134 collisionSubflag collision sub-flag; loc_27b3 zeroes it before falling through to the clear helper (loc_27bc)
8135 collisionLatch collision-latched flag; loc_27b3 returns early when 0, else clears it via the clear helper (also read by loc_26a6)
8136 laneObjlist8136 loc_12e4 scans it as a lane object list (band width 34); loc_10f8 uses it as the frog-anim arm-6 plot-cursor base
813d flyEatPhase fly tongue-out/eat phase; bit0 set = retract this frame (animateFlyEatCollision)
813f laneObjlist813f lane object list (count byte then object X positions), band width 18; loc_12e4 scans it for an object in the frog's move band
8140 laneRunScrollPos lane sprite-run scroll-position byte (byte 0 of the 9-byte lane-run header 0x813f); the lane mover ramps+wraps it each frame, enqueueLaneScrollSyncedCommand reads it as a scroll-phase==0 gate (NOT a frog-on-log blit-busy gate)
8145 twoplayerFrameCell8145 one of five cells clearTwoPlayerFrameCells zeroes in play-mode 2
8146 twoplayerFrameCell8146 one of five cells clearTwoPlayerFrameCells zeroes in play-mode 2
8147 twoplayerFrameCell8147 one of five cells clearTwoPlayerFrameCells zeroes in play-mode 2
8148 laneObjlist8148 lane object list (count byte then object X positions), band width 18; loc_12e4 scans it for an object in the frog's move band
814e twoplayerFrameCell814e one of five cells clearTwoPlayerFrameCells zeroes in play-mode 2
814f spriteFrameBusyLatch1 sprite-frame busy latch 1; advanceAnimationFrameBuffer returns without stepping while non-zero, animateTwoPairFigure reads it as a busy gate that must be 0, clearTwoPlayerFrameCells zeroes it in play-mode 2
8150 figureAnimStepGate animateTwoPairFigure gates its step on bit0 of this cell
8151 laneObjlist8151 lane object list (count byte then object X positions), band width 18; loc_12e4 scans it for an object in the frog's move band
815a laneObjlist815a lane object list (count byte then object X positions), band width 18; loc_12e4 scans it for an object in the frog's move band
815b spriteFrameBusyLatch2 sprite-frame busy latch 2; advanceAnimationFrameBuffer returns without stepping while it is non-zero
819b animFrameBuffer animation frame buffer; advanceAnimationFrameBuffer copies 11 bytes of the current frame source into it
81a2 laneControlSpeed7 lane-control byte 7 of the 11-byte per-board block 0x819b-81a5 (loaded by the ldir at 0x183e): low nibble = lane speed, bit4 = sub-rate; enqueueLaneScrollSyncedCommand reads it as a gate input (fixed 0x13, never animates)
81a6 laneObjectPhaseTable 11-byte per-object phase-countdown table (0x81a6+i); moveLaneObjectsAndCarryFrog holds object i while its countdown drains, stepping one pixel and clearing it at 1, reloading from the lane control-nibble-1
81b1 scrollCopyColumnStride scroll-copy column stride; blitScrollTileGrid advances the destination by this between columns
81b2 deathPhase death-phase index, bumped as the death counter reloads (driveFrogDeathAnimation)
81b3 animFrameIndex animation frame index; advanceAnimationFrameBuffer advances it into the ANIM_FRAME_SRC_PTR_TABLE pointer table, wrapping to 0 at index 10
81b4 animFrameTimer animation frame timer; advanceAnimationFrameBuffer ticks it down each pass and reloads it to 21 when it reaches 0
8247 hopFrameCounter per-frame hop/death counter; driveFrogDeathAnimation advances the phase when it reaches 0x10
8248 frogHopDownActive down-hop active flag; scanFrogInputAndDispatchHop tails to advanceFrogHopDown when set, else clears the down-hop mirror FROG_HOP_DOWN_ARRIVAL.
8249 frogHopUpActive up-hop active flag; scanFrogInputAndDispatchHop tails to advanceFrogHopUp when set, else clears FROG_HOP_UP_ARRIVAL.
824a frogHopRightActive right-hop active flag; scanFrogInputAndDispatchHop tails to advanceFrogHopRight when set, else clears FROG_HOP_RIGHT_ARRIVAL.
824b frogHopLeftActive left-hop active flag; scanFrogInputAndDispatchHop tails to advanceFrogHopLeft when set, else clears FROG_HOP_LEFT_ARRIVAL.
824c frogHopDownArrival down-hop arrival mirror flag; scanFrogInputAndDispatchHop clears it when FROG_HOP_DOWN_ACTIVE is clear, advanceFrogHopDown sets it on drain.
824d frogHopUpArrival up-hop arrival mirror flag; scanFrogInputAndDispatchHop clears it when FROG_HOP_UP_ACTIVE is clear, advanceFrogHopUp sets it on drain.
824e frogHopRightArrival right-hop arrival mirror flag; scanFrogInputAndDispatchHop clears it when FROG_HOP_RIGHT_ACTIVE is clear, advanceFrogHopRight sets it on drain.
824f frogHopLeftArrival left-hop arrival mirror flag; scanFrogInputAndDispatchHop clears it when FROG_HOP_LEFT_ACTIVE is clear.
8250 frogHopDownAnimCounter down-hop animation counter; beginFrogHopDown primes it from FROG_HOP_DOWN_ANIM_RELOAD, advanceFrogHopDown decrements it each frame and marks arrival (FROG_HOP_DOWN_ARRIVAL) at 0
8251 frogHopUpAnimCounter up-hop animation counter; beginFrogHopUp primes it from FROG_HOP_UP_ANIM_RELOAD, advanceFrogHopUp decrements it each frame and marks arrival (FROG_HOP_UP_ARRIVAL) at 0
8252 frogHopRightAnimCounter right-hop animation counter; beginFrogHopRight primes it from FROG_HOP_RIGHT_ANIM_RELOAD, advanceFrogHopRight decrements it each frame and marks arrival (FROG_HOP_RIGHT_ARRIVAL) at 0
8253 frogHopLeftAnimCounter left-hop animation counter; beginFrogHopLeft primes it from FROG_HOP_LEFT_ANIM_RELOAD, advanceFrogHopLeft decrements it each frame and marks arrival (FROG_HOP_LEFT_ARRIVAL) at 0
8254 frogHopVerticalDelta vertical hop step delta; added to FROG_Y by advanceFrogHopDown and subtracted by advanceFrogHopUp each frame while a hop steps.
8255 frogHopHorizontalDelta horizontal hop step delta; added to FROG_X by advanceFrogHopRight and subtracted by advanceFrogHopLeft each frame while a hop steps.
8256 frogHopDownAnimReload down-hop animation-length reload; beginFrogHopDown copies it into FROG_HOP_DOWN_ANIM_COUNTER to prime the hop.
8257 frogHopUpAnimReload up-hop animation-length reload; beginFrogHopUp copies it into FROG_HOP_UP_ANIM_COUNTER to prime the hop.
8258 frogHopRightAnimReload right-hop animation-length reload; beginFrogHopRight copies it into FROG_HOP_RIGHT_ANIM_COUNTER to prime the hop.
8259 frogHopLeftAnimReload left-hop animation-length reload; beginFrogHopLeft copies it into FROG_HOP_LEFT_ANIM_COUNTER to prime the hop.
825a playerStartDemoFlag per-player start/demo flag; loc_05d3 sets it to 1, handOffToOtherPlayer sets it to 1 on the player hand-off
825b twoPlayerStartFlag 2-player start flag; loc_05d3 clears it, raiseTwoPlayerStartFlag raises it, swapOutActivePlayerPages restores it under the init guard
825c player1Slot player-1 slot byte; loc_0534 zeros it before the cold-start pre-clear (loc_048f's P1-init later sets it to 1)
825d player2Slot player-2 home count (sibling of PLAYER1_SLOT); awardHomeBayGoal / stampHomeGoalAndResetFrog use it for the inactive-slot home tally
825e homeBay1OccupancyPrimary home-bay-1 occupancy gate, primary bank (used when (0x83FD)==1); the home-bay stampers skip that bay when non-zero
825f homeBay2OccupancyPrimary home-bay-2 occupancy gate, primary bank ((0x83FD)==1); skipped when non-zero
8260 homeBay3OccupancyPrimary home-bay-3 occupancy gate, primary bank ((0x83FD)==1); skipped when non-zero
8261 homeBay4OccupancyPrimary home-bay-4 occupancy gate, primary bank ((0x83FD)==1); skipped when non-zero
8262 homeBay5OccupancyPrimary home-bay-5 occupancy gate, primary bank ((0x83FD)==1); skipped when non-zero
8263 homeBay1OccupancyAlt home-bay-1 occupancy gate, alternate bank (used when (0x83FD)!=1); skipped when non-zero
8264 homeBay2OccupancyAlt home-bay-2 occupancy gate, alternate bank ((0x83FD)!=1); skipped when non-zero
8265 homeBay3OccupancyAlt home-bay-3 occupancy gate, alternate bank ((0x83FD)!=1); skipped when non-zero
8266 homeBay4OccupancyAlt home-bay-4 occupancy gate, alternate bank ((0x83FD)!=1); skipped when non-zero
8267 homeBay5OccupancyAlt home-bay-5 occupancy gate, alternate bank ((0x83FD)!=1); skipped when non-zero
8268 frogHopInputTimer hop-input lock timer; scanFrogInputAndDispatchHop decrements it and ticks the home-bay slot cursor each frame while it counts, locking joystick input until it drains to 0
8269 frogFurthestRow frog row-progress high-water mark; scoreFrogRowProgress seeds/updates it as the furthest (nearest-top) row the frog has reached, resetFrogObject clears it on frog reset
826a gatedCountdownCounter gated countdown counter; tickGatedCountdown decrements it and, when it reaches 0, clears the enable flag GATED_COUNTDOWN_ENABLE_FLAG
826c gatedCountdownEnableFlag countdown enable flag; tickGatedCountdown returns early while it is 0 and clears it to 0 once GATED_COUNTDOWN_COUNTER reaches 0
826d boardAdvanceRequest board-advance / board-complete-pending flag; loc_05d3 sets it =1 when all five frogs reach home, setUpBoardOrContinueLife fires advanceBoardForeground then clears it; raiseTwoPlayerStartFlag also reads it during the 2P start raise (NOT a 2-player-mode flag)
826e scrollPhaseCounter scroll phase counter; loc_2005 steps it each NMI and runs a lane block at 16/32/48, clearing it to 0 at phase 48
8270 activeLaneParamBlock active player's lane-parameter block (33 bytes); loadActivePlayerLaneParams copies the selected difficulty block into here
8273 scrollObjectBlockBase scroll-object block base; stampScrollRevealColumn reads its row/column/row-count fields (+0/+1/+2) to build the VRAM stamp address
8274 scrollObjARowCount scroll object A descriptor +1 (row count); loc_2005 loads it as the grid copy engine's B row-count at phase 16/32/48
8276 spriteSpawnXStride sprite-spawn placement pair (spawnSpriteObjectArmA): rotated right twice + 0x24 gives the per-band X stride walked to place a new object
8278 spriteSpawnBandScanCount sprite-spawn placement pair (spawnSpriteObjectArmA): band-scan count for the placement djnz walk
827c scrollBandDescriptorBase scroll-band descriptor base; blitScrollBand reads column (+0), unit count (+1), row count (+2) to place the video band
827d scrollObjBRowCount scroll object B descriptor +1 (row count); loc_2005 loads it as the band copy entry's B row-count
8282 frogAnimArm6SpriteCode frog-anim arm-6 sprite triple code byte; loc_10f8 reads it into A and stashes it at SCROLL_COPY_COLUMN_STRIDE for the render loop
8283 frogAnimArm6RowCount frog-anim arm-6 row count; loc_10f8 loads it as the render loop's B (rows per pass)
8284 frogAnimArm6PassCount frog-anim arm-6 outer-pass count; loc_10f8 loads it as the render loop's C (passes, 0=>256)
8293 player1DifficultyIndex player 1 difficulty index; loadActivePlayerLaneParams reads it to index the lane-parameter pointer table
8294 player2DifficultyIndex player 2 difficulty index; loadActivePlayerLaneParams reads it when the active player (0x83FD) is not 1
8295 initGuardLatch one-shot init guard latch; swapOutActivePlayerPages returns early when set, else latches it to 1
8297 homeRevealCountdown board-complete "all frogs home" reveal countdown / home-column selector; loc_05d3 sets 255, decremented each frame, fed to stampHomeBayFrogByColumn as the selector
8298 homeRevealDelayTimer board-complete reveal delay timer; loc_05d3 sets it to 0x40, it drains before the 0x8297 reveal countdown starts
8299 attractHopDwell attract-demo hop dwell cell; driveAttractDemoFrogHop loads/decrements/reloads it, driveFrogDeathAnimation clears it on board advance
829a inPlayBoardStateByte board-state byte cleared at in-play board init (initInPlayBoardOnce)
829b introCounter829b intro counter; loc_2d88 zeroes it during the mode-2 setup
829c secondBank mid-river / second-bank kill cell; raised (=1) by the frog-kill tail in the river band 0x30<=FROG_Y<0x80, read by driveFrogDeathAnimation
829d inplayCountdownWord NMI in-play countdown word; loc_0292 decrements it each pass
8300 soundQueueCount pending sound-command count; loc_07ac returns when it is 0, else decrements it, issues the command at SOUND_QUEUE_COUNT+1, and shifts SOUND_QUEUE_COUNT+2..
833d flyTravelDirStep fly travel direction/step byte; bit7 = direction (also the sprite flip bit), low 7 bits = path-table step index, walked by driveFlyPatrol
833e flyAttackTimer fly tongue/attack timer; driveFlyPatrol counts it down each frame and reloads it to 60 at a path endpoint or hold
833f twoPairFigureAnimPhase figure-animation phase animateTwoPairFigure increments; blits at 64 and 112, clears it at 112 and whenever idle
8340 homeGoalSpriteArmCell arm cell armHomeGoalSprite sets to 160 alongside the four-cell block
8370 numPlayers number-of-players; renderScoreHeader draws the 2-UP column only when it is not 1 (==1 -> single player)
8371 perTurnScratch per-turn scratch cell; handOffToOtherPlayer clears it at the top of the player hand-off
837e coinPulseTimer0 coin-counter-0 pulse timer; scanCoinInputAndCredit seeds it to 4 when pulsing counter 0
837f coinPulseTimer1 coin-counter-1 pulse timer; scanCoinInputAndCredit seeds it to 4 when pulsing counter 1
8380 boardAdvanceDoneFlag set to 1 by board-advance foreground once the new board is laid out (advanceBoardForeground)
8381 fanfareIndex arrival-fanfare index (boot seeds 0x15, reload 0x14); stampHomeGoalAndResetFrog steps it
8382 soundSequenceCountdown 16-bit vblank countdown for the active sound sequence; the NMI handler decrements it and fires the end-of-sequence sound pair when it hits 0; writers (fanfare/death/intro) seed a frame duration, 0 = silent
8384 statusRowBlitCountdown board-complete status-row redraw countdown: seeded 0xff, drained each frame, at 0 blits the status row
839a scoreDisplayCursorLo score-display cursor low byte; zeroed with 0x839b when the score field is cleared and seeded (clearAndSeedScoreField)
839b scoreDisplayCursorHi score-display cursor high byte; zeroed with 0x839a at score-field seed
839c hudStampBase board-start HUD base; three cells stamped at board start (setUpBoardOrContinueLife)
83a0 perLifeHudBase per-life HUD base (beginNextLifeOrIntro)
83ae countdownExpiryFlag countdown-expiry flag; loc_0292 clears it when the countdown word reaches zero
83b3 startLatch start-already-latched flag; the new-game setup sets it =1, and while non-zero the attract pace tail loops without re-reading the START buttons
83b4 creditColumnClearLatch renderCreditLine one-time credit-column-clear latch; set to 1 on the first call after clearing the credit column, then checked to skip the clear thereafter
83b5 gatedCountdownEnableMirror mirror/complement of GATED_COUNTDOWN_ENABLE_FLAG; also the one-shot latch for the no-more-frogs reveal
83b6 perPlayerResetCell per-player reset cell; handOffToOtherPlayer clears it when handing play to the other player
83b7 livesCount life/level count; renderLivesRow clamps it to draw the lives row, awardExtraLife mirrors the new count here, handOffToOtherPlayer loads the other player's into it
83b8 player1Lives player 1 life count; awardExtraLife increments it, handOffToOtherPlayer reads it
83b9 player2Lives player 2 life count; awardExtraLife increments it, handOffToOtherPlayer reads it
83ba inPlayBoardInitGuard once-per-board in-play-init guard; set to 1 after the board is initialised, checked on entry to skip re-init (initInPlayBoardOnce)
83bb attractPhaseCompanion attract companion byte cleared to 0 alongside ATTRACT_SEQUENCER_PHASE at cold-start (0x05b3) and the attract drain (stampAttractDemoCell); write-only-to-0, holds no live state — its only read is the cold-boot LDIR zero-fill (NOT attract-sequencer state)
83bc attractDemoDwell attract demo dwell counter; loc_0de0 decrements it and reloads 32 on expiry
83bd attractFrameTimer attract-cell frame timer byte; next byte (0x83be) is the frame index
83be attractFrameIndex attract-cell frame index (tickAttractCellFrameClock)
83bf attractSequencerPhase attract sequencer phase byte; loc_0de0 clears it to 0 after placing the last cell
83c2 cocktailEnabledFlag cocktail-enabled flag; handOffToOtherPlayer toggles the screen flip only when it is non-zero
83c3 frogReadyFlag frog-ready flag; resetFrogObject sets it to 1 at the end of the frog-object reset
83c5 introTimer intro/game-over countdown timer; runIntroTimerThenInitGame counts it down before init
83c7 spinDelayWord 16-bit spin-delay count (boot seeds 0x0100; the main-loop spin reads it)
83c9 continueFlag player-1-path continue flag; set by runIntroTimerThenInitGame, checked by setUpPlayerTwoContinue
83ca continueFlag2p player-2-path continue flag; set by setUpPlayerTwoContinue, checked by runIntroTimerThenInitGame
83cb screenFlipLatch screen-flip latch (work-RAM shadow); handOffToOtherPlayer toggles bit 0 and mirrors it to the flip IO ports
83cd frogStateDemoFlag frog-state / demo flag; loc_05d3 sets it to 1, resetFrogObject clears it during the frog-object reset
83ce lifeRestartFlag life-restart gate: read by beginNextLifeOrIntro (0 resumes play), set by driveFrogDeathAnimation's reset arm, cleared each frame by renderFrogSceneAndTickTimer
83d2 frogTimerA frog 16-bit timer A; activateFrogObject seeds it to 64 in a two-player game
83d4 coinageWord coinage-select word in {0,2,4,6}; scanCoinInputAndCredit indexes the per-slot credit amount by it
83d6 gameMode top-level game mode; loc_0341 masks it against 2 to gate the attract dispatcher 0x0d11, loc_0567 sets it =3 at cold-start (finer 1-4 labels still inferred)
83d7 attractDemoPhaseCounter attract-demo phase counter (1..7); loc_0de0 dispatches the cell arm on it, decrements it, reloads 7 when drained — also the mode-4 sub-phase counter (reload 5, counts 4..0) for renderMode4PointTablePhase
83d8 pointTableDrawState mode-2 intro state cell; loc_2d88 stores 0xff here at the intro setup -- ALSO the shared attract frame-pacing/drawn-state gate loc_0d11 checks; renderMode4PointTablePhase parks it 0xC0 idle / 0x80 drawn
83d9 soundCtrlShadow sound-control byte RAM shadow; issueSoundCommand reads it to pulse bit 3 of the sound-control port
83da frogTimerB frog 16-bit timer B; activateFrogObject seeds it to 64 in a two-player game
83dd scoreDisplayCounterHi score-display counter high byte; when zero the driver takes the end-strip tail, else decremented, and its bits index the bar tile
83df scoreDisplayArmSelect score-display arm select; nonzero routes the driver into its bonus-strip arm (driveScoreDisplayCountdown)
83e1 creditBcd on-screen credit total, packed BCD; the pace tail compares it against the player count and subtracts (daa) when a game starts
83e2 coinInputLatch coin/service input latch; scanCoinInputAndCredit stores ~IN0 & 0xC4 here on the attract pass and credits on the release edge
83e3 coinPairToggle every-other-coin toggle; scanCoinInputAndCredit bumps it and credits only on the even count for the 2-coins/credit coinage
83e4 sharedTimeByte shared time byte / inactive sentinel; renderTimeBar returns without drawing when it holds 255, else uses it as the fallback time source
83e5 timeRemainingP1 player-1 time-remaining byte; renderTimeBar uses it as the bar length when player 1 is active
83e6 timeRemainingP2 player-2 time-remaining byte; renderTimeBar uses it as the bar length when player 2 is active
83e7 player1ExtraLifeAwarded player-1 extra-life-awarded flag (0x83e7 P1 / 0x83e8 P2 pair); loc_08e0 sets it when the extra life is awarded, initNewGameScoreAndTimers clears the pair at new-game start
83e8 player2ExtraLifeAwarded player-2 extra-life-awarded flag (0x83e7 P1 / 0x83e8 P2 pair); addScoreAndAwardExtraLife sets it when the score first reaches the target, initNewGameScoreAndTimers clears the pair
83ea boardLayoutGate board-layout gate; cleared =0 to request a fresh layout (new-life, board-complete, boot), set =1 by setUpBoardOrContinueLife once laid; read each frame at 0x040b to route fresh-setup vs in-play (NOT a demo start flag)
83eb player2Score player-2 score word (16-bit); loc_0f69 reads it as one of the two players' scores to rank and pack
83ed player1Score player-1 score word (16-bit); loc_0f69 reads it as one of the two players' scores to rank and pack, renderScoreHeader draws it in the 1-UP column (swapped from the earlier high-score reading -- 0x83ef is the high score)
83ef highScore high-score word (16-bit), entry[0] of the ranking table read at 0x83ef+2r; renderScoreHeader draws it in the HI-SCORE column, initNewGameScoreAndTimers does NOT touch it
83f1 highScoreTableBase high-score word table base (5 rank words 0x83f1-0x83fa, read at 0x83ef+2r); renderMode3ScoreRankingScreen reads it for the on-screen ranking scores; maintained by insertHighScoreEntry
83f2 highScoreTableTopHi key-high of the first slot of the 5-entry descending table; insertHighScoreEntry inserts into it
83fb introDigitField two-byte score display / intro digit field (0x83fb low, 0x83fc high); loc_0c3d reads the pair to draw the two intro digits, loc_0f69 stores the larger word's rank code at 0x83fb and the smaller's at 0x83fc
83fd activePlayer active player number (1/2); awardExtraLife and renderTimeBar pick the active player's counter, handOffToOtherPlayer toggles it
83fe playFlag in-play flag AND player count (0 = attract, 1/2 = a game with that many players); the pace tail branches to the in-play tree 0x040b when non-zero, new-game setup stores the count here
8400 spawnRngRingBase ring cursor cell + buffer base; nextSpawnRandomByte decrements the cursor and XOR-folds two ring cells
8420 homeBayGateBlock 12-byte home-bay gate block base (0x8420-0x842b); force-cleared at cold-start / player work-RAM reset (forceClearPlayerWorkRam)
842f homeColumnState home-column state cell; loc_0670 clears it to 0 before tailing into the extra-life award
8440 spriteObjectRecordAP1 dispatcher-A sprite-object record base (16-byte IX struct), player 1
8460 spriteObjectRecordAP2 dispatcher-A sprite-object record base, player 2
8480 spriteObjectRecordBP1 dispatcher-B sprite-object record base (16-byte IX struct), player 1
8490 spriteObjectRecordBP2 dispatcher-B sprite-object record base, player 2
8500 workPageSaveBank work-page save bank base; swapOutActivePlayerPages banks 183 live bytes into here
85c0 otherPlayerObjectPage other player's saved object page; swapOutActivePlayerPages restores 43 object bytes from here
8600 otherPlayerWorkPage other player's saved work page; swapOutActivePlayerPages restores 183 bytes from here
86c0 objectPageSaveBank object save bank base; swapOutActivePlayerPages banks 43 live object bytes into here
87ff workRamTop inclusive top of the 2KB work RAM (0x8000-0x87ff); boot-clear upper bound