Acme-6502
view release on metacpan or search on metacpan
lib/Acme/6502.pm view on Meta::CPAN
my $cr = eval "sub { my \$self=shift; ${src} }";
confess "$@" if $@;
return $cr;
}
sub _bad_inst {
my $self = shift;
my $pc = $self->get_pc;
croak sprintf( "Bad instruction at &%04x (&%02x)\n",
$pc - 1, $self->{ mem }->[ $pc - 1 ] );
}
# Functions that generate code fragments
sub _set_nz {
return
'$p &= ~(N|Z);' . 'if( '
. $_[0]
. ' & 0x80){ $p |= N }'
. 'elsif( '
lib/Acme/6502/Tube.pm view on Meta::CPAN
$self->set_xy( PAGE );
}
elsif ( $a == 0x84 ) {
# Read HIMEM
$self->set_xy( HIMEM );
}
elsif ( $a == 0xDA ) {
$self->set_xy( 0x0900 );
}
else {
die sprintf( "OSBYTE %02x not handled\n", $a );
}
}
sub _set_escape {
my $self = shift;
$self->write_8( 0xFF, 0xFF );
}
sub _osword {
my $self = shift;
lib/Acme/6502/Tube.pm view on Meta::CPAN
my $now = int( ( time() - $self->{ time_base } ) * 100 );
$self->write_32( $blk, $now );
$self->write_8( $blk + 4, 0 );
}
elsif ( $a == 0x02 ) {
# Set clock
my $tm = $self->read_32( $blk );
$self->{ time_base } = time() - ( $tm * 100 );
}
else {
die sprintf( "OSWORD %02x not handled\n", $a );
}
}
sub _oswrch {
my $self = shift;
printf( "%c", $self->get_a() );
}
sub _osrdch {
my $self = shift;
Term::ReadKey::ReadMode( 4 );
eval {
my $k = ord( Term::ReadKey::ReadKey( 0 ) );
$k = 0x0D if $k == 0x0A;
$self->set_a( $k );
if ( $k == 27 ) {
lib/Acme/6502/Tube.pm view on Meta::CPAN
sub _osfile {
my $self = shift;
my $a = $self->get_a();
my $blk = $self->get_xy();
my $name = $self->read_str( $self->read_16( $blk ) );
my $load = $self->read_32( $blk + 2 );
my $exec = $self->read_32( $blk + 6 );
my $start = $self->read_32( $blk + 10 );
my $end = $self->read_32( $blk + 14 );
# printf("%-20s %08x %08x %08x %08x\n", $name, $load, $exec, $start, $end);
if ( $a == 0x00 ) {
# Save
open my $fh, '>', $name or die "Can't write $name\n";
binmode $fh;
my $buf = $self->read_chunk( $start, $end );
syswrite $fh, $buf or die "Error writing $name\n";
$self->set_a( 1 );
}
elsif ( $a == 0xFF ) {
# Load
lib/Acme/6502/Tube.pm view on Meta::CPAN
$self->set_a( 1 );
}
elsif ( -d $name ) {
$self->set_a( 2 );
}
else {
$self->set_a( 0 );
}
}
else {
die sprintf( "OSFILE %02x not handled\n", $a );
}
}
sub _osargs {
die "OSARGS not handled\n";
}
sub _osbget {
die "OSBGET not handled\n";
}
t/monkeynes.t view on Meta::CPAN
warn Dumper $_;
}
}
}
sub diag_regs {
my $cpu = shift;
my $reg = uc( defined $_[0] ? $_[0] : '' );
_diag( 'CPU Registers' ) if !$reg;
_diag( sprintf ' PC: $%X', $cpu->get_pc )
if !$reg || $reg eq 'PC';
_diag( sprintf ' SP: $%X', $cpu->get_s ) if !$reg || $reg eq 'SP';
_diag( sprintf ' ACC: $%X', $cpu->get_a )
if !$reg || $reg eq 'ACC';
_diag( sprintf ' IX: $%X', $cpu->get_x ) if !$reg || $reg eq 'IX';
_diag( sprintf ' IY: $%X', $cpu->get_y ) if !$reg || $reg eq 'IY';
# this should be fixed to handle just one flag at a time
_diag( ' Flags S V - B D I Z C' )
if !$reg || $reg =~ m{^(PS|[SVBDIZC])$};
_diag(
sprintf ' PS: %d %d %d %d %d %d %d %d',
split( //, sprintf( '%08b', $cpu->get_p ) )
) if !$reg || $reg =~ m{^(PS|[SVBDIZC])$};
}
sub _diag {
return unless $ENV{DIAG_6502};
diag( @_ );
}
( run in 0.660 second using v1.01-cache-2.11-cpan-de7293f3b23 )