From b4225f436a4b2210d3695f1d8d0dbd9f516d5aaa Mon Sep 17 00:00:00 2001 From: windwakr <284886+windwakr@users.noreply.github.com> Date: Thu, 12 Oct 2023 22:14:09 -0400 Subject: [PATCH] Slot2: Slide Controller - rumble Rumble is now always allowed. Turns out there's an in-game option to turn it off so there's no need for this. --- desmume/src/addons/slot2_slideController.cpp | 97 +++++++++----------- desmume/src/frontend/windows/main.cpp | 2 - desmume/src/slot2.h | 1 - 3 files changed, 43 insertions(+), 57 deletions(-) diff --git a/desmume/src/addons/slot2_slideController.cpp b/desmume/src/addons/slot2_slideController.cpp index 1d9a0bdee..5e09ea18d 100644 --- a/desmume/src/addons/slot2_slideController.cpp +++ b/desmume/src/addons/slot2_slideController.cpp @@ -19,19 +19,16 @@ */ //Absolute barebones implementation of the Slide Controller add-on. -//The game does a bunch of mystery reads of various sizes which have not been investigated at all. #include "../slot2.h" #include "../emufile.h" -static bool rumbleEnable = false; - -static u8 xDelta; -static u8 yDelta; +static u8 delta_x; +static u8 delta_y; //Product ID, Revision ID, Motion status, X delta, Y delta, Surface quality //Average pixel, Maximum pixel, Reserved, Reserved, Configuration, Reserved //Data out lower, Data out upper, Shutter lower, Shutter upper, Frame period lower, Frame period upper -static u8 scRegs[18] = +static u8 sc_regs[18] = { 0x03, 0x20, 0x00, 0x00, 0x00, 0x80, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x20, 0xD1 @@ -42,7 +39,7 @@ class Slot2_SlideController : public ISlot2Interface private: u8 old_rumble; - struct slideControllerSerial + struct { u16 in_data; u16 out_data; @@ -55,13 +52,13 @@ class Slot2_SlideController : public ISlot2Interface void slideCon_reset() { + delta_x = 0; + delta_y = 0; + old_rumble = 0; if (FeedbackON) FeedbackON(false); - xDelta = 0; - yDelta = 0; - slideCon.in_data = 0; slideCon.out_data = 0; slideCon.counter = 0; @@ -70,12 +67,12 @@ class Slot2_SlideController : public ISlot2Interface slideCon.reg_sel = 0; slideCon.tmp = 0; - scRegs[0x02] = 0x00; //Motion status - scRegs[0x03] = 0x00; //X delta - scRegs[0x04] = 0x00; //Y delta - scRegs[0x0A] = 0x00; //Config bits - scRegs[0x10] = 0x20; //Frame period lower - scRegs[0x11] = 0xD1; //Frame period upper + sc_regs[0x02] = 0x00; //Motion status + sc_regs[0x03] = 0x00; //X delta + sc_regs[0x04] = 0x00; //Y delta + sc_regs[0x0A] = 0x00; //Config bits + sc_regs[0x10] = 0x20; //Frame period lower + sc_regs[0x11] = 0xD1; //Frame period upper } void slideCon_process() @@ -87,7 +84,7 @@ class Slot2_SlideController : public ISlot2Interface //Rumble in bit 8 u8 rumble = (slideCon.in_data & 0x100) >> 8; - if (FeedbackON && rumbleEnable && (old_rumble != rumble)) + if (FeedbackON && (old_rumble != rumble)) { old_rumble = rumble; FeedbackON(rumble); @@ -95,8 +92,8 @@ class Slot2_SlideController : public ISlot2Interface switch (slideCon.state) { - case 0: //reg select - //build reg select byte + case 0: //Reg select + //Build reg select byte if ((slideCon.sck == 0) && (new_sck == 1) && (slideCon.counter < 8)) { slideCon.reg_sel = (slideCon.reg_sel << 1) | sd; @@ -104,7 +101,7 @@ class Slot2_SlideController : public ISlot2Interface } else if (slideCon.counter == 8) { - //check if it's a read or a write by MSB + //Check if it's a read or a write by MSB if (slideCon.reg_sel & 0x80) { slideCon.state = 1; @@ -117,19 +114,19 @@ class Slot2_SlideController : public ISlot2Interface if (slideCon.reg_sel == 0x02) { - //set motion flag if there has been movement - if (xDelta || yDelta) - scRegs[0x02] |= 0x80; - //freeze motion deltas - scRegs[0x03] = xDelta; - scRegs[0x04] = yDelta; - xDelta = yDelta = 0; + //Set motion flag if there has been movement + if (delta_x || delta_y) + sc_regs[0x02] |= 0x80; + //Freeze motion deltas + sc_regs[0x03] = delta_x; + sc_regs[0x04] = delta_y; + delta_x = delta_y = 0; } } slideCon.counter = 0; } break; - case 1: //write reg + case 1: //Write reg if ((slideCon.sck == 0) && (new_sck == 1) && (slideCon.counter < 8)) { slideCon.tmp = (slideCon.tmp << 1) | sd; @@ -137,42 +134,42 @@ class Slot2_SlideController : public ISlot2Interface } else if ((slideCon.sck == 0) && (new_sck == 0) && (slideCon.counter == 8)) { - //printf("WRITE REG: %02X = %02X\n", slideCon.reg_sel, slideCon.tmp); + //printf("SLIDECON WRITE REG: %02X = %02X\n", slideCon.reg_sel, slideCon.tmp); slideCon.state = 0; slideCon.counter = 0; if (slideCon.reg_sel <= 0x11) - scRegs[slideCon.reg_sel] = slideCon.tmp; + sc_regs[slideCon.reg_sel] = slideCon.tmp; } break; - case 2: //read reg + case 2: //Read reg if ((slideCon.sck == 0) && (new_sck == 1) && (slideCon.counter < 8)) { if (slideCon.reg_sel <= 0x11) - slideCon.out_data = (scRegs[slideCon.reg_sel] >> (7 - slideCon.counter)) & 1; + slideCon.out_data = (sc_regs[slideCon.reg_sel] >> (7 - slideCon.counter)) & 1; else slideCon.out_data = 0; slideCon.counter++; } else if ((slideCon.sck == 0) && (new_sck == 0) && (slideCon.counter == 8)) { - //printf("READ REG: %02X = %02X\n", slideCon.reg_sel, scRegs[slideCon.reg_sel]); + //printf("SLIDECON READ REG: %02X = %02X\n", slideCon.reg_sel, sc_regs[slideCon.reg_sel]); slideCon.state = 0; slideCon.counter = 0; //Reset motion flag if reg was motion status if (slideCon.reg_sel == 0x02) - scRegs[0x02] &= 0x7F; + sc_regs[0x02] &= 0x7F; //Reset motion deltas if they were read if ((slideCon.reg_sel == 0x03) || (slideCon.reg_sel == 0x04)) - scRegs[slideCon.reg_sel] = 0x00; + sc_regs[slideCon.reg_sel] = 0x00; } break; } slideCon.sck = new_sck; - if (scRegs[0x0A] & 0x80) //Reset + if (sc_regs[0x0A] & 0x80) //Reset { slideCon_reset(); } @@ -226,15 +223,17 @@ class Slot2_SlideController : public ISlot2Interface return outWord; } + virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xFEF0FEF0; } + virtual void savestate(EMUFILE& os) { s32 version = 0; os.write_32LE(version); - os.write_u8(xDelta); - os.write_u8(yDelta); + os.write_u8(delta_x); + os.write_u8(delta_y); for (int i = 0; i < 18; i++) - os.write_u8(scRegs[i]); + os.write_u8(sc_regs[i]); os.write_16LE(slideCon.in_data); os.write_16LE(slideCon.out_data); os.write_u8(slideCon.counter); @@ -250,10 +249,10 @@ class Slot2_SlideController : public ISlot2Interface if (version == 0) { - is.read_u8(xDelta); - is.read_u8(yDelta); + is.read_u8(delta_x); + is.read_u8(delta_y); for (int i = 0; i < 18; i++) - scRegs[i] = is.read_u8(); + sc_regs[i] = is.read_u8(); is.read_16LE(slideCon.in_data); is.read_16LE(slideCon.out_data); is.read_u8(slideCon.counter); @@ -273,16 +272,6 @@ ISlot2Interface* construct_Slot2_SlideController() { return new Slot2_SlideContr void slideController_updateMotion(s8 x, s8 y) { - if (x || y) - { - xDelta = (u8)x; - yDelta = (u8)y; - } -} - -void slideController_rumbleEnable(bool enable) -{ - rumbleEnable = enable; - if (FeedbackON && (enable == false)) - FeedbackON(false); + delta_x = (u8)x; + delta_y = (u8)y; } diff --git a/desmume/src/frontend/windows/main.cpp b/desmume/src/frontend/windows/main.cpp index b37bb0ac3..a3485210c 100644 --- a/desmume/src/frontend/windows/main.cpp +++ b/desmume/src/frontend/windows/main.cpp @@ -2211,8 +2211,6 @@ int _main() slot2_HCV1000_barcode = GetPrivateProfileStdString("Slot2.HCV1000", "barcode", "").substr(0, 16); HCV1000_setBarcode(slot2_HCV1000_barcode); - slideController_rumbleEnable(GetPrivateProfileBool("Slot2.SlideController", "rumble", false, IniName)); - cmdline.process_addonCommands(); WIN_InstallCFlash(); WIN_InstallGBACartridge(); diff --git a/desmume/src/slot2.h b/desmume/src/slot2.h index 0e95b01d1..634c4048a 100644 --- a/desmume/src/slot2.h +++ b/desmume/src/slot2.h @@ -162,5 +162,4 @@ extern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool extern void HCV1000_setReady(); extern void HCV1000_setBarcode(std::string barcode); extern void slideController_updateMotion(s8 x, s8 y); -extern void slideController_rumbleEnable(bool enable); #endif //__SLOT_H__