Small assembler for Gameboy assembly programs written in Swift.
Assembly syntax mostly follows other assemblers, but is probably not compatible.
Takes an assembly file as input, produces a binary, which can be executed in a Gameboy emulator.
Is fairly feature complete, supports all of the instruction set. Still missing some nice-to-have features, see the todo below.
Here is a small example Gameboy program, which displays a smiley sprite on screen:
# Simple smiley
# Displays a smiley sprite in the upper left corner of the screen
bg_tile_map = 0x9800
bg_tile_data = 0x9000
[org(0x4000)] graphics: db 0x00, 0x24, 0x24, 0x00, 0x81, 0x7e, 0x00, 0x00
[org(0x100)] start: nop; jp main
[org(0x134)] game_title: db "SMILEY"
[org(0x150)] main:
# Set LCDC (bit 7: operation on, bit 0: bg and win on)
ld hl, 0xff40
ld [hl], (1 | (1 << 7))
# Set first bg tile
ld h, (bg_tile_map >> 8)
ld l, (bg_tile_map & 0xff)
ld [hl], 1
# Set the tile data
ld h, (bg_tile_data >> 8)
ld l, ((bg_tile_data & 0xff) + 16)
ld b, 8
ld de, 0x4000
loop:
ld a, [de]
inc de
ld [hl+], a
ld [hl+], a
dec b
jp nz, loop
# Set bg palette data
ld hl, 0xff47
ld [hl], 0xe4
end: jp end
[org(0x7fff)] pad: db 0x00
This is how it looks:
There are more examples in the examples folder:
Smiley sprite | Hello world | Directional pad movement
Quick start:
git clone [email protected]:ulrikdamm/Assembler.git
cd Assembler
swift build -c release
./.build/release/Assembler input.asm
You can compile the app from the Xcode project or by running swift build
(the executable will be in .build/debug/Assembler)
You compile source code with Assembler input.asm
.
It also contains a dynamic framework which you can import into a macOS or iOS app.
The assembler is stable and able to produce working binaries. See below for which features are supported and which are yet to come.
๐ Optional linker output showing all symbol locations (run with --output-symbols
)
๐ Relative jumps (jr
)
๐ Updated syntax (uses [] instead of () for direct memory access, as in ld a, [0xff46]
)
๐ Example code showing gamepad input and DMA transfers
๐ Fixed problems with loads between a and memory that wouldn't assemble properly
๐ Ability to use labels in expressions (e.g. ld a, (data_end - data)
)
๐ Allows empty labels (useful for the first point)
๐ Better command line interface, allows relative paths
๐ Updated examples
๐ Fixed loading of values between A and memory addresses (e.g. ld a, (0xff00 + 0x44)
)
โ
Assembly parsing
โ
Code generation
โ
Linking
โ
All of the Gameboy instruction set
โ
Error reporting with line numbers
โ
Command line interface
โ
Constant defines
โ
Build-time expressions
โ
Strings
โก๏ธ Imports and file modules
โก๏ธ Smart layout of disconnected blocks in linker
โก๏ธ Support for variables though ds
(define storage)
๐ More awesome example programs
๐ Sprite importer (manually entering pixel hex codes suck. Maybe a way of defining sprites in ASCII art?)
๐ Graphical code editor
Right now it's still a personal project, and I might not be accepting pull requests for new features. Bug fixes and more tests are welcome though.
If you find a bug or a missing feature, feel free to submit an issue.