summaryrefslogtreecommitdiff
path: root/emu/emul.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/emul.c')
-rw-r--r--emu/emul.c55
1 files changed, 47 insertions, 8 deletions
diff --git a/emu/emul.c b/emu/emul.c
index bf64d13..0399d33 100644
--- a/emu/emul.c
+++ b/emu/emul.c
@@ -11,6 +11,8 @@ void emul_init( emul_t *emul, cpu_6502_t *cpu, bus_t *bus, int width, int height
emul->width = width;
emul->height = height;
emul->debug = false;
+ emul->paused = false;
+ emul->speed = CPU_FREQUENCY;
}
void emul_start( emul_t *emul )
@@ -78,31 +80,68 @@ void emul_run( emul_t *emul, int nof_steps )
if( emul->gui ) {
SDL_Event event;
bool done = false;
+
+ if( emul->paused ) {
+ fprintf( stderr, "CPU is paused, press\n"
+ "(s) for single step\n"
+ "(c) for continue running\n"
+ "(b) break to single stepping\n"
+ "(+) speed up\n"
+ "(-) speed down\n"
+ "(q) or (ESC) for shutting down\n" );
+ }
+
while( !done ) {
uint32_t frame_start = SDL_GetTicks( );
-
+
SDL_PollEvent( &event );
switch( event.type ) {
case SDL_KEYDOWN:
switch( event.key.keysym.sym ) {
case SDLK_ESCAPE:
+ case SDLK_q:
done = true;
break;
+ case SDLK_c:
+ fprintf( stderr, "continuing at normal speed %1.6f MHz\n", ( (double)emul->speed / 1000000 ) );
+ emul->paused = false;
+ break;
+ case SDLK_b:
+ fprintf( stderr, "CPU paused (in single step mode)\n" );
+ emul->paused = true;
+ break;
+ case SDLK_s:
+ cpu_6502_run( emul->cpu, 1 );
+ break;
+ case SDLK_PLUS:
+ case SDLK_KP_PLUS:
+ emul->speed *= 10;
+ if( emul->speed > CPU_FREQUENCY ) {
+ emul->speed = CPU_FREQUENCY;
+ }
+ fprintf( stderr, "CPU speed is %1.6f MHz now\n", ( (double)emul->speed / 1000000 ) );
+ break;
+ case SDLK_MINUS:
+ case SDLK_KP_MINUS:
+ emul->speed /= 10;
+ if( emul->speed < 25 ) {
+ emul->speed = 25;
+ }
+ fprintf( stderr, "CPU speed is %1.6f MHz now\n", ( (double)emul->speed / 1000000 ) );
+ break;
}
break;
-
+
case SDL_QUIT:
done = true;
- break;
+ break;
}
- cpu_6502_run( emul->cpu, CPU_FREQUENCY / DISPLAY_FPS );
-
- if( emul->debug ) {
- cpu_6502_print_state( emul->cpu, 0 );
+ if( !emul->paused ) {
+ cpu_6502_run( emul->cpu, emul->speed / DISPLAY_FPS );
}
-
+
SDL_RenderCopy( emul->renderer, emul->background_texture, NULL, NULL );
for( int i = 0; i < emul->bus->nof_devices; i++ ) {