--- M6502/Orao.pm 2007/08/02 17:31:13 102 +++ M6502/Orao.pm 2007/08/02 18:01:51 103 @@ -315,13 +315,14 @@ 'left' => 224, 'backspace' => 224, }, - 0x87FD => { - 'return' => sub { + 0x87FD => sub { + my ( $self, $key ) = @_; + if ( $key eq 'return' ) { M6502::_write( 0xfc, 13 ); return 0; - }, - 'left ctrl' => 16, - 'right ctrl' => 16, + } elsif ( $self->key_down( 'left ctrl' ) || $self->key_down( 'right ctrl' ) ) { + return 16; + } }, 0x87FA => { 'f4' => 16, @@ -329,10 +330,13 @@ 'f2' => 192, 'f1' => 224, }, - 0x87FB => { - 'space' => 32, - 'left shift' => 16, - 'right shift' => 16, + 0x87FB => sub { + my ( $self, $key ) = @_; + if ( $key eq 'space' ) { + return 32; + } elsif ( $self->key_down( 'left shift' ) || $self->key_down( 'right shift' ) ) { + return 16; + } }, 0x87F6 => { '6' => 16, @@ -395,10 +399,10 @@ 'v' => 16, }, 0x85FE => { - ':' => 16, + ';' => sub { $_[0]->key_down('left shift') ? 16 : 224 }, '\\' => 128, '\'' => 192, - ';' => 224, +# ';' => 224, '8' => 16, # FIXME? }, 0x85FF => { @@ -433,10 +437,13 @@ 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 ( my $ret = $r->{$key} ) { + if ( ref($r) eq 'CODE' ) { + $ret = $r->($self, $key); + } elsif ( $ret = $r->{$key} ) { if ( ref($ret) eq 'CODE' ) { - $ret = $ret->(); + $ret = $ret->($self); warn "executed $key and got: $ret\n"; } else { warn sprintf("keyboard port: %04x key: '%s' code: %02x\n", $addr, $key, $ret);