--- Orao.pm 2007/08/05 13:27:27 145 +++ Orao.pm 2007/08/06 11:40:21 171 @@ -6,8 +6,8 @@ use Carp qw/confess/; use File::Slurp; use Data::Dump qw/dump/; -use M6502; # import @mem $PC and friends -use Screen qw/$white $black/; +use M6502; +use Screen; use base qw(Class::Accessor VRac M6502 Screen Prefs Tape Session); #__PACKAGE__->mk_accessors(qw()); @@ -26,7 +26,7 @@ =head1 SUMMARY -Emulator or Orao 8-bit 6502 machine popular in Croatia +Emulator for Orao 8-bit 6502 machine popular in Croatia (especially schools) =cut @@ -55,6 +55,7 @@ # $self->scale( 2 ); # $self->show_mem( 1 ); + $self->load_session( 'sess/current' ); $self->open_screen; $self->load_rom({ @@ -223,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; } @@ -241,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 ) { @@ -347,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 ) { @@ -412,23 +413,6 @@ =cut -my @flip; - -foreach my $i ( 0 .. 255 ) { - my $t = 0; - $i & 0b00000001 and $t = $t | 0b10000000; - $i & 0b00000010 and $t = $t | 0b01000000; - $i & 0b00000100 and $t = $t | 0b00100000; - $i & 0b00001000 and $t = $t | 0b00010000; - $i & 0b00010000 and $t = $t | 0b00001000; - $i & 0b00100000 and $t = $t | 0b00000100; - $i & 0b01000000 and $t = $t | 0b00000010; - $i & 0b10000000 and $t = $t | 0b00000001; - #warn "$i = $t\n"; - $flip[$i] = $t; -} - - sub render_vram { my $self = shift; @@ -469,8 +453,6 @@ Dobrica Pavlinusic, C<< >> -=head1 BUGS - =head1 ACKNOWLEDGEMENTS See also L which is source of all