Monster is an all-in-one development system comprised of an editor, assembler, debugger, and linker all running natively on the Commodore Vic-20. The design philosophy is uncompromising maximalism without sacrificing efficiency or code density. This is in contrast to most existing Vic-20 assemblers (and most native development tools on 8-bit computers in general), which not only put memory efficiency first and foremost, but also let it guide the overall usability and design.
Large RAM expansions have become ubiquitous on the Vic-20 in recent years, so the philosophy of this project is to provide a rich feature set for a generously expanded memory configuration. Virtually any feature that I deem valuable in an assembly IDE is implemented.
Features include:
- 40 column bitmap-based editor
- vi-like keybindings
- interactive source-level debugger
- linker
- breakpoint editor
- memory viewer/editor
- robust label support (including anonymous and local)
- save/load files and export to .PRG
- directory viewer
- symbol viewer
- auto-formatter and realtime syntax checking
- powerful macro support
- virtual memory for user program isolation
- 8x8 custom character editor
- many, many more...
For more information about each of the major components of Monster, refer to the documents linked below.
Monster requires a Final Expansion 3 to function. The Final Expansion 3 contains 512KB of expansion memory, which is available via 16 banks. Much of this RAM is used to store the multiple source code buffers (up to 8), but it is also used to store code, debug-info, and other data.
The banked memory allows the user program to execute in almost complete isolation. The user program state is entirely backed up in the FE3, which means that, although this environment consumes a vast amount of memory itself, everything except address $9c02 (the bank select register) and a couple tiny interrupt handlers is preserved when control moves between the editor and the user program. Moreso even than small monitor cartridges, the program itself is virtually unaware of the resident tooling.
Prebuilt binaries can be found for all the necessary files in the bin/ directory.
These can also be built from source with the Makefile. Build instructions can be found in the
next section of this README.
To run from Disk find the BOOT.PRG and MASM.PRG files. Write these to your disk of choice and load Monster as you would any other program on your Vic-20:
LOAD "BOOT.PRG",8,1
RUN
The cartridge binary, monster.bin, can be flashed to your FE3 to boot Monster directly from ROM.
Copy this file to your IEC storage device along with the installer (install.prg). Then run
the following commands on your Vic-20 from the BASIC prompt:
LOAD "INSTALLER.PRG",8,1
RUN
This will flash Monster to the Final Expansion. Reset the computer to enter Monster.
If you wish to run Monster in an emulator (VICE), ensure that VICE is installed on your
machine and run make start-disk or make start-cart from the root of the project to attach the
corresponding disk or cartridge image.
Alternatively, simply run VICE with the -cartfe argument:
xvic -cartfe monster.bin
- cc65 (tested with version 2.19)
- make
- python3 (any version should do)
The build process also requires python3 (any version should do).
Clone this repo git clone https://github.com/gummyworm/monster.git
cd to the directory you cloned to and run make for the appropriate target
Monster can be built for two targets: disk and cartridge. The disk format is useful if you want to test on your Final Expansion 3 without erasing its firmware.
The cartridge is a better choice for emulators or power users on real hardware. It loads significantly faster (although JiffyDOS mostly closes the gap between the two)
To build the disk version, run
make disk
To build the cart version, run
make cart
Here is a simple hello world program to demonstrate the basic syntax of the assembler:
.ORG $1400
START:
JSR $E5B5
LDX #$00
LDA #' '
CLR:
STA $1000,X
STA $1100,X
DEX
BNE CLR
DISP:
LDA MSG,X
BEQ DONE
JSR $FFD2
INX
BNE DISP
DONE:
JMP DONE
MSG:
.DB "HELLO WORLD!",0