AS3_Val flash_init(void *data, AS3_Val args){ FILE *f; if(!(f = fopen(romfilename, "rb"))){ perror(romfilename); return AS3_Int(1); } if(fread(rom, 1, sizeof (rom), f) != sizeof (rom)){ printf("Invalid rom length\n"); return AS3_Int(2); } fclose(f); memset(cart, 0, sizeof (cart)); if(cartfilename){ FILE *f; if(!(f = fopen(cartfilename, "rb"))){ perror(cartfilename); return AS3_Int(2); } fread(cart, 1, sizeof (cart), f); fclose(f); } vecx_reset(); return AS3_Int(0); }
void osint_emuloop(){ Uint32 next_time = SDL_GetTicks() + EMU_TIMER; vecx_reset(); for(;;){ vecx_emu((VECTREX_MHZ / 1000) * EMU_TIMER, 0); readevents(); { Uint32 now = SDL_GetTicks(); if(now < next_time) SDL_Delay(next_time - now); else next_time = now; next_time += EMU_TIMER; } } }
bool retro_load_game(const struct retro_game_info *info) { size_t cart_sz; struct retro_input_descriptor desc[] = { { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Up" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "2" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "1" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "3" }, { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "4" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Up" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "2" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "1" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "3" }, { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "4" }, }; environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); /* start with a fresh BIOS copy */ memcpy(rom, bios_data, bios_data_size); /* just memcpy buffer, ROMs are so tiny on Vectrex */ cart_sz = sizeof(cart) / sizeof(cart[0]); if (info->data && info->size > 0 && info->size <= cart_sz) { memset(cart, 0, cart_sz); memcpy(cart, info->data, info->size); vecx_reset(); e8910_init_sound(); return true; } return false; }
void osint_emuloop(){ next_time = SDL_GetTicks() + EMU_TIMER; vecx_reset(); }
void osint_emuloop (void) { int frames, running; double t, t0, t1, fps; char titlestr[ 200 ]; SDL_Event event; // reset the vectrex hardware vecx_reset (); frames = 0; running = 1; t0 = SDL_GetTicks(); t1 = t0; while (running) { // Grab all the events off the queue. while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_KEYDOWN: // Handle key presses switch(event.key.keysym.sym) { case SDLK_LEFT : alg_jch0 = 0x00; break; case SDLK_RIGHT : alg_jch0 = 0xFF; break; case SDLK_UP : alg_jch1 = 0xFF; break; case SDLK_DOWN : alg_jch1 = 0x00; break; case SDLK_a : snd_regs[14] &= ~0x01; break; case SDLK_s : snd_regs[14] &= ~0x02; break; case SDLK_d: snd_regs[14] &= ~0x04; break; case SDLK_f : snd_regs[14] &= ~0x08; break; case SDLK_p : // pause case SDLK_SPACE : if(1 == running) { running = 2; // 2 = "pause state" SDL_PauseAudio(1); } else { running = 1; SDL_PauseAudio(0); } break; case SDLK_w : // toggle sound debug on/off if(AY_debug) AY_debug = 0; else AY_debug = 1; break; case SDLK_q : // quit case SDLK_ESCAPE : running = 0; break; } // end switch keydown break; case SDL_KEYUP: // Handle key releases switch(event.key.keysym.sym) { case SDLK_LEFT : alg_jch0 = 0x80; break; case SDLK_RIGHT : alg_jch0 = 0x80; break; case SDLK_UP : alg_jch1 = 0x80; break; case SDLK_DOWN : alg_jch1 = 0x80; break; case SDLK_a : snd_regs[14] |= 0x01; break; case SDLK_s : snd_regs[14] |= 0x02; break; case SDLK_d: snd_regs[14] |= 0x04; break; case SDLK_f : snd_regs[14] |= 0x08; break; } //end switch keyup break; case SDL_QUIT: /* Handle quit requests (like Ctrl-c). */ running = 0; break; } // end outer switch } // wend events // Calculate and display Window caption info if(2 == running) { SDL_WM_SetCaption("VecX/SDL/GL (PAUSED)", NULL); } else { // Get time t = SDL_GetTicks(); if(AY_debug) { // update AY debug info 10x a second if( (t-t1) >= 100) { fps = (double)frames; sprintf(titlestr, "F: %04d %04d %04d V: %02d %02d %02d TE: %d %d %d", AY_spufreq[0], AY_spufreq[1], AY_spufreq[2], AY_vol[0], AY_vol[1], AY_vol[2], AY_tone_enable[0], AY_tone_enable[1], AY_tone_enable[2]); SDL_WM_SetCaption(titlestr, NULL); t1 = t; frames = 0; } } else { // update fps display once per second if( (t-t1) >= 1000) { fps = (double)frames; sprintf( titlestr, "VecX/SDL/GL (%.1f FPS) Drawn: %d ", fps, vector_draw_cnt ); SDL_WM_SetCaption(titlestr, NULL); t1 = t; frames = 0; } } frames ++; } // emulate this "frame" (if not paused) if(1 == running) vecx_emu ((VECTREX_MHZ / 1000) * EMU_TIMER, 0); // speed control while(SDL_GetTicks() < (t0 + EMU_TIMER)) ; t0 = SDL_GetTicks(); } // wend running printf("Exit emuloop.\n"); }
AS3_Val flash_reset(void *data, AS3_Val args){ vecx_reset(); return AS3_Int(0); }
void retro_reset(void) { vecx_reset(); e8910_init_sound(); }
void retro_unload_game(void) { memset(cart, 0, sizeof(cart) / sizeof(cart[0])); vecx_reset(); }