--- Orao.pm 2007/09/30 17:48:59 179 +++ Orao.pm 2008/04/14 18:19:06 207 @@ -6,7 +6,7 @@ use Carp qw/confess/; use File::Slurp; use Data::Dump qw/dump/; -use M6502; +use M6502 '0.0.3'; use Screen; use base qw(Class::Accessor VRac M6502 Screen Prefs Tape Session); @@ -43,6 +43,9 @@ sub run { my $self = shift; + M6502::reset(); + $self->_init_callbacks; + warn "Orao calling upstream init\n"; $self->SUPER::init( read => sub { $self->read( @_ ) }, @@ -114,15 +117,17 @@ $self->debug ? ' debug' : '', "\n"; - M6502::reset(); +# $self->load_tape( 'tapes/Orao/bdash.tap' ); +# $self->load_tape( 'tapes/Orao/crtanje.tap' ); + $self->load_tape( 'tapes/Orao/jjack.tap' ); -# $self->load_tape( '../oraoigre/bdash.tap' ); + $self->render_vram; $self->loop( sub { my $run_for = shift; warn sprintf("about to exec from PC %04x for %d cycles\n", $PC, $run_for) if $self->trace; M6502::exec( $run_for ); - $self->render_vram; +# $self->render_vram; }); }; @@ -340,7 +345,7 @@ sub read { my $self = shift; my ($addr) = @_; - return if ( $addr > 0xffff ); + die "address over 64k: $addr" if ( $addr > 0xffff ); my $byte = $mem[$addr]; confess sprintf("can't find memory at address %04x",$addr) unless defined($byte); warn sprintf("# Orao::read(%04x) = %02x\n", $addr, $byte) if $self->trace; @@ -398,6 +403,8 @@ confess sprintf "write access 0x%04x > 0xafff aborting\n", $addr; } + $self->render_vram if ( $addr >= 0x6000 && $addr <= 0x7fff ); + $self->mmap_pixel( $addr, $byte, 0, 0 ) if $self->show_mem; $mem[$addr] = $byte; return; @@ -428,6 +435,8 @@ $vram->set_colors( 0, $black, $white ); $self->render_frame( $vram ); + + print '.'; } =head2 cpu_PC @@ -445,6 +454,36 @@ return $PC; } + +=head2 _init_callbacks + +Mark memory areas for which we want to get callbacks to perl + +=cut + +sub _init_callbacks { + my $self = shift; + warn "set calbacks to perl for memory areas...\n"; + + # don't call for anything + M6502::set_all_callbacks( 0x00 ); + + # video ram + M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x7fff ); + # keyboard + M6502::set_read_callback( $_ ) foreach ( keys %$keyboard ); + # tape + M6502::set_read_callback( 0x87ff ); + M6502::set_write_callback( 0x8800 ); + + my $map = ''; + foreach ( 0 .. 0xffff ) { + my $cb = M6502::get_callback( $_ ); + $map .= sprintf( "%04x: %02x\n", $_, $cb ) if $cb; + } + warn "callback map:\n$map\n"; +} + =head1 SEE ALSO L, L, L, L