(C) 2012-2013 Tobias Gierke / licensed under Apache License 2.0, http://www.apache.org/licenses/LICENSE-2.0
Everyone and his dog is writing assemblers for the upcoming game 0x10c game by Mojang, so I thought I'd give it a shot too...
-
Fully supports DCPU-spec 1.7
-
this assembler is intended to be embedded in an editor/IDE so it contains all the necessary hooks along with support for navigating from source code to AST nodes and vice versa
-
Expression support
Currently supported operators are () + - * / % << >>
SET A , (((0xff+0b1011)*2+label1+label2)) << 4
SET B , [ 1+2+label1+A+label2]
label1:
label2:
-
Generates short-form opcodes for both literal values and labels (multi-pass assembler)
-
Support for local labels (currently disabled by default, pass '--local-labels' to compiler Main)
-
Constants supported ( .equ or #define )
-
Supports hexadecimal (0xdeadbeef) , binary (b101111) and decimal number literals
-
Supports setting up uninitialized memory of a specific size using '.bss ' or "reserve " keywords
-
Supports setting up initialized memory with byte / word size (using '.byte' or 'dat')
-
Supports 16-bit character literals
-
Supports source includes via '.include "somesource.dasm16" ' or ' .incsource "somesource.dasm16" '
-
Supports including binary files via '.incbin "pic.jpg"
Requirements:
- Java >= 1.7
- Maven 2.2.1
Simply running
mvn install
will create a self-executable JAR (jasm16.jar) inside the /target folder.
Do
java -jar jasm16.jar <compiler options>
to actually run the compiler.
Usage: [options] [-o <output file>] source1 source2 ...
-o => output file to write generated assembly code to, otherwise code will be written to source.dcpu16
-d or --debug => print debug output
--print => print formatted source code along with hex dump of generated assembly
--print-symbols => print symbol table
--local-labels => treat identifiers starting with a dot ('.') as local labels
--disable-literal-inlining => disable inlining of literals -1 ... 30
--dump => instead of writing generated object code to a file, write a hexdump to std out
--relaxed-parsing => relaxed parsing (instructions are parsed case-insensitive)
--relaxed-validation => out-of-range values only cause a warning)
-v or --verbose => print more verbose output during compilation
-
Labels are CASE-SENSITIVE
-
Instructions need to be written in upper-case (unless you compile with '--relaxed-parsing')
-
supported label styles are:
.label :label label: .localLabel :.localLabel
Note that support for local labels needs to be enabled explicitly.
- Supported number literals:
0xdeadbeef
1234566
0b10110111
- Indirect addressing uses angle brackets
SET [0x2000] , 1
SET [0x2000+A],1
-
Offsets, addresses and immediate values may be calculated using more or less arbitrary expressions
-
Supported expression operators are + - * / % << >> (with operator precedence according to C standard)
-
character literals need to be enclosed in either single or double quotes (")
.dat "Hello world"
Characters inside string literals may be escaped using a backslash.
- to define custom constants, use
.equ IDENTIFIER 1+2*3+37 << 3 ; arbitary expressions that may involve labels and other constants
- to create memory initialized with byte-sized values, use
.byte 0x01,0x02, 1+2 , 3*label+0x27 , IDENTIFIER
- to create memory initialized with word-sized values, use either
.word 0xdead,0xbeef .dat 0xdead,0xbeef dat 0xdead,0xbeef
- to create uninitialized memory of a specific size, use
.bss 1024 ; 1k of memory initialized to 0 reserve 1024 ; 1k of memory initialized to 0
- to include binary data from a file, use '.incbin "filename"'
- to include another source file, use '.include "filename"' or 'include "filename"'