void EMU_runCore() { NDS_beginProcessingInput(); NDS_endProcessingInput(); NDS_exec<false>(); if (soundEnabled) SPU_Emulate_user(true); }
/* Update NDS keypad */ void update_keypad(u16 keys) { // Set raw inputs { buttonstruct<bool> input = {}; input.G = (keys>>12)&1; input.E = (keys>>8)&1; input.W = (keys>>9)&1; input.X = (keys>>10)&1; input.Y = (keys>>11)&1; input.A = (keys>>0)&1; input.B = (keys>>1)&1; input.S = (keys>>3)&1; input.T = (keys>>2)&1; input.U = (keys>>6)&1; input.D = (keys>>7)&1; input.L = (keys>>5)&1; input.R = (keys>>4)&1; input.F = (keys>>14)&1; RunAntipodalRestriction(input); NDS_setPad( input.R, input.L, input.D, input.U, input.T, input.S, input.B, input.A, input.Y, input.X, input.W, input.E, input.G, input.F); } // Set real input NDS_beginProcessingInput(); { UserButtons& input = NDS_getProcessingUserInput().buttons; ApplyAntipodalRestriction(input); } NDS_endProcessingInput(); }
/* Update NDS keypad */ void update_keypad(u16 keys) { NDS_beginProcessingInput(); UserButtons& input = NDS_getProcessingUserInput().buttons; input.G = (keys>>12)&1; input.E = (keys>>8)&1; input.W = (keys>>9)&1; input.X = (keys>>10)&1; input.Y = (keys>>11)&1; input.A = (keys>>0)&1; input.B = (keys>>1)&1; input.S = (keys>>3)&1; input.T = (keys>>2)&1; input.U = (keys>>6)&1; input.D = (keys>>7)&1; input.L = (keys>>5)&1; input.R = (keys>>4)&1; input.F = 0; NDS_endProcessingInput(); }
void core() { NDS_beginProcessingInput(); NDS_endProcessingInput(); NDS_exec<false>(); SPU_Emulate_user(); }
void retro_run (void) { struct LayoutData layout; bool updated = false; bool have_touch = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) { check_variables(false); struct retro_system_av_info new_av_info; retro_get_system_av_info(&new_av_info); environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &new_av_info); } poll_cb(); get_layout_params(current_layout, screen_buf, &layout); if(pointer_device != 0) { int16_t analogX = 0; int16_t analogY = 0; float final_acceleration = analog_stick_acceleration * (1.0 + (float)analog_stick_acceleration_modifier / 100.0); if(pointer_device == 1) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else if(pointer_device == 2) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else { analogX = 0; analogY = 0; } // Convert cartesian coordinate analog stick to polar coordinates double radius = sqrt(analogX * analogX + analogY * analogY); double angle = atan2(analogY, analogX); double max = (float)0x8000/analog_stick_acceleration; //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", radius,analog_stick_deadzone); if (radius > (float)analog_stick_deadzone*max/100) { // Re-scale analog stick range to negate deadzone (makes slow movements possible) radius = (radius - (float)analog_stick_deadzone*max/100)*((float)max/(max - (float)analog_stick_deadzone*max/100)); // Convert back to cartesian coordinates analogX = (int32_t)round(radius * cos(angle)); analogY = (int32_t)round(radius * sin(angle)); } else { analogX = 0; analogY = 0; } //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", GPU_LR_FRAMEBUFFER_NATIVE_WIDTH,GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); have_touch = have_touch || input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + analogX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + analogY); FramesWithPointer = (analogX || analogY) ? FramesWithPointerBase : FramesWithPointer; } if(mouse_enable) { // TOUCH: Mouse if(!touchEnabled) { const int16_t mouseX = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); const int16_t mouseY = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); have_touch = have_touch || input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + mouseX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + mouseY); FramesWithPointer = (mouseX || mouseY) ? FramesWithPointerBase : FramesWithPointer; } // TOUCH: Pointer else if(input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED)) { const float X_FACTOR = ((float)layout.width / 65536.0f); const float Y_FACTOR = ((float)layout.height / 65536.0f); float x = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 32768.0f) * X_FACTOR; float y = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 32768.0f) * Y_FACTOR; if ((x >= layout.touch_x) && (x < layout.touch_x + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH) && (y >= layout.touch_y) && (y < layout.touch_y + GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT)) { have_touch = true; TouchX = x - layout.touch_x; TouchY = y - layout.touch_y; } } } if(have_touch) NDS_setTouchPos(TouchX, TouchY, scale); else NDS_releaseTouch(); // BUTTONS //NDS_beginProcessingInput(); NDS_setPad( input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R), 0, // debug input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2) //Lid ); if (!microphone_force_enable) { if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(true); else if(!input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(false); } else NDS_setMic(true); if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3) && quick_switch_enable && delay_timer == 0) { switch (current_layout) { case LAYOUT_TOP_ONLY: current_layout = LAYOUT_BOTTOM_ONLY; break; case LAYOUT_BOTTOM_ONLY: current_layout = LAYOUT_TOP_ONLY; break; } delay_timer++; } if(delay_timer != 0) { delay_timer++; if(delay_timer == 30) delay_timer = 0; } NDS_endProcessingInput(); // RUN frameIndex ++; bool skipped = frameIndex <= frameSkip; if (skipped) NDS_SkipNextFrame(); NDS_exec(); SPU_Emulate_user(); if (!skipped) { u16 *screen = GPU->GetCustomFramebuffer(); if (layout.draw_screen1) SwapScreen (layout.dst, screen, layout.pitch); if (layout.draw_screen2) { screen = GPU->GetCustomFramebuffer() + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH * GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT; SwapScreen (layout.dst2, screen, layout.pitch); DrawPointer(layout.dst2, layout.pitch); } } video_cb(skipped ? 0 : screen_buf, layout.width, layout.height, layout.pitch * 2); frameIndex = skipped ? frameIndex : 0; }