static void mainMenu_resumeEv(Chip8* chip, SDL_Event *ev, int index) { if ((ev->type == SDL_KEYDOWN) && (ev->key.keysym.sym == SDLK_RETURN)) { if (chip->status == CHIP8_PAUSED) chip8_invokeEmulator(chip); else chip8_reset(chip); } }
int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: ./CHIP-SDL rom\n"); return -1; } srand(time(NULL)); printf("Chip-SDL by xerpi\n"); printf("Loading \"%s\"...", argv[1]); struct chip8_context chip8; chip8_init(&chip8, 64, 32); int ret = chip8_loadrom(&chip8, argv[1]); if (ret) printf("OK!\n"); else { printf("ERROR.\n"); chip8_fini(&chip8); return -1; } printf("Running \"%s\"...\n", argv[1]); SDL_Init(SDL_INIT_VIDEO); SDL_Window *window = SDL_CreateWindow("Chip-SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 320, SDL_WINDOW_SHOWN); SDL_Surface *screen = SDL_GetWindowSurface(window); SDL_Surface *chip8_disp = CreateSurface(SDL_SWSURFACE, 64, 32, screen); SDL_Event event; int running = 1; while (running) { while (SDL_PollEvent(&event) != 0) { switch (event.type) { case SDL_QUIT: running = 0; break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_q: running = 0; break; case SDLK_r: chip8_reset(&chip8); chip8_loadrom(&chip8, argv[1]); break; case SDLK_w: chip8_key_press(&chip8, 1); break; case SDLK_s: chip8_key_press(&chip8, 4); break; case SDLK_UP: chip8_key_press(&chip8, 0xC); break; case SDLK_DOWN: chip8_key_press(&chip8, 0xD); break; } break; case SDL_KEYUP: switch (event.key.keysym.sym) { case SDLK_q: running = 0; break; case SDLK_w: chip8_key_release(&chip8, 1); break; case SDLK_s: chip8_key_release(&chip8, 4); break; case SDLK_UP: chip8_key_release(&chip8, 0xC); break; case SDLK_DOWN: chip8_key_release(&chip8, 0xD); break; } break; } } chip8_step(&chip8); /*int x, y; for (y = 0; y < 32; y++) { for (x = 0; x < 8; x++) { int i; for (i = 0; i < 8; i++) { printf("%c", (chip8.disp_mem[x+y*8]>>(7-i))&0b1 ? 'X' : 'O'); } printf(" "); } printf("\n"); } printf("\n\n"); */ //chip8_core_dump(&chip8); //usleep(16667); chip8_disp_to_SDL(&chip8, chip8_disp); SDL_BlitScaled(chip8_disp, NULL, screen, NULL); SDL_UpdateWindowSurface(window); } chip8_fini(&chip8); SDL_FreeSurface(chip8_disp); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
static void mainMenu_resetEv(Chip8* chip, SDL_Event *ev, int index) { if ((ev->type == SDL_KEYDOWN) && (ev->key.keysym.sym == SDLK_RETURN)) chip8_reset(chip); }