void retro_run(void) { bool updated = false; static int frames = 0; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) check_variables(); poll_cb(); gbemu_update_input(); RETRO_PERFORMANCE_INIT(gbemu_main_func); RETRO_PERFORMANCE_START(gbemu_main_func); gbemu_run(); RETRO_PERFORMANCE_STOP(gbemu_main_func); // if(!GB.LCDC.LCD_enable) // memset(gbemu_frame, 0xFF, sizeof(gbemu_frame)); #ifdef VIEW_TILEMAP gbemu_draw_sprite_map(); gbemu_draw_bgmap(); gbemu_draw_tilemap(); gbemu_dump_memory(); #endif uint16_t* read_pos = gbemu_sound_buffer; while (read_pos < GB.APU.write_pos - 2048) { audio_batch_cb(read_pos, 1024); read_pos += 2048; } audio_batch_cb(read_pos, (GB.APU.write_pos - read_pos) >> 1); // gbemu_printf("samples played : %i\n", (GB.APU.write_pos - gbemu_sound_buffer) >> 1); video_cb(gbemu_frame, GBEMU_DRAWBUFFER_W, GBEMU_DRAWBUFFER_H, GBEMU_DRAWBUFFER_W * 2); // DEBUG_HOLD(); // gbemu_printf("frame : %i\n", frames); frames++; fflush(stdout); // gbemu_check_exit_request(); }
void retro_run(void) { int i; bool updated = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) check_variables(); input_poll_cb(); for (i=0; i < 130; i++) KBD_RES(i); for (i=0; i < sizeof(keymap)/sizeof(keymap_t); i++) if (input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0, keymap[i].retro)) KBD_SET(keymap[i].fmsx); joystate = 0; for (i = 0; i < sizeof(joymap) / sizeof(keymap_t); i++) { if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, joymap[i].retro)) { if (i < joy_keyboard_begin) JOY_SET(joymap[i].fmsx); else KBD_SET(joymap[i].fmsx); } } RETRO_PERFORMANCE_INIT(core_retro_run); RETRO_PERFORMANCE_START(core_retro_run); RunZ80(&CPU); RenderAndPlayAudio(SND_RATE / 60); RETRO_PERFORMANCE_STOP(core_retro_run); fflush(stdout); #ifdef PSP static unsigned int __attribute__((aligned(16))) d_list[32]; void* const texture_vram_p = (void*) (0x44200000 - (640 * 480)); // max VRAM address - frame size sceKernelDcacheWritebackRange(XBuf, 256*240 ); sceGuStart(GU_DIRECT, d_list); sceGuCopyImage(GU_PSM_5650, 0, 0, image_buffer_width, image_buffer_height, image_buffer_width, image_buffer, 0, 0, image_buffer_width, texture_vram_p); sceGuTexSync(); sceGuTexImage(0, 512, 256, image_buffer_width, texture_vram_p); sceGuTexMode(GU_PSM_5650, 0, 0, GU_FALSE); sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGB); sceGuDisable(GU_BLEND); sceGuFinish(); video_cb(texture_vram_p, image_buffer_width, image_buffer_height, image_buffer_width * sizeof(uint16_t)); #else video_cb(image_buffer, image_buffer_width, image_buffer_height, image_buffer_width * sizeof(uint16_t)); #endif }
void update_frame_ge(void) { check_gba_video_status(); // return; // printf("video mode: %u\n", gba_video_registers->lcd_control.bg_mode); int i; palette_ram_8bit[0]=palette_ram[0]&0x7FFF; for (i=1; i<256;i++) palette_ram_8bit[i]=palette_ram[i]|0x8000; palette_ram_8bit[256]=palette_ram[256]&0x7FFF; for (i=257; i<512;i++) palette_ram_8bit[i]=palette_ram[i]|0x8000; for (i=0; i<512;i++) { if (i&0xF) palette_ram_4bit[i]=palette_ram_8bit[i]|0x8000; else palette_ram_4bit[i]=palette_ram_8bit[i]&0x7FFF; } // sceKernelDcacheWritebackAll(); // sceKernelDcacheWritebackInvalidateAll(); RETRO_PERFORMANCE_INIT(gu_sync_time); RETRO_PERFORMANCE_START(gu_sync_time); sceGuSync(0,0); RETRO_PERFORMANCE_STOP(gu_sync_time); main_context_status= sceGuGetAllStatus(); sceGeSaveContext(&main_context_buffer); sceGuSetCallback(GU_CALLBACK_FINISH, list_finish_callback); sceGuStart(GU_DIRECT, d_list); init_3Dprojection(); setup_3Dprojection_16bit(); sceGuDisable(GU_DEPTH_TEST); // sceGuDepthBuffer((void*)VRAM_DEPTH,512); sceGuDepthMask(GU_TRUE); sceGuDepthRange(0,65535); sceGuDisable(GU_CULL_FACE); sceGuDisable(GU_CLIP_PLANES); // sceGuTexFilter(GU_NEAREST,GU_NEAREST); RETRO_PERFORMANCE_INIT(gba_upload_vram_proc); RETRO_PERFORMANCE_START(gba_upload_vram_proc); gba_upload_vram(); RETRO_PERFORMANCE_STOP(gba_upload_vram_proc); // sceGuDrawBufferList(GU_PSM_5551, GBA_FRAME_TEXTURE_GU, GBA_LINE_SIZE); sceGuDrawBufferList(GU_PSM_8888, GBA_FRAME_TEXTURE_GU, GBA_LINE_SIZE); sceGuDepthBuffer(GBA_DEPTH_BUFFER, GBA_LINE_SIZE); sceGuScissor(0,0,GBA_SCREEN_WIDTH,GBA_SCREEN_HEIGHT); sceGuScissor(0,0,240,160); sceGuEnable(GU_SCISSOR_TEST); // sceGuClearColor(0x000000FF); // sceGuClearColor((palette_ram[0]&0x1F<<3)|(palette_ram[0]&0x3E0<<6)|(palette_ram[0]&0x7C00<<9)|0xFF000000); sceGuClearColor(GU_COLOR(((palette_ram[0]>> 0) & 31) / 31.0f, ((palette_ram[0]>> 5) & 31) / 31.0f, ((palette_ram[0]>>10) & 31) / 31.0f, 1.0)); sceGuClear(GU_COLOR_BUFFER_BIT); // if (gba_draw_bg[gba_video_registers->lcd_control.bg_mode]) // gba_draw_bg[gba_video_registers->lcd_control.bg_mode](); RETRO_PERFORMANCE_INIT(gba_draw_bg_mode0_proc); RETRO_PERFORMANCE_START(gba_draw_bg_mode0_proc); gba_draw_bg_mode0(); RETRO_PERFORMANCE_STOP(gba_draw_bg_mode0_proc); // sceGuFinish(); sceGuFinishId(GBA_DISPLAY_LIST_ID); // RETRO_PERFORMANCE_INIT(gu_sync_time); // RETRO_PERFORMANCE_START(gu_sync_time); // sceGuSync(0,0); // RETRO_PERFORMANCE_STOP(gu_sync_time); }
static void gba_draw_bg_mode0 (void) { // goto show_tiles; RETRO_PERFORMANCE_INIT(draw_bgs_procs); RETRO_PERFORMANCE_START(draw_bgs_procs); sceGuEnable(GU_BLEND); sceGuBlendFunc(GU_ADD,GU_SRC_ALPHA,GU_ONE_MINUS_SRC_ALPHA,0xFFFFFFFF,0xFFFFFFFF); // sceGuEnable(GU_DEPTH_TEST); sceGuDepthMask(GU_FALSE); sceGuDepthFunc(GU_GEQUAL); // sceGuDisable(GU_BLEND); //BG0 if (gba_video_registers->lcd_control.screen_display_BG3) draw_bg(&gba_video_registers->BG3_control, &gba_video_registers->BG3_scroll); if (gba_video_registers->lcd_control.screen_display_BG2) draw_bg(&gba_video_registers->BG2_control, &gba_video_registers->BG2_scroll); if (gba_video_registers->lcd_control.screen_display_BG1) draw_bg(&gba_video_registers->BG1_control, &gba_video_registers->BG1_scroll); if (gba_video_registers->lcd_control.screen_display_BG0) draw_bg(&gba_video_registers->BG0_control, &gba_video_registers->BG0_scroll); RETRO_PERFORMANCE_STOP(draw_bgs_procs); RETRO_PERFORMANCE_INIT(draw_sprites_proc); RETRO_PERFORMANCE_START(draw_sprites_proc); // draw_sprites_old(); // sceGuClutMode(GU_PSM_5551,0,0xFF,32); draw_sprites(); RETRO_PERFORMANCE_STOP(draw_sprites_proc); return; show_tiles: sceGuTexMode(GU_PSM_T16, 0, 0, GU_TRUE); sceGuClutMode(GU_PSM_5551,0,0xFF,0); sceGuClutLoad(32, palette_ram); sceGuDisable(GU_BLEND); sceGuEnable(GU_TEXTURE_2D); sceGuTexFunc(GU_TFX_REPLACE,GU_TCC_RGB); // sceGuClutMode(GU_PSM_4444,0,0xFF,0); // sceGuClutLoad(32, index_copy_clut); if (show_4bit_tilemap) { sceGuTexImage(0, 256, 256, 256, ((u16*)GBA_VRAMTEXTURE_4bit) + 256 * 256 * tilemap_offset); sceGuDrawArray(GU_SPRITES, GU_TEXTURE_16BIT | GU_VERTEX_16BIT | GU_TRANSFORM_2D, 2, NULL,(void*)frame_256_256); } else { sceGuTexImage(0, 128, 256, 128, ((u16*)GBA_VRAMTEXTURE_8bit) + 128 * 256 * tilemap_offset); sceGuDrawArray(GU_SPRITES, GU_TEXTURE_16BIT | GU_VERTEX_16BIT | GU_TRANSFORM_2D, 2, NULL,(void*)frame_128_256); } }