ASM6 (v1.4): A 6502 assembler by loopy (loopy at mm.st)
Escrito el Martes 07 de Abril del 2009 por Ealdor
http://home.comcast.net/~olimar/NES/
Yes, it's another 6502 assembler. I built it to do NES development, but you can probably use it for just about anything. Why use this instead of one of the other zillion assemblers out there? I don't know, but choice is good, right? :) I wrote it because I thought most others were either too finicky, had weird syntax, took too much work to set up, or too bug-ridden to be useful.
This is free software. You may use or distribute it in any fashion.
[A] Command line
Usage:
asm6 [-options] sourcefile[.asm|.s] [outputfile] [listfile]
Options:
-? Show some help -l Create listing -L Create verbose listing (expand REPT, MACRO) -d: Define a symbol and make it equal to 1 Default output is .bin Default listing is .lst
[B] Syntax
Comments begin with a semicolon (;). A colon (:) following a label is optional.
examples:
lda #$00 ;hi there
label1: jmp label2
label2 beq label1
[C] Numbers and expressions
Hexadecimal numbers begin with '$' or end with 'h'. Binary numbers begin with '%' or end with 'b'. Characters and strings are surrounded by single or double quotes. The characters (' " \) within quotes must be preceded by a backslash (\).
examples:
12345
'12345'
$ABCD
0ABCDh
%01010101
01010101b
Supported operators (listed by precedence):
( )
(unary) + - ~ ! < >
* / %
+ -
<< >>
< > <= >=
= == != <>
&
^
|
&&
||
'=' and '<>' are equivalent to C's '==' and '!=' operators. The unary '<' and '>' operators give the lower and upper byte of a 16-bit word (respectively). All other operators function like their C equivalents.
[D] Labels
Labels are case sensitive. '@' and '.' characters can be used in labels but have no special meaning like in other assemblers. The special '$' label holds the current program address. Labels beginning with one or more '+' or '-' characters are special temporary labels, useful for forward and reverse branches. They can be reused, so you don't need to make a new name for every branch you make.
example:
-- ldx #0
- lda $2002 ;loop (wait for vblank)
bne -
- lda $2002 ;temp labels are easy to reuse..
bne -
cpx #69
beq + ;forward branch..
cpx #96
beq +here ;use more characters to make more unique
jmp -- ;multiple --'s handy for nested loops
+ ldx #0
+here nop
[E] Assembler directives (in no particular order)
All directives are case insensitive and can also be preceded by a period (.)
EQU
For literal string replacement, similar to #define in C.
one EQU 1 plus EQU + DB one plus one ;DB 1 + 1
=
Unlike EQU, statements with '=' are evaluated to a number first. Also unlike EQU, symbols created with '=' can be reused.
i=1 j EQU i+1 k=i+1 ;k=1+1 i=j+1 ;i=i+1+1 i=k+1 ;i=2+1
INCLUDE (also INCSRC)
Assemble another source file as if it were part of the current source.
INCLUDE whatever.asm
INCBIN (also BIN)
Append the contents of a file to the assembly output and add its size to the program address.
moredata: INCBIN whatever.bin
DB, DW (also BYTE/WORD, DCB/DCW, DC.B/DC.W)
Define byte(s) or word(s). Multiple arguments are separated by commas. Strings can be "shifted" by adding a value to them (see example).
DB $01,$02,$04,$08 DB "ABCDE"+1 ;equivalent to DB "BCDEF" DB "ABCDE"-"A"+32 ;equivalent to DB 32,33,34,35,36
HEX
Compact way of laying out a table of hex values. Only raw hex values are allowed, no expressions. Spaces can be used to separate numbers.
HEX 456789ABCDEF ;equivalent to DB $45,$67,$89,$AB,$CD,$EF HEX 0 1 23 4567 ;equivalent to DB $00,$01,$23,$45,$67
DSB, DSW (also DS.B/DS.W)
Define storage (bytes or words). The size argument may be followed by a fill value (default filler is 0).
DSB 4 ;equivalent to DB 0,0,0,0 DSB 8,1 ;equivalent to DB 1,1,1,1,1,1,1,1 DSW 4,$ABCD ;equivalent to DW $ABCD,$ABCD,$ABCD,$ABCD
PAD
Fill memory from the current address to a specified address. A fill value may also be specified.
PAD $FFFA ;equivalent to DSB $FFFA-$ PAD $FFFA,$EA ;equivalent to DSB $FFFA-$,$EA
ORG
Set the starting address if it hasn't been assigned yet, otherwise ORG functions like PAD.
ORG $E000 ;start assembling at $E000 . . . ORG $FFFA,$80 ;equivalent to PAD $FFFA,$80
ALIGN
Fill memory from the current address to an N byte boundary. A fill value may also be specified.
ALIGN 256,$EA
FILLVALUE
Change the default filler for PAD, ALIGN, etc.
FILLVALUE $FF
BASE
Set the program address. This is useful for relocatable code, multiple code banks, etc. The same can also be accomplished by assigning the '$' symbol directly (i.e. '$=9999').
oldaddr=$ BASE $6000 stuff: . . . BASE oldaddr+$-stuff
IF / ELSEIF / ELSE / ENDIF
Process a block of code if an expression is true (nonzero).
IF j>0
DB i/j
ELSE
DB 0
ENDIF
IFDEF / IFNDEF
Process a block of code if a symbol has been defined / not defined.
IFDEF _DEBUG_
.
.
.
ENDIF
MACRO / ENDM
MACRO name args...
Define a macro. Macro arguments are comma separated. Labels defined inside macros are local (visible only to that macro).
MACRO setAXY x,y,z
LDA #x
LDX #y
LDY #z
ENDM
setAXY $12,$34,$56
;expands to LDA #$12
; LDX #$34
; LDY #$56
REPT / ENDR
Repeat a block of code a specified number of times. Labels defined inside REPT are local.
i=0
REPT 256
DB i
i=i+1
ENDR
ENUM / ENDE
Reassign PC and suppress assembly output. Useful for defining variables in RAM.
ENUM $200 foo: db 0 foo2: db 0 ENDE