Example #1
0
void scene_run(){
  while(scene_curr or scene_next){
    gfx_vsync_busywait(); // TODO use interupts instead

    // change scene if needed
    if (scene_curr != scene_next){
      scene_change();
      continue; // skip frame on change to give drawfunc full vblank time
    }

    // drawing must be done in vblank phase
    if (scene_curr and scene_curr->drawfunc){
      scene_curr->drawfunc();
      scene_vcount_draw = gfx_reg_vcount;
    }

    // updateing state can be done in vdraw phase as well
    input_poll();
    if (scene_curr and scene_curr->tickfunc){
      scene_curr->tickfunc();
      scene_vcount_tick = gfx_reg_vcount;
    }

    scene_frame++;
    scene_total_frames++;
  }
}
Example #2
0
static inline void run_tick()
{
	input_poll();
	
	// input handling for a few global things
	if (justpushed(ESCKEY))
	{
		if (settings->instant_quit)
		{
			game.running = false;
		}
		else if (!game.paused)		// no pause from Options
		{
			game.pause(GP_PAUSED);
		}
	}
	else if (justpushed(F3KEY))
	{
		game.pause(GP_OPTIONS);
	}
	
	// freeze frame
	game.tick();

	Replay::DrawStatus();

	org_run();

	//platform_sync_to_vblank();
	screen->Flip();

	memcpy(lastinputs, inputs, sizeof(lastinputs));
}
Example #3
0
void AppMinimized(void)
{
    stat("Game minimized or lost focus--pausing...");

#ifdef _SDL_MIXER
    Mix_Pause(-1);
    Mix_PauseMusic();
#else
    SDL_PauseAudio(1);
#endif

    for(;;)
    {
        if ((SDL_GetAppState() & VISFLAGS) == VISFLAGS)
        {
            break;
        }

        input_poll();
        SDL_Delay(20);
    }
#ifdef _SDL_MIXER
    Mix_Resume(-1);
    Mix_ResumeMusic();
#else
    SDL_PauseAudio(0);
#endif
    stat("Focus regained, resuming play...");
}
Example #4
0
bool core_run(void)
{
   switch (core_poll_type)
   {
      case POLL_TYPE_EARLY:
         input_poll();
         break;
      case POLL_TYPE_LATE:
         core_input_polled = false;
         break;
   }
   if (core.retro_run)
      core.retro_run();
   if (core_poll_type == POLL_TYPE_LATE && !core_input_polled)
      input_poll();
   return true;
}
Example #5
0
// This is a replacement for the old `WaitForChar` function in os_unix.c
static InbufPollResult inbuf_poll(int ms)
{
  if (input_ready() || input_poll(ms)) {
    return kInputAvail;
  }

  return input_eof ? kInputEof : kInputNone;
}
Example #6
0
static void input_map_key(char* keyName, short* key) {
  printf("Press %s\n", keyName);
  currentKey = key;
  currentAbs = NULL;
  *key = -1;
  if (!input_poll(input_handle_mapping_event))
    exit(1);

  usleep(250000);
  input_drain();
}
Example #7
0
static void input_map_abs(char* keyName, short* abs, bool* reverse) {
  printf("Move %s\n", keyName);
  currentKey = NULL;
  currentAbs = abs;
  currentReverse = reverse;
  *abs = -1;
  if (!input_poll(input_handle_mapping_event))
    exit(1);

  usleep(250000);
  input_drain();
}
Example #8
0
static int16_t core_input_state_poll(unsigned port,
      unsigned device, unsigned idx, unsigned id)
{
   if (current_core.poll_type == POLL_TYPE_LATE)
   {
      if (!current_core.input_polled)
         input_poll();

      current_core.input_polled = true;
   }
   return input_state(port, device, idx, id);
}
Example #9
0
static void input_map_abskey(char* keyName, short* key, short* abs, bool* reverse) {
  printf("Press %s\n", keyName);
  currentKey = key;
  currentAbs = abs;
  currentReverse = reverse;
  *key = -1;
  *abs = -1;
  *currentReverse = false;
  if (!input_poll(input_handle_mapping_event))
    exit(1);

  usleep(250000);
  input_drain();
}
Example #10
0
// This is a replacement for the old `WaitForChar` function in os_unix.c
static InbufPollResult inbuf_poll(int32_t ms)
{
  if (input_available()) {
    return kInputAvail;
  }

  if (input_poll(ms)) {
    return eof && rstream_available(read_stream) == 0 ?
      kInputEof :
      kInputAvail;
  }

  return kInputNone;
}
Example #11
0
bool core_run(void)
{
#ifdef HAVE_NETWORKING
   if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_PRE_FRAME, NULL))
   {
      /* Paused due to netplay. We must poll and display something so that a
       * netplay peer pausing doesn't just hang. */
      input_poll();
      video_driver_cached_frame();
      return true;
   }
#endif

   switch (current_core.poll_type)
   {
      case POLL_TYPE_EARLY:
         input_poll();
         break;
      case POLL_TYPE_LATE:
         current_core.input_polled = false;
         break;
      default:
         break;
   }

   current_core.retro_run();

   if (current_core.poll_type == POLL_TYPE_LATE && !current_core.input_polled)
      input_poll();

#ifdef HAVE_NETWORKING
   netplay_driver_ctl(RARCH_NETPLAY_CTL_POST_FRAME, NULL);
#endif

   return true;
}
Example #12
0
static void execute_elf(void *arg) {
	int fd, size, i, j;
	void *entry;
	//extern void *end;
	void *elf_begin = ((void *)(&end)) + 4*1024;
	uint8_t *tmp = elf_begin;
	
	printf("Load file to RAM\n");
	fd = fat_open(path, O_RDONLY);
	size = fat_fsize(fd);
	
	for(j = 512; j < size; j += 512) {
		fat_read_sect(fd);
		for(i = 0; i < 512; i++) {
			*tmp++ = fat_buf[i];
		}
	}
	fat_read_sect(fd);
	for(i = 0; i < j - size; i++) {
		*tmp++ = fat_buf[i];
	}
	
	fat_close(fd);
	printf("File loaded\n");
	printf("Highest addr used is 0x%X\n", tmp);
	//input_poll();
	
	mmu040_init();
	terminal_clear();
	printf("MMU Init\n");
	if(!(entry = elf_load(elf_begin, do_debug))) {
		printf("Failed to load ELF\n");
		input_poll();
		return;
	}
	printf("ELF load successful, entry is 0x%X, press any key\n", entry);
	//input_poll();
	//printf("Here we have 0x%X\n", *((uint32_t *) entry));
	//input_poll();
	mmu_disable();
	if(do_debug) {
		char *argv[] = {"debug"};
		mmu_enable_and_jump(entry, 1, argv);
	} else {
		mmu_enable_and_jump(entry, 0, NULL);
	}
}
Example #13
0
void AppMinimized(void)
{
	stat("Game minimized or lost focus--pausing...");
	SDL_PauseAudio(1);
	
	for(;;)
	{
		if ((SDL_GetAppState() & VISFLAGS) == VISFLAGS)
		{
			break;
		}
		
		input_poll();
		SDL_Delay(20);
	}
	
	SDL_PauseAudio(0);
	stat("Focus regained, resuming play...");
}
Example #14
0
void AppMinimized(void)
{
	stat("Game minimized or lost focus--pausing...");
	SDL_PauseAudio(1);
	
	for(;;)
	{
		if (Graphics::WindowVisible())
		{
			break;
		}
		
		input_poll();
		SDL_Delay(20);
	}
	
	SDL_PauseAudio(0);
	stat("Focus regained, resuming play...");
}
Example #15
0
File: emu.c Project: Aleyr/nesemu2
int emu_mainloop()
{
	u8 *line = (u8*)mem_alloc(512);
	int i,p;
	u64 t,total,frames;

	//initialize the palette in case the rom isnt loaded first
	for(i=0;i<512;i++) {
		if(i < 32 && running == 0)
			video_updatepalette(i,i);
		line[i] = i;
	}

	//begin the main loop
	log_printf("emu_mainloop:  starting main loop...\n");
	total = 0;
	frames = 0;
	while(quit == 0) {
		t = system_gettick();
		system_checkevents();
		input_poll();
		video_startframe();
		if(running && nes->cart) {
			nes_frame();
		}
		else {
			for(i=0;i<240;i++) {
				for(p=0;p<256;p++)
					video_updatepixel(i,p,line[p]);
			}
		}
		video_endframe();
		total += system_gettick() - t;
		frames++;
	}
	log_printf("fps:  %f (%d frames)\n",(double)frames / (double)total * system_getfrequency(),frames);
	mem_free(line);
	return(0);
}
Example #16
0
void input_loop() {
  // After grabbing, the only way to quit via the keyboard
  // is via the special key combo that the input handling
  // code looks for. For this reason, we wait to grab until
  // we're ready to take input events. Ctrl+C works up until
  // this point.
  for (int i = 0; i < numDevices; i++) {
    if (ioctl(devices[i].fd, EVIOCGRAB, 1) < 0) {
      fprintf(stderr, "EVIOCGRAB failed with error %d\n", errno);
    }
  }

  // Any new input devices detected after this point will be grabbed immediately
  grabbingDevices = true;

  // Handle input events until the quit combo is pressed
  input_poll(input_handle_event);

  // Drain any remaining input events so they aren't sent to the terminal
  usleep(250000);
  input_drain();
}
Example #17
0
void speed_test(void)
{
	SDL_Rect textrect;
	
	uint32_t end = 0;
	fps = 0;
	
	ClearScreen(255, 0, 0);
	
	game.running = true;
	while(game.running)
	{
		if (SDL_GetTicks() >= end)
		{
			SDLS_VRAMSurface->h = 320;
			SDLS_VRAMSurface->cliprect.h = 320;
			textrect.x = 5;
			textrect.y = 250;
			textrect.w = 100;
			textrect.h = 10;
			SDL_FillRect(SDLS_VRAMSurface, &textrect, 0);
			
			char buffer[80];
			sprintf(buffer, "%d fps ", fps);
			direct_text_draw(5, 250, buffer);
			SDLS_VRAMSurface->h = 240;
			SDLS_VRAMSurface->cliprect.h = 240;
			
			input_poll();
			
			fps = 0;
			end = SDL_GetTicks() + 1000;
		}
		
		screen->Flip();
		fps++;
	}
}
Example #18
0
void org_test_miniloop(void)
{
uint32_t start = 0, curtime;
uint32_t counter;

	stat("Starting org test");
	
	font_draw(5, 5, "ORG test in progress...", 0, &greenfont);
	font_draw(5, 15, "Logging statistics to nx.log", 0, &greenfont);
	font_draw(5, 25, "Press any button to quit", 0, &greenfont);
	screen->Flip();
	
	music_set_enabled(1);
	music(32);
	
	last_sdl_key = -1;
	
	for(;;)
	{
		org_run();
		
		if (++counter > 1024)
		{
			counter = 0;
			
			curtime = SDL_GetTicks();
			if ((curtime - start) >= 100)
			{
				start = curtime;
				input_poll();
				
				if (last_sdl_key != -1)
					return;
			}
		}
	}
}
Example #19
0
File: test.c Project: eauc/gbadev
int main(void) {

  u32 i, j;

  busy_wait_vsync();

  display_control_init();

  while(1) {

    busy_wait_vsync();

    input_poll();

    if(input_hit_status.A) {

      REG_DISPLAY_CONTROL.mode = 3;
      REG_DISPLAY_CONTROL.render_background2 = TRUE;

      for(i = 0 ; i < panty_24bpp_data_height ; i++) {

	for(j = 0 ; j < panty_24bpp_data_width ; j++) {

	  M3_MEM_VIDEO[i * SCREEN_WIDTH + j] = 
	    panty_24bpp_data[i * panty_24bpp_data_width + j];

	}

      }

    }
    else if(input_hit_status.B) {

      REG_DISPLAY_CONTROL.mode = 4;
      REG_DISPLAY_CONTROL.render_background2 = TRUE;
      REG_DISPLAY_CONTROL.render_page = 0;

      for(i = 0 ; i < panty_8bpp_palette_size ; i++) {

	MEM_PALBLOCK_8BPP[PALBLOCK_8BPP_BACKGROUND][i] =
	  panty_8bpp_palette[i];

      }

      for(i = 0 ; i < panty_8bpp_data_height ; i++) {

	for(j = 0 ; j < panty_8bpp_data_width ; j++) {

	  m4_vid_page[i * SCREEN_WIDTH / 2 + j] = 
	    panty_8bpp_data[i * panty_8bpp_data_width + j];

	}

      }

    }
    else if(input_hit_status.L) {

      REG_DISPLAY_CONTROL.mode = 1;
      REG_DISPLAY_CONTROL.render_background2 = TRUE;

      REG_BACKGROUND2_CONTROL.charblock_index = 0;
      REG_BACKGROUND2_CONTROL.screenblock_index = 16;
      REG_BACKGROUND2_CONTROL.size = AFFINE_SIZE_32_32;
      REG_BACKGROUND2_CONTROL.palette_bpp = PALETTE_8BPP;
      REG_BACKGROUND2_OFFSET.Y = 0;
      REG_BACKGROUND2_OFFSET.Y = 0;
      REG_BACKGROUND2_AFFINE.attr0 = 256;
      REG_BACKGROUND2_AFFINE.attr1 = 0;
      REG_BACKGROUND2_AFFINE.attr2 = 0;
      REG_BACKGROUND2_AFFINE.attr3 = 256;
      REG_BACKGROUND2_AFFINE.dx = 0;
      REG_BACKGROUND2_AFFINE.dy = 0;

      for(i = 0 ; i < panty_8bpp_tiled_palette_size ; i++) {

	MEM_PALBLOCK_8BPP[PALBLOCK_8BPP_BACKGROUND][i] =
	  panty_8bpp_tiled_palette[i];

      }

      for(i = 0 ; i < panty_8bpp_tiled_tiles_size ; i++) {

	MEM_TILE_8BPP[0][i] = panty_8bpp_tiled_tiles[i];

      }

      u32 *mem_map = (u32 *)(MEM_MAP[16]);
      for(i = 0 ; i < panty_8bpp_tiled_tiles_height ; i++) {

      	for(j = 0 ; j < panty_8bpp_tiled_tiles_width/4+1 ; j++) {

      	  u32 pixel = 0;
      	  u32 base_tile = i * panty_8bpp_tiled_tiles_width + j * 4;
      	  pixel += ((base_tile + 0) & 0xFF) << 0;
      	  pixel += ((base_tile + 1) & 0xFF) << 8;
      	  pixel += ((base_tile + 2) & 0xFF) << 16;
      	  pixel += ((base_tile + 3) & 0xFF) << 24;

      	  mem_map[i * 8 + j] = pixel;
    
      	}
	
      }

    }
    else if(input_hit_status.R) {

      REG_DISPLAY_CONTROL.mode = 0;
      REG_DISPLAY_CONTROL.render_background2 = TRUE;

      REG_BACKGROUND2_CONTROL.charblock_index = 0;
      REG_BACKGROUND2_CONTROL.screenblock_index = 16;
      REG_BACKGROUND2_CONTROL.size = REGULAR_SIZE_32_32;
      REG_BACKGROUND2_CONTROL.palette_bpp = PALETTE_4BPP;
      REG_BACKGROUND2_OFFSET.Y = 0;
      REG_BACKGROUND2_OFFSET.Y = 0;
      REG_BACKGROUND2_AFFINE.attr0 = 256;
      REG_BACKGROUND2_AFFINE.attr1 = 0;
      REG_BACKGROUND2_AFFINE.attr2 = 0;
      REG_BACKGROUND2_AFFINE.attr3 = 256;
      REG_BACKGROUND2_AFFINE.dx = 0;
      REG_BACKGROUND2_AFFINE.dy = 0;

      for(i = 0 ; i < font_palette_size ; i++) {

	MEM_PALBLOCK_4BPP[PALBLOCK_4BPP_BACKGROUND][i] =
	  font_palette[i];

      }

      for(i = 0 ; i < font_tiles_size ; i++) {

	MEM_TILE_4BPP[0][i] = font_tiles[i];

      }

      u32 *mem_map = (u32 *)(MEM_MAP[16]);
      for(i = 0 ; i < 3 ; i++) {

	for(j = 0 ; j < 15 ; j++) {

	  u32 index = i * 30 + 2 * j;
	  u32 pixel = index + ((index + 1) << 16);

	  mem_map[i * 16 + j] = pixel;

	}
    
      }
      mem_map[48] = 0x005B005A;
      mem_map[49] = 0x005D005C;
      mem_map[50] = 0x0000005E;

    }

  }

}
bool core_ctl(enum core_ctl_state state, void *data)
{
    static bool   has_set_input_descriptors = false;
    static struct retro_callbacks retro_ctx;

    switch (state)
    {
    case CORE_CTL_RETRO_CHEAT_SET:
    {
        retro_ctx_cheat_info_t *info = (retro_ctx_cheat_info_t*)data;
        core.retro_cheat_set(info->index, info->enabled, info->code);
    }
    break;
    case CORE_CTL_RETRO_CHEAT_RESET:
        core.retro_cheat_reset();
        break;
    case CORE_CTL_RETRO_API_VERSION:
    {
        retro_ctx_api_info_t *api = (retro_ctx_api_info_t*)data;
        api->version = core.retro_api_version();
    }
    break;
    case CORE_CTL_SET_POLL_TYPE:
    {
        unsigned *poll_type = (unsigned*)data;
        core_poll_type = *poll_type;
    }
    break;
    case CORE_CTL_RETRO_SYMBOLS_INIT:
    {
        enum rarch_core_type *core_type = (enum rarch_core_type*)data;

        if (!core_type)
            return false;
        init_libretro_sym(*core_type, &core);
    }
    break;
    case CORE_CTL_RETRO_SET_CONTROLLER_PORT_DEVICE:
    {
        retro_ctx_controller_info_t *pad = (retro_ctx_controller_info_t*)data;
        if (!pad)
            return false;
        core.retro_set_controller_port_device(pad->port, pad->device);
    }
    break;
    case CORE_CTL_RETRO_GET_MEMORY:
    {
        retro_ctx_memory_info_t *info = (retro_ctx_memory_info_t*)data;
        if (!info)
            return false;
        info->size  = core.retro_get_memory_size(info->id);
        info->data  = core.retro_get_memory_data(info->id);
    }
    break;
    case CORE_CTL_RETRO_LOAD_GAME:
    {
        retro_ctx_load_content_info_t *load_info =
            (retro_ctx_load_content_info_t*)data;
        if (!load_info)
            return false;

        if (load_info->special)
            return core.retro_load_game_special(load_info->special->id, load_info->info, load_info->content->size);
        return core.retro_load_game(*load_info->content->elems[0].data ? load_info->info : NULL);
    }
    case CORE_CTL_RETRO_GET_SYSTEM_INFO:
    {
        struct retro_system_info *system = (struct retro_system_info*)data;
        if (!system)
            return false;
        core.retro_get_system_info(system);
    }
    break;
    case CORE_CTL_RETRO_UNSERIALIZE:
    {
        retro_ctx_serialize_info_t *info = (retro_ctx_serialize_info_t*)data;
        if (!info)
            return false;
        if (!core.retro_unserialize(info->data_const, info->size))
            return false;
    }
    break;
    case CORE_CTL_RETRO_SERIALIZE:
    {
        retro_ctx_serialize_info_t *info = (retro_ctx_serialize_info_t*)data;
        if (!info)
            return false;
        if (!core.retro_serialize(info->data, info->size))
            return false;
    }
    break;
    case CORE_CTL_RETRO_SERIALIZE_SIZE:
    {
        retro_ctx_size_info_t *info = (retro_ctx_size_info_t *)data;
        if (!info)
            return false;
        info->size = core.retro_serialize_size();
    }
    break;
    case CORE_CTL_RETRO_CTX_FRAME_CB:
    {
        retro_ctx_frame_info_t *info = (retro_ctx_frame_info_t*)data;
        if (!info || !retro_ctx.frame_cb)
            return false;

        retro_ctx.frame_cb(
            info->data, info->width, info->height, info->pitch);
    }
    break;
    case CORE_CTL_RETRO_CTX_POLL_CB:
        if (!retro_ctx.poll_cb)
            return false;
        retro_ctx.poll_cb();
        break;
    case CORE_CTL_RETRO_SET_ENVIRONMENT:
    {
        retro_ctx_environ_info_t *info = (retro_ctx_environ_info_t*)data;
        if (!info)
            return false;
        core.retro_set_environment(info->env);
    }
    break;
    case CORE_CTL_RETRO_GET_SYSTEM_AV_INFO:
    {
        struct retro_system_av_info *av_info = (struct retro_system_av_info*)data;
        if (!av_info)
            return false;
        core.retro_get_system_av_info(av_info);
    }
    break;
    case CORE_CTL_RETRO_RESET:
        core.retro_reset();
        break;
    case CORE_CTL_RETRO_INIT:
        core.retro_init();
        break;
    case CORE_CTL_RETRO_DEINIT:
        core.retro_deinit();
        uninit_libretro_sym(&core);
        break;
    case CORE_CTL_RETRO_UNLOAD_GAME:
        video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, NULL);
        audio_driver_ctl(RARCH_AUDIO_CTL_STOP, NULL);
        core.retro_unload_game();
        break;
    case CORE_CTL_RETRO_RUN:
        switch (core_poll_type)
        {
        case POLL_TYPE_EARLY:
            input_poll();
            break;
        case POLL_TYPE_LATE:
            core_input_polled = false;
            break;
        }
        if (core.retro_run)
            core.retro_run();
        if (core_poll_type == POLL_TYPE_LATE && !core_input_polled)
            input_poll();
        break;
    case CORE_CTL_SET_CBS:
        return retro_set_default_callbacks(data);
    case CORE_CTL_SET_CBS_REWIND:
        retro_set_rewind_callbacks();
        break;
    case CORE_CTL_INIT:
    {
        settings_t *settings = config_get_ptr();
        core_poll_type = settings->input.poll_type_behavior;
        if (!core_ctl(CORE_CTL_VERIFY_API_VERSION, NULL))
            return false;
        if (!retro_init_libretro_cbs(&retro_ctx))
            return false;
        core_ctl(CORE_CTL_RETRO_GET_SYSTEM_AV_INFO,
                 video_viewport_get_system_av_info());
        runloop_ctl(RUNLOOP_CTL_SET_FRAME_LIMIT, NULL);
    }
    break;
    case CORE_CTL_DEINIT:
        return retro_uninit_libretro_cbs(&retro_ctx);
    case CORE_CTL_VERIFY_API_VERSION:
    {
        unsigned api_version = core.retro_api_version();
        RARCH_LOG("Version of libretro API: %u\n", api_version);
        RARCH_LOG("Compiled against API: %u\n",    RETRO_API_VERSION);

        if (api_version != RETRO_API_VERSION)
        {
            RARCH_WARN("%s\n", msg_hash_to_str(MSG_LIBRETRO_ABI_BREAK));
            return false;
        }
    }
    break;
    case CORE_CTL_HAS_SET_INPUT_DESCRIPTORS:
        return has_set_input_descriptors;
    case CORE_CTL_SET_INPUT_DESCRIPTORS:
        has_set_input_descriptors = true;
        break;
    case CORE_CTL_UNSET_INPUT_DESCRIPTORS:
        has_set_input_descriptors = false;
        break;
    case CORE_CTL_NONE:
    default:
        break;
    }

    return true;
}
Example #21
0
void select_file_action(void *arg) {
	int selected = *((int *) arg);
	int i, j, k, fd, size;
	volatile uint8_t *tmp;
	
	switch(selected) {
		case 0:
			fd = fat_open(path, O_RDONLY);
			size = fat_fsize(fd);
	
			for(j = 0; j < size; j += 512) {
				terminal_clear();
				fat_read_sect(fd);
				for(i = 0; i < 512; i++) {
					if(fat_buf[i] < 32 || fat_buf[i] > 126)
						printf("?");
					else
						printf("%c", fat_buf[i]);
					
				}
				input_poll();
			}
			fat_close(fd);
			break;
		case 1:
			fd = fat_open(path, O_RDONLY);
			size = fat_fsize(fd);
	
			for(j = 0; j < size; j += 512) {
				terminal_clear();
				printf("\nSector %u\n", j >> 9);
				fat_read_sect(fd);
				for(i = 0; i < 256; i+=16) {
					tmp =((uint8_t *) fat_buf) + i;
					printf("%04x\t%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\t\t", 
						j + i,
						tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], 
						tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14], tmp[15]
					);
					for(k = 0; k < 16; k++) {
						if(tmp[k] < 32 || tmp[k] > 126)
							printf(".");
						else
							printf("%c", tmp[k]);
					}
					printf("\n");
					
				}
				input_poll();
				terminal_clear();
				printf("\nSector %u\n", j >> 9);
				for(i = 256; i < 512; i+=16) {
					tmp =((uint8_t *) fat_buf) + i;
					printf("%04x\t%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\t\t", 
						j + i,
						tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], 
						tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14], tmp[15]
					);
					for(k = 0; k < 16; k++) {
						if(tmp[k] < 32 || tmp[k] > 126)
							printf(".");
						else
							printf("%c", tmp[k]);
					}
					printf("\n");
					
				}
				input_poll();
			}
			fat_close(fd);

			break;
		case 2:
			{
				void *addr, *entry;
				fd = fat_open(path, O_RDONLY);
				if(hexload(get_byte, fd, hexload_write_byte, NULL, &entry) < 0) {
					printf("Invalid hex file");
					fat_close(fd);
					input_poll();
					break;
				}
				fat_close(fd);
				fd = fat_open(path, O_RDONLY);
				
				if(hexload(get_byte, fd, hexload_verify_byte, NULL, &addr) < 0) {
					printf("Hexload validate error at 0x%X\n", addr);
					fat_close(fd);
					input_poll();
					break;
				}
				
				__asm__ __volatile__ ("cpusha %dc\n");
				goto *addr;
				
				fat_close(fd);
				input_poll();
			}
			break;
		case 4:
			fd = fat_open(path, O_RDONLY);
			size = fat_fsize(fd);
			tmp = MEM_VGA_RAM;
			
			for(j = 512; j < size; j += 512) {
				fat_read_sect(fd);
				for(i = 0; i < 512; i++) {
					*tmp++ = fat_buf[i];
				}
			}
			fat_read_sect(fd);
			for(i = 0; i < j - size; i++) {
				*tmp++ = fat_buf[i];
			}
			
			fat_close(fd);
			input_poll();
			terminal_clear();
			break;
		case 5:
			load_hex_to_rom(path);
			input_poll();
			
			break;
		
		case 6:
			terminal_clear();
			printf("Loading WAV to RAM\n");
			
			fd = fat_open(path, O_RDONLY);
			size = fat_fsize(fd);
			tmp = (volatile uint8_t *) SDRAM_BASE;
			
			printf("0/%u kB", size >> 10);
		
			for(j = 0; j < size; j += 512) {
				fat_read_sect(fd);
				for(i = 0; i < 512; i++) {
					*tmp++ = fat_buf[i];
				}
				printf("\r%u/%u kB", j >> 10, size >> 10);
			}
			fat_close(fd);
			printf("\n");
			wav_play((uint8_t *) SDRAM_BASE);
			printf("Press any key\n");
			input_poll();
			terminal_clear();
	}
}
static void input_poll_maybe(void)
{
    if (core_poll_type == POLL_TYPE_NORMAL)
        input_poll();
}
Example #23
0
// Check for CTRL-C typed by reading all available characters.
// In cooked mode we should get SIGINT, no need to check.
void os_breakcheck(void)
{
  if (curr_tmode == TMODE_RAW && input_poll(0))
    fill_input_buf(false);
}
Example #24
0
File: emu.c Project: Aleyr/nesemu2
int emu_mainloop_test(char *script)
{
	u64 t,total,frames;
	char line[1024],*rom,*test,*p;
	memfile_t *file;
	int testrunning = 0;

	log_printf("emu_mainloop_test:  starting automated tests from '%s'\n",script);

	if((file = memfile_open(script,"rb")) == 0) {
		log_printf("emu_mainloop_test:  error opening test script '%s'\n",script);
		return(0);
	}

	//begin the main loop
	total = 0;
	frames = 0;
	while(quit == 0) {
		if(nes->movie.mode & (MOVIE_CRCFAIL | MOVIE_CRCPASS)) {
			if(nes->movie.mode & MOVIE_CRCFAIL)
				log_printf("emu_mainloop_test:  test over.  failed. (rom = '%s')\n",rom);
			if(nes->movie.mode & MOVIE_CRCPASS)
				log_printf("emu_mainloop_test:  test over.  passed. (rom = '%s')\n",rom);
			testrunning = 0;
		}
		if(testrunning == 0) {
			do {
				if(memfile_gets(line,1024,file) == 0) {
					quit++;
					p = 0;
					break;
				}
				p = str_eatwhitespace(line);
				log_printf("line:  %s",p);
			} while(*p == '#');
			if(p == 0)
				break;
			rom = str_eatwhitespace(strtok(p,";\r\n"));
			test = str_eatwhitespace(strtok(0,";\r\n"));
			log_printf("rom, test = '%s', '%s'\n",rom,test);
			if(emu_event(E_LOADROM,(void*)rom) == 0) {
				if(emu_event(E_LOADMOVIE,(void*)test) == 0) {
					emu_event(E_PLAYMOVIE,0);
					testrunning = 1;
				}
			}
		}
		t = system_gettick();
		system_checkevents();
		input_poll();
		video_startframe();
		if(running && nes->cart) {
			nes_frame();
		}
		video_endframe();
		total += system_gettick() - t;
		frames++;
	}
	log_printf("fps:  %f (%d frames)\n",(double)frames / (double)total * system_getfrequency(),frames);
	memfile_close(file);
	return(0);
}
Example #25
0
static void core_input_state_poll_maybe(void)
{
   if (current_core.poll_type == POLL_TYPE_NORMAL)
      input_poll();
}
Example #26
0
File: test.c Project: eauc/gbadev
int main(void) {

  object_block_t object_buffer = { { {0, 0} }, };
  object_attrblock_pt object_attribute_buffer = 
    (object_attrblock_pt)object_buffer;
  u32 count = 0;
  bool_t changed = FALSE;

  busy_wait_vsync();

  display_control_init();
  REG_DISPLAY_CONTROL.render_object = TRUE;

  memset(MEM_PALBLOCK,0,sizeof(palblock_t));
  MEM_PALBLOCK_4BPP[PALBLOCK_4BPP_OBJECT+0][1] = RGB15_RED;
  MEM_PALBLOCK_4BPP[PALBLOCK_4BPP_OBJECT+0][2] = RGB15_GREEN;
  MEM_PALBLOCK_4BPP[PALBLOCK_4BPP_OBJECT+1][1] = RGB15_BLUE;
  MEM_PALBLOCK_4BPP[PALBLOCK_4BPP_OBJECT+1][2] = RGB15_PURPLE;

  memset(MEM_TILE,0,CHARBLOCK_MAX * sizeof(charblock_4bpp_t));
  memset(MEM_TILE[CHARBLOCK_OBJECT]+0,0x11,sizeof(tile_t));
  memset(MEM_TILE[CHARBLOCK_OBJECT]+3,0x22,sizeof(tile_t));

  object_init(object_buffer,OBJECT_MAX);
  object_copy(MEM_OBJECT,object_buffer,OBJECT_MAX);

  object_attribute_buffer[0].X = 50;
  object_attribute_buffer[0].Y = 30;
  object_attribute_buffer[0].size = SIZE_16;
  object_attribute_buffer[0].palblock_index = 0;
  object_attribute_buffer[0].mode = MODE_NORMAL;
  object_copy(MEM_OBJECT,object_buffer,1);

  while(1) {

    busy_wait_vsync();
    count = (count + 1) % 1;
    if(0 == count) {

      changed = FALSE;

      input_poll();
      if(input_active()) {

	object_attribute_setX(object_attribute_buffer,
			      object_attribute_buffer[0].X + 
			      input_tribool_horizontal());
	object_attribute_setY(object_attribute_buffer,
			      object_attribute_buffer[0].Y + 
			      input_tribool_vertical());
	changed = TRUE;

      }
      if(input_hit_status.A) {

	object_attribute_buffer[0].palblock_index ^= 1;
	changed = TRUE;

      }
      if(input_released_status.A) {

	object_attribute_buffer[0].palblock_index ^= 1;
	changed = TRUE;

      }
      if(input_hit_status.L) {

	object_attribute_buffer[0].horizontal_flip ^= 1;
	changed = TRUE;

      }
      if(input_released_status.L) {

	object_attribute_buffer[0].horizontal_flip ^= 1;
	changed = TRUE;

      }
      if(input_hit_status.R) {

	object_attribute_buffer[0].vertical_flip ^= 1;
	changed = TRUE;

      }
      if(input_released_status.R) {

	object_attribute_buffer[0].vertical_flip ^= 1;
	changed = TRUE;

      }
      if(changed) {

	object_copy(MEM_OBJECT,object_buffer,1);

      }

    }

  }

}
Example #27
0
static inline void run_tick()
{
static bool can_tick = true;
static bool last_freezekey = false;
static bool last_framekey = false;
static int frameskip = 0;

	input_poll();
	
	// input handling for a few global things
	if (justpushed(ESCKEY))
	{
		if (settings->instant_quit)
		{
			game.running = false;
		}
		else if (!game.paused)		// no pause from Options
		{
			game.pause(GP_PAUSED);
		}
	}
	else if (justpushed(F3KEY))
	{
		game.pause(GP_OPTIONS);
	}
	
	// freeze frame
	if (settings->enable_debug_keys)
	{
		if (inputs[FREEZE_FRAME_KEY] && !last_freezekey)
		{
			can_tick = true;
			freezeframe ^= 1;
			framecount = 0;
		}
		
		if (inputs[FRAME_ADVANCE_KEY] && !last_framekey)
		{
			can_tick = true;
			if (!freezeframe)
			{
				freezeframe = 1;
				framecount = 0;
			}
		}
		
		last_freezekey = inputs[FREEZE_FRAME_KEY];
		last_framekey = inputs[FRAME_ADVANCE_KEY];
	}
	
	// fast-forward key (F5)
	if (inputs[FFWDKEY] && (settings->enable_debug_keys || Replay::IsPlaying()))
	{
		game.ffwdtime = 2;
	}
	
	if (can_tick)
	{
		game.tick();
		
		if (freezeframe)
		{
			char buf[1024];
			sprintf(buf, "[] Tick %d", framecount++);
			font_draw_shaded(4, (SCREEN_HEIGHT-GetFontHeight()-4), buf, 0, &greenfont);
			can_tick = false;
		}
		else
		{
			Replay::DrawStatus();
		}
		
		if (settings->show_fps)
		{
			update_fps();
		}
		
		if (!flipacceltime)
		{
			//platform_sync_to_vblank();
			screen->Flip();
		}
		else
		{
			flipacceltime--;
			if (--frameskip < 0)
			{
				screen->Flip();
				frameskip = 256;
			}
		}
		
		memcpy(lastinputs, inputs, sizeof(lastinputs));
	}
	else
	{	// frame is frozen; don't hog CPU
		SDL_Delay(20);
	}
	
	// immediately after a game tick is when we have the most amount of time before
	// the game needs to run again. so now's as good a time as any for some
	// BGM audio processing, wouldn't you say?
	org_run();
}
Example #28
0
File: test.c Project: eauc/gbadev
int main(void) {

    u32 count=0;
    //  u32 test=0;

    color_t clean = RGB15_BLACK;
    color_t up = RGB15_RED;
    color_t hit = RGB15_BLUE;
    color_t released = RGB15_PURPLE;
    color_t down = RGB15_GREEN;

    input_status_t previous_change  = {0,0,0,0,0,0,0,0,0,0};

    busy_wait_vsync();

    display_control_init();

    REG_DISPLAY_CONTROL.mode = 3;
    REG_DISPLAY_CONTROL.render_background2 = TRUE;

    m3_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],up);
    m3_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],up);

    m3_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],up);
    m3_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],up);

    m3_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],up);
    m3_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],up);
    m3_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],up);
    m3_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],up);

    m3_circle(A_coord[0],A_coord[1],A_coord[2],up);
    m3_circle(B_coord[0],B_coord[1],B_coord[2],up);

    while(1) {

        count = (count + 1) % 10;
        busy_wait_vsync();
        if(0 == count) {

            input_poll();
            if(*((u32 *)&input_changed_status)) {

                *((u32 *)&previous_change) = *((u32 *)&input_changed_status);
                if(input_hit_status.A) {

                    m3_circle(A_coord[0],A_coord[1],A_coord[2],hit);

                }
                else if(input_released_status.A) {

                    m3_filled_circle(A_coord[0],A_coord[1],A_coord[2],clean);
                    m3_circle(A_coord[0],A_coord[1],A_coord[2],released);

                }
                if(input_hit_status.B) {

                    m3_circle(B_coord[0],B_coord[1],B_coord[2],hit);

                }
                else if(input_released_status.B) {

                    m3_filled_circle(B_coord[0],B_coord[1],B_coord[2],clean);
                    m3_circle(B_coord[0],B_coord[1],B_coord[2],released);

                }
                if(input_hit_status.L) {

                    m3_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],hit);

                }
                else if(input_released_status.L) {

                    m3_filled_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],clean);
                    m3_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],released);

                }
                if(input_hit_status.R) {

                    m3_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],hit);

                }
                else if(input_released_status.R) {

                    m3_filled_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],clean);
                    m3_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],released);

                }
                if(input_hit_status.start) {

                    m3_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],hit);

                }
                else if(input_released_status.start) {

                    m3_filled_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],clean);
                    m3_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],released);

                }
                if(input_hit_status.select) {

                    m3_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],hit);

                }
                else if(input_released_status.select) {

                    m3_filled_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],clean);
                    m3_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],released);

                }
                if(input_hit_status.up) {

                    m3_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],hit);

                }
                else if(input_released_status.up) {

                    m3_filled_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],clean);
                    m3_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],released);

                }
                if(input_hit_status.down) {

                    m3_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],hit);

                }
                else if(input_released_status.down) {

                    m3_filled_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],clean);
                    m3_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],released);

                }
                if(input_hit_status.left) {

                    m3_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],hit);

                }
                else if(input_released_status.left) {

                    m3_filled_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],clean);
                    m3_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],released);

                }
                if(input_hit_status.right) {

                    m3_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],hit);

                }
                else if(input_released_status.right) {

                    m3_filled_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],clean);
                    m3_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],released);

                }

            }
            else {

                if(previous_change.A) {

                    if(KEY_UP == input_current_status.A) {

                        m3_circle(A_coord[0],A_coord[1],A_coord[2],up);

                    }
                    else {

                        m3_filled_circle(A_coord[0],A_coord[1],A_coord[2],down);

                    }

                }
                if(previous_change.B) {

                    if(KEY_UP == input_current_status.B) {

                        m3_circle(B_coord[0],B_coord[1],B_coord[2],up);

                    }
                    else {

                        m3_filled_circle(B_coord[0],B_coord[1],B_coord[2],down);

                    }

                }
                if(previous_change.L) {

                    if(KEY_UP == input_current_status.L) {

                        m3_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],up);

                    }
                    else {

                        m3_filled_rect(L_coord[0],L_coord[1],L_coord[2],L_coord[3],down);

                    }

                }
                if(previous_change.R) {

                    if(KEY_UP == input_current_status.R) {

                        m3_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],up);

                    }
                    else {

                        m3_filled_rect(R_coord[0],R_coord[1],R_coord[2],R_coord[3],down);

                    }

                }
                if(previous_change.start) {

                    if(KEY_UP == input_current_status.start) {

                        m3_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],up);

                    }
                    else {

                        m3_filled_rect(start_coord[0],start_coord[1],start_coord[2],start_coord[3],down);

                    }

                }
                if(previous_change.select) {

                    if(KEY_UP == input_current_status.select) {

                        m3_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],up);

                    }
                    else {

                        m3_filled_rect(select_coord[0],select_coord[1],select_coord[2],select_coord[3],down);

                    }

                }
                if(previous_change.up) {

                    if(KEY_UP == input_current_status.up) {

                        m3_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],up);

                    }
                    else {

                        m3_filled_rect(up_coord[0],up_coord[1],up_coord[2],up_coord[3],down);

                    }

                }
                if(previous_change.down) {

                    if(KEY_UP == input_current_status.down) {

                        m3_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],up);

                    }
                    else {

                        m3_filled_rect(down_coord[0],down_coord[1],down_coord[2],down_coord[3],down);

                    }

                }
                if(previous_change.right) {

                    if(KEY_UP == input_current_status.right) {

                        m3_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],up);

                    }
                    else {

                        m3_filled_rect(right_coord[0],right_coord[1],right_coord[2],right_coord[3],down);

                    }

                }
                if(previous_change.left) {

                    if(KEY_UP == input_current_status.left) {

                        m3_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],up);

                    }
                    else {

                        m3_filled_rect(left_coord[0],left_coord[1],left_coord[2],left_coord[3],down);

                    }

                }
                *((u32 *)&previous_change) = 0;

            }

        }

    }

}