A SNES 65816 Cross Assembler for the IBM PC
Version 1
Introduction
SNASM is a 65816 Cross Assembler which produces SNES code in Super Magicom format.
SNASM is a fast 2 pass assembler, supporting source and binary include files, generation of listing files and labels files, generation of executable or object files and support for all 65816 instructions and addressing modes.
Command Line Options
The assembler is executed with the following command:
SNASM <filename> {<options>}
<filename>
is the filename of the source code that you want to assemble.
The following options are available:
LIST
This generates a ".lis" listing file which interleaves the code generated with the source code.
LABELS
This generates a ".lab" file which contains all the public labels in alphabetic order.
OBJECT
If this option is not specified, the assembler will generate an executable ".smc"
file. The executable file will have a 512 byte Super Magicom header and will be padded to a bank boundary. If this option is specified, the assembler will generate an object ".obj" file. This will not have a SMC header and will not be padded to a bank boundary.
Pseudo Op Codes
ORG <absolute location>
This is used to set the start location for the assembly and must be specified before any instructions. Note that the start location must reside within valid code space (ie. lower 16-bits in $8000
to $FFFF
).
Eg. ORG $8000 ; start assembly at location $8000
PAD
This will cause padding with 0
's to the next bank boundary. Note that if already at a bank boundary, then this will have no effect.
PAD <absolute location>
This will cause padding with 0
's to the specified location. Note that the location must reside within valid code space.
Eg. PAD $018000 ; pad to location $018000
INCLUDE "<filename>"
This will include the specified source file.
Eg. INCLUDE "equates.h" ; include the source file "equates.h"
INCBIN "<filename>"
This will include the specified binary file.
Eg. INCBIN "screen.dat" ; include the binary file "screen.dat"
DC.B <expression>|<string>{,<expression>|<string>}
This defines constant byte data.
Eg. DC.B "jethro",1,2,3,4+5/3,label1-label2,"tull"
DC.W <expression>{,<expression>}
This defines constant word data in 65816 low byte, high byte ordering.
Eg. DC.W $1234,$5678,$9ABC,%1010101010101010
DC.L <expression>{,<expression>}
This defines constant long data in 65816 low byte, middle byte, high byte ordering.
Eg. DC.L $018000,$028000,$038000,$048000
<label> EQU <expression>
This will equate the label to the expression.
Eg. ScreenMode EQU $2105
PUBLIC <label>
Indicates that a label should appear in the .LAB
file.
Expressions
The following operators are provided for forming expressions:
+ ... add
- ... negate/subtract
* ... multiply
/ ... divide
& ... and
| ... or
Expressions are evaluated in left to right order without any operator precedence.
Eg.
10+20/10 evaluates to 3
$123456/$100&$FF evaluates to $34
-32/2+-8 evaluates to -24
Note that parenthesis are not provided.
Values and Labels
Values may be specified in either decimal, hex (when preceded by a $
) or binary (when preceded by a %
).
Labels can be up to 32 characters long and must start with an alphabetic character or an underscore. Labels may only contain alphanumeric and underscore characters. Note that labels are case sensitive but instructions and pseudo op codes are not case sensitive. A maximum of 8000 labels may be defined.
Eg.
start ... is a valid label
START ... is also a valid label, but different from above
7up ... is not a valid label (it's a soft drink)
_7up ... is a valid label
Size Specifiers
Some assembly instructions may have 1, 2 or 3 byte operands. In order to indicate to the assembler the mode required, ".B"
, ".W"
and ".L"
size specifiers are available.
Eg.
LDA.B #$00 specifies LDA with immediate single byte operand $00
LDA.W #$00 specifies LDA with immediate word operand $0000
LDA.L $00 specifies LDA with absolute long operand $000000
If the size specifier is omitted, the following defaults will be used:
immediate ... ".B"
absolute ... ".W"
absolute,x ... ".W"
absolute,y ... ".B"
indirect ... ".B"
Note that some instructions do not require size specifiers. Rather than ignore these, the assembler will report an error as they make the source code confusing.
Addressing Modes
mode format
implied no operand
immediate (byte) #byte
immediate (word) #word
absolute word
absolute,x word,x
absolute,y word,y
indirect (word)
indirect,x (word,x)
absolute long long
absolute long,x long,x
direct byte
direct,x byte,x
direct,y byte,y
indirect direct (byte)
indirect direct,x (byte,x)
indirect direct,y (byte),y
long indirect direct [byte]
long indirect direct,y [byte],y
stack relative byte,s
indirect stack relative,y (byte,s),y
8-bit relative offset byte
16-bit relative offset word
The mnemonics are taken from the article in BYTE August 1984 entitled "The 65816 Microprocessor, Part 1: Software". The only differences are that the BRK and COP instructions take an immediate byte operand and MVP and MVN take an immediate word operand.
Defining The Run Address
The run offset for a program is defined at location $FFFC
. So to set the run/reset offset you should PAD to $FFFC
then declare it.
Eg.
PAD $FFFC
DC.W $8000 ; run from location $8000