--- M6502/Orao.pm 2007/08/02 21:55:06 105 +++ M6502/Orao.pm 2007/08/03 10:29:33 109 @@ -10,7 +10,7 @@ use Data::Dump qw/dump/; use M6502; -use base qw(Class::Accessor M6502 Screen Prefs); +use base qw(Class::Accessor M6502 Screen Prefs Tape); __PACKAGE__->mk_accessors(qw(booted)); =head1 NAME @@ -63,8 +63,10 @@ 0x1000 => 'dump/SCRINV.BIN', # should be 0x6000, but oraoemu has 2 byte prefix 0x5FFE => 'dump/screen.dmp', - 0xC000 => 'rom/BAS12.ROM', - 0xE000 => 'rom/CRT12.ROM', +# 0xC000 => 'rom/BAS12.ROM', +# 0xE000 => 'rom/CRT12.ROM', + 0xC000 => 'rom/BAS13.ROM', + 0xE000 => 'rom/CRT13.ROM', }); # $PC = 0xDD11; # BC @@ -80,7 +82,8 @@ $self->trace( 0 ); $self->debug( 0 ); - $self->render( @mem[ 0x6000 .. 0x7fff ] ); + warn "rendering video memory\n"; + $self->render_vram( @mem[ 0x6000 .. 0x7fff ] ); if ( $self->show_mem ) { @@ -99,11 +102,6 @@ 0xE000, 0xFFFF, 'sistemski ROM', ); - } else { - - warn "rendering video memory\n"; - $self->render( @mem[ 0x6000 .. 0x7fff ] ); - } $self->sync; $self->trace( $trace ); @@ -132,8 +130,6 @@ sub run { my $self = shift; - $self->show_mem( 1 ); - $self->boot if ( ! $self->booted ); $self->loop; }; @@ -176,10 +172,7 @@ $t = $end if ( $end < $t ); warn sprintf("refresh video ram %04x-%04x\n", $f, $t); -# foreach my $a ( $f .. $t ) { -# $self->vram( $a - 0x6000 , $mem[ $a ] ); -# } - $self->render( @mem[ 0x6000 .. 0x7fff ] ); + $self->render_vram( @mem[ 0x6000 .. 0x7fff ] ); $self->render_mem( @mem ) if $self->show_mem; } @@ -450,6 +443,10 @@ return $keyboard_none; } + if ( $addr == 0x87ff ) { + return $self->read_tape; + } + $self->mmap_pixel( $addr, 0, $byte, 0 ); return $byte; } @@ -467,10 +464,6 @@ my ($addr,$byte) = @_; warn sprintf("# Orao::write(%04x,%02x)\n", $addr, $byte) if $self->trace; - if ( $addr >= 0x6000 && $addr < 0x8000 ) { - $self->vram( $addr - 0x6000 , $byte ); - } - if ( $addr == 0x8800 ) { warn sprintf "sound ignored: %x\n", $byte; } @@ -590,7 +583,7 @@ print "run_for $run_for instructions\n"; $show_R = 1; last; - } elsif ( $c =~ m/^(u|j)/ ) { + } elsif ( $c =~ m/^(u|j)/i ) { my $to = $v || $a; printf "set pc to %04x\n", $to; $PC = $to; # remember for restart @@ -598,11 +591,20 @@ $last = "r $run_for"; $show_R = 1; last; - } elsif ( $c =~ m/^t/ ) { + } elsif ( $c =~ m/^tape/ ) { + if ( ! $v ) { + warn "ERROR: please specify tape name!\n"; + } elsif ( ! -e $v ) { + warn "ERROR: tape $v: $!\n"; + } else { + $self->load_tape( $v ); + } + $last = ''; + } elsif ( $c =~ m/^t/i ) { $self->trace( not $self->trace ); print "trace ", $self->trace ? 'on' : 'off', "\n"; $last = ''; - } elsif ( $c =~ m/^d/ ) { + } elsif ( $c =~ m/^d/i ) { $self->debug( not $self->debug ); print "debug ", $self->debug ? 'on' : 'off', "\n"; $last = '';