Jo, das habe ich dann auch schon gemacht. Habs dann wieder in Trasm probiert und jetzt geht's.
Kann es sein, dass man Variablen / Tabellennamen nur X Zeichen lang machen darf oder so?
Weil jetzt wo meine Tabellen nur noch T1 und T2 heißen geht's.
Codedcb "INIT"
RTL
T1 db $18,$28,$3F,$7F
T2 db $E8,$D8,$C0,$80
dcb "MAIN"
PHB
PHK
PLB
JSR Maincode
JSR Graphics
PLB
RTL
Maincode:
LDA $14C8,x ; \
CMP #$08 ; |
BNE Freeze ; | Freeze den Sprite wenn nötig
LDA $9D ; |
BNE Freeze ; /
LDA $1588,x ; \
AND #$0F ; | Teste, ob der Sprite gegen eine Wand läuft
BNE Kill ; /
LDY $0DBF ; \
LDA T1,y ; | Münzen laden und X-Speed setzen
STA $B6,x ; /
LDA $15 ; \
AND #$80 ; | Wenn der Spieler A oder B drückt, gehe nach oben
BNE Oben ; /
LDA T1,y ; \ Sonst unten
STA $AA,x ; / Y-Speed setzen
JSL $01802A
RTS
Oben:
LDA T2,y ; \
STA $AA,x ; / Y-Speed setzen
JSL $01802A
RTS
Freeze:
RTS
Kill:
JSL $00F606 ; Mario töten
RTS ; Und zurück in die Hauptroutine
Graphics:
JSR GET_DRAW_INFO
LDA $00
STA $0300,y
LDA $01
STA $0301,y
LDA #$2A
STA $0302,y
LDA #%00101100
ORA $64
STA $0303,y
INY
INY
INY
INY
LDY #$02
LDA #$00
JSL $01B7B3
RTS
SPR_T1 dcb $0C,$1C
SPR_T2 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 SPR_T1,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 SPR_T2,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 ; /
Edit: Hab jetzt noch mal nen bissel rumgetestet und mir ist aufgefallen, dass es nicht mehr funktioniert, wenn ich das JSL $01802A in nen eigenen Block setze und dann dahin BRA-e.
Naja, auf jeden Fall läufts jetzt und der Thread kann *zu*
~HF01
Ich könnte hier Text hinschreiben. Mache ich aber nicht.