Input will come next

This commit is contained in:
SimoneN64
2024-01-21 22:01:26 +01:00
parent 7d54887d63
commit 346895a86b
7 changed files with 41 additions and 68 deletions

View File

@@ -333,41 +333,8 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) {
} }
} }
void PIF::UpdateController(u32 value) { void PIF::UpdateController(Controller value) {
bool A = (value >> 31) & 1; joybusDevices[channel].controller = value;
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;
if (joybusDevices[channel].controller.joy_reset) { if (joybusDevices[channel].controller.joy_reset) {
joybusDevices[channel].controller.start = false; joybusDevices[channel].controller.start = false;

View File

@@ -115,7 +115,7 @@ struct PIF {
void CICChallenge(); void CICChallenge();
static void ExecutePIF(Mem& mem, Registers& regs); static void ExecutePIF(Mem& mem, Registers& regs);
static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType); static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType);
void UpdateController(u32); void UpdateController(Controller);
bool ReadButtons(u8*) const; bool ReadButtons(u8*) const;
void ControllerID(u8*) const; void ControllerID(u8*) const;
void MempakRead(const u8*, u8*); void MempakRead(const u8*, u8*);

View File

@@ -13,12 +13,11 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) {
std::move(mainWindow->view.vulkanWidget->windowInfo), std::move(mainWindow->view.vulkanWidget->windowInfo),
mainWindow); mainWindow);
mainWindow->emuThread = emuThread;
ConnectMainWindowSignalsToSlots(); ConnectMainWindowSignalsToSlots();
grabKeyboard();
setAcceptDrops(true); setAcceptDrops(true);
setFocusPolicy(Qt::FocusPolicy::StrongFocus);
setFocus();
mainWindow->show(); mainWindow->show();
} }
@@ -48,28 +47,3 @@ void KaizenQt::LoadROM(const QString& file_name) noexcept {
emuThread->start(); emuThread->start();
emuThread->core.LoadROM(file_name.toStdString()); 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);
}

View File

@@ -29,8 +29,6 @@ public:
void LoadROM(const QString& path) noexcept; void LoadROM(const QString& path) noexcept;
void dropEvent(QDropEvent*) override; void dropEvent(QDropEvent*) override;
void dragEnterEvent(QDragEnterEvent*) override; void dragEnterEvent(QDragEnterEvent*) override;
protected:
void keyPressEvent(QKeyEvent* event) override;
private: private:
void ConnectMainWindowSignalsToSlots() noexcept; void ConnectMainWindowSignalsToSlots() noexcept;
MainWindowController* mainWindow; MainWindowController* mainWindow;

View File

@@ -1,5 +1,6 @@
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
#include <QKeyEvent>
#include <MainWindow.hpp> #include <MainWindow.hpp>
MainWindowController::MainWindowController() noexcept { MainWindowController::MainWindowController() noexcept {
@@ -9,6 +10,8 @@ MainWindowController::MainWindowController() noexcept {
view.actionStop->setDisabled(true); view.actionStop->setDisabled(true);
view.vulkanWidget->hide(); view.vulkanWidget->hide();
ConnectSignalsToSlots(); ConnectSignalsToSlots();
setFocusPolicy(Qt::FocusPolicy::StrongFocus);
setFocus();
} }
void MainWindowController::ConnectSignalsToSlots() noexcept { void MainWindowController::ConnectSignalsToSlots() noexcept {
@@ -55,3 +58,32 @@ void MainWindowController::ConnectSignalsToSlots() noexcept {
"Nintendo 64 is a registered trademarks of Nintendo Co., Ltd.")); "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();
}

View File

@@ -12,8 +12,10 @@ public:
MainWindowController() noexcept; MainWindowController() noexcept;
Ui::MainWindow view; Ui::MainWindow view;
EmuThread* emuThread = nullptr;
private: private:
void ConnectSignalsToSlots() noexcept; void ConnectSignalsToSlots() noexcept;
void keyPressEvent(QKeyEvent* event) override;
bool textPauseToggle = false; bool textPauseToggle = false;

View File

@@ -53,12 +53,12 @@ public:
return vec; return vec;
} }
VkSurfaceKHR create_surface(VkInstance instance, VkPhysicalDevice) override { VkSurfaceKHR create_surface(VkInstance, VkPhysicalDevice) override {
window->show(); window->show();
return QVulkanInstance::surfaceForWindow(window); return QVulkanInstance::surfaceForWindow(window);
} }
void destroy_surface(VkInstance instance, VkSurfaceKHR surface) override { } void destroy_surface(VkInstance, VkSurfaceKHR) override { }
uint32_t get_surface_width() override { uint32_t get_surface_width() override {
return 640; return 640;