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 git@github.com: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.