• Contact
  • Journal
  • Home
  • Arcade
  • DonkeyKong
  • 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
  • Donkey Kong — Work RAM

Donkey Kong — Work RAM

Work RAM lives at `0x6000`–`0x6BFF` (`0x6C00`–`0x6FFF` is not populated). Each name below describes the cell by its role in the running game; the hex address is the stable identity. Cells whose role is only partly pinned, or whose identification is inferred from behaviour rather than read off the code, carry a terse caveat.

Address Name Description
6001 credits Credit count, packed BCD, capped at 0x90; the attract state advances while it is non-zero and the start handlers spend it
6002 coinsPartial Coins banked toward the next credit; reset to 0 once it reaches dipCoinsPerCredit
6003 coinEdge Edge latch for the coin line (IN2 bit 7); held 1 while no coin is present, so holding the line cannot repeat-credit
6005 gameState Top-level game state: 0 power-on / 1 attract / 2 credited / 3 in-game; the frame service dispatches through a 4-entry table on it
6007 attract Non-zero while no credited game is running; gates the joystick read, the sound driver, and the rst 08 guard
6008 substateTimerLo Fast half of the two-byte sub-state timer; rst 20 decrements it and underflows into the rst 18 tick
6009 substateTimer Frames remaining before the current sub-state may proceed; counts down once a frame. "Wait N then go to state M" writes N here and M into 600a
600a gameSubstate Sub-state index within the current game state. In-game it selects one of 23 live handlers: 07 opening cutscene, 08 how-high, 0a board build, 0b spawn Mario, 0c gameplay, 0d death animation, 0e life lost, 16 board cleared
600d currentPlayer Player currently up: 0 = player 1, non-zero = player 2; selects the score slot
600e activePlayerIndex Active-player index, a value-lockstep mirror of currentPlayer, used to key the per-player slot records
600f twoPlayerGame 1 = two-player game. Written exactly once, at game start, as the high byte of a single 16-bit store
6010 p1Input Cooked control word the movement code reads: bit0 right, bit1 left, bit2 up, bit3 down (held), bit7 = jump press-edge, set for exactly one frame per press
6011 p1InputRaw Raw joystick port byte for this frame (bit4 = jump), kept so next frame's edge detector can tell newly pressed from still held
6018 random Pseudo-random accumulator; each vblank it takes += frame + spinCount, a decrementing counter plus a jittery one
6019 spinCount Main-loop pass counter, roughly 140 per frame. Its jitter with per-frame workload is the point - it is the entropy the PRNG runs on
601a frame Frame counter, DECREMENTED once per vblank; everything periodic keys off its low bits
6020 dipLives Lives per game, 3-6, decoded from the DIP switches at power-on
6021 dipBonusLife Extra-life threshold in BCD thousands: 07 / 10 / 15 / 20 = 7000 / 10000 / 15000 / 20000
6022 dipCoinsFor1P Coins needed for a one-player game - a display value only, written to the credit line
6023 dipCoinsFor2P Coins needed for a two-player game - a display value only, with a tens-digit split for "10"
6024 dipCoinsPerCredit Coins the mechanism must swallow per credit group
6025 dipCreditsPerCoin Credits awarded per completed coin group
6026 dipUpright Cabinet: 1 = upright, 0 = cocktail. Selects whether player 2 reads IN1, and is mirrored to the flip-screen latch
6040 p1Context Player 1's saved 8-byte context: lives, level, board-order pointer (2), play-intro flag, bonus-life latch, how-high index, how-high pointer copy
6048 p2Context Player 2's saved 8-byte context, same field order. Both are block-copied to and from the live context at 6228 on each player handoff
6060 overlapCount Collision-search overlap tally: cleared, incremented once per overlap across both hazard arrays, then read back as a severity code (0/1/2+/3+ becomes 0/1/3/7)
6080 sndTrigger Eight per-line sound trigger counters at 6080-6087, one per LS259 latch bit. Each vblank a non-zero counter is decremented and its line asserted; game code plays a sound by storing 3
6088 sndIrqTrigger Same countdown shape, driving the sound-CPU interrupt line at 7d80
6089 sndBgm Background tune number written to the tune latch while no priority tune is pending; held, so the tune loops
608a sndPriority Priority tune number, overriding sndBgm while its frame counter is non-zero
608b sndPriorityFrames Countdown for sndPriority; game code stores 3, so a priority tune is a three-frame pulse
60b0 taskTail Task-ring enqueue pointer - the low byte of an address in page 60; advances by 2, wrapping fe to c0. A full ring silently drops the request
60b1 taskHead Task-ring dequeue pointer, same encoding; the main loop consumes one task per pass
60b2 p1Score Player 1 score: 3 bytes little-endian packed BCD (60b4 is the most-significant pair). All scores are displayed x100, so the low byte is always 00
60b5 p2Score Player 2 score, same format. The attract-mode placeholder is aa aa aa
60b8 highScore High score, same format; the power-on default is 007650. A new high is copied here MSB-pair-first
60c0 taskRing Task ring: 32 slots of 2 bytes [opcode, argument] at 60c0-60ff; opcode ff means the slot is free. Opcode 0 adds to the score, 1 resets a score counter, 2 draws a score, 3 draws a vertical string, 4 draws the credit line, 5 steps the bonus readout, 6 draws lives and level
611c playerSlotRecords Player-slot records: base 611c, stride 0x22, 5 records; field 0 is the owner tag (1 = player 1, 3 = player 2). Per-record layout beyond the tag is inferred
6200 marioActive Player-alive flag: 1 = alive and processed, 0 = dead or inert
6202 marioWalkAnim Walk-cycle animation index; its low two bits feed the sprite code every frame. NOT facing - left and right produce the same value set in reversed order
6203 marioX Mario's X position in screen pixels. Prize collision compares it exactly against each item's stored X
6204 marioXFrac Fractional low byte of the 16.8 fixed-point X (6203:6204, big-endian); cleared at jump start
6205 marioY Mario's Y position in screen pixels, larger being lower on screen; follows the girder slope while walking
6206 marioYFrac Fractional low byte of the 16.8 fixed-point Y - the value the ballistic integrator actually updates
6207 marioSpriteCode Mario's sprite tile code in bits 0-6; bit 7 is the horizontal flip, i.e. facing (1 = right). Every writer preserves bit 7 and ORs in a state code: 0e jump, 0f land, 06 ladder top, 03-05 climb, else the walk phase
6208 marioSpriteAttr Colour/attribute byte of Mario's sprite record
620b marioAirPrevX Snapshot of marioX taken at the head of each airborne frame, before that frame's motion
620c marioAirPrevY Snapshot of marioY taken at the head of each airborne frame, before gravity
620e marioAirStartY Y at the instant Mario left the ground; the fall-height test measures against it
620f marioMoveStepTimer Ground walk/climb sub-step timer: while non-zero Mario shifts 1 pixel a frame; at zero the walk animation advances and it reloads (2 walking, 3-4 climbing). A jump never touches it
6210 marioAirVxHi Signed 16-bit horizontal velocity while airborne, big-endian, in 1/256 pixel per frame. Jump start loads 0080 right, ff80 left, 0000 straight up
6211 marioAirVxLo Low byte of the airborne horizontal velocity
6212 marioAirVyHi Signed 16-bit INITIAL vertical velocity of the current jump or fall, big-endian, constant across the whole arc: a jump sets 0148, a fall sets 0
6213 marioAirVyLo Low byte of the initial vertical velocity
6214 marioAirFrames Frames elapsed since Mario became airborne; drives the ballistic term, the per-frame Y delta being -(V + 8 - 16n). At frame 0x14 the landing check is armed
6215 marioOnLadder 1 = on a ladder, mid-climb; enables the up/down climb branch and the ladder-centring X snap
6216 marioAirborne Primary movement state: 0 grounded, 1 airborne (jumping or falling). The first test in the movement machine
6217 marioHammerActive 1 = a hammer is in Mario's hands; suppresses the jump-button test and swaps in the hammer sprite and the hammer tune
6218 marioHammerPending A hammer touched but not yet held, latched during the airborne frames and transferred into marioHammerActive when the post-landing freeze expires
621b marioClimbLimitA One of the two ladder-extent limits for the current climb, in (Y+8) units; the climb stops and clears marioOnLadder when (newY+8) equals either limit
621c marioClimbLimitB The other ladder-extent limit. The two writer paths store the pair in opposite order, so which is top and which is bottom is not settled - treat them as a pair
621e marioFreezeTimer Post-landing freeze countdown; while non-zero Mario is unresponsive. Landing loads 4, and on expiry the pending hammer is applied and the walk animation cleared
621f marioAirLandcheck Airborne sub-phase: while 1 the fall-height test runs every frame. Set at airborne frame 0x14 of a jump, near apex, or immediately for a ledge/slope fall
6220 marioFatalFall "This fall will kill him": set when Mario is more than 0f pixels below his take-off Y. Consumed on landing as marioActive = this XOR 1
6221 marioStartFall One-shot "the ground went away" trigger raised by the slope/ledge contact check; the player-state reset consumes and clears it, putting Mario airborne with zero initial velocity
6224 marioClimbSoundToggle Alternates 0/1 across climb half-steps; the footstep sound fires only on the 0 phase. It gates the sound and nothing else reads it
6225 itemCollected 1 = a prize was just collected; set at pickup, and consumed at landing, which clears it and queues the pickup tune on every board but 25m
6227 board Current board type: 1 = 25m girders, 2 = 50m conveyors, 3 = 75m elevators, 4 = 100m rivets. Re-derived from boardSeqPtr on every context restore, and the per-board setup dispatches on it
6228 lives Lives remaining for the player up; offset 0 of the live 8-byte context at 6228-622f. Seeded from dipLives, decremented on death, incremented on the bonus-life award
6229 level Level number, 1-based binary, clamped to 99. Board bonus = min(10*level + 40, 80). Incremented once per completed level, when the board order hits its terminator
622a boardSeqPtr 16-bit ROM pointer (lo,hi) into the board-order table, initialised to 3a65. Board complete steps it and copies the byte it lands on into board; on the 7f terminator it reloads 3a73, the head of the level-5-and-up group, so the order repeats forever
622c playIntro 1 = still play the opening cutscene for this player. Both death handlers zero it, which is why boards after a death skip the intro
622d bonusLifeAwarded Latch so the score-threshold extra life is granted once per player
622e howHighIndex Height index for the "HOW HIGH CAN YOU GET?" interlude, clamped to 5; stepped whenever boardSeqPtr differs from its saved copy
622f howHighLastSeq Copy of boardSeqPtr's low byte, used only to detect that the pointer moved
6280 boardObjScratch Board-object block, 64 bytes at 6280-62bf, seeded from a ROM template at board build. Its first 16 bytes are a stride-8 two-record array (6280 and 6288) selected by frame parity: +0 state, +1 park-dwell timer, +2 the object's column, +3 screen Y, +4 per-tick countdown. The rest of the span is heterogeneous - rivetsLeft and bonus are carved out of it
6290 rivetsLeft Rivets still in place on 100m, initialised to 8; decremented as each is removed, and at 0 the board is won
6291 edgeRivetArmed Edge-triggered one-shot in the rivet pickup. Standing on a rivet-board edge column (marioX 4b or b3) only ARMS it; the rivet is taken on a later frame, once he has stepped off, and the latch is disarmed
6292 rivetPresent Eight per-rivet present flags (1 = still there) at 6292-6299; the remover tests and clears one, then decrements rivetsLeft
62a0 m50Obj1ReverseTimer 50m: first travelling object's reversal timer; decremented on even frames, reloading 0x80 and flipping the step direction on underflow
62a1 m50Obj1StepDir 50m: first travelling object's signed step-direction latch; only its sign is published
62a2 m50Obj2ReverseTimer 50m: second object's reversal timer, reload 0xc0
62a3 m50Obj2StepDir 50m: second object's signed step-direction latch
62a5 m50Obj3ReverseTimer 50m: third object's reversal timer, reload 0xff
62a6 m50Obj3StepDir 50m: third object's signed step-direction latch
62a7 spawnTimer Spawn-cadence timer; at 0 a free slot in the 6600 array is claimed and seeded, and it reloads 0x34. Always decrements
62a8 renderStrPtr Source character-string pointer (word), walked to a 7f terminator and stored back each step
62aa renderObjPtr Object-record pointer (word) the renderer reads the sprite code and attribute out of
62ac renderDstPtr Destination pointer (word); the renderer writes its 4-byte record to a slot inside the sprite shadow buffer
62b0 bonusStart The board's starting bonus, held constant for the whole board - the denominator for barrel-release pacing and for the end-of-board tally
62b1 bonus Bonus counter in units of 100 points. Set at board start to min(10*level + 40, 80); reaching 0 arms the bonus-expired sequence. It ticks down on a timer on 50m/75m/100m and off the barrel release on 25m
62b2 bonusEventMark Next bonus value at which the board's periodic spawn event fires; initialised to bonusStart and stepped down by 8 at each match
62b3 bonusPeriod Frames between bonus ticks = max(0xdc - 2*bonus, 0x28)
62b4 bonusTick Countdown to the next bonus tick, reloaded from bonusPeriod
6300 objParamTable0 Per-board type-0 object-init table (stride 5), de-interleaved here at board build. Exact record layout inferred
6310 objParamTable1 Per-board type-1 object-init table, parallel to table 0
6340 effectState Score-effect state, a 4-way dispatch index; pickup and hit sites raise it to 1
6341 effectTimer Effect display-hold countdown, armed to 0x40; blanks the score-popup sprite on expiry
6342 effectSelect Effect select/mode byte; its low bits are walked one at a time to pick which award value is staged
6343 effectParamPtr Effect parameter pointer (word): the base of the hit record the popup is placed on
6345 effectSeqState Effect-sequence state, a 3-way dispatch index; re-arms effectState on completion
6346 effectSeqInner Effect-sequence inner countdown, decremented first on each tick
6347 effectSeqOuter Effect-sequence outer countdown, decremented when the inner one drains, and advancing effectSeqState at 0
6351 collidedObjectBase Base address (word) of the hazard array that contained the collision hit; its high byte serves as the array classifier
6353 collidedObjectStride Per-record stride of the hit array (0x20), used as the walk increment out to the hit record
6354 collidedObjectIndex Index of the hit object within its array, recovered as the sweep count less the remaining loop counter
6380 difficulty Difficulty ramp = min(level + (difficultyClock >> 3), 5) - it rises both with the level and with time spent on the board
6381 difficultyClock Increments every 256 frames; every eighth increment recomputes difficulty. Reset at board start
6382 barrelClaimMode 25m barrel slot-claim mode, and the selector for which of two barrel kinds is stamped: the low bits are the mode and bit 7 picks the kind, the two kinds carrying different sprite and attribute bytes and so different palettes. Bit 0 independently selects the one-waypoint path table. Which named object each kind is has not been established
6383 frameSeen The main loop's latched copy of the last frame it serviced; the loop spins comparing this against the frame counter - that is the wait-for-vblank
6384 difficultyPrescaler Increments once per serviced frame; the block that follows it runs only when it wraps, i.e. every 256 frames
6385 introStep Step index of the opening Kong-climb cutscene, walked 1 to 7 through an 8-entry table. Reached only while gameSubstate is 7
6386 bonusExpiredStep Small 0-3 state machine run once the bonus reaches 0; both bonus-decrement sites set it to 1 the moment that happens
6387 bonusExpiredDelay Countdown-delay timer of the bonus-expired sequence; state 2 counts it down and advances the step on underflow
6388 boardAdvanceStep Board-cleared interlude step index, dispatched through one of three board-parity tables; each step renders one stage and then increments it. A write of 0 restarts the sequence
6389 hammerSavedBgm Background tune saved when a hammer is grabbed, so the pre-hammer tune can be restored to sndBgm at hammer expiry. Not cleared on restore, so it goes stale until the next grab
638c bonusDisplay The on-screen bonus value - packed BCD of the bonus counter, stepped in lockstep with it and paid into the score at board completion
638d cutsceneBandCount Intro cutscene band count, seeded to 5 and decremented per band; (count-1)*16 indexes the band table
638e introScrollIndex Intro Kong-climb scroll index, seeded to 1f and walked down as the displaced video-copy offset
6391 colourCycleActive 1 while the attract colour-cycle sweep is running: set at each frame-counter wrap, cleared when the sweep counter finishes at 0x80
6394 hammerTimerLo 16-bit up-counter for how long the current hammer has been active; the hammer ends when the high byte reaches 2, about 512 frames. Bit 3 of the low byte drives the 8-frame swing animation
6395 hammerTimerHi High byte of the hammer up-counter
6396 spawnRequest Spawn request: 3 is stored each bonus period; bit 0 activates the object, seeding its position and appearance, and the latch is then cleared
6398 edgeRepositionFlag One-shot "Mario's Y was just repositioned" flag, set right after a forced Y write and read as a gate by the lift-ride code
639a objSpawnReq Spawn request into the 65a0 array of 50m moving objects: when set and objSpawnTimer has drained, a free slot is filled and the request cleared
639b objSpawnTimer Cooldown gating that spawn request; the service returns while it is non-zero, and it reloads to 7c after each spawn
639d deathAnimPhase Phase of Mario's death animation (0-2), the dispatch index for the death cluster. The animation runs 296 frames, the sprite rotating through four orientations 13 times before settling on tile 7a, after which a life is lost. Never non-zero outside the death sub-state
639e deathAnimTicksLeft Death-animation ticks remaining, primed to 13 and decremented once per 8-frame gate tick (not per frame); at 0 it advances deathAnimPhase
63a0 eventReq313c Insert-event request for the hazard inserter: when set, and a free slot exists, a slot is activated and the request cleared. Raised both by the difficulty-scaled periodic trigger on 50m/100m and by the fixed hazard's own re-arm
63a1 objLiveCount Per-scan tally of live records while sweeping the 6400 hazard array; the scan returns a caller-skip when it lands on an empty one
63a3 m50Obj1Step 50m: first object's published signed X step - 0 on even frames, +-1 on odd
63a4 m50Obj2StepNeg 50m: second object's published negative X step; the mover reads this arm below X 0x80
63a5 m50Obj2StepPos 50m: second object's published positive X step, the exact negation of the arm above
63a6 m50Obj3Step 50m: third object's published signed X step
63ab segAddr1 Board-render line segment: first endpoint tile address (word), the column start
63ad segAddr2 Second endpoint tile address (word), the end-cap write pointer
63af segSubtile1 First endpoint sub-tile X (x & 7)
63b0 segSubtile2 Second endpoint sub-tile X
63b1 segHeight Segment height, abs(y2 - y), paid down 8 pixels a row by the column drawers
63b2 segRun Segment run, x2-x; its sign gives the girder or ladder slant
63b3 segKind Segment record kind, the aa terminator, and the girder-versus-ladder drawer selector
63b4 segSubtileY1 First endpoint sub-tile Y (y & 7)
63b5 segTile Current stamped tile code, stepped by the drawers for slant and fill
63b7 m50ObjRowShift 50m sprite-object row X-shift delta, added into the X column of the sprite-object block. An X shift, not a colour delta
63b8 bonusDisplayZeroed Latch recording that the bonus readout has bottomed out, suppressing re-seeding once the display reaches zero
63b9 objSearchCount Record count of the object list currently being searched, staged for the bounding-box search; on a hit the matched record's index is recovered as this count less the remaining loop counter
63c0 seqAdvancePtr Indirect pointer (word) to the sequence counter the gated tick helper advances once substateTimer expires - introStep for the cutscene, boardAdvanceStep for the interlude, depending on which setup seeded it
63c2 introWalkPtrA Intro walk pointer A (word), seeded to 38b4 and advanced to a 7f terminator
63c4 introWalkPtrB Intro walk pointer B (word), seeded to 38cb
63c8 objIterPtr Saved iterator pointer (word) walking the 6400 array, handed between the driver and the collision arm through memory
63cc demoScriptIndex Attract-demo script step index; walks 0 to 18 and restarts each demo cycle, every advance producing a new control word
63cd demoScriptCountdown Attract-demo per-step countdown, reloaded to a fresh duration at every script advance
6400 objArray64 THE FIRES. Object array, stride 0x20. The per-frame driver walks 5 records; the collision arm sweeps 5 on 25m/50m/75m and 7 on 100m. Record fields: +0 active, +3 X, +5 Y, +7 sprite code, +8 attribute, +9/+0a collision half-extents, +0d state, +18 insert-pending, +1a/+1b saved path-table pointer
6500 objArray65 THE SPRINGS. Object array, stride 0x10, 10 records at 6500-659f; 75m only, and only records 0-1 were ever seen active. Each walks an animation string of signed Y deltas and rewinds at the terminator. "Springs" is inferred from behaviour
65a0 objArray65a0 The 50m travelling objects. Object array, stride 0x10, 6 records; X sweeps the full screen width, Y stays row-fixed
6600 objArray66 Object array, stride 0x10, 6 records; 75m only. Each drifts one pixel vertically per service toward its limit. The drift matches the moving platforms, but nothing in the code names these objects - bit 3 of the state field picks the direction, a riser lands at row 96 with X snapped to column 119, a faller deactivates at row 248. "Elevators" is inferred from behaviour
6680 objPair6680 THE HAMMERS: two records of 0x10 at 6680 and 6690. Field +1 of each is the in-play flag marking which hammer Mario grabbed, set on the touch and cleared at hammer expiry
66a0 objRecord66a0 The board's fixed hazard - on 25m the oil drum, at X 39, Y 224, where the fires are born; on 50m at X 127, Y 120. Dormant on 75m and 100m. A single record, scattered in from a ROM template on exactly the boards whose collision arm sweeps it
6700 objArray67 THE BARRELS. Object array, stride 0x20, 10 records spanning 6700-6840. Board 1 only - identically zero during play on the other three. Live sprite codes are six barrel frames times the flip bit
6900 spriteBuffer Sprite shadow buffer: 96 hardware sprite records of 4 bytes at 6900-6a7f. The CPU fills it and the DMA blits all 384 bytes to sprite RAM 7000 every vblank. Record layout in game terms: +0 X, +1 code with flip on bit 7, +2 attribute, +3 Y. The video hardware reads each record rotated - that swap is the portrait orientation, not an error
6908 spriteObjBlock A 10-record, 40-byte sprite group inside the shadow buffer, block-copied from a ROM template. Its contents are scene-dependent - board decor, cutscene props - but the 10-record structure is fixed
694c marioSpriteRecord Mario's 4-byte sprite record inside the shadow buffer, assembled in order from marioX, marioSpriteCode, marioSpriteAttr and marioY, and blitted to sprite RAM 704c. The hammer overrides the code byte
6980 actorSprites 10 sprite records (stride 4) at 6980-69a7, mirroring the X and Y of whichever object array the board is running -- the 6700 records on 25m, the 6500 records on 75m
69b8 obj65a0Sprites 6 sprite records at 69b8-69cf, refreshed record-for-record from the 65a0 array; a culled record is blanked
6a00 topSprites 3 sprite records seeded at board build on every board except 100m
6a0c objectCollisionSprites 3 collision sprite records compared against Mario on X, Y and a flag byte; cleared as a 5-record group
6a2c effectSprite Effect sprite record: +0 Y, +1 code, +2 attribute, +3 X. Bit 0 of its code byte flips 60 to 61 and back on each effect beat
6a30 popupSprite Score-popup sprite record: Mario's X, the award glyph, attribute 7, and Mario's Y + 0x14