Acme-6502
view release on metacpan or search on metacpan
lib/Acme/6502.pm view on Meta::CPAN
$bad_inst, # FC
_inst( _sbc( _absx() ) ), # FD SBC abs, x
_inst( _inc( _absx() ) ), # FE INC abs, x
$bad_inst, # FF BBS7 rel
) if !@OP_CACHE;
$self->{ ops } = [ @OP_CACHE ];
confess "Escape handler opcode not available"
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 ] );
}
};
lib/Acme/6502/Tube.pm view on Meta::CPAN
}
else {
system( $cmd );
}
}
sub _osbyte {
my $self = shift;
my $a = $self->get_a();
if ( $a == 0x7E ) {
# Ack escape
$self->write_8( 0xFF, 0 );
$self->set_x( 0xFF );
}
elsif ( $a == 0x82 ) {
# Read m/c high order address
$self->set_xy( 0 );
}
elsif ( $a == 0x83 ) {
# Read OSHWM (PAGE)
$self->set_xy( PAGE );
lib/Acme/6502/Tube.pm view on Meta::CPAN
$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;
my $a = $self->get_a();
my $blk = $self->get_xy();
if ( $a == 0x00 ) {
lib/Acme/6502/Tube.pm view on Meta::CPAN
}
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 ) {
$self->set_escape;
$self->set_p( $self->get_p() | $self->C );
}
else {
$self->set_p( $self->get_p() & ~$self->C );
}
};
Term::ReadKey::ReadMode( 0 );
die $@ if $@;
}
( run in 0.586 second using v1.01-cache-2.11-cpan-c21f80fb71c )