Cite as
“Felix the Cat (USA)”
Licence
proprietary; never redistributed (docs/data-policy.md#roms)
Credit
Hudson Soft
Notes
No-Intro "Felix the Cat (USA)". NES 2.0 header: 128 KB PRG ROM, 128 KB CHR ROM, mapper 4 (MMC3), no battery. Without the 16-byte header the SHA-1 is cc03a83c6ad9bbb858ee5ff04e9e7b2362eea06a. TASVideos lists SHA-1 d98426b4955ae9ec4feaedb2538aab35b8209c06 for the game: that is this same file with an iNES 1.0 header (header bytes 7-15 zeroed), so the PRG and CHR data are identical, and the 1625M movie's romChecksum matches this file.

Cited on

Claims (19)

The atlas reads Felix as slot 0 of the game's object tables, and the tables as 22 slots each from the 22-byte spacing of the x and y tables. His x in the stage is $0658:$0642 with a fraction byte at $062C, and his y is $069A:$0684 with a fraction at $066E, growing downward. His x speed is $06C6:$06B0 and his y speed $06F2:$06DC, signed, in 1/256 px a frame; each frame the mover adds the x speed, plus a signed byte at $041D, to the x.0x1D91F-0x1D94D0x1F867-0x1F8840x18927-0x189460x18947-0x18967Code
$33 is the stage index. A stage ends at $FA20, which adds 1 to it once the clear flag ($03B7) is up and the tally has run the timer down to 000. In the 1625M replay it reads 0 in the first stage and counts up to 22 in the last.0x1F705-0x1F7140x1F944-0x1F9570x1FA30-0x1FA37Code
Three instructions in the ROM store to the clear flag $03B7. The stage load clears it; the exit test in the fixed bank sets it from Felix's x (felix-the-cat/exit-threshold); and a routine in PRG bank 12 sets it when a countdown at $042B reaches 0.0x1F378-0x1F37A0x1F80F-0x1F8500x18481-0x184B4Code
Every frame of play until the clear flag $03B7 is up, the game subtracts $32 and the stage's bound ($BB:$BD) from Felix's x and sets the flag when the result is at least $F0. A stage ends when Felix's x reaches its bound plus 290; in the first stage, whose bound is 3,848, that's x 4,138.0x1F80F-0x1F850Verified
The playfield's scroll is $16:$14, which the raster split writes to $2005. In the Mesen probe, Felix's screen x is about x − scroll + 256: walking right, the camera settles with his x 136 px below the scroll value, and a sprite of his covers screen x 120. The scroll stops at the stage's bound plus 248.0x1C20C-0x1C234Verified
Holding Right from a standstill in the first stage at power level 0, with $0616 below 3, Felix's x speed grows by a step read from $03B3, 48 (in 1/256 px) there, each frame up to the cap of 533, about 2.08 px a frame, which it reaches on the twelfth frame.0x1D69E-0x1D711Verified
Falling, with $0616 below 3 and $03B1 clear, Felix's y speed grows by 45 (in 1/256 px, down positive) each frame up to a cap of 1,536, 6 px a frame, as measured at the first stage's start.0x1D712-0x1D73C0x18927-0x18946Verified
The fixed bank's exit test reads Felix's x and the stage's bound, never the scroll. For example, walked a second into the first stage and placed 6 px below the scroll value, near the right edge of the screen, Felix doesn't clear the stage: the camera re-centers on him the next frame, and the clear flag stays at 0.0x1F80F-0x1F850Verified
The exit test has no boss condition. Each of the seven boss rooms, stage indices 2, 5, 8, 11, 14, 16, and 18, has a bound of 0, so it ends at x 290, inside the room's wall (felix-the-cat/boss-wall). In Mesen, from power-on, with each boss stage cleared at its bound and $040C set to 3 where the stage's last door would set it, the game's room change loads the boss room; Felix placed there at x 290 with the boss up sets the clear flag the next frame, the fight's step $0411 still at 0, and the next stage loads.0x1F80F-0x1F8500x1F851-0x1F8660x1FA17-0x1FA2FVerified
In each of the seven boss rooms, the map's columns 14 to 31, x 224 to 511 of its 512 px, are solid from top to bottom, and so is column 0. The wall test (felix-the-cat/wall-test) stops Felix at x 215, where the point 8 px ahead of him reaches the wall. In Mesen, moving right at his top speed of 533/256 px a frame from x 215, he stays at 215 at every height, from above the map to below it.0x1F261-0x1F2A00x1D0FB-0x1D16FVerified
Each frame of play, after the mover adds Felix's x speed and push to his x, the fixed bank's $D05F checks him against the screen's edges or the map. With his x's high byte past the bound's, or equal to it with a low byte of $DB or more outside a boss fight (and a few other cases), the game walks him right (the auto-walk) and tests the map. Short of that, an x less than 8 or at least 240 past $B7:$B9 sets his x speed to 1 px a frame back inward, and the map isn't read that frame. Otherwise, moving right, it reads the map 8 px ahead of him, normally at y + 1, y − 8, and y + 13 (moving left, 8 px behind), and if a tile there blocks, it subtracts that frame's x speed from his x again. Then $D191 moves x 1 px toward 7 or 8 px into its 16 px column.0x1D033-0x1D03B0x1D059-0x1D0FA0x1D0FB-0x1D16F0x1D1A1-0x1D1CD0x1D1CE-0x1D223Code
The map that Felix's tile tests read is 32 columns of 16 px by 24 rows of 16 px in cartridge RAM at $6000-$63FF, a ring that repeats every 512 px of x. A tile's type is the low nibble of its entry in a table at ($CA). Types 1, 14, and 15 block both ways; type 4 blocks only moving left, and type 5 only moving right. A point above the map reads the top row, and one 384 px down or more reads the bottom row, where any nonzero type counts as 1.0x1F261-0x1F2A00x1CF91-0x1CFA0Code
Felix's push $041D comes from one routine, in PRG bank 12: a platform whose x swings with the frame counter sets it, while Felix rides, to the change in its x that frame, and the object pass clears it again afterward. The mover adds it to Felix's x, and the wall test never takes it back (felix-the-cat/wall-test). In FCEUX's replay of the 1625M movie the push was 1 px either way, and it came only in the main areas of stage indices 1, 2, 7, 9, 10, 12, 18, and 22, never in a boss room.0x19175-0x191C20x1E13B-0x1E1650x1D91F-0x1D94DCode
$0411 is a boss stage's step: 0 in the fight, 1 once the boss is beaten, and 2 in the room after. Only two instructions add to it: $A20D in PRG bank 13, in the routine that runs when the boss is beaten, and $FA13, in the room change that $040C = 3 asks for. A door asks for it only in a main area (felix-the-cat/boss-room-door); in the boss room, bank 13's $A1B9 stores the 3. Every store to $0411 writes 0, or $FF that $FA13 lifts to 0 at once. In FCEUX's replay of the 1625M movie, in World 1, the step went from 0 to 1 at $A20D on frame 7,643; on frame 7,880 $A1B9 set $040C to 3, and $FA13 took the step to 2.0x1A211-0x1A21F0x1A1C2-0x1A1CC0x1FA17-0x1FA2FCode
A door in a boss room leads back into the same room. Pressing Down on a door tile sends Felix down it, and the door's kind picks the room change. In a boss room ($040D = 8), $CABF gives every door kind 2 except in stage index 22, and kind 2 is a hop back up where he went down. Only kind 3 moves the boss step on (felix-the-cat/boss-step), and $CB90 gives it only to a door in a main area, with the step at 0. Stage index 5's boss room has a door tile where Felix comes in. In FCEUX, Down on it during the fight sends him down and back up at x 48, with the fight still on.0x1CACF-0x1CAD80x1CBAF-0x1CBB40x1CB92-0x1CB960x1F851-0x1F866Code
Once the clear flag is up, the game counts the timer down one unit a frame, and the stage index moves on 162 frames after the timer's count, so the wait after a clear is the timer's reading plus 162 frames. With the power level above 0, the power's remaining units ($03C0) are counted first, about 15 frames each.0x1F717-0x1F7710x1F7C2-0x1F80CVerified
The timer is three digit tiles at $03A9-$03AB (tile $10 is 0). During play in a stage's main area ($0411 = 0) it drops by 1 every 60 frames, counted at $03AC, and at 000 without a clear the game sets $03FA, time over.0x1F7C2-0x1F80C0x1F944-0x1F957Code
$03C6 holds Felix's power level, 0 to 3 in the 1625M run. While it's above 0, $03C0 counts down one unit every 300 frames (150 odd frames, counted at $03C1); each change of level in the run that left it above 0 set $03C0 back to 10.0x1F797-0x1F7C0Code
A hit at power level 0 ($03C6) sets $03CD to $FF and Felix's y speed to $F7:00, upward; above 0, it sets $03CD to $B4 and takes 1 from the power level instead. Walking right from the start of the first stage at power 0, the Mesen probe sees Felix hit at x 281, the lives digits ($03A5-$03A6) lose 1, and the stage restart with Felix at x 48.0x1F99E-0x1F9F90x1CCF2-0x1CD330x1CD34-0x1CD4BVerified