Allgemeine Hex- und ASM-Fragen

geschrieben am 24.06.2013 20:30:12
( Link )
naja an welcher Stelle wird den von SMW Code zum OW laden ausgeführt an dem ich überprüfen kann ob
der Spieler gestorben ist oder das Level geschafft hat und bei der $13BF noch nicht gecleared wurde?
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 24.06.2013 22:22:03
( Link )
Pieks mal ein wenig bei $00A087 rum, da ist der Code vom Gamemode x0C (Load Overworld).
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 24.06.2013 22:30:15
( Link )
OK das klappt (solange ich vor A093 hijacke ^^) aber wie überprüfe ich jetzt ob der spieler das level geschafft hat oder nicht?
(ich überprüfe im momment $71 auf #$09 bin mir aber nicht siche ob das immer gilt...)
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 25.06.2013 0:17:06
( Link )
Gucke einfach ob irgendwann im Level $7E1493 gesetzt wurde und speichere das irgendwo ab.
Code
$7E:1493
1 byte
Timer
End level timer. Setting to #$FF will end the level as a goal sphere / boss fight. Peace sign is shown here when the timer hits #$28. The switches (yellow, green, red and blue) set it to #$08.
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 26.06.2013 17:21:03
( Link )
Und noch ne frage
kennt sich irgendwer mit Expansion chips aus und weiß wie die Emulatoren diese nutzen?
Ich würde wenn überhaupt ohne Nachteile den S-RTC Chip einfügen weiß aber nicht ob
das irgendwelche größeren probleme darstellt noch wie die Emulatoren darauf reagiren oder
wie man ihn überhaupt nutzt...
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 26.06.2013 18:06:05
( Link )
http://www.youtube.com/watch?v=M3h9EB3AriA
Da ist auch ein Patch dabei, den musst du wahrscheinlich nur ein wenig konvertieren (hirom->lorom)
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 26.06.2013 18:55:22
( Link )
hm wenn ich das patche kriege ich vom Emulator nur die Info das die Rom Interleafed ist und dann stürzt er ab :/
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 26.06.2013 22:08:08
( Link )
Naja, mit hirom->lorom ist es noch nicht getan, du musst noch einiges am Patch selber ändern.
Das hier:
Code
org $00FFD5		;\ 
db $35 ; | Enable S-RTC
db $55 ;/

musst du mit dem hier ersetzen:
Code
org $00FFD6
db $55

(FYI: Das ist der interne Header von der ROM, wir brauchen $00FFD5 nicht zü ändern.)

Dann musst du noch den Hijack ändern:
Code
org $008176
JML Test

auf eine andere Stelle, die immer ausgeführt wird.
(Ich weiß nicht, warum wiiqwertyuiop

Und nicht zu vergessen den Freespace setzen, das ist tatsächlich noch ein xkas-Patch.
Ich denke mal, dass es noch ein paar andere Stellen gibt, die du ändern musst, ich bin mir aber nicht sicher.
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 26.06.2013 23:19:24
( Link )
OK jetzt crash es aufjedenfall nicht mehr aber funktioniren tut es trotzdem nicht (der Ram bleibt bei 55)
Code
;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; S-RTC Patch
;; by
;; wiiqwertyuiop
;;
;; This patch will enable the S-RTC chip for *SMW*
;; It gives you a real time clock to use in game.
;; Useful for day/night system or even making your hack change with the seasons.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;

header
lorom

;;;;;;;;;;;;;;;;;;;;;;;;;

!Freespace = $33B000 ;
!TimeSet = $7FC7E0 ; If not zero time has been set (preferably one that doesnt get cleared). If it's zero time will be set. 1 byte needed.
;!FreezeTime = $7FC7E1 ; If not zero, time won't increase.
!FreeRAM = $7FC7E2 ; This is the RAM/SRAM the time will get stored to. 12 bytes needed.

;; Set time:

!SecondsLow = $7FC7F4 ; You can also use values for all of these if you wish
!SecondsHigh = $7FC7F5
!MinutesLow = $7FC7F6
!MinutesHigh = $7FC7F7
!HoursLow = $7FC7F8
!HoursHigh = $7FC7F9
!DayLow = $7FC7FA
!DayHigh = $7FC7FB
!Month = $7FC7FC
!YearLow = $7FC7FD
!YearHigh = $7FC7FE
!Century = $7FC7FF

;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Hijacks:
;;

org $0081A4 ;
JML Test ;
NOP
NOP

org $00FFD6 ;\
db $55 ;/

org !Freespace
!CodeSize = Ending-Routine
db "STAR"
dw !CodeSize-$01
dw !CodeSize-$01^$FFFF
Routine:
;=========================
;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Code below:

Test: ;
STZ $1DFA
STZ $1dFC

LDA !TimeSet ;\
CMP #$EA ; | Check if the time has been set already, if so, branch
BEQ + ;/
JSR INIT ; Set things up
+ ;
;LDA !FreezeTime ;\ If it's not time to increase time, branch
;BNE DontRead ;/
JSR ReadReady ;\ Check if we are ready for reading, if not return
BCC DontRead ;/
JSR ReadReady ; For some reason it needs to be read twice
LDX #$00 ;\
KeepReading: ; |
LDA $2800 ; |
AND #$0F ; | Read time
STA !FreeRAM,x ; |
INX ; |
CPX #$0C ; |
BNE KeepReading ;/
DontRead: ;
JML $0081AA ;/

INIT: ;
LDA #$0E ;\
AND #$0F ; | Invoke command
STA $2801 ;/
LDA #$04 ;\
AND #$0F ; | Set 24-hour mode(?)
STA $2801 ;/
LDA #$0D ;\
AND #$0F ; | Terminate command
STA $2801 ;/
LDA #$0E ;\
AND #$0F ; | Invoke command
STA $2801 ;/
LDA #$00 ;\
AND #$0F ; | Set time command
STA $2801 ;/
LDA !SecondsLow ;\
AND #$0F ; | Seconds low byte
STA $2801 ;/
LDA !SecondsHigh ;\
AND #$0F ; | Seconds high byte
STA $2801 ;/
LDA !MinutesLow ;\
AND #$0F ; | Minutes low byte
STA $2801 ;/
LDA !MinutesHigh ;\
AND #$0F ; | Minutes high byte
STA $2801 ;/
LDA !HoursLow ;\
AND #$0F ; | Hours low byte
STA $2801 ;/
LDA !HoursHigh ;\
AND #$0F ; | Hours high byte
STA $2801 ;/
LDA !DayLow ;\
AND #$0F ; | Day low byte
STA $2801 ;/
LDA !DayHigh ;\
AND #$0F ; | Day high byte
STA $2801 ;/
LDA !Month ;\
AND #$0F ; | Month
STA $2801 ;/
LDA !YearLow ;\
AND #$0F ; | Year low byte
STA $2801 ;/
LDA !YearHigh ;\
AND #$0F ; | Year high byte
STA $2801 ;/
LDA !Century ;\
AND #$0F ; | Century
STA $2801 ;/
LDA #$0D ;\
AND #$0F ; | Terminate command
STA $2801 ;/
LDA #$EA ;\ Good to go.
STA !TimeSet ;/
RTS ;

ReadReady: ;
LDA $2800 ;\
AND #$0F ; | If we are not ready to read yet, branch
CMP #$0F ; |
BNE NotReady ;/
SEC ; We can read now
RTS ;

NotReady: ;
CLC ; Don't read yet
RTS ;
Ending:
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 30.06.2013 2:53:55
( Link )
ok das mit dem S-RTC lass ich lieber ....
nun ja ich hab noch ne Frage welche HDMA channel kann man alle in SMW benutzten und welche werden bereits genutzt?
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 30.06.2013 7:21:41
( Link )
Zitat von mzünni:
ok das mit dem S-RTC lass ich lieber ....
nun ja ich hab noch ne Frage welche HDMA channel kann man alle in SMW benutzten und welche werden bereits genutzt?

Hier mit kann die Channels 3-7 benutzen und laut hier sonst nur die Channels 3-6 (oder waren es 3-5, sorry ich weiß es nicht)
Du kannst auch gerne zu mir MFG659 sagen (ich heiße übrigens in CreepTD wegen dem limitierten Platz wirklich MFG659)
Ich kann einige (ASM)-Codes fixen. <!-- s:) -->:)<!-- s:) -->
geschrieben am 08.07.2013 19:56:15
( Link )
Hi
gibt es eigentlich irgendeinen fix ,damit der autoscrollende Layer 3 nicht mit dem screen scrollt wenn man L/R drückt?
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 15.07.2013 13:09:37
( Link )
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; SMW Floating Platforms (sprites 5B & 5C), by imamelia
;;
;; This is a disassembly of sprites 5B and 5C in SMW, floating platforms.
;;
;; Uses first extra bit: YES
;;
;; If the extra bit is clear, this will act like sprite 5B, a wooden platform. If the
;; extra bit is set, this will act like sprite 5C, a checkerboard platform. You must
;; set sprite buoyancy on for these to work.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; defines and tables
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!ExtraBit = $04 ; extra bit (should usually be 04, but 01 works if you're using GEMS)

!WoodenTile1 = $60 ; the left tile of the wooden platform
!WoodenTile2 = $61 ; the middle tile of the wooden platform
!WoodenTile3 = $62 ; the right tile of the wooden platform
!CheckerboardTile1 = $EA ; the left tile of the checkerboard platform
!CheckerboardTile2 = $EB ; the middle tile of the checkerboard platform
!CheckerboardTile3 = $EC ; the right tile of the checkerboard platform

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; init routine
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print "INIT ",pc ;

LDA $7FAB10,x ; sprite extra bits
LSR ;
LSR ; remove these two LSRs if you're using GEMS and have set !ExtraBit to $01
AND #$01 ;
STA $1504,x ; make a backup of the extra bit at $1504,x
BEQ InitFloatingPlat ;
INC $1662,x ; adjust the sprite clipping if necessary
INC $1602,x ;
LDA $160E ; if sprite buoyancy is not on...
BNE InitFloatingPlat ;
INC $C2,x ;
RTL ;

InitFloatingPlat: ;

LDA #$03 ;
STA $151C,x ; set some sort of counter...
InitObjContLoop: ;
JSL $019138 ; check the sprite's contact with objects
LDA $164A,x ; if the sprite is in water or lava...
BNE EndInit ; terminate the init routine
DEC $151C,x ; decrement the counter
BMI ReInit ; and if it has dropped below zero, re-initialize the sprite...?
LDA $D8,x ;
CLC ;
ADC #$08 ; offset the sprite's Y position
STA $D8,x ;
LDA $14D4,x ;
ADC #$00 ; handle the high byte
STA $14D4,x ;
CMP #$02 ; if the high byte has reached 02...
BCS EndInit ; end the init routine
BRA InitObjContLoop ;

ReInit: ;

LDA #$01 ;
STA $14C8,x ;

EndInit:
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; main routine wrapper
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print "MAIN ",pc
PHB
PHK
PLB
JSR FloatingPlatformMain
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; main routine
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

FloatingPlatformMain:

LDA $9D ;
BEQ NoSkip1 ; if sprites are locked...
JMP SkipToGFX ; skip directly to the GFX routine

NoSkip1: ;

LDA $1588,x ; check the sprite's blocked status
AND #$0C ; if the sprite is touching the ceiling or floor...
BNE NoUpdateY ; don't update its Y position

JSL $01801A ; update sprite Y position without gravity

NoUpdateY: ;

STA $1491 ; reset the "prevent sliding on a platform" flag

; removed sprite number check for the spike ball (CMP #$A4)

LDA $AA,x ; check the sprite Y speed
CMP #$40 ; if it is greater than 40...
BPL NoIncYSpeed ; don't increment it
INC $AA,x ; if it is 40 or less, increment it
NoIncYSpeed: ;
LDA $164A,x ; if the sprite isn't in water or lava...
BEQ NoDecYSpeed ; don't do some subsequent Y speed checks

; another removed sprite number check

LDA $AA,x ; check the sprite's Y speed
BPL DecYSpeed ; if positive, decrement it
CMP #$F8 ; also decrement it if it is negative
BCC NoDecYSpeed ; and no less than F8
DecYSpeed: ;
SEC ;
SBC #$02 ; decrement the sprite's Y speed by 2
STA $AA,x ;

NoDecYSpeed:

LDA $7D ;
PHA ; save the player Y speed value

JSL $01B44F ; invisible solid block/platform routine

PLA ;
STA $00 ;
STZ $185E ;
BCC NoContact ; branch if the player isn't on the sprite

; removed sprite number check

INC $185E ;
LDA $00 ; check the value from before
CMP #$20 ; if it is less than 20...well, why the heck wouldn't it be? We just stored 02/03 to it!
BCC NoContact ; skip setting the Y speed again
LSR ;
LSR ;
STA $AA,x ; set the Y speed *again* (surely Nintendo could have done this better)

NoContact: ;

LDA $185E ;
CMP $151C,x ; not sure what the purpose of this is
STA $151C,x ;
BEQ SkipYSpd2 ;
LDA $185E ;
BNE SkipYSpd2 ; or this
LDA $7D ;
BPL SkipYSpd2 ; branch if the player is moving downward

LDY #$08 ; start Y at 08
LDA $19 ; if the player is small...
BNE NotSmall2 ;
LDY #$06 ; use Y = 06 instead
NotSmall2: ;
STY $00 ;

LDA $AA,x ; ANOTHER Y speed check?!
CMP #$20 ;
BPL SkipYSpd2 ; branch if the sprite Y speed is greater than 20...
CLC ;
ADC $00 ; Good gravy, how many times are they going to change the Y speed in this thing?
STA $AA,x ; Who programmed the sprite, some old geezer with Alzheimer's?

SkipYSpd2: ;

LDA $13 ;
AND #$01 ;
BNE SkipToGFX ; skip the next part every other frame

LDA $AA,x ; check the Y speed AGAIN
BEQ NoChangeYSpd1 ;
BPL NoIncYSpd2 ;
CLC ;
ADC #$02 ;
NoIncYSpd2: ; there HAS to be a better way of doing this...
SEC ;
SBC #$01 ; because we totally haven't already messed with the sprite's Y speed enough,
STA $AA,x ; we'll set it again

NoChangeYSpd1: ;

LDY $185E ; I'd put an enlightening comment here,
BEQ SkipYSpd3 ; but your guess is as good as mine.
LDY #$05 ;
LDA $19 ; Hey, kids! Let's play the "set Y to a number depending on whether or not
BNE SkipYSpd3 ; the player is small" game again!
LDY #$02 ; This time, our lovely numbers are 05 and 02!
SkipYSpd3: ;
STY $00 ;

LDA $D8,x ;
PHA ; save the sprite Y position...this can't be good...
SEC ;
SBC $00 ;
STA $D8,x ; Okay, so...apparently we're messing with the sprite's Y position
LDA $14D4,x ; as well as its speed. Wonderful.
PHA ;
SBC #$00 ;
STA $14D4,x ; looks like we want to offset the sprite's Y position...

JSL $019138 ; so that it will use a different base position when interacting with objects.

PLA ; pull back stuff
STA $14D4,x ;
PLA ; All this just to make the sprite float?
STA $D8,x ; Nintendo, you fail.

SkipToGFX: ;

JSR SubOffscreenX0 ; Whoa! Something that we actually semi-know what it does!

; removed sprite check

FloatingPlatformGFX: ;

; removed flipping sprite check

JSR GetDrawInfo ;

LDA $1602,x ;
STA $01

LDA $D8,x ;
SEC ;
SBC $1C ;
STA $0301,y ;
STA $0305,y ;
STA $0309,y ;
LDX $01 ; if the sprite is a checkerboard platform...
BEQ Only3Tiles1: ; we'll be drawing 5 tiles instead of 3
STA $030D,y ;
STA $0311,y ;
Only3Tiles1: ;
LDX $15E9 ;
LDA $E4,x ;
SEC ;
SBC $1A ;
STA $0300,y ; set the tile X displacement
CLC ;
ADC #$10 ;
STA $0304,y ; second tile 16 pixels to the right of the first
CLC ;
ADC #$10 ;
STA $0308,y ; third tile 16 pixels to the right of the second
LDX $01 ;
BEQ Only3Tiles2 ; and, if necessary...
CLC ;
ADC #$10 ;
STA $030C,y ; fourth tile 16 pixels to the right of the third
CLC ;
ADC #$10 ;
STA $0310,y ; fifth tile 16 pixels to the right of the fourth
Only3Tiles2: ;

LDX $15E9 ;
LDA $01 ; if the sprite is the wooden one...
BEQ WoodenTiles ; draw different tiles

LDA #!CheckerboardTile1 ;
STA $0302,y ; first tile
LDA #!CheckerboardTile2 ;
STA $0306,y ; second,
STA $030A,y ; third,
STA $030E,y ; and fourth tiles
LDA #!CheckerboardTile3 ;
STA $0312,y ; fifth tile
BRA SetUpTiles ;

WoodenTiles: ;

LDA #!WoodenTile1 ;
STA $0302,y ; first tile
LDA #!WoodenTile2 ;
STA $0306,y ; second,
STA $030A,y ; third,
STA $030E,y ; and fourth tiles...?
LDA #!WoodenTile3 ;
STA $0312,y ; fifth tile...? Maybe this graphics routine is shared by another sprite?...

SetUpTiles: ;

LDA $64 ;
ORA $15F6,x ; no hardcoded palette this time, and the two platforms use the same one
STA $0303,y ; properties for the first...
STA $0307,y ; second...
STA $030B,y ; third...
STA $030F,y ; fourth...
STA $0313,y ; and fifth tile

LDA $01 ;
BNE Draw5Tiles ; set the number of tiles to be drawn as 3 or 5
LDA #!WoodenTile3 ; if only 3...
STA $030A,y ; make the third tile the end of the wooden platform
LDA #$02 ; 3 tiles to draw
BRA FinishGFX ;
Draw5Tiles: ;
LDA #$04 ; 5 tiles to draw
FinishGFX: ;
LDY #$02 ; all tiles are 16x16
JSL $81B7B3 ;
RTS ;




Table1: db $0C,$1C
Table2: db $01,$02
Table3: db $40,$B0
Table6: db $01,$FF
Table4: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90,$30,$C0,$A0,$80,$A0,$40,$60,$B0
Table5: db $01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$00,$01,$FF

SubOffscreenX0:
LDA #$00
;BRA SubOffscreenMain
;SubOffscreenX1:
;LDA #$02
;BRA SubOffscreenMain
;SubOffscreenX2:
;LDA #$04
;BRA SubOffscreenMain
;SubOffscreenX3:
;LDA #$06
;BRA SubOffscreenMain
;SubOffscreenX4:
;LDA #$08
;BRA SubOffscreenMain
;SubOffscreenX5:
;LDA #$0A
;BRA SubOffscreenMain
;SubOffscreenX6:
;LDA #$0C
;BRA SubOffscreenMain
;SubOffscreenX7:
;LDA #$0E

SubOffscreenMain:

STA $03

JSR SubIsOffscreen
BEQ Return2

LDA $5B
LSR
BCS VerticalLevel
LDA $D8,x
CLC
ADC #$50
LDA $14D4,x
ADC #$00
CMP #$02
BPL EraseSprite
LDA $167A,x
AND #$04
BNE Return2
LDA $13
AND #$01
ORA $03
STA $01
TAY
LDA $1A
CLC
ADC Table4,y
ROL $00
CMP $E4,x
PHP
LDA $1B
LSR $00
ADC Table5,y
PLP
SBC $14E0,x
STA $00
LSR $01
BCC Label20
EOR #$80
STA $00
Label20:
LDA $00
BPL Return2

EraseSprite:
LDA $14C8,x
CMP #$08
BCC KillSprite
LDY $161A,x
CPY #$FF
BEQ KillSprite
LDA #$00
STA $1938,y
KillSprite:
STZ $14C8,x
Return2:
RTS

VerticalLevel:

LDA $167A,x
AND #$04
BNE Return2
LDA $13
LSR
BCS Return2
AND #$01
STA $01
TAY
LDA $1C
CLC
ADC Table3,y
ROL $00
CMP $D8,x
PHP
LDA $1D
LSR $00
ADC Table6,y
PLP
SBC $14D4,x
STA $00
LDY $02
BEQ Label22
EOR #$80
STA $00
Label22:
LDA $00
BPL Return2
BMI EraseSprite

SubIsOffscreen:
LDA $15A0,x
ORA $186C,x
RTS

GetDrawInfo:

STZ $186C,x
STZ $15A0,x
LDA $E4,x
CMP $1A
LDA $14E0,x
SBC $1B
BEQ OnscreenX
INC $15A0,x
OnscreenX:
LDA $14E0,x
XBA
LDA $E4,x
REP #$20
SEC
SBC $1A
CLC
ADC.w #$0040
CMP #$0180
SEP #$20
ROL A
AND #$01
STA $15C4,x
BNE Invalid

LDY #$00
LDA $1662,x
AND #$20
BEQ OnscreenLoop
INY
OnscreenLoop:
LDA $D8,x
CLC
ADC Table1,y
PHP
CMP $1C
ROL $00
PLP
LDA $14D4,x
ADC #$00
LSR $00
SBC $1D
BEQ OnscreenY
LDA $186C,x
ORA Table2,y
STA $186C,x
OnscreenY:
DEY
BPL OnscreenLoop
LDY $15EA,x
LDA $E4,x
SEC
SBC $1A
STA $00
LDA $D8,x
SEC
SBC $1C
STA $01
RTS

Invalid:
PLA
PLA
RTS











Kann mir einer sagen, was ich an diesem Code ändern muss, damit der Sprite die Palette F benutzt?
geschrieben am 15.07.2013 13:32:25
( Link )
Ich bin ein Arsch in ASM, aber Paletten werden in der CFG-Datei gespeichert
Den CFG-Editor gibt's auf SMWCentral, find ihn grad aber nicht
Zitat von Robju am 22.11.2013:
ICH BRING EUCH ALLE UM!!
Zitat von Dominik am 07.08.2013:
Fick dich Rob, ich wusste dass das kommt!

anzeigen
MFG: Wieso binn ich als Ideot genannt?Das ist net nett.
Robbinn, ideot, Satzstellung, Grammatik.
MFGSchonn gut, schon gut, das mit "binn" und "Idoet" ist ein Typo.
RobDas e und i sind 4 tasten voneinander entfernt.
MFGschnelle Finger?
Rob Nein.
MFG *facepalm*
Rob Wenn man Idiot schreibt kommt man nichtmal in die Nähe eines "e" s
MFG Doch, warum hat man denn sonst zwei Finger?
Rob Das hat mir der ANzahl der Finger nichts zu tun.
MFG Ich meine Hände.
Bro ich hab 3 stück
Rob Hat auch kit der Anzahl der Händer nichts zu tun
MFG Und es hat mit der Anzahl der Hände zu tun.
Rob Nein.
MFG Ich schreibe doch mit beiden.
Rob YOU ARE AN IDIOT, AH HAHAHAHAHA HAAAAHAAA HAHAHAHAAAAA!

DIE KONFI
DIE andere KONFI
JJJAAAAAAAH
geschrieben am 15.07.2013 13:41:39
( Link )
Ich bin wohl der größere noob in asm.. aber Danke!
geschrieben am 23.07.2013 16:01:39
( Link )
Zitat von Reggiamoto:
Ich bin ein Arsch in ASM, aber Paletten werden in der CFG-Datei gespeichert

Klar, ASM ist (neben Musik Porten) einer der kompliziertesten Sachen die es gibt.

Zitat von Reggiamoto:
Den CFG-Editor gibt's auf SMWCentral, find ihn grad aber nicht

Was? Den gibt es in SMWC, und zwar in der Sektion "Tools" auf "Sprite Tool" (=ist mit im Sprite Tool dabei).
Du kannst auch gerne zu mir MFG659 sagen (ich heiße übrigens in CreepTD wegen dem limitierten Platz wirklich MFG659)
Ich kann einige (ASM)-Codes fixen. <!-- s:) -->:)<!-- s:) -->
geschrieben am 23.07.2013 17:41:19
( Link )
Zitat von MarioFanGamer659:
Zitat von Reggiamoto:
Ich bin ein Arsch in ASM, aber Paletten werden in der CFG-Datei gespeichert

Klar, ASM ist (neben Musik Porten) einer der kompliziertesten Sachen die es gibt.

Musik porten ist ziemlich leicht, wenn man's raus hat Oder hab ich meine große Begabung gefunden? xD

Zitat von MarioFanGamer659:
Zitat von Reggiamoto:
Den CFG-Editor gibt's auf SMWCentral, find ihn grad aber nicht

Was? Den gibt es in SMWC, und zwar in der Sektion "Tools" auf "Sprite Tool" (=ist mit im Sprite Tool dabei).

Aso, ich musste den früher selbst downloaden
Zitat von Robju am 22.11.2013:
ICH BRING EUCH ALLE UM!!
Zitat von Dominik am 07.08.2013:
Fick dich Rob, ich wusste dass das kommt!

anzeigen
MFG: Wieso binn ich als Ideot genannt?Das ist net nett.
Robbinn, ideot, Satzstellung, Grammatik.
MFGSchonn gut, schon gut, das mit "binn" und "Idoet" ist ein Typo.
RobDas e und i sind 4 tasten voneinander entfernt.
MFGschnelle Finger?
Rob Nein.
MFG *facepalm*
Rob Wenn man Idiot schreibt kommt man nichtmal in die Nähe eines "e" s
MFG Doch, warum hat man denn sonst zwei Finger?
Rob Das hat mir der ANzahl der Finger nichts zu tun.
MFG Ich meine Hände.
Bro ich hab 3 stück
Rob Hat auch kit der Anzahl der Händer nichts zu tun
MFG Und es hat mit der Anzahl der Hände zu tun.
Rob Nein.
MFG Ich schreibe doch mit beiden.
Rob YOU ARE AN IDIOT, AH HAHAHAHAHA HAAAAHAAA HAHAHAHAAAAA!

DIE KONFI
DIE andere KONFI
JJJAAAAAAAH
geschrieben am 23.07.2013 18:22:25
( Link )
Zitat von Reggiamoto:
Zitat von MarioFanGamer659:
Zitat von Reggiamoto:
Ich bin ein Arsch in ASM, aber Paletten werden in der CFG-Datei gespeichert

Klar, ASM ist (neben Musik Porten) einer der kompliziertesten Sachen die es gibt.

Musik porten ist ziemlich leicht, wenn man's raus hat Oder hab ich meine große Begabung gefunden? xD

Vielleicht ist das deine Begabung (aber es ist schon schwer, wenn man bedenkt, wie es mit dem Echo and den ADSR geht).

Und wir sind zu Offtopic.
Du kannst auch gerne zu mir MFG659 sagen (ich heiße übrigens in CreepTD wegen dem limitierten Platz wirklich MFG659)
Ich kann einige (ASM)-Codes fixen. <!-- s:) -->:)<!-- s:) -->
geschrieben am 25.07.2013 20:21:11
( Link )
Ich hab nen Raum, bei betreten soll Message 1 gezeigt werden. (kein Problem macht ja nen Generator für mich)
In dem Raum ist der Bowser jr. Boss (siehe Anhang) und wenn er besiegt wird, wird das Level beendet.
Dies soll aber NICHT passieren. Stattdessen soll ein blauer P-Switch spawnen (code siehe unten) nur funktionieren die drei Sprites nicht in einem Raum. Entweder ich bin grad total blind und finde die EndLevel Routine von Bowser jr. nicht, oder ich verstehe den P-Switch spawn Code falsch.
Hat irgendjemand ne Idee, wie man es hinkriegt, dass nach besiegen von Bowser jr. nicht das Level beendet wird, sondern ein blauer P-Switch spawnt?

Bowser jr:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Bowser Jr., by dahnamics
;;
;; Credit: mikeyk (Shy Guy), Yoshicookiezeus (Thwomp boss v. 2.0), Schwa (sledge_ex)
;;
;; Description: This sprite is loosely based on Bowser Jr. from NSMB. He cannot be jumped on
;; until Mario throws a shell at him. Just like his form in 4-Tower, 6-Tower2, 7-Tower
;; and the towers in World 8, he throws a shell at Mario and Mario throws the shell back
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Shy Guy, by mikeyk
;;
;; Description: A Shy Guy with many available configurations.
;;
;; Note: When rideable, clipping tables values should be: 03 0A FE 0E
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Uses first extra bit: NO
;;
;; Extra Property Byte 1
;; bit 0 - enable spin killing
;; bit 1 - stay on ledges
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPRITE_Y_SPEED = $AA
SPRITE_X_SPEED = $B6
SPRITE_Y_POS = $D8
ORIG_Y_POS = $151C
H_OFFSCREEN = $15A0
V_OFFSCREEN = $186C
FREEZE_TIMER = $1540
SMASH_STATUS = $1602
STATE_TIMER = $163E
RAM_ThrowTimer = $1504
SPR_OBJ_STATUS = $1588

EXTRA_BITS = $7FAB10
EXTRA_PROP_1 = $7FAB28
GetSpriteClippingA = $03B69F
CheckForContact = $03B72B
GetSpriteClippingB = $03B6E5
ShowSprContactGfx = $01AB72

Invuln_Timer = $1564 ; The RAM address for Clawgrip's stun duration
MAX_Y_SPEED = $3E
MAX_Y_SPEED2 = $C2

; definitions of bits (don't change these)
IS_ON_GROUND = $04
IS_ON_CEILING = $08
TIME_ON_GROUND = $A0
TIME_TO_SHAKE = $40
RISE_SPEED = $C0
SOUND_EFFECT = $09
SPRITE_GRAVITY = $20
SPRITE_GRAVITY2 = $04
TIME_TO_EXPLODE = $00

X_SPEED dcb $08,$F8,$10,$F0
X_SPEED2 dcb $20,$E0
HURT_SPEED dcb $20,$E0
KILLED_X_SPEED dcb $F0,$10
SPRITE_STATE = $C2
HIT_POINTS = $05 ; being stomped by Mario
SPHERE = $6F

PROPFLASH:
dcb $04,$06,$08,$0C,$04,$06,$08,$0C

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

dcb "INIT"

LDA SPRITE_Y_POS,x
STA ORIG_Y_POS,x
LDA $E4,x
CLC
ADC #$08
STA $E4,x

TXA
AND #$03
ASL A
ASL A
ASL A
ASL A
ASL A
STA STATE_TIMER,x
CLC
ADC #$32
STA RAM_ThrowTimer,x

PHY
JSR SUB_HORZ_POS
TYA
STA $157C,x
PLY
LDA $1588,x ; if on the ground, reset the turn counter
ORA #$04
STA $1588,x ; if on the ground, reset the turn counter
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RETURN RTS
SPRITE_CODE_START
JSR SUB_GFX ; graphics routine

LDA $14C8,x ; return if sprite status != 8

CMP #$08 ; \ if status != 8, return
BNE RETURN ; /

LDA $9D ; \ if sprites locked, return
BNE RETURN ; /

JSR SUB_OFF_SCREEN_X3 ; handle off screen situation

DONE_WITH_SPEED
JSL $018032 ; interact with sprites

LDA $1528,x ; \ if sprite hit counter == 3
CMP #HIT_POINTS ; |
BEQ NO_CONTACT ; /

JSR HIT_ROUTINE

MARIO_INTERACT JSL $01A7DC ; interact with mario
BCC NO_CONTACT ; return if no contact
LDA $154C,x ; \ if sprite invincibility timer > 0 ...
BNE NO_CONTACT ; / ... goto NO_CONTACT
LDA #$08 ; \ sprite invincibility timer = $08
STA $154C,x ; /
LDA $7D ; \ if Mario's y speed < 10 ...
CMP #$10 ; } ... sprite will DEAD Mario
BMI SPRITE_WINS ; /

LDA SPRITE_STATE,x ; return if sprite is invulnerable
CMP #$05
BNE SPRITE_WINS

MARIO_WINS

JSR SUB_STOMP_PTS ; give Mario points
JSL $01AA33 ; set Mario speed
JSL $01AB99 ; display contact graphic
LDA #$28 ; \ sound effect
STA $1DFC ; /
LDA #$A0 ; \ Set stunned timer
STA $1564,x ; /
INC $1528,x ; increment sprite hit counter
LDA $1528,x ; \ if sprite hit counter == 3
CMP #HIT_POINTS ; |
BNE SMUSH_SPRITE ; /

SMUSH_SPRITE LDA #$0C ; \ time to show semi-squashed sprite = $0C
STA $1FE2,x ; /

LDA $1528,x ; \ if sprite hit counter == 3
CMP #HIT_POINTS ; |
BEQ SPRITE_DEAD ; /

LDA #$04
STA SPRITE_STATE,x
BRA NEW_RETURN
SPRITE_DEAD LDA #$06
STA SPRITE_STATE,x

NEW_RETURN RTS ; return

SPRITE_WINS
LDA $1497 ; \ if Mario is invincible...
ORA $187A ; } ... or Mario on yoshi...
BNE NO_CONTACT ; / ... return
JSR SUB_HORZ_POS ; \ set new sprite direction
TYA ; }
STA $157C,x ; /
JSL $00F5B7 ; hurt Mario

NO_CONTACT LDA SPRITE_STATE,x
CMP #$01
BEQ WALKING0
CMP #$02
BEQ FURIOUS0
CMP #$03
BEQ THROWING0
CMP #$04
BEQ HURT0
CMP #$05
BEQ STUNNED0
CMP #$06
BEQ DEAD0
CMP #$07
BEQ EXITING0

;-----------------------------------------------------------------------------------------
; state 0
;-----------------------------------------------------------------------------------------

WAITING
LDA V_OFFSCREEN,x ;fall if offscreen vertically
BNE SET_WALKING

LDA H_OFFSCREEN,x ;return if offscreen horizontally
BNE RETURN0

JSR SUB_HORZ_POS ;determine if mario is close and act accordingly
TYA
STA $157C,x

LDA $1588,x ; \ if sprite is in contact with an object...
AND #$03 ; |
BEQ NO_OBJ_CONTACT0 ; |
LDA $157C,x ; | flip the direction status
EOR #$01 ; |
STA $157C,x ; /

NO_OBJ_CONTACT0
LDA $1588,x ; run the subroutine if the sprite is in the air...
ORA $151C,x ; ...and not already turning
BNE ON_GROUND0 ;
JSR SUB_CHANGE_DIR ;
LDA #$01 ; set that we're already turning
STA $151C,x ;

ON_GROUND0
LDA $1588,x ; if on the ground, reset the turn counter
AND #$04
BEQ RETURN0
STZ $151C,x
STZ $AA,x
BRA X_TIME0

FALLING0
LDA $1588,x ; if on the ground, reset the turn counter
AND #$04
BEQ RETURN0
LDA #$10 ; \ y speed = 10
STA $AA,x ; /

X_TIME0 STZ $B6,x

BCS RETURN0
LDA $0F
CLC
ADC #$40
CMP #$80
BCS THWOMP_4
THWOMP_4
LDA $0F
CLC
ADC #$24
CMP #$50
BCS RETURN0

SET_WALKING
INC SPRITE_STATE,x ;chage state to falling

WALKING0 BRA WALKING

RETURN0 JSL $01802A ; update position based on speed values
RTS

THROWING0 JMP THROWING
FURIOUS0 JMP FURIOUS
HURT0 JMP HURT
STUNNED0 JMP STUNNED
DEAD0 JMP DEAD
EXITING0 JMP EXITING

;-----------------------------------------------------------------------------------------
; state 1
;-----------------------------------------------------------------------------------------

WALKING
LDA #$00 ; If timer isn't C0..
CMP $1534,x ;

JSR SUB_HORZ_POS ;determine if mario is close and act accordingly
TYA
STA $157C,x

LDA $1588,x ; \ if sprite is in contact with an object...
AND #$03 ; |
BEQ NO_OBJ_CONTACT ; |
LDA $157C,x ; | flip the direction status
EOR #$01 ; |
STA $157C,x ; /

NO_OBJ_CONTACT
LDA $1588,x ; run the subroutine if the sprite is in the air...
ORA $151C,x ; ...and not already turning
BNE ON_GROUND ;
JSR SUB_CHANGE_DIR ;
LDA #$01 ; set that we're already turning
STA $151C,x ;

ON_GROUND LDA $1588,x ; if on the ground, reset the turn counter
AND #$04
BEQ IN_AIR
STZ $151C,x
STZ $AA,x
BRA X_TIME

FALLING LDA $1588,x ; if on the ground, reset the turn counter
AND #$04
BEQ IN_AIR
LDA #$10 ; \ y speed = 10
STA $AA,x ; /

X_TIME LDA $1528,x ; \ set x speed based on total HP
ASL
CLC
ADC $157C,x ; and direction
TAY

LDA X_SPEED,y ; |
STA $B6,x ; /

CONTINUE2 LDA STATE_TIMER,x
CMP #$28 ; | just go to normal walking code
BCS RETURN0 ; /

LDA Invuln_Timer,x
CMP #$00
BNE RETURN0

LDA STATE_TIMER,x
CMP #$21
BNE NO_JUMP2
LDA $1570,x
LSR A
AND #01
BEQ NO_JUMP2
STZ STATE_TIMER,x ; x speed = 0

BRA RETURN2
NO_JUMP2 CMP #$00
BNE RETURN2

SET_FALLING STZ SPRITE_X_SPEED,x

LDA #$03
STA SPRITE_STATE,x

LDA #$00
STA SPRITE_Y_SPEED,x ;set initial speed

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

RETURN2 RTS

;-----------------------------------------------------------------------------------------
; state 2
;-----------------------------------------------------------------------------------------

FURIOUS

LDA $1588,x ; \ if sprite is in contact with an object...
AND #$03 ; |
BEQ NO_OBJ_CONTACT2 ; |
LDA $157C,x ; | flip the direction status
EOR #$01 ; |
STA $157C,x ; /

NO_OBJ_CONTACT2
LDA $1588,x ; run the subroutine if the sprite is in the air...
ORA $151C,x ; ...and not already turning
BNE X_TIME2 ;
JSR SUB_CHANGE_DIR ;
LDA #$01 ; set that we're already turning
STA $151C,x ;


X_TIME2 LDY $157C,x ; \ set x speed based on direction
LDA X_SPEED2,y ; |
STA $B6,x ; /

JSR Hop ; Jump to custom code

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

Hop:
LDA #$C0 ; If timer isn't C0..
CMP $1504,x ;
BNE IncreaseHop ; Increase it.
LDA $1588,x ; Don't jump if already on ground.
AND #$04 ;
BEQ RETURN4 ;
JSR SUB_HAMMER_THROW2
LDA #$C0 ; Set jump height.
STA $AA,x ; Store it too.
STZ $1504,x ; Reset timer.
RTS ; Return
IncreaseHop:
INC $1504,x ; Increase timer.

RETURN4 RTS

;-----------------------------------------------------------------------------------------
; state 3
;-----------------------------------------------------------------------------------------

THROWING LDA #$00
STA SPRITE_Y_SPEED,x ;set initial speed

JSL $01801A ;apply speed

LDA SPRITE_Y_SPEED,x ;increase speed if below the max
CMP #MAX_Y_SPEED
BCS DONT_INC_SPEED
ADC #SPRITE_GRAVITY2
STA SPRITE_Y_SPEED,x
DONT_INC_SPEED
JSL $019138 ;interact with objects

LDA $1564,x ; return if sprite is invulnerable
CMP #$00
BNE RETURN67

JSR SUB_HAMMER_THROW

LDA #$F0 ; set the time of flight to F0
STA STATE_TIMER,x

LDA #$01
STA SPRITE_STATE,x

STZ SMASH_STATUS,x

RETURN67 RTS

;-----------------------------------------------------------------------------------------
; state 4
;-----------------------------------------------------------------------------------------

HURT LDA $1588,x ; \ if sprite is in contact with an object...
AND #$03 ; |
BEQ NO_OBJ_CONTACT1 ; |
LDA $157C,x ; | flip the direction status
EOR #$01 ; |
STA $157C,x ; /

NO_OBJ_CONTACT1
LDY $157C,x ; \ set x speed based on direction
LDA HURT_SPEED,y ; |
STA $B6,x

LDA $1564,x ; return if sprite is invulnerable
CMP #$00
BNE RETURN68

LDA $1528,x
CMP #$02
BCC ATTACK1

LDA #$02
STA SPRITE_STATE,x
BRA RETURN68
ATTACK1
LDA #$01
STA SPRITE_STATE,x

RETURN68 JSL $01802A ;apply speed
RTS

;-----------------------------------------------------------------------------------------
; state 5
;-----------------------------------------------------------------------------------------

STUNNED LDA $1588,x ; \ if sprite is in contact with an object...
AND #$03 ; |
BEQ NO_OBJ_CONTACT3 ; |
LDA $157C,x ; | flip the direction status
EOR #$01 ; |
STA $157C,x ; /

NO_OBJ_CONTACT3
STZ $B6,x

Hop3:
LDA #$C0 ; If timer isn't C0..
CMP $1534,x ;
BNE IncreaseHop3 ; Increase it.
STZ $1534,x ; Reset timer.
LDA #$01
STA SPRITE_STATE,x
RTS ; Return
IncreaseHop3:
INC $1534,x ; Increase timer.

RETURN65 JSL $01802A ;apply speed
RTS

;-----------------------------------------------------------------------------------------
; state 6
;-----------------------------------------------------------------------------------------

DEAD LDA FREEZE_TIMER,x
BNE RETURN10

STZ SPRITE_X_SPEED,x

LDA $0F30
BNE RETURN10

LDA $0F33
AND $01
BNE RETURN10

INC SMASH_STATUS,X
LDA SMASH_STATUS,x
CMP #$02
BNE RETURN10

INC SPRITE_STATE,x ;chage state to falling

RETURN10 RTS

;-----------------------------------------------------------------------------------------
; state 7
;-----------------------------------------------------------------------------------------

EXITING
LDA V_OFFSCREEN,x ;fall if offscreen vertically
BNE GOAL

LDA H_OFFSCREEN,x ;return if offscreen horizontally
BNE RETURN1

JSL $01801A ;apply speed

LDA SPRITE_Y_SPEED,x ;increase speed if below the max
CMP #MAX_Y_SPEED2
BMI DONT_INC_SPEED2
SEC
SBC #SPRITE_GRAVITY2
STA SPRITE_Y_SPEED,x
DONT_INC_SPEED2
JSL $019138 ;interact with objects

LDA SPR_OBJ_STATUS,x ;return if not on the ceiling
AND #IS_ON_CEILING
BEQ RETURN1

JSR SUB_9A04 ; ?? speed related

LDA #TIME_TO_SHAKE ;shake ground
STA $1887

LDA #TIME_ON_GROUND ;set time to stay on ground
STA FREEZE_TIMER,x

RETURN1 RTS

GOAL STZ $14C8,x
DEC $13C6 ; prevent Mario from walking at the level end
LDA #$FF ; \ set goal
STA $1493 ; /
LDA #$0B ; \ set ending music
STA $1DFB ; /
RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hammer routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

X_OFFSET dcb $F9,$07
X_OFFSET2 dcb $FF,$00
X_THROW_SPEED dcb $18,$E8

RETURN21 RTS
SUB_HAMMER_THROW LDA $15A0,x ; \ no egg if off screen
ORA $186C,x ; |
ORA $15D0,x
BNE RETURN21

JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full
BMI RETURN21 ; / after: Y has index of sprite being generated

LDA #$0A ; \ set sprite status for new sprite
STA $14C8,y ; /

LDA #$04
STA $9E,y

PHY ; set x position for new sprite
LDA $157C,x
TAY
LDA $E4,x
CLC
ADC X_OFFSET,y
PLY
STA $00E4,y

PHY ; set x position for new sprite
LDA $157C,x
TAY
LDA $14E0,x
ADC X_OFFSET2,y
PLY
STA $14E0,y

LDA $D8,x ; \ set y position for new sprite
SEC ; | (y position of generator - 1)
SBC #$0E ; |
STA $00D8,y ; |
LDA $14D4,x ; |
SBC #$00 ; |
STA $14D4,y ; /

PHX ; \ before: X must have index of sprite being generated
TYX ; | routine clears *all* old sprite values...
JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables
PLX ; /

PHY
LDA $157C,x
TAY
LDA X_THROW_SPEED,y
PLY
STA $B6,y

LDA #$C0
STA $AA,y

RETURN20 RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hammer routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

X_OFFSET3 dcb $F9,$07
X_OFFSET4 dcb $FF,$00
X_THROW_SPEED2 dcb $30,$D0

RETURN58 RTS
SUB_HAMMER_THROW2
LDA $15A0,x ; \ no egg if off screen
ORA $186C,x ; |
ORA $15D0,x
BNE RETURN58

JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full
BMI RETURN58 ; / after: Y has index of sprite being generated

LDA #$0A ; \ set sprite status for new sprite
STA $14C8,y ; /

LDA #$04
STA $9E,y

PHY ; set x position for new sprite
LDA $157C,x
TAY
LDA $E4,x
CLC
ADC X_OFFSET3,y
PLY
STA $00E4,y

PHY ; set x position for new sprite
LDA $157C,x
TAY
LDA $14E0,x
ADC X_OFFSET4,y
PLY
STA $14E0,y

LDA $D8,x ; \ set y position for new sprite
SEC ; | (y position of generator - 1)
SBC #$0E ; |
STA $00D8,y ; |
LDA $14D4,x ; |
SBC #$00 ; |
STA $14D4,y ; /

PHX ; \ before: X must have index of sprite being generated
TYX ; | routine clears *all* old sprite values...
JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables
PLX ; /

PHY
LDA $157C,x
TAY
LDA X_THROW_SPEED2,y
PLY
STA $B6,y

LDA #$C0
STA $AA,y

LDA #TIME_TO_EXPLODE
STA $1540,y

RETURN57 RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Be killed by shells
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

HIT_ROUTINE:

HITPOINTS:
;TXA ; \ Process every 4 frames
;EOR $13 ; |
;AND #$03 ; |
;BNE RETURN_BOB ; /
LDY #$09 ; \ Loop over sprites:


KILLED_X_SPEED:
dcb $FF,$00

SpriteInteract:
ldy #$0b
InteractLoop:
lda $14c8,y
cmp #$09
bcs ProcessSprite
NextSprite:
dey
bpl InteractLoop
rts

ProcessSprite:
PHX
TYX
JSL GetSpriteClippingB
PLX
JSL GetSpriteClippingA
JSL CheckForContact
bcc NextSprite

PHX
TYX

JSL ShowSprContactGfx

LDA #$02 ; \ Kill thrown sprite
STA $14C8,x ; /

LDA #$D0 ; \ Set killed Y speed
STA $AA,x ; /

LDY #$00 ; Set killed X speed
LDA $B6,x
BPL SET_SPEED
INY

SET_SPEED
LDA KILLED_X_SPEED,y
STA $B6,x

PLX
HandleBirdoHit:
LDA #$13 ; \ sound effect
STA $1DF9 ; /

LDA SPRITE_STATE,x ; If jumping up
CMP #$03
BCS Return3

SHELL_CONTACT
LDA #$05
STA SPRITE_STATE,x

Return3:
rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; graphics routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PROPERTIES: dcb $7F,$3F

;The tables must now have 16 bytes.
;THE LAST 8 ARE ONLY CREATED BECAUSE OF XDISP.

;0-4 BYTE - FRAME 1 RIGHT
;4-8 BYTE - FRAME 2 RIGHT
;8-12 BYTE - FRAME 1 LEFT
;12-16 BYTE - FRAME 2 LEFT

TILEMAP:
dcb $00,$02,$20,$22 ; WALKING 1 ;\ RIGHT
dcb $04,$06,$24,$26 ; WALKING 2 ;/ RIGHT
dcb $00,$02,$20,$22 ; WAITING 1 ;\ RIGHT
dcb $84,$86,$A4,$A6 ; WAITING 2 ;/ RIGHT
dcb $40,$42,$60,$62 ; RETREAT 1 ;\ RIGHT
dcb $44,$46,$64,$66 ; RETREAT 2 ;/ RIGHT
dcb $08,$0A,$28,$2A ; THROW 1 ;\ RIGHT
dcb $0C,$0E,$2C,$2E ; THROW 2 ;/ RIGHT
dcb $80,$82,$A0,$A2 ; LEAPING 1 ;\ RIGHT
dcb $80,$82,$A0,$A2 ; LEAPING 2 ;/ RIGHT
dcb $8C,$8E,$AC,$AE ; STUNNED 1 ;\ RIGHT
dcb $C0,$C2,$E0,$E2 ; STUNNED 2 ;/ RIGHT
dcb $48,$4A,$68,$6A ; DYING 1 ;\ RIGHT
dcb $48,$4A,$68,$6A ; DYING 2 ;/ RIGHT

dcb $00,$02,$20,$22 ; WALKING 1 ;\ LEFT
dcb $04,$06,$24,$26 ; WALKING 2 ;/ LEFT
dcb $00,$02,$20,$22 ; WAITING 1 ;\ LEFT
dcb $84,$86,$A4,$A6 ; WAITING 2 ;/ LEFT
dcb $40,$42,$60,$62 ; RETREAT 1 ;\ LEFT
dcb $44,$46,$64,$66 ; RETREAT 2 ;/ LEFT
dcb $08,$0A,$28,$2A ; THROW 1 ;\ LEFT
dcb $0C,$0E,$2C,$2E ; THROW 2 ;/ LEFT
dcb $80,$82,$A0,$A2 ; LEAPING 1 ;\ LEFT
dcb $80,$82,$A0,$A2 ; LEAPING 2 ;/ LEFT
dcb $8C,$8E,$AC,$AE ; STUNNED 1 ;\ LEFT
dcb $C0,$C2,$E0,$E2 ; STUNNED 2 ;/ LEFT
dcb $48,$4A,$68,$6A ; DYING 1 ;\ LEFT
dcb $48,$4A,$68,$6A ; DYING 2 ;/ LEFT

YDISP:
dcb $F0,$F0,$00,$00 ; WALKING 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; WALKING 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; WAITING 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; WAITING 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; RETREAT 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; RETREAT 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; THROW 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; THROW 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; LEAPING 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; LEAPING 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; STUNNED 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; STUNNED 2 ;/ RIGHT
dcb $F0,$F0,$00,$00 ; DYING 1 ;\ RIGHT
dcb $F0,$F0,$00,$00 ; DYING 2 ;/ RIGHT

dcb $F0,$F0,$00,$00 ; WALKING 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; WALKING 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; WAITING 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; WAITING 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; RETREAT 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; RETREAT 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; THROW 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; THROW 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; LEAPING 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; LEAPING 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; STUNNED 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; STUNNED 2 ;/ LEFT
dcb $F0,$F0,$00,$00 ; DYING 1 ;\ LEFT
dcb $F0,$F0,$00,$00 ; DYING 2 ;/ LEFT

XDISP:
dcb $00,$10,$00,$10 ; WALKING 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; WALKING 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; WALKING 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; WALKING 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; RETREAT 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; RETREAT 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; THROW 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; THROW 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; LEAPING 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; LEAPING 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; STUNNED 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; STUNNED 2 ;/ RIGHT
dcb $00,$10,$00,$10 ; DYING 1 ;\ RIGHT
dcb $00,$10,$00,$10 ; DYING 2 ;/ RIGHT

dcb $10,$00,$10,$00 ; WALKING 1 ;\ LEFT
dcb $10,$00,$10,$00 ; WALKING 2 ;/ LEFT
dcb $10,$00,$10,$00 ; WALKING 1 ;\ LEFT
dcb $10,$00,$10,$00 ; WALKING 2 ;/ LEFT
dcb $10,$00,$10,$00 ; RETREAT 1 ;\ LEFT
dcb $10,$00,$10,$00 ; RETREAT 2 ;/ LEFT
dcb $10,$00,$10,$00 ; THROW 1 ;\ LEFT
dcb $10,$00,$10,$00 ; THROW 2 ;/ LEFT
dcb $10,$00,$10,$00 ; LEAPING 1 ;\ LEFT
dcb $10,$00,$10,$00 ; LEAPING 2 ;/ LEFT
dcb $10,$00,$10,$00 ; STUNNED 1 ;\ LEFT
dcb $10,$00,$10,$00 ; STUNNED 2 ;/ LEFT
dcb $10,$00,$10,$00 ; DYING 1 ;\ LEFT
dcb $10,$00,$10,$00 ; DYING 2 ;/ LEFT

SUB_GFX:
JSR GET_DRAW_INFO

LDA $1602,x
STA $03 ; | $03 = index to frame start (0 or 4)


LDA $14 ;\ Frame counter ..
LSR A ; |
LSR A ; | Add in frame animation rate; More LSRs for slower animation.
LSR A ; |
AND #$01 ; | 01 means we animate between 2 frames (00 and 01).
ASL A ; |
ASL A ; | ASL x2 (0-4) makes it switch between the first byte and fifth byte,
STA $03 ;/ i.e. first animation and second animation. The result is stored into $03.

LDA SPRITE_STATE,x ; If jumping up
CMP #$06
BNE NOT_DEAD
LDA $03
CLC
ADC #$30 ; ...set killed frame
STA $03
LDA $15F6,x ; \
ORA #$80 ; | ...flip vertically
STA $15F6,x ; /
BRA DONE_WALKING

NOT_DEAD:
LDA SPRITE_STATE,x ; if retreating into shell
CMP #$04
BNE KNOCKED_BACK ; |
LDA $03 ; |
CLC ; |
ADC #$10 ; | ...use stun frames.
STA $03 ; /
BRA DONE_WALKING

KNOCKED_BACK:
LDA SPRITE_STATE,x ; if retreating into shell
CMP #$05
BNE YELLING ; |
LDA $03 ; |
CLC ; |
ADC #$28 ; | ...use stun frames.
STA $03 ; /
BRA DONE_WALKING

YELLING:
LDA SPRITE_STATE,x ; if yelling at Mario
CMP #$00
BNE JUMPING ; |
LDA $03 ; |
CLC ; |
ADC #$08 ; | ...use stun frames.
STA $03 ; /
BRA DONE_WALKING

JUMPING:
LDA SPRITE_STATE,x ; if exiting the level
CMP #$07
BNE IN_THE_AIR ; |
LDA $03 ; |
CLC ; |
ADC #$20 ; | ...use stun frames.
STA $03 ; /
BRA DONE_WALKING

IN_THE_AIR:
LDA SPR_OBJ_STATUS,x ;return if on the ground
CMP #$04 ; |
BEQ THROWING_SHELL ; |
LDA $03 ; |
CLC ; |
ADC #$20 ; | ...use stun frames.
STA $03 ; /
BRA DONE_WALKING

THROWING_SHELL:
LDA SPRITE_STATE,x ; If throwing shell
CMP #$03
BNE DONE_WALKING ; |
LDA $03 ; |
CLC ; |
ADC #$18 ; | ...use stun frames.
STA $03 ; /
; BRA DONE_WALKING

DONE_WALKING:
LDA $157C,x
STA $02 ; Store direction to $02 for use with property routine later.
BNE NoAdd
LDA $03 ;\
CLC ; | If sprite faces left ..
ADC #$38 ; | Adding 16 more bytes to the table.
STA $03 ;/ So we can invert XDISP to not mess up the sprite's appearance.
NoAdd:
PHX ;\ Push sprite index ..
LDX #$03 ;/ And load X with number of tiles to loop through.
Loop:
PHX ; Push number of tiles to loop through.
TXA ;\
ORA $03 ;/ Transfer it to X and add in the "left displacement" if necessary.
TAX ;\ Get it back into X for an index.

LDA $00 ;\
CLC ; | Apply X displacement of the sprite.
ADC XDISP,x ; |
STA $0300,y ;/

LDA $01 ;\
CLC ; | Y displacement is added for the Y position, so one tile is higher than the other.
ADC YDISP,x ; | Otherwise, both tiles would have been drawn to the same position!
STA $0301,y ; | If X is 00, i.e. first tile, then load the first value from the table and apply that
;/ as the displacement. For the second tile, F0 is added to make it higher than the first.

LDA TILEMAP,x
STA $0302,y

PHX ; Push number of times to go through loop + "left" displacement if necessary.
LDX $02 ;\
LDA PROPERTIES,x ; | Set properties based on direction.
STA $0303,y ;/
PLX ; Pull number of times to go through loop.

INY ;\
INY ; | The OAM is 8x8, but our sprite is 16x16 ..
INY ; | So increment it 4 times.
INY ;/

PLX ; Pull current tile back.
DEX ; After drawing this tile, decrease number of tiles to go through loop. If the second tile
; is drawn, then loop again to draw the first tile.

BPL Loop ; Loop until X becomes negative (FF).

PLX ; Pull back the sprite index! We pushed it at the beginning of the routine.

LDY #$02 ; Y ends with the tile size .. 02 means it's 16x16
LDA #$03 ; A -> number of tiles drawn - 1.
; I drew 2 tiles, so 2-1 = 1. A = 01.

JSL $01B7B3 ; Call the routine that draws the sprite.
RTS ; Never forget this!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_CHANGE_DIR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $019098

SUB_CHANGE_DIR ;LDA $15AC,x
;BNE LABEL41
;LDA #$08
;STA $15AC,x
LDA $B6,x
EOR #$FF
INC A
STA $B6,x
LDA $157C,x
EOR #$01
STA $157C,x
LABEL41 RTS


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; speed related
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_9A04 LDA SPR_OBJ_STATUS,x
BMI THWOMP_1
LDA #$00
LDY $15B8,x
BEQ THWOMP_2
THWOMP_1 LDA #$18
THWOMP_2 STA SPRITE_Y_SPEED,x
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; routines below can be shared by all sprites. they are ripped from original
; SMW and poorly documented
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; points routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

STAR_SOUNDS dcb $00,$13,$14,$15,$16,$17,$18,$19

SUB_STOMP_PTS PHY ;
LDA $1697 ; \
CLC ; |
ADC $1626,x ; / some enemies give higher pts/1ups quicker??
INC $1697 ; increase consecutive enemies stomped
TAY ;
INY ;
CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
BCS NO_SOUND ; / ... don't play sound
LDA STAR_SOUNDS,y ; \ play sound effect
STA $1DF9 ; /
NO_SOUND TYA ; \
CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
BCC NO_RESET ; |
LDA #$08 ; /
NO_RESET JSL $02ACE5 ; give mario points
PLY ;
RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B760 - graphics routine helper - shared
; sets off screen flags and sets index to OAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B75C

TABLE1 dcb $0C,$1C
TABLE2 dcb $01,$02

GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /

ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC TABLE1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA TABLE2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B829 - vertical mario/sprite position check - shared
; Y = 1 if mario below sprite??
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B829

SUB_VERT_POS LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
LABEL11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B817 - horizontal mario/sprite check - shared
; Y = 1 if mario left of sprite??
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B817

SUB_HORZ_POS LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B85D - off screen processing code - shared
; sprites enter at different points
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B83B

TABLE3 dcb $40,$B0
TABLE6 dcb $01,$FF
TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF

SUB_OFF_SCREEN_X0 LDA #$06 ; \ entry point of routine determines value of $03
BRA STORE_03 ; |
SUB_OFF_SCREEN_X1 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X2 LDA #$02 ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_X3 STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_2 ; /
LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
AND #$01 ; |
BNE VERTICAL_LEVEL ; /
LDA $D8,x ; \
CLC ; |
ADC #$50 ; | if the sprite has gone off the bottom of the level...
LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
ADC #$00 ; |
CMP #$02 ; |
BPL ERASE_SPRITE ; / ...erase the sprite
LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_2 ; /
LDA $13 ; \
AND #$01 ; |
ORA $03 ; |
STA $01 ; |
TAY ; /
LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
CMP $E4,x ;x pos ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0364 VC:090 00 FL:16953
PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
LDA $1B ;x boundry hi ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizCHC:0416 VC:090 00 FL:16953
LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
SBC $14E0,x ;x pos high ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0538 VC:090 00 FL:16953
STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
LDA #$00 ; \ mark sprite to come back A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0204 VC:071 00 FL:21152
STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_2 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_2 ; /
LDA $13 ; \ only handle every other frame??
LSR A ; |
BCS RETURN_2 ; /
AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195

SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
ORA $186C,x ; |
RTS ; / return


Code um den P-Switch spawnen zu lassen:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Normal Sprite Generator, based on mikeyk's code, further changed by Davros.
;;
;; Description: This sprite will generate a sprite when all the enemies on screen are
;; killed.
;;
;; Uses first extra bit: YES
;; When the first extra bit is clear, the sprite will turn into a sprite. When the first
;; extra bit is set, it will turn into another sprite.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

NORM_SPRITE = $3E ; P-Switch
NORM_SPRITE2 = $3E ; P-Switch

EXTRA_BITS = $7FAB10

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

dcb "INIT"
RTL

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

dcb "MAIN"
LDA $1493 ; \ if the goal is set...
BNE RETURN ; /

LDY #$0B ; \ load number of times to go through loop
LOOP_START CPY $00 ; |
BEQ DONT_CHECK ; /
LDA $190F,y ; \ if the tweaker bits are set...
AND #$40 ; |
BNE DONT_CHECK ; /
LDA $14C8,y ; \ if no sprite is left alive...
BNE RETURN ; /
DONT_CHECK DEY ;
BPL LOOP_START ;

LDA EXTRA_BITS,x ; \ set other sprite if the extra bit is set...
AND #$04 ; |
BNE SET_NORM_GEN ; /

JSR NORMAL_GEN ; generate normal sprite routine
BRA RETURN

SET_NORM_GEN JSR NORMAL_GEN2 ; generate normal sprite routine

RETURN RTL ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; generate normal sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


NORMAL_GEN LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /
LDA #NORM_SPRITE ; \ set sprite number for new sprite
STA $9E,x ; /
JSL $07F7D2 ; reset sprite tables

JSR SUB_SMOKE ; smoke routine

JSR SUB_HORZ_POS ; \ always face Mario
TYA ; |
STA $157C,x ; /

LDA #$10 ; \ sound effect
STA $1DF9 ; /
RETURN67 RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; generate normal sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


NORMAL_GEN2 LDA #$08 ; \ set sprite status for new sprite
STA $14C8,x ; /
LDA #NORM_SPRITE2 ; \ set sprite number for new sprite
STA $9E,x ; /
JSL $07F7D2 ; reset sprite tables

JSR SUB_SMOKE ; smoke routine

JSR SUB_HORZ_POS ; \ always face Mario
TYA ; |
STA $157C,x ; /

LDA #$10 ; \ sound effect
STA $1DF9 ; /
RETURN69 RTS ; return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; display smoke effect
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


SUB_SMOKE LDY #$03 ; \ find a free slot to display effect
FINDFREE LDA $17C0,y ; |
BEQ FOUNDONE ; |
DEY ; |
BPL FINDFREE ; |
RTS ; / return if no slots open

FOUNDONE LDA #$01 ; \ set effect graphic to smoke graphic
STA $17C0,y ; /
LDA #$1B ; \ set time to show smoke
STA $17CC,y ; /
LDA $D8,x ; \ smoke y position = generator y position
STA $17C4,y ; /
LDA $E4,x ; \ load generator x position and store it for later
STA $17C8,y ; /
RTS


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B817 - horizontal mario/sprite check - shared
; Y = 1 if mario left of sprite??
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B817

SUB_HORZ_POS LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
geschrieben am 25.07.2013 23:47:03
( Link )
So, ich hoffe jetzt scheißt mein Internet nicht rum, wenn ich das hier sende...
Hallo!
Ich hab mich mal wieder an ASM gesetzt und will es wieder weiterlernen.
Also habe ich schon mal einen simplen Custom Block erstellt:
Code
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide : JMP SpriteV : JMP SpriteH :
JMP MarioCape : JMP MarioFireBall : JMP TopCorner : JMP HeadInside : JMP
BodyInside
MarioAbove:
LDA #$03
STA $0DC2
MarioBelow:
MarioSide:
SpriteV:
SpriteH:
MarioCape:
MarioFireBall:
TopCorner:
HeadInside:
BodyInside:
RTL

Eigentlich sollte Mario einen Stern in der Status Bar spendiert bekommen, aber nix da, weil BTSD mir ne Fehlermeldung anzeigt:
Zitat von BTSD:
Errors occurred during the assembly of Random Block.asm

error: temp.asm: line 4{5}: invalid opcode or command [JMP SpriteH :]
error: temp.asm: line 5{5}: invalid opcode or command [JMP]
error: temp.asm: line 6: invalid opcode or command [BodyInside]

Was kann ich da jetzt machen?
Zitat von Robju am 22.11.2013:
ICH BRING EUCH ALLE UM!!
Zitat von Dominik am 07.08.2013:
Fick dich Rob, ich wusste dass das kommt!

anzeigen
MFG: Wieso binn ich als Ideot genannt?Das ist net nett.
Robbinn, ideot, Satzstellung, Grammatik.
MFGSchonn gut, schon gut, das mit "binn" und "Idoet" ist ein Typo.
RobDas e und i sind 4 tasten voneinander entfernt.
MFGschnelle Finger?
Rob Nein.
MFG *facepalm*
Rob Wenn man Idiot schreibt kommt man nichtmal in die Nähe eines "e" s
MFG Doch, warum hat man denn sonst zwei Finger?
Rob Das hat mir der ANzahl der Finger nichts zu tun.
MFG Ich meine Hände.
Bro ich hab 3 stück
Rob Hat auch kit der Anzahl der Händer nichts zu tun
MFG Und es hat mit der Anzahl der Hände zu tun.
Rob Nein.
MFG Ich schreibe doch mit beiden.
Rob YOU ARE AN IDIOT, AH HAHAHAHAHA HAAAAHAAA HAHAHAHAAAAA!

DIE KONFI
DIE andere KONFI
JJJAAAAAAAH