Input works

This commit is contained in:
SimoneN64
2024-01-22 20:46:24 +01:00
parent 7caa8c25c5
commit cc1cb8b961
4 changed files with 136 additions and 30 deletions

View File

@@ -185,7 +185,6 @@ void PIF::ProcessCommands(Mem &mem) {
channel++; channel++;
break; break;
case 1: case 1:
UpdateController();
if(!ReadButtons(res)) { if(!ReadButtons(res)) {
cmd[1] |= 0x80; 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) { void PIF::DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType) {
mem.Write<u32>(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]); mem.Write<u32>(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);

View File

@@ -17,35 +17,82 @@ enum AccessoryType : u8 {
struct Controller { struct Controller {
union { union {
u8 byte1{};
struct { struct {
bool dp_right:1; union {
bool dp_left:1; u8 byte1;
bool dp_down:1; struct {
bool dp_up:1; bool dp_right: 1;
bool start:1; bool dp_left: 1;
bool z:1; bool dp_down: 1;
bool b:1; bool dp_up: 1;
bool a: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 { Controller& operator=(const Controller& other) {
u8 byte2{}; byte1 = other.byte1;
struct { byte2 = other.byte2;
bool c_right:1; joy_x = other.joy_x;
bool c_left:1; joy_y = other.joy_y;
bool c_down:1;
bool c_up:1; return *this;
bool r:1; }
bool l:1;
bool zero:1; enum Key {
bool joy_reset:1; 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; 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) { Controller& operator=(u32 v) {
joy_y = v & 0xff; joy_y = v & 0xff;
joy_x = v >> 8; joy_x = v >> 8;
@@ -114,7 +161,6 @@ 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();
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*);
@@ -123,7 +169,7 @@ struct PIF {
void EepromWrite(const u8*, u8*, const Mem&); void EepromWrite(const u8*, u8*, const Mem&);
std::vector<u8> Serialize(); std::vector<u8> Serialize();
bool gamepadConnected = false, mempakOpen = false; bool mempakOpen = false;
JoybusDevice joybusDevices[6]{}; JoybusDevice joybusDevices[6]{};
u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{}; u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{};
mio::mmap_sink mempak, eeprom; mio::mmap_sink mempak, eeprom;

View File

@@ -15,6 +15,9 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) {
ConnectMainWindowSignalsToSlots(); ConnectMainWindowSignalsToSlots();
setAcceptDrops(true); setAcceptDrops(true);
setFocusPolicy(Qt::StrongFocus);
setFocus();
grabKeyboard();
mainWindow->show(); mainWindow->show();
emuThread->core = new n64::Core(); emuThread->core = new n64::Core();
@@ -44,4 +47,64 @@ void KaizenQt::dropEvent(QDropEvent* event) {
void KaizenQt::LoadROM(const QString& file_name) noexcept { void KaizenQt::LoadROM(const QString& file_name) noexcept {
emuThread->start(); emuThread->start();
emuThread->core->LoadROM(file_name.toStdString()); 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<Qt::Key>(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<Qt::Key>(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);
} }

View File

@@ -29,6 +29,8 @@ 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;
void keyPressEvent(QKeyEvent*) override;
void keyReleaseEvent(QKeyEvent*) override;
private: private:
void ConnectMainWindowSignalsToSlots() noexcept; void ConnectMainWindowSignalsToSlots() noexcept;
MainWindowController* mainWindow; MainWindowController* mainWindow;