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

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