Lunariville Index du Forum
Lunariville
La communauté francophone de Lunar Magic et Super Mario Maker
 
Lunariville Index du ForumFAQRechercherMembresGroupesProfilS’enregistrerConnexion

ASM ... les programmeurs en herbe ... ou pas !
Aller à la page: 1, 2, 3, 4, 5, 6, 7, 8  >
 
Poster un nouveau sujet   Répondre au sujet    Lunariville Index du Forum -> Lunar magic et le romhacking de SMW -> Aide au smwhacking
Sujet précédent :: Sujet suivant  
Auteur Message
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Ven 18 Déc 2009 - 21:56    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Je vous expose ce topic :
Ici on postera nos problèmes d'ASM ... et comme je débutes, j'ai déjà besoin d'aide :p
J'ai suivi les tutos, et j'ai enfin réussi à créer un sprite statique de 2 tiles high XD
Mais mon but ... c'est de créer un Méga Bros., boss de 32x32, lançant des marteaux et des boomerangs et sautant de temps en temps, immoblilisant Mario à l'atterrissage ...

Voilà mon tout petit début de sprite XD :

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT and MAIN JSL targets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_HORZ_POS
TYA
STA $157C,x
RTL

dcb "MAIN"
PHB
PHK
PLB
JSR SPRITE_ROUTINE
PLB
RTL

SPRITE_ROUTINE
JSR SUB_GFX
LDA $14CB,x
CMP #$08
BNE RETURN
LDA $9D
BNE RETURN
JSR SUB_OFF_SCREEN_X0
JSL $018032
JSL $01A7DC
RETURN
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GENERIC GRAPHICS ROUTINE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_GFX JSR GET_DRAW_INFO

LDA $157C,x
STA $02

LDA $00
STA $0300,y

LDA $01
STA $0301,y

LDA #$EC
STA $0302,y

LDA $15F6,x
PHX
LDX $02
BNE NO_FLIP_1
ORA #$40
NO_FLIP_1 PLX
ORA $64
STA $303,y

INY
INY
INY
INY

LDA $00
STA $0300,y

LDA $01
STA $0301,y

LDA #$CC
CLC
ADC #F0
STA $0302,y

LDA $15F6,x
PHX
LDX $02
BNE NO_FLIP_2
ORA #$40
NO_FLIP_2 PLX
ORA $64
STA $303,y

INY
INY
INY
INY

LDY #$02
LDA #$00
JSL $01B7B3
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GET_DRAW_INFO
; This is a helper for the graphics routine. It sets off screen flags, and sets up
; variables. It will return with the following:
;
; Y = index to sprite OAM ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
;
; It is adapted from the subroutine at $03B760
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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 ; /

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_OFF_SCREEN
; This subroutine deals with sprites that have moved off screen
; It is adapted from the subroutine at $01AC0D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T12 dcb $40,$B0
SPR_T13 dcb $01,$FF
SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
dcb $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes

SUB_OFF_SCREEN_X1 LDA #$02 ; \ entry point of routine determines value of $03
BRA STORE_03 ; | (table entry to use on horizontal levels)
SUB_OFF_SCREEN_X2 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X3 LDA #$06 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X4 LDA #$08 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X5 LDA #$0A ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X6 LDA #$0C ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X7 LDA #$0E ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_X0 STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_35 ; /
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_35 ; /
LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
SPR_L31 LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_35 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ; \
LSR A ; |
BCS RETURN_35 ; /
LDA $E4,x ; \
CMP #$00 ; | if the sprite has gone off the side of the level...
LDA $14E0,x ; |
SBC #$00 ; |
CMP #$02 ; |
BCS ERASE_SPRITE ; / ...erase the sprite
LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
LDA.W $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
SPR_L38 LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $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 SPR_L16 ;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
SPR_L16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642


Pour essayer d'y arriver, j'ai jeté un cou d'oeil sur le Sledge Bro. :

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sledge Brother, by mikeyk
;;
;; Description:
;;
;; Uses first extra bit: NO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

JUMP_TIMER = $163E
RAM_ThrowTimer = $1504

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TIME_TO_LOCK = $28

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_GET_DIR
TYA
STA $157C,x

LDA $1588,x
ORA #$04
STA $1588,x

STZ $1602,x

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

PLA
ADC #$FE
STA JUMP_TIMER,x

RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

DecrementTimers:
LDA $14C8,x
CMP #$08
BNE DoneDec
LDA $9D
BNE DoneDec
LDA RAM_ThrowTimer,x
BEQ DoneDec
DEC RAM_ThrowTimer,x
DoneDec:
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TIME_TO_SHOW = $22 ;time to display the boomerang before it is thrown

X_SPEED dcb $00,$FC,$00,$04 ;rest at bottom, moving up, rest at top, moving down
TIME_IN_POS dcb $48,$10,$48,$10 ;moving up, rest at top, moving down, rest at bottom
TIME_TILL_THROW dcb $43,$3C

STAR INC RAM_ThrowTimer,x
RETURN RTS
START_HB_CODE JSR SUB_GFX ; draw hammer bro gfx
LDA $14C8,x ; \ if hammer bro status != 8...
CMP #$02 ; } ... not (killed with spin jump [4] or star[2])
BEQ STAR
CMP #$08
BNE RETURN ; / ... return
LDA $9D ; \ if sprites locked...
BNE RETURN ; / ... return

JSR SUB_GET_DIR ; \ always face mario
TYA ; |
STA $157C,x ; /


JSR SUB_OFF_SCREEN_X3 ; only process hammer bro while on screen
INC $1570,x ; increment number of frames hammer bro has been on screen

LDA $1570,x ; \ calculate which frame to show:
LSR A ; |
LSR A ; |
LSR A ; |
LSR A ; |
AND #$01 ; | update every 16 cycles if normal
STA $1602,x ; / write frame to show

LDA RAM_ThrowTimer,x ; \ if time until spit >= $10
CMP #TIME_TO_SHOW ; | just go to normal walking code
BCS JUMP_SPRITE ; /
INC $1602,x
INC $1602,x

LDA RAM_ThrowTimer,x ; \ throw hammer if it's time
BNE NO_RESET ; |
LDY $C2,x
LDA TIME_TILL_THROW,y
STA RAM_ThrowTimer,x
NO_RESET CMP #$01
BNE JUMP_SPRITE
LDA $C2,x
EOR #$01
STA $C2,x
JSR SUB_HAMMER_THROW ; /
LDA #$20
STA $1DF9

JUMP_SPRITE LDA JUMP_TIMER,x
CMP #$40 ; | just go to normal walking code
BCS WALK_SPRITE ; /
LDA $1602,x ; \ lock image while jumping
ORA #$01 ; |
STA $1602,x ; /
INC $1540,x ; we didn't move the sprite this frame, so we don't want a decrement
STZ $B6,x ; stop sprite from moving
LDA JUMP_TIMER,x
CMP #$38
BNE NO_JUMP2
LDA #$B0 ; \ y speed
STA $AA,x ; /
BRA APPLY_SPEED
NO_JUMP2 CMP #$00
BNE APPLY_SPEED
LDA #$FE
STA JUMP_TIMER,x

BRA APPLY_SPEED

WALK_SPRITE LDA $151C,x ;
TAY ;
LDA $1540,x ;
BEQ CHANGE_SPEED ;
LDA X_SPEED,y ; | set y speed
STA $B6,x ; /
BRA APPLY_SPEED

CHANGE_SPEED LDA TIME_IN_POS,y ;A:0001 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZCHC:0654 VC:057 00 FL:24235
STA $1540,x ;A:0020 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizCHC:0686 VC:057 00 FL:24235
LDA $151C,x
INC A
AND #$03
STA $151C,x

APPLY_SPEED LDA $1588,x ; push ground status so we can compare later
PHA ;

JSL $01802A ; update position based on speed values

LDA $1588,x ; if on the ground now...
AND #04 ;
BEQ IN_AIR ;
PLA ; ...and not on the ground before
AND #04 ;
BNE CHECK_TOUCH ;
LDA #TIME_TO_LOCK ; \ shake ground
STA $1887 ; /

LDA #$09 ; \ play sound effect
STA $1DFC ; /

LDA $77
AND #$04
BEQ CHECK_TOUCH
LDA #TIME_TO_LOCK ; set timer to freeze mario
STA $18BD

BRA CHECK_TOUCH

IN_AIR PLA

CHECK_TOUCH LDA $1588,x ; \ if hammer bro is touching the side of an object...
AND #$03 ; |
BEQ DONT_CHANGE_DIR ; |
LDA $151C,x
INC A
AND #$03
STA $151C,x

DONT_CHANGE_DIR JSL $018032 ; interact with other sprites
JSL $01A7DC ; check for mario/hammer bro contact

NO_CONTACT RTS ; return





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

X_OFFSET dcb $F4,$0C
X_OFFSET2 dcb $FF,$00
X_SPEED_HAMMER dcb $12,$EE

SUB_HAMMER_THROW LDY #$E8 ;A:0218 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0522 VC:104 00 FL:19452
LDA $157C,x ;A:0218 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0538 VC:104 00 FL:19452
BNE LABEL9 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0570 VC:104 00 FL:19452
LDY #$18 ;A:0200 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0210 VC:098 00 FL:21239
LABEL9 STY $00 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0592 VC:104 00 FL:19452
LDY #$07 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0616 VC:104 00 FL:19452
LABEL8 LDA $170B,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0632 VC:104 00 FL:19452
BEQ LABEL7 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0664 VC:104 00 FL:19452
DEY ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0088 VC:103 00 FL:19638
BPL LABEL8 ;A:0204 X:0009 Y:0006 D:0000 DB:03 S:01E8 P:envMXdizcHC:0102 VC:103 00 FL:19638
RTS ;
LABEL7 LDA #$04 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0686 VC:104 00 FL:19452
STA $170B,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0702 VC:104 00 FL:19452

PHY
LDA $157C,x
TAY
LDA $E4,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0734 VC:104 00 FL:19452
CLC
ADC X_OFFSET,y
PLY
STA $171F,y ;A:02C9 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0764 VC:104 00 FL:19452

PHY
LDA $157C,x
TAY
LDA $14E0,x ; |
ADC X_OFFSET2,y
PLY
STA $1733,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0828 VC:104 00 FL:19452

LDA $D8,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0860 VC:104 00 FL:19452
CLC
ADC #$F0
STA $1715,y ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0890 VC:104 00 FL:19452
LDA $14D4,x ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0922 VC:104 00 FL:19452
ADC #$FF
STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0954 VC:104 00 FL:19452

LDA #$D0 ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0986 VC:104 00 FL:19452
STA $173D,y ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1002 VC:104 00 FL:19452
PHY
LDA $157C,x
TAY
LDA X_SPEED_HAMMER,y
;LDA #$F0 ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1034 VC:104 00 FL:19452
PLY
STA $1747,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1058 VC:104 00 FL:19452
BRA LABEL10 ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1090 VC:104 00 FL:19452
LABEL6 RTS ;A:0101 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0248 VC:086 00 FL:19396
LABEL10 LDA $1715,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1112 VC:104 00 FL:19452
ADC #$F7 ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:1144 VC:104 00 FL:19452
STA $1715,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1160 VC:104 00 FL:19452
BCC LABEL11 ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1192 VC:104 00 FL:19452
LDA $1729,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1208 VC:104 00 FL:19452
ADC #$FF ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1240 VC:104 00 FL:19452
STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1256 VC:104 00 FL:19452
LABEL11 RTS ;A:0220 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1336 VC:104 00 FL:19452



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

TILEMAP dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
HORIZ_DISP dcb $FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04
dcb $04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC
VERT_DISP dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
PROPERTIES dcb $40,$00 ;xyppccct format

HAMMER_TILE = $6D


SUB_GFX JSR GET_DRAW_INFO ; after: Y = index to sprite tile map ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
LDA $1602,x ; \
ASL A ; | $03 = index to frame start (frame to show * 2 tile per frame)
ASL A
STA $03 ; /
LDA $157C,x ; \ $02 = sprite direction
STA $02 ; /
BNE NO_ADD
LDA $03
CLC
ADC #$10
STA $03
NO_ADD PHX ; push sprite index

LDX #$03 ; loop counter = (number of tiles per frame) - 1
LOOP_START PHX ; push current tile number
TXA ; \ X = index to horizontal displacement
ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
FACING_LEFT TAX ; \

LDA $00 ; \ tile x position = sprite x location ($00)
CLC ; |
ADC HORIZ_DISP,x ; |
STA $0300,y ; /

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
CLC ; |
ADC VERT_DISP,x ; |
STA $0301,y ; /

LDA TILEMAP,x ; \ store tile
STA $0302,y ; /

LDX $02 ; \
LDA PROPERTIES,x ; | get tile properties using sprite direction
LDX $15E9 ; |
ORA $15F6,x ; | get palette info
ORA $64 ; | put in level properties
STA $0303,y ; / store tile properties

PLX ; \ pull, X = current tile of the frame we're drawing
INY ; | increase index to sprite tile map ($300)...
INY ; | ...we wrote 1 16x16 tile...
INY ; | ...sprite OAM is 8x8...
INY ; | ...so increment 4 times
DEX ; | go to next tile of frame and loop
BPL LOOP_START ; /

PLX ; pull, X = sprite index

LDA RAM_ThrowTimer,x
CMP #$02
BCC NO_SHOW_HAMMER
CMP #30
BCS NO_SHOW_HAMMER
LDA $1602,x
CMP #$02
BCS SHOW_HAMMER_TOO

NO_SHOW_HAMMER LDY #$02 ; \ 02, because we didn't write to 460 yet
LDA #$03 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

HAMMER_OFFSET dcb $F4,$0C

SHOW_HAMMER_TOO PHX

LDA $00
LDX $02
CLC
ADC HAMMER_OFFSET,x
STA $0300,y

LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
CLC ; |
ADC #$E8
STA $0301,y ; /

LDA #HAMMER_TILE ; \ store tile
STA $0302,y ; /

LDA #$07
CPX #$00
BNE NO_FLIP_HAMMER
ORA #$40
NO_FLIP_HAMMER ORA $64 ; | put in level properties
STA $0303,y ; / store tile properties

PLX
INY ; | increase index to sprite tile map ($300)...
INY ; | ...we wrote 1 16x16 tile...
INY ; | ...sprite OAM is 8x8...
INY ; | ...so increment 4 times

LDY #$02 ; \ 02, because we didn't write to 460 yet
LDA #$04 ; | A = number of tiles drawn - 1
JSL $01B7B3 ; / don't draw if offscreen
RTS ; return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; routines below can be shared by all sprites. they are ripped from original
; SMW and poorly documented
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $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 ; /

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

;org $03B817 ; Y = 1 if contact

SUB_GET_DIR 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


Mais je ne pige plus après x)
AIDEZ-MOI ! (enfin si vous le pouvez :p)


Revenir en haut
Publicité






MessagePosté le: Ven 18 Déc 2009 - 21:56    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Dim 20 Déc 2009 - 15:53    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

OUAH ! Tu as fait un topic ASM, Niark je t'adoorrrreee ! love

Bon. J'ai jeté un oeil sur le sledge bros. C'est compliqué.
Tu veux faire un boss alors même que tu te lances dans le custom sprite ? tu es fou. Com-plè-te-ment taré.

C'est bien.
lol'XDptdr

Plus sérieusement, c'est un gros défi de vouloir faire ça, mais c'est faisable.
Le truc, c'est que comme tu l'as fait, quand on fait un custom sprite, il faut souvent copier le code des autres. Généralement, ils ont déjà fait ceux que tu veux faire, alors pourquoi s'en priver ? Là, pour faire un méga bros, il faut regarder le sledge bros, le boomerang bros, et enfin n'importe quel sprite 32*32 sur smwcentral.
Mais je ne vais pas faire le sprite moi-même, car ça serait un topic request. Donc, pour t'aider, je vais juste commenter un peu mieux le code du sledge bros. Mais avant, veux-tu faire un sprite qui avance et recule (compliqué...) ou statique (10 fois plus facile) (mais qui saute quand même) ?


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sledge Brother, by mikeyk
;;
;; Description:
;;
;; Uses first extra bit: NO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

JUMP_TIMER = $163E
RAM_ThrowTimer = $1504

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sprite data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TIME_TO_LOCK = $28

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SUB_GET_DIR
TYA
STA $157C,x

LDA $1588,x
ORA #$04
STA $1588,x ; le status du sprite est initiallement "on ground"

STZ $1602,x ; truc qui sert au GFX, t'en aura pas besoin si tu veux un sprite statique

TXA
AND #$03
ASL A
ASL A
ASL A
ASL A
PHA
ASL A
ADC #$32
STA RAM_ThrowTimer,x ; valeur du hammer timer initialle, voire plus bas (j'ai l'impression que c'est mis aléatoirement...)

PLA
ADC #$FE
STA JUMP_TIMER,x ; valeur du saut timer init, même principe que le hammer timer mais pour le saut, voire plus bas pour l'explication exacte

RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite JSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

DecrementTimers:
LDA $14C8,x
CMP #$08
BNE DoneDec
LDA $9D
BNE DoneDec
LDA RAM_ThrowTimer,x
BEQ DoneDec
DEC RAM_ThrowTimer,x ; timer du marteau = le temps que va mettre sledge bro avant de générer un marteau, ici on le décrémente et
DoneDec: ; quand il arrivera à une certaine valeur, zou ! on lance un marteau et on recharge le timer.
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite routine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TIME_TO_SHOW = $22 ;time to display the boomerang before it is thrown

X_SPEED dcb $00,$FC,$00,$04 ;rest at bottom, moving up, rest at top, moving down
TIME_IN_POS dcb $48,$10,$48,$10 ;moving up, rest at top, moving down, rest at bottom
TIME_TILL_THROW dcb $43,$3C ; des tables, quoi, pas de quoi sauter au plafond.

STAR INC RAM_ThrowTimer,x
RETURN RTS
START_HB_CODE JSR SUB_GFX ; draw hammer bro gfx
LDA $14C8,x ; \ if hammer bro status != 8...
CMP #$02 ; } ... not (killed with spin jump [4] or star[2])
BEQ STAR
CMP #$08
BNE RETURN ; / ... return
LDA $9D ; \ if sprites locked...
BNE RETURN ; / ... return
; là c'est facile

JSR SUB_GET_DIR ; \ always face mario
TYA ; |
STA $157C,x ; / là aussi


JSR SUB_OFF_SCREEN_X3 ; only process hammer bro while on screen
INC $1570,x ; increment number of frames hammer bro has been on screen

LDA $1570,x ; \ calculate which frame to show:
LSR A ; |
LSR A ; |
LSR A ; |
LSR A ; |
AND #$01 ; | update every 16 cycles if normal
STA $1602,x ; / write frame to show
;sert pour les GFX encore

LDA RAM_ThrowTimer,x ; \ si le hammer timer est au dessus de 22,
CMP #TIME_TO_SHOW ; | on continue normallement
BCS JUMP_SPRITE ; / sinon, on se prépare à lancer un marteau
INC $1602,x
INC $1602,x ; truc de GFX

LDA RAM_ThrowTimer,x ; \ si c'est pas 0 au timer hammer,
BNE NO_RESET ; | on recharge pas
LDY $C2,x
LDA TIME_TILL_THROW,y
STA RAM_ThrowTimer,x ; recharge du timer
NO_RESET CMP #$01 ; si le timer hammer est à 1
BNE JUMP_SPRITE ; faire le code en dessous, sinon continuer normallement
LDA $C2,x
EOR #$01
STA $C2,x ; supposition : impliqué dans le pseudo aléatoirisme du lancer de marteau
JSR SUB_HAMMER_THROW ; / on lance un marteau
LDA #$20
STA $1DF9 ; un peu de bruit

JUMP_SPRITE LDA JUMP_TIMER,x
CMP #$40 ; |
BCS WALK_SPRITE ; / si le jump timer est à 40, on se prépare à sauter
LDA $1602,x ; \ on locke l'image
ORA #$01 ; |
STA $1602,x ; /
INC $1540,x ; on ne bouge plus !
STZ $B6,x ; stop sprite from moving
LDA JUMP_TIMER,x
CMP #$38 ; si le timer est à 38...
BNE NO_JUMP2
LDA #$B0 ; \ ...on saute !!
STA $AA,x ; /
BRA APPLY_SPEED
NO_JUMP2 CMP #$00 ; sinon, s'il est à 0, on le recharge
BNE APPLY_SPEED
LDA #$FE
STA JUMP_TIMER,x ; recharge

BRA APPLY_SPEED

WALK_SPRITE LDA $151C,x ;
TAY ;
LDA $1540,x ;
BEQ CHANGE_SPEED ;
LDA X_SPEED,y ; | set y speed
STA $B6,x ; /
BRA APPLY_SPEED ; tout plein de vitesse quand il marche, inutile s'il est statique

CHANGE_SPEED LDA TIME_IN_POS,y ;
STA $1540,x ;
LDA $151C,x
INC A
AND #$03
STA $151C,x ; encore pluche de vitesse thing

APPLY_SPEED LDA $1588,x ; on préserve le status maintenant
PHA ;

JSL $01802A ; update position based on speed values

LDA $1588,x ; si le status maintenant (après avoir mis à jour sa position) est "on ground"...
AND #04 ;
BEQ IN_AIR ;
PLA ; ...et qu'avant il ne l'était pas...
AND #04 ;...ça veut dire qu'il vient d'atterrir...
BNE CHECK_TOUCH ;...donc on secoue le sol
LDA #TIME_TO_LOCK ; \ shake ground
STA $1887 ; /

LDA #$09 ; \ play sound effect
STA $1DFC ; / du bruit, toujours du bruit

LDA $77
AND #$04
BEQ CHECK_TOUCH ; si Mario est au sol...
LDA #TIME_TO_LOCK ; set timer to freeze mario
STA $18BD

BRA CHECK_TOUCH

IN_AIR PLA

CHECK_TOUCH LDA $1588,x ; \ if hammer bro is touching the side of an object...
AND #$03 ; |
BEQ DONT_CHANGE_DIR ; |
LDA $151C,x
INC A
AND #$03
STA $151C,x ; si le sledge bro touche un objet (ce qui est inutile s'il est statique), on flip ça direction

DONT_CHANGE_DIR JSL $018032 ; interact with other sprites
JSL $01A7DC ; check for mario/hammer bro contact

NO_CONTACT RTS ; return ; là, facile Smile

J'ai enlevé toutes les routines de la librairie, ainsi que la hammer routine (c'est celle que tu devras recopier texto pour générer ton marteau) et la GFX routine (on s'en fout, puisque tu recopieras une routine GFX d'un sprite 32*32).

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Dim 20 Déc 2009 - 20:37    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Mmh ... en fait c'est juste de l'assemblage ... il suffit que je mixe des sprites ... mais par contre il faudrait qu'il lance des mateaux ET des boomerangs ... ça c'est plus chaud :p

Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Dim 20 Déc 2009 - 21:27    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Mais non mais non, c'est pas chaud, il suffit qu'au lieu de faire un JSR SUB_HAM_THROW, tu fasses un JSR_PREPARETHROW, et qu'à PREPARETHROW, tu fasses une sorte de :
LDA $aléatoire
BEQ/BNE hammer
JSR SUB_BOOM ; génération d'un boomerang, copier la routine depuis le boom bro
RTS
hammer:
JSR SUB_HAMMER ; idem avec hammer
RTS

Pour le LDA aléatoire, je propose de créer une routine génératrice de nb aléatoire (0 ou 1) ; un JSR sur cette routine suffira.
Par chance, j'ai concocté sous la douche une routine de nb aléatoire :
Aleatoire:
DEC
PHA
LDA $13
ADC $0DBE
ADC $0DBF
ADC $D2
ADC $D4
ADC $0F30
ADC $0F33 ; voilà qui devrait suffire
AND $01,s
BEQ win
PLA
LDA #$00
RTS
win:
PLA
LDA #$01
RTS

En entrée (c'est-à-dire avant de faire JSR), tu mets dans l'A un nombre N, et en sortie (après le JSR), tu obtiens une probabilité de 1/N d'avoir #$01 dans l'A. Attention, N doit être une puissance de 2 (2, 4, 8, 16, ...). Dans ton cas, pour avoir équitablement un marteau et un boom, N=2. Mais j'ai peur que trop de boomerang fasse un slowdown, donc peut être que N=4 serait plus adapté ? A toi de tester et de voir.

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Dim 20 Déc 2009 - 21:35    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Nan normalement les Boomerangs devraient pas créer de slowdonws ...
J'essaierai ta technique ... Smile
Merci ^^


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 21 Déc 2009 - 12:39    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Sisi, imagine un boom bros qui lance des boomerang à la même fréquence que des marteaux ; évidemment, faudrait voir ce que ça donne in-game, mais il y a quand même un ptit risque.

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 12:42    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Mmh ... ouais c'est vrai ... mais le Sledge Bros. lance des marteaux plus lentement Wink
Au pire on peut toujours réduire la vitesse ...


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 18:35    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

SL, toi qui t'y connais, tu pourrais me dire s'il y a moyen d'insérer de l'HDMA sur une rom déjà hackée ?

Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 21 Déc 2009 - 18:52    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Voui. Et même pas besoin de l'hdma tool. awesome
C'est ce que j'ai montré sur le topic HS.

Pourquoi cette question ? tu veux te lancer dans l'hdma ? là tu vas un peu vite Razz

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 19:35    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

J'ai déjà fait de l'HDMA sur mon SMBBK bêta ... avec succès ^^
Mia sje voudrais juste faire un HDMA sans couleur pour faire un effet underwater Smile


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 21 Déc 2009 - 19:57    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Le Comte Niark a écrit:
J'ai déjà fait de l'HDMA sur mon SMBBK bêta ... avec succès ^^

Sans le hdma tool ?

Le Comte Niark a écrit:

Mia sje voudrais juste faire un HDMA sans couleur pour faire un effet underwater Smile

Pas compris là...

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 20:00    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

J'veux faire un effet comme si on est sous l'eau, tu vois maintenant ? :p
Mais avec le HDMA Design Kit ...


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 21 Déc 2009 - 20:08    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Ah d'accord. Le H-Scroll quoi ?

Moi je ne sais faire que sans le hdma tool (que je trouve nul !). Pour faire avec le hdma tool, demande à Lexou, c'est lui qui manipule bien ce truc.

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 20:47    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Pas besoin, je sais déjà qu'avec l'HDMA Design Kit faut le faire avant tout ...
Tu peux pas me faire l'HDMA ? Embarassed


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Lun 21 Déc 2009 - 21:20    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

!FREERAM = $7FA100



LDA $1E
STA !FREERAM
LDA $1F
STA !FREERAM+$01
LDA $1E
CLC
ADC #$01
STA !FREERAM+$02
LDA $1F
ADC #$00
STA !FREERAM+$03
LDA $1E
SEC
SBC #$01
STA !FREERAM+$04
LDA $1F
SBC #$00
STA !FREERAM+$05


REP #$20

LDA #$1042 ; $43X0 = 42
STA $4330 ; $43x1 = 0F

SEP #$20
LDA.b $13
LSR
LSR
AND.b #%00000011
;TAX
BEQ frame01
CMP #$01
BEQ frame02
CMP #$02
BEQ frame03

REP #$20
LDA #frame4
BRA oncontinue

frame01:
REP #$20
LDA #frame1
BRA oncontinue


frame02:
REP #$20
LDA #frame2
BRA oncontinue

frame03:
REP #$20
LDA #frame3

oncontinue:
;REP #$20
;LDA Ptrtable,x
;LDA #LVL1REDPOINTER ; get pointer to red color table
STA $4332 ; store it to low and high byte pointer
PHK ; get bank
PLY ;
STY $4334 ; store to bank pointer byte
LDY #$7F
STY $4337 ; set indirect bank byte
; other code
SEP #$20
LDA #$08 ; Enable HDMA on channels 3
TSB $0D9F ;
RTS

Ptrtable:
dw frame1
dw frame2
dw frame3
dw frame4

frame1:
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $00
frame2:
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $00
frame3:
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $00
frame4:
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $0C,$00,$A1
db $0C,$04,$A1
db $0C,$00,$A1
db $0C,$02,$A1
db $00

RTS


Tiens, tu as juste à mettre ça dans le patch level.asm et tu auras ton H-Scroll.
Par contre, si tu veux des modifications (affecte le layer 1, le layer 2, les deux, H scroll plus fin, plus d'amplitude), dis-le. Pour le moment, ça n'affecte que le BG.

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Lun 21 Déc 2009 - 21:29    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Oki ... mais en fait faudrait que tout soit affecté, sprites. BG, FG ... et même si possible ... le layer 3 :p

EDIT : Mais ... j'ai jamais utilisé LevelASM XD
Je viens de télécharger Ersanio's LevlASM + INIT ... y'a 5 fichiers ASM :
- level.asm
- levelcode.asm
- levelinit.asm
- levelinitcode.asm
- levelpointers.asm

Déjà, je copie ça où ? Et où ça dans le fichier ? :p


Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Mar 22 Déc 2009 - 12:24    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Alors... Layer 1,2,3 seront affectés, mais les sprites, je ne peux pas.
Pour level.asm : c'est très simple d'utilisation, je t'assure. Tu patcheras level.asm avec xkas, en prenant soin de mettre les autres fichiers dans le même dossier (celui de xkas donc). Le code que j'ai mis plus haut, tu as juste à le mettre dans le fichier levelcode.asm, là où évidemment il y a le numéro de ton niveau.

PS : bien sûr, tu patches après avoir inséré le code dans levelcode.asm. C'est évident, mais on ne sait jamais, mieux vaut être trop précis que pas assez...

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Mer 23 Déc 2009 - 18:13    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

OK ... j'espère juste qu'il n'y aura pas de bugs :p

Revenir en haut
SL
Modérateur global
Modérateur global

Hors ligne

Inscrit le: 29 Mai 2008
Messages: 4 003
Points étoile: 7 077
Moyenne des points: 1,77
Potentiel de hack:
Localisation: Coincé dans le bonus game
Masculin Cancer (21juin-23juil) 猴 Singe

MessagePosté le: Mar 29 Déc 2009 - 13:01    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

Alors, c'est bon ? ça marche ? je peux passer au layer 1 et 3 ?

______________________


Mais, je lis pas de manga !


Revenir en haut
Niark
Admin des Ténèbres
Admin des Ténèbres

Hors ligne

Inscrit le: 30 Oct 2008
Messages: 3 414
Points étoile: 1 949
Moyenne des points: 0,57
Potentiel de hack:
Masculin Poissons (20fev-20mar) 龍 Dragon

MessagePosté le: Mar 29 Déc 2009 - 13:17    Sujet du message: ASM ... les programmeurs en herbe ... ou pas ! Répondre en citant

J'ai pas encore testé x)

Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 04:28    Sujet du message: ASM ... les programmeurs en herbe ... ou pas !

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Lunariville Index du Forum -> Lunar magic et le romhacking de SMW -> Aide au smwhacking Toutes les heures sont au format GMT + 2 Heures
Aller à la page: 1, 2, 3, 4, 5, 6, 7, 8  >
Page 1 sur 8

 
Sauter vers:  

Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com
Thème Lunariville: Shadoxx Aurion
Thème basé sur Pluminator: Maëlstrom