We just released a Feb. 5 '89 prototype of DuckTales for the NES!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!

Bugs:Super Mario Bros.

From The Cutting Room Floor
Jump to navigation Jump to search
This page is a translated version of the page Bugs:Super Mario Bros. and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎polski • ‎한국어
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎polski • ‎한국어

This page details bugs of Super Mario Bros..


Stachi-Ei Bug

So wird die Geschwindigkeit des Stachi-Eis berechnet und gespeichert.

DifLoop:  lda PRDiffAdjustData,y     ;get three values and save them
          sta $01,x                  ;to $01-$03
          iny
          iny                        ;increment Y four bytes for each value
          iny
          iny
          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
          tya
          eor #%11111111             ;otherwise get two's compliment of Y
          tay
          iny
UsePosv:  tya                        ;put value from A in Y back to A     A=SpeedVar
SetSpSpd: jsr SmallBBox              ;set bounding box control, etc.      A=SpeedVar
          ...

Bisher ganz gut. A speichert den entsprechenden Geschwindigkeitswert.

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

Ups, der Sprung zur Bounding-Box-Subroutine überschrieb A! All die Arbeit, umsonst.

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

Nun endet A mit dem Wert 00 und das Spiel springt zurück zur 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.

...und die Geschwindigkeit wird auf 0 gesetzt. Die Bewegungsrichtung ist auf Rechts gesetzt, doch da das Ei aber keine horizontale Geschwindigkeit hat und die Richtung bein Spawnen zurückgesetzt wird, bedeutet das nicht allzu viel.

Um diesen Fehler zu beheben, verschiebe einfach das "jsr SmallBBox" zu nach dem Opcode dey.

(Source: doppelganger's SMBDis)