Allgemeine Hex- und ASM-Fragen

geschrieben am 18.03.2011 18:15:13
( Link )
Zitat von RPG Hacker:
Was genau soll der denn tun?

Er sollte 20 Sekunden (Frames) zum Timer adden und danach verschwinden aber stattdessen verschwindet er nur und führt den anderen Effekt nicht aus.
geschrieben am 18.03.2011 18:28:18
( Link )
Weil $0F30 nicht der Timer ist, sondern nur der Frame Counter für den (das heißt: wenn $0F30 einen bestimmten Wert erreicht hat, wird der Timer um eine Sekunde verringert). Der Timer selbst besteht aus $0F31 bis $0F33, wobei jede Adresse für eine Stelle steht($0F31: Hunderter, $0F32: Zehner, $0F33: Einer). Da der Timer aus drei Adressen besteht, wird es auch etwas komplizierter, ihn zu erhöhen, da du immer alle drei Stellen in Bezug zueinander setzen musst.
-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 18.03.2011 18:30:35
( Link )
Zitat von RPG Hacker:
Weil $0F30 nicht der Timer ist, sondern nur der Frame Counter für den (das heißt: wenn $0F30 einen bestimmten Wert erreicht hat, wird der Timer um eine Sekunde verringert). Der Timer selbst besteht aus $0F31 bis $0F33, wobei jede Adresse für eine Stelle steht($0F31: Hunderter, $0F32: Zehner, $0F33: Einer). Da der Timer aus drei Adressen besteht, wird es auch etwas komplizierter, ihn zu erhöhen, da du immer alle drei Stellen in Bezug zueinander setzen musst.


Das hat aber mit dem Code hier funktioniert.
Code
JMP Mario : JMP Mario : JMP Mario : JMP Sprite : JMP Sprite : JMP Mariol : JMP Mariol

Mario:
LDA $0F30
INC
STA $0F30
Mariol:
Sprite:
RTL
geschrieben am 18.03.2011 18:35:59
( Link )
Unmöglich. Sammel den Block noch ein paar mal ein und du wirst sehen, dass sich nichts tut. Wenn doch, kann es sein, dass die Adresse nur bei Erhöhungen um 1 funktioniert, aber das schließe ich eigentlich 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 18.03.2011 18:39:21
( Link )
Zitat von RPG Hacker:
Unmöglich. Sammel den Block noch ein paar mal ein und du wirst sehen, dass sich nichts tut. Wenn doch, kann es sein, dass die Adresse nur bei Erhöhungen um 1 funktioniert, aber das schließe ich eigentlich aus.


Ich habe es noch einige male probiert aber das ganze funktioniert einwandfrei. Immer wenn man drauf steht hält er praktisch die Zeit an da er immer wenn der Timer um eins sinkt ihn gleich wieder erhöht. Und es ist unmöglich den Block einzusammeln da er auf Tile 130 eingestellt ist.
geschrieben am 18.03.2011 18:51:10
zuletzt bearbeitet von RPG Hacker am 18.03.2011 18:53:00.
( Link )
...
Hast du überhaupt gelesen, was ich oben geschrieben habe?
$0F30 ist der Timer Frame Counter. Der Timer wird immer dann reduziert, wenn $0F30 den Wert 0 annimmt. Wenn du $0F30 aber jede Frame um eins erhöhst, erreicht die Adresse niemals 0. Deshalb läuft auch die Zeit nicht weiter. Das heißt aber noch lange nicht, dass der Timer ständig um 1 erhöht wird. Würde das der Fall sein, würde der Timer nämlich nicht stehenbleiben, sondern sich in der Sekunde 60-mal um 1 erhöhen. Der Timer würde in die Höhe schnellen. Ich sage es nochmal: $0F30 ist nicht der Timer!
-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 18.03.2011 18:52:59
( Link )
Zitat von RPG Hacker:
...
Hast du überhaupt gelesen, was ich oben geschrieben habe?
$0F30 ist der Timer Frame Counter. Der Timer wird immer dann reduziert, wenn $0F30 den Wert 0 annimmt. Wenn du $0F30 aber jede Frame um eins erhöhst, erreicht die Adresse niemals 0. Deshalb läuft auch die Zeit nicht weiter. Das heißt aber noch lange nicht, dass die Zeit ständig um 1 erhöht wird. Würde das der Fall sein, würde die Zeit nämlich stehenbleiben, sondern sich in der Sekunde 60-mal um 1 erhöhen. Der Timer würde in die Höhe schießen. Ich sage es nochmal: $0F30 ist nicht der Timer!


Ja ich habe es gelesen und es tut mir sehr leid wenn ich mich für dich unklar ausdrücke aber wenn du willst kann ich dir in einem Video zeigen was ich meine und das es so ist...allerdings weiß ich nicht ob sich das heute noch ausgeht da ich ab 7 weg sein werde...
Edit: ach so jetzt habe ich verstanden was du meinst...sorry.
geschrieben am 18.03.2011 18:56:53
( Link )
Eben. Es ist ja nicht so, als hätte ich nicht selbst genug mit dem Timer experimentiert.
-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 20.03.2011 11:44:01
( Link )
Ich hab grad ein bisschen mit dem Noob Boss rumgespielt.
Allerdings lässt der Boss sich ja auch nur durch Throw Blöcke Shells usw killen, aber ich will das man ihm schaden zufügt wenn man auf ihm springt.
Weiß jemand vlt den Code der dies verursacht?
Am besten wäre dann noch wenn man mir sagen könte an welcher Stelle ich das ganze dann einfügen , oder wodurch ich es ersetzen müsste.
Wäre aufjedenfall sehr dankbar wenn mir jemand weiterhelfen könnte.
geschrieben am 20.03.2011 14:08:38
( Link )
mach statt JSR ThrowHurt, JSR JumpHurt, das dürfte helfen
geschrieben am 20.03.2011 19:51:10
( Link )
Ich habe mal wieder ein Problem:

In einigen Levels benutze ich eine Treasure Chest (wie in SMB3). Sie lässt beim Öffnen ein Item in der Itembox erscheinen und beendet automatisch das Level.
Nun habe ich aber die Itembox deaktiviert. Deshalb möchte ich, dass die Treasure Chest ein Item "ausspuckt", das Mario sofort verwenden kann und dann das Level beendet. Deshalb hab ich die asm-Datei etwas bearbeitet.

Die Treasure Chest spuckt das Item tatsächlich aus, beendet aber das Level nicht. Was muss ich am folgenden Code ändern, damit auch dies passiert:

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
;; Extra Property Byte 1
;; bit 0 - spawn a normal sprite (mushroom by default)
;;
;; Extra Property Byte 2
;; bit 0 - spawn a custom sprite (para-beetle by default)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GOAL_TIMER = $80
SOUND_TO_GEN = $36

EXTRA_BITS = $7FAB10
EXTRA_PROP_1 = $7FAB28
EXTRA_PROP_2 = $7FAB34
NEW_SPRITE_NUM = $7FAB9E

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
INC $157C,x ; set direction to the left
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB ; \
PHK ; | main sprite function, just calls local subroutine
PLB ; |
JSR SPRITE_CODE_START ; |
PLB ; |
RTL ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SPRITE_CODE_START LDA $1504,x ; \ if the state is set...
BEQ SKIP_GOAL_TIME ; /

JMP SET_GOAL_TIME ; set goal timer routine

SKIP_GOAL_TIME JSR SUB_GFX ; graphics routine
JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
LDA $9D ; \ if sprites locked, return
BNE RETURN ; /

LDA $1588,x ; \ if sprite is in contact with the ground...
AND #$04 ; |
BEQ IN_AIR ; /
LDA #$10 ; \ set y speed
STA $AA,x ; /

IN_AIR JSL $01802A ; update position based on speed values

JSL $01A7DC ; check for Mario/sprite contact (carry set = contact)
BCC RETURN ; return if no contact
INC $1504,x ; set state

LDA #SOUND_TO_GEN ; \ sound effect
STA $1DFC ; /

LDA EXTRA_BITS,x ; \ set another item if the extra bit is set
AND #$04 ; |
BNE CUSTOM ; /

NORMAL LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /

LDA EXTRA_PROP_1,x ; \ sprite type
STA $9E,x ; /
JSL $07F7D2 ; reset sprite properties
BRA SHARED

CUSTOM LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /

LDA EXTRA_PROP_2,x ; \ sprite type
STA NEW_SPRITE_NUM,x ; /
JSL $07F7D2 ; reset sprite properties
JSL $0187A7 ; get table values for custom sprite
LDA #$88 ; \ mark as initialized
STA EXTRA_BITS,x ; /

SHARED LDA #$20 ; \ time to disable sprite's contact with Mario
STA $154C,x ; /

LDA $D8,x ; \ set y position (low byte)
SEC ; |
SBC #$0F ; |
STA $D8,x ; /
LDA $14D4,x ; \ set y position (high byte)
SBC #$00 ; |
STA $14D4,x ; /

LDA #$00 ; \ set sprite direction depending on Mario's x speed
LDY $7B ; |
BPL DIRECTION ; |
INC A ; |
DIRECTION STA $157C,x ; /

LDA #$C0 ; \ set y speed
STA $AA,x ; /

RETURN RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; end level routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SET_GOAL_TIME LDA $1558,x ; \ if the timer is set...
BEQ SET_TIMER ; /
DEC A ; \ if the timer decreases
BNE RETURN ; /

END_LEVEL LDA $0DD5 ; \ if the secret event is set...
BEQ EXIT ; /
BPL RETURN ; return if set

EXIT LDA $E4,x ; \ set secret exit if the x position is set
AND #$10 ; |
BNE SECRET_EXIT ; /

NORMAL_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
STA $13CE ; store midway flag
BRA SHARED

SECRET_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
INC A ; set secret exit
STA $13CE ; store midway flag

SHARED STA $0DD5 ; activate secret event upon returning to the OW
INC $1DE9 ;
LDA #$0B ; \ set light/resolution
STA $0100 ; /
BRA RETURN

SET_TIMER LDA #GOAL_TIMER ; \ set timer
STA $1558,x ; /
BRA RETURN
...

(Ich schätze mal, dass das Level weiterhin erst beendet wird, wenn etwas in der Itembox erscheint)
Ursprünglich sah der Code so aus:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
;; Extra Property Byte 1
;; bit 0 - put item in item box (mushroom by default)
;;
;; Extra Property Byte 2
;; bit 0 - put item in item box (flower by default)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GOAL_TIMER = $80
SOUND_TO_GEN = $36

EXTRA_BITS = $7FAB10
EXTRA_PROP_1 = $7FAB28
EXTRA_PROP_2 = $7FAB34

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
INC $157C,x ; set direction to the left
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB ; \
PHK ; | main sprite function, just calls local subroutine
PLB ; |
JSR SPRITE_CODE_START ; |
PLB ; |
RTL ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SPRITE_CODE_START LDA $1504,x ; \ if the state is set...
BEQ SKIP_GOAL_TIME ; /

JMP SET_GOAL_TIME ; set goal timer routine

SKIP_GOAL_TIME JSR SUB_GFX ; graphics routine
JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
LDA $9D ; \ if sprites locked, return
BNE RETURN ; /

LDA $1588,x ; \ if sprite is in contact with the ground...
AND #$04 ; |
BEQ IN_AIR ; /
LDA #$10 ; \ set y speed
STA $AA,x ; /

IN_AIR JSL $01802A ; update position based on speed values

JSL $01A7DC ; check for Mario/sprite contact (carry set = contact)
BCC RETURN ; return if no contact
INC $1504,x ; set state

LDA #SOUND_TO_GEN ; \ sound effect
STA $1DFC ; /

LDA EXTRA_BITS,x ; \ set another item if the extra bit is set
AND #$04 ; |
BNE ITEM2 ; /

ITEM PHP ; Push Processor Status Register
LDA EXTRA_PROP_1,x ; \ put item in the item box
STA $0DC2 ; /
PLP ; Pull Processor Status Register
BRA SET_SMOKE

ITEM2 PHP ; Push Processor Status Register
LDA EXTRA_PROP_2,x ; \ put item in the item box
STA $0DC2 ; /
PLP ; Pull Processor Status Register

SET_SMOKE JSR SUB_SMOKE ; smoke routine

RETURN RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; end level routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SET_GOAL_TIME LDA $1558,x ; \ if the timer is set...
BEQ SET_TIMER ; /
DEC A ; \ if the timer decreases
BNE RETURN ; /

END_LEVEL LDA $0DD5 ; \ if the secret event is set...
BEQ EXIT ; /
BPL RETURN ; return if set

EXIT LDA $E4,x ; \ set secret exit if the x position is set
AND #$10 ; |
BNE SECRET_EXIT ; /

NORMAL_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
STA $13CE ; store midway flag
BRA SHARED

SECRET_EXIT LDA #$80 ; end level
LDA #$01 ; set midway flag to passed
INC A ; set secret exit
STA $13CE ; store midway flag

SHARED STA $0DD5 ; activate secret event upon returning to the OW
INC $1DE9 ;
LDA #$0B ; \ set light/resolution
STA $0100 ; /
BRA RETURN

SET_TIMER LDA #GOAL_TIMER ; \ set timer
STA $1558,x ; /
BRA RETURN
geschrieben am 21.03.2011 16:00:48
( Link )
ch habe mal eine Frage:
Wie kann kich machen dass mein Boss durch draufspringen verletzt wird ?
geschrieben am 30.03.2011 19:02:12
( Link )
Ich hab heute mal wieder ne kleine Frage zu ASM.
Wie kann ich machen, dass ein throwblock erschein, wie bei den Bossen in Super mario LD, gibts für den Throwblock ne Spritenummer ?
Acuh bei dem Stachiboss in SMWCP wurde es benutzt, da ja manchmal ein Throwblk von der decke fällt
hoffe ihr könnt mir helfen ^^
geschrieben am 05.04.2011 21:42:39
( Link )
Kann mir jemand den folgenden Sprite so ändern, dass das Verhalten bei den jeweiligen Extra Bits vertauscht wird? Also so, dass der Fisch bei Bit 2 das tut, was er sonst bei Bit3 tut und umgekehrt?
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SMB1 Cheep Cheep
;; Extra bits:
;; x2: Normal
;; x3: Moves in a Zig-Zag pattern
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SubOffScreen = $0C8F40 ; point to address where Romi's suboffscreen hack is patched.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SubHorzPos ; Face Mario
TYA
STA $157C,x
STZ $151C,x
LDA #$60
STA $C2,x
RTL


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "MAIN"
PHB
PHK
PLB
JSR SpriteMainSub
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite main code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SpriteSpeed: dcb $06,$FA
XSpeed: dcb $0C,$F4
SpriteMainSub:
SPRITE_CODE_START JSR SPRITE_GRAPHICS
LDA $14C8,x
CMP #$08
BNE RETURN
LDA $9D
BNE RETURN
JSR SubOffScreen

LDY $157C,x
LDA XSpeed,y
STA $B6,x
LDA $7FAB10,x
AND #$04
BEQ SKIPME
LDY $151C,x
LDA SpriteSpeed,y
STA $AA,x
JSR ++
SKIPME JSL $01802A
STZ $AA,x

JSL $01A7DC
RETURN RTS

++


DEC $C2,x
LDA $C2,x
BNE Return2
JSR +++
Return2:
RTS


+++:
LDA $151C,x
EOR #$01
STA $151C,x

LDA #$60
STA $C2,x

RTS

Die Graphics Routine und so hab ich mal weggelassen; falls das doch wichtig sein sollte, bitte sagen. Ansonsten schonmal danke im Voraus!
geschrieben am 05.04.2011 21:57:12
( Link )
Code
BEQ SKIPME
durch
Code
BNE SKIPME
ersetzen?
I'm a Brony and I'm proud!



Hier gibt's nette 8bit Remixes, Klavierzeugs und Acapella: <!-- m --><a class="postlink" href="http://www.youtube.com/user/timmifutzelchen">http://www.youtube.com/user/timmifutzelchen</a><!-- m -->
geschrieben am 05.04.2011 22:12:58
( Link )
Hast Recht. Danke für die schnelle Antwort.
geschrieben am 08.04.2011 21:29:08
( Link )
Was muss ich im folgenden Sprite-Generator ändern, damit die Sprites nur von der rechten Seite kommen:

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Sprites1: dcb $02,$01 ;only used if first extra bit is clear
Sprites2: dcb $13,$26 ;only used if first extra bit is set
Status1: dcb $01,$01 ;only used if first extra bit is clear
Status2: dcb $01,$01 ;only used if first extra bit is set

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite code JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT" ;generators don't have an init routine
dcb "MAIN"
PHB
PHK
PLB
JSR SPRITE_CODE_START
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EXTRA_BITS = $7FAB10
NEW_SPRITE_NUM = $7FAB9E

TBL_B2D0 dcb $F0,$FF
TBL_B2D2 dcb $FF,$00
TBL_B2D4 dcb $10,$F0

SPRITE_CODE_START LDA $14
AND #$7F
ORA $9D
BNE RETURN
JSL $02A9DE
BMI RETURN
TYX

JSL $01ACF9 ; random value routine
AND #$01 ; 2 possible values
STA $00 ; store to scratch RAM

LDA $18B9 ; check if first extra bit is set
AND #$40
BNE SecondTable

PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status1,y ; store sprite status
STA $14C8,x
LDA Sprites1,y ;
BRA SharedCode

SecondTable:

PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status2,y ; store sprite status
STA $14C8,x
LDA Sprites2,y ;
BRA SharedCode

SharedCode:
PLY
STA NEW_SPRITE_NUM,x
JSL $07F7D2 ; reset sprite properties
JSL $0187A7 ; get table values for custom sprite
LDA #$08 ; mark as initialized
STA EXTRA_BITS,x

JSL $01ACF9
AND #$7F
ADC #$40
ADC $1C
STA $D8,x
LDA $1D
ADC #$00
STA $14D4,x
LDA $148E
AND #$01
TAY
LDA TBL_B2D0,y
CLC
ADC $1A
STA $E4,x
LDA $1B
ADC TBL_B2D2,y
STA $14E0,x
LDA TBL_B2D4,y
STA $B6,x
RETURN RTS
geschrieben am 09.04.2011 19:16:02
( Link )
Code
TBL_B2D0            dcb $F0,$FF
TBL_B2D2 dcb $FF,$00
TBL_B2D4 dcb $10,$F0

in
Code
TBL_B2D0            dcb $FF,$FF
TBL_B2D2 dcb $00,$00
TBL_B2D4 dcb $F0,$F0
geschrieben am 13.04.2011 20:21:36
( Link )
Ich habe einen HDMA Code bei SMWC gefunden der so aussieht:
Nun möchte ich aber nicht das er die Statusbar überlappt. Wo und welchen Code muss ich einfügen oder welchen Patch benutzen ? Hier ist der Code:
Code

REP #$20 ; 16 bit A
LDA #$0000 ; $43X0 = 00
STA $4330 ; $43x1 = 00
LDA #LVL1BRIGHT ; get pointer to brightness table
STA $4332 ; store it to low and high byte pointer
PHK ; get bank
PLY ;
STY $4334 ; store to bank pointer byte
SEP #$20 ; 8 bit A
LDA #$08 ; Enable HDMA on channel 3
TSB $0D9F ;
RTS ; return

LVL1BRIGHT:
db $03,$00
db $03,$01
db $03,$02
db $03,$03
db $03,$04
db $03,$05
db $03,$06
db $03,$07
db $03,$08
db $03,$09
db $03,$0A
db $03,$0B
db $03,$0C
db $03,$0D
db $03,$0E
db $80,$0F
db $03,$0E
db $03,$0D
db $03,$0C
db $03,$0B
db $03,$0A
db $03,$09
db $03,$08
db $03,$07
db $03,$06
db $03,$05
db $03,$04
db $03,$03
db $03,$02
db $03,$01
db $03,$00
db $00
geschrieben am 13.04.2011 20:33:53
( Link )
Schwer zu machen, da der HDMA-Code die Helligkeit des Bildschirms verändert. Und da die Helligkeit nun mal nicht auf Layer Rücksicht nimmt...

Color Subtraction wäre eine Alternative, aber die ist etwas komplizierter aufzusetzen, wofür ich jetzt keine Zeit hab, und sieht auch nicht so sanft aus.