Allgemeine Hex- und ASM-Fragen

geschrieben am 13.08.2015 16:11:15
( Link )
Hi.
Ich suche nach einer möglichkeit, die "Thank you for rescuring me..."-Message auf der Star Road-OW erscheinen zu lassen, aber nicht auf der Yoshi's Island-OW. Alles, was ich gefunden hab, ist eine ROM-Adresse, die mein Problem nur teilweise löst:
Zitat von $01EC04:
The routine that makes Yoshi hatch.
$01EC2F - Change "3A" (DEC A) to "EA" (NOP) to make Yoshi's "Thank you for saving me" message appear on the main map, as opposed to the Yoshi's Island submap.
$01EC36 - Change from "D0" (BNE) to "80" (BRA) to disable the Yoshi rescue message.
$01EC3C is Yoshi's thank you message

Kann mir da wer helfen?
Zitat von Robju am 22.11.2013:
ICH BRING EUCH ALLE UM!!
Zitat von Dominik am 07.08.2013:
Fick dich Rob, ich wusste dass das kommt!

anzeigen
MFG: Wieso binn ich als Ideot genannt?Das ist net nett.
Robbinn, ideot, Satzstellung, Grammatik.
MFGSchonn gut, schon gut, das mit "binn" und "Idoet" ist ein Typo.
RobDas e und i sind 4 tasten voneinander entfernt.
MFGschnelle Finger?
Rob Nein.
MFG *facepalm*
Rob Wenn man Idiot schreibt kommt man nichtmal in die Nähe eines "e" s
MFG Doch, warum hat man denn sonst zwei Finger?
Rob Das hat mir der ANzahl der Finger nichts zu tun.
MFG Ich meine Hände.
Bro ich hab 3 stück
Rob Hat auch kit der Anzahl der Händer nichts zu tun
MFG Und es hat mit der Anzahl der Hände zu tun.
Rob Nein.
MFG Ich schreibe doch mit beiden.
Rob YOU ARE AN IDIOT, AH HAHAHAHAHA HAAAAHAAA HAHAHAHAAAAA!

DIE KONFI
DIE andere KONFI
JJJAAAAAAAH
geschrieben am 13.08.2015 18:48:49
( Link )
aus SMWDisC:

Code
CODE_01EC2C:        B9 11 1F      LDA.W $1F11,Y             
CODE_01EC2F: 3A DEC A
CODE_01EC30: 0D F8 0E ORA.W $0EF8
CODE_01EC33: 0D 09 01 ORA.W $0109
CODE_01EC36: D0 08 BNE CODE_01EC40
CODE_01EC38: EE F8 0E INC.W $0EF8
CODE_01EC3B: A9 03 LDA.B #$03
CODE_01EC3D: 8D 26 14 STA.W $1426
CODE_01EC40:


Die Bedingung fürs Anzeigen der Nachricht ist "Wenn $1F11,y minus eins, $0EF8 und $0109 alle null sind".
$1F11 ist die "Map", auf der man sich befindet, und für das "minus eins" ist das DEC an Stelle $01EC2F zuständig. (Warum minus eins? #$01 ist die Nummer der "Yoshi's Island"-Submap, also ist $1F11 minus eins genau dann null, wenn $1F11 gleich #$01 ist.) Statt eins müsste man jetzt sechs subtrahieren (#$06 steht für Star World) - das geht auch, nur brauchen wir dafür etwas mehr als einen Hex-Edit, weil an der Stelle kein Platz mehr frei ist.

Das hier könnte funktionieren:

Code
!Submap = $06

header : lorom
org $01EC2C
autoclean JML CustomSubtract

freecode
CustomSubtract:
LDA $1F11,y
SEC : SBC #!Submap
JML $01EC30


Keine Garantie, dass der geänderte Wert nicht für Nebenwirkungen sorgt.
geschrieben am 22.08.2015 13:51:41
( Link )
Da ich ewig nicht mehr zum hacken kam, kann ich erst jetzt sagen, dass es funktioniert hat. Danke
Zitat von Robju am 22.11.2013:
ICH BRING EUCH ALLE UM!!
Zitat von Dominik am 07.08.2013:
Fick dich Rob, ich wusste dass das kommt!

anzeigen
MFG: Wieso binn ich als Ideot genannt?Das ist net nett.
Robbinn, ideot, Satzstellung, Grammatik.
MFGSchonn gut, schon gut, das mit "binn" und "Idoet" ist ein Typo.
RobDas e und i sind 4 tasten voneinander entfernt.
MFGschnelle Finger?
Rob Nein.
MFG *facepalm*
Rob Wenn man Idiot schreibt kommt man nichtmal in die Nähe eines "e" s
MFG Doch, warum hat man denn sonst zwei Finger?
Rob Das hat mir der ANzahl der Finger nichts zu tun.
MFG Ich meine Hände.
Bro ich hab 3 stück
Rob Hat auch kit der Anzahl der Händer nichts zu tun
MFG Und es hat mit der Anzahl der Hände zu tun.
Rob Nein.
MFG Ich schreibe doch mit beiden.
Rob YOU ARE AN IDIOT, AH HAHAHAHAHA HAAAAHAAA HAHAHAHAAAAA!

DIE KONFI
DIE andere KONFI
JJJAAAAAAAH
geschrieben am 04.10.2015 17:10:15
( Link )
Da ich nicht weiß, wie man einen Custom Sprite kurz nach seinem Tod wieder auf dem Bildschirm erscheinen lassen kann (z. B. Lakitu, Boss Bass), habe ich mich eines Custom Sprite Generators bedient und ihn entsprechend umfunktioniert. Hier der Code:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EXTRA_BITS = $7FAB10
NEW_SPRITE_NUM = $7FAB9E

TBL_B2D0 dcb $FF,$FF
TBL_B2D2 dcb $00,$00
TBL_B2D4 dcb $F0,$F0

SPRITE_CODE_START JSR Count
BEQ RETURN
LDA $13
CMP #$4F

BCC RETURN
JSL $02A9DE
BMI RETURN
TYX

JSL $01ACF9 ; random value routine
AND #$01 ; 2 possible values
STA $00 ; store to scratch RAM

LDA $18B9 ; check if first extra bit is set
AND #$40
BNE SecondTable

PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status1,y ; store sprite status
STA $14C8,x
LDA Sprites1,y ;
BRA SharedCode

SecondTable:

PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status2,y ; store sprite status
STA $14C8,x
LDA Sprites2,y ;
BRA SharedCode

SharedCode:
PLY
STA NEW_SPRITE_NUM,x
JSL $07F7D2 ; reset sprite properties
JSL $0187A7 ; get table values for custom sprite
LDA #$08 ; mark as initialized
STA EXTRA_BITS,x

LDA #$1F
STA $D8,x
LDA $1D
ADC #$00
STA $14D4,x
LDA $148E
AND #$01
TAY
LDA TBL_B2D0,y
CLC
ADC $1A
STA $E4,x
LDA $1B
ADC TBL_B2D2,y
STA $14E0,x
LDA TBL_B2D4,y
STA $B6,x
RETURN RTS

Count: STZ TEMP ;TEMP will be the sprite counter
LDY #$00

LOOP
PHX
TYX ;Y into X
LDA $7FAB9E,x ;look into sprite type table for custom sprites
PLX


TYX ;Y->X, for long indexed


LDA $14C8,y ;load status
BEQ NOINCC ;if sprite is dead, don't increment

INC TEMP ;else increment
LDA TEMP ;compare TEMP to count

LDA NEW_SPRITE_NUM,x ;original sprite index
CMP #$93
BNE NOINCC

LDX $15E9 ;original sprite index
CMP #$01 ;if count is reached....
BCS RETURN2 ;just return

NOINCC
LDX $15E9 ;restore sprite index

INY ;advance index
CPY #$0C ;if some left to check...
BNE LOOP ;loop again

LDA #$01 ;Z = 0
RTS

RETURN2
LDA #$00 ;Z = 1
RTS


Dazu habe ich zwei Fragen:

Der Sprite taucht sofort nach seinem Ableben wieder auf. Wie kann ich einstellen, dass erst paar Sekunden bis zum erneuten Auftauchen vergehen?

Ich habe eine exakte y-Position festgelegt, in der der Sprite erscheinen soll:
Code
		    LDA #$FF   
STA $D8,x
LDA $1D
ADC #$00
STA $14D4,x

#$FF ist bekanntermaßen die höchste Zahl. Je niedriger die Zahl ist, umso höher erscheint der Sprite auf dem Bildschirm. D. h., #$FF ist am tiefsten, was aber nicht die tiefstmögliche Position auf dem Bildschirm ist. Wie kriege ich die Sprite-Position noch niedriger als #$FF? Muss ich da irgendwas subtrahieren oder so?
geschrieben am 04.10.2015 19:28:29
( Link )
Zitat von Chris:
#$FF ist bekanntermaßen die höchste Zahl. Je niedriger die Zahl ist, umso höher erscheint der Sprite auf dem Bildschirm. D. h., #$FF ist am tiefsten, was aber nicht die tiefstmögliche Position auf dem Bildschirm ist. Wie kriege ich die Sprite-Position noch niedriger als #$FF? Muss ich da irgendwas subtrahieren oder so?

X- und Y-Positionen in SMW sind 16-Bit-Zahlen, heißt, die bestehen aus zwei Byte. Das "Low Byte" der Sprite-Y-Position (das, in das du #$FF schreibst) ist $D8,x, das sind die letzten beiden Stellen. Das "High Byte" ist $14D4,x - das sind die ersten beiden Stellen, aber sinnvoll ist hier nur #$00 oder #$01.
In $14D4,x schreibst du gerade den Inhalt von $1D plus dem Carry, und das ist anscheinend immer null. Wenn du das auf eins festsetzen willst - und das willst du ja - nimm statt LDA $1D : ADC #$00 einfach LDA #$01.

(Mit Sprite-Positionen zu arbeiten ist immer ein bisschen unhandlich, weil Low und High Byte so weit weg voneinander sind und man sie deshalb, spätestens beim Speichern, immer als zwei getrennte Bytes betrachten muss. Andere Positionen, zum Beispiel die Layer-1-Position, haben ihre beiden Bytes direkt hintereinander, und dadurch kann man die beiden Bytes auf einmal betrachten und im 16-Bit-Modus als einzelne Zahl behandeln.)
geschrieben am 09.11.2015 10:14:07
zuletzt bearbeitet von Wysey am 09.11.2015 11:39:50.
( Link )
Ich beiß ich mir jetzt schon die ganze Zeit die Zähne an einem Block aus.

Code
 print "This solid block will only be broken when mario is sliding into the sides or bottom of this block, when shattered, doesn't stop mario's x speed."
;behaves #$130
db $42
JMP Mario_shatter : JMP Return : JMP Mario_shatter : JMP Return : JMP Return : JMP Return
JMP Return : JMP Return : JMP Return : JMP Mario_shatter

Mario_shatter:
LDA $13ED ;\if mario not sliding
CMP #$1C ;|
BNE Return ;/return
LDY #$00 ;\alow mario to pierce the blocks
LDA #$25 ;|
STA $1693 ;/
LDA $72 ;\must be on the ground
BNE Return ;/
%shatter_block()
RTL
Return:
RTL


"Blocktool Super Deluxe" sagt als Error die ganze Zeit schon das der Macro Command keine Definition hat.
Warum schreibt der Ersteller eigentlich ein Macro hin wo es keins gibt....
Also hab ich mir gedacht das es ein Fehler von Ihm war und habe die am nächsten logische Option gewählt:
Code
 
Mario_shatter:
macro shatter_block()
LDA $13ED ;\if mario not sliding
CMP #$1C ;|
BNE Return ;/return
LDY #$00 ;\alow mario to pierce the blocks
LDA #$25 ;|
STA $1693 ;/
LDA $72 ;\must be on the ground
BNE Return ;/
endmacro

%shatter_block()
RTL
Return:


Das frisst das Blocktool aber auch nicht. Statdessen bekomme ich jetzt 6 Fehler anstatt einem.
Bin ein bischen verwirrt. War der Macrocommand vielleicht orginal an LDA $72 oder LDA $25 dran?
Ich habe erstmal genug vom ausprobieren. Vielleicht sehe ich das ganze auch Falsch.
(Ich weiß zwar was die Comments bewirken, aber ich habe keine Ahnung von den ganzen Ladeadressen)
>we live in a society
geschrieben am 09.11.2015 10:49:17
( Link )
Das ist ungefähr dasselbe Problem wie mit Addmusic. An dem Block machst du nichts falsch, nur das Tool ist das verkehrte.

Mittlerweile ist GPS quasi der Standard, und die meisten (wenn nicht alle) Blöcke auf SMWC orientieren sich daran. GPS bringt von Haus aus eine Menge Makros mit, die man in jedem Block benutzen kann, und das sind die Makros, die BTSD natürlich nicht findet.

Ansonsten dürfte sich an der Schreibweise der Blöcke aber nichts geändert haben - wenn du also weiterhin GPS benutzen willst, ist die einfachste Lösung, die Makros einfach aus GPS rüberzukopieren und selbst zu definieren. (Das sind die Dateien im "routines"-Ordner, musst nur noch macro und endmacro drumrum schreiben.)
geschrieben am 09.11.2015 11:34:11
( Link )
Zitat von WYE:
Das ist ungefähr dasselbe Problem wie mit Addmusic. An dem Block machst du nichts falsch, nur das Tool ist das verkehrte.

Gott das gibt es doch nicht!



Zitat
... wenn du also weiterhin GPS benutzen willst, ist die einfachste Lösung, die Makros einfach aus GPS rüberzukopieren und selbst zu definieren. (Das sind die Dateien im "routines"-Ordner, musst nur noch macro und endmacro drumrum schreiben.)


Vielleicht werde ich das auch.(kommt ganz darauf an ob das neue Tool komplett anders funtioniert)
Aufjedenfall hätte ich nicht gedacht das auch DIESES Tool in Rente gegangen ist. Danke für die Auskunft. ^^
>we live in a society
geschrieben am 20.10.2016 6:19:48
zuletzt bearbeitet von Wysey am 21.10.2016 1:26:03.
( Link )
Hey ho, ich habe eine Frage in diesem sehr weit besiedelten Forum:

Habe nach unendlichen graben auf Smwc nen Block gefunden der die Levelmusik wechseln kann:

https://www.smwcentral.net/?p=viewthread&t=81032

Code
Code

db $42

!song = #$00 ;change this for the song that you want.

JMP Mario : JMP Mario : JMP Mario
JMP Nothing : JMP Nothing
JMP Nothing : JMP Nothing
JMP Mario : JMP Mario : JMP Mario

Mario:
LDA !song ; \ Change This to the song that you want to change(If you put $00 the music will not change)
STA $1DFB ; /
Nothing:
RTL

print "Change the song of the level"


Meine Frage wäre jetzt ob das gehen würde Musik dadurch auch ab einer bestimmten Zeit zu starten z.B.
Mario berührt ab dem er 40 Sekunden im Level ist den Block; Andere Musik wird abgespielt.
Nun wenn man jetzt aber den Block nochmal berührt möchte ich nicht das der Track der davor kam ab Sekunde 0 abgespielt wird, sondern um Sekunde 40.
Und das ganze soll natürlich auch mit der 2. Melodie funktionieren.

Ich will einen dynamischen Musikwechsel sozusagen.
Könnte man das nicht so machen in dem man einfach den Track freezed und in den Zwischenspeicher reinhaut? (hab zwar keine Ahnung wie das gehen würde, weil meine Asmsküllz mal wieder nach langer Abwesenheit nicht vorhanden sind; aber ein Mann kann träumen )

Wenn das gehen würde wäre das der Übershit.
>we live in a society
geschrieben am 20.10.2016 13:15:08
( Link )
AFAIK hat Addmusic keine Funktionalität, um einen Musiktrack ab Stelle X abzuspielen. Zu 100% sicher bin ich mir aber nicht, bin nicht genug in der Materie drin.
-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 20.10.2016 16:53:33
( Link )
Zitat von RPG Hacker:
AFAIK hat Addmusic keine Funktionalität, um einen Musiktrack ab Stelle X abzuspielen. Zu 100% sicher bin ich mir aber nicht, bin nicht genug in der Materie drin.


Alles klar. Ich frag mal auf Smwc oder suche mich mal wieder wund im Netz. Vielleicht weiß ja der olle S.N.N Portgott was davon. (wenn es den noch gibt... )

Edit: Addmusick hat wirklich keine solche Comments.



Halp!
Irgendwelche Vorschläge; oder alternative Lösungen?
>we live in a society
geschrieben am 20.10.2016 23:42:39
( Link )
Sofern du nicht zufällig das SPC-700 programmieren kannst, sieht es da eher schlecht aus. Wirkliche Workarounds fallen mir da jetzt eigentlich keine ein, bis auf "mach das nicht".
-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 21.10.2016 1:19:33
( Link )
Zitat von RPG Hacker:
Sofern du nicht zufällig das SPC-700 programmieren kannst, sieht es da eher schlecht aus. Wirkliche Workarounds fallen mir da jetzt eigentlich keine ein, bis auf "mach das nicht".


Hab das jetzt gelöst in dem einfach 2 verschiedene Ports von der selben Meldodie reingehauen habe. Klingt zwar nicht so "elegant" wie ich es wollte jedoch ist das auch ne Lösung.
Apropo Scheißlösungen: Ich werde jetzt dann langsam mit diesem ******* Patch den ich in einen bestimmten Levelcode einfügen will Wahnsinnig:

https://www.smwcentral.net/?p=section&a=details&id=5720
Code
level10A:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reverse Gravity
;
; This patch allows the player to have reversed gravity.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!reversed = $60 ; The reversed gravity flag.

org $00D058
autoclean JSL fix_cape

org $00DC45
JML y_speed
NOP

org $00E346
JML fix_ram_80
NOP
NOP

org $00E46D
JML flip_mario_gfx

org $00ED14
JML fix_ceiling

org $00EE17
JML fix_ground_chk

org $00EED4
JML fix_ground
NOP

org $00F18D
JSL fix_00F18D
NOP #2

org $00F44D
JML interaction

org $00F5A3
JSL fix_fall_death
NOP
BCC $0C

org $00FD4A
JSL fix_bubble
NOP

org $00FDC3
JSL fix_splash
BRA $00

org $00FE7E
JML fix_dust

org $01A11A
JSL fix_carry
NOP

org $028830
JSL fix_028830
NOP

org $0290E5
JML fix_0290E5

org $0290F9
LDA $01
BEQ +
STZ $7D
BRA +
NOP
+

org $02912B
JML fix_02912B
NOP

org $029163
JML fix_029163
NOP

org $03B690
JSL fix_clipping
NOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

freecode
reset bytes

flip_offsets:
dw $000F,$0007

print "flip_gravity is located at: $", pc

flip_gravity: LDA !reversed
EOR #$01
STA !reversed

PHX
PHY
LDX #$00
LDA $19
BEQ +
LDA $73
BNE +
LDX #$02
+ REP #$20
LDA $96
LDY !reversed
BNE .ud
SEC
SBC.l flip_offsets,x
BRA +
.ud CLC
ADC.l flip_offsets,x
+ STA $96
SEP #$20
PLY
PLX
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section flips Mario's graphics.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

flip_mario_gfx: LDA !reversed
BNE .ud

REP #$20
LDA $80
JML $00E471

.ud LDA $0303,y
ORA #$80
STA $0303,y

REP #$20
LDA $80
SEC
SBC $DE32,x
BIT $03
BMI +
CLC
ADC #$0008
+ CLC
ADC #$0010
JML $00E475

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section flips the Y speed and changes the interaction table while fixing
; any bugs that arise because of these changes.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_ceiling: CMP #$F9
LDY !reversed
BEQ .not_ud
BCS +

LDY $72
BEQ ++

EOR #$F0
STA $00

LDA $96
SEC
SBC $00
STA $96
BCS ++
DEC $97
++ JML $00ED37

.not_ud BCC +
JML $00ED28
+ JML $00ED18

fix_ground_chk: STA $91
LDY !reversed
BEQ .not_ud
EOR #$0F
.not_ud CMP #$08
BCC +
JML $00EE1D
+ JML $00EE3A

fix_ground: LDA !reversed
BNE .ud

LDA $96
SEC
SBC $91
JML $00EED9

.ud LDA $91
EOR #$0F
CLC
ADC $96
STA $96
BCC +
INC $97
+ JML $00EEE1

y_interaction:
dw $0008
dw $0008,$0006,$000A,$0010,$0000,$0000
dw $0008,$0006,$000A,$0010,$0000,$0000
dw $000E,$0006,$0011,$0018,$0000,$0000
dw $000E,$0006,$0011,$0018,$0000,$0000
dw $0013,$0008,$0017,$001D,$0000,$0000
dw $0013,$0008,$0017,$001D,$0000,$0000
dw $0016,$0008,$001A,$0020,$0000,$0000
dw $0016,$0008,$001A,$0020,$0000,$0000
dw $0018,$0018,$0018,$0018,$0018,$0018

interaction: INX
INX
LDA !reversed
REP #$20
BNE .ud
JML $00F451

.ud LDA $94
CLC
ADC $E830,x
STA $9A
LDA $96
CLC
ADC.l y_interaction,x
JML $00F45F

y_speed: LDY !reversed
BEQ .not_ud
LDA $7D
EOR #$FF
INC
STA $7D
.not_ud PEA $DC49
LDX #$02
JML $00DC4F

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section fixes bounce sprites.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_00F18D: STZ $00
REP #$20
LDA $05,s
CMP #$EC89
BEQ .mario
CMP #$ED05
BEQ .mario
CMP #$EE82
BEQ .mario
SEP #$20
BRA .not_ud

- LDA !reversed
BEQ .not_ud
DEY
CPY #$02
BCC .not_ud
INY
TYA
EOR #$03
TAY
.not_ud STY $06
LDA $00F0C8,x
RTL

.mario SEP #$20
LDA $00F05C,x
CMP #$01
BNE -
INC $00
BRA -

fix_028830: LDA $00
CLC
ROR
ROR
STA $169D,y
RTL

fix_0290E5: STZ $01
LDA $1699,x
CMP #$02
BNE +
LDA $169D,x
BPL +

LDA $16C9,x
AND #$03
LDY !reversed
BNE .ud
CMP #$03
BNE +
BRA .nb

.ud CMP #$00
BNE +
.nb INC $01
+ LDA $169D,x
LSR
BCS .return
JML $0290EA
.return JML $02910B

fix_02912B: LDA $01
BEQ .return
LDA $71
BNE .return
LDY !reversed
BNE .ud
JML $02913A
.return JML $02915E

.ud LDA $16A1,x
CLC
ADC #$10
STA $96
LDA $16A9,x
ADC #$00
JML $029152

fix_029163: LDA $01
BEQ .return

LDY !reversed
BNE .ud
JML $02916C
.return JML $029182

.ud LDA #$A0
STA $7D
REP #$20
INC $96
INC $96
SEP #$20
JML $02917D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section fixes various bugs.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_bubble: LDY !reversed
BNE .ud
ADC $96
BRA +

.ud LDA $96
LDY $19
BEQ +
LDY $73
BNE +
CLC
ADC #$08
+ STA $1715,x
RTL

fix_cape: CLC
PHX
LDX !reversed
BNE .ud
PLX
ADC $D03C,y
RTL

.ud PLX
ADC #$0010
SEC
SBC $D03C,y
RTL

fix_carry: LDY !reversed
CLC
BNE .ud

ADC $02
BRA +

.ud LDA $02
ADC #$01
+ STA $D8,x
RTL

fix_clipping: LDY !reversed
BNE .ud
CLC
ADC $03B65C,x
.ud RTL

fix_dust: LDA !reversed
BNE .ud
LDA $96
ADC #$1A
JML $00FE82

.ud LDA $96
SEC
SBC #$04
PHX
JML $00FE8A

fix_fall_death: CLC
LDY !reversed
BNE .ud

SEP #$20
LDA $81
DEC
BMI .return
SEC
.return RTL

.ud LDA $80
ADC #$0020
SEP #$20
CLC
BPL .return
SEC
RTL

fix_ram_80: LDA $188B
AND #$00FF
LDY !reversed
BNE .ud
JML $00E34C

.ud EOR #$FFFF
CLC
ADC $96
LDY $19
CPY #$01
LDY #$01
BCS +
INC
DEY
+ CPX #$0A
BCS +
CPY $13DB
BCS +
INC
SEC
+ JML $00E360

splash_offset:
db $08,$10,$16,$16

fix_splash: LDA $96
CLC
PHY
LDY !reversed
BNE .ud
ADC $FD9D,x
BRA +

.ud ADC.l splash_offset,x
+ PLY
RTL

print "Bytes inserted: ", bytes
RTS


Asar sagt zwar wenn ich die asar_patch.asm Datei im Uberasm-Ordner patche, das der Code ohne Probleme eingefügt worden ist, jedoch wenn ich die Rom starte sehe ich nach meinem Presentslogo nur schwarz. ( aber hey es läuft die title screen musik... also so schlimm kann es auch wiederum nicht sein #geil )
Vielleicht ist wo Asar das hinhaut der Speicherplatz schon belegt...

Tja und leider gehts anscheinend nicht anders, weil ich den Patch nicht in all meinen Levels haben will.

Wie gesagt: isch habe käne Ahnung ob det noch anders jeht.

Edit: + wenn man von nem Sprite getroffen wird (egal in welchem Level man ist), oder nen Pilz bekommt etc... wird die reversed Gravity auch aktiviert; was sie aber eigentlich laut Beschreibung nicht machen sollte.
Habe das Ganze vorhin mit der normalen Einfügemethode festgestellt.

Ich will kein "Übershit gamechanging gimmick" haben.
Ich will einfach nur Blöcke haben die Gravitation umkehren wenn man in ihnen steht...
Mehr verlang ich doch nicht zefix.
>we live in a society
geschrieben am 21.10.2016 11:01:18
( Link )
Frage: Wieso fügst du denn überhaupt einen Standalone-Patch über uberASM ein? Das ist keine gute Idee und kann eigentlich nur schiefgehen.
-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 21.10.2016 13:21:27
( Link )
Zitat von RPG Hacker:
Frage: Wieso fügst du denn überhaupt einen Standalone-Patch über uberASM ein? Das ist keine gute Idee und kann eigentlich nur schiefgehen.

Zitat von Weisäi:
weil ich den Patch nicht in all meinen Levels haben will.


Gibt es da keine andere Möglichkeit sowas nur in einem Level zu haben?
>we live in a society
geschrieben am 21.10.2016 13:47:48
( Link )
Ganz so einfach geht das leider nicht. Dafür müsstest du den Patch an sich umschreiben. Der Patch hijackt ja gewisse Routinen des Spiels. Zu erkennen an
org $XXXXXX
Wenn du jetzt so einen Code einfach in uberASM einfügst, sieht uberASM das "org $XXXXXX" und denkt sich "oh, ich soll jetzt an Adresse $XXXXXX springen und allen nachfolgenden Code dort einfügen". Das kann dann auch erstmal gut gehen, weil der Code, den du dort haben willst, auch dort landet, aber zum einen wird der Code dann natürlich nicht dorthin geschrieben, wo der eigentliche Levelcode für dieses Level in uberASM landen soll, wird damit also niemals in diesem Level ausgeführt - bringt dir somit also schonmal nichts - und zum anderen überschreibst du damit auch die Zieladresse, an die jeder nachfolgender Code von uberASM geschrieben wird. Auch das willst du eigentlich nicht haben (wobei es vermutlich keine wirklich schlimme Nebenwirkung haben wird, weil diese Adressen sowieso meistens auf Freespace zeigen, im schlimmsten Fall würdest du also vermutlich nur deinen Code fragmentieren).

Eine einfache Lösung gibt es für das Problem nicht. Du müsstest den Patch an sich nehmen und ihn so umschreiben, dass er nur in einem Level aktiv ist und ihn ohne uberASM einfügen. Das wäre aber nicht leicht. Dafür müsstest du den Code gut verstehen und vermutlich an diversen Stellen anpacken. Eine andere Alternative wäre es, Code mit derselben Funktionalität zu finden, der aber nur uberASM benötigt, um zu funktionieren. Ich glaube aber nicht, dass es sowas gibt.

Aber ganz ehrlich? Ich glaube nicht, dass du irgendetwas davon brauchst. Lies dir nochmal die Beschreibung des Patches genau durch.
Zitat
This patch allows the player to have reversed gravity. Included are two gravity blocks and levelasm for gravity controlled by on-off blocks; read the readme for more details.

Die Beschreibung sagt doch schon, dass die Schwerkraft sich nur ändert, wenn man einen Block berührt. Dann ist es doch völlig egal, in welchem Level der Patch aktiv ist. Wenn du die Blöcke nur in ein einziges Level packst, ist die Schwerkraftänderung unterm Strich auch nur in diesem einen Level aktiv. Da brauchst du nicht groß Rumhacken oder Patches umschreiben oder sowas. Einfach Patch einfügen, Blöcke rein, fertig.
-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 21.10.2016 16:52:20
( Link )
Zitat von RPG Hacker:

Zitat
This patch allows the player to have reversed gravity. Included are two gravity blocks and levelasm for gravity controlled by on-off blocks; read the readme for more details.

Die Beschreibung sagt doch schon, dass die Schwerkraft sich nur ändert, wenn man einen Block berührt. Dann ist es doch völlig egal, in welchem Level der Patch aktiv ist. Wenn du die Blöcke nur in ein einziges Level packst, ist die Schwerkraftänderung unterm Strich auch nur in diesem einen Level aktiv. Da brauchst du nicht groß Rumhacken oder Patches umschreiben oder sowas. Einfach Patch einfügen, Blöcke rein, fertig.


Zitat von Weisesei:
wenn man von nem Sprite getroffen wird (egal in welchem Level man ist), oder nen Pilz bekommt etc... wird die reversed Gravity auch aktiviert; was sie aber eigentlich laut Beschreibung nicht machen sollte.
Habe das Ganze vorhin mit der normalen Einfügemethode festgestellt.


Das Problem ist ja das ich dies schon so gemacht habe, aber den nervigen Bug von da oben encountered habe.
In jedem Level wo ich ein Sprite berühre (egal welches), wird die reversed Gravity aktiviert. Ich habe dazu 2 Theorien. Bei deinem Hp Patch wird man ja zurückgestoßen wenn man getroffen wird. Vielleicht verträgt sich das nicht miteinander, oder das liegt überhaupt nicht daran weil es nicht erklären würde, warum sich Gravity auch aktiviert wenn man nen Pilz einsammelt und nicht dadurch zurückgestoßen wird etc.

Oder aber auch mann muss in jedes Level wo man gravity nicht haben will einen Off Block reinhauen. Das wäre mir dann aber schon langsam zu blöd. (würde jedoch das ganze mit den Sprites trotzdem nicht erklären)

Die Blöcke habe ich bis jetzt noch nicht eingefügt, weil sich das ganze schon ohne Blöcke leider überall aktiviert.

Btw: Danke für die lange Antwort.
>we live in a society
geschrieben am 21.10.2016 17:38:51
( Link )
Zitat von Wysey:
Vielleicht verträgt sich das nicht miteinander


Durchaus möglich. Das kannst du ganz leicht überprüfen, indem du dir in beiden Patches Zeilen mit "org" anschaust und dann die Zahlen dahinter miteinander vergleichst. Gibt es in zwei oder mehr Patches ein org mit derselben Zahl, gibt es einen sicheren Patch-Konflikt (kann auch andere Arten von Konflikten geben, aber das hier ist der wahrscheinlichste und häufigste).

Kannst natürlich auch den Patch auf eine cleane ROM packen, der nur einmal durch Lunar Magic gelaufen ist. Wenn da drin das Problem immer noch auftritt, ist der Patch selbst dran schuld. Tritt das Problem nicht mehr auf, ist irgendetwas anderes schuld.
-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 22.10.2016 21:38:51
( Link )
So Doppelpoast weil ich ein fame boi bin.
Habe jetzt alle Orgstellen verglichen von dem Gravitypatch mit all meinen anderen Patches.

Patches die drin sind:

Patches anzeigen
Disable duck
Code
header
lorom

!Freespace = $1D8000 ;Point to freespace

org $00D604
db $80 ;Disable ducking

org $01EB16
JSL Main

org !Freespace

!CodeSize = End-Main
db "STAR"
dw !CodeSize-$01
dw !CodeSize-$01^$FFFF

Main:
LDA $73 ;\Fix Yoshi glitches
ORA $13ED ;/
RTL
End:


Wario dash
Code
; Wario Dash - by K3fka
; Give credit, please

!Freespace = $1E8000

;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Defines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
!DashRAM1 = $1DFD ;The dash timer
!DashRAM2 = $1DFE ;The dash cooldown timer
!DashTimer = #$1F ;Time you will dash for
!Cooldown = #$30 ;Time before you can dash again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

header
lorom

;-------------
; Hex edits
;-------------

org $8E6F ; \ hack the routine neccesary to start
JSL Routine ; /
NOP #2

org !Freespace

!CodeSize = Ending-Routine ; \
db "STAR" ; | All code preservation
dw !CodeSize-$01 ; |
dw !CodeSize-$01^$FFFF ; /

Routine:
;---------------------
JSL K3fka
LDA $0F31 ; \ Restore the
STA $0F25 ; / Hijacked code.
RTL

DisableController:
STZ $15 ; \
STZ $16 ; | Keep the controller value zero, simulating no button press
STZ $17 ; | This is JSR to to because it saves space, keeping some branches working
STZ $18 ; / (BRA, BNE, BCS, etc)
RTS

K3fka:

DashCheck:
LDA !DashRAM1 ;\We're not dashing if our dash timer is zero
BEQ Check2 ;/
LDA $72 ;\
ORA $73 ; |
ORA $74 ; |
ORA $75 ; |Cancel the dash under certain conditions
ORA $1470 ; |
ORA $148F ; |
ORA $187A ; |
BNE Cancel ;/
DEC !DashRAM1 ;Decrease the dash timer
LDA #$04 ;\
STA $13EE ; |Simulate sliding
LDA #$01 ; |
STA $13ED ;/
LDA #$B3 ;\Set the pose
STA $13E0 ;/
JSR DisableController
LDA $76 ;\Dash left if we're facing left
BEQ DashL ;/
LDA #$2A ;\
STA $7B ; |
BRA WallCheck ; |Handles moving based on direction
DashL: ; |
LDA #$D5 ; |
STA $7B ;/
BRA WallCheck ;Then jump to the wall check

Check2:
LDA !DashRAM2 ;\If the cooldown timer is zero, start the dash
BEQ ButtonCheck ;/
DEC !DashRAM2 ;If not, decrease the cooldown timer
BRA End ;Jump to the end

ButtonCheck:
LDA $18 ;\
AND #$40 ; |Jump to the end if we're NOT pressing X
BEQ End ;/
LDA $19 ;\Or if we are small
BEQ End ;/

BeginDash:
LDA $72 ;\
ORA $73 ; |
ORA $74 ; |
ORA $75 ; |Cancel the dash under certain conditions
ORA $1470 ; |
ORA $148F ; |
ORA $187A ; |
BNE Cancel ;/
LDA !DashTimer ;\Set the dash timer
STA !DashRAM1 ;/
LDA !Cooldown ;\Set the cooldown timer
STA !DashRAM2 ;/
LDA #$04 ;\Play the sound effect
STA $1DFA ;/
BRA End ;Then jump to the end

WallCheck:
LDA $77 ;\
AND #$03 ; |Check to see if we're touching a wall
BEQ End ;/

Wall:
STZ $7B ;Stop moving
Cancel:
STZ !DashRAM1 ;\Zero out the timers
STZ !DashRAM2 ;/
STZ $13ED ;\Stop sliding
STZ $13EE ;/

End:
RTL

Ending:

;Done, son

Hp counter Patch

Code
;RPG-Styled HP and MP Counter Patch by RPG Hacker

header
lorom



!freespace = $238200 ; < POINT TO FREE SPACE



;;;;;;;;;;;;;;;
;Value Defines;
;;;;;;;;;;;;;;;


!IntroLevel = $E9 ;Set Intro Level Number + #$24 (Setting to $00 will disable Intro)

!LifesatStart = $04 ; These are the lives you start with minus one

!Damage = $0012 ; Set Damage a regular Sprite deals (in Hex)

!StartMaxHealth = $0096 ; Max HP to start with (in Hex)

!StartMaxMP = $0F ; Set MP to start with (in Hex)

!RefillMPAfterDeath = $00 ; Set to $00 and your MP aren't refilled when you die

!LosePowerupAfterDeath = $01 ; Set to $00 to not lose your Powerup after Death

!MushroomHeal = $0019 ; Set HP a Mushroom restores (in Hex)

!MPHeal = $04 ; Set MP, a 1UP-Mushroom recovers (in Hex)

!FireballMP = $01 ; Set MP, a Fireball takes (In Hex)

!CapeMP = $01 ; Set MP, Flying takes per second (In Hex)

!FloatRequiresMP = $00 ; Set to $00 if you don't want Floating to require MP

!SpinMP = $00 ; Set MP, Cape-Spinning takes (in Hex)

!FlyReduceSpeed = $32 ; Set, how fast your MP are reduced while Flying ($32 = 1 second)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Adress Defines (Touch only if you know what you're doing);
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


!freeram = $0060 ; Have to be TWO Bytes!

!displayram = $0062 ; Used for Status Bar

!bowserram = $0113 ; Used for removing Mario head in Bowser Battle

!checkram = $0DC4 ; Used for loading Initial Data

!powerupram = $0DC5 ; Used for saving Powerup when you die

!HurtFlag = $0670 ; $02 means Custom Damage, anything else means Normal Damage

!FlyTimer = $0671 ; Used for reducing MP while Flying

!Health = $010D ; Adress for storing current HP, have to be TWO Bytes!

!MaxHealth = $010F ; Adress for storing Maximum HP, have to be TWO Bytes!

!MP = $0111 ; Adress for storing current MP

!MaxMP = $0112 ; Adress for storing Maximum MP

!HealthSRAM = $700360 ; SRAM Adress for saving Health Data, have to be SIX Bytes!

!MaxHealthSRAM = $700366 ; SRAM Adress for saving Maximum Health Data, have to be SIX Bytes!

!MPSRAM = $70036C ; SRAM Adress for saving MP Data, have to be THREE Bytes!

!MaxMPSRAM = $70036F ; SRAM Adress for saving Maximum MP Data, have to be THREE Bytes!

!ItemSRAM = $700372 ; SRAM Adress for saving Item Data, have to be THREE Bytes!

!PowerupSRAM = $700375 ; SRAM Adress for saving Powerup Data, have to be THREE Bytes!

!LifesSRAM = $700378 ; SRAM Adress for saving Lifes



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Original SMW Routine Reroutes/Hacks;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;org $05CF1B ;\
; nop #3 ; |
; ; | Disable Bonus Game
; ; |
;org $009E4B ; |
; nop #3 ;/


;org $028ACD ;\ Disable 1UP Increasing and Sound
; nop #8 ;/


org $008F9D ;\
jml $008FC5 ; |
nop ; |
; |
; |
org $009053 ; | Remove Bonus Stars from Status Bar
nop #3 ; |
; |
; |
org $009068 ; |
nop #3 ;/


org $00F343 ;\ Remove Yoshi Coin Counter from Status Bar
nop #3 ;/


org $008FEF ;\ Remove Mario/Luigi from Status Bar
nop #3 ;/


org $008F49 ;\ Jump to new Status Bar Routine
jml Statusbar ;/


org $00F5F8 ;\ Disable Item Box getting used when hurt
nop #$4 ;/


org $00C570 ;\ Disable Item Box getting used when pressing Select
db $80 ;/


org $009E48 ;\ Disable Item Box Reset at Game Start
nop #3 ;/


org $00F600 ;\ Disable Powerup Taking when hurt
nop #$2 ;/


org $00D129 ;\ Eliminate Powerdown Animation and jump to Flash Routine
db $EA,$EA,$EA,$80 ;/


org $009E2C ;\
jml newgame ; | Loading/starting a game from title screen
nop #2 ;/


org $00F5D5 ;\ Custom Damage Routine
jml hit ;/


org $00F5B2 ;\ When falling into a hole or lava
jsl CustomPitDeath ;/


org $00F606 ;\ Jump to Custom Death Routine
jml customdeath ;/


org $00A0E6 ;\ Refill Health when you die
jsl RefillHealth ;/


org $009BCC ;\
jsl SaveSRAMRoutine ; | Jump to new SRAM Saving Routine
nop #2 ;/


org $009D24 ;\ Jump to 2-Player-Disable Code
jsl oneplayer ;/


org $01C510 ;\
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; | Disable Items giving Status Bar Items
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;/


org $01C524 ;\ Mushroom always gives Mushroom Power
db $00,$00,$00,$00 ;/


org $01C528 ;\ Flower always gives Flower Power
db $04,$04,$04,$04 ;/


org $01C52C ;\ Star always gives Star Power
db $02,$02,$02,$02 ;/


org $01C530 ;\ Feather always gives Feather Power
db $03,$03,$03,$03 ;/


org $01C534 ;\ 1UP-Mushroom always gives 1UP-Mushroom Power
db $05,$05,$05,$05 ;/


org $01C561 ;\
jml Mushroom ; |
; |
org $01C592 ; |
jml Star ; |
; |
org $01C598 ; |
jml Feather ; | Powerup Hijacks
; |
org $01C5EC ; |
jml Flower ; |
; |
org $01C5FE ; |
jml Oneup ;/


org $009095 ;\ Fix Status Bar Item
jml ItemFix ;/


org $00D081 ;\ Hijack Fireball Routine
jml Fireball ;/


org $00D676 ;\
jml Flyroutine1 ; |
nop ; |
; |
org $00D802 ; |
jml Flyroutine2 ; |
; |
org $00D8E7 ; |
jml Flyroutine3 ; |
; | Hijack Flying Routines
org $00D062 ; |
jml Flyroutine4 ; |
; |
org $00D07B ; |
jml Flyroutine5 ; |
; |
org $00D832 ; |
jml Flyroutine6 ; |
nop #2 ;/

org $009CB0 ;\
jml InitialSetup ; | Load Intro Level
nop ;/

org $00971A ;\ Load Initial Data
jml IntroLevelSet ;/

org $009CF8 ;\
jml IntroDone ; | If Intro already played through
nop ;/

org $008C81 ;\
db $FC,$38,$FC,$38,$FC,$38,$FC,$38,$FC,$38,$42,$3C ; |
db $41,$7C,$FC,$38,$11,$38,$19,$38,$FC,$38,$FC,$38 ; |
db $FC,$38,$00,$38,$40,$38,$FC,$38,$FC,$38,$00,$38 ; |
db $FC,$38,$FC,$38,$FC,$38 ; |
; |
org $008CC1 ; | Status Bar Rearrangement
db $43,$BC,$44,$FC,$FC,$38,$16,$38,$19,$38,$FC,$38 ; |
db $FC,$38,$FC,$38,$00,$38,$40,$38,$FC,$38,$FC,$38 ; |
db $00,$38,$FC,$38,$FC,$38,$FC,$38 ; |
; |
org $008CF7 ; |
db $FC,$38,$FC,$38,$FC,$38,$FC,$38 ;/


;;;;;;;;;;;;;;;;;
;MAIN CODE START;
;;;;;;;;;;;;;;;;;


org !freespace ;\
; |
db "STAR" ; | RATS-Tag
dw codeend-oneplayer ; |
dw codeend-oneplayer^#$FFFF ;/



;;;;;;;;;;;;;;;;;
;One Player Only;
;;;;;;;;;;;;;;;;;


oneplayer:

inc $0100 ;\
lda $0100 ; |
cmp #$0A ; |
bne return ; |
inc $0100 ; |
pea $8074 ; | Disable second Player
pea $9E64 ; |
pea $9E12 ; |
jmp $00A195 ; |
; |
return: ; |
rtl ;/



;;;;;;;;;;;;;;;;;;;;;;;;;;
;Status Bar Rearrangement;
;;;;;;;;;;;;;;;;;;;;;;;;;;


Statusbar:

rep #$20 ;\
lda !Health ; |
jsl Conversion16 ; |
sep #$20 ; |
sty !displayram ; |
cpy #$00 ; |
bne write3 ; |
ldy #$FC ; |
write3: ; |
sty $0F00 ; | Write current HP to Status Bar
pha ; |
txa ; |
ora !displayram ; |
cmp #$00 ; |
bne write4 ; |
ldx #$FC ; |
write4: ; |
stx $0F01 ; |
pla ; |
sta $0F02 ;/


rep #$20 ;\
lda !MaxHealth ; |
jsl Conversion16 ; |
sep #$20 ; |
sty !displayram ; |
cpy #$00 ; |
bne write5 ; |
ldy #$FC ; |
write5: ; |
sty $0F04 ; |
pha ; | Write Maximum HP to Status Bar
txa ; |
ora !displayram ; |
cmp #$00 ; |
bne write6 ; |
ldx #$FC ; |
write6: ; |
stx $0F05 ; |
pla ; |
sta $0F06 ;/

lda !MP ;\
jsl Conversion8 ; |
sta $0F1D ; |
cpx #$00 ; | Write current MP to Status Bar
bne write1: ; |
ldx #$FC ; |
write1: ; |
stx $0F1C ;/


lda !MaxMP ;\
jsl Conversion8 ; |
sta $0F21 ; |
cpx #$00 ; | Write Maximum MP to Status Bar
bne write2: ; |
ldx #$FC ; |
write2: ; |
stx $0F20 ;/

lda $0D9B ;\
cmp #$C1 ; |
bne NoBowser ; |
lda $0DC2 ; |
cmp #$00 ; |
beq BowserSkip ; |
sta !bowserram ; |
stz $0DC2 ; |
stz $0DBC ; |
bra BowserSkip ; | Remove Mario head in Bowser Battles
; |
NoBowser: ; |
lda !bowserram ; |
cmp #$00 ; |
beq BowserSkip ; |
cmp #$55 ; |
beq BowserSkip ; |
lda !bowserram ; |
sta $0DC2 ; |
sta $0DBC ; |
stz !bowserram ;/

BowserSkip:
jml $008F5B ; Return to Main Code, skip lives and Bonus Stars to save cycles



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Starting a new game/Loading a Game;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


InitialSetup: ;\
lda #!IntroLevel ; |
sta $0109 ; |
cmp #$00 ; |
beq SkippedIntro ; |
lda #$00 ; |
sta !checkram ; | Load Intro Level at Start Up
jml $009CB5 ; |
; |
SkippedIntro: ; |
lda #$01 ; |
sta !checkram ; |
jml $009CB5 ;/


IntroDone: ;\
stz $0109 ; |
stz !checkram ; | Don't load Intro if Save File exists
lda #$8F ; |
jml $009CFD ;/


IntroLevelSet: ;\
lda !checkram ; |
cmp #$01 ; |
beq IntroWasSkipped ; |
lda $0109 ; | Check, if Intro Level was loaded
cmp #$00 ; |
beq SkipIntroLevel ; |
cmp #!IntroLevel ; |
bne NoInitialLoad ;/


IntroWasSkipped: ;\
rep #$20 ; |
lda $010A ; |
asl a ; |
tax ; |
lda #!StartMaxHealth ; |
jsl Inputcheck16 ; |
sta !freeram ; |
lda !freeram ; |
sta !MaxHealth ; |
sta !MaxHealthSRAM,x ; |
sta !Health ; |
sta !HealthSRAM,x ; |
ldx $010A ; |
sep #$20 ; |
; |
lda #!StartMaxMP ; |
jsl Inputcheck8 ; | Reset SRAM Data at New Game
sta !freeram ; |
sta !MaxMP ; |
sta !MaxMPSRAM,x ; |
sta !MP ; |
sta !MPSRAM,x ; |
; |
lda #$01 ; |
sta $0DC2 ; |
sta $0DBC ; |
sta !ItemSRAM,x ; |
sta $19 ; |
sta $0DB8 ; |
sta !PowerupSRAM,x ; |
; |
lda #!LifesatStart ; |
sta $0DBE ; |
sta $0DB4 ; |
sta !LifesSRAM,x ;/


lda !checkram ;\
cmp #$01 ; | If Intro was Skipped
beq SkipIntroLevel ;/


NoInitialLoad: ;\
lda $0109 ; |
cmp #$E9 ; |
bne ChangedIntroLevel ; |
jml $009723 ; |
ChangedIntroLevel: ; | Return to Main Code
jml $009740 ; |
; |
SkipIntroLevel: ; |
stz !checkram ; |
jml $009728 ;/



newgame: ;\
stz $0DBF ; | Set Coins at Game Start
ldx $0DB2 ; |
phx ;/

rep #$20 ;\
lda $010A ; |
asl a ; |
tax ; |
lda !MaxHealthSRAM,x ; |
sta !MaxHealth ; |
lda !HealthSRAM,x ; |
sta !Health ; |
ldx $010A ; |
sep #$20 ; |
; |
lda !MaxMPSRAM,x ; | Load SRAM Data
sta !MaxMP ; |
lda !MPSRAM,x ; |
sta !MP ; |
; |
lda !ItemSRAM,x ; |
sta $0DC2 ; |
sta $0DBC ; |
; |
lda !PowerupSRAM,x ; |
sta $19 ; |
; |
lda !LifesSRAM,x ; |
sta $0DBE ;/

plx ;\
stz $0DC1 ; | Return to Main Code
jml $009E3A ;/



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Custom Damage Handling and HP Setting;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


hit: ;\
lda $19 ; |
sta !powerupram ; |
lda !HurtFlag ; |
cmp #$02 ; | Load regular Damage
beq calculation ; |
rep #$20 ; |
lda #!Damage ; |
sta !freeram ;/

calculation: ;\
rep #$20 ; |
lda !freeram ; | Check, if Damage is a valid Input
jsl Inputcheck16 ; |
sta !freeram ;/

lda !Health ;\
cmp !freeram ; |
bcs Dealdamage ; |
jmp customdeath ; |
; |
Dealdamage: ; |
sec ; | Damage Calculation
sbc !freeram ; |
sta !Health ; |
lda !Health ; |
cmp #$0000 ; |
beq customdeath ; |
sep #$20 ; |
stz !HurtFlag ;/

lda #$38 ;\ Play Hurt Sound
sta $1DFc ;/

lda $0D9B ;\
cmp #$80 ; | Disable Knockback in Iggy/Larry Battles
beq NoKnockback ;/

lda #$D7 ;\
sta $7D ; |
; |
lda $76 ; |
bne other ; |
; |
lda #$29 ; |
sta $7B ; |
bra next ; | Knockback Code
; |
other: ; |
lda #$D7 ; |
sta $7B ; |
; |
next: ; |
; |
NoKnockback: ; |
jml $00F5DD ;/

CustomPitDeath: ;\
lda $19 ; | Save Powerup when you fall into a hole
sta !powerupram ;/


customdeath: ;\
rep #$20 ; |
lda #$0000 ; |
sta !Health ; |
sep #$20 ; |
stz !HurtFlag ; |
lda #$90 ; |
sta $7D ; |
lda #$09 ; |
sta $1DFB ; | Custom Death Routine
lda #$FF ; |
sta $0DDA ; |
lda #$09 ; |
sta $71 ; |
stz $140D ; |
lda #$30 ; |
sta $1496 ; |
sta $9D ; |
stz $1407 ; |
stz $188A ; |
rtl ;/

RefillHealth: ;\
rep #$20 ; |
lda !Health ; |
cmp #$0000 ; |
bne NoRefill ; |
lda !MaxHealth ; |
sta !Health ; |
sep #$20 ; |
lda #!RefillMPAfterDeath ; |
cmp #$00 ; |
beq NoMPRefill ; |
lda !MaxMP ; |
sta !MP ; |
NoMPRefill: ; |
lda #!LosePowerupAfterDeath ; | Reset Health and MP when you die
cmp #$00 ; |
bne ResetPowerup ; |
lda !powerupram ; |
sta $19 ; |
sta $0DB8 ; |
NoRefill: ; |
sep #$20 ; |
lda #$03 ; |
sta $44 ; |
rtl ; |
; |
ResetPowerup: ; |
lda #$01 ; |
sta $19 ; |
sta $0DB8 ; |
bra NoRefill ;/



;;;;;;;;;;;;;;;;;;;;;;
;Item Hijack Routines;
;;;;;;;;;;;;;;;;;;;;;;


Mushroom: ;\
lda #$0A ; |
sta $1DF9 ; |
rep #$20 ; |
lda #!MushroomHeal ; |
jsl Inputcheck16 ; |
sta !freeram ; |
lda !Health ; | Mushroom recovers HP
clc ; |
adc !freeram ; |
sta !Health ; |
cmp !MaxHealth ; |
bcs ReduceHealth ; |
sep #$20 ; |
jmp itemreturn ;/

ReduceHealth: ;\
lda !MaxHealth ; |
sta !Health ; | If HP are higher then Max HP, reduce them
sep #$20 ; |
jmp itemreturn ;/


Star: ;\
lda #$0A ; |
sta $1DF9 ; |
lda #$FF ; |
sta $1490 ; |
lda #$0D ; | Star Powerup
sta $1DFB ; |
asl $0DDA ; |
sec ; |
ror $0DDA ; |
jmp itemreturn ;/


Feather: ;\
lda $19 ; |
cmp #$02 ; |
beq PowerupMPHeal ; |
lda #$02 ; |
sta $19 ; |
lda #$0D ; | Feather Powerup
sta $1DF9 ; |
lda #$04 ; |
jsr $02ACE5 ; |
jsr $01C5AE ; |
inc $9D ; |
jmp itemreturn ;/


Flower: ;\
lda $19 ; |
cmp #$03 ; |
beq PowerupMPHeal ; |
lda #$20 ; |
sta $149B ; |
sta $9D ; |
lda #$04 ; |
sta $71 ; | Flower Powerup
lda #$03 ; |
sta $19 ; |
jmp $01C56F ; |
lda #$08 ; |
clc ; |
adc $1594,x ; |
jsr $02ACE5 ; |
jmp itemreturn ;/


Oneup: ;\
lda #$0A ; |
sta $1DF9 ; |
lda #!MPHeal ; | 1UP-Mushroom recovers MP
jsl Inputcheck8 ; |
sta !freeram ; |
bra addmp ;/


PowerupMPHeal: ;\
lda #$0A ; |
sta $1DF9 ; |
lda #!MPHeal ; |
lsr a ; | Recover MP if you get the same Powerup twice
jsl Inputcheck8 ; |
sta !freeram ; |
bra addmp ;/


itemreturn: ;\ Jump back to Main Code
jml $01C608 ;/


addmp: ;\
lda !MP ; |
clc ; |
adc !freeram ; |
sta !freeram ; | MP Caculation
cmp !MaxMP ; |
bcs ReduceMP ; |
sta !MP ; |
jmp itemreturn ;/

ReduceMP: ;\
lda !MaxMP ; | If MP higher then Maximum MP, reduce them
sta !MP ; |
jmp itemreturn ;/



;;;;;;;;;;;;;;;;;;;;;;;;;
;Fireball Hijack Routine;
;;;;;;;;;;;;;;;;;;;;;;;;;


Fireball: ;\
cmp #$03 ; |
bne Fireballreturn ; |
lda $73 ; |
ora $187A ; |
bne Fireballreturn ; |
bit $16 ; |
bvs Fireballjump ; |
lda $140D ; |
beq Fireballreturn ; |
inc $13E2 ; |
lda $13E2 ; |
and #$0F ; | Original Fireball Routine
bne Fireballreturn ; |
tay ; |
lda $13E2 ; |
and #$10 ; |
beq Fireballskip ; |
iny ; |
; |
Fireballskip: ; |
sty $76 ; |
; |
Fireballjump: ; |
jsl Fireballsubroutine ; |
; |
Fireballreturn: ; |
jml $00D0AD ;/


Fireballsubroutine: ;\
ldx #$09 ; |
; |
Fireballsubroutineloop: ; |
lda $170B,x ; | Original Fireball Subroutine
beq Fireballsubsubroutine ; |
dex ; |
cpx #$07 ; |
bne Fireballsubroutineloop ; |
rtl ;/


Fireballsubsubroutine: ;\
lda !MP ; |
cmp #!FireballMP ; |
bcc NoFireball ; | Check and use MP
sec ; |
sbc #!FireballMP ; |
sta !MP ;/

lda #$06 ;\
sta $1DFC ; |
lda #$0A ; |
sta $149C ; |
lda #$05 ; |
sta $170B,x ; |
lda #$30 ; |
sta $173D,x ; |
ldy $76 ; |
lda $FE94,y ; |
sta $1747,x ; |
lda $187A ; |
beq Fireballsubsubroutinejump ; |
iny ; |
iny ; |
lda $18DC ; |
beq Fireballsubsubroutinejump ; |
iny ; | Original Fireball-Subroutine Subroutine
iny ; |
; |
Fireballsubsubroutinejump: ; |
lda $94 ; |
clc ; |
adc $FE96,y ; |
sta $171F,x ; |
lda $95 ; |
adc $FE9C,y ; |
sta $1733,x ; |
lda $96 ; |
clc ; |
adc $FEA2,y ; |
sta $1715,x ; |
lda $97 ; |
adc #$00 ; |
sta $1729,x ; |
lda $13F9 ; |
sta $1779,x ; |
; |
Fireballend: ; |
rtl ;/

NoFireball: ;\
;lda $140D ; |
;cmp #$00 ; |
;bne NoSound ; | Remove Semicolons if you want Mario to make a Sound Effect
;lda #$54 ; | when he doesn't have enough MP for a Fireball
;sta $1DFC ; |
;NoSound: ; |
bra Fireballend ;/



;;;;;;;;;;;;;;;;;;;;;;;
;Flying Hijack Routine:
;;;;;;;;;;;;;;;;;;;;;;;


Flyroutine1: ;\
lda !MP ; |
cmp #!CapeMP ; |
bcc Nofly1 ; |
lda $19 ; |
cmp #$02 ; |
bne NoMPReduce ; |
lda !MP ; |
sec ; |
sbc #!CapeMP ; |
sta !MP ; |
NoMPReduce: ; |
lda #$50 ; |
sta $149F ; |
jml $00D67B ; |
; |
Nofly1: ; | Disable Take-Off when MP are too low
lda #$00 ; |
sta $149F ; |
jml $00D67B ; |
; |
; |
Flyroutine2: ; |
lda !MP ; |
cmp #!CapeMP ; |
bcc Nofly2 ; |
LDX $19 ; |
CPX #$02 ; |
jml $00D806 ; |
; |
Nofly2: ; |
lda $19 ; |
cpx #$FF ; |
jml $00D806 ;/


Flyroutine3: ;\
lda $19 ; |
cmp #$02 ; |
bne Regularjump ; |
lda #!FloatRequiresMP ; |
cmp #$00 ; |
beq Returnfloat ; |
lda !MP ; | Disable Floating when MP are too low
cmp #!CapeMP ; |
bcc Regularjump ; |
Returnfloat: ; |
jml $00D8ED ; |
; |
Regularjump: ; |
jml $00D928 ;/


Flyroutine4: ;\
lda $19 ; |
cmp #$02 ; |
bne Nospin ; |
lda !MP ; |
cmp #!SpinMP ; |
bcc Nospin ; | Disable Spin when MP are too low
lda $19 ; |
jml $00D068 ; |
; |
Nospin: ; |
lda $19 ; |
jml $00D081 ;/


Flyroutine5: ;\
lda #$04 ; |
sta $1DFC ; |
lda !MP ; | Reduce MP when Spinning
sec ; |
sbc #!SpinMP ; |
sta !MP ; |
jml $00D080 ;/


Flyroutine6: ;\
lda !MP ; |
cmp #!CapeMP ; |
bcc NoFly6 ; |
inc !FlyTimer ; |
lda !FlyTimer ; |
cmp #!FlyReduceSpeed ; |
bcc ReturnFly6 ; |
stz !FlyTimer ; |
lda !MP ; | Reduce MP while Flying
sec ; |
sbc #!CapeMP ; |
sta !MP ; |
ReturnFly6: ; |
ldx #$03 ; |
ldy $7D ; |
jml $00D836 ;/

NoFly6: ;\
stz $15 ; | Fall down if MP too low
stz $16 ; |
jml $00D836 ;/



;;;;;;;;;;;;;;;
;SRAM Handling;
;;;;;;;;;;;;;;;


SaveSRAMRoutine: ;\
jsr GetSaveFile ; |
; |
SaveScoreData: ; |
; | Save Coins to SRAM
lda $0F34,y ; | (From 6 Digit Coin Counter)
sta $70079F,x ; |
inx ; |
iny ; |
cpy #32 ; |
bcc SaveScoreData ;/

ldx $010A

lda $0DBE ;\
cmp #!LifesatStart ; |
bcc SaveMaxData ; | If Lifes are lower then Starting Lifes, save Max Data to SRAM
lda $0DBE ; |
sta !LifesSRAM,x ;/

rep #$20 ;\
lda $010A ; |
asl a ; |
tax ; |
lda !Health ; | Save Health to SRAM
sta !HealthSRAM,x ; |
lda !MaxHealth ; |
sta !MaxHealthSRAM,x ; |
ldx $010A ; |
sep #$20 ;/

lda !MP ;\
sta !MPSRAM,x ; | Save MP to SRAM
lda !MaxMP ; |
sta !MaxMPSRAM,x ;/

lda $0DC2 ;\
sta !ItemSRAM,x ; | Save Item and Powerup to SRAM
lda $19 ; |
sta !PowerupSRAM,x ;/

lda $009CCB,x ;\ Return to Main Code
rtl ;/


SaveMaxData: ;\ If Lifes are lower then Starting Lifes
sta !LifesSRAM,x ;/

rep #$20 ;\
lda $010A ; |
asl a ; |
tax ; |
lda !MaxHealth ; | Save Health to SRAM
sta !HealthSRAM,x ; |
sta !MaxHealthSRAM,x ; |
ldx $010A ; |
sep #$20 ;/

lda !MaxMP ;\
sta !MPSRAM,x ; | Save MP to SRAM
sta !MaxMPSRAM,x ;/

lda $0DC2 ;\
sta !ItemSRAM,x ; | Save Item and Powerup to SRAM
lda $19 ; |
sta !PowerupSRAM,x ;/

lda $009CCB,x ;\ Return to Main Code
rtl ;/


GetSaveFile: ;\
lda $010A ; |
asl ; |
asl ; |
asl ; | Used by Coin Saving Routine
asl ; |
asl ; |
tax ; |
ldy #0 ; |
rts ;/



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Item Fix Patch (Used for Head in Status Bar);
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


ItemFix: ;\
; |
phx ; |
php ; |
lda #$18 ; |
sta $0201,Y ; |
ldy $01 ; | Item Fix Patch (Required for Mario Head)
lda #$00 ; |
xba ; |
lda $0DC2 ; |
rep #$30 ; |
asl a ; |
tax ; |
lda ItemTable,x ; |
sta $0202,y ;/

lda #$0F18 ;\ Y and X Position of Item Box
sta $0200,y ;/

plp ;\
plx ; | Return to Main Code
jml $0090C7 ;/


ItemTable:
dw $0000,$20C2,$2A26,$2448,$240E,$6A24,$2AAE,$265C ;\ "$20CE" used to display Cheap Cheap (Mario head) with Mario's Palettes in Status Bar
dw $0000,$218A,$21E4,$28E8,$6024,$60EC,$2825,$21E4 ; |
dw $602A,$602A,$0000,$658C,$2060,$0000,$0000,$6BC2 ; |
dw $25C5,$25AB,$239D,$0000,$2B80,$2B81,$2B0A,$0000 ; |
dw $0000,$2B4B,$0000,$0000,$0000,$0000,$0000,$6580 ; |
dw $2746,$2240,$27A0,$23EA,$2382,$2BC8,$2D46,$6B40 ; |
dw $23A2,$21AA,$250A,$250C,$254A,$25A0,$0000,$6DA6 ; |
dw $678A,$A14A,$214A,$6D64,$23C8,$2FAA,$202E,$61E0 ; |
dw $6933,$236E,$252A,$A9AC,$2BE4,$6BE4,$66C0,$2BC4 ; |
dw $23CC,$6330,$6686,$6BAE,$61C7,$6385,$2240,$6BA2 ; |
dw $6D86,$2360,$29D6,$2D80,$6824,$282A,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; | Item Fix Table
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; |
dw $0000,$0000,$0000,$0000,$0000,$6AC8,$68C8,$66E0 ; |
dw $64C8,$6A94,$6894,$6694,$6494,$6A92,$6A92,$2892 ; |
dw $2892,$6492,$23CC,$20EB,$64AA,$64A8,$6D80,$0000 ; |
dw $6982,$6980,$2567,$0000,$2488,$6567,$0000,$28AC ; |
dw $618A,$62A6,$258E,$0000,$27A4,$2788,$24E8,$2B17 ; |
dw $2917,$6B17,$6917,$238E,$23A2,$2D81,$2900,$0000 ; |
dw $25DC,$0000,$0000,$698C,$2A2A,$6F82,$6FAA,$6F64 ; |
dw $25AC,$654A,$2B02,$0000,$6F8C,$6D6A,$6DED,$27C4 ; |
dw $27C6,$27C8,$678C,$0000,$65E8,$63C2,$67E2,$6788 ; |
dw $27CE,$6380,$20E8,$0000,$2567,$6DC4,$2BA4,$6B8C ; |
dw $6BEC,$2440,$6184,$2186,$28AE,$28AE,$29A7,$61EB ; |
dw $0000,$0000,$23EA,$2385,$23EB,$2386,$2040,$2040 ; |
dw $2161,$21EB,$2BCB,$2BCC,$21A2,$2B00,$23E2,$2160 ; |
dw $0000,$21DE,$238E,$A38E,$236C,$25C8,$0000,$2060 ; |
dw $0000,$0000,$202E,$6FC0,$6FAA,$258A,$0000,$0000 ;/



;;;;;;;;;;;;;;;;;;;;;;;;;;
;Hex To Decimal Converter;
;;;;;;;;;;;;;;;;;;;;;;;;;;


Conversion8:
ldx #$00 ;> Set X to 0
ldy #$00 ;> Set Y to 0

StartCompare1:
cmp #$64 ;\
bcc StartCompare2 ; |While A >= 100:
sbc #$64 ; |Decrease A by 100
iny ; |Increase Y by 1
bra StartCompare1 ;/

StartCompare2:
cmp #$0A ;\
bcc ReturnLong1 ; |While A >= 10:
sbc #$0A ; |Decrease A by 10
inx ; |Increase X by 1
bra StartCompare2 ;/

ReturnLong1:
rtl


Conversion16:
ldx #$00 ;> Set X to 0
ldy #$00 ;> Set Y to 0

StartCompare3:
cmp #$0064 ;\
bcc StartCompare4 ; |While A >= 100:
sbc #$0064 ; |Decrease A by 100
iny ; |Increase Y by 1
bra StartCompare3 ;/

StartCompare4:
cmp #$000A ;\
bcc ReturnLong2 ; |While A >= 10:
sbc #$000A ; |Decrease A by 10
inx ; |Increase X by 1
bra StartCompare4 ;/

ReturnLong2:
rtl



;;;;;;;;;;;;;;;;;;;;;;;;
;Check for valid Inputs;
;;;;;;;;;;;;;;;;;;;;;;;;


Inputcheck8:
cmp #$64 ;\
bcc store1 ; |
lda #$63 ; | Checks, if a value is lower then $64 (=100)
store1: ; |
rtl ;/


Inputcheck16:
cmp #$03E8 ;\
bcc store2 ; |
lda #$03E7 ; | Checks, if a value is lower then $03E8 (=1000)
store2: ; |
rtl ;/


codeend: ; RATS-Tag End

Der einzig wahre Gravitypatch der nicht will

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reverse Gravity
;
; This patch allows the player to have reversed gravity.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!reversed = $60 ; The reversed gravity flag.

org $00D058
autoclean JSL fix_cape

org $00DC45
JML y_speed
NOP

org $00E346
JML fix_ram_80
NOP
NOP

org $00E46D
JML flip_mario_gfx

org $00ED14
JML fix_ceiling

org $00EE17
JML fix_ground_chk

org $00EED4
JML fix_ground
NOP

org $00F18D
JSL fix_00F18D
NOP #2

org $00F44D
JML interaction

org $00F5A3
JSL fix_fall_death
NOP
BCC $0C

org $00FD4A
JSL fix_bubble
NOP

org $00FDC3
JSL fix_splash
BRA $00

org $00FE7E
JML fix_dust

org $01A11A
JSL fix_carry
NOP

org $028830
JSL fix_028830
NOP

org $0290E5
JML fix_0290E5

org $0290F9
LDA $01
BEQ +
STZ $7D
BRA +
NOP
+

org $02912B
JML fix_02912B
NOP

org $029163
JML fix_029163
NOP

org $03B690
JSL fix_clipping
NOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

freecode
reset bytes

flip_offsets:
dw $000F,$0007

print "flip_gravity is located at: $", pc

flip_gravity: LDA !reversed
EOR #$01
STA !reversed

PHX
PHY
LDX #$00
LDA $19
BEQ +
LDA $73
BNE +
LDX #$02
+ REP #$20
LDA $96
LDY !reversed
BNE .ud
SEC
SBC.l flip_offsets,x
BRA +
.ud CLC
ADC.l flip_offsets,x
+ STA $96
SEP #$20
PLY
PLX
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section flips Mario's graphics.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

flip_mario_gfx: LDA !reversed
BNE .ud

REP #$20
LDA $80
JML $00E471

.ud LDA $0303,y
ORA #$80
STA $0303,y

REP #$20
LDA $80
SEC
SBC $DE32,x
BIT $03
BMI +
CLC
ADC #$0008
+ CLC
ADC #$0010
JML $00E475

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section flips the Y speed and changes the interaction table while fixing
; any bugs that arise because of these changes.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_ceiling: CMP #$F9
LDY !reversed
BEQ .not_ud
BCS +

LDY $72
BEQ ++

EOR #$F0
STA $00

LDA $96
SEC
SBC $00
STA $96
BCS ++
DEC $97
++ JML $00ED37

.not_ud BCC +
JML $00ED28
+ JML $00ED18

fix_ground_chk: STA $91
LDY !reversed
BEQ .not_ud
EOR #$0F
.not_ud CMP #$08
BCC +
JML $00EE1D
+ JML $00EE3A

fix_ground: LDA !reversed
BNE .ud

LDA $96
SEC
SBC $91
JML $00EED9

.ud LDA $91
EOR #$0F
CLC
ADC $96
STA $96
BCC +
INC $97
+ JML $00EEE1

y_interaction:
dw $0008
dw $0008,$0006,$000A,$0010,$0000,$0000
dw $0008,$0006,$000A,$0010,$0000,$0000
dw $000E,$0006,$0011,$0018,$0000,$0000
dw $000E,$0006,$0011,$0018,$0000,$0000
dw $0013,$0008,$0017,$001D,$0000,$0000
dw $0013,$0008,$0017,$001D,$0000,$0000
dw $0016,$0008,$001A,$0020,$0000,$0000
dw $0016,$0008,$001A,$0020,$0000,$0000
dw $0018,$0018,$0018,$0018,$0018,$0018

interaction: INX
INX
LDA !reversed
REP #$20
BNE .ud
JML $00F451

.ud LDA $94
CLC
ADC $E830,x
STA $9A
LDA $96
CLC
ADC.l y_interaction,x
JML $00F45F

y_speed: LDY !reversed
BEQ .not_ud
LDA $7D
EOR #$FF
INC
STA $7D
.not_ud PEA $DC49
LDX #$02
JML $00DC4F

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section fixes bounce sprites.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_00F18D: STZ $00
REP #$20
LDA $05,s
CMP #$EC89
BEQ .mario
CMP #$ED05
BEQ .mario
CMP #$EE82
BEQ .mario
SEP #$20
BRA .not_ud

- LDA !reversed
BEQ .not_ud
DEY
CPY #$02
BCC .not_ud
INY
TYA
EOR #$03
TAY
.not_ud STY $06
LDA $00F0C8,x
RTL

.mario SEP #$20
LDA $00F05C,x
CMP #$01
BNE -
INC $00
BRA -

fix_028830: LDA $00
CLC
ROR
ROR
STA $169D,y
RTL

fix_0290E5: STZ $01
LDA $1699,x
CMP #$02
BNE +
LDA $169D,x
BPL +

LDA $16C9,x
AND #$03
LDY !reversed
BNE .ud
CMP #$03
BNE +
BRA .nb

.ud CMP #$00
BNE +
.nb INC $01
+ LDA $169D,x
LSR
BCS .return
JML $0290EA
.return JML $02910B

fix_02912B: LDA $01
BEQ .return
LDA $71
BNE .return
LDY !reversed
BNE .ud
JML $02913A
.return JML $02915E

.ud LDA $16A1,x
CLC
ADC #$10
STA $96
LDA $16A9,x
ADC #$00
JML $029152

fix_029163: LDA $01
BEQ .return

LDY !reversed
BNE .ud
JML $02916C
.return JML $029182

.ud LDA #$A0
STA $7D
REP #$20
INC $96
INC $96
SEP #$20
JML $02917D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section fixes various bugs.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_bubble: LDY !reversed
BNE .ud
ADC $96
BRA +

.ud LDA $96
LDY $19
BEQ +
LDY $73
BNE +
CLC
ADC #$08
+ STA $1715,x
RTL

fix_cape: CLC
PHX
LDX !reversed
BNE .ud
PLX
ADC $D03C,y
RTL

.ud PLX
ADC #$0010
SEC
SBC $D03C,y
RTL

fix_carry: LDY !reversed
CLC
BNE .ud

ADC $02
BRA +

.ud LDA $02
ADC #$01
+ STA $D8,x
RTL

fix_clipping: LDY !reversed
BNE .ud
CLC
ADC $03B65C,x
.ud RTL

fix_dust: LDA !reversed
BNE .ud
LDA $96
ADC #$1A
JML $00FE82

.ud LDA $96
SEC
SBC #$04
PHX
JML $00FE8A

fix_fall_death: CLC
LDY !reversed
BNE .ud

SEP #$20
LDA $81
DEC
BMI .return
SEC
.return RTL

.ud LDA $80
ADC #$0020
SEP #$20
CLC
BPL .return
SEC
RTL

fix_ram_80: LDA $188B
AND #$00FF
LDY !reversed
BNE .ud
JML $00E34C

.ud EOR #$FFFF
CLC
ADC $96
LDY $19
CPY #$01
LDY #$01
BCS +
INC
DEY
+ CPX #$0A
BCS +
CPY $13DB
BCS +
INC
SEC
+ JML $00E360

splash_offset:
db $08,$10,$16,$16

fix_splash: LDA $96
CLC
PHY
LDY !reversed
BNE .ud
ADC $FD9D,x
BRA +

.ud ADC.l splash_offset,x
+ PLY
RTL

print "Bytes inserted: ", bytes


Ich kann keine selben Stellen finden.

Ich habe aber herausgefunden das der Bug nur getriggered wird, wenn man Pilze ( egal ob man rot oder grün ) einsammelt oder wenn von einem Gegner getroffen wird. Alle anderen Sprites agieren nicht mit der Mechanik. Ich denke wirklich das der Grund dein Hppatch ist in Kombination mit dem Gravitypatch.
Normalerweise wird Mario ja angehalten wenn er einen Pilz konsumiert. Bei deinem patch geht es es einfach schlagartig weiter.
Außerdem denke ich; das der Stoß den man kassiert in kombination mit dem Gravitypatch auch nicht so wirklich eingeplant ist.

Was meinst du dazu?


Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This section fixes various bugs.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fix_bubble: LDY !reversed
BNE .ud
ADC $96
BRA +

.ud LDA $96
LDY $19
BEQ +
LDY $73
BNE +
CLC
ADC #$08
+ STA $1715,x
RTL

fix_cape: CLC
PHX
LDX !reversed
BNE .ud
PLX
ADC $D03C,y
RTL

.ud PLX
ADC #$0010
SEC
SBC $D03C,y
RTL

fix_carry: LDY !reversed
CLC
BNE .ud

ADC $02
BRA +

.ud LDA $02
ADC #$01
+ STA $D8,x
RTL

fix_clipping: LDY !reversed
BNE .ud
CLC
ADC $03B65C,x
.ud RTL

fix_dust: LDA !reversed
BNE .ud
LDA $96
ADC #$1A
JML $00FE82

.ud LDA $96
SEC
SBC #$04
PHX
JML $00FE8A

fix_fall_death: CLC
LDY !reversed
BNE .ud

SEP #$20
LDA $81
DEC
BMI .return
SEC
.return RTL

.ud LDA $80
ADC #$0020
SEP #$20
CLC
BPL .return
SEC
RTL

fix_ram_80: LDA $188B
AND #$00FF
LDY !reversed
BNE .ud
JML $00E34C

.ud EOR #$FFFF
CLC
ADC $96
LDY $19
CPY #$01
LDY #$01
BCS +
INC
DEY
+ CPX #$0A
BCS +
CPY $13DB
BCS +
INC
SEC
+ JML $00E360

splash_offset:
db $08,$10,$16,$16

fix_splash: LDA $96
CLC
PHY
LDY !reversed
BNE .ud
ADC $FD9D,x
BRA +

.ud ADC.l splash_offset,x
+ PLY
RTL


Bin mir nicht sicher ob man da einfach nur den "!reversed" call von dem Autor bei LDY hinklatschen muss;
wenn man die Teile von deinem Code darin einfügen würde, um das Problem zu lösen. ( Der Knockbackteil etc... )
Könntest du mir helfen den "Knockback Code" und den anderen für den Pilz hier reinzukriegen?
>we live in a society
geschrieben am 23.10.2016 0:03:39
( Link )
Du solltest ganz leicht rausfinden können, welche zwei Patches sich da beißen. Macht erstmal nur den Gravity-Patch auf eine cleane ROM, haue danach nacheinaner alle anderen Patches drauf und starte die ROM jedes mal kurz. Sobald der Bug auftritt, weißt du, welcher Patch das Problem verursacht.
-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.