--- Galaksija.pm 2007/08/06 09:19:19 168 +++ Galaksija.pm 2007/09/30 18:19:57 181 @@ -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; } @@ -160,22 +167,28 @@ '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 @@ -212,11 +229,13 @@ $char2pos[ $char ] = ( $c & 0x7f ); } -warn dump( @char2pos ); +#warn "## chars2pos = ",dump( @char2pos ); sub render_vram { my $self = shift; + my $t = time(); + my $addr = 0x2800; my @pixels = ("\x00") x ( 32 * 16 * 13 ); @@ -247,6 +266,8 @@ $self->render_frame( $vram ); # $self->render_vram_text; + + printf("frame in %.2fs\n", time()-$t) if $self->debug; }