Allgemeine Hex- und ASM-Fragen

geschrieben am 02.08.2012 14:56:36
( Link )
Ich glaube, normalerweise läuft die Statusbarroutine auch im V-Blank, ich kann da problemlos 128 Tiles schreiben, ohne dass es da rummeckert (und das ohne DMA) mit Hijacks bei $008DAC und $008E1A. Außerdem geht das auch mit LevelASMTool, siehe 256 Rooms letzter Raum.
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 02.08.2012 15:33:44
( Link )
Zitat von W4mp3:
Ich glaube, normalerweise läuft die Statusbarroutine auch im V-Blank [...]


Nein. Sonst bräuchte es die Status Bar-Mirror ($7E0EF9) ja erst gar 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 06.08.2012 13:38:52
( Link )
Also, gleich wieder ich^^

Wollte das gelernte jetzt mal anwenden und einen Block schreiben, wenn Mario in ihm drin ist und der Spieler nach rechts drückt nach links läuft und wenn der Spieler nach links drückt Mario nach rechts läuft.
Hat aber nicht so geklappt. BTSD liefert nur seitenweise Fehlermeldungen.

Hier mal mein Code:
Code
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide : JMP SpriteVert : JMP SpriteHorz : JMP MarioCape : JMP MarioFireball : JMP TopCorner : JMP HeadInside : JMP BodyInside

JMP MarioBelow:
JMP MarioAbove:
JMP MarioSide:
JMP SpriteVert:
JMP SpriteHorz:
JMP MarioCape:
JMP MarioFireball:
JMP TopCorner:
JMP HeadInside:
RTL

JMP BodyInside:
LDA $15 ; Welche Knöpfe werden gedrückt
CMP #%00000001 ; Vergleiche mit Rechts
BEQ RECHTS ; Ist es Rechts dann zu Rechts, ansonsten
CMP #%00000010 ; Vergleich mit Links
BEQ LINKS ; Ist es Links, dann zu Links
RTL ; Weder Links noch Rechts, dann zurück

Rechts:
LDA $76 ; Bewegungssteuerung laden
STA #$00 ; Links speichern
RTL

Links:
LDA $76 ; Bewegungssteuerung laden
STA #$01 ; Rechts speichern
RTL


Ich hoffe jemand kann mir da helfen
geschrieben am 06.08.2012 14:25:21
( Link )
Zitat von kooooopa:
Code
JMP MarioBelow:
JMP MarioAbove:
JMP MarioSide:
JMP SpriteVert:
JMP SpriteHorz:
JMP MarioCape:
JMP MarioFireball:
JMP TopCorner:
JMP HeadInside:

Das sind die Labels, nicht die Sprungbefehle. Die JMPs gehören da nicht hin.

Zitat von kooooopa:
Code
BEQ LINKS
[...]
Links:

xkas achtet auf Groß- und Kleinschreibung. Es sucht das Label "LINKS", aber findet es nicht, denn es gibt nur das Label "Links".

Zitat von kooooopa:
Code
LDA $76                    ; Bewegungssteuerung laden
STA #$01 ; Rechts speichern

Falsche Denk- und Schreibweise.
Du lädst den Wert aus Adresse $76 und speicherst ihn dann in... dem Wert 00? Das ist genau verkehrt herum - speichern kannst du nur in Adressen, nicht in Werten. LDA #$01 STA $76 wäre richtig.

Stell's dir vielleicht so vor: Du willst ein Paket bei einem Haus abliefern. Dazu musst du den Inhalt des Pakets laden und dann im Haus speichern. Die Schreibweise im obigen Code hieße allerdings, dass du den Inhalt des Hauses lädst und dann irgendwie... in den Inhalt des Paketes steckst. Da läuft irgendwas falsch.

Wenn du das berücksichtigt, dürfte der Code zumindest problemlos eingefügt werden. Ob der Block dann funktioniert, kann ich dir nicht garantieren, aber eine Übung wär's immerhin.

Dann noch zwei kleine Tipps: Statt LDA #$00 STA $76 kannst du auch STZ $76 schreiben. STZ ist ein Befehl, der in einer Adresse einfach den Wert 0 speichert. Das spart ein bisschen Platz und ist bequemer. Außerdem solltest du später für Button-Abfragen lieber AND statt CMP verwenden, aber für deinen ersten Versuch sollte das reichen.
geschrieben am 06.08.2012 14:44:42
( Link )
Ok, danke gleich mal ausprobieren.
Und ein extra Danke für das Haus Beispiel.
geschrieben am 06.08.2012 14:46:05
( Link )
Übrigens kannst du bei JMP-Befehlen, die eh an dieselbe Stelle springen, auch einfach denselben Befehl verwenden (z.B. empfiehlt sich "Return").
-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.08.2012 9:10:06
( Link )
Nach dem ich endlich wieder mit Blooktool klar kam hab ich also mal den Block eingefügt.
Sobald man ihn berührt gibt es mehrere Möglichkeiten, wie das Spiel einen rausschmeißt.
- Es schluckt den Hintergrund und legt alles lahm.
- Es schluckt alles und legt alles lahm.
- Es verpixelt alles und liefert ein "Farbfeuerwerk" und legt alles lahm

Ich benutze jetzt diesen Code:
Code
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide : JMP SpriteVert : JMP SpriteHorz : JMP MarioCape : JMP MarioFireball : JMP TopCorner : JMP HeadInside : JMP BodyInside

MarioBelow:
MarioAbove:
MarioSide:
SpriteVert:
SpriteHorz:
MarioCape:
MarioFireball:
TopCorner:
HeadInside:
RTL

BodyInside:
LDA $15 ; Welche Knöpfe werden gedrückt
AND #%00000001 ; Vergleiche mit Rechts
BEQ RECHTS ; Ist es Rechts dann zu Rechts, ansonsten
AND #%00000010 ; Vergleich mit Links
BEQ LINKS ; Ist es Links, dann zu Links
RTL ; Weder Links noch Rechts, dann zurück

RECHTS:
STZ $76 ; 0 Laden und speichern
RTL

LINKS:
LDA #$01 ; Rechts laden
STA $76 ; Bewegungssteuerung speichern
RTL


Theoretisch sollte der Code jetzt doch eigentlich richtig sein, oder?
Und irgendeine Idee, wieso der Code praktisch nicht funktioniert?
geschrieben am 07.08.2012 11:05:23
( Link )
Code
LDA $15                 ; Welche Knöpfe werden gedrückt
AND #%00000001 ; Vergleiche mit Rechts
BEQ RECHTS ; Ist es Rechts dann zu Rechts, ansonsten
AND #%00000010 ; Vergleich mit Links
BEQ LINKS ; Ist es Links, dann zu Links


Das stimmt zumindest schonmal nicht. AND verändert den Akkumulator, das heißt vor dem zweiten AND musst du wieder LDA $15 benutzen.

Wieso das abstürzt kann ich mir aber nicht erklären. Hast du auch ganz sicher die richtigen Versionen von Block Tool und xkas?
-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.08.2012 12:36:48
( Link )
Hm warum es abschmirt verstehe ich auch nicht...
du köntest statt der binär werte mal Hexadecimal werte benutzten
Ach ja und du musst BNE benutzten um zu gucken ob die taste gedrückt wird
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 07.08.2012 12:45:58
( Link )
Zitat von mzünni:
du köntest statt der binär werte mal Hexadecimal werte benutzten


Genau, hier liegt das Problem! Wenn man binäre Werte benutzt, sollte man immer Länge-Indikatoren verwenden, sonst versucht xkas die Länge zu erraten und tut das leider meistens falsch. Also müsste es richtig folgendermaßen aussehen:

Code
LDA $15                 ; Welche Knöpfe werden gedrückt
AND.b #%00000001 ; Vergleiche mit Rechts
BNE RECHTS ; Ist es Rechts dann zu Rechts, ansonsten
LDA $15 ; Welche Knöpfe werden gedrückt
AND.b #%00000010 ; Vergleich mit Links
BNE LINKS ; Ist es Links, dann zu Links
-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.08.2012 12:57:20
zuletzt bearbeitet von kooooopa am 07.08.2012 13:10:09.
( Link )
Nur mit dem zweiten LDA hat es nichts gebracht.

Was sind Längen Indikatoren?
Einfach dieses .b?
geschrieben am 07.08.2012 13:08:30
( Link )
Zitat von kooooopa:
Was sind Längen Indikatoren?
Einfach dieses .b?


Yesh. Damit wird die Länge des Wertes hinter dem Befehl angegeben. .b = Byte (also 8-bit), .w = Word (also 16-bit) und .l = Long (also 24-bit). Bei Hex-Zahlen weiß xkas in der Regel, welche Länge gemeint (zwei Stellen = 8-bit, vier Stellen = 16-bit und sechs Stellen = 24-bit). Bei Binärzahlen sind xkas aber die Anzahl an Stellen egal und er geht bei 16 oder weniger Stellen automatisch davon aus, dass es sich um eine 16-Bit-Zahl handelt, weil das SNES nunmal nativ mit 16-Bit-Zahlen rechnet. Deswegen musst du hier .b verwenden, um xkas mitzuteilen, dass eigentlich eine 8-Bit-Zahl gemeint ist.
-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.08.2012 13:10:47
( Link )
Habe den einen Teil jetzt mal so geändert wie du es oben beschrieben hast.
Der Block lässt sich nun ohne Probleme einfügen und das Spiel stürzt beim Berühren auch nicht mehr ab.
Jetzt gibt es nur ein anderes Problem. Der Block macht rein garnichts. Er erfüllt nicht seine Funktion. Es ist, als wäre er nicht da.
geschrieben am 07.08.2012 13:28:17
( Link )
Hast du denn deine BEQs auch durch BNEs ersetzt? Falls ja, versuch einfach mal, auch noch MarioSide und so hinzuzunehmen. Vielleicht tritt bei MaioBody einfach nur der Effekt so kurz auf, dass du gar nichts davon bemerkst. Möglicherweise funktioniert es auch nicht, weil der Code des Spiels die Adressen, die du verändern willst, wieder selbst verändert, bevor es überhaupt einen sichtbaren Effekt gibt. Damit muss man immer rechnen. Blocks werden nunmal immer an derselben Stelle im Spiel ausgeführt und das ist nicht immer automatisch die beste.
-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.08.2012 13:31:10
( Link )
Sag ich doch, dass der wahrscheinlich nicht funktionieren wird. In irgendeinem Teil des Spiels wird's einen Code geben, der die Richtung wieder überschreibt.

Gibt's auf SMWC nicht den "Inverse Water" block oder so? Vielleicht hilft dir der Code da weiter.
geschrieben am 07.08.2012 15:12:26
( Link )
du könntest (das macht der block den WYE mein vermutlich auch) statt die richtung direkt zu ändern (was ja anscheinend nicht funktionirt weil es vom spiel selbst überschriben wird) die tasten die gedrückt werden zu vertauschen d.h. wenn man links drückt wird in $15 das bit für rechts gesetzt durch den block
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 07.08.2012 17:23:37
( Link )
Zitat von mzünni:
du könntest (das macht der block den WYE mein vermutlich auch) statt die richtung direkt zu ändern (was ja anscheinend nicht funktionirt weil es vom spiel selbst überschriben wird) die tasten die gedrückt werden zu vertauschen d.h. wenn man links drückt wird in $15 das bit für rechts gesetzt durch den block


Das wird wahrscheinlich auch nicht funktionieren. Ich glaube $15 wird auch später wieder überschrieben.
-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.08.2012 18:30:56
( Link )
Nichts anderes macht aber das "Inverse Water". Anscheinend geht's.
geschrieben am 08.08.2012 9:50:10
( Link )
Der Block von smwc geht.
Es gibt nur ein Problem, nämlich am Rand des Blockes. Da spinnt Mario dann immer ein bisschen, weil man ja noch nicht weis, ob man links oder rechts drücken soll. Daher meine Frage ob ich einfach die Block Labels weglassen kann und das RTL durch RTS ersetzen und dann einfach als LevelASM einfügen kann?
geschrieben am 08.08.2012 11:28:36
( Link )
Klar! Wobei LevelASM schon wieder einen anderen Einsprungspunkt hat, also kannst du dir nicht zu 100% sicher sein, dass deine Daten nicht wieder überschrieben 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.