We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS

Useful Code Snippets

From SnesLab
Revision as of 01:21, 7 September 2019 by Nambona890 (talk | contribs) (changed some summaries a tad)
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Useful code snippets for the 65c816 ASM and general SNES hardware.

65c816 S-CPU

General

Wait for H-Blank

-
BIT $4212
BVS -
-
BIT $4212
BVC -

Inverse the accumulator (8-bit)

By Nambona890

Works with SA-1.

EOR #$FF
INC

Inverse the accumulator (16-bit)

By Nambona890

Works with SA-1.

EOR #$FFFF
INC

Toggle Carry Flag Macro

Works with SA-1.

macro XOC()
	BCC ?set
	CLC
	BRA ?done
?set:	SEC
?done:
endmacro

Toggle Carry Flag Alternative (8-bit)

Works with SA-1.

ROL
EOR #$01
ROR

Toggle Carry Flag Alternative (16-bit)

Works with SA-1.

ROL
EOR #$0001
ROR

Long Branch Macros

Useful if you want to branch more than 0x80 bytes forward/backwards.

Works with SA-1.

macro JEQ(branch)
	BNE ?branch
	JMP <branch>
?branch:
endmacro

macro JNE(branch)
	BEQ ?branch
	JMP <branch>
?branch:
endmacro

macro JCC(branch)
	BCS ?branch
	JMP <branch>
?branch:
endmacro

macro JCS(branch)
	BCC ?branch
	JMP <branch>
?branch:
endmacro

macro JPL(branch)
	BMI ?branch
	JMP <branch>
?branch:
endmacro

macro JMI(branch)
	BPL ?branch
	JMP <branch>
?branch:
endmacro

macro JVC(branch)
	BVS ?branch
	JMP <branch>
?branch:
endmacro

macro JVS(branch)
	BVC ?branch
	JMP <branch>
?branch:
endmacro

SMW Hacking

Custom block template

By Alcaro

Works with SA-1.

db $42 ; or db $37
JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
JMP TopCorner : JMP BodyInside : JMP HeadInside
; JMP WallFeet : JMP WallBody ; if using db $37

MarioBelow:
MarioAbove:
MarioSide:

TopCorner:
BodyInside:
HeadInside:

WallFeet:
WallBody:

SpriteV:
SpriteH:

MarioCape:
MarioFireball:
RTL

Decompress GFX File

By Vitor Vilela

Works with SA-1.

; Decompress input GFX file
; Must be called from SNES CPU.
; SA-1 is automatically invoked on SA-1 Pack ROMs.

STZ $00
REP #$20
LDA #$7EAD	; destination buffer = $7EAD00
STA $01
LDA #$0080	; deoompress ExGFX80.bin ..
JSL $0FF900

Get acts like from map16 number

By Vitor Vilela

Works with SA-1.

; $00 = map16 tile
get_act_like:
	LDA $06F624
	STA $02
	LDA $06F625
	STA $03
	LDA $06F626
	STA $04
	
	REP #$30
	LDA $00
	AND #$3FFF
	ASL
	TAY
	LDA [$02],y
	STA $00
	SEP #$30
	RTS

Find free OAM slot

By Vitor Vilela

SA-1 hybrid.

; Routine for finding a free OAM slot
; NMSTL compatible. Tested against Level ASM, Overworld ASM.

find_oam:
	LDY #$FC
-	LDA $02FD|!addr,y
	CMP #$F0
	BNE +
	CPY #$3C
	BEQ +
	DEY
	DEY
	DEY
	DEY
	BRA -
+	RTS

Erase current save file

By Sixtare

Erase:
REP #$10
	LDA $010A
	CMP #$01
	BEQ .01
	BCS .02
.00
LDX #$008F
JMP .delete

.01
LDX #$011E
JMP .delete

.02
LDX #$01AD
	.delete
	LDY #$008F
	LDA #$00
-	STA $700000,x
	STA $7001AD,x
	DEX
	DEY
	BPL -
	SEP #$10
RTS

65c816 SA-1 CPU

Some snippets present on S-CPU section works with SA-1 CPU as well.

General

Unsigned 16 bit x 16 bit = 32 bit multiplication

By Akaginite

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 16bit * 16bit Multiplication SA-1 version
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Parameters
; $00-$01 : Multiplicand
; $02-$03 : Multiplier
; Return values
; $04-$07 : Product
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MathMul16_16:	STZ $2250
		REP #$20
		LDA $00
		STA $2251
		ASL A
		LDA $02
		STA $2253
		BCS +
		LDA.w #$0000
+		BIT $02
		BPL +
		CLC
		ADC $00
+		CLC
		ADC $2308
		STA $06
		LDA $2306
		STA $04
		SEP #$20
		RTS