void mainloop() { vecx_emu((VECTREX_MHZ / 1000) * EMU_TIMER); readevents(); { Uint32 now = SDL_GetTicks(); if(now < next_time) { next_time += EMU_TIMER; return; } else { next_time = now; next_time += EMU_TIMER; } } }
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; } } }
AS3_Val flash_tick(void *data, AS3_Val args){ vecx_emu((VECTREX_MHZ / 1000) * EMU_TIMER, 0); return AS3_Int(0); }
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"); }
void retro_run(void) { int i; unsigned char asamples[882] = {0}; uint8_t buffer[882] = {0}; (void)asamples; /* poll input and update states; buttons (snd_regs[14], 4 buttons/pl => 4 bits starting from LSB, |= for rel. &= ~ for push) analog stick (alg_jch0, alg_jch1, => -1 (0x00) .. 0 (0x80) .. 1 (0xff)) */ poll_cb(); /* Player 1 */ if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT )) alg_jch0 = 0x00; else if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)) alg_jch0 = 0xff; else alg_jch0 = 0x80; if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP )) alg_jch1 = 0xff; else if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN )) alg_jch1 = 0x00; else alg_jch1 = 0x80; if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A )) snd_regs[14] &= ~1; else snd_regs[14] |= 1; if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B )) snd_regs[14] &= ~2; else snd_regs[14] |= 2; if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X )) snd_regs[14] &= ~4; else snd_regs[14] |= 4; if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y )) snd_regs[14] &= ~8; else snd_regs[14] |= 8; /* Player 2 */ if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT )) alg_jch2 = 0x00; else if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)) alg_jch2 = 0xff; else alg_jch2 = 0x80; if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP )) alg_jch3 = 0xff; else if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN )) alg_jch3 = 0x00; else alg_jch3 = 0x80; if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A )) snd_regs[14] &= ~16; else snd_regs[14] |= 16; if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B )) snd_regs[14] &= ~32; else snd_regs[14] |= 32; if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X )) snd_regs[14] &= ~64; else snd_regs[14] |= 64; if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y )) snd_regs[14] &= ~128; else snd_regs[14] |= 128; vecx_emu(30000); /* 1500000 / 1000 * 20 */ e8910_callback(NULL, buffer, 882); for (i = 0; i < 882; i++) { short convs = (buffer[i] << 8) - 0x7ff; audio_cb(convs, convs); } video_cb(framebuffer, WIDTH, HEIGHT, WIDTH * sizeof(unsigned short)); }