diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index 9392d114..369a8097 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -185,7 +185,6 @@ void PIF::ProcessCommands(Mem &mem) { channel++; break; case 1: - UpdateController(); if(!ReadButtons(res)) { cmd[1] |= 0x80; } @@ -333,10 +332,6 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) { } } -void PIF::UpdateController() { - -} - void PIF::DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType) { mem.Write(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]); diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index adf41272..1f51b90a 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -17,35 +17,82 @@ enum AccessoryType : u8 { struct Controller { union { - u8 byte1{}; struct { - bool dp_right:1; - bool dp_left:1; - bool dp_down:1; - bool dp_up:1; - bool start:1; - bool z:1; - bool b:1; - bool a:1; + union { + u8 byte1; + struct { + bool dp_right: 1; + bool dp_left: 1; + bool dp_down: 1; + bool dp_up: 1; + bool start: 1; + bool z: 1; + bool b: 1; + bool a: 1; + }; + }; + union { + u8 byte2; + struct { + bool c_right: 1; + bool c_left: 1; + bool c_down: 1; + bool c_up: 1; + bool r: 1; + bool l: 1; + bool zero: 1; + bool joy_reset: 1; + }; + }; + + s8 joy_x; + s8 joy_y; }; + + u32 raw; }; - union { - u8 byte2{}; - struct { - bool c_right:1; - bool c_left:1; - bool c_down:1; - bool c_up:1; - bool r:1; - bool l:1; - bool zero:1; - bool joy_reset:1; - }; + Controller& operator=(const Controller& other) { + byte1 = other.byte1; + byte2 = other.byte2; + joy_x = other.joy_x; + joy_y = other.joy_y; + + return *this; + } + + enum Key { + A, B, Z, Start, DUp, DDown, DLeft, DRight, CUp, CDown, CLeft, CRight, LT, RT }; - s8 joy_x{}; - s8 joy_y{}; + + enum Axis { X, Y }; Controller() = default; + void UpdateButton(Key k, bool state) { + switch(k) { + case A: a = state; break; + case B: b = state; break; + case Z: z = state; break; + case Start: start = state; break; + case DUp: dp_up = state; break; + case DDown: dp_down = state; break; + case DLeft: dp_left = state; break; + case DRight: dp_right = state; break; + case CUp: c_up = state; break; + case CDown: c_down = state; break; + case CLeft: c_left = state; break; + case CRight: c_right = state; break; + case LT: l = state; break; + case RT: r = state; break; + } + } + + void UpdateAxis(Axis a, s8 state) { + switch(a) { + case X: joy_x = state; break; + case Y: joy_y = state; break; + } + } + Controller& operator=(u32 v) { joy_y = v & 0xff; joy_x = v >> 8; @@ -114,7 +161,6 @@ struct PIF { void CICChallenge(); static void ExecutePIF(Mem& mem, Registers& regs); static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType); - void UpdateController(); bool ReadButtons(u8*) const; void ControllerID(u8*) const; void MempakRead(const u8*, u8*); @@ -123,7 +169,7 @@ struct PIF { void EepromWrite(const u8*, u8*, const Mem&); std::vector Serialize(); - bool gamepadConnected = false, mempakOpen = false; + bool mempakOpen = false; JoybusDevice joybusDevices[6]{}; u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{}; mio::mmap_sink mempak, eeprom; diff --git a/src/frontend/KaizenQt.cpp b/src/frontend/KaizenQt.cpp index dedcc020..b6c58723 100644 --- a/src/frontend/KaizenQt.cpp +++ b/src/frontend/KaizenQt.cpp @@ -15,6 +15,9 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) { ConnectMainWindowSignalsToSlots(); setAcceptDrops(true); + setFocusPolicy(Qt::StrongFocus); + setFocus(); + grabKeyboard(); mainWindow->show(); emuThread->core = new n64::Core(); @@ -44,4 +47,64 @@ void KaizenQt::dropEvent(QDropEvent* event) { void KaizenQt::LoadROM(const QString& file_name) noexcept { emuThread->start(); emuThread->core->LoadROM(file_name.toStdString()); +} + +static inline u32 QtKeyToN64Controller(Qt::Key k) { + u32 ret{}; + printf("Valore prima: %08X\n", ret); + + + printf("Valore dopo: %08X\n", ret); + + return ret; +} + +void KaizenQt::keyPressEvent(QKeyEvent *e) { + emuThread->core->pause = true; + auto k = static_cast(e->key()); + if(k == Qt::Key_Z) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::Z, true); + if(k == Qt::Key_X) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::A, true); + if(k == Qt::Key_C) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::B, true); + if(k == Qt::Key_Return || k == Qt::Key_Enter) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::Start, true); + if(k == Qt::Key_I) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DUp, true); + if(k == Qt::Key_K) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DDown, true); + if(k == Qt::Key_J) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DLeft, true); + if(k == Qt::Key_L) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DRight, true); + if(k == Qt::Key_A) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::LT, true); + if(k == Qt::Key_S) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::RT, true); + if(k == Qt::Key_8) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CUp, true); + if(k == Qt::Key_2) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CDown, true); + if(k == Qt::Key_4) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CLeft, true); + if(k == Qt::Key_6) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CRight, true); + if(k == Qt::Key_Left) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::X, -86); + if(k == Qt::Key_Right) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::X, 86); + if(k == Qt::Key_Up) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::Y, 86); + if(k == Qt::Key_Down) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::Y, -86); + emuThread->core->pause = false; + QWidget::keyPressEvent(e); +} + +void KaizenQt::keyReleaseEvent(QKeyEvent *e) { + emuThread->core->pause = true; + auto k = static_cast(e->key()); + if(k == Qt::Key_Z) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::Z, false); + if(k == Qt::Key_X) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::A, false); + if(k == Qt::Key_C) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::B, false); + if(k == Qt::Key_Return || k == Qt::Key_Enter) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::Start, false); + if(k == Qt::Key_I) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DUp, false); + if(k == Qt::Key_K) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DDown, false); + if(k == Qt::Key_J) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DLeft, false); + if(k == Qt::Key_L) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::DRight, false); + if(k == Qt::Key_A) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::LT, false); + if(k == Qt::Key_S) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::RT, false); + if(k == Qt::Key_8) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CUp, false); + if(k == Qt::Key_2) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CDown, false); + if(k == Qt::Key_4) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CLeft, false); + if(k == Qt::Key_6) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateButton(n64::Controller::Key::CRight, false); + if(k == Qt::Key_Left) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::X, 0); + if(k == Qt::Key_Right) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::X, 0); + if(k == Qt::Key_Up) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::Y, 0); + if(k == Qt::Key_Down) emuThread->core->cpu->mem.mmio.si.pif.joybusDevices[0].controller.UpdateAxis(n64::Controller::Axis::Y, 0); + emuThread->core->pause = false; + QWidget::keyPressEvent(e); } \ No newline at end of file diff --git a/src/frontend/KaizenQt.hpp b/src/frontend/KaizenQt.hpp index e98b7533..e32dafdd 100644 --- a/src/frontend/KaizenQt.hpp +++ b/src/frontend/KaizenQt.hpp @@ -29,6 +29,8 @@ public: void LoadROM(const QString& path) noexcept; void dropEvent(QDropEvent*) override; void dragEnterEvent(QDragEnterEvent*) override; + void keyPressEvent(QKeyEvent*) override; + void keyReleaseEvent(QKeyEvent*) override; private: void ConnectMainWindowSignalsToSlots() noexcept; MainWindowController* mainWindow;