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++;
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<u32>(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);

View File

@@ -17,7 +17,9 @@ enum AccessoryType : u8 {
struct Controller {
union {
u8 byte1{};
struct {
union {
u8 byte1;
struct {
bool dp_right: 1;
bool dp_left: 1;
@@ -30,7 +32,7 @@ struct Controller {
};
};
union {
u8 byte2{};
u8 byte2;
struct {
bool c_right: 1;
bool c_left: 1;
@@ -42,10 +44,55 @@ struct Controller {
bool joy_reset: 1;
};
};
s8 joy_x{};
s8 joy_y{};
s8 joy_x;
s8 joy_y;
};
u32 raw;
};
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
};
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<u8> 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;

View File

@@ -15,6 +15,9 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) {
ConnectMainWindowSignalsToSlots();
setAcceptDrops(true);
setFocusPolicy(Qt::StrongFocus);
setFocus();
grabKeyboard();
mainWindow->show();
emuThread->core = new n64::Core();
@@ -45,3 +48,63 @@ 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<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 dropEvent(QDropEvent*) override;
void dragEnterEvent(QDragEnterEvent*) override;
void keyPressEvent(QKeyEvent*) override;
void keyReleaseEvent(QKeyEvent*) override;
private:
void ConnectMainWindowSignalsToSlots() noexcept;
MainWindowController* mainWindow;