Implementation of Notch's dcpu-16 CPU in Haskell. This project includes an assembler and an emulator.
We can assemble and run at least Notch's example program, this fibonacci
example, and the stuff in
Like the assembler Notch uses, short form for labels isn't supported yet.
The emulator just runs until it crashes (usually when it tries to execute a 0x0000 opcode), there is no stopping strategy for now.
cabal configure && cabal build
./dist/build/dcpu16-emulator/dcpu16-emulator --pretty out a.out
This gives you a pretty-printed memory dump in
out you can study.
We use a homogeneous
Memory type for all kinds of memory the CPU has access
- Special values such as
- Custom defined (i.e. not in the spec) values such as
- Registers (
These values can accessed by an
Address, which is a simple ADT:
data Address = Sp | Pc | Ram Word16 | ...
The core of the design is hence a monadic typeclass:
class Monad m => MonadEmulator m where load :: Address -> m Word16 store :: Address -> Word16 -> m ()
Currently, there is only one implementation of this class,
is able to simulate programs in a pure way (so a program is guaranteed to
always yield the same result!).
When the spec is better defined, an
IOEmulator will be added which will not be
pure, in order to be able to grab keyboard events and display video.