--- Galaksija.pm 2007/08/06 07:04:40 165 +++ Galaksija.pm 2007/09/30 19:47:32 185 @@ -8,6 +8,7 @@ use Data::Dump qw/dump/; use Z80; use Screen; +use Time::HiRes qw/time/; use base qw(Class::Accessor VRac Z80 Screen Prefs Session); __PACKAGE__->mk_accessors(qw(booted)); @@ -94,7 +95,8 @@ my $hor_pos = 0; $self->loop( sub { - Z80::exec( $_[0] ); + my $run_for = shift; + Z80::exec( $run_for ); if ( $hor_pos != $mem[ 0x2ba8 ] ) { warn "scroll 0x2ba8", $self->hexdump( 0x2ba8 ); $hor_pos = $mem[ 0x2ba8 ]; @@ -124,6 +126,11 @@ confess sprintf("can't find memory at address %04x",$addr) unless defined($byte); warn sprintf("# Galaksija::read(%04x) = %02x\n", $addr, $byte) if $self->trace; + if ( $addr >= 0x2000 && $addr <= 0x2036 ) { +# printf("## keyread 0x%04x = %02x\n", $addr, $byte); + $self->key_pressed( 1 ); # force process of events + } + $self->mmap_pixel( $addr, 0, $byte, 0 ) if $self->show_mem; return $byte; } @@ -156,26 +163,32 @@ 'a' .. 'z', qw/up down left right space/, '0' .. '9', - ':', '"', ',', '=', '.', '/', 'enter', 'tab', - 'left alt', 'delete', 'scroll lock', 'left shift' + ':', '"', ',', '=', '.', '/', 'return', 'tab', + 'left alt', 'backspace', 'scroll lock', 'left shift' ); -my $remap; +my $remap_key2addr; my $o = 1; foreach my $key ( @keymap ) { - $remap->{$key} = $o; + $remap_key2addr->{$key} = 0x2000 + $o; $o++; } +printf("keymap is mmaped 0x%04x - 0x%04x\n", 0x2000, $o); + =head2 key_down =cut sub key_down { my ( $self, $key ) = @_; - warn "key down: $key ", $remap->{$key}; - $self->write( 0x2000 + $remap->{$key}, 0xfe ); + if ( ! defined( $remap_key2addr->{$key} ) ) { + warn "unknown key pressed: $key [ignoring]\n"; + return; + } + printf("registered key down: $key address: %04x\n", $remap_key2addr->{$key} ); + $self->write( $remap_key2addr->{$key}, 0xfe ); } =head2 key_up @@ -184,8 +197,12 @@ sub key_up { my ( $self, $key ) = @_; - warn "key up: $key ", $remap->{$key}; - $self->write( 0x2000 + $remap->{$key}, 0xff ); + if ( ! defined( $remap_key2addr->{$key} ) ) { + warn "unknown key released: $key [ignoring]\n"; + return; + } + warn "registred key up: $key ", $remap_key2addr->{$key}; + $self->write( $remap_key2addr->{$key}, 0xff ); } =head2 render_vram @@ -197,7 +214,7 @@ my $char_rom = 'rom/Galaksija/CHRGEN.BIN'; my @chars = map { ord($_) } split(//, read_file( $char_rom )); -warn "loaded ", $#chars, " characters\n"; +warn "loaded ", $#chars, " bytes from $char_rom\n"; my @char2pos; @@ -212,11 +229,16 @@ $char2pos[ $char ] = ( $c & 0x7f ); } -warn dump( @char2pos ); +#warn "## chars2pos = ",dump( @char2pos ); + +sub screen_width { 256 } +sub screen_height { 16 * 13 } sub render_vram { my $self = shift; + my $t = time(); + my $addr = 0x2800; my @pixels = ("\x00") x ( 32 * 16 * 13 ); @@ -236,17 +258,19 @@ } my $vram = SDL::Surface->new( - -width => 256, - -height => 256, + -width => $self->screen_width, + -height => $self->screen_height, -depth => 1, # 1 bit per pixel -pitch => 32, # bytes per line -from => pack("C*", @pixels), ); - $vram->set_colors( 0, $black, $white ); + $vram->set_colors( 0, $white, $black ); $self->render_frame( $vram ); # $self->render_vram_text; + + printf("frame in %.2fs\n", time()-$t) if $self->debug; }