HDMA Bug fix Tutorial

geschrieben am 27.06.2011 19:53:06
( Link )
In diesem Tutorial erkläre ich euch wie man diverse HDMA Bugs beheben kann.


1:HDMA Bug beim Durchqueren des Ziels und bei der Benutzung des Keyholes vermeiden

Ich erkläre euch nun wie ihr diese HDMA bugs vermeiden könnt:
Durchqueren des Ziels anzeigen

Benutzung des Keyholes anzeigen
(die Message Box erstmal nicht beachten)
Zur Einleitung:
Zitat von WYE:
HDMA ist nicht direkt wie Layer 3. Es verschwindet, aber aus anderen Gründen. Was viele nicht wissen: Auch der Ausblend-Kreis am Ende des Levels, der Schlüsselloch-Effekt bei Secret Exits und der schwarze Hintergrund bei Message-Boxen sind HDMA. Es gibt acht verschiedene "Channel", die für HDMA-Effekte benutzt werden können, und wenn ein selbst eingefügter Farbverlaufseffekt denselben Channel benutzt wie einer der eben genannten Effekte, verschwindet der Farbverlauf. Es ist eben nur Platz für einen Effekt pro Channel.

Behebung:
Zitat von WYE:
Für das Problem mit dem Kreis- und dem Schlüsselloch-Effekt heißt die Lösung "andere Channels benutzen". Channels 3, 4 und 5 werden von SMW nicht benutzt und könen daher problemlos verwendet werden. Suche im HDMA-Code nach vierstelligen Adressen, die mit $43 beginnen - Zum Beispiel $4370. Die dritte Stelle - 7 - bedeutet, dass Channel 7 benutzt wird. Diese Zahl änderst du dann - zum Beispiel zu 5, so dass du dann $4350 hast. Es wird im HDMA-Code mehrere Zahlen geben, deren dritte Stelle gleich ist, die musst du dann alle zur selben Zahl ändern. Außerdem benutzen Farbverläufe meist mehr als einen Channel.


ABER: Sollte das nicht funktionieren, liegt's nicht daran, dass ein Channel zweimal benutzt wird, sondern daran, dass der SMW-Effekt alle anderen Channels ausschaltet.
Um die Bugs aus dem Video oben zu fixen müsst ihr einfach nur diesen Patch anwenden:
Code
    header : lorom

org $0092A2 : db $0C
org $0092EA : db $0C
org $00CB0C : db $0C
org $03C511 : db $0C
org $04DB99 : db $0C
org $05B296 : db $0C
org $0CAB98 : db $0C


2: HDMA Bug beim Aktivieren der Message Box vermeiden

Nun erkläre ich euch wie ihr diesen Bug fixen könnt:
Aktivieren der Message Box anzeigen
(Ich weiß ich benutze RPG Hackers VWF Patch aber die original Message boxen weisen den selben bug auf)

Falls ihr RPG Hackers VWF-Patch nicht benutzt, müsste ihr einfach Diesen Patch(Free Space nicht vergessen!)von Kaijyuu anwenden.

Falls ihr aber RPG Hackers VWF-Patch verwendet müsst ihr folgendes tun:

RPG-Hackers Patch benutzt Channel 4 also kann er im HDMA Code nicht benutzt werden. Channel 6 kann man in SMW problemlos nutzen. Ihr müsst im HDMA Code:
Code
REP #$20
LDA #$3200
STA $4330
LDA #.RedColour
STA $4332
PHK
PLY
STY $4334
LDA #$3200
STA $4340
LDA #.GreenColour
STA $4342
PHK
PLY
STY $4344
LDA #$3200
STA $4350
LDA #.BlueColour
STA $4352
PHK
PLY
STY $4354
SEP #$20
LDA #$38
TSB $0D9F
RTS

folgendes ändern:
STA $4340 -> STA $4360
STA $4342 -> STA $4362
STY $4344 -> STY $4364

LDA #$38 -> LDA.b #%01101000 oder LDA #$38 -> LDA #$68

3: HDMA Bug beim Switchen zwischen 2 Leveln verhindern

Nun erkläre ich euch wie ihr diesen Bug verhindert:
In ein anderes Level switchen anzeigen

Ihr müsst einfach diesen Patch anwenden (unbedingt auf Freespace achten!):
Code
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HDMA Code v3.5
;originally made by BMF.
;Bug fixes and new features added
;Now works with bsnes and snes9x, too!
;by Ice Man
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;JSL to Main Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lorom ;\ ROM is Lorom
header ;| and has a header.
org $0081AA ;| Hack NMI routine and
JSL CodeStart ;| jump to our code.
NOP #4 ;/ 4 time NOP (No Operation)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HDMA Main Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


org $00FFFF ;| CHANGE THIS TO SOME FREE SPACE!!!!
reset bytes


!CodeSize = CodeEnd-CodeStart ;\
RATS: ;| Write RATS tag to
db "STAR" ;| prevent other programs
dw !CodeSize-$01 ;| from overwriting this
dw !CodeSize-$01^$FFFF ;/ code!

CodeStart:
LDA $0100 ;\ Execute HDMA on
BEQ Start ;/ Nintendo Presents logo

CMP #$05
BEQ Start
CMP #$06
BEQ Start



CMP #$0E ;\ Execute HDMA on
BEQ Start ;/ the overworld
CMP #$0F ;\ Execute HDMA on
BEQ Start ;/ the overworld (fading)
CMP #$10 ;\ Don't execute HDMA
BEQ EndHDMA ;/ on black screens
CMP #$11 ;\ Don't execute HDMA
BEQ EndHDMA ;/ on black screens
CMP #$14 ;\ Execute HDMA in
BEQ Start ;/ the levels
CMP #$17 ;\ Don't execute HDMA
BCS EndHDMA ; | if game mode over 16
RTL ;/ Return

Start:
LDA $7FFF00,x ;\ Load Main HDMA table
BNE Execute ;/ If it isn't equal, execute.

Loop:
TXA ;\ Transfer X to Accumulator
CLC ;| Clear Carry Flag
ADC #$08 ;| and add 08 (for channels).
CMP #$40 ;| If channel is higher then 40,
BCS Return ;| then return and transfer
TAX ;| Accumulator back to X.
BRA Start ;/ Go back to the beginning.

Execute:
ORA $0D9F ;\ Enable HDMA channels
STA $0D9F ;| to actually execute the code.
TXA ;| Transfer X to Accumulator
ASL A ;| Multiply by 2
TAY ;| then transfer Accumulator to Y.
LDA $7FFF01,x ;| Enable DMA Transfer
STA $4300,y ;| at $4300.
LDA $7FFF02,x ;| Set B-Address
STA $4301,y ;| at $4301.
REP #$20 ;| Set processor to 16 Bit
LDA $7FFF03,x ;| Set A-Address (low byte)
STA $4302,y ;| at $4302.
SEP #$20 ;| Set processor to 8 Bit
LDA $7FFF05,x ;| Set A-Address bank
STA $4304,y ;| at $4304.
BRA Loop ;/ Loop the code.

Return:
RTL ;| Return

EndHDMA:
STZ $0D9F ;\ Disable HDMA transfer
LDA #$80 ;| Restore part of the
STA $2100 ;| NMI code because we
STZ $420C ;| JSLed to it
RTL ;/ and return.
CodeEnd:

print bytes


Dieses Tutorial wird evtl noch ergänzt falls es noch mehr Bugs gibt

Das ist mein erstes Tutorial. Ich hoffe ich habe es einigermassen verständlich erklärt. Für Verbesserungsvorschläge bin ich immer offen
geschrieben am 27.06.2011 20:12:51
( Link )
Ich hab' zwar kein Problem mit HDMA, aber für dein erstes Tutorial, hast du Alles gut erklärt und hast auch keine Rechtschreibfehler.Supi!
´s gibt badische und unsymbadische


Was?! Die Signaturlänge wurde auf 1024 Zeichen beschränkt? #notmysignaturelength
geschrieben am 27.06.2011 22:21:30
( Link )
Öhm, wo muss ich all die Codes einfügen?



Grade arbeite ich an: Nichts
geschrieben am 27.06.2011 22:23:40
( Link )
Zitat von urtegurkepro:
Öhm, wo muss ich all die Codes einfügen?


Well, duh!
Dumme Frage war dumm. Dieser Thread ist kein HDMA-Tutorial, sondern setzt voraus, dass man mit HDMA bereits was anfangen kann.
-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 27.06.2011 22:26:41
( Link )
Ich weiss schon wie man HDMA einfügt, aber da kommt auch noch was von Freespace und Patch und das kommt ja wohl kaum ins levelcode.asm oder?



Grade arbeite ich an: Nichts
geschrieben am 27.06.2011 22:28:59
( Link )
Das patchst du ganz normal mit xkas. Also in eine Textdatei kopieren dann als .asm speichern und drauf patchen
geschrieben am 27.06.2011 22:35:44
( Link )
Zitat von urtegurkepro:
...aber da kommt auch noch was von Freespace und Patch und das kommt ja wohl kaum ins levelcode.asm oder?


Da hast du deine Frage doch schon selbst beantwortet. Wenn etwas Freespace verwendet, ist es in der Regel ein eigenständiger Patch. Hättest es ja einfach ausprobieren können.
-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 02.07.2011 12:29:35
( Link )
hui, danke :3

ich sollte echt öfters in diesen tutorial abschnitt rein schnuppern ._.
geschrieben am 06.05.2012 11:04:26
( Link )
Man sollte mal den Code bei Switchen von 2 Leveln fixen.
Ich krieg ihn zumindest nicht eingefügt. Der auf smwc (auch Version 3.5) funktioniert hingegen einwandfrei.