From 655ee84ba2304b2fe85b28290580338d29a68c3c Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 5 Dec 2020 20:25:38 +0100 Subject: - have some emulation modes for single stepping, breaking, changing emulation speed - started to make a better CPU state output with opcode mnemonics --- emu/emul.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) (limited to 'emu/emul.c') 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++ ) { -- cgit v1.2.3-54-g00ecf