51 |
|
|
52 |
warn "Galeb $Galeb::VERSION emulation starting\n"; |
warn "Galeb $Galeb::VERSION emulation starting\n"; |
53 |
|
|
54 |
$self->scale( 2 ); |
# $self->scale( 2 ); |
55 |
$self->show_mem( 1 ); |
$self->show_mem( 1 ); |
56 |
$self->load_session( 'sess/current' ); |
$self->load_session( 'sess/current' ); |
57 |
|
|
70 |
|
|
71 |
$emu = $self; |
$emu = $self; |
72 |
|
|
73 |
my ( $trace, $debug ) = ( $self->trace, $self->debug ); |
# $self->trace( 1 ); |
74 |
$self->trace( 0 ); |
# $self->debug( 1 ); |
|
$self->debug( 0 ); |
|
75 |
|
|
76 |
warn "rendering memory\n"; |
warn "rendering memory\n"; |
77 |
$self->render_mem( @mem ); |
$self->render_mem( @mem ); |
181 |
|
|
182 |
=cut |
=cut |
183 |
|
|
184 |
|
my $char_rom = 'rom/Galeb/CHRGEN.rom'; |
185 |
|
|
186 |
|
my @chars = map { ord($_) } split(//, read_file( $char_rom )); |
187 |
|
warn "loaded ", $#chars, " characters from $char_rom\n"; |
188 |
|
|
189 |
my $last_dump = ''; |
my $last_dump = ''; |
190 |
|
|
191 |
|
my $x_size = 48; |
192 |
|
my $y_size = 16; |
193 |
|
my $c_h = 8; |
194 |
|
|
195 |
|
sub screen_width { $x_size * 8 } |
196 |
|
sub screen_height { $y_size * $c_h } |
197 |
|
|
198 |
sub render_vram { |
sub render_vram { |
199 |
my $self = shift; |
my $self = shift; |
200 |
|
|
202 |
|
|
203 |
my $dump; |
my $dump; |
204 |
|
|
205 |
for my $y ( 0 .. 15 ) { |
my @pixels = ("\x00") x ( $x_size * $y_size * 8 ); |
206 |
|
|
207 |
|
for my $y ( 0 .. $y_size - 1 ) { |
208 |
$dump .= sprintf "%2d: %s\n",$y, join('', map { chr( $_ ) } @mem[ $addr+15 .. $addr+62 ] ); |
$dump .= sprintf "%2d: %s\n",$y, join('', map { chr( $_ ) } @mem[ $addr+15 .. $addr+62 ] ); |
209 |
|
|
210 |
|
foreach my $x ( 0 .. $x_size - 1 ) { |
211 |
|
my $c = $mem[ $addr + 15 + $x ]; |
212 |
|
my $l = $x_size * $c_h; |
213 |
|
foreach my $o ( 0 .. $c_h - 1 ) { |
214 |
|
$pixels[ ( $y * $l ) + $x + ( $o * $x_size ) ] = $chars[ ( $c * $c_h ) + $o ]; |
215 |
|
} |
216 |
|
} |
217 |
|
|
218 |
$addr += 64; |
$addr += 64; |
219 |
} |
} |
220 |
|
|
221 |
if ( $dump ne $last_dump ) { |
if ( $dump ne $last_dump ) { |
222 |
print $dump; |
# print $dump; |
223 |
$last_dump = $dump; |
$last_dump = $dump; |
224 |
|
|
225 |
|
my $vram = SDL::Surface->new( |
226 |
|
-width => $x_size * 8, |
227 |
|
-height => $y_size * $c_h, |
228 |
|
-depth => 1, # 1 bit per pixel |
229 |
|
-pitch => $x_size, # bytes per line |
230 |
|
-from => pack("C*", @pixels), |
231 |
|
); |
232 |
|
$vram->set_colors( 0, $white, $black ); |
233 |
|
|
234 |
|
$self->render_frame( $vram ); |
235 |
} |
} |
236 |
} |
} |
237 |
|
|