Allgemeine Hex- und ASM-Fragen

geschrieben am 08.09.2012 19:42:19
( Link )
Es geht auch zweimal die zehner Routine.
Code
;PseudoASM
LDA $RAM ;
JSL Hex2Dec ; Hex -> Dec Routine
STA $Statusbar+2 ;Einer
TXA ; X->A
JSL Hex2Dec ; Hex -> Dec Routine
STA $Statusbar+1 ;Zehner
STX $Statusbar ;Hunderter
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 09.09.2012 8:58:29
( Link )
Okay, ich werds gleich mal versuchen, vorher aber nochmal...:
Code

org $008F7E ;Write Coins
JSL MaxMP ;
NOP #2 ;
org $098020 ;Freespace

MaxMP:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/
LDA $70036F ;Load Max MP from RAM
PHX ;X on Stack
JSL $00974C ;Hex -> Dec Routine
STA $7EE0F1+1 ;|Draw firsts
STX $7EE0F1 ;|draw tenths
PLX ;/X from Stack
RTL ;


Ob das so richtig ist?
Angezeigt wird jedenfalls nix in der Status Bar. (Übrigens, wenn ich die Counter in Status Effect lösche, startet das Spiel nicht, Musik läuft aber Bildschirm bleibt schwarz)
Was ich mich auch frage ist, ob das
Code
STA $7EE0F1+1				;|Draw firsts
STX $7EE0F1 ;|draw tenths

überhaupt richtig ist.
So sieht ja das Bild mit den Adressen aus

Weil ich hab keine Ahnung was ich da eigentlich eingeben muss xD
Die Max MP soll unten links da wo E und F sind stehen.
geschrieben am 09.09.2012 9:14:43
( Link )
Zumindest hast du jeweils ein E zu viel.

Code
STA $7E00F1+1            ;|Draw ones
STX $7E00F1 ;|draw tens


So müsste das im Ansatz richtig sein (wobei ich die Position jetzt nicht überprüft habe). Besser wäre aber:

Code
STA $00F1+1            ;|Draw ones
STX $00F1 ;|draw tens


Außer natürlich das geht aus irgendeinem Grund in dieser speziellen Situation nicht, was ja mal vorkommen kann.

Aber was ist mit LDA $70036F? Willst du tatsächlich den SRAM dafür benutzen?
Ich empfehle dir auch für solche Dinge immer Labels zu verwenden, sonst wird es später verdammt nervig, wenn du mal eine Adresse ändern willst oder musst.

Beispiel:
Code
; Das steht irgendwo oben im Code
!maxmp = $70036F

[...]
LDA !maxmp
PHX
JSL $00974C
[...]
-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 09.09.2012 9:41:29
( Link )
Ich hatte im Code sogar Labels, hab nur vergessen sie wieder einzufügen xD
Zitat
Zumindest hast du jeweils ein E zu viel.

Naja aber wie krieg ich denn die genaue Position?
Deswegen dieses E, oder nicht?

Zitat
Aber was ist mit LDA $70036F? Willst du tatsächlich den SRAM dafür benutzen?

Naja SRAM wird ja direkt gespeichert, also wieso nicht. Es sei denn es hat nen gravierenden Nachteil...
geschrieben am 09.09.2012 10:09:18
( Link )
Moment, ich habe selbst Scheiße gebaut. Das E musst du hinten anhängen. Also müsste es heißen

Code
STA $0F1E+1            ;|Draw ones
STX $0F1E ;|draw tens


oder alternativ

Code
STA $0F1F            ;|Draw ones
STX $0F1E ;|draw tens


Zitat von Wischmop:
Naja SRAM wird ja direkt gespeichert, also wieso nicht. Es sei denn es hat nen gravierenden Nachteil...


Ich gehe mal davon aus, dass SRAM ein wenig langsamer ist, als normaler RAM. Aber selbst wenn nicht: Wie willst du das denn überhaupt umsetzen? Nehmen wir mal an, du würdest alle HP- und MP-Daten im SRAM speichern, so wie du es gerade tust. Stell dir vor, du hast vorhin dein Spiel gespeichert, inklusive deiner HP und MP. Jetzt wirst du getroffen und machst das Spiel aus, später wieder an. Rate mal, was dann passiert ist. Wenn du das Spiel fortsetzt hast du nicht etwa die HP, die du hattest, als du dein Spiel gespeichert hast. Nein, du hast noch die HP, die du nach dem Treffer hattest. Und genau da liegt das Problem. Selbiges gilt auch für MP und für die Max-Werte. Würdest du z.B. ein Level-Up kriegen (vorausgesetzt es gibt sowas bei dir), würden sich deine Max-Werte erhöhen. Würdest du dann das Spiel aus- und wieder anmachen, hättest du immer noch die erhöhten Max-Werte, selbst wenn du das Spiel zwischenzeitlich nicht gespeichert hättest.
-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 09.09.2012 10:29:34
( Link )
Aber mindestens die Max Werte muss ich in den SRAM packen, sonst sind die Werte bei jedem Spielstart auf die Initialwerte gesetzt was nicht sein soll.
geschrieben am 09.09.2012 10:41:34
( Link )
Ja, aber die schreibst du logischwerweise erst in den SRAM, wenn du den Spielstand speicherst und lädst sie entsprechend auch vom SRAM in den RAM, wenn du den Spielstand lädst. Hier beschreibst/liest du ja durchgehend SRAM, was so definitiv nicht den von dir gewünschten Effekt erzielt. Ergo solltest du hier erstmal RAM verwenden. Um das Speichern kümmerst du dich später mit einem neuen Patch.
-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 09.09.2012 10:47:15
( Link )
Dann werd ich erstmal nur den RAM verwenden.

Spoiler anzeigen
Code
header
lorom
;-----------------------------------------------------------------------
!MaxHP = $700366
!MaxMP = $70036F
!HPRAM = $7E0F42
!MPRAM = $7E0DA1





org $009E35 ;Routine for Powerups at Gamestart
JSL Initialization ;
NOP #1 ;
org $098000 ;Freespace

Initialization: ;Replace with Routine which gives HP and MP Start Values
STZ $19 ;\Restore Hacked Bytes
STZ $0DC2 ;/
LDA #50 ;\Current HP
STA !HPRAM ;/
LDA #50 ;\Maximum HP
STA !MaxHP ;/
LDA #10 ;\Current MP
STA !MPRAM ;/
LDA #10 ;\Maximum MP
STA !MaxMP ;/
RTL
;------------------------------------------------------------------------

org $008F7E ;write Coins
JSL DrawMP ;
NOP #2 ;
org $098020 ;Freespace

DrawMP:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/
LDA !MPRAM ;|Load MP from RAM
PHX ;|X on Stack
JSL $00974C ;|Hex -> Dec Routine
STA $7E0F1B+1 ;|Draw firsts
STX $7E0F1B ;|draw tenths
PLX ;/X from Stack
RTL ;

;------------------------------------------------------------------------

org $008F7E ;Write Coins
JSL MaxMP ;
NOP #2 ;
org $098030 ;Freespace

MaxMP:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/
LDA !MaxMP ;Load Max MP from RAM
PHX ;X on Stack
JSL $00974C ;Hex -> Dec Routine
STA $7E0F1E+1 ;|Draw firsts
STX $7E0F1E ;|draw tenths
PLX ;/X from Stack
RTL ;

;------------------------------------------------------------------------

org $008F7E ;Write Coins
JSL drawHP ;
NOP #2 ;
org $098040 ;Freespace

drawHP:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/
LDA !HPRAM ;
JSL $00974C ; Hex -> Dec Routine
STA $7E0EFE+2 ;draw ones
TXA ; X->A
JSL $00974C ; Hex -> Dec Routine
STA $7E0EE2+1 ;draw tenths
STX $7E0EE2 ;draw hundeds
RTL ;
;------------------------------------------------------------------------

org $008F7E ;Write Coins
JSL MaxHP ;
NOP #2 ;
org $098050 ;Freespace

MaxHP:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/
LDA $MaxHP ;
JSL $00974C ; Hex -> Dec Routine
STA $7E0EF2+2 ;draw ones
TXA ; X->A
JSL $00974C ; Hex -> Dec Routine
STA $7E0EF2+1 ;draw tenths
STX $7E0EF2 ;draw hundeds
RTL ;

;------------------------------------------------------------------------



Das ist jetzt mein gesamter Patch.
Zwischenzeitlich hat er mal die Current MP angezeigt, aber hab dann den Freespace angepasst und jetzt gehts nicht mehr.
geschrieben am 09.09.2012 11:28:50
( Link )
Code
org $008F7E            ;write Coins
JSL DrawMP ;
NOP #2 ;
org $098020 ;Freespace


Sowas ist schonmal eine ganz, ganz blöde Idee.
Du gehst somit ja davon aus, dass deine erste Routine nur (bzw. maximal) $20 bytes belegt. Was aber, wenn du da mal was ändern willst oder musst und die $20 Bytes überschreitest?

Deswegen solltest du es folgendermaßen machen: Oben im Patch erstmal ALLE Hijacks untereinander auflisten und erst dann den Freespace. Also hier ein simples Beispiel:

Code
!freespace = $098000

org $038502
JSL Hijack1

org $04E383
JSL Hijack2

org $058555
JSL Hijack3

org !freespace

Hijack1:
[...]
RTL

Hijack2:
[...]
RTL

Hijack3:
[...]
RTL


So brauchst du auch nur eine einzige Freespace-Adresse und nicht zehntausend.

Fehler Nummer 2 ist, dass du auch immer wieder org $008F7E benutzt, also immer wieder dieselbe Stelle hijackst. Die logische Konsequenz ist natürlich, dass du diese Stelle immer und immer wieder mit deinem eigenen Code überschreibst. Logischerweise wird nur der allerletzte Hijack überhaupt irgendeinen Effekt haben.

Da alles Statusbar-Routinen sind, reicht es, wenn du nur einen einzigen Hijack machst und dann im Freespace den Code untereinander schreibst. Hier ein Beispiel:

Code
!freespace = $098000

org $008F7E
JSL StatusBar
NOP #2

org !freespace
STA $0F14 ; Alter Code wiederhergestellt
STX $0F13

[Hier Code für "HP anzeigen"]

[Hier Code für "Max HP anzeigen"]

[Hier Code für "MP anzeigen"]

[Hier Code für "Max MP anzeigen"]

RTL


Außerdem solltest du auch für MaxHP und MaxMP RAM nehmen. Wie gesagt: Das Speichern kommt später. Außer natürlich, du hast das bisher einfach noch nicht verändert.

Übrigens bin ich mir auch nicht ganz so sicher, ob $098000 wirklich schon Freespace ist. Hat das der Freespace Logger ausgegeben?
-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 09.09.2012 11:59:58
( Link )
Freespace war richtig, hab aber mal ne andere Adresse genommen.
Code
header
lorom
;-----------------------------------------------------------------------
!MaxHP = $700366
!MaxMP = $70036F
!HPRAM = $7E0F42
!MPRAM = $7E0DA1
!Freespace = $090200


org $009E35 ;Routine for Powerups at Gamestart
JSL Initialization
NOP #1

org $008F7E ;write Coins
JSL Statusbar ;

NOP #2
org !Freespace ;Freespace


;------------------------------------------------------------------------


Initialization: ;Replace with Routine which gives HP and MP Start Values
STZ $19 ;\Restore Hacked Bytes
STZ $0DC2 ;/
LDA #50 ;\Current HP
STA !HPRAM ;/
LDA #50 ;\Maximum HP
STA !MaxHP ;/
LDA #10 ;\Current MP
STA !MPRAM ;/
LDA #10 ;\Maximum MP
STA !MaxMP ;/
RTL


;------------------------------------------------------------------------


Statusbar:
STA $0F14 ;\Restore Hacked Bytes
STX $0F13 ;/

LDA !MPRAM ;Load MP from RAM
PHX ;X on Stack
JSL $00974C ;Hex -> Dec Routine
STA $7E0F1B+1 ;Draw firsts
STX $7E0F1B ;draw tenths
PLX ;X from Stack


LDA !MaxMP ;Load Max MP from RAM
PHX ;X on Stack
JSL $00974C ;Hex -> Dec Routine
STA $7E0F1E+1 ;Draw firsts
STX $7E0F1E ;draw tenths
PLX ;X from Stack


LDA !HPRAM ;Load HP from RAM
JSL $00974C ;Hex -> Dec Routine
STA $7E0EFE+2 ;draw ones
TXA ;X->A
JSL $00974C ;Hex -> Dec Routine
STA $7E0EE2+1 ;draw tenths
STX $7E0EE2 ;draw hundeds


LDA !MaxHP ;Load Max HP from RAM
JSL $00974C ;Hex -> Dec Routine
STA $7E0EF2+2 ;draw ones
TXA ;X->A
JSL $00974C ;Hex -> Dec Routine
STA $7E0EF2+1 ;draw tenths
STX $7E0EF2 ;draw hundeds

RTL
;------------------------------------------------------------------------


Jetzt crasht es allerdings beim Spielstart.(Klick auf 1 Player Game)
geschrieben am 09.09.2012 12:05:11
( Link )
Na $090200 ist definitiv falsch. Das ist ja nichtmal ROM. ROM geht immer von $xx8000 bis $xxFFFF. Ganz sicher, dass du im Freespace Logger auch aus der richtigen Spalte kopiert hast? "LoROM Offset" ist das, was du kopieren musst.

Davon abgesehen sieht das aber auf den ersten Blick ganz gut aus.
-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 09.09.2012 12:29:47
( Link )
HUch, tatsächlich
Hab jetzt soweit noch 2 Probleme.
1. Die großen Bonusstars sind noch da und scheinen den Wert der Max MP anzunehmen (stehen nämlich auf 10)
Da ich wie gesagt Status Effect nicht benutzen kann (weils zu einem Schwarzbildschirm führt), muss ich nach ner Routine suchen die die Bonus Stars anzeigt, aber ich finde keine.
2. Die Current HP zeigen nur eine 0. (wahrscheinlich von der 50?,der wert ist laut Debugger aber richtig auf 50)
wie das mit den Max HP aussieht weiß ich nicht, die werden wohl von den nicht anwesenden Yoshi Coins und den Bonusstars verdeckt, auch hier finde ich keine Routine die die Yoshi Coins anzeigt.
geschrieben am 09.09.2012 12:41:02
( Link )
Zitat von Wischmop:
1. Die großen Bonusstars sind noch da und scheinen den Wert der Max MP anzunehmen (stehen nämlich auf 10)
Da ich wie gesagt Status Effect nicht benutzen kann (weils zu einem Schwarzbildschirm führt), muss ich nach ner Routine suchen die die Bonus Stars anzeigt, aber ich finde keine.


Hast du in der ROM Map geguckt? Da stehen viele Routinen schon drin. Ansonsten einfach mal in all.log die komplette Status Bar-Routine durchforsten.

Zitat von Wischmop:
2. Die Current HP zeigen nur eine 0. (wahrscheinlich von der 50?,der wert ist laut Debugger aber richtig auf 50)
wie das mit den Max HP aussieht weiß ich nicht, die werden wohl von den nicht anwesenden Yoshi Coins und den Bonusstars verdeckt, auch hier finde ich keine Routine die die Yoshi Coins anzeigt.


Du verwendest $7E:0EE2 und $7E:0EF2, dabei fängt die Status Bar-Tilemap doch erst bei $7E:0EF9 an. Das kann also gar nicht funktionieren. Du überschreibst da irgendwelche zufälligen Daten, von denen du noch nicht einmal weißt, was sie sind. Deshalb vermultich auch der Glitch mit den Bonussternen.
-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 09.09.2012 12:53:16
( Link )
Funktioniert jetzt auch x)
Vielen Dank für eure Hilfe,
ich denk mal den Rest sollte ich jetzt auch so hinkriegen.
geschrieben am 19.09.2012 14:36:17
( Link )
Yeay, bin auch mal wieder hier

Vielleicht geht es auch ohne ASM, aber das weiss ich nicht.
Daher hier^^.

Ich hätte gerne etwas, dass alle Sprites durchsichtig/transparent (wie Layer 3 Wasser) macht.
Am liebsten so, dass Mario noch normal ist, aber Mario kann gerne auch mit beeinflusst werden.

Danke!
geschrieben am 19.09.2012 17:10:08
( Link )
Hat wer einen Patch, der fixt, dass der HDMA-Effekt verschwindet, wenn man eine Messagebox benutzt? Oder etwas anderes, was dies behebt. Hab auf SMWC folgendes gefunden:
Code
2B30C | $05:B10C | 399 bytes
The subroutine that displays the message from a message box. It handles the windowing HDMA, the stripe image upload, and things such as teleporting to the overworld after the intro screen.

$05B129/x2B329: [9C 9F 0D] Change to [EA EA EA] to prevent HDMA from getting disabled AFTER a message box has been displayed. Use with $05B296.
[...]
$05B296/x2B496: [8D] Change to [0C] to prevent HDMA from getting disabled WHILE a message box is being displayed. Use with $05B129.


Leider hab ich nicht wirklich Ahnung von den Adressen....
geschrieben am 19.09.2012 17:27:27
( Link )
@kooooopa:
Ich bin mir nicht sicher, aber alle Sprites transparent machen geht nicht, nur Sprites mit der palette 8-C (?) werden transparent. Levelmode 1E und 1F machen das, ansonsten muss da doch ASM ans Werk.

@Myname:
* [Xkas] HDMA v3.5 sollte das fixen.
Wenn nicht, dann das hier in der Codebox kopieren und in eine Textdatei mit der Dateiendung .asm einfügen, speichern und mit xkas oder asar patchen.
Code
header
lorom

org $05B10C
db $EA,$EA,$EA

org $05B10C
db $0C
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 19.09.2012 17:40:43
zuletzt bearbeitet von Myname am 19.09.2012 20:57:39.
( Link )
Vielen dank! Freespace gibts keinen zu setzen bei deinem Code oder?

Edit: Irgendwie klappt beides nicht. Wenn ich HDMA 3.5 drauf mache, passiert nichts und wenn ich deinen Code reinmache crusht die Rom nach dem "Welcome this is..." Level. Liegt es vllt daran, dass ich den HDMA-Code noch mit LevelASM und nicht mit ueberasm reingemacht habe?

Edit2: Okay habs hingekriegt, danke für die Hilfe.
geschrieben am 19.09.2012 18:33:47
( Link )
man kann entweder sprite 8-F oder C-F tranzparent machen (wenn ich mich nicht irre lässt sich das durch mai/subscreen von den sprites ändern...
das macht (hoffentlich) sprites mit palette C-F Tranzparent
Code
    LDA $40     ;\
ORA #$50 ; |Set the layer 3 bit of CGADDSUB
STA $40 ;/
LDA #$15
STA $212C
STA $212E
LDA #$0F
STA $212D
STA $212F
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 19.09.2012 22:36:09
( Link )
Kennt jemand den Fire-Nipper aus SMB3? Der spuckt Feuerbälle in die Luft, und zwar so, dass die genau dort landen, wo Mario sich zum Zeitpunkt des Spuckens befindet: http://www.youtube.com/watch?v=lAvHALoG ... ure=relmfu (Die bisher veröffentlichten Fire-Nippers spucken immer nur an die immer gleiche Stelle links oder rechts.)

Nun möchte ich das auch für die SMW-Version. Von Imamelia hab ich dazu folgende Info:
"calculate the distance between the sprite and the player, divide that by 4, invert it if the player was on the other side, and use the result for the X speed of the fireball"

Weiß jemand, wie ich das als Code darstellen muss? Und wie ich das in die Fire-Spit-Routine einpflegen kann:
Code

!FireXSpeed = $10 ; the X speed to spit the fireball
!FireYSpeed = $DD ; the Y speed to spit the fireball
FireXOffsetsLo:
db $06,$FA
FireXOffsetsHi:
db $00,$FF
!FireYOffsetLo = $03
!FireYOffsetHi = $00

SubFireSpit:

LDY #$07
ExSpriteLoop:
LDA $170B,y
BEQ FoundExSlot
DEY
BPL ExSpriteLoop
RTS

FoundExSlot:

LDA #$0B
STA $170B,y

LDA $E4,x
PHY
LDY $157C,x
CLC
ADC FireXOffsetsLo,y
PLY
STA $171F,y
LDA $14E0,x
PHY
LDY $157C,x
ADC FireXOffsetsHi,y
PLY
STA $1733,y

LDA $D8,x
CLC
ADC #!FireYOffsetLo
STA $1715,y
LDA $14D4,x
ADC #!FireYOffsetHi
STA $1729,y

LDA #!FireXSpeed
PHY
LDY $157C,x
BEQ $03
EOR #$FF
INC
PLY
STA $1747,y
LDA #!FireYSpeed
STA $173D,y

LDA #$FF
STA $176F,y

RTS