⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 2 页
字号:
        affine_reference_x[0] =         (s32)(address32(io_registers, 0x28) << 4) >> 4;        affine_reference_y[0] =         (s32)(address32(io_registers, 0x2C) << 4) >> 4;        affine_reference_x[1] =         (s32)(address32(io_registers, 0x38) << 4) >> 4;        affine_reference_y[1] =         (s32)(address32(io_registers, 0x3C) << 4) >> 4;        for(i = 0; i < 4; i++)        {          if(dma[i].start_type == DMA_START_VBLANK)            dma_transfer(dma + i);        }      }      else      if(vcount == 228)      {        // Transition from vblank to next screen        dispstat &= ~0x01;        frame_ticks++;#ifndef PSP_BUILD/*        printf("frame update (%x), %d instructions total, %d RAM flushes\n",         reg[REG_PC], instruction_count - last_frame, flush_ram_count);        last_frame = instruction_count;        print_memory_stats(&memory_reads_u8, memory_region_access_read_u8,         "unsigned 8bit read");        print_memory_stats(&memory_reads_s8, memory_region_access_read_s8,         "signed 8bit read");        print_memory_stats(&memory_reads_u16, memory_region_access_read_u16,         "unsigned 16bit read");        print_memory_stats(&memory_reads_s16, memory_region_access_read_s16,         "signed 16bit read");        print_memory_stats(&memory_reads_u32, memory_region_access_read_u32,         "32bit read");        print_memory_stats(&memory_writes_u8, memory_region_access_write_u8,         "8bit write");        print_memory_stats(&memory_writes_u16, memory_region_access_write_u16,         "16bit write");        print_memory_stats(&memory_writes_u32, memory_region_access_write_u32,         "32bit write");        printf("%d gbc audio updates\n", gbc_update_count);        printf("%d oam updates\n", oam_update_count); */        gbc_update_count = 0;        oam_update_count = 0;        flush_ram_count = 0;#endif        if(update_input())          return execute_cycles;        update_gbc_sound(cpu_ticks);        synchronize();        update_screen();        if(update_backup_flag)          update_backup();        process_cheats();        vcount = 0;      }      if(vcount == (dispstat >> 8))      {        // vcount trigger        dispstat |= 0x04;        if(dispstat & 0x20)        {          irq_raised |= IRQ_VCOUNT;        }      }      else      {        dispstat &= ~0x04;      }      io_registers[REG_VCOUNT] = vcount;    }    io_registers[REG_DISPSTAT] = dispstat;  }  if(irq_raised)    raise_interrupt(irq_raised);  execute_cycles = video_count;  check_timer(0);  check_timer(1);  check_timer(2);  check_timer(3);  return execute_cycles;}u64 last_screen_timestamp = 0;u32 frame_speed = 15000;#ifdef PSP_BUILDu32 real_frame_count = 0;u32 virtual_frame_count = 0;u32 num_skipped_frames = 0;void vblank_interrupt_handler(u32 sub, u32 *parg){  real_frame_count++;}void synchronize(){  char char_buffer[64];  u64 new_ticks, time_delta;  s32 used_frameskip = frameskip_value;  if(!synchronize_flag)  {    print_string("--FF--", 0xFFFF, 0x000, 0, 0);    used_frameskip = 4;    virtual_frame_count = real_frame_count - 1;  }  skip_next_frame = 0;  virtual_frame_count++;  if(real_frame_count >= virtual_frame_count)  {    if((real_frame_count > virtual_frame_count) &&     (current_frameskip_type == auto_frameskip) &&     (num_skipped_frames < frameskip_value))    {      skip_next_frame = 1;      num_skipped_frames++;    }    else    {      virtual_frame_count = real_frame_count;      num_skipped_frames = 0;    }    // Here so that the home button return will eventually work.    // If it's not running fullspeed anyway this won't really hurt    // it much more.    delay_us(1);  }  else  {    if(synchronize_flag)      sceDisplayWaitVblankStart();  }  if(current_frameskip_type == manual_frameskip)  {    frameskip_counter = (frameskip_counter + 1) %     (used_frameskip + 1);    if(random_skip)    {      if(frameskip_counter != (rand() % (used_frameskip + 1)))        skip_next_frame = 1;    }    else    {      if(frameskip_counter)        skip_next_frame = 1;    }  }/*  sprintf(char_buffer, "%08d %08d %d %d %d\n",   real_frame_count, virtual_frame_count, num_skipped_frames,   real_frame_count - virtual_frame_count, skip_next_frame);  print_string(char_buffer, 0xFFFF, 0x0000, 0, 10); *//*    sprintf(char_buffer, "%02d %02d %06d %07d", frameskip, (u32)ms_needed,     ram_translation_ptr - ram_translation_cache, rom_translation_ptr -     rom_translation_cache);    print_string(char_buffer, 0xFFFF, 0x0000, 0, 0);*/}#elseu32 ticks_needed_total = 0;float us_needed = 0.0;u32 frames = 0;const u32 frame_interval = 60;void synchronize(){  u64 new_ticks;  u64 time_delta;  char char_buffer[64];  get_ticks_us(&new_ticks);  time_delta = new_ticks - last_screen_timestamp;  last_screen_timestamp = new_ticks;  ticks_needed_total += time_delta;  skip_next_frame = 0;  if((time_delta < frame_speed) && synchronize_flag)  {    delay_us(frame_speed - time_delta);  }  frames++;  if(frames == frame_interval)  {    us_needed = (float)ticks_needed_total / frame_interval;    ticks_needed_total = 0;    frames = 0;  }  if(current_frameskip_type == manual_frameskip)  {    frameskip_counter = (frameskip_counter + 1) %     (frameskip_value + 1);    if(random_skip)    {      if(frameskip_counter != (rand() % (frameskip_value + 1)))        skip_next_frame = 1;    }    else    {      if(frameskip_counter)        skip_next_frame = 1;    }  }  if(synchronize_flag == 0)    print_string("--FF--", 0xFFFF, 0x000, 0, 0);  sprintf(char_buffer, "gpSP: %.1fms %.1ffps", us_needed / 1000.0,   1000000.0 / us_needed);  SDL_WM_SetCaption(char_buffer, "gpSP");/*    sprintf(char_buffer, "%02d %02d %06d %07d", frameskip, (u32)ms_needed,     ram_translation_ptr - ram_translation_cache, rom_translation_ptr -     rom_translation_cache);    print_string(char_buffer, 0xFFFF, 0x0000, 0, 0);*/}#endifvoid quit(){  if(!update_backup_flag)    update_backup_force();  sound_exit();#ifdef PSP_BUILD  sceKernelExitGame();#else  SDL_Quit();  exit(0);#endif}void reset_gba(){  init_main();  init_memory();  init_cpu();  reset_sound();}#ifdef PSP_BUILDu32 file_length(u8 *filename, s32 dummy){  SceIoStat stats;  sceIoGetstat(filename, &stats);  return stats.st_size;}void delay_us(u32 us_count){  sceKernelDelayThread(us_count);}void get_ticks_us(u64 *tick_return){  u64 ticks;  sceRtcGetCurrentTick(&ticks);  *tick_return = (ticks * 1000000) / sceRtcGetTickResolution();}#elseu32 file_length(u8 *dummy, FILE *fp){  u32 length;  fseek(fp, 0, SEEK_END);  length = ftell(fp);  fseek(fp, 0, SEEK_SET);  return length;}void delay_us(u32 us_count){  SDL_Delay(us_count / 1000);}void get_ticks_us(u64 *ticks_return){  *ticks_return = (SDL_GetTicks() * 1000);}#endifvoid change_ext(u8 *src, u8 *buffer, u8 *extension){  u8 *dot_position;  strcpy(buffer, src);  dot_position = strrchr(buffer, '.');  if(dot_position)    strcpy(dot_position, extension);}#define main_savestate_builder(type)                                          \void main_##type##_savestate(file_tag_type savestate_file)                    \{                                                                             \  file_##type##_variable(savestate_file, cpu_ticks);                          \  file_##type##_variable(savestate_file, execute_cycles);                     \  file_##type##_variable(savestate_file, video_count);                        \  file_##type##_array(savestate_file, timer);                                 \}                                                                             \main_savestate_builder(read);main_savestate_builder(write_mem);void print_out(u32 address, u32 pc){  char buffer[256];  sprintf(buffer, "patching from gp8 %x", address);  print_string(buffer, 0xFFFF, 0x0000, 0, 0);  update_screen();  delay_us(5000000);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -