Input works
This commit is contained in:
@@ -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]);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user