📄 main.c
字号:
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 + -