Beiträge von WYE

geschrieben am 16.07.2012 20:09:46 in Screenshots/Videos Thread - Zeige dein Zeug h(i)er!
( Link )
Das sind die Star Coins.
geschrieben am 16.07.2012 21:14:30 in Screenshots/Videos Thread - Zeige dein Zeug h(i)er!
( Link )
Schon okay, passiert.

Danke übrigens für das Feeback. Mal sehen, ob ich an der Geschwindigkeit noch was ändere.
geschrieben am 03.08.2012 22:01:34 in ASM-Projekte-Thread
( Link )
So, hätten wir das auch fertig.

[flash="512,448"]http://static.pbsrc.com/flash/onSiteVideo.swf?file=http://vid259.photobucket.com/albums/hh301/WhiteYoshiEgg/merged-6.mp4&t=1344023706[/flash]
geschrieben am 04.08.2012 11:00:18 in ASM-Projekte-Thread
( Link )
So ist es - wenn man überhaupt von "du" reden kann. Ob ich das veröffentliche, weiß ich nicht, da es doch sehr auf die Bedürfnisse meines Hacks zugeschnitten ist.
geschrieben am 04.08.2012 18:30:51 in Du suchst Custom Sprites/Blocks/Music oder Graphics? Hier!
( Link )
Code
; acts like 25
!VineTile = $0006

db $42
JMP Mario : JMP Mario : JMP Mario
JMP Sprite : JMP Sprite : JMP Mario : JMP Mario
JMP Mario : JMP Mario : JMP Mario

Sprite:
LDY.b #!VineTile>>8
LDA.b #!VineTile
STA $1693
Mario:
RTL
geschrieben am 04.08.2012 21:49:21 in Terra Mario (Archivieren bitte)
( Link )
Das Gefühl kenne ich, mir ging's ja mit Pokey's Adventure nicht anders - mit der Zeit ist mir klar geworden, dass das nicht der Hack ist, den ich machen will. Der Unterschied ist nur, dass du deinen Hack tatsächlich fertig bekommen hast. Einen vollständigen Hack zu veröffentlichen ist schon eine Leistung.

Meine Entscheidung war, einen neuen Hack anzufangen, und vielleicht machst du das später ja auch. Jetzt, wo du weißt, was du nicht machen willst, ist es einfacher, einen Hack zu machen, der eher dem entspricht, was du willst.
geschrieben am 05.08.2012 18:52:33 in ASM Fragen
( Link )
Zitat von kooooopa:
Ich mache das ganze mal lieber hier anstatt im Chat, da mir noch ein paar mehr Fragen eingefallen sind

Das Forum sollte sowieso erste Wahl sein.

Zitat von kooooopa:
Code
JMP MarioCode : JMP Return : JMP Return : JMP Return : JMP Return : JMP Return : JMP Return

Das wäre dann aber nur bei Marioberührungen und egal von wo möglich, oder?

Nee, der Code würde nur laufen, wenn man den Block von unten berührt.

Zitat von kooooopa:
Kann ein Block auch aktiviert werden, wenn Mario in ihm drinsteht und sonst nicht?

Ja, LM ab 1.70 (?) und BTSD ab 0.44 unterstützen drei neue Offsets:
Code
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide : JMP SpriteVert : JMP SpriteHorz : JMP MarioCape : JMP MarioFireball : JMP TopCorner : JMP HeadInside : JMP BodyInside

Mit denen kannst du zu Code springen, der ausgeführt werden soll, wenn man die Ecken berührt oder mit dem Kopf bzw. Körper drin ist. Vergiss das db $42 am Anfang nicht, sonst werden die nicht berücksichtigt.

Zitat von kooooopa:
Wieso geht das aber nicht mit ganz vielen Wenn-Dann-Befehlen und dann mit LDA und nicht LDX?

Was?

Zitat von kooooopa:
Wieso nicht auch LDY?

Geht auch.

Zitat von kooooopa:
Für was brauche ich die Register X und Y also genau wenn ich A nicht benutzen kann? Wann kann ich A nicht benutzen?

Wenn du indizieren willst. Falls es das Tutorial nicht gut genug erklärt hat, folgendes:
LDA $1337 lädt den Wert aus Adresse $1337, das ist klar. Wenn du aber LDA $1337,x schreibst, spielt das X-Register eine Rolle darin, aus welcher Adresse gelesen wird - der Wert in X wird zu der Zahl hinzugezählt, und aus dieser Adresse wird dann gelesen. Ist der Wert in X gleich 0, wird weiterhin aus Adresse $1337 gelesen ($1337+0). Ist der Wert in X 1, lesen wir aber aus Adresse $1338 ($1337+1). Ist X $10, lesen wir aus $1347, und so weiter. Dasselbe gilt für Y, nur schreibt man da eben LDA $1337,y.
Den Wert in A kann man nicht einfach so dranhängen, dafür gibt es keine Befehle. LDA $1337,a geht nicht.

Zitat von kooooopa:
Wenn ich dann aber z.B.
Code
 01000001
00000001

So etwas habe, was mach ich dann damit? Wo packe ich es hin

Was? Wo hast du das her? Kapier ich nicht.

Zitat von kooooopa:
und wo finde ich auf der RAM Map die binären Adressen von Kontrollertasten, oder Stelle ich mir das falsch vor?

In der Beschreibung steht's:
Code
$7E:0015	1 byte	I/O	Controller data 1. Format: byetUDLR.
b = A or B; y = X or Y; e = select; t = Start; U = up; D = down; L = left, R = right.

Die Buchstabenfolge byetUDLR stellt ein Byte dar (acht Bits). Jeder Buchstabe entspricht einem Button und damit einem Bit. Würde START gedrückt und sonst nichts, wäre der Wert in $15 00010000. Der Buchstabe t steht in der Beschreibung für den START-Knopf, und der steht in dem Byte an der vierten Stelle von Links, also ist das Bit an der viersten Stelle von links gesetzt.
Die Buchstabenvergabe ist übrigens völlig egal, das dient nur der Verdeutlichung.

Zitat von kooooopa:
4.Was ist eigentlich noch PHA, PHX, PHY, PLA, PLX, PLY und was ist noch TAX, TAY, TXY, TYX, TYA, TXA?

Letztere sind einfacher zu erklären: Übertragung des Wertes von einem Register ins andere. TAX kopiert den Wert von A nach X, TAY kopiert von A nach Y und so weiter.

Was erstere angeht, da musst du über den Stack Bescheid wissen. Das ist ein Bereich im RAM, in dem Werte zwischengespeichert werden. Stell ihn dir als Bücherstapel vor: Wenn du etwas auf den Stack legst, platzierst du den neuen Wert immer an oberster Stelle, und wenn du einen Wert herausholst, nimmst du immer nur den, der ganz oben liegt.
PHA ("Push A") speichert einen Wert auf den Stack, PLA ("Pull A") holt ihn wieder zurück. Beispiel:
Code
LDA #$02 ; A ist 02
PHA ; Wert von A auf den Stack speichern
LDA #$FF ; A ist FF
PLA ; Wert vom Stack zurückholen und in A speichern, A ist wieder 02
RTS


Natürlich können auch mehrere Werte zur selben Zeit auf dem Stack abgelegt sein:
Code
LDA #$02 ; A ist 02
PHA ; Wert von A auf den Stack speichern
LDA #$03 ; A ist 03
PHA ; Wert von A auf den Stack speichern
LDA #$04 ; A ist 04
PLA ; Obersten Wert vom Stack in A speichern, A ist 03
PLA ; Obersten Wert vom Stack in A speichern, A ist 02
RTS


Nett ist dabei auch, dass du von einem Register ins andere pushen und pullen kannst:

Code
LDA #$05 ; A ist 05
LDX #$09 ; X ist 09
PHA ; Wert von A auf den Stack speichern
PLX ; Wert vom Stack zurückholen und in X speichern, X ist 05
RTS

(das würde in diesem Fall mit TAX einfacher gehen.)

Achte dabei immer darauf, dass der Stack ausgeglichen ist. Am Ende musst du genauso oft "gepusht" haben wie "gepullt":

Code
LDA #$02
PHA
PHA
PLA
RTS ; das geht nicht


Hoffe, das hilft dir weiter.
geschrieben am 05.08.2012 19:54:20 in ASM Fragen
( Link )
Zitat von kooooopa:
Geht das nicht auch in dem wir das Powerup laden, schauen ob MArio einen Pilz hat, wenn ja zu Code Pilz springen und den Soundeffekt abspielen, wenn nein schauen ob Mario eine Blume hat, wenn ja....
Dann bräuchte ich doch garkeine Tabelle.

Ja, das stimmt. Trotzdem sind Tabellen vorzuziehen - sie sparen Platz, sind effizienter und machen den Code weitaus lesbarer. Was ist dir lieber, tausend Wenn-Dann-Befehle oder eine einzige Tabelle mit tausend Werten?

Zitat von kooooopa:
Wenn LDY auch geht, gibt es dann einen Unterschied zwischen LDX und LDY?

Keinen großen, und keinen, um den du dir jetzt Gedanken machen musst. Es gibt nur einige Befehle, die nicht mit Y funktionieren - zum Beispiel würde LDA $000000,x funktionieren, LDA $000000,y gibt es aber nicht.

Zitat von kooooopa:
...

Okay, das mit dem Binärzahlen erkläre ich dir lieber ganz von vorne.

Du weißt, dass ein Byte aus 8 Bits besteht, oder? In Hexadezimal kann man zum Beispiel E6 sagen, das ist eine Zahl, die ein Byte lang ist. Sie besteht aus 8 Bits, und ein Bit ist eine Ziffer, die entweder 0 oder 1 sein kann. Wenn man die Bits einer Zahl ausschreibt, dann nennt man das Binärschreibweise. Die Zahl E6 wäre im Binärsystem 11100110. Dieselbe Zahl, nur verschiedene Schreibweisen. Du kannst sie auch im dir vertrauten Zehnersystem aufschreiben, das wäre 230, aber das tut hier nichts zur Sache.

Auch wenn man in ASM programmiert, sind die Werte, mit denen du arbeitest, meistens 1 Byte (8 bit) lang. Du kannst zum Beispiel schreiben:
Code
LDA #$E6

, das lädt den Wert E6 in A. Du kannst aber auch die Binärschreibweise verwenden:
Code
LDA #%11100110

Das ist exakt dasselbe! Wenn du diese beiden Codes in die ROM einfügst, sind sie genau gleich. Die verschiedenen Schreibweisen sind nur für uns Menschen da, der Maschine ist das egal.
Hexadezimale Zahlen werden durch ein Dollarzeichen ($) angezeigt, Binärzahlen durch ein Prozentzeichen (%). Und merk dir: Welche Schreibweise du wählst, ist egal.( Normalerweise nimmt man aber die Hexadezimalschreibweise, die ist kürzer.)

Stell dir vor, der Wert in Adresse $15 wäre #$34 - das ist dasselbe wie 00110100.

Soviel dazu, jetzt zu den Controller-Adressen. $15 ist eine Adresse, deren Wert davon abhängt, welche Knöpfe man gerade drückt. Drückt man zum Beispiel den START-Knopf und sonst nichts, ist der Wert in Adresse $15 00010000, was dasselbe ist wie #$10.
Und woher weiß man jetzt, welcher Wert für welche Knöpfe steht? Vielleicht hilft dir das hier mehr weiter als die RAM-Map:

00000000 <-- dieses Bit ist 1, wenn A oder B gedrückt werden, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn X oder Y gedrückt werden, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn SELECT gedrückt wird, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn START gedrückt wird, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn der Pfeil nach oben gedrückt wird, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn der Pfeil nach unten gedrückt wird, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn der Pfeil nach links gedrückt wird, und 0, wenn nicht
00000000 <-- dieses Bit ist 1, wenn der Pfeil nach rechts gedrückt wird, und 0, wenn nicht

Verstehst du jetzt, warum der Wert 00010000 ist, wenn START gedrückt wird?

Natürlich kann man auch mehrere Knöpfe gleichzeitig drücken, dann sind eben mehrere Bits 1. Wenn man zum Beispiel gleichzeitig SELECT, nach oben und nach links drückt, ist der Wert in Adresse $15 00101010. Und das ist dasselbe wie #$2A.

Wenn du jetzt überprüfen willst, ob man gleichzeitig SELECT, nach oben und nach links drückt, könntest du folgendes machen:
Code
LDA $15
CMP #$2A
BEQ KnoepfeGedrueckt
[...]
KnoepfeGedrueckt:
[...]


Oder, wenn dir die Binärschreibweise lieber ist:

Code
LDA $15
CMP #%00101010
BEQ KnoepfeGedrueckt
[...]
KnoepfeGedrueckt:
[...]


Wenn man SELECT alleine drückt, ist der Wert in $15 00100000, was dasselbe ist wie #$20. Wenn du überprüfen willst, ob man SELECT drückt, könntest du folgendes tun:

Code
LDA $15
CMP #$20
BEQ KnopfGedrueckt
[...]
KnopfGedrueckt:
[...]


Das würde auch oft funktionieren. Wenn man allerdings zur selben Zeit SELECT und einen anderen Knopf drückt (sagen wir mal SELECT und nach oben), dann würde das im obigen Beispiel nicht als "Knopf gedrückt" zählen. Der Grund: Wenn man SELECT und nach oben drückt, ist der Wert in $15 00101000, und das ist #$28. Der Code würde nicht zu "KnopfGedrueckt" springen, denn du überprüfst ja auf den Wert #$20, nicht #$28.

In den meisten Fällen nimmt man für Knopf-Abfragen AND statt CMP und vertauscht BEQ und BNE. Ein besserer Code würde also so aussehen:

Code
LDA $15
AND #$20
BNE KnopfGedrueckt
[...]
KnopfGedrueckt:
[...]


Dieser Code würde zu "KnopfGedrueckt" springen, wenn man SELECT drückt - egal, welche Knöpfe man sonst noch drückt.

Warum das funktioniert und was AND ist... das würde hier zu lange dauern. Ich hoffe, du hast es jetzt etwas besser verstanden.

Zitat von kooooopa:
Ok, warum man TAX, etc. brauchen könnte leuchtet mir ein, aber wieso brauche ich PHA, etc. gibt es da irgendeine praktische Anwendung?

Natürlich, jede Menge sogar. Wenn du zum Beispiel Code von SMW veränderst, solltest du die Register vorher auf dem Stack speichern und am Ende wieder zurückholen, denn SMW verlässt sich darauf, dass in den Registern bestimmte Werte sind, mit denen es später weiterarbeiten will. Es gibt noch eine Menge mehr Anwendungsmöglichkeiten, aber mir will sonst gerade keine einfallen.
geschrieben am 06.08.2012 14:25:21 in Allgemeine Hex- und ASM-Fragen
( 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 07.08.2012 13:31:10 in Allgemeine Hex- und ASM-Fragen
( 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 18:30:56 in Allgemeine Hex- und ASM-Fragen
( Link )
Nichts anderes macht aber das "Inverse Water". Anscheinend geht's.
geschrieben am 12.08.2012 18:15:12 in Allgemeine SMW Hacking Fragen
( Link )
Dann eher #$16, wenn du Blöcke willst.

Ich gehe aber mal davon aus, dass das nicht funktioniert und man tiefere Eingriffe vornehmen muss. Neue Objects zu programmieren würde auf jeden Fall funktionieren, aber dafür bräuchte man wahrscheinlich etwas freien RAM. Wie auch immer, probier das mit $9C ruhig aus, vielleicht geht's ja.
geschrieben am 12.08.2012 18:18:09 in Vorstellungs-/Verlassens-/Rückkehr-Thread
( Link )
Von morgen bis Donnerstagabend bin ich im Urlaub. Lasst's euch gut gehen ohne mich.
geschrieben am 12.08.2012 18:46:30 in Vorstellungs-/Verlassens-/Rückkehr-Thread
( Link )
Danke sehr! Vier Tage Helgoland, wie jedes Jahr.
Schön da.
geschrieben am 12.08.2012 21:13:21 in Allgemeine SMW Hacking Fragen
( Link )
In den Block-Code muss es, an eine Stelle, die ausgeführt wird, wenn der Block aktiviert wird. Oh, und ein JSL $00BEB0 muss dahinter, sonst passiert gar nichts.
geschrieben am 12.08.2012 21:52:26 in Allgemeine SMW Hacking Fragen
( Link )
Ach so, ich dachte, den hättest du längst.

Keine Ahnung - probier mal die "? Blocks" auf SMWC. Das scheint so eine Art Vorlage für solche Blöcke zu sein.
geschrieben am 18.08.2012 17:10:02 in Allgemeine Diskussionen
( Link )
Hurra, der Primzahl-Prüfer funktioniert jetzt noch besser.

Kaum einen Post wert, aber zur Zeit kann das Forum jeden gebrauchen.
geschrieben am 18.08.2012 18:44:55 in Allgemeine Diskussionen
( Link )
Zitat von RPG Hacker:
OMG! Primzahl-Prüfer 2.0! Mehr Primzahl, mehr Prüfer, mehr 2.0! OUT NOW!
Mir gefallen die Meldungen: "1 ist nicht prim." oder "2 ist prim!".

Version 2.0, jetzt mit doppelt so vielen Primzahlen!

[quote="[CUBE"]"]Und was bringt mir das?[/quote]
Die Gewissheit, ob eine Zahl bestimmter Größe prim ist oder nicht. Vor allem bringt's mir was, nämlich ein bisschen Programmierübung.

Die größte Neuerung gegenüber letztem Mal ist die bessere Handhabung von falschen Eingaben.
geschrieben am 18.08.2012 18:54:22 in Allgemeine Diskussionen
( Link )
Code
#include 
typedef unsigned int pos;

// Funktion: prüft, ob eine natürliche Zahl n eine Primzahl ist
bool is_prime(pos n)
{
// Wenn n kleiner als 2 - oder größer als 2 und gerade - ist,
// ist es keine Primzahl
if (n < 2 || (n > 2 && !(n % 2))) return false;

// Wenn n einen Teiler hat, der zwischen 3 und der Wurzel von n liegt,
// ist es ebenfalls keine
for (pos i=3; i {
if (!(n%i)) return false;
}

// Ansonsten schon
return true;
}
geschrieben am 18.08.2012 21:46:37 in Allgemeine Diskussionen
( Link )
Ts, ts, ich bin schwer enttäuscht, wie wenig du mir zutraust.

Na ja, die Idee mit der Wurzel hab ich vom Googlen nach Primzahl-Prüfer-Funktionen von anderen, aber sonst...