#include #include #include "vm.h" #include "vdp.h" #include #include "debug.h" #define BTN_ANY 0 #define BTN_UP 1 #define BTN_DOWN 2 #define BTN_LEFT 3 #define BTN_RIGHT 4 #define BTN_A 5 #define BTN_B 6 #define BTN_MENU 7 bool anykey = false; unsigned char data_in; void input_data_in(const unsigned char& value) { data_in = value; } unsigned char input_data_out() { const Uint8* keys = SDL_GetKeyboardState(nullptr); switch (data_in) { case BTN_ANY: return anykey; break; case BTN_UP: return keys[SDL_SCANCODE_UP]; break; case BTN_DOWN: return keys[SDL_SCANCODE_DOWN]; break; case BTN_LEFT: return keys[SDL_SCANCODE_LEFT]; break; case BTN_RIGHT: return keys[SDL_SCANCODE_RIGHT]; break; case BTN_A: return keys[SDL_SCANCODE_RCTRL]; break; case BTN_B: return keys[SDL_SCANCODE_RSHIFT]; break; case BTN_MENU: return keys[SDL_SCANCODE_RETURN]; break; }; } int main(int argc, char** argv) { vm_init("test.bas"); vdp_init(); vm_register_out_port(10, vdp_data_out); vm_register_out_port(11, vdp_cmd_out); vm_register_out_port(20, input_data_in); vm_register_in_port(21, input_data_out); debug_init(vm_get_memory()); const bool* breakpoints = debug_get_breakpoints(); bool running = false; static bool should_quit = false; static SDL_Event sdlEvent; SDL_Scancode just_pressed; //Uint32 ticks = SDL_GetTicks(); while (!should_quit) { just_pressed = SDL_SCANCODE_UNKNOWN; while (SDL_PollEvent(&sdlEvent)) { switch (sdlEvent.type) { case SDL_WINDOWEVENT: switch (sdlEvent.window.event) { case SDL_WINDOWEVENT_CLOSE: should_quit = true; break; } break; case SDL_QUIT: should_quit = true; break; case SDL_KEYDOWN: //anykey = true; just_pressed = sdlEvent.key.keysym.scancode; if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = true; } if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { should_quit = true; } if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F10) { vm_big_step(); debug_update(); } if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F11) { vm_step(); debug_update(); } if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F5) { running = !running; if (!running) debug_update(); else debug_hide(); } break; case SDL_KEYUP: if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = false; } case SDL_MOUSEBUTTONDOWN: debug_mouse_event(sdlEvent); break; } } if (running) { unsigned short pc = vm_step(); if (breakpoints[pc]) { running = false; debug_update(); } } //if (SDL_GetTicks() - ticks >= 15) { vdp_flip(); ticks = SDL_GetTicks(); } } vdp_quit(); return 0; }