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