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.asmYou 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.
