We just reached 25,000 articles on this wiki! 🥳
If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!
This article has a talk page!

Bugs:Super Mario Bros.

From The Cutting Room Floor
Jump to navigation Jump to search
This page contains changes which are not marked for translation.
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎polski • ‎português do Brasil • ‎한국어

This page details bugs of Super Mario Bros..

Spiny Egg Bug

Here's how the Spiny egg's speed is calculated and stored.

DifLoop:  lda PRDiffAdjustData,y     ;get three values and save them
          sta $01,x                  ;to $01-$03
          iny                        ;increment Y four bytes for each value
          dex                        ;decrement X for each one
          bpl DifLoop                ;loop until all three are written
          ldx ObjectOffset           ;get enemy object buffer offset
          jsr PlayerLakituDiff       ;move enemy, change direction, get value - difference
          ldy Player_X_Speed         ;check player's horizontal speed
          cpy #$08
          bcs SetSpSpd               ;if moving faster than a certain amount, branch elsewhere
          tay                        ;otherwise save value in A to Y for now
          lda PseudoRandomBitReg+1,x
          and #%00000011             ;get one of the LSFR parts and save the 2 LSB
          beq UsePosv                ;branch if neither bits are set
          eor #%11111111             ;otherwise get two's compliment of Y
UsePosv:  tya                        ;put value from A in Y back to A     A=SpeedVar
SetSpSpd: jsr SmallBBox              ;set bounding box control, etc.      A=SpeedVar

Doing good so far. The A register stores the appropriate speed value.

SmallBBox: lda #$09               ;set specific bounding box size control A=09
           bne SetBBox            ;unconditional branch                   A=09

Oops, jumping to the bounding box subroutine overwrote A! All that work for nothing.

SetBBox:  sta Enemy_BoundBoxCtrl,x    ;set bounding box control here      A=09
          lda #$02                    ;set moving direction for left      A=02
          sta Enemy_MovingDir,x                                           A=02
InitVStf: lda #$00                    ;initialize vertical speed          A=00
          sta Enemy_Y_Speed,x         ;and movement force                 A=00
          sta Enemy_Y_MoveForce,x                                         A=00
          rts                                                             A=00

Now A ends up equaling 00. Now the game jumps back to the SetSpSpd subroutine...

          ldy #$02                   ;Set Y to 02 (Leftwards)             A=00
          sta Enemy_X_Speed,x        ;Set Spiny egg speed to A (00)       A=00
          cmp #$00                   ;Now check if speed is negative...   A=00
          bmi SpinyRte               ;...but A is always 00. No branch.   A=00
          dey                        ;Set Y to 01 (Rightwards)
SpinyRte: sty Enemy_MovingDir,x      ;Set moving direction.

...and speed is set to 0. Moving direction is set to Rightwards, but since the egg has no horizontal movement and the direction is reset when the Spiny enemy spawns, this doesn't mean much.

To fix this bug, simply move the "jsr SmallBBox" to after the dey opcode, which is what this patch does:

Download.png Download Spiny Egg Speed Patch
File: SMBSpinyEggPatch.ips (25 B) (info)

(Source: doppelganger's SMBDis)

Warp Zone Scroll bug

To do:
Add details: https://www.youtube.com/watch?v=61m5MiyC17s

Unless you're walking on the ceiling, Level 1-2 is supposed to stop scrolling as soon as the mundane return-to-surface pipe comes onto the right edge of the screen. However, due to a programming error, it keeps scrolling anyway, revealing that the warp zone room is there. It was originally intended to be a much more hidden secret than it turned out to be.

Download.png Download “No Minus World” patch
File: SMBNoMinus.7z (353 B) (info)