Beiträge von Chris

geschrieben am 12.02.2011 12:45:01 in Allgemeine Diskussionen
( Link )
Das würd mich auch mal interessieren. Diktate gehörten doch eigentlich zu den leichtesten Übungen. Ich habe nie verstanden, dass manche dort enorme Probleme hatten. Gut, die Bewertung war ziemlich streng (bei zwei Fehlern schon ne 3...).
geschrieben am 12.02.2011 14:05:10 in Screenshots/Videos Thread - Zeige dein Zeug h(i)er!
( Link )
So gefällt es mir besser. Jetzt sehen die Farben auch noch mehr nach Abendrot aus.
geschrieben am 12.02.2011 14:14:55 in Allgemeine Diskussionen
( Link )
Ja, ich rudere zurück und sage, dass Diktate dem einen leichter und dem anderen schwerer fallen, wie mit allem. Trotzdem glaube ich, dass Diktate im Allgemeinen leichter sind als beispielsweise eine Erörterung oder eine Interpretation zu schreiben. In letzteren beiden Fällen konnte ich meine Note manchmal nur durch eine gute Teilnote in Rechtschr./Grammatik retten.
Ich hab mich jedenfalls immer gefreut, wenn wir statt Literatur usw. endlich mal wieder Grammatik behandelten.
geschrieben am 14.02.2011 20:53:19 in Allgemeine Hex- und ASM-Fragen
( Link )
Hallo, ich habe hier einen Code für level.asm, der einen Layer-3-Hintergrund langsamer scrollen lässt und ihn hinter dem Layer-2-Hintergrund verschwinden lässt:
Code
	REP #$20
LDA $1C
LSR A
LSR A
STA $24
LDA $1A ; Scroll four times as slow as Layer 1.
LSR A
LSR A
STA $22 ; Layer 3 X.
LDA #$1F1F
STA $212C
SEP #$20


Ich möchte hierzu die Priority ändern, also so, dass Layer 3 vor allem anderen ist, also auch vor Layer 1 und den Sprites. Was muss ich hier ändern?
geschrieben am 19.02.2011 14:11:26 in Allgemeine SMW Hacking Fragen
( Link )
Ich habe in folgendem Level folgendes Problem:

Ich kam als Feuer-Mario ins Level hinein. Doch sobald Mario springt und die Y-Position 3 Blöcke über dem Wasser erreicht ( also ein Block höher als die Röhre, in LM Y-Position 3), wird Mario verletzt. Wenn ich nun wieder hochspringen würde, würde Mario klein werden usw.

Es ist dort aber wie man sieht kein Block vorhanden, auch kein Sprite. Es gibt kein Generator in dem Level, der Level-Modus ist 00. Mit dem Layer-3-Wasser hat das auch nicht zu tun. Das Problem hatte ich auch in "normalen" Levels, sobald Mario diese Höhe erreicht.
Hat jemand eine Idee, woran das liegen könnte?

In einem ähnlichen Wasserlevel in meinem Hack passiert das aber nicht, es ist also kein globales Problem.


EDIT: Ursache erkannt, es liegt an den SMB1-Firebars...irgendwie scheinen die nicht ganz hinzuhauen.
geschrieben am 20.02.2011 1:06:59 in Allgemeine Hex- und ASM-Fragen
( Link )
Beim Airship verwenden wir Layer-3-Nebel. Doch wir haben folgendes Problem:

Bestimmte Sprites verschwinden hinter Layer 3, aber nur solche, die auch hinter Objekten verschwinden, wie Piranha-Pfl. oder halt Rocky Wrench. Und das, obwohl Layer 3 transparent ist. Alle anderen Sprites wie auch Mario sind hinter dem Nebel sichtbar.
Kann mir jemand einen Code entwerfen, der dafür sorgt, dass ALLE Sprites vor Layer 2 und Layer 3 zu sehen sind?


Noch eine Frage: Wie kann man die Priority des Schraubenschlüssels so einstellen, dass er nicht mehr hinter Layer-1-Objekten verschwindet:
Code
;rocky wrench projectile
;by smkdan

DIR = $03
PROPRAM = $04
TEMP = $09

SPEED dcb $10,$F0 ;yeah

dcb "INIT"
RTL

dcb "MAIN"
PHB
PHK
PLB
JSR Run
PLB
RTL


Run
JSR SUB_OFF_SCREEN_X0
JSR GET_DRAW_INFO
JSR GFX ;draw sprite

LDA $14C8,x
CMP #$08
BNE Return
LDA $9D ;locked sprites?
BNE Return
LDA $15D0,x ;yoshi eating?
BNE Return

LDY $157C,x
LDA SPEED,y
STA $B6,x

JSL $018022 ;no x gravity
JSL $01A7DC ;mario interact

Return
RTS

;=====

TILEMAP dcb $EC,$EE,$EE,$EC
PROP dcb $00,$00,$80,$40


GFX
LDA $15F6,x ;properties...
STA PROPRAM

LDA $14 ;frame counter
LSR A
LSR A ;every 4th frame
AND #$03 ;3 frames
STA TEMP ;frame index

OAM_Loop
LDA $00
STA $0300,y ;xpos
LDA $01
STA $0301,y ;ypos
LDX TEMP
LDA TILEMAP,x
STA $0302,y ;tilemap
LDA PROPRAM
ORA PROP,x ;properties
STA $0303,y

LDX $15E9 ;restore sprite index

LDY #$02 ;16x16
LDA #$00 ;1 tile
JSL $01B7B3 ;reserve

RTS

;=================
;BORROWED ROUTINES
;=================

;GET_DRAW_INFO
;==============

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B760 - graphics routine helper - shared
; sets off screen flags and sets index to OAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T1 dcb $0C,$1C
SPR_T2 dcb $01,$02

GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /

ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_OFF_SCREEN
; This subroutine deals with sprites that have moved off screen
; It is adapted from the subroutine at $01AC0D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T12 dcb $40,$B0
SPR_T13 dcb $01,$FF
SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
dcb $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes

SUB_OFF_SCREEN_X1 LDA #$02 ; \ entry point of routine determines value of $03
BRA STORE_03 ; | (table entry to use on horizontal levels)
SUB_OFF_SCREEN_X2 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X3 LDA #$06 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X4 LDA #$08 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X5 LDA #$0A ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X6 LDA #$0C ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X7 LDA #$0E ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_X0 STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_35 ; /
LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
AND #$01 ; |
BNE VERTICAL_LEVEL ; /
LDA $D8,x ; \
CLC ; |
ADC #$50 ; | if the sprite has gone off the bottom of the level...
LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
ADC #$00 ; |
CMP #$02 ; |
BPL ERASE_SPRITE ; / ...erase the sprite
LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
SPR_L31 LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_35 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ; \
LSR A ; |
BCS RETURN_35 ; /
LDA $E4,x ; \
CMP #$00 ; | if the sprite has gone off the side of the level...
LDA $14E0,x ; |
SBC #$00 ; |
CMP #$02 ; |
BCS ERASE_SPRITE ; / ...erase the sprite
LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
LDA.W $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
SPR_L38 LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490

SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
ORA $186C,x ; |
RTS ; / return
geschrieben am 20.02.2011 12:38:02 in Allgemeine Hex- und ASM-Fragen
( Link )
Danke für deine Hilfe. Der Code für Layer 3 ist übrigens wenig hilfreich, da dann alle Sprites sowie Mario hinter dem Nebel komplett verschwinden.
Aber das mit dem Schraubenschlüssel klappt. Das hab ich jetzt quasi auf Rockywrench übertragen, sodass dieser im Nebel zu sehen ist.
geschrieben am 20.02.2011 21:09:25 in Allgemeine Hex- und ASM-Fragen
( Link )
Ich muss nochmal was fragen. Diesmal möchte ich, das der Hammer, den der SMB3-Hammerbruder schmeißt, und der Hammerbruder selber höchste Priorität hat, also vor allem anderen ist:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Hammer Brother, by mikeyk
;;
;; Description: This guy walks back and forth, throwing hammers at Mario.
;;
;; Uses first extra bit: NO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

HAMMER_TILE = $6D

TILEMAP dcb $46,$4A,$7F,$00
dcb $46,$5A,$2F,$00
dcb $48,$4A,$7F,$00
dcb $48,$5A,$2F,$00

HORZ_DISP dcb $00,$00,$08
dcb $00,$08,$00
VERT_DISP dcb $F8,$08,$08
TILE_SIZE dcb $02,$00,$00

PROPERTIES dcb $40,$00 ;xyppccct format

SPEED_TABLE dcb $05,$FB ; speed of hammer bro, right, left

TIME_TO_SHOW = $18 ;time to display the boomerang before it is thrown
TIME_TILL_THROW = $28

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
PHY
JSR SUB_GET_DIR
TYA
STA $157C,x
PLY

TXA
AND #$01
ASL A
ASL A
ASL A
ASL A
CLC
ADC #$20
STA $1558,x
;STA $1570,x
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
HAMMER_BRO_JSL PHB ; \
PHK ; | main sprite function, just calls local subroutine
PLB ; |
JSR START_HB_CODE ; |
PLB ; |
RTL ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

STAR INC $1558,x
RETURN RTS
START_HB_CODE JSR SUB_GFX ; draw hammer bro gfx
LDA $14C8,x ; \ if hammer bro status != 8...
CMP #$02 ; } ... not (killed with spin jump [4] or star[2])
BEQ STAR
CMP #$08
BNE STAR ; / ... return
LDA $9D ; \ if sprites locked...
BNE RETURN ; / ... return

JSR SUB_OFF_SCREEN_HB ; only process hammer bro while on screen
INC $1570,x ; increment number of frames hammer bro has been on screen
LDA $1570,x ; \ calculate which frame to show:
LSR A ; |
LSR A ; |
LSR A ; |
AND #$01 ; | update every 16 cycles if normal
LABEL3 STA $1602,x ; / write frame to show

LDA $1540,x
BEQ DISABLE_NOT_SET
CMP #$01
BNE DISABLE_NOT_SET
LDA $1686,x
AND #$7F
STA $1686,x

DISABLE_NOT_SET

LDA $1558,x ; \ if time until throw < TIME_TO_SHOW
CMP #TIME_TO_SHOW ; |
BCS NO_THROW ; |
INC $1602,x ; | change image (hammer will be displayed)
INC $1602,x ; /

LDA $1558,x ; \ if time until throw = 0
BNE NO_TIME_SET ; |
LDA #TIME_TILL_THROW ; | set the timer
STA $1558,x ; /
NO_TIME_SET CMP #$01 ; \ call the hammer routine if the timer is
BNE NO_THROW ; | about to tun out
JSR SUB_HAMMER_THROW ; /
NO_THROW

LDA $1588,x ; \ if sprite is not on ground...
AND #$04 ; } ...(4 = on ground) ...
BEQ NO_JUMP ; / ...goto NO_JUMP
LDA #$10 ; \ y speed = 10
STA $AA,x ; /

JSR SUB_GET_DIR ; \ always face mario
TYA ; |
STA $157C,x ; /

LDA $1570,x ; \ makes hammer bro jump
CLC ; |
ADC #$77 ; |
AND #$E7 ; |
BNE NO_JUMP ; |

JSR SUB_GET_SPEED

LDA $1686,x
ORA #$80
STA $1686,x



NO_JUMP LDA $14 ; \ set x speed
AND #$3F ; |A:014C X:0009 Y:0001 D:0000 DB:03 S:01E9 P:envMXdizcHC:1328 VC:089 00 FL:19405
BNE LABEL4 ; |A:0140 X:0009 Y:0001 D:0000 DB:03 S:01E9 P:envMXdizcHC:1344 VC:089 00 FL:19405
LDA $151C,x ; |
EOR #$01 ; |
STA $151C,x ; |
LABEL4 LDA $151C,x ; |
AND #$01 ; |
TAY ; |
LDA SPEED_TABLE,y ; |
STA $B6,x ; / A:01F9 X:0009 Y:0001 D:0000 DB:03 S:01E9 P:eNvMXdizcHC:0014 VC:090 00 FL:19405

JSL $01802A ; update position based on speed values

LDA $1588,x ; \ if hammer bro is touching the side of an object...
AND #$03 ; |
BEQ DONT_CHANGE_DIR ; |
LDA $151C,x ; |
EOR #$01 ; | ... change hammer bro direction
STA $151C,x ; /

DONT_CHANGE_DIR JSL $018032 ; interact with other sprites
JSL $01A7DC ; check for mario/hammer bro contact

NO_CONTACT RTS ; return



JUMP_HEIGHT dcb $A0,$D0
DISABLE_TIME dcb $28,$2B

SUB_GET_SPEED LDA $14D4,x
XBA
LDA $D8,x
PHP
REP #$30
CMP.W #$0138
BCS JUMP_UP
CMP.W #$00F8
BCC JUMP_DOWN
PLP
LDA $7B
ADC $7D
ADC $13
ADC $AA,x
ADC $B6,x
ADC $E4,x
ADC $94
ADC $0F33
ADC $02AC
ADC $03F0
AND #$01

PHY
TAY
SET_HEIGHT LDA DISABLE_TIME,y
STA $1540,x
LDA JUMP_HEIGHT,y
STA $AA,x
PLY
RTS

JUMP_UP PLP
PHY
LDY #$00
BRA SET_HEIGHT

JUMP_DOWN PLP
PHY
LDY #$01
BRA SET_HEIGHT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hammer routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

X_OFFSET dcb $F6,$0A
X_OFFSET2 dcb $FF,$00

Y_SPEED = $CF

SUB_HAMMER_THROW LDA $15A0,x ;A:0100 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0130 VC:086 00 FL:19396
ORA $186C,x ;A:0101 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0162 VC:086 00

FL:19396
ORA $15D0,x
BNE LABEL6

GENERATE_EGG LDA #$37 ; \ sound effect
STA $1DF9

LDY #$ED ;A:0218 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0522 VC:104 00 FL:19452
LDA $157C,x ;A:0218 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0538 VC:104 00 FL:19452
BNE LABEL9 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0570 VC:104 00 FL:19452
LDY #$14 ;A:0200 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0210 VC:098 00 FL:21239
LABEL9 STY $00 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0592 VC:104 00 FL:19452

LDY #$07 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0616 VC:104 00 FL:19452
LABEL8 LDA $170B,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0632 VC:104 00 FL:19452
BEQ LABEL7 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0664 VC:104 00 FL:19452
DEY ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0088 VC:103 00 FL:19638
BPL LABEL8 ;A:0204 X:0009 Y:0006 D:0000 DB:03 S:01E8 P:envMXdizcHC:0102 VC:103 00 FL:19638
RTS ;
LABEL7 LDA #$04 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0686 VC:104 00 FL:19452
STA $170B,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0702 VC:104 00 FL:19452

PHY
LDA $157C,x
TAY
LDA $E4,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0734 VC:104 00 FL:19452
CLC
ADC X_OFFSET,y
PLY
STA $171F,y ;A:02C9 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0764 VC:104 00 FL:19452
PHY
LDA $157C,x
TAY
LDA $14E0,x ; |
ADC X_OFFSET2,y
PLY
STA $1733,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0828 VC:104 00 FL:19452

LDA $D8,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0860 VC:104 00 FL:19452
STA $1715,y ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0890 VC:104 00 FL:19452
LDA $14D4,x ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0922 VC:104 00 FL:19452
STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0954 VC:104 00 FL:19452
LDA #Y_SPEED ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0986 VC:104 00 FL:19452
STA $173D,y ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1002 VC:104 00 FL:19452
LDA $00 ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1034 VC:104 00 FL:19452
STA $1747,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1058 VC:104 00 FL:19452
BRA LABEL10 ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1090 VC:104 00 FL:19452
LABEL6 RTS ;A:0101 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0248 VC:086 00 FL:19396
LABEL10 LDA $1715,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1112 VC:104 00 FL:19452
ADC #$F7 ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:1144 VC:104 00 FL:19452
STA $1715,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1160 VC:104 00 FL:19452
BCC LABEL11 ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1192 VC:104 00 FL:19452
LDA $1729,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1208 VC:104 00 FL:19452
ADC #$FF ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1240 VC:104 00 FL:19452
STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1256 VC:104 00 FL:19452
LABEL11 RTS ;A:0220 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1336 VC:104 00 FL:19452


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_GFX JSR GET_DRAW_INFO ; after: Y = index to sprite tile map ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
LDA $1602,x ; \
ASL A
ASL A ; | $03 = index to frame start (frame to show * 2 tile per frame)
STA $03 ; /
LDA $157C,x ; \ $02 = sprite direction
STA $02 ; /
PHX ; push sprite index

LDX #$02 ; loop counter = (number of tiles per frame) - 1
LOOP_START PHX ; push current tile number

PHX
TXA
LDX $02
BNE NO_ADJ
CLC
ADC #$03
NO_ADJ TAX
LDA $00 ; \ tile x position = sprite x location ($00)
CLC
ADC HORZ_DISP,x
STA $0300,y ; /
PLX

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
CLC ; |
ADC VERT_DISP,x ; |
STA $0301,y ; /

LDA TILE_SIZE,x
PHX
PHA
TYA ; \ get index to sprite property map ($460)...
LSR A ; | ...we use the sprite OAM index...
LSR A ; | ...and divide by 4 because a 16x16 tile is 4 8x8 tiles
TAX ; |
PLA
STA $0460,x ; /
PLX

TXA ; \ X = index to horizontal displacement
ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
TAX ; \

LDA TILEMAP,x ; \ store tile
STA $0302,y ; /

LDX $02 ; \
LDA PROPERTIES,x ; | get tile properties using sprite direction
LDX $15E9 ; |
ORA $15F6,x ; | get palette info
ORA $64 ; | ?? what is in 64, level properties... disable layer priority??
STA $0303,y ; / store tile properties

PLX ; \ pull, X = current tile of the frame we're drawing
INY ; | increase index to sprite tile map ($300)...
INY ; | ...we wrote 1 16x16 tile...
INY ; | ...sprite OAM is 8x8...
INY ; | ...so increment 4 times
DEX ; | go to next tile of frame and loop
BPL LOOP_START ; /

PLX ; pull, X = sprite index

LDA $1558,x
CMP #$02
BCC NO_SHOW_HAMMER
CMP #30
BCS NO_SHOW_HAMMER
LDA $1602,x
CMP #$02
BCS SHOW_HAMMER_TOO

NO_SHOW_HAMMER LDY #$FF ; \ 02, because we didn't write to 460 yet
LDA #$02 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

HAMMER_OFFSET dcb $00,$00

SHOW_HAMMER_TOO PHX

LDA $00
LDX $02
CLC
ADC HAMMER_OFFSET,x
STA $0300,y

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
CLC ; |
ADC #$F2
STA $0301,y ; /

LDA #HAMMER_TILE ; \ store tile
STA $0302,y ; /

PHX
TYA ; \ get index to sprite property map ($460)...
LSR A ; | ...we use the sprite OAM index...
LSR A ; | ...and divide by 4 because a 16x16 tile is 4 8x8 tiles
TAX ; |
LDA #$02
STA $0460,x ; /
PLX

LDA #$07
CPX #$00
BNE NO_FLIP_HAMMER
ORA #$40
NO_FLIP_HAMMER ORA $64 ; | put in level properties
STA $0303,y ; / store tile properties

PLX
INY ; | increase index to sprite tile map ($300)...
INY ; | ...we wrote 1 16x16 tile...
INY ; | ...sprite OAM is 8x8...
INY ; | ...so increment 4 times

LDY #$FF ; \ 02, because we didn't write to 460 yet
LDA #$03 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; routines below can be shared by all sprites. they are ripped from original
; SMW and poorly documented
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B760 - graphics routine helper - shared
; sets off screen flags and sets index to OAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B75C

TABLE1 dcb $0C,$1C
TABLE2 dcb $01,$02

GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /

ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC TABLE1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA TABLE2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B817 - horizontal mario/sprite check - shared
; Y = 1 if mario left of sprite??
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B817 ; Y = 1 if contact

SUB_GET_DIR LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B85D - off screen processing code - shared
; sprites enter at different points
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B83B

TABLE3 dcb $40,$B0
TABLE6 dcb $01,$FF
TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF

SUB_OFF_SCREEN_MOLE LDA #$06 ; \ entry point of routine determines value of $03
BRA STORE_03 ; |
SUB_OFF_SCREEN_X1 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X2 LDA #$02 ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_HB STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_2 ; /
LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
AND #$01 ; |
BNE VERTICAL_LEVEL ; /
LDA $D8,x ; \
CLC ; |
ADC #$50 ; | if the sprite has gone off the bottom of the level...
LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
ADC #$00 ; |
CMP #$02 ; |
BPL ERASE_SPRITE ; / ...erase the sprite
LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_2 ; /
LDA $13 ; \
AND #$01 ; |
ORA $03 ; |
STA $01 ; |
TAY ; /
LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
CMP $E4,x ;x pos ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0364 VC:090 00 FL:16953
PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
LDA $1B ;x boundry hi ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizCHC:0416 VC:090 00 FL:16953
LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
SBC $14E0,x ;x pos high ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0538 VC:090 00 FL:16953
STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
LDA #$00 ; \ mark sprite to come back A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0204 VC:071 00 FL:21152
STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_2 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_2 ; /
LDA $13 ; \ only handle every other frame??
LSR A ; |
BCS RETURN_2 ; /
AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195

SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
ORA $186C,x ; |
RTS ; / return


Kann das jemand für mich machen? Vielen Dank!
geschrieben am 21.02.2011 18:09:53 in Chris' SMB3-styled Hack
( Link )
Die Welten sind ähnlich wie in SMB3: Es wird neben dem Grasland, das aus verschiedenen Abschnitten bestehen wird, auch eine Wüste, eine Wasserwelt, eine Eiswelt und eine Röhrenwelt geben und nicht zu vergessen die letzte Welt, in der Bowser lebt. Es wird auch mehrere Riesenwelt-Levels sowie Himmel-Levels geben, die aber keine eigene Welt innehaben.
Eine Story ist für das alles nicht vorgesehen, du kannst natürlich was vorschlagen, wenn dir was Passendes einfällt. Aber eigentlich ist es das gleiche Spiel wie eh und je, nämlich dass Bowser die Prinzessin entführt hat und Mario sie befreien muss. Ich lege keinen großen Wert auf Story, sondern vielmehr auf das Spiel an sich.

Meinen ursprünglichen Zeitplan, den Hack im März zu beenden, werde ich nicht einhalten können. Durch neu verfügbare Dinge wie neue Patches oder Sprites und durch neue Ideen, die es umzusetzen galt (was manchmal echt schwierig war/ist), zögert sich alles hinaus. Auch habe ich bestehende Levels nochmal überarbeitet.
Aber letztendlich führen all diese Dinge zur Verbesserung und Perfektionierung meines SMB3-Hacks. Gut Ding will Weile haben .
geschrieben am 26.02.2011 16:25:20 in Chris' SMB3-styled Hack
( Link )
Ich hab jetzt nach längerer Zeit auch mal wieder etwas zum Präsentieren. Es handelt sich um SMB2-styled Levels, ohne den Bezug zu SMB3 zu verlieren.

Eine Pyramide mit allem, was dazugehört:


SMB2 bei Nacht:

Den Hintergrund im zweiten Abschnitt (mit den Ranken) habe ich inzwischen aber etwas nach unten versetzt.

Die Item-Box habe ich jetzt übrigens komplett entfernt.
geschrieben am 02.03.2011 22:21:08 in Super Mario Bros. 3.5
( Link )
Die Idee ist ziemlich gut, den Boden als Layer 2 einzubauen. Verwendest du einen speziellen Level-Mode, um das hinzukriegen? Falls das mit dem HDMA-Scrolling nicht hinzubekommen sein sollte, wüsste ich evtl. eine andere Lösung, um zumindest das Problem mit den Pilzen und Blumen zu lösen. Aber dazu später mehr.
Übrigens, die Overworld dazu gefällt mir sehr gut!
geschrieben am 06.03.2011 13:17:31 in Du suchst Custom Sprites/Blocks/Music oder Graphics? Hier!
( Link )
@ Seuchensoldat:
http://www.smwcentral.net/?p=viewthread&t=40831 ganz oben, ist ein Spritepack, in dem dein gewünschter Generator enthalten ist.
Leider hab ich keine Ahnung, wie man das Autoscrolling nach seinen Wünschen einstellen kann. Aber wie ich dich kenne, wirst du das bald herausfinden .
geschrieben am 08.03.2011 20:11:29 in Show-Off of my hacks
( Link )
Hört sich alles ziemlich interessant an. Ich werde diese Sache auf jeden Fall im Auge behalten. Bin auf die ersten Levels gespannt.
geschrieben am 10.03.2011 22:12:59 in Allgemeine Hex- und ASM-Fragen
( Link )
Ich möchte, dass der SMB3-Blooper nicht mehr durch feste Objekte schwimmen kann. Dazu habe ich einen Code gefunden:
Code

ObDet: LDA $1588,x
AND #$03
BEQ NotTouchingSide
STZ $B6,x
NotTouchingSide:
LDA $1588,x
AND #$08
BNE TouchingPartofObject
LDA $1588,x
AND #$04
BNE TouchingPartofObject
RTS
TouchingPartofObject:
STZ $AA,x
RTS


Den habe ich dann in den folgenden Blooper-Code an der dort markierten Stelle eingefügt (unter Handle Movement):
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Smb3 Blooper
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; symbolic names for RAM addresses
IS_MOVING_HORZTLY = $151C
ATTACK_TIMER = $1540
DIRECTION = $C2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT and MAIN routines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DCB "INIT"
LDA #$18
STA ATTACK_TIMER,X
RTL

DCB "MAIN"
PHB
PHK
PLB
JSR BlooperMain
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sprite Main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BlooperMain: JSR SubGfx ; Draw sprite

LDA $14C8,X ; \ Return if status != Normal
CMP #$08 ; |
BNE Return ; /
LDA $9D ; \ Return if sprites are locked
BNE Return ; /

JSR SubOffScreen ; Only process while on screen

JSR MoveSprite
JSL $018022 ; Update x position, no gravity
JSL $01801A ; Update y position, no gravity

LDA #$00 ; \ Make stompable if Mario isn't Swimming
LDY $75 ; |
BNE NotSwimming ; |
LDA #$10 ; |
NotSwimming: STA $1656,X ; /

JSL $01A7DC ; Handle Mario/sprite contact

Return: RTS


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Handle movement
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SpeedY: dcb $08,$EB
InitialSpeedX: dcb $06,$FA
AccelerationX: dcb $02,$FE
MaxSpeedX: dcb $20,$E0

(HIER HAB ICH DEN CODE EINGEFÜGT)

MoveSprite: STZ $1602,X ; Initialize animation frame

LDA IS_MOVING_HORZTLY,X ; \ If we are in the middle of an attack...
BNE SetAttackSpeed ; / ...just update the speed

LDY #$00 ; \ Set descending speed
LDA SpeedY,Y ; |
STA $AA,X ; /

LDA ATTACK_TIMER,X ; \ Change animation frame if time to attack == #$0B
CMP #$0B ; |
BCS NoChangeImage ; |
LDA #$01 ; |
STA $1602,X ; /
NoChangeImage: LDA ATTACK_TIMER,X ; \ Return if not time to attack
BNE Return2 ; /

JSR SubVertPos ; \ Return if not close enough to Mario
TYA ; |
BEQ Return2 ; /

StartAttack: STZ $00 ; \ Set Y = direction Blooper should attack
JSR GetRand ; |
CMP #$01 ; |
BNE MoveTowardMario ; |
INC $00 ; |
MoveTowardMario: JSR SubHorzPos ; | He will tend to go towards Mario...
TYA ; | ...but there is a semi-random factor
EOR $00 ; |
TAY ; /
STA DIRECTION,X ; Set acceleration direction
INC IS_MOVING_HORZTLY,X ; Set movement flag
LDA InitialSpeedX,Y ; \ Set inital X speed
STA $B6,X ; /

SetAttackSpeed: LDY #$01 ; \ Set Attacking Y Speed
LDA SpeedY,Y ; |
STA $AA,X ; /

LDY DIRECTION,X ; \
LDA $B6,X ; | Update X speed
CLC ; |
ADC AccelerationX,Y ; |
STA $B6,X ; | If the speed is 0...
BEQ DoneAttacking ; / ...we are done attacking

CMP MaxSpeedX,Y ; \ If we have hit the max speed...
BNE Return2 ; | ...we flip the direction...
LDA DIRECTION,X ; | ...to begin deccelerating
EOR #$01 ; |
STA DIRECTION,X ; /
BRA Return2

DoneAttacking: STZ IS_MOVING_HORZTLY,X ; Reset movement flag
LDA #$36 ; \ Set timer until next attack
STA ATTACK_TIMER,X ; /

Return2: RTS

GetRand: JSL $01ACF9
AND #$07
RTS
...

Trotzdem verhält sich Blooper unverändert. Ist am eingefügten Code was falsch? Oder muss noch woanders ein Verweis auf diesen Code eingefügt werden?
geschrieben am 11.03.2011 19:46:04 in Allgemeine Hex- und ASM-Fragen
( Link )
Hmm, wenn ich das mache, ändert sich zwar nichts. Aber wenn ich aus dem zusätzlichen Code die beiden RTS entferne, bewegt sich Blooper ein wenig anders, aber immer noch durch Objekte. Also zumindest scheint der Code ausgeführt zu werden. Nur scheint irgendwas daran falsch zu sein...ich werd mal den Ersteller des Bloopers fragen. Trotzdem danke für die Hilfe.
geschrieben am 11.03.2011 19:56:28 in Show-Off of my hacks
( Link )
Die NES-Grafik ist nicht so mein Fall, ich bevorzuge Allstars-Grafiken

Der Levelaufbau ist dir durchaus gelungen und vermittelt schon ein gewisses SMB1-Feeling, nur der letzte Teil (Underground) ist noch ziemlich langweilig, aber anscheinend eh noch nicht fertig. Für ein Special World Level wäre das Level aber viel zu einfach. Vom Schwierigkeitsgrad her müsste es eher eines der ersten Levels überhaupt sein.
geschrieben am 12.03.2011 22:45:21 in Zeug aus meinen SMW Hacks
( Link )
Mir gefällt das Level ganz gut, hab nichts zu meckern. Das Leveldesign ist gut und der Schwierigkeitsgrad ist für meinen Geschmack auch noch in Ordnung. Mit der Palette kann ich auch leben.
geschrieben am 13.03.2011 17:58:42 in Allgemeine SMW Hacking Fragen
( Link )
Zitat von Bladey:
Gibt es einen Patch oder allgemein die Möglichkeit, dass es nur noch Pilze gibt und keine Blumen & Federn?


Wenn du möchtest, dass grundsätzlich nur noch Pilze aus den Blöcken rauskommen, dann empfehle ich dir, deine Rom im Hex-Editor zu öffnen und dort die Daten entsprechend zu ändern:

10AA5 1 byte Sprite number Sprite that comes out of blocks 117 and 11F when big (Flower)
10AA7 1 byte Sprite number Sprite that comes out of blocks 118 and 120 when big, and 16A regardless of status (Feather)
10AB6 1 byte Sprite number Sprite that comes out of block 117 when big (Flower), when Yoshi is present.
10AB8 1 byte Sprite number Sprite that comes out of block 118 when big (Feather), when Yoshi is present.

Bei diesen Adressen trägst du dann immer die Spritenummer des Pilzes ein (74).
geschrieben am 16.03.2011 20:58:44 in Du suchst Custom Sprites/Blocks/Music oder Graphics? Hier!
( Link )
Ihr müsst nur mal bisschen auf der Sprite-Seite von SMWC suchen, dort findet ihr (fast) alles, was ihr braucht.

Zitat von wertzedu:
ich suche diesen Level-Beenden-Effekt von SMB1, also diese Stange zum runter rutschen.


http://www.smwcentral.net/download.php? ... pe=sprites Wurde vor wenigen Tagen veröffentlicht, kam mir selbst wie gerufen.

Zitat von MarcelLp:
-Ich hab jetzt grad kein Video, jedenfalls suche ich diese roten Plattformen von YI ( um genauer zu sein da steht zb ne 2 drauf, das heißt das man 2mal drauf springen und danach löst sich die Plattform auf) Ich denke ihr wisst welchen Sprite ich meine.


http://www.smwcentral.net/download.php? ... pe=sprites Nennt sich YI Exploding Platforms. Dort kann übrigens auch eine 4 oder 3 oder 1 drauf sein und es gibt sie zudem als 16x16-Platform.
geschrieben am 20.03.2011 19:51:10 in Allgemeine Hex- und ASM-Fragen
( Link )
Ich habe mal wieder ein Problem:

In einigen Levels benutze ich eine Treasure Chest (wie in SMB3). Sie lässt beim Öffnen ein Item in der Itembox erscheinen und beendet automatisch das Level.
Nun habe ich aber die Itembox deaktiviert. Deshalb möchte ich, dass die Treasure Chest ein Item "ausspuckt", das Mario sofort verwenden kann und dann das Level beendet. Deshalb hab ich die asm-Datei etwas bearbeitet.

Die Treasure Chest spuckt das Item tatsächlich aus, beendet aber das Level nicht. Was muss ich am folgenden Code ändern, damit auch dies passiert:

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
;; Extra Property Byte 1
;; bit 0 - spawn a normal sprite (mushroom by default)
;;
;; Extra Property Byte 2
;; bit 0 - spawn a custom sprite (para-beetle by default)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GOAL_TIMER = $80
SOUND_TO_GEN = $36

EXTRA_BITS = $7FAB10
EXTRA_PROP_1 = $7FAB28
EXTRA_PROP_2 = $7FAB34
NEW_SPRITE_NUM = $7FAB9E

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
INC $157C,x ; set direction to the left
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB ; \
PHK ; | main sprite function, just calls local subroutine
PLB ; |
JSR SPRITE_CODE_START ; |
PLB ; |
RTL ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SPRITE_CODE_START LDA $1504,x ; \ if the state is set...
BEQ SKIP_GOAL_TIME ; /

JMP SET_GOAL_TIME ; set goal timer routine

SKIP_GOAL_TIME JSR SUB_GFX ; graphics routine
JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
LDA $9D ; \ if sprites locked, return
BNE RETURN ; /

LDA $1588,x ; \ if sprite is in contact with the ground...
AND #$04 ; |
BEQ IN_AIR ; /
LDA #$10 ; \ set y speed
STA $AA,x ; /

IN_AIR JSL $01802A ; update position based on speed values

JSL $01A7DC ; check for Mario/sprite contact (carry set = contact)
BCC RETURN ; return if no contact
INC $1504,x ; set state

LDA #SOUND_TO_GEN ; \ sound effect
STA $1DFC ; /

LDA EXTRA_BITS,x ; \ set another item if the extra bit is set
AND #$04 ; |
BNE CUSTOM ; /

NORMAL LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /

LDA EXTRA_PROP_1,x ; \ sprite type
STA $9E,x ; /
JSL $07F7D2 ; reset sprite properties
BRA SHARED

CUSTOM LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /

LDA EXTRA_PROP_2,x ; \ sprite type
STA NEW_SPRITE_NUM,x ; /
JSL $07F7D2 ; reset sprite properties
JSL $0187A7 ; get table values for custom sprite
LDA #$88 ; \ mark as initialized
STA EXTRA_BITS,x ; /

SHARED LDA #$20 ; \ time to disable sprite's contact with Mario
STA $154C,x ; /

LDA $D8,x ; \ set y position (low byte)
SEC ; |
SBC #$0F ; |
STA $D8,x ; /
LDA $14D4,x ; \ set y position (high byte)
SBC #$00 ; |
STA $14D4,x ; /

LDA #$00 ; \ set sprite direction depending on Mario's x speed
LDY $7B ; |
BPL DIRECTION ; |
INC A ; |
DIRECTION STA $157C,x ; /

LDA #$C0 ; \ set y speed
STA $AA,x ; /

RETURN RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; end level routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SET_GOAL_TIME LDA $1558,x ; \ if the timer is set...
BEQ SET_TIMER ; /
DEC A ; \ if the timer decreases
BNE RETURN ; /

END_LEVEL LDA $0DD5 ; \ if the secret event is set...
BEQ EXIT ; /
BPL RETURN ; return if set

EXIT LDA $E4,x ; \ set secret exit if the x position is set
AND #$10 ; |
BNE SECRET_EXIT ; /

NORMAL_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
STA $13CE ; store midway flag
BRA SHARED

SECRET_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
INC A ; set secret exit
STA $13CE ; store midway flag

SHARED STA $0DD5 ; activate secret event upon returning to the OW
INC $1DE9 ;
LDA #$0B ; \ set light/resolution
STA $0100 ; /
BRA RETURN

SET_TIMER LDA #GOAL_TIMER ; \ set timer
STA $1558,x ; /
BRA RETURN
...

(Ich schätze mal, dass das Level weiterhin erst beendet wird, wenn etwas in der Itembox erscheint)
Ursprünglich sah der Code so aus:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
;; Extra Property Byte 1
;; bit 0 - put item in item box (mushroom by default)
;;
;; Extra Property Byte 2
;; bit 0 - put item in item box (flower by default)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GOAL_TIMER = $80
SOUND_TO_GEN = $36

EXTRA_BITS = $7FAB10
EXTRA_PROP_1 = $7FAB28
EXTRA_PROP_2 = $7FAB34

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
INC $157C,x ; set direction to the left
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB ; \
PHK ; | main sprite function, just calls local subroutine
PLB ; |
JSR SPRITE_CODE_START ; |
PLB ; |
RTL ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SPRITE_CODE_START LDA $1504,x ; \ if the state is set...
BEQ SKIP_GOAL_TIME ; /

JMP SET_GOAL_TIME ; set goal timer routine

SKIP_GOAL_TIME JSR SUB_GFX ; graphics routine
JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
LDA $9D ; \ if sprites locked, return
BNE RETURN ; /

LDA $1588,x ; \ if sprite is in contact with the ground...
AND #$04 ; |
BEQ IN_AIR ; /
LDA #$10 ; \ set y speed
STA $AA,x ; /

IN_AIR JSL $01802A ; update position based on speed values

JSL $01A7DC ; check for Mario/sprite contact (carry set = contact)
BCC RETURN ; return if no contact
INC $1504,x ; set state

LDA #SOUND_TO_GEN ; \ sound effect
STA $1DFC ; /

LDA EXTRA_BITS,x ; \ set another item if the extra bit is set
AND #$04 ; |
BNE ITEM2 ; /

ITEM PHP ; Push Processor Status Register
LDA EXTRA_PROP_1,x ; \ put item in the item box
STA $0DC2 ; /
PLP ; Pull Processor Status Register
BRA SET_SMOKE

ITEM2 PHP ; Push Processor Status Register
LDA EXTRA_PROP_2,x ; \ put item in the item box
STA $0DC2 ; /
PLP ; Pull Processor Status Register

SET_SMOKE JSR SUB_SMOKE ; smoke routine

RETURN RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; end level routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SET_GOAL_TIME LDA $1558,x ; \ if the timer is set...
BEQ SET_TIMER ; /
DEC A ; \ if the timer decreases
BNE RETURN ; /

END_LEVEL LDA $0DD5 ; \ if the secret event is set...
BEQ EXIT ; /
BPL RETURN ; return if set

EXIT LDA $E4,x ; \ set secret exit if the x position is set
AND #$10 ; |
BNE SECRET_EXIT ; /

NORMAL_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
STA $13CE ; store midway flag
BRA SHARED

SECRET_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
INC A ; set secret exit
STA $13CE ; store midway flag

SHARED STA $0DD5 ; activate secret event upon returning to the OW
INC $1DE9 ;
LDA #$0B ; \ set light/resolution
STA $0100 ; /
BRA RETURN

SET_TIMER LDA #GOAL_TIMER ; \ set timer
STA $1558,x ; /
BRA RETURN