Acme-6502
view release on metacpan or search on metacpan
lib/Acme/6502/Tube.pm view on Meta::CPAN
# Inline OSASCI code
$self->poke_code( OSASCI,
0xC9, 0x0D, # CMP #&0D
0xD0, 0x07, # BNE +7
0xA9, 0x0A, # LDA #&0A
0x20, 0xEE, 0xFF, # JSR &FFEE
0xA9, 0x0D # LDA #&0D
);
# BRK handler. The interrupt handling is bogus - so don't
# generate any interrupts before fixing it :)
$self->poke_code(
0xFF00, 0x85, 0xFC, 0x68, 0x58, 0x29, 0x10, 0xF0,
0x17, 0x8A, 0x48, 0xBA, 0x38, 0xBD, 0x02, 0x01,
0xE9, 0x01, 0x85, 0xFD, 0xBD, 0x03, 0x01, 0xE9,
0x00, 0x85, 0xFE, 0x68, 0xAA, 0x6C, 0x02, 0x02,
0x6C, 0x04, 0x02
);
$self->write_16( $self->BREAK, 0xFF00 );
lib/Acme/6502/Tube.pm view on Meta::CPAN
sub call_os {
my $self = shift;
my $vecno = shift;
eval {
my $call = $self->{ os }->[ $vecno ] || die "Bad OS call $vecno\n";
$call->[ 0 ]->( $self );
};
if ( $@ ) {
my $err = $@;
$self->write_16( ERROR, 0x7F00 );
$err =~ s/\s+/ /;
$err =~ s/^\s+//;
$err =~ s/\s+$//;
warn $err;
my $ep = ERROR + 2;
for ( map ord, split //, $err ) {
$self->write_8( $ep++, $_ );
}
$self->write_8( $ep++, 0x00 );
$self->set_pc( ERROR );
}
}
1;
__END__
( run in 1.144 second using v1.01-cache-2.11-cpan-49f99fa48dc )