--- Galaksija.pm 2007/08/05 20:02:14 163 +++ Galaksija.pm 2007/08/06 09:19:19 168 @@ -6,7 +6,8 @@ use Carp qw/confess/; use File::Slurp; use Data::Dump qw/dump/; -use Z80; # import +use Z80; +use Screen; use base qw(Class::Accessor VRac Z80 Screen Prefs Session); __PACKAGE__->mk_accessors(qw(booted)); @@ -57,7 +58,7 @@ $self->open_screen; $self->load_rom({ 0x0000, 'rom/Galaksija/ROM1.BIN', - 0x2000, 'rom/Galaksija/ROM2.BIN', + 0x1000, 'rom/Galaksija/ROM2.BIN', # 0xE000, 'rom/Galaksija/GAL_PLUS.BIN', }); @@ -155,8 +156,8 @@ 'a' .. 'z', qw/up down left right space/, '0' .. '9', - ':', '"', ',', '=', '.', '/', 'enter', 'tab', - 'left alt', 'delete', 'scroll lock', 'left shift' + ':', '"', ',', '=', '.', '/', 'return', 'tab', + 'left alt', 'backspace', 'scroll lock', 'left shift' ); my $remap; @@ -189,13 +190,75 @@ =head2 render_vram +Render characters as graphic + +=cut + +my $char_rom = 'rom/Galaksija/CHRGEN.BIN'; + +my @chars = map { ord($_) } split(//, read_file( $char_rom )); +warn "loaded ", $#chars, " characters\n"; + +my @char2pos; + +# maken from mess/video/galaxy.c +foreach my $char ( 0 .. 255 ) { + my $c = $char; + if ( ( $c > 63 && $c < 96 ) || ( $c > 127 && $c < 192 ) ) { + $c -= 64; + } elsif ( $c > 191 ) { + $c -= 128; + } + $char2pos[ $char ] = ( $c & 0x7f ); +} + +warn dump( @char2pos ); + +sub render_vram { + my $self = shift; + + my $addr = 0x2800; + + my @pixels = ("\x00") x ( 32 * 16 * 13 ); + my $a = 0; + + for my $y ( 0 .. 15 ) { + for my $x ( 0 .. 31 ) { + my $c = $mem[ $addr++ ]; + $c = $char2pos[ $c ]; + for my $l ( 0 .. 12 ) { + my $o = $l << 5; # *32 + my $co = ( $l << 7 ) | $c; + $pixels[ $a + $x + $o ] = $flip[ $chars[ $co ] ]; + } + } + $a += ( 32 * 13 ); # next line + } + + my $vram = SDL::Surface->new( + -width => 256, + -height => 256, + -depth => 1, # 1 bit per pixel + -pitch => 32, # bytes per line + -from => pack("C*", @pixels), + ); + $vram->set_colors( 0, $white, $black ); + + $self->render_frame( $vram ); + +# $self->render_vram_text; +} + + +=head2 render_vram_text + Simple hex dumper of text buffer =cut my $last_dump = ''; -sub render_vram { +sub render_vram_text { my $self = shift; my $addr = 0x2800;