Sorry I've been away from Console land for a while, could have saved you some pain.
The problem is you are looking at Console tools and not Computer tools. SNES and NES land is rather barren compared to C64 land.
64Tass is what you want.
It has N stack structs, so you can do
sScoreValues .struct
digit65 .byte ?
digit43 .byte ?
digit21 .byte ?
.ends
and then latter you have
Score .dstruct sScoreValues
HiScore .dstruct sScoreValues
or even
.block Scores
Current .dstruct sScoreValues
HiScore .dstruct sScoreValues
.endb
which you can access in code as
LDA Scores.Current.Digit21
You might notice the ?s above. This tells the assembler that I want some space but it doesn't need to actually put it into the output. If I put a 0 there then it would make sure the output covered that area and it was internalised to 0.
It has sections
* = $02
.dsection zp ;declare zeropage section
.cerror * > $30, "Too many zeropage variables"
and then later if I want to add a variable for some code I can do
.section zp
PlayerHasCape .byte ?
.send zp
awardPlayerCape
inc zp.PlayerHasCape
rts
This was I can declare the variables used by some code, even in a different file, and have it put into the Zero Page/Direct Page. without needing to worry about exactly where it is.
This becomes more useful when combined with .proc which declarers a procedure, and if it doesn't find any label references to it, then it will not be assembled. Using Sections means it data needs are also not assembled.
You can do Org and Logical ( which stacks ) so if you want to put code to 8000, that is loaded into 7F2000 to be run in ram you can do this
* = $8000
.logical =$2000
lda #1
jmp Ahead
Lda #3
Ahead
.here
and Ahead will be $2008
It lets you do
.as, .xs a and or x/y is 8 bit
.al .xl a and or x/y is 16bit
.autsiz track the rep/seps
.mansiz ignore and take your values
It has Databank and ProgramBank control
You can also set them be ? which disables the addressing modes, forcing abs at all time
you can also use ,b and ,d addressing modes to force
lda $8005,d will give you lda $05 regardless if the current bank is set to $80
There is a --shadow-check option that tells the compiler to warn if one label is forced over another
You can use the @b,@w or @l to force 8,16 or 24 bit addressing, so
lda @w$0000
force AD 00 00
you can also use the ~ form so lda $~0000
you can use .page .epage to error if code crosses a page and hence changes timings
you can use .align if you need it for speedcode so
.algin $ff <- forces next instruction to be the first byte in a page
It has psudeo opcodes
GEQ, GNE, GCC, GCS, GPL, GMI, GVC, GVS, GLT and GGE.
GRA for CPUs supporting BRA, which is expanded to BRL (if available) or JMP.
This will be a BXX instuction if it is range or the assembler will invert the XX and put a jump so
GEQ Label out of range becomes
BNE *+3
JMP Label
It has others like blt is bcc lsr lsl etc
The latest bleeding edge version has Optimisation support, in the assembler will detect and warn about unnecessary op-codes or where a branch can be used to save a byte etc
Full details can be found here
http://tass64.sourceforge.net/