Acme-6502

 view release on metacpan or  search on metacpan

lib/Acme/6502.pm  view on Meta::CPAN

459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
    my $addr = shift;
 
    $self->{ mem }->[ $addr++ ] = $_ for @_;
}
 
sub load_rom {
    my $self = shift;
    my ( $f, $a ) = @_;
 
    open my $fh, '<', $f or croak "Can't read $f ($!)\n";
    binmode $fh;
    my $sz = -s $fh;
    sysread $fh, my $buf, $sz or croak "Error reading $f ($!)\n";
    close $fh;
 
    $self->write_chunk( $a, $buf );
}
 
sub call_os {
  croak "call_os() not supported";
}

lib/Acme/6502/Tube.pm  view on Meta::CPAN

208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
my $name  = $self->read_str( $self->read_16( $blk ) );
my $load  = $self->read_32( $blk + 2 );
my $exec  = $self->read_32( $blk + 6 );
my $start = $self->read_32( $blk + 10 );
my $end   = $self->read_32( $blk + 14 );
 
# printf("%-20s %08x %08x %08x %08x\n", $name, $load, $exec, $start, $end);
if ( $a == 0x00 ) {
  # Save
  open my $fh, '>', $name or die "Can't write $name\n";
  binmode $fh;
  my $buf = $self->read_chunk( $start, $end );
  syswrite $fh, $buf or die "Error writing $name\n";
  $self->set_a( 1 );
}
elsif ( $a == 0xFF ) {
  # Load
  if ( -f $name ) {
    open my $fh, '<', $name or die "Can't read $name\n";
    binmode $fh;
    my $len = -s $fh;
    sysread $fh, my $buf, $len or die "Error reading $name\n";
    $load = PAGE if $exec & 0xFF;
    $self->write_chunk( $load, $buf );
    $self->write_32( $blk + 2,  $load );
    $self->write_32( $blk + 6,  0x00008023 );
    $self->write_32( $blk + 10, $len );
    $self->write_32( $blk + 14, 0x00000000 );
    $self->set_a( 1 );
  }



( run in 0.348 second using v1.01-cache-2.11-cpan-00829025b61 )