diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index fc6ceadc..984ab701 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -333,41 +333,8 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) { } } -void PIF::UpdateController(u32 value) { - bool A = (value >> 31) & 1; - bool B = (value >> 30) & 1; - bool Z = (value >> 29) & 1; - bool START = (value >> 28) & 1; - bool DUP = (value >> 27) & 1; - bool DDOWN = (value >> 26) & 1; - bool DLEFT = (value >> 25) & 1; - bool DRIGHT = (value >> 24) & 1; - bool L = (value >> 21) & 1; - bool R = (value >> 20) & 1; - bool CUP = (value >> 19) & 1; - bool CDOWN = (value >> 18) & 1; - bool CLEFT = (value >> 17) & 1; - bool CRIGHT = (value >> 16) & 1; - s8 x = (s8(value >> 8)) & 0xFF; - s8 y = (s8(value)) & 0xFF; - - joybusDevices[channel].controller.a = A; - joybusDevices[channel].controller.b = B; - joybusDevices[channel].controller.z = Z; - joybusDevices[channel].controller.start = START; - joybusDevices[channel].controller.dp_up = DUP; - joybusDevices[channel].controller.dp_down = DDOWN; - joybusDevices[channel].controller.dp_left = DLEFT; - joybusDevices[channel].controller.dp_right = DRIGHT; - joybusDevices[channel].controller.joy_reset = L && R && START; - joybusDevices[channel].controller.l = L; - joybusDevices[channel].controller.r = R; - joybusDevices[channel].controller.c_up = CUP; - joybusDevices[channel].controller.c_down = CDOWN; - joybusDevices[channel].controller.c_left = CLEFT; - joybusDevices[channel].controller.c_right = CRIGHT; - joybusDevices[channel].controller.joy_x = x; - joybusDevices[channel].controller.joy_y = -y; +void PIF::UpdateController(Controller value) { + joybusDevices[channel].controller = value; if (joybusDevices[channel].controller.joy_reset) { joybusDevices[channel].controller.start = false; diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index b5c83d1a..23810419 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -115,7 +115,7 @@ struct PIF { void CICChallenge(); static void ExecutePIF(Mem& mem, Registers& regs); static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType); - void UpdateController(u32); + void UpdateController(Controller); bool ReadButtons(u8*) const; void ControllerID(u8*) const; void MempakRead(const u8*, u8*); diff --git a/src/frontend/KaizenQt.cpp b/src/frontend/KaizenQt.cpp index 76992eb5..a243430a 100644 --- a/src/frontend/KaizenQt.cpp +++ b/src/frontend/KaizenQt.cpp @@ -13,12 +13,11 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) { std::move(mainWindow->view.vulkanWidget->windowInfo), mainWindow); + mainWindow->emuThread = emuThread; + ConnectMainWindowSignalsToSlots(); - grabKeyboard(); setAcceptDrops(true); - setFocusPolicy(Qt::FocusPolicy::StrongFocus); - setFocus(); mainWindow->show(); } @@ -47,29 +46,4 @@ void KaizenQt::dropEvent(QDropEvent* event) { void KaizenQt::LoadROM(const QString& file_name) noexcept { emuThread->start(); emuThread->core.LoadROM(file_name.toStdString()); -} - -void KaizenQt::keyPressEvent(QKeyEvent* e) { - u32 data = 0; - emuThread->core.cpu->mem.mmio.si.pif.UpdateController(data); - if (e->key() == Qt::Key::Key_X) data |= (1 << 31); - if (e->key() == Qt::Key::Key_C) data |= (1 << 30); - if (e->key() == Qt::Key::Key_Z) data |= (1 << 29); - if (e->key() == Qt::Key::Key_Enter - || e->key() == Qt::Key::Key_Return) data |= (1 << 28); - if (e->key() == Qt::Key::Key_I) data |= (1 << 27); - if (e->key() == Qt::Key::Key_K) data |= (1 << 26); - if (e->key() == Qt::Key::Key_J) data |= (1 << 25); - if (e->key() == Qt::Key::Key_L) data |= (1 << 24); - if (e->key() == Qt::Key::Key_A) data |= (1 << 21); - if (e->key() == Qt::Key::Key_S) data |= (1 << 20); - if (e->key() == Qt::Key::Key_8) data |= (1 << 19); - if (e->key() == Qt::Key::Key_2) data |= (1 << 18); - if (e->key() == Qt::Key::Key_4) data |= (1 << 17); - if (e->key() == Qt::Key::Key_6) data |= (1 << 16); - if (e->key() == Qt::Key::Key_Up) data |= 127; - if (e->key() == Qt::Key::Key_Down) data |= -127; - if (e->key() == Qt::Key::Key_Left) data |= u32(-127) << 8; - if (e->key() == Qt::Key::Key_Right) data |= u32(127) << 8; - emuThread->core.cpu->mem.mmio.si.pif.UpdateController(data); } \ No newline at end of file diff --git a/src/frontend/KaizenQt.hpp b/src/frontend/KaizenQt.hpp index 7aef086f..e98b7533 100644 --- a/src/frontend/KaizenQt.hpp +++ b/src/frontend/KaizenQt.hpp @@ -29,8 +29,6 @@ public: void LoadROM(const QString& path) noexcept; void dropEvent(QDropEvent*) override; void dragEnterEvent(QDragEnterEvent*) override; -protected: - void keyPressEvent(QKeyEvent* event) override; private: void ConnectMainWindowSignalsToSlots() noexcept; MainWindowController* mainWindow; diff --git a/src/frontend/MainWindow.cpp b/src/frontend/MainWindow.cpp index dd01b55d..e0f4c854 100644 --- a/src/frontend/MainWindow.cpp +++ b/src/frontend/MainWindow.cpp @@ -1,5 +1,6 @@ #include #include +#include #include MainWindowController::MainWindowController() noexcept { @@ -9,6 +10,8 @@ MainWindowController::MainWindowController() noexcept { view.actionStop->setDisabled(true); view.vulkanWidget->hide(); ConnectSignalsToSlots(); + setFocusPolicy(Qt::FocusPolicy::StrongFocus); + setFocus(); } void MainWindowController::ConnectSignalsToSlots() noexcept { @@ -54,4 +57,33 @@ void MainWindowController::ConnectSignalsToSlots() noexcept { "Kaizen is licensed under the BSD 3-clause license.\n" "Nintendo 64 is a registered trademarks of Nintendo Co., Ltd.")); }); +} + +void MainWindowController::keyPressEvent(QKeyEvent* e) { + n64::Controller data{}; + + data.z = (e->key() == Qt::Key::Key_Z); + data.a = (e->key() == Qt::Key::Key_X); + data.b = (e->key() == Qt::Key::Key_C); + data.start = e->key() == Qt::Key::Key_Enter || e->key() == Qt::Key::Key_Return; + data.dp_up = (e->key() == Qt::Key::Key_I); + data.dp_down = (e->key() == Qt::Key::Key_K); + data.dp_left = (e->key() == Qt::Key::Key_J); + data.dp_right = (e->key() == Qt::Key::Key_L); + data.l = (e->key() == Qt::Key::Key_A); + data.r = (e->key() == Qt::Key::Key_S); + data.c_up = (e->key() == Qt::Key::Key_8); + data.c_down = (e->key() == Qt::Key::Key_2); + data.c_left = (e->key() == Qt::Key::Key_4); + data.c_right = (e->key() == Qt::Key::Key_6); + data.joy_y = (e->key() == Qt::Key::Key_Up) ? 127 : 0; + data.joy_y = (e->key() == Qt::Key::Key_Down) ? -127 : 0; + data.joy_x = (e->key() == Qt::Key::Key_Left) ? -127 : 0; + data.joy_x = (e->key() == Qt::Key::Key_Right) ? 127 : 0; + + emuThread->core.pause = true; + emuThread->core.cpu->mem.mmio.si.pif.UpdateController(data); + emuThread->core.pause = false; + QWidget::keyPressEvent(e); + setFocus(); } \ No newline at end of file diff --git a/src/frontend/MainWindow.hpp b/src/frontend/MainWindow.hpp index 0337f80c..e4170b4f 100644 --- a/src/frontend/MainWindow.hpp +++ b/src/frontend/MainWindow.hpp @@ -12,8 +12,10 @@ public: MainWindowController() noexcept; Ui::MainWindow view; + EmuThread* emuThread = nullptr; private: void ConnectSignalsToSlots() noexcept; + void keyPressEvent(QKeyEvent* event) override; bool textPauseToggle = false; diff --git a/src/frontend/RenderWidget.hpp b/src/frontend/RenderWidget.hpp index 0abbc31a..92865f4d 100644 --- a/src/frontend/RenderWidget.hpp +++ b/src/frontend/RenderWidget.hpp @@ -53,12 +53,12 @@ public: return vec; } - VkSurfaceKHR create_surface(VkInstance instance, VkPhysicalDevice) override { + VkSurfaceKHR create_surface(VkInstance, VkPhysicalDevice) override { window->show(); return QVulkanInstance::surfaceForWindow(window); } - void destroy_surface(VkInstance instance, VkSurfaceKHR surface) override { } + void destroy_surface(VkInstance, VkSurfaceKHR) override { } uint32_t get_surface_width() override { return 640;