--- M6502/M6502.pm 2007/07/30 15:45:03 27 +++ M6502/M6502.pm 2007/07/30 21:53:04 35 @@ -4,19 +4,26 @@ use warnings; use Data::Dump qw/dump/; +use Carp qw/confess/; +use Exporter 'import'; +our @EXPORT = qw'@mem $PC $A $P $X $Y $S $IPeriod'; -# Dobrica Pavlinusic, 07/30/07 13:23:19 CEST -# -# Simple Orao emulation +=head1 NAME + +M6502 - perl bindings for 6502 emulator + +=cut my $debug = 1; -my @mem = (0x42) x 0x10000; # 64M +our $VERSION = qw(0.0.1); + +our @mem = (0xff) x 0x10000; # 64M # program counter our $PC = 0xbeef; # CPU registars -our ( $A, $P, $X, $Y, $S ) = (0) x 5; +our ( $A, $P, $X, $Y, $S ) = (0x42) x 5; # Set IPeriod to number of CPU cycles between calls to Loop6502 our $IPeriod = 1; @@ -27,8 +34,9 @@ =cut sub init { - warn "inside init\n"; - print "stdout\n"; + my $self = shift; + warn dump(@_); + warn "inside init low-level M6502 from $self\n"; }; =head2 read @@ -59,4 +67,53 @@ my ($addr,$byte) = @_; $mem[$addr] = $byte; } + +=head2 poke_code + +Write series of bytes into memory without passing through MMU + + $emu->poke_code( 0xbeef, 0xff, 0x00, 0xff, 0x00, 0xaa ); + +=cut + +sub poke_code { + my $self = shift; + my $addr = shift; + warn sprintf("# poke_code(%04x,%s)\n", $addr, dump( @_ )) if $self->debug; + $mem[$addr++] = $_ foreach @_; +} + +=head2 write_chunk + + $emu->write_chunk( $address, $chunk_of_data ); + +=cut + +sub write_chunk { + my ($self, $addr, $chunk) = @_; + my $len = length($chunk); + splice @mem, $addr, $len, unpack('C*', $chunk); +} + +=head2 ram + +Read searies of bytes from memory without passing through MMU + + $emu->ram( $from, $to ); + +=cut + +sub ram { + my $self = shift; + my ($from,$to) = @_; + warn "ram($from,$to)\n"; + if ($from + $to) { + printf "ram %04x - %04x\n", $from, $to; + return @mem[$from .. $to - 1]; + } + printf "ram %04x\n", $from; + return $mem[$from] if defined($from); + confess "no from address"; +} + 1;