ASM- Wo ist mein logischer Fehler?

geschrieben am 23.01.2019 20:18:15
( Link )
1. Uberasm
2. Das ist ein modifizierter SlideAttack, was im Prinzip Sternenkraft mit runterdrücken und bestimmten Speed bedeutet. Das Original ist bestimmt irgwo auf SMWC
3. Alles ist dokumentiert, hoffentlich ist es so einfacher für euch zu lesen(und zu helfen )
Code
gamemode_14:
LDA $1696 ;\ FreeRamCheck for Slippery Level
BEQ Mainuscode ; | Branch if 0 to real code
STZ $86 ;/ Otherwise: remove Slippery Effect for Sliding effectively!

Mainuscode: ;---- The real SlideAttack is here

LDA $7B ;\ Check if you're moving the correct speed
SEC ; |
SBC #$2A ; | value A
CMP #$AC ; | value B-A
BCS Bla ;/ Not between the values

LDA $73 ;\ check if you're ducking
BEQ return12 ;/

LDA $1470 ;\ Check if you're carrying something
BNE Bla ;/

LDA $77 ;\
AND #$04 ; |-- Check if your in the air
BEQ Bla ;/

LDA $1490 ;\ Check if you already have Star Power
BNE skipstar ;/ If yes: Skip the next part

LDA #$12 ;\ Give Star Power, higher values give a better effect
STA $1490 ;/ and store it in the Star Power Timer

LDA #$12 ;\ Set timer for pallete to stop setting
STA $13E6 ;/ (without this it blinks after you stop sliding...)

LDA $18D2 ;\
BEQ skipstar ; | 18D2 is about the Score, basically, don't allow 1Ups!
STZ $18D2 ;/
skipstar:
LDA $86 ;\ The secret to a good slide attack
CMP #$80 ; | can be found here!
BEQ chatto ;/

LDA #$81 ;\ Load a wierd value here, one that SMW doesn't use
STA $86 ;/ To get the Slippery Effect

LDA #$01 ;\ Load the 01 in the FreeRam
STA $1696 ;/ To complete the Slippery Check!
chatto:

PHX ;\
LDA $14 ; | timer that increases each frame
LSR ; |
LSR ; |
AND #$03 ; | animate between 00,01,02 and 03 (4 frames)
TAX ; | and put that value into X
LDA Poses,x ; | Load from the table
PLX ; |
STA $13E0 ;/ store into pose address

Bla:
LDA $13E6 ;\ Check free ram
BEQ RealReturn ; |
DEC $13E6 ; | Decrease free ram
BRA RealReturn ;/

Poses: ; The table is here for one simple reason: It is otherwise out of reach. Worth the one extra BRA command
db $30,$32,$36,$38 ; Burned, Fight, Hand Up, Bend over

return12:
LDA $1696 ; Load the Empty Ram Adress
BEQ RealReturn ; If it is empty, go to the Realreturn
STZ $1696 ; Otherwise...0 it and 0
STZ $86 ; the Slippery Flag
RealReturn:
LDA $15 ;\ check if you're truly ducking
CMP #%0000100 ; | Controller buttons newly pressed this frame. Format:0000 0000 byet UDLR
BEQ ForRealReturn ; |
STZ $1490 ;/ Remove Starpower, doesn't work!

ForRealReturn:
RTS
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 24.01.2019 13:51:21
( Link )
Was genau ist denn das Problem, welches du zu fixen versuchst? Das zu wissen könnte es schonmal leichter machen, dabei zu helfen.
-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 24.01.2019 16:38:40
( Link )
Code

RealReturn:
LDA $7B ;\ Check if you're moving
BEQ StarReducer ;/ if not, no starpower
LDA $15 ;\ check if you're not ducking
AND #%0000100 ; Controller buttons newly pressed this frame. Format:0000 0000 byet UDLR.
BEQ StarReducer ;/ branch to star reducer
RTS
StarReducer:
LDA #$00
STZ $1490
RTS


Dieser Teil, ich bin SEHR sicher das Programmierer/ASM das hier hat: [wenn A, B, oder A∩B] = ausführen ( sprich A∪B )
beziehungsweise das Gegenteil, NICHT ausführen
Ich will das effizienter schreiben, also ein inklusiver oder benutzen
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 25.01.2019 0:03:26
zuletzt bearbeitet von WYE am 25.01.2019 0:11:20.
( Link )
Okay, also es gibt gar keinen Fehler, und der Code funktioniert, du möchtest ihn nur effizienter haben? Das wär ja schon mal eine wichtige Information.

Zuerst was Anderes: LDA #$00 : STZ bringt nichts (außer du brauchst die 0 in A für später). Entweder LDA #$00 : STA $1490, oder - effizienter - STZ $1490. $15 ist übrigens nicht "Controller buttons pressed this frame", das wäre $16.

So, okay. Was du sagen willst, ist: "wenn $7B null ist oder $15 null ist, dann setz den Stern zurück". Oder, mit gleicher Bedeutung: "wenn $7B nicht null ist und $15 nicht null ist, dann setz den Stern nicht zurück". Beides kann man in ASM aber nicht so elegant ausdrücken. Das einzige, was man dann noch verbessern könnte, ist, den zweiten Branch umzudrehen: wenn du nicht zu dem branchst, was du willst, sondern zu dem, was du nicht willst, sparst du oft Speicherplatz und Verzweigungen (in diesem Fall den einen Zweig mit dem RTS).

Ich wäre für so was:
Code
RealReturn:
LDA $7B
BEQ .removeStar
LDA $15
AND #$04
BNE .keepStar
.removeStar
STZ $1490
.keepStar
RTS


Wenn du mit den Kommentaren Dinge erklären willst, dann erklär sie am besten auf einer höheren Ebene. Kommentare wie "branch to this label" oder "subtract these values" bringen so gut wie gar nichts. Und "check if [...]" nützt dem Leser auch nicht viel, wenn er nicht erfährt, was denn nach dem Check passieren soll.

In einen Kommentar gehört am besten eine Erklärung in menschlicher Sprache, was ein Block voll Code tut, oder auch eine Erklärung, warum du an dieser Stelle tust, was du tust. Für diesen Block wäre so was schön gewesen wie "remove star power unless the player is ducking and pressing down". Was die Maschine macht - dass da ein Laden oder Branchen passiert - sehen wir auch selber, aber deine Absichten als Programmierer sehen wir nicht.

Ach ja, und die Hälfte deiner Labels sind ziemlich bescheiden benannt ("RealReturn", "ForRealReturn", "Mainuscode", "Bla", "chatto"). Da steigst du in sechs Wochen garantiert nicht mehr durch. Es zahlt sich aus, sich beim Code-Schreiben zehn Sekunden Zeit zu nehmen und sich einen guten Namen auszudenken, damit sich der Code auch ohne Kommentare von selbst erklärt. Spätestens am Ende beim Aufpolieren. Oft sind gut benannte Labels, wenn sie deine Absichten als Programmierer gut genug erklären, sogar ein kompletter Ersatz für Kommentare!
Abiturklausuren (schamlos geklaut von spinatkuchen >_>):
Deutsch (26.3.): Alles reingebracht, was ich wollte, bereue nichts, insgesamt ganz gutes Gefühl (Ergebnis: 8 Punkte - Hm, hätte mit mehr gerechnet.)
Geschichte (1.4.): Fast nichts zum historischen Kontext gewusst, Rest war ganz okay, vielleicht noch 3, eher 4 (Ergebnis: 7 Punkte - Hey, das hätte schlechter sein können. Keine Nachprüfung!)
Mathe (2.4.): Viel besser als gedacht, bis auf 'nen kleinen Teil fast alles richtig, 1 ist gut möglich (Ergebnis: 14 Punkte - Yay!)
Englisch (9.4.): Sprachlich keine Sorgen, inhaltlich etwas mehr, gutes bis sehr gutes Gefühl (Ergebnis: 15 Punkte - Der Lehrer mag mich halt.)
Physik (mdl., 10.5.): Bis auf zwei winzige Wissenslücken sehr einfach und sehr gut gelaufen (Ergebnis: 13 Punkte - Sehr in Ordnung!)
geschrieben am 25.01.2019 13:36:20
( Link )
Den Vorschlägen von WYE kann ich nur zustimmen. Sinnvolle Namen im Code sind sehr nützlich, weil man sich dadurch viel Dokumentation spart und trotzdem vieles leicht zu verstehen ist. Möglichst selbstbeschreibenden Code zu schreiben ist bei uns sogar eine Richtlinie auf der Arbeit. Und ja, im Idealfall sollten Kommentare den Code nicht beschreiben, sondern erklären. Das "was" sieht man als Leser ja selbst, das "wieso" ist das, woran man interessiert ist. Dafür reichen oft schon wenige Kommentarzeilen, sofern man vorher genannten Ratschlag befolgt und Dinge sinnvoll benannt hat.

Übrigens empfehle ich auch wärmstens den Einsatz von Sub Labels und +/- Labels (du benutzt ja Asar, oder?). Alleine durch den Einsatz von Sub Labels brauchst du nicht mehr solche Namen wie "return12" zu benutzen, sondern kannst daraus einfach ".Return" machen, und auch +/- Labels wären in diesem Code-Stück an vielen Stellen sinnvoll um sich bei einigen unwichtigeren Labels komplett Namen zu sparen.

Anders sieht das ganze natürlich aus, falls du noch xkas benutzt für deinen Code, aber von xkas kann man relativ leicht zu Asar wechseln, deswegen würde ich in dem Fall definitiv empfehlen, das zu tun. xkas ist ja immerhin schon seit mehr als nur ein paar Jahren veraltet.
-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 25.01.2019 20:18:05
zuletzt bearbeitet von Shog am 25.01.2019 20:54:20.
( Link )
1. Wie konvertiere ich denn sehr alte xkas-patches zu Asar?
Hier ist ein alter xkas kompatibler Code den ich nutze, wie kann ich z.B. auf Freespace verzichten usw.

Code
;@xkas
;Disable Jumping While Ducking Patch
;Origional By: Ixtab
;"Fix" By: Chdata/Fakescaper
;Does not disable spin jumping globally (while still being able to jump off of Yoshi)
;Because there is already a patch on SMWC that does this
;Also unlike Ixtab's version, the jumping SFX does not play when you try to jump while ducking, and it's now impossible to see Mario "twitch" from trying to show his jumping frame.
;Incase you're wondering, you can still jump while sliding.
;If you want to disable jumping while sliding too, look for ";ORA $13ED" and uncomment it, (Remove the semicolon)

header
lorom
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
!freeSpace = $178000 ; change this to whatever
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;

org $8F7E
JSL Main
NOP #2

org !freeSpace
db "STAR"
dw Encode-Main
dw Encode-Main^#$FFFF
Main: ;Start of Patch
STA $0F14 ;Put hacked code back.
STX $0F13 ;More code restoration
LDA $73 ;Mario's Ducking Flag
BEQ bbb ;If not ducking skip this
REP #$20 ;16-bit A
LDA #$8080 ;This
TSB $0DAA ;-Disables jumping while ducking
TSB $0DAC ;-Disables spin jumping while ducking (comment this out if you want to still be able to, the patch will still be able to counter break as described in the description. Incase you're stupid, duck jumping as big Mario to fit into small places.)
SEP #$20 ;8-bit A
;;

bbb: ;labbbel
RTL ;Return




2. (Versuch, die Sub Labels und +/- zu benutzen, wird erfolgreich von asar gepatcht aber mein Code sieht immer noch schrecklich aus und wirkt uneffizient, habt ihr vielleicht weitere Verbesserungsvorschläge?):
Code


LDA $1696 ; leere Ram-Adresse die bei Level-Load zu 0 wird
BEQ + ; Ein FreeRam-Check für rutschige Level. Ist dieser Wert auf 0 so bleibt das Level rutschig. Erlaubt also den Slippery-Effekt auf jedem Terrain
STZ $86

+ ; Test
;Überprüfe ob Mario sich duckt, sich im richtigen Bereich bewegt, ob er etwas trägt und ob er in der Luft ist
LDA $7B ;\ Check if you're moving the correct speed
SEC ; |
SBC #$2A ; |
CMP #$AC ; |
BCS KeinStern ;/ Not between the values? No Star Power for you

LDA $73 ;\ check if you're ducking
BEQ KeinStern ;/ Not? No Star Power for you

LDA $1470 ;\ Check if you're carrying something
BNE KeinStern ;/ Not? No Star Power for you

LDA $77 ;\
AND #$04 ; | Check if your in the air
BEQ KeinStern ;/ Not? No Star Power for you

LDA #$13 ;\ Give Star Power, higher values give a better effect for sparkles usw.
STA $1490 ;/ and store it in the Star Power Timer

LDA #$05 ;\ Set timer for palette to stop setting
STA $13E6 ;/ (without this it blinks after you stop sliding...)FreeRamNr2

LDA $18D2 ;\
BEQ .Slippery ; | 18D2 is about the Score, basically, don't allow 1Ups!
STZ $18D2 ;/
.Slippery:
;Extra Code für "Slippery"-Effekt, was die SlideAttack deutlich verbessert vom Effekt her
LDA $86 ;Slippery level können im Original anscheinend den Wert von 80 haben, daher diese kurze Überprüfung
CMP #$80 ; Sollte das falsch sein: Woops
BEQ .Animation ;Ändere nichts an den Slippery Effekt und geh zur Animation
LDA #$81 ;CustomSlipperyLevel. Werte getestet, dieser ist gut
STA $86
LDA #$01
STA $1696 ;Solange eine 1 hier ist bleibt das Level rutschig
.Animation:
;kopierter Animationen Code, nichts besonders hier;
PHX
LDA $14 ; timer that increases each frame
LSR
LSR
AND #$03 ; animate between 00,01,02 and 03 (4 frames)
TAX ; and put that value into X
LDA Poses,x ; Load from the table
PLX
STA $13E0 ; store into pose address
;test
BRA RealReturn

Poses:
db $30,$32,$36,$38 ; marioverbrannt , mario kampf , mario hand oben , mario bückt

KeinStern:
LDA $1696 ;wie gesagt, solange eine 1 bleibt es rutschig, aber ist es wie beim Level Load eine 0....
BEQ RealReturn ;dann bleibt das Level slippery
STZ $1696 ;STZ sowohl das rutschen als auch freeram
STZ $86
RealReturn:
LDA $7B
BEQ .removeStar
LDA $15
AND #$04
BNE .AnimationTimer
.removeStar
STZ $1490
.AnimationTimer
LDA $13E6 ;Check free ram Nr. 2 set earlier
BNE KeepAnimation
;das hier unten entfernt von Mario, je nachdem welches Kostüm er hat, die Palettenfarbe des Sterns.
LDA $19
CMP #$03
BEQ MFire
REP #$20 ;enter 16 bit mode
LDA #$B2C8 ;\load mario's palette
STA $0D82 ;/and store marios palette
SEP #$20 ;return to 8 bit mode
RTS
MFire:
REP #$20 ;enter 16 bit mode
LDA #$B2F0 ;\load mario's palette
STA $0D82 ;/and store marios palette
SEP #$20 ;return to 8 bit mode

KeepAnimation:
DEC $13E6 ;Decrease free ram Nr.2
RTS
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 26.01.2019 16:22:27
( Link )
Code
;@xkas

Code
header
lorom
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
!freeSpace = $178000 ; change this to whatever
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;

Code
Encode:


Das kannst du alles ersatzlos rausschmeißen.

Code
org !freeSpace
db "STAR"
dw Encode-Main
dw Encode-Main^#$FFFF

änderst du zu
Code
freecode


und

Code
JSL Main


änderst du zu

Code
autoclean JSL Main


Um es mal ganz simpel zu erklären: Mit "freecode" sucht sich Asar automatisch freespace raus, wo es den Patch hinschreibt, da muss man also nichts mehr manuell eingeben, und das "autoclean" sorgt dafür, dass dieser Freespace automatisch wieder freigegeben wird, wenn du den Patch ein zweites mal anwendest. Falls du wissen willst, wie das ganze aus technischer Sicht funktioniert, gibt es hier die Erklärung dazu.

Ich glaube das müsste sogar schon ausreichen.

Den zweiten Patch habe ich mir jetzt nicht im Detail angeschaut und nur grob überflogen, aber eine Sache, die schonmal auffällt, ist dass besonders zum Ende hin sehr wenig Leerzeilen dazwischen sind. Hier ein paar mehr hinzumachen (an logischen Stellen) könnte den Code schon viel lesbarer machen.

Was ich persönlich ansonsten noch sehr gerne mache, ist Einrückungen und {} zu verwenden, um den Code-Fluss etwas übersichtlicher zu gestalten. Das ist allerdings wirklich eher eine persönliche Sache von mir und ich glaube ich habe bisher noch niemanden gesehen, der ASM ebenfalls so schreibt. Falls du aber interessiert bist, kannst du dir hier ein Beispiel anschauen.
-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.