--- M6502/Orao.pm 2007/07/31 09:43:21 43 +++ M6502/Orao.pm 2007/07/31 10:13:13 46 @@ -55,9 +55,8 @@ 0xE000 => 'rom/CRT12.ROM', }); - $self->load_oraoemu( 'dump/orao-1.2' ); - $self->load_oraoemu( 'dump/SCRINV.BIN', 0x1000 ); - $PC = 0x1000; + $PC = 0xDD11; # BC +# $PC = 0xC274; # MC $orao = $self; @@ -136,6 +135,27 @@ =cut +sub _write_chunk { + my $self = shift; + my ( $addr, $chunk ) = @_; + $self->write_chunk( $addr, $chunk ); + my $end = $addr + length($chunk); + my ( $f, $t ) = ( 0x6000, 0x7fff ); + + if ( $end < $f || $addr >= $t ) { + warn "skip vram update\n"; + return; + }; + + $f = $addr if ( $addr > $f ); + $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 ] ); + } +} + sub load_oraoemu { my $self = shift; my ( $path, $addr ) = @_; @@ -147,16 +167,16 @@ if ( $size == 65538 ) { $addr = 0; warn sprintf "loading oraoemu 64k dump %s at %04x - %04x %02x\n", $path, $addr, $addr+$size-1, $size; - $self->write_chunk( $addr, substr($buff,2) ); + $self->_write_chunk( $addr, substr($buff,2) ); return; } elsif ( $size == 32800 ) { $addr = 0; warn sprintf "loading oraoemu 1.3 dump %s at %04x - %04x %02x\n", $path, $addr, $addr+$size-1, $size; - $self->write_chunk( $addr, substr($buff,0x20) ); + $self->_write_chunk( $addr, substr($buff,0x20) ); return; } printf "loading %s at %04x - %04x %02x\n", $path, $addr, $addr+$size-1, $size; - return $self->write_chunk( $addr, $buff ); + return $self->_write_chunk( $addr, $buff ); my $chunk; @@ -172,7 +192,7 @@ $pos += 4; } - $self->write_chunk( $addr, $chunk ); + $self->_write_chunk( $addr, $chunk ); };