Allgemeine Hex- und ASM-Fragen

geschrieben am 10.02.2012 20:00:26
( Link )
Ja das ist mir auch grade aufgefallen
aber das funktionirt besser wenn man es so macht
Code
LDA #$04
STA $212C
STA $212E

LDA #$13
STA $212D
STA $212F

bzw.

LDA #$02
STA $212C
STA $212E

LDA #$15
STA $212D
STA $212F

schön das man in die ROM map gucken kann um zu schauen wie es im original funktionirt
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 20.02.2012 14:25:13
( Link )
ok ich hab mel wieder ein Problem
Wie kann ich ,wenn ich MariosXSpeed direkt setzte (auto move),verhindern dass er sich Duckt und Umdreht bzw. Dagegen andrückt...
habe schon die $7E13DD,$7E0073 und $7E0076 benutzt aber er soll einfach die ganze Zeit gehen/springen und nichts dagegen tuhen können
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 31.03.2012 13:06:49
( Link )
Wollte mal fragen: Ist es möglich gewisse Übergänge zu ändern?

Also z.B wenn Mario durch eine Röhre geht und das Bild wegpixelt und zum nächsten Level einblendet. Kann ich den ganz simpel durch den Übergang ändern, wenn Mario das Level beendet?
geschrieben am 31.03.2012 13:41:50
( Link )
Zitat von Mert:
Wollte mal fragen: Ist es möglich gewisse Übergänge zu ändern?

Also z.B wenn Mario durch eine Röhre geht und das Bild wegpixelt und zum nächsten Level einblendet. Kann ich den ganz simpel durch den Übergang ändern, wenn Mario das Level beendet?


Dafür gibt es einen Patch auf SMWC; wenn du das meinst (wie bei SMWCP1)

[Xkas] Windowing fadeout/in v1.1
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 31.03.2012 15:34:58
( Link )
Nein, nicht den wie SMWCP. Sondern der Fadeout wenn Mario das Level beendet und der schwarze Kreis alles umschlingt.
Den gibts bei SMB 3 auch, wenn man ein Level betritt.
geschrieben am 31.03.2012 16:47:12
( Link )
Eine leichte Lösung gibt es da vermutlich nicht. Das dürfte komplizierter werden.
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 01.04.2012 0:11:48
( Link )
Ich befasse ich gerade mit asm und habe folgende zwei Fragen:

Ich habe zum Probieren mal einen Block erstellt, der bei Berührung den Coin-Counter um 01 erhöht und nach 99 wieder von 00 beginnt und ein Leben vergibt:
Code
	LDA $0DBF
INC
CMP #99
BCS NULL
STA $0DBF
LDA #$01
STA $1DFC
RTL
NULL:
STZ $0DBF
INC $18E4
RTL

Leider schnellt der Coin-Counter ununterbrochen nach oben (und beginnt wieder von vorne), solange Mario den Block berührt. Wie krieg ich es hin, dass der Coin-Counter sich nur um eine Münze erhöht, egal wie lange Mario den Block berührt? Erst nach Ablassen und erneutem Berühren soll der Coin-Counter um eine weitere Münze steigen.

Die zweite Frage ist vor allem an RPG Hacker gerichtet, da ich etwas aus seinem asm-Tutorial nicht verstehe:

Du schreibst, dass BCC springt, wenn die Carry Flag clear ist. Das passiert, wenn bei einer Subtraktion das Ergebnis kleiner als 00 ist, z. B.
LDA #$02
CMP #$03.
So weit, so gut. Darunter hast du einen Beispielcode aufgeführt, der Mario zu Feuermario machen soll, nur wenn er klein oder Super-Mario ist (also $19 = $00 oder $01):
Code
LDA $19        ; Lade das Powerup
CMP #$02 ; Vergleiche mit $02
BCC FeuerMario ; Kleiner $02? Dann mache Mario zu Feuer Mario
[...]
FeuerMario:
LDA #$03 ;\ Dieser Code wird immer ausgeführt
STA $19 ;/

Du schreibst: "...Benutzt ihr BCC, so wird, wenn die Bedingung erfüllt ist, der Code unter "BCC" gar nicht ausgeführt. Anders wird aber der Code unter "FeuerMario:" selbst dann ausgefüllt, wenn die Bedingung nicht erfüllt ist...."

Vielleicht bin ich etwas schwer von Begriff, aber wenn
$19 = $00 oder $01 und CMP #$02, dann ist das Ergebnis unter $00 und die Carry Flag damit clear und BCC müsste doch springen??
geschrieben am 01.04.2012 0:58:22
( Link )
Zitat von Chris:
Leider schnellt der Coin-Counter ununterbrochen nach oben (und beginnt wieder von vorne), solange Mario den Block berührt. Wie krieg ich es hin, dass der Coin-Counter sich nur um eine Münze erhöht, egal wie lange Mario den Block berührt? Erst nach Ablassen und erneutem Berühren soll der Coin-Counter um eine weitere Münze steigen.


Das ist dann schon etwas komplizierter. Da brauchst du eine freie RAM-Adresse, die du auf #$01 setzt, wenn du den Block berührst und wieder auf #$00, wenn du den Block nicht mehr berührst. Dann sorgst du mit einer Abfrage dafür, dass die Münzen nur erhöht werden, wenn diese RAM-Adresse den Wert #$00 hat.

Zitat von Chris:
Du schreibst: "...Benutzt ihr BCC, so wird, wenn die Bedingung erfüllt ist, der Code unter "BCC" gar nicht ausgeführt. Anders wird aber der Code unter "FeuerMario:" selbst dann ausgefüllt, wenn die Bedingung nicht erfüllt ist...."

Vielleicht bin ich etwas schwer von Begriff, aber wenn
$19 = $00 oder $01 und CMP #$02, dann ist das Ergebnis unter $00 und die Carry Flag damit clear und BCC müsste doch springen??


So ist es. Genau das habe ich ja auch geschrieben. Was ich damit sagen wollte, war, dass in diesem Fall der Code, der direkt unter BCC steht (und über "FeuerMario:"), übersprungen wird. Der Code, der Unter "FeuerMario:" steht, wird hingegen IMMER ausgeführt, außer man packt irgendwo zwischen BCC und "FeuerMario:" noch einen Sprungbefehl.
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 06.04.2012 23:37:50
( Link )
Code
HEADER
LOROM

ORG $00D630
JML Main

!Freespace = $1FB000 ;POINT THIS TO SOME FREE SPACE!!!!!! AAAAAAAA

; =======================================
; CODE FOR U-JUMP GOES HERE
; =======================================

!UYspeed = $97 ;Y speed when doing somersault
!UXspeedright = $03 ;X speed when doing somersault to left
!UXspeedleft = $FD ;same except right
!UJumpSFX = $02 ;Jumping SFX
!USFXPanel = $1DF9 ;SFX panel
!UNeededvelocity = $65 ;Minimum required speed to do a U-jump

ORG !Freespace

db "RATS" ;\
dw codeend-codemain-$01 ; |Prepare RATS tag.
dw codeend-codemain-$01^#$FFFF ;/ (Yes, Xkas also accepts #$FFFF)

codemain:
Main: LDA $13E0 ;\
CMP #$0D ; |Essential check.
BNE Widejump ;/ If the animation is not $0D, go check if it is widejump
LDA $13E4 ;\
CMP #!UNeededvelocity ; |Check velocity.
BCC Return ;/ If low, go to normal jumping routine. Else, do next stuff


LDA #!UXspeedright ;Speed to the right
LDY $76
BNE rightstore
LDA #!UXspeedleft ;speed to the left
rightstore: STA $7B

LDA #!UYspeed ;\Set Y-speed
STA $7D ;/

LDA #!UJumpSFX ;\
STA !USFXPanel ;/Jumping sound effect
JSL $01AB9E ;Show "Contact" GFX

DEC $13E4 ;Make sure you cant run full speed after you land.

finish: JML $00D668 ;Finish u-jump routine

; =======================================
; CODE FOR LONGJUMP GOES HERE
; =======================================

!LYspeed = $B7 ;Y speed when doing somersault
!LXspeedright = $4A ;X speed when doing somersault to left
!LXspeedleft = $B5 ;same except right
!LJumpSFX = $08 ;Jumping SFX
!LSFXPanel = $1DFC ;SFX panel
!LNeededvelocity = $65 ;Minimum required speed to do a U-jump

Widejump: LDA $187A ;comment out these 2 instructions
BNE Return ;and you can longjump with yoshi

LDA $73 ;\If not ducking
BEQ Return ;/return

LDA $13E4 ;\
CMP #!LNeededvelocity ; |Make sure you have enough speed
BCC Return ;/

LDA #!LJumpSFX ;\
STA !LSFXPanel ;/Play sound effect

LDA #!LYspeed ;\
STA $7D ;/Set Y Speed

LDA #!LXspeedright ;Speed to the right
LDY $76
BNE rightwide
LDA #!LXspeedleft ;speed to the left
rightwide: STA $7B
JML $00D668 ;Finish widejump routine

; =======================================
; RECOVER ORIGINAL ROUTINE
; =======================================

Return: LDA $7B ;\
BPL go_D637 ; |Handle normal jumping
JML $00D634 ; |
go_D637: JML $00D637 ;/
codeend:


Dies ist ein Patch. Ich möchte diesen als Code in LevelASM einfügen, aber ich weiß nicht, wie das geht. Ich code zwar selbst EINFACHE Blöcke, aber DAS kann ich noch nicht. ich wäre sehr froh, wenn mir einer helfen könnte!

~Bass
geschrieben am 07.04.2012 0:52:25
( Link )
Das geht nicht mit LevelASM, zumindest nicht so ohne weiteres. Du könntest höchstens dafür sorgen, dass der Patch nur in einigen Levels aktiv ist. Dafür musst man aber einige Teile neu programmieren.
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 07.04.2012 11:45:23
( Link )
so fortgeschritten bin ich noch nicht. Ich wäre echt froh, wenn mir einer von euch das machen könnte (es sollte bisher nur in level C sein)
Danke im Voraus!
geschrieben am 07.04.2012 12:10:28
( Link )
Hallo liebes Forum,
Ich habe (mal wieder) ein Problem.

Und zwar habe ich mir einen Custom Boss runtergeladen.
Funktioniert auch alles super, nur was mich extrem stört: Wenn man im Boss Raum ist, wird ganz Normal die Musik abgespielt, die ich im Raum verwende, aber sobald der Boss Kampf los geht (man muss sich den Boss nähern), spielt er automatisch die Standard Bosskampf Musik ab -__- ..
Nun wollte ich fragen:
Kann ich mit einen Hex-Edit oder anderen Hilfsmitteln die Standard Bosskampf Musik durch eine Custom Bosskampf Musik ersetzen?
Wenn ja, wie?
Oder macht es mehr Sinn den Spritecode zu ändern?
geschrieben am 07.04.2012 12:16:31
( Link )
Zitat von Bladey:
Hallo liebes Forum,
Ich habe (mal wieder) ein Problem.

Und zwar habe ich mir einen Custom Boss runtergeladen.
Funktioniert auch alles super, nur was mich extrem stört: Wenn man im Boss Raum ist, wird ganz Normal die Musik abgespielt, die ich im Raum verwende, aber sobald der Boss Kampf los geht (man muss sich den Boss nähern), spielt er automatisch die Standard Bosskampf Musik ab -__- ..
Nun wollte ich fragen:
Kann ich mit einen Hex-Edit oder anderen Hilfsmitteln die Standard Bosskampf Musik durch eine Custom Bosskampf Musik ersetzen?
Wenn ja, wie?
Oder macht es mehr Sinn den Spritecode zu ändern?


Schick mal den code, ich kanns mir mal ansehen, das problem hatte ich schon beim Balrog boss von Sonikku^^
Falls du aber mit AddmusicM arbeitest, kannst du die musik irgendwie verändern
geschrieben am 07.04.2012 12:20:00
( Link )
Der ist ebenfalls von Sonikku o.o

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Frenzied Toroko
; by Sonikku
; Description: She stands where you place her, and when you get close, she
; transforms into her rabid form. She jumps, throws an aimed block at you, lands
; and throws another. She takes
PROJECT = $04 ; custom sprite number of ToroBlk.cfg
HP = $08 ; how many stomps before she faints.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_HORZ_POS
TYA
STA $157C,x
LDA #$08
STA $1602,x
RTL

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BLNKFRM dcb $08,$08,$08,$08,$08,$08,$08,$09
TRNSFRM dcb $0B,$0C
IDLEFRM dcb $00,$01,$03,$03
AIRCHAR dcb $04,$06
AIRSHOT dcb $05,$07
XSPD dcb $10,$F0
SPRX dcb $FF,$10
SPRX2 dcb $FF,$00
RETURN RTS
START_HB_CODE
LDA $15AC,x
BEQ NOSTUN
LDA $14
AND #$01
BNE NOGFX
NOSTUN JSR SUB_GFX
NOGFX LDA $9D
BNE RETURN
JSL $01802A
LDA $1594,x
JSL $0086DF
dcw STATE0&$FFFF
dcw STATE1&$FFFF
dcw STATE2&$FFFF
STATE0 LDA $1540,x
BEQ NOTIMR0
CMP #$01
BNE NOINC
LDA #$01
STA $1594,x
LDA #$40
STA $1540,x
LDA #$70
STA $163E,x
RTS
NOINC CMP #$70
BCS FRENZY1
CMP #$40
BCS FRENZY2
LDA #$10
STA $1DF9
LDA #$05
STA $1DFB
LDA $14
LSR A
LSR A
LSR A
AND #$01
TAY
LDA IDLEFRM,y
BRA STRFRM0
FRENZY1 LDA #$0A
BRA STRFRM0
FRENZY2 LDA $14
AND #$01
TAY
LDA TRNSFRM,y
STRFRM0 STA $1602,x
RTS
NOTIMR0 JSR SUB_HORZ_POS
LDA $0F
CLC
ADC #$40
CMP #$80
BCS STAND0
LDA #$90
STA $1540,x
RTS
STAND0 LDA $14
LSR A
LSR A
LSR A
AND #$07
TAY
LDA BLNKFRM,y
STA $1602,x
RETURN0 RTS
STATE1 LDA $15AC,x
BNE NOCON
JSL $01A7DC
BCC NOCON
LDA $7D
CMP #$10
BMI SPRWINS
JSL $01AA33
JSL $01AB99
LDA #$0B
STA $72
LDA #$13
STA $1DF9
STZ $AA,x
INC $C2,x
LDA #HP
CMP $C2,x
BNE NOKILL
LDA #$90
STA $1540,x
INC $1594,x
RTS
NOKILL LDA #$40
STA $15AC,x
RTS
SPRWINS JSL $00F5B7
NOCON JSR SUB_HORZ_POS
TYA
STA $157C,x
LDA $1588,x
AND #$03
BEQ NOWALL
STZ $B6,x
NOWALL LDA $1558,x
BEQ NOLAND
LDA #$02
STA $1602,x
RTS
NOLAND LDA $1540,x
BNE NOTIMR
LDA #$70
STA $1540,x
NOTIMR LDA $1588,x
AND #$04
BEQ INAIR
LDA $163E,x
BEQ RESET
CMP #$10
BCC PREJMP
STZ $B6,x
LDA #$02
STA $1602,x
BRA NOJMP
PREJMP LDA #$02
STA $1602,x
RTS
RESET LDA #$C8
STA $AA,x
JSR SUB_HORZ_POS
TYA
LDA XSPD,y
STA $B6,x
LDA #$FF
STA $163E,x
NOJMP LDA $1510,x
BEQ NOAIR
LDA #$10
STA $1558,x
STZ $B6,x
STZ $1510,x
LDA #$20
STA $1887
LDA #$09
STA $1DFC
LDA #$40
STA $1540,x
BRA NOAIR
INAIR LDA #$01
STA $1510,x
DEC $AA,x
LDA $14
AND #$01
BNE NOAIR
DEC $AA,x
DEC $AA,x
NOAIR LDA $1540,x
CMP #$04
BEQ SHOT
CMP #$06
BCC SHOTIN
CMP #$20
BCS SKIP
LDY $1510,x
LDA AIRCHAR,y
BRA STRFRM
SHOTIN LDY $1510,x
LDA AIRSHOT,y
BRA STRFRM
SKIP LDA $14
LSR A
LSR A
LSR A
AND #$01
TAY
LDA $1510,x
BEQ ONGND
INY
INY
ONGND LDA IDLEFRM,y
STRFRM STA $1602,x
RTS
SHOT LDY $1510,x
LDA AIRSHOT,y
STA $1602,x
JSL $02A9DE
BMI RETURN1
LDA #$01
STA $14C8,y
PHX
LDA #PROJECT
TYX
STA $7FAB9E,x
PLX
LDA $E4,x
CLC
ADC #$08
STA $00E4,y
LDA $14E0,x
ADC #$00
STA $14E0,y
LDA $D8,x
SEC
SBC #$0C
STA $00D8,y
LDA $14D4,x
SBC #$00
STA $14D4,y
PHX
TYX
JSL $07F7D2
JSL $0187A7
LDA #$08
STA $7FAB10,x
PLX
LDA #$50
JSR CODE_01BF6A
LDX $15E9
LDA $00
STA $00AA,y
LDA $01
STA $00B6,y
RETURN1 RTS
STATE2 STZ $B6,x
LDA $1540,x
CMP #$01
BEQ ENDLVL
CMP #$60
BCS GOBACK
CMP #$50
BCS FAINT
LDA #$0E
BRA STRFRM2
FAINT LDA #$0D
BRA STRFRM2
GOBACK LDA $14
AND #$01
TAY
LDA TRNSFRM,y
STRFRM2 STA $1602,x
RTS
ENDLVL LDA #$0B
STA $71
LDA #$05
STA $1DF9
LDA #$FF
STA $1DFB
STA $1493
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; aiming routine
; input: accumulator should be set to total speed (x+y)
; output: $00 = y speed, $01 = x speed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CODE_01BF6A: STA $01
PHX ;\ preserve sprite indexes of Magikoopa and magic
PHY ;/
JSR SUB_VERT_POS ; $0E = vertical distance to Mario
STY $02 ; $02 = vertical direction to Mario
LDA $0E ;\ $0C = vertical distance to Mario, positive
BPL CODE_01BF7C ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
CODE_01BF7C: STA $0C ;/
JSR SUB_HORZ_POS ; $0F = horizontal distance to Mario
STY $03 ; $03 = horizontal direction to Mario
LDA $0F ;\ $0D = horizontal distance to Mario, positive
BPL CODE_01BF8C ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
CODE_01BF8C: STA $0D ;/
LDY #$00
LDA $0D ;\ if vertical distance less than horizontal distance,
CMP $0C ; |
BCS CODE_01BF9F ;/ branch
INY ; set y register
PHA ;\ switch $0C and $0D
LDA $0C ; |
STA $0D ; |
PLA ; |
STA $0C ;/
CODE_01BF9F: LDA #$00 ;\ zero out $00 and $0B
STA $0B ; | ...what's wrong with STZ?
STA $00 ;/
LDX $01 ;\ divide $0C by $0D?
CODE_01BFA7: LDA $0B ; |\ if $0C + loop counter is less than $0D,
CLC ; | |
ADC $0C ; | |
CMP $0D ; | |
BCC CODE_01BFB4 ; |/ branch
SBC $0D ; | else, subtract $0D
INC $00 ; | and increase $00
CODE_01BFB4: STA $0B ; |
DEX ; |\ if still cycles left to run,
BNE CODE_01BFA7 ;/ / go to start of loop
TYA ;\ if $0C and $0D was not switched,
BEQ CODE_01BFC6 ;/ branch
LDA $00 ;\ else, switch $00 and $01
PHA ; |
LDA $01 ; |
STA $00 ; |
PLA ; |
STA $01 ;/
CODE_01BFC6: LDA $00 ;\ if horizontal distance was inverted,
LDY $02 ; | invert $00
BEQ CODE_01BFD3 ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
STA $00 ;/
CODE_01BFD3: LDA $01 ;\ if vertical distance was inverted,
LDY $03 ; | invert $01
BEQ CODE_01BFE0 ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
STA $01 ;/
CODE_01BFE0: PLY ;\ retrieve Magikoopa and magic sprite indexes
PLX ;/
RTS ; return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TILEMAP dcb $00,$02,$20,$22 ; #$00 (idle1)
dcb $04,$06,$24,$26 ; #$01 (idle2)
dcb $08,$0A,$28,$2A ; #$02 (jump)
dcb $0C,$0E,$2C,$2E ; #$03 (inair)
dcb $40,$42,$60,$62 ; #$04 (charge1)
dcb $44,$46,$64,$66 ; #$05 (throw1)
dcb $48,$4A,$68,$6A ; #$06 (charge2)
dcb $4C,$4E,$6C,$6E ; #$07 (throw2)
dcb $AC,$AE,$AC,$AE ; #$08 (stand1)
dcb $CC,$CE,$CC,$CE ; #$09 (stand2)
dcb $A0,$A2,$A0,$A2 ; #$0A (frenzy1)
dcb $80,$82,$80,$82 ; #$0B (frenzy2)
dcb $84,$86,$A4,$A6 ; #$0C (frenzy3)
dcb $A8,$AA,$A8,$AA ; #$0D (lost1)
dcb $88,$8A,$88,$8A ; #$0E (lost2)
X_OFFSET dcb $00,$10,$00,$10
dcb $10,$00,$10,$00
Y_OFFSET dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03

dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $F0,$F0,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
BLKTILE dcb $8C,$8E

SUB_GFX JSR GET_DRAW_INFO ; sets y = OAM offset
LDA $157C,x ; \ $02 = direction
ASL A
ASL A
STA $02 ; /

LDA $1602,x
ASL A
ASL A
STA $03

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

PHX
TXA
CLC
ADC $03
TAX
LDA TILEMAP,x
STA $0302,y
LDA Y_OFFSET,x
CLC
ADC $01 ; \ tile y position = sprite x location ($00)
STA $0301,y ; /
PLX

PHX
LDX $15E9
LDA $15F6,x ; tile properties xyppccct, format
LDX $02 ; \ if direction == 0...
BEQ NO_FLIP ; |
ORA #$40 ; / ...flip tile
NO_FLIP ORA $64 ; add in tile priority of level
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
DEX
BPL LOOP_START

PLX
LDA $15A0,x
ORA $186C,x
BNE NOBLK
LDA $1602,x
CMP #$04
BEQ SHOW_HAMMER_TOO
CMP #$06
BEQ SHOW_HAMMER_TOO
NOBLK LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
LDA #$03 ; | A = (number of tiles drawn - 1)
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

SHOW_HAMMER_TOO PHX
LDA $157C,x
BNE NO_ADJ
LDA $00
BRA FINISH
NO_ADJ LDA $00
CLC
ADC #$10
FINISH STA $0300,y

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
SEC ; |
SBC #$0C
STA $0301,y ; /

LDA $14
AND #$01
TAX
LDA BLKTILE,x ; \ 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 #$0F
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 #$04 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $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 ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_HORZ_POS 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 SPR_L16 ;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
SPR_L16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_VERT_POS
; This routine determines if Mario is above or below the sprite. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B829
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_VERT_POS LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
CLC
ADC #$18
SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
STA $0E ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
BPL SPR_L11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
SPR_L11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924


Und ich hoffe du findest was.. Ich finde den Code extrem unübersichtlich.
geschrieben am 07.04.2012 12:28:12
( Link )
Zitat von Bladey:
Code
   LDA #$05
STA $1DFB


Die 05 da ist die Musik, die gespielt wird. Ob es reicht, die Zahl einfach zu der Nummer des Liedes zu ändern, die du haben willst, weiß ich nicht, aber probieren kannst du's ja mal.

Zweite Lösung, die auf jeden Fall funktioniert: Die beiden Zeilen entfernen und die Musik in LM selber einstellen.
geschrieben am 07.04.2012 12:33:56
( Link )
EDIT: mist -.- WYE war schneller als ich^^

Zitat von Bladey:
Der ist ebenfalls von Sonikku o.o

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Frenzied Toroko
; by Sonikku
; Description: She stands where you place her, and when you get close, she
; transforms into her rabid form. She jumps, throws an aimed block at you, lands
; and throws another. She takes
PROJECT = $04 ; custom sprite number of ToroBlk.cfg
HP = $08 ; how many stomps before she faints.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_HORZ_POS
TYA
STA $157C,x
LDA #$08
STA $1602,x
RTL

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BLNKFRM dcb $08,$08,$08,$08,$08,$08,$08,$09
TRNSFRM dcb $0B,$0C
IDLEFRM dcb $00,$01,$03,$03
AIRCHAR dcb $04,$06
AIRSHOT dcb $05,$07
XSPD dcb $10,$F0
SPRX dcb $FF,$10
SPRX2 dcb $FF,$00
RETURN RTS
START_HB_CODE
LDA $15AC,x
BEQ NOSTUN
LDA $14
AND #$01
BNE NOGFX
NOSTUN JSR SUB_GFX
NOGFX LDA $9D
BNE RETURN
JSL $01802A
LDA $1594,x
JSL $0086DF
dcw STATE0&$FFFF
dcw STATE1&$FFFF
dcw STATE2&$FFFF
STATE0 LDA $1540,x
BEQ NOTIMR0
CMP #$01
BNE NOINC
LDA #$01
STA $1594,x
LDA #$40
STA $1540,x
LDA #$70
STA $163E,x
RTS
NOINC CMP #$70
BCS FRENZY1
CMP #$40
BCS FRENZY2
LDA #$10
STA $1DF9
LDA #$05
STA $1DFB
LDA $14
LSR A
LSR A
LSR A
AND #$01
TAY
LDA IDLEFRM,y
BRA STRFRM0
FRENZY1 LDA #$0A
BRA STRFRM0
FRENZY2 LDA $14
AND #$01
TAY
LDA TRNSFRM,y
STRFRM0 STA $1602,x
RTS
NOTIMR0 JSR SUB_HORZ_POS
LDA $0F
CLC
ADC #$40
CMP #$80
BCS STAND0
LDA #$90
STA $1540,x
RTS
STAND0 LDA $14
LSR A
LSR A
LSR A
AND #$07
TAY
LDA BLNKFRM,y
STA $1602,x
RETURN0 RTS
STATE1 LDA $15AC,x
BNE NOCON
JSL $01A7DC
BCC NOCON
LDA $7D
CMP #$10
BMI SPRWINS
JSL $01AA33
JSL $01AB99
LDA #$0B
STA $72
LDA #$13
STA $1DF9
STZ $AA,x
INC $C2,x
LDA #HP
CMP $C2,x
BNE NOKILL
LDA #$90
STA $1540,x
INC $1594,x
RTS
NOKILL LDA #$40
STA $15AC,x
RTS
SPRWINS JSL $00F5B7
NOCON JSR SUB_HORZ_POS
TYA
STA $157C,x
LDA $1588,x
AND #$03
BEQ NOWALL
STZ $B6,x
NOWALL LDA $1558,x
BEQ NOLAND
LDA #$02
STA $1602,x
RTS
NOLAND LDA $1540,x
BNE NOTIMR
LDA #$70
STA $1540,x
NOTIMR LDA $1588,x
AND #$04
BEQ INAIR
LDA $163E,x
BEQ RESET
CMP #$10
BCC PREJMP
STZ $B6,x
LDA #$02
STA $1602,x
BRA NOJMP
PREJMP LDA #$02
STA $1602,x
RTS
RESET LDA #$C8
STA $AA,x
JSR SUB_HORZ_POS
TYA
LDA XSPD,y
STA $B6,x
LDA #$FF
STA $163E,x
NOJMP LDA $1510,x
BEQ NOAIR
LDA #$10
STA $1558,x
STZ $B6,x
STZ $1510,x
LDA #$20
STA $1887
LDA #$09
STA $1DFC
LDA #$40
STA $1540,x
BRA NOAIR
INAIR LDA #$01
STA $1510,x
DEC $AA,x
LDA $14
AND #$01
BNE NOAIR
DEC $AA,x
DEC $AA,x
NOAIR LDA $1540,x
CMP #$04
BEQ SHOT
CMP #$06
BCC SHOTIN
CMP #$20
BCS SKIP
LDY $1510,x
LDA AIRCHAR,y
BRA STRFRM
SHOTIN LDY $1510,x
LDA AIRSHOT,y
BRA STRFRM
SKIP LDA $14
LSR A
LSR A
LSR A
AND #$01
TAY
LDA $1510,x
BEQ ONGND
INY
INY
ONGND LDA IDLEFRM,y
STRFRM STA $1602,x
RTS
SHOT LDY $1510,x
LDA AIRSHOT,y
STA $1602,x
JSL $02A9DE
BMI RETURN1
LDA #$01
STA $14C8,y
PHX
LDA #PROJECT
TYX
STA $7FAB9E,x
PLX
LDA $E4,x
CLC
ADC #$08
STA $00E4,y
LDA $14E0,x
ADC #$00
STA $14E0,y
LDA $D8,x
SEC
SBC #$0C
STA $00D8,y
LDA $14D4,x
SBC #$00
STA $14D4,y
PHX
TYX
JSL $07F7D2
JSL $0187A7
LDA #$08
STA $7FAB10,x
PLX
LDA #$50
JSR CODE_01BF6A
LDX $15E9
LDA $00
STA $00AA,y
LDA $01
STA $00B6,y
RETURN1 RTS
STATE2 STZ $B6,x
LDA $1540,x
CMP #$01
BEQ ENDLVL
CMP #$60
BCS GOBACK
CMP #$50
BCS FAINT
LDA #$0E
BRA STRFRM2
FAINT LDA #$0D
BRA STRFRM2
GOBACK LDA $14
AND #$01
TAY
LDA TRNSFRM,y
STRFRM2 STA $1602,x
RTS
ENDLVL LDA #$0B
STA $71
LDA #$05
STA $1DF9
LDA #$FF
STA $1DFB
STA $1493
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; aiming routine
; input: accumulator should be set to total speed (x+y)
; output: $00 = y speed, $01 = x speed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CODE_01BF6A: STA $01
PHX ;\ preserve sprite indexes of Magikoopa and magic
PHY ;/
JSR SUB_VERT_POS ; $0E = vertical distance to Mario
STY $02 ; $02 = vertical direction to Mario
LDA $0E ;\ $0C = vertical distance to Mario, positive
BPL CODE_01BF7C ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
CODE_01BF7C: STA $0C ;/
JSR SUB_HORZ_POS ; $0F = horizontal distance to Mario
STY $03 ; $03 = horizontal direction to Mario
LDA $0F ;\ $0D = horizontal distance to Mario, positive
BPL CODE_01BF8C ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
CODE_01BF8C: STA $0D ;/
LDY #$00
LDA $0D ;\ if vertical distance less than horizontal distance,
CMP $0C ; |
BCS CODE_01BF9F ;/ branch
INY ; set y register
PHA ;\ switch $0C and $0D
LDA $0C ; |
STA $0D ; |
PLA ; |
STA $0C ;/
CODE_01BF9F: LDA #$00 ;\ zero out $00 and $0B
STA $0B ; | ...what's wrong with STZ?
STA $00 ;/
LDX $01 ;\ divide $0C by $0D?
CODE_01BFA7: LDA $0B ; |\ if $0C + loop counter is less than $0D,
CLC ; | |
ADC $0C ; | |
CMP $0D ; | |
BCC CODE_01BFB4 ; |/ branch
SBC $0D ; | else, subtract $0D
INC $00 ; | and increase $00
CODE_01BFB4: STA $0B ; |
DEX ; |\ if still cycles left to run,
BNE CODE_01BFA7 ;/ / go to start of loop
TYA ;\ if $0C and $0D was not switched,
BEQ CODE_01BFC6 ;/ branch
LDA $00 ;\ else, switch $00 and $01
PHA ; |
LDA $01 ; |
STA $00 ; |
PLA ; |
STA $01 ;/
CODE_01BFC6: LDA $00 ;\ if horizontal distance was inverted,
LDY $02 ; | invert $00
BEQ CODE_01BFD3 ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
STA $00 ;/
CODE_01BFD3: LDA $01 ;\ if vertical distance was inverted,
LDY $03 ; | invert $01
BEQ CODE_01BFE0 ; |
EOR #$FF ; |
CLC ; |
ADC #$01 ; |
STA $01 ;/
CODE_01BFE0: PLY ;\ retrieve Magikoopa and magic sprite indexes
PLX ;/
RTS ; return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TILEMAP dcb $00,$02,$20,$22 ; #$00 (idle1)
dcb $04,$06,$24,$26 ; #$01 (idle2)
dcb $08,$0A,$28,$2A ; #$02 (jump)
dcb $0C,$0E,$2C,$2E ; #$03 (inair)
dcb $40,$42,$60,$62 ; #$04 (charge1)
dcb $44,$46,$64,$66 ; #$05 (throw1)
dcb $48,$4A,$68,$6A ; #$06 (charge2)
dcb $4C,$4E,$6C,$6E ; #$07 (throw2)
dcb $AC,$AE,$AC,$AE ; #$08 (stand1)
dcb $CC,$CE,$CC,$CE ; #$09 (stand2)
dcb $A0,$A2,$A0,$A2 ; #$0A (frenzy1)
dcb $80,$82,$80,$82 ; #$0B (frenzy2)
dcb $84,$86,$A4,$A6 ; #$0C (frenzy3)
dcb $A8,$AA,$A8,$AA ; #$0D (lost1)
dcb $88,$8A,$88,$8A ; #$0E (lost2)
X_OFFSET dcb $00,$10,$00,$10
dcb $10,$00,$10,$00
Y_OFFSET dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03
dcb $F3,$F3,$03,$03

dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
dcb $F0,$F0,$00,$00
dcb $00,$00,$00,$00
dcb $00,$00,$00,$00
BLKTILE dcb $8C,$8E

SUB_GFX JSR GET_DRAW_INFO ; sets y = OAM offset
LDA $157C,x ; \ $02 = direction
ASL A
ASL A
STA $02 ; /

LDA $1602,x
ASL A
ASL A
STA $03

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

PHX
TXA
CLC
ADC $03
TAX
LDA TILEMAP,x
STA $0302,y
LDA Y_OFFSET,x
CLC
ADC $01 ; \ tile y position = sprite x location ($00)
STA $0301,y ; /
PLX

PHX
LDX $15E9
LDA $15F6,x ; tile properties xyppccct, format
LDX $02 ; \ if direction == 0...
BEQ NO_FLIP ; |
ORA #$40 ; / ...flip tile
NO_FLIP ORA $64 ; add in tile priority of level
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
DEX
BPL LOOP_START

PLX
LDA $15A0,x
ORA $186C,x
BNE NOBLK
LDA $1602,x
CMP #$04
BEQ SHOW_HAMMER_TOO
CMP #$06
BEQ SHOW_HAMMER_TOO
NOBLK LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
LDA #$03 ; | A = (number of tiles drawn - 1)
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

SHOW_HAMMER_TOO PHX
LDA $157C,x
BNE NO_ADJ
LDA $00
BRA FINISH
NO_ADJ LDA $00
CLC
ADC #$10
FINISH STA $0300,y

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
SEC ; |
SBC #$0C
STA $0301,y ; /

LDA $14
AND #$01
TAX
LDA BLKTILE,x ; \ 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 #$0F
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 #$04 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $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 ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_HORZ_POS 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 SPR_L16 ;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
SPR_L16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_VERT_POS
; This routine determines if Mario is above or below the sprite. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B829
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_VERT_POS LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
CLC
ADC #$18
SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
STA $0E ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
BPL SPR_L11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
SPR_L11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924


Und ich hoffe du findest was.. Ich finde den Code extrem unübersichtlich.


habs gefunden!
Da war irgendwo
LDA #$05
STA $1DFB
das lässt diese musik abspielen. das musst du löschen und dann sollte es gehen

Ich habe das mal für dich gemacht!

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Balrog 1 and 3
; by Sonikku
; Description: Based off of the first Balrog encounter. He runs around and then
; jumps. If you fail to stomp him but still make contact, he grabs you and then
; throws you. If the extra bit is set, he will launch a few missiles like the
; third Balrog encounter.
HP1 = $07 ; how many stomps before the level is beaten (Extra bit clear).
HP2 = $09 ; how many stomps before the level is beaten (Extra bit set).
PROJECT = $03 ; sprite number of BalrogProjectile.cfg.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT and MAIN JSL targets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_HORZ_POS
TYA
STA $157C,x
RTL

dcb "MAIN"
PHB
PHK
PLB
JSR SPRITE_ROUTINE
PLB
RTL


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPRITE_ROUTINE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WALKFRM dcb $04,$00,$05,$00
XMAX dcb $18,$E8
XACCEL dcb $01,$FF
TIMER dcb $40,$20,$70,$B0,$20,$60,$60,$A0
MARSPD dcb $30,$D0
RETURN RTS
SPRITE_ROUTINE
JSR SUB_OFF_SCREEN_X0
JSR SUB_GFX
LDA $9D
BNE RETURN
LDA $C2,x
CMP #$02
BEQ NOCON
LDA $1FE2,x
BNE NOCON
JSL $01A7DC
BCC NOCON
JSR SUB_VERT_POS
LDA $0E
CMP #$E6
BPL SPRITE_WINS
LDA $7D
BMI NOCON
JSL $01AA33
JSL $01AB99
LDA $1564,x
BNE NOSTUN
LDA #$13
STA $1DF9
LDA #$80
STA $1564,x
LDA #$08
STA $1FE2,x
INC $1594,x
LDA $7FAB10,x
AND #$04
BEQ CLEAR
LDA #HP2
BRA SETHP
CLEAR LDA #HP1
SETHP CMP $1594,x
BNE NOCON
LDA #$02
STA $C2,x
LDA #$50
STA $154C,x
STZ $B6,x
STZ $AA,x
BRA NOCON
NOSTUN LDA #$02
STA $1DF9
LDA #$08
STA $154C,x
BRA NOCON
SPRITE_WINS
LDA $154C,x
BNE NOCON
LDA #$B0
STA $154C,x
LDA #$60
STA $1558,x
LDA #$FF
STA $78
JSL $00F5B7
NOCON JSL $01802A
LDA $1588,x
AND #$04
BEQ INAIR
LDA $C2,x
BEQ NOTIMR
LDA $163E,x
BEQ NOTIMR
CMP #$10
BMI STANDG
LDA #$02
STA $1602,x
BRA NOTIMR
STANDG STZ $1602,x
NOTIMR LDA $151C,x
BEQ NOSMSH
STZ $151C,x
LDA #$10
STA $1887
LDA #$09
STA $1DFC
LDA $C2,x
BEQ NOSMSH
LDA #$20
STA $163E,x
BRA NOSMSH
INAIR LDA #$01
STA $151C,x
LDA #$03
STA $1602,x
LDA $7FAB10,x
AND #$04
BEQ NOSMSH
JSR SUB_HORZ_POS
TYA
STA $157C,x
NOSMSH LDA $C2,x
JSL $0086DF
dcw STATE0&$FFFF
dcw STATE1&$FFFF
dcw STATE2&$FFFF
STATE0 STZ $7D
STZ $7B
LDA #$0B
STA $71
LDA $1588,x
AND #$04
BEQ RETURN0
LDA $163E,x
BEQ SETTIMR
CMP #$01
BEQ INCSTT
CMP #$50
BPL STUND0
CMP #$30
BPL STAND0
CMP #$08
BMI STAND0
LDA #$07
BRA STRFRM0
SETTIMR LDA #$60
STA $163E,x
RTS
STUND0 LDA #$02
BRA STRFRM0
STAND0 LDA #$00
BRA STRFRM0
STRFRM0 STA $1602,x
RTS
INCSTT INC $C2,x
STZ $71
LDA #$70
STA $1540,x
RETURN0 RTS
STATE1 LDA $1558,x
BEQ NOGRAB
CMP #$01
BEQ LNCHMAR
CMP #$5D
BPL NOWARP
LDA $E4,x
CLC
ADC #$08
STA $94
LDA $14E0,x
ADC #$00
STA $95
LDA $D8,x
SEC
SBC #$14
STA $96
LDA $14D4,x
SBC #$00
STA $97
NOWARP LDA #$FF
STA $78
LDA #$08
STA $1602,x
LDA #$03
STA $1497
STZ $B6,x
RTS
LNCHMAR LDY $157C,x
LDA MARSPD,y
STA $7B
LDA #$20
STA $1497
NOGRAB LDA $1510,x
BEQ NOGRAB2
LDA #$03
CMP $1602,x
BNE NOGRAB2
DEC $1510,x
LDA #$10
CMP $1510,x
BCC NOGRAB2
LDA $14
AND #$03
BNE NOGRAB2
JSL $02A9DE
BMI NOGRAB2
LDA #$01
STA $14C8,y
PHX
LDA #PROJECT
TYX
STA $7FAB9E,x
PLX
LDA $E4,x
CLC
ADC #$08
STA $00E4,y
LDA $14E0,x
ADC #$00
STA $14E0,y
LDA $D8,x
STA $00D8,y
LDA $14D4,x
STA $14D4,y
PHX
TYX
JSL $07F7D2
JSL $0187A7
LDA #$08
STA $7FAB10,x
PLX
LDA #$02
STA $1594,y
LDA #$20
STA $1540,y
JSL $01ACF9
AND #$01
TAY
STA $C2,y
NOGRAB2 LDA $1588,x
AND #$03
BEQ WALK
STZ $B6,x
WALK LDA $1588,x
AND #$04
BEQ INAIR1
LDA $154C,x
CMP #$01
BEQ JUMP
BPL SET2JMP
LDA $14
AND #$FF
BNE NOJMP
LDA #$10
STA $154C,x
BRA NOJMP
JUMP LDA #$C0
STA $AA,x
LDY $157C,x
LDA XMAX,y
STA $B6,x
LDA $7FAB10,x
AND #$04
BEQ SET2JMP
LDA #$25
STA $1510,x
SET2JMP LDA #$02
STA $1602,x
BRA DECSPD
INAIR1 DEC $AA,x
RTS
NOJMP LDA $1540,x
BEQ STAND
LDA $14
LSR A
LSR A
AND #$03
TAY
LDA WALKFRM,y
STA $1602,x
LDY $157C,x
LDA XMAX,y
CMP $B6,x
BEQ RETURN1
LDA $14
AND #$01
BNE RETURN1
LDA $B6,x
CLC
ADC XACCEL,y
STA $B6,x
RTS
STAND STZ $1602,x
DECSPD LDA $B6,x
BEQ FACEMAR
LDA $B6,x
SEC
SBC XACCEL,y
STA $B6,x
LDA #$10
STA $163E,x
RETURN1 RTS
FACEMAR LDA $163E,x
BNE RETURN1
JSR SUB_HORZ_POS
TYA
STA $157C,x
JSL $01ACF9
AND #$07
TAY
LDA TIMER,y
STA $1540,x
RTS
STATE2 LDA $154C,x
BEQ UP
CMP #$10
BPL DEAD
LDA #$02
STA $1602,x
STZ $B6,x
RTS
DEAD LDA #$06
STA $1602,x
STZ $151C,x
LDA $1588,x
AND #$04
BNE ONGND2
DEC $AA,x
ONGND2 LDA $14
AND #$01
BNE RETURN2
LDA $E4,x
EOR #$02
STA $E4,x
RTS
UP LDA #$A0
STA $AA,x
INC $1594,x
LDA $1594,x
CMP #$30
BNE RETURN2
LDA #$0B
STA $71
LDA #$FF
STA $1493
STA $1DFB
LDA #$05
STA $1DF9
STZ $14C8,x
RETURN2 RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TILEMAP dcb $80,$82,$90,$92 ; stand ; $00
dcb $80,$82,$84,$86 ; stand (eyes closed) ; $01
dcb $80,$82,$88,$8A ; charging/land (for jump) ; $02
dcb $A8,$AA,$B8,$BA ; jumping/in air ; $03
dcb $80,$82,$C4,$C6 ; walk 1 ; $04
dcb $80,$82,$E4,$E6 ; walk 2 ; $05
dcb $B0,$B2,$C0,$C2 ; shocked/dead ; $06
dcb $80,$82,$A4,$A6 ; standing (smiling) ; $07
dcb $D8,$DA,$E8,$EA ; facing away from screen ; $08
dcb $8C,$8E,$9C,$9E ; fly 1 ; $09
dcb $BC,$BE,$CC,$CD ; fly 2 ; $0A
dcb $80,$82,$E0,$E2 ; stand (mouth open) ; $0B
X_OFFSET dcb $10,$00,$10,$00 ; $157C,x = #$00
dcb $00,$10,$00,$10 ; $157C,x = #$01
Y_OFFSET dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00
dcb $FA,$FA,$00,$00
dcb $F8,$F8,$00,$00
dcb $F7,$F7,$FF,$FF
dcb $F7,$F7,$FF,$FF
dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00
dcb $F8,$F8,$00,$00

SUB_GFX JSR GET_DRAW_INFO ; sets y = OAM offset
LDA $157C,x ; \ $02 = direction
ASL A
ASL A
STA $02 ; /
LDA $1602,x
ASL A
ASL A
STA $03

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

PHX
TXA
CLC
ADC $03
TAX
LDA TILEMAP,x
STA $0302,y

LDA Y_OFFSET,x
CLC
ADC $01 ; \ tile y position = sprite x location ($00)
STA $0301,y ; /
PLX

PHX
LDX $15E9
LDA $15F6,x ; tile properties xyppccct, format
LDX $02 ; \ if direction == 0...
BNE NO_FLIP ; |
ORA #$40 ; / ...flip tile
NO_FLIP ORA $64 ; add in tile priority of level
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
DEX
BPL LOOP_START

PLX
LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
LDA #$03 ; | A = (number of tiles drawn - 1)
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ROUTINES FROM THE LIBRARY ARE PASTED BELOW
; You should never have to modify this code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GET_DRAW_INFO
; This is a helper for the graphics routine. It sets off screen flags, and sets up
; variables. It will return with the following:
;
; Y = index to sprite OAM ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
;
; It is adapted from the subroutine at $03B760
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_HORZ_POS 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 SPR_L16 ;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
SPR_L16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_VERT_POS
; This routine determines if Mario is above or below the sprite. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B829
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_VERT_POS LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
BPL SPR_L11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
SPR_L11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924


müsste funktionieren
geschrieben am 07.04.2012 12:45:08
( Link )
Zitat von WYE:
Zitat von Bladey:
Code
   LDA #$05
STA $1DFB


Die 05 da ist die Musik, die gespielt wird. Ob es reicht, die Zahl einfach zu der Nummer des Liedes zu ändern, die du haben willst, weiß ich nicht, aber probieren kannst du's ja mal.

Zweite Lösung, die auf jeden Fall funktioniert: Die beiden Zeilen entfernen und die Musik in LM selber einstellen.


Zur ersten Lösung: Das geht nur, wenn er mit AddmusicM arbeitet, weil man da die music aus 1DFB ersetzen kann.
Ich habe das einfach gelöscht.
geschrieben am 07.04.2012 12:51:02
( Link )
Die erste Lösung von WYE hat schonmal nicht funktioniert .. Da kam dann einfach gar kein Sound.
Aber das zweite hat geklappt

Danke an WYE & BassLP
geschrieben am 07.04.2012 13:45:33
( Link )
Wäre echt cool, wenn mir jemand helfen könnte (problem steht etwas weiter oben)
Dann könnte ich nämlich meine demo releasen^^
geschrieben am 07.04.2012 14:00:59
( Link )
Versuch mal, folgendes direkt nach dem Main-Label einzufügen:

Code

PHP : REP #$20 ; \
LDA $010B ; | Wenn wir in Level 0D sind,
CMP #$000D ; | so weitermachen wie geplant
BEQ .continue ; /
PLP ; \
LDA $7B ; | Ansonsten den überschriebenen
BPL + ; | Code wiederherstellen
EOR #$FF : INC A ; | und zurück zum SMW-Code springen
+ JML $00D637 ; /
.continue
PLP