43 |
sub run { |
sub run { |
44 |
my $self = shift; |
my $self = shift; |
45 |
|
|
46 |
|
M6502::reset(); |
47 |
|
|
48 |
warn "Galeb calling upstream init\n"; |
warn "Galeb calling upstream init\n"; |
49 |
$self->SUPER::init( |
$self->SUPER::init( |
50 |
read => sub { $self->read( @_ ) }, |
read => sub { $self->read( @_ ) }, |
53 |
|
|
54 |
warn "Galeb $Galeb::VERSION emulation starting\n"; |
warn "Galeb $Galeb::VERSION emulation starting\n"; |
55 |
|
|
56 |
$self->scale( 2 ); |
# $self->scale( 2 ); |
57 |
$self->show_mem( 1 ); |
$self->show_mem( 1 ); |
58 |
$self->load_session( 'sess/current' ); |
$self->load_session( 'sess/current' ); |
59 |
|
|
72 |
|
|
73 |
$emu = $self; |
$emu = $self; |
74 |
|
|
75 |
my ( $trace, $debug ) = ( $self->trace, $self->debug ); |
# $self->trace( 1 ); |
76 |
$self->trace( 0 ); |
# $self->debug( 1 ); |
|
$self->debug( 0 ); |
|
77 |
|
|
78 |
warn "rendering memory\n"; |
warn "rendering memory\n"; |
79 |
$self->render_mem( @mem ); |
$self->render_mem( @mem ); |
80 |
|
|
|
M6502::reset(); |
|
|
|
|
81 |
$self->loop( sub { |
$self->loop( sub { |
82 |
my $run_for = shift; |
my $run_for = shift; |
83 |
warn sprintf("about to exec from PC %04x for %d cycles\n", $PC, $run_for) if $self->trace; |
warn sprintf("about to exec from PC %04x for %d cycles\n", $PC, $run_for) if $self->trace; |
181 |
|
|
182 |
=cut |
=cut |
183 |
|
|
184 |
|
my $char_rom = 'rom/Galeb/CHRGEN.rom'; |
185 |
|
|
186 |
|
# flip, invert |
187 |
|
my @chars = map { $flip[ ord($_) ] ^ 0xff } split(//, read_file( $char_rom )); |
188 |
|
warn "loaded ", $#chars, " characters from $char_rom\n"; |
189 |
|
|
190 |
my $last_dump = ''; |
my $last_dump = ''; |
191 |
|
|
192 |
|
my $x_size = 48; |
193 |
|
my $y_size = 16; |
194 |
|
my $c_h = 8; |
195 |
|
|
196 |
|
sub screen_width { $x_size * 8 } |
197 |
|
sub screen_height { $y_size * $c_h } |
198 |
|
|
199 |
sub render_vram { |
sub render_vram { |
200 |
my $self = shift; |
my $self = shift; |
201 |
|
|
203 |
|
|
204 |
my $dump; |
my $dump; |
205 |
|
|
206 |
for my $y ( 0 .. 15 ) { |
my @pixels = ("\x00") x ( $x_size * $y_size * 8 ); |
207 |
|
|
208 |
|
for my $y ( 0 .. $y_size - 1 ) { |
209 |
$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 ] ); |
210 |
|
|
211 |
|
foreach my $x ( 0 .. $x_size - 1 ) { |
212 |
|
my $c = $mem[ $addr + 15 + $x ]; |
213 |
|
my $l = $x_size * $c_h; |
214 |
|
foreach my $o ( 0 .. $c_h - 1 ) { |
215 |
|
$pixels[ ( $y * $l ) + $x + ( $o * $x_size ) ] = $chars[ ( $c * $c_h ) + $o ]; |
216 |
|
} |
217 |
|
} |
218 |
|
|
219 |
$addr += 64; |
$addr += 64; |
220 |
} |
} |
221 |
|
|
222 |
if ( $dump ne $last_dump ) { |
if ( $dump ne $last_dump ) { |
223 |
print $dump; |
# print $dump; |
224 |
$last_dump = $dump; |
$last_dump = $dump; |
225 |
|
|
226 |
|
my $vram = SDL::Surface->new( |
227 |
|
-width => $x_size * 8, |
228 |
|
-height => $y_size * $c_h, |
229 |
|
-depth => 1, # 1 bit per pixel |
230 |
|
-pitch => $x_size, # bytes per line |
231 |
|
-from => pack("C*", @pixels), |
232 |
|
); |
233 |
|
$vram->set_colors( 0, $white, $black ); |
234 |
|
|
235 |
|
$self->render_frame( $vram ); |
236 |
} |
} |
237 |
} |
} |
238 |
|
|