--- M6502/Screen.pm 2007/08/02 16:01:16 98 +++ M6502/Screen.pm 2007/08/03 08:44:45 106 @@ -12,6 +12,7 @@ use Carp qw/confess/; use Data::Dump qw/dump/; +use M6502 qw'@mem'; use base qw(Class::Accessor Prefs); __PACKAGE__->mk_accessors(qw(app event)); @@ -117,6 +118,9 @@ my $_vram_counter; sub vram { + + return; + my ( $self, $offset, $byte ) = @_; my $x = ( $offset % 32 ) << 3; my $y = $offset >> 5; @@ -187,8 +191,13 @@ sub render { my $self = shift; + return unless $self->booted; + die "this function isn't supported if scale isn't 1" unless $self->scale == 1; + confess "no data?" unless (@_); + confess "screen size not 256*256/8 but ",($#_+1) unless (($#_+1) == (256*256/8)); + my $pixels = pack("C*", @_); my $vram = SDL::Surface->new( @@ -255,43 +264,52 @@ my $pending_key; my $run_for = 2000; +my $key_down; + +sub key_down { + my $self = shift; + my $key = shift; + warn "key_down($key) = ",$key_down->{$key}, "\n" if $self->debug; + return $key_down->{$key}; +} + sub key_pressed { my $self = shift; # don't take key, just pull event - my $just_checking = shift; - - if ( defined($pending_key) ) { - my $k = $pending_key; - undef $pending_key unless $just_checking; - return $k; - } + my $just_checking = shift || 0; my $event = $self->event || confess "no event?"; - $event->poll || return; + $event->poll || return $pending_key; my $type = $event->type(); exit if ($type == SDL_QUIT); - my $k; + my $k = $pending_key; if ($type == SDL_KEYDOWN) { $k = $event->key_name(); + $key_down->{$k}++; if ( $k eq 'escape' ) { $run_for = $self->cli; warn "will check event loop every $run_for cycles\n"; + $pending_key = '~'; } else { - warn "SDL_KEYDOWN ($type) = '$k'\n"; - $pending_key = $k if $just_checking; + warn "SDL_KEYDOWN ($type) = '$k'", $just_checking ? ' fake' : '', "\n"; + $pending_key = $k; } } elsif ( $type == SDL_KEYUP ) { my $up = $event->key_name(); - warn "SDL_KEYUP ($type) = '$up'\n"; + $key_down->{$up} = 0; + warn "SDL_KEYUP ($type) = '$up'", $just_checking ? ' fake' : '', "\n"; + undef $pending_key; } - return $k; + warn "key_pressed = $pending_key\n" if $pending_key; + + return $pending_key; } =head2 loop @@ -309,6 +327,7 @@ while ( 1 ) { $self->key_pressed( 1 ); M6502::exec($run_for); + $self->render( @mem[ 0x6000 .. 0x7fff ] ); } }