/[VRac]/Orao.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /Orao.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 179 by dpavlin, Sun Sep 30 17:48:59 2007 UTC revision 207 by dpavlin, Mon Apr 14 18:19:06 2008 UTC
# Line 6  use strict; Line 6  use strict;
6  use Carp qw/confess/;  use Carp qw/confess/;
7  use File::Slurp;  use File::Slurp;
8  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
9  use M6502;  use M6502 '0.0.3';
10  use Screen;  use Screen;
11    
12  use base qw(Class::Accessor VRac M6502 Screen Prefs Tape Session);  use base qw(Class::Accessor VRac M6502 Screen Prefs Tape Session);
# Line 43  our $emu; Line 43  our $emu;
43  sub run {  sub run {
44          my $self = shift;          my $self = shift;
45    
46            M6502::reset();
47            $self->_init_callbacks;
48    
49          warn "Orao calling upstream init\n";          warn "Orao calling upstream init\n";
50          $self->SUPER::init(          $self->SUPER::init(
51                  read => sub { $self->read( @_ ) },                  read => sub { $self->read( @_ ) },
# Line 114  sub run { Line 117  sub run {
117                  $self->debug ? ' debug' : '',                  $self->debug ? ' debug' : '',
118                  "\n";                  "\n";
119    
120          M6502::reset();  #       $self->load_tape( 'tapes/Orao/bdash.tap' );
121    #       $self->load_tape( 'tapes/Orao/crtanje.tap' );
122            $self->load_tape( 'tapes/Orao/jjack.tap' );
123    
124  #       $self->load_tape( '../oraoigre/bdash.tap' );          $self->render_vram;
125    
126          $self->loop( sub {          $self->loop( sub {
127                  my $run_for = shift;                  my $run_for = shift;
128                  warn sprintf("about to exec from PC %04x for %d cycles\n", $PC, $run_for) if $self->trace;                  warn sprintf("about to exec from PC %04x for %d cycles\n", $PC, $run_for) if $self->trace;
129                  M6502::exec( $run_for );                  M6502::exec( $run_for );
130                  $self->render_vram;  #               $self->render_vram;
131          });          });
132  };  };
133    
# Line 340  my $keyboard = { Line 345  my $keyboard = {
345  sub read {  sub read {
346          my $self = shift;          my $self = shift;
347          my ($addr) = @_;          my ($addr) = @_;
348          return if ( $addr > 0xffff );          die "address over 64k: $addr" if ( $addr > 0xffff );
349          my $byte = $mem[$addr];          my $byte = $mem[$addr];
350          confess sprintf("can't find memory at address %04x",$addr) unless defined($byte);          confess sprintf("can't find memory at address %04x",$addr) unless defined($byte);
351          warn sprintf("# Orao::read(%04x) = %02x\n", $addr, $byte) if $self->trace;          warn sprintf("# Orao::read(%04x) = %02x\n", $addr, $byte) if $self->trace;
# Line 398  sub write { Line 403  sub write {
403                  confess sprintf "write access 0x%04x > 0xafff aborting\n", $addr;                  confess sprintf "write access 0x%04x > 0xafff aborting\n", $addr;
404          }          }
405    
406            $self->render_vram if ( $addr >= 0x6000 && $addr <= 0x7fff );
407    
408          $self->mmap_pixel( $addr, $byte, 0, 0 ) if $self->show_mem;          $self->mmap_pixel( $addr, $byte, 0, 0 ) if $self->show_mem;
409          $mem[$addr] = $byte;          $mem[$addr] = $byte;
410          return;          return;
# Line 428  sub render_vram { Line 435  sub render_vram {
435          $vram->set_colors( 0, $black, $white );          $vram->set_colors( 0, $black, $white );
436    
437          $self->render_frame( $vram );          $self->render_frame( $vram );
438    
439            print '.';
440  }  }
441    
442  =head2 cpu_PC  =head2 cpu_PC
# Line 445  sub cpu_PC { Line 454  sub cpu_PC {
454          return $PC;          return $PC;
455  }  }
456    
457    
458    =head2 _init_callbacks
459    
460    Mark memory areas for which we want to get callbacks to perl
461    
462    =cut
463    
464    sub _init_callbacks {
465            my $self = shift;
466            warn "set calbacks to perl for memory areas...\n";
467    
468            # don't call for anything
469            M6502::set_all_callbacks( 0x00 );
470    
471            # video ram
472            M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x7fff );
473            # keyboard
474            M6502::set_read_callback( $_ ) foreach ( keys %$keyboard );
475            # tape
476            M6502::set_read_callback( 0x87ff );
477            M6502::set_write_callback( 0x8800 );
478    
479            my $map = '';
480            foreach ( 0 .. 0xffff ) {
481                    my $cb = M6502::get_callback( $_ );
482                    $map .= sprintf( "%04x: %02x\n", $_, $cb ) if $cb;
483            }
484            warn "callback map:\n$map\n";
485    }
486    
487  =head1 SEE ALSO  =head1 SEE ALSO
488    
489  L<VRac>, L<M6502>, L<Screen>, L<Tape>  L<VRac>, L<M6502>, L<Screen>, L<Tape>

Legend:
Removed from v.179  
changed lines
  Added in v.207

  ViewVC Help
Powered by ViewVC 1.1.26