NAME

CPU::Emulator::DCPU16 - an emulator for Notch's DCPU-16 virtual CPU for the game 0x10c

SYNOPSIS

open(my $fh, ">:raw", $file) || die "Couldn't read file $file: $!";
my $program = do { local $/=undef; <$fh> };
$program    = CPU::Emulator::DCPU16::Assembler->assemble($program) if $file =~ /\.dasm(16)?$/;  

# Create a new CPU and load a file
my $cpu = CPU::Emulator::DCPU16->new();
$cpu->load($program);

# Run it ...
$cpu->run;
# ... which is basically the same as
do { $cpu->step } until $cpu->halt;

DESCRIPTION

DCPU-16 is a spec for a virtual CPU by Notch from Mojang (of Minecraft fame).

The spec is available here

http://0x10c.com/doc/dcpu-16.txt

METHODS

new

Create a new CPU.

load <program> [opt[s]]

Load a program. Forces as re-init of the CPU.

You can also do

my $cpu = CPU::Emulator::DCPU16->load($program, %opts);

which is exactly the same as

my $cpu = CPU::Emulator::DCPU16->new(%opts);
$cpu->load($program);

bytes_to_array <bytes>

Turn a scalar of bytes into an array of words

map_device <class> <start address> <end address> [opt[s]]

Map a device of the given class to these addresses

run [opt[s]]

Run CPU until completion.

Options available are:

debug

Whether or not we should print debug information and at what level.

Default is 0 (no debug output).

limit

Maxinum number of instructions to execute.

Default is 0 (no limit).

cycle_penalty

The time penalty for each instruction cycle in milliseconds.

Default is 0 (no penalty)

full_memory

Allow the PC to continue past the last instruction of the program (i.e the program_top).

This would allow programs to rewrite themselves into a larger program.

Default is 0 (no access)

step [opt[s]]

Run a single clock cycle of the CPU.

Takes the same options as run.

METHODS TO GET THE STATE OF THE CPU

pc

The current program counter.

sp

The current stack pointer.

o

The current overflow.

halt [halt state]

Halt the CPU or check to see whether it's halted.

program_top

The address of the first memory location after the loaded program.

register <location>

Get or set the value of a register.

memory <location>

Get or set the value of a memory location.

SEE ALSO

CPU::Emulator::DCPU16::Assembler

CPU::Emulator::DCPU16::Disassembler

ACKNOWLEDGEMENTS

Implementation inspiration came from:

Matt Bell's Javascript implementation (https://github.com/mappum/DCPU-16)
Brian Swetland's C Implementation (https://github.com/swetland/dcpu16)
Jesse Luehrs's Perl Implementation (https://github.com/doy/games-emulation-dcpu16)

AUTHOR

Simon Wistow <simon@thegestalt.org>

COPYRIGHT

Copyright 2011 - Simon Wistow

Released under the same terms as Perl itself.

DEVELOPMENT

Latest development version available from

https://github.com/simonwistow/CPU-Emulator-DCPU16