--- Orao.pm 2007/08/06 07:04:40 165 +++ Orao.pm 2007/08/06 11:40:21 171 @@ -55,7 +55,7 @@ # $self->scale( 2 ); # $self->show_mem( 1 ); - $self->load_session( 'session.pl' ); + $self->load_session( 'sess/current' ); $self->open_screen; $self->load_rom({ @@ -224,12 +224,12 @@ 'backspace' => 224, }, 0x87FD => sub { - my ( $self, $key ) = @_; - if ( $key eq 'return' ) { + my $self = shift; + if ( $self->key_active('return') ) { M6502::_write( 0xfc, 13 ); warn "return\n"; return 0; - } elsif ( $key =~ m/ ctrl/ || $self->key_down( 'left ctrl' ) || $self->key_down( 'right ctrl' ) ) { + } elsif ( $self->key_active('left ctrl','right ctrl') ) { warn "ctrl\n"; return 16; } @@ -242,10 +242,11 @@ 'f1' => 224, }, 0x87FB => sub { - my ( $self, $key ) = @_; - if ( $key eq 'space' ) { + my $self = shift; + if ( $self->key_active('space') ) { + warn "space\n"; return 32; - } elsif ( $self->key_down( 'left shift' ) || $self->key_down( 'right shift' ) ) { + } elsif ( $self->key_active('left shift','right shift') ) { warn "shift\n"; return 16; # } elsif ( $self->tape ) { @@ -348,24 +349,23 @@ if ( defined( $keyboard->{$addr} ) ) { warn sprintf("keyboard port: %04x\n",$addr) if $self->trace; - my $key = $self->key_pressed; - if ( defined($key) ) { - my $ret = $keyboard_none; - my $r = $keyboard->{$addr} || confess "no definition for keyboard port found"; - if ( ref($r) eq 'CODE' ) { - $ret = $r->($self, $key); - } elsif ( defined($r->{$key}) ) { - $ret = $r->{$key}; - if ( ref($ret) eq 'CODE' ) { - $ret = $ret->($self); + + my $ret = $keyboard_none; + my $r = $keyboard->{$addr} || confess "no definition for keyboard port found"; + if ( ref($r) eq 'CODE' ) { + $ret = $r->($self); + } else { + foreach my $k ( keys %$r ) { + my $return = 0; + if ( $self->key_active($k) ) { + warn "key '$k' is active\n"; + $return ||= $r->{$k}; } - } else { - warn sprintf("keyboard port: %04x unknown key: '%s'\n", $addr, $key) if $debug; + $ret = $return if $return; } - warn sprintf("keyboard port: %04x key:%s code:%d\n",$addr,$key,$ret) if ( $ret != $keyboard_none ); - return $ret; } - return $keyboard_none; + warn sprintf("keyboard port: %04x code: %d\n",$addr,$ret) if ( $ret != $keyboard_none ); + return $ret; } if ( $addr == 0x87ff ) {