Merge pull request #12 from liuk7071/HID

Basic input
This commit is contained in:
wheremyfoodat 2023-06-05 14:36:13 +03:00 committed by GitHub
commit b872650d31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 1 deletions

View file

@ -201,5 +201,10 @@ public:
void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); }
void signalDSPEvents() { serviceManager.signalDSPEvents(); }
void pressKey(u32 key) { serviceManager.pressKey(key); }
void releaseKey(u32 key) { serviceManager.releaseKey(key); }
void setCirclepadX(u16 x) { serviceManager.setCirclepadX(x); }
void setCirclepadY(u16 y) { serviceManager.setCirclepadY(y); }
void updateInputs() { serviceManager.updateInputs(); }
};

View file

@ -34,6 +34,11 @@ public:
HIDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
void reset();
void handleSyncRequest(u32 messagePointer);
void pressKey(u32 key);
void releaseKey(u32 key);
void setCirclepadX(u16 x);
void setCirclepadY(u16 y);
void updateInputs();
void setSharedMem(u8* ptr) {

View file

@ -84,5 +84,10 @@ public:
void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); }
void signalDSPEvents() { dsp.signalEvents(); }
void pressKey(u32 key) { hid.pressKey(key); }
void releaseKey(u32 key) { hid.releaseKey(key); }
void setCirclepadX(u16 x) { hid.setCirclepadX(x); }
void setCirclepadY(u16 y) { hid.setCirclepadY(y); }
void updateInputs() { hid.updateInputs(); }
};

View file

@ -108,6 +108,11 @@ void HIDService::getIPCHandles(u32 messagePointer) {
}
}
void HIDService::pressKey(u32 key) { sharedMem[0]++; *(u32*)&sharedMem[0x28] |= key; }
void HIDService::releaseKey(u32 key) { sharedMem[0]++; *(u32*)&sharedMem[0x28] &= ~key; }
void HIDService::setCirclepadX(u16 x) { sharedMem[0]++; *(u16*)&sharedMem[0x28 + 0xC] = x; }
void HIDService::setCirclepadY(u16 y) { sharedMem[0]++; *(u16*)&sharedMem[0x28 + 0xC + 2] = y; }
// TODO: We don't currently have inputs but we must at least try to signal the HID key input events now and then
void HIDService::updateInputs() {
// For some reason, the original developers decided to signal the HID events each time the OS rescanned inputs

View file

@ -36,10 +36,45 @@ void Emulator::run() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
switch (event.type) {
case SDL_QUIT:
printf("Bye :(\n");
running = false;
return;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_z: kernel.pressKey(1 << 0); break;
case SDLK_RIGHT: kernel.pressKey(1 << 4); break;
case SDLK_LEFT: kernel.pressKey(1 << 5); break;
case SDLK_UP: kernel.pressKey(1 << 6); break;
case SDLK_DOWN: kernel.pressKey(1 << 7); break;
case SDLK_w: kernel.setCirclepadY(0x9C); break;
case SDLK_a: kernel.setCirclepadX(-0x9C); break;
case SDLK_s: kernel.setCirclepadY(-0x9C); break;
case SDLK_d: kernel.setCirclepadX(0x9C); break;
case SDLK_j: kernel.pressKey(1 << 1); break;
case SDLK_k: kernel.pressKey(1 << 10); break;
case SDLK_l: kernel.pressKey(1 << 11); break;
case SDLK_r: kernel.pressKey(1 << 8); break;
}
break;
case SDL_KEYUP:
switch (event.key.keysym.sym) {
case SDLK_z: kernel.releaseKey(1 << 0); break;
case SDLK_RIGHT: kernel.releaseKey(1 << 4); break;
case SDLK_LEFT: kernel.releaseKey(1 << 5); break;
case SDLK_UP: kernel.releaseKey(1 << 6); break;
case SDLK_DOWN: kernel.releaseKey(1 << 7); break;
case SDLK_w: kernel.setCirclepadY(0); break;
case SDLK_a: kernel.setCirclepadX(0); break;
case SDLK_s: kernel.setCirclepadY(0); break;
case SDLK_d: kernel.setCirclepadX(0); break;
case SDLK_j: kernel.releaseKey(1 << 1); break;
case SDLK_k: kernel.releaseKey(1 << 10); break;
case SDLK_l: kernel.releaseKey(1 << 11); break;
case SDLK_r: kernel.releaseKey(1 << 8); break;
}
break;
}
}