Acme-6502
view release on metacpan or search on metacpan
lib/Acme/6502.pm view on Meta::CPAN
unless $self->{ ops }->[ ESCAPE_OP ] == $bad_inst;
# Patch in the OS escape op handler
$self->{ ops }->[ ESCAPE_OP ] = sub {
my $self = shift;
if ( $self->{ mem }->[ $self->{ reg }->{ pc } ] != ESCAPE_SIG ) {
$bad_inst->( $self );
}
else {
$self->{ reg }->{ pc } += 2;
$self->call_os( $self->{ mem }->[ $self->{ reg }->{ pc } - 1 ] );
}
};
}
sub set_jumptab {
my $self = shift;
$self->{ jumptab } = shift;
}
sub get_state {
my $self = shift;
return @{ $self->{ reg } }{ qw( a x y s p pc ) };
}
sub get_xy {
my $self = shift;
return $self->get_x || ( $self->get_y << 8 );
}
sub set_xy {
my $self = shift;
my $v = shift;
$self->set_x( $v & 0xFF );
$self->set_y( ( $v >> 8 ) & 0xFF );
}
sub read_str {
my $self = shift;
my $addr = shift;
my $str = '';
while ( $self->{ mem }->[ $addr ] != 0x0D ) {
$str .= chr( $self->{ mem }->[ $addr++ ] );
}
return $str;
}
sub read_chunk {
my $self = shift;
my ( $from, $to ) = @_;
return pack( 'C*', @{ $self->{ mem } }[ $from .. $to - 1 ] );
}
sub write_chunk {
my $self = shift;
my ( $addr, $chunk ) = @_;
my $len = length( $chunk );
splice @{ $self->{ mem } }, $addr, $len, unpack( 'C*', $chunk );
}
sub read_8 {
my $self = shift;
my $addr = shift;
return $self->{ mem }->[ $addr ];
}
sub write_8 {
my $self = shift;
my( $addr, $val ) = @_;
$self->{ mem }->[ $addr ] = $val;
}
sub read_16 {
my $self = shift;
my $addr = shift;
return $self->{ mem }->[ $addr ] | ( $self->{ mem }->[ $addr + 1 ] << 8 );
}
sub write_16 {
my $self = shift;
my( $addr, $val ) = @_;
$self->{ mem }->[ $addr ] = $val & 0xFF;
$self->{ mem }->[ $addr + 1 ] = ( $val >> 8 ) & 0xFF;
}
sub read_32 {
my $self = shift;
my $addr = shift;
return $self->{ mem }->[ $addr ]
| ( $self->{ mem }->[ $addr + 1 ] << 8 )
| ( $self->{ mem }->[ $addr + 2 ] << 16 )
| ( $self->{ mem }->[ $addr + 3 ] << 32 );
}
sub write_32 {
my $self = shift;
my( $addr, $val ) = @_;
$self->{ mem }->[ $addr ] = $val & 0xFF;
$self->{ mem }->[ $addr + 1 ] = ( $val >> 8 ) & 0xFF;
$self->{ mem }->[ $addr + 2 ] = ( $val >> 16 ) & 0xFF;
$self->{ mem }->[ $addr + 3 ] = ( $val >> 24 ) & 0xFF;
}
sub poke_code {
my $self = shift;
my $addr = shift;
$self->{ mem }->[ $addr++ ] = $_ for @_;
}
sub load_rom {
( run in 2.371 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )