diff --git a/Changes.txt b/Changes.txt index db1f1c3da..dbab41c4c 100644 --- a/Changes.txt +++ b/Changes.txt @@ -16,11 +16,20 @@ * Re-enabled 'grabmouse' commandline argument and associated functionality with the following changes: - - it doesn't have a hotkey anymore - it is changed in the "Input Settings' UI, not in 'Video Settings' - it only has meaning while in emulation mode - it is enabled by default + * Fixed bug with emulation of paddles using the mouse in Warlords; + movement was being filtered out if the mouse was moved too fast. + + * Fixed bug whereby switching to the debugger and back again would + sometimes cause an extra mouse motion event (which would cause the + emulation to think the mouse was moved and move the player + accordingly). + + * Tweaked bankswitch autodetection code for 4A50 bankswitching. + -Have fun! diff --git a/src/emucore/Cart.cxx b/src/emucore/Cart.cxx index 5ed7df1fd..e15b2f47f 100644 --- a/src/emucore/Cart.cxx +++ b/src/emucore/Cart.cxx @@ -325,17 +325,11 @@ string Cartridge::autodetectType(const uInt8* image, uInt32 size) else if((size == 2048) || (size == 4096 && memcmp(image, image + 2048, 2048) == 0)) { - if(isProbablyCV(image, size)) - type = "CV"; - else - type = "2K"; + type = isProbablyCV(image, size) ? "CV" : "2K"; } else if(size == 4096) { - if(isProbablyCV(image, size)) - type = "CV"; - else - type = "4K"; + type = isProbablyCV(image, size) ? "CV" : "4K"; } else if(size == 8*1024) // 8K { @@ -405,11 +399,7 @@ string Cartridge::autodetectType(const uInt8* image, uInt32 size) else if(isProbably4A50(image, size)) type = "4A50"; else if(isProbablyEF(image, size)) - { - type = "EF"; - if(isProbablySC(image, size)) - type = "EFSC"; - } + type = isProbablySC(image, size) ? "EFSC" : "EF"; else if(isProbablyX07(image, size)) type = "X07"; else @@ -548,8 +538,16 @@ bool Cartridge::isProbably4A50(const uInt8* image, uInt32 size) // 4A50 carts store address $4A50 at the NMI vector, which // in this scheme is always in the last page of ROM at // $1FFA - $1FFB (at least this is true in rev 1 of the format) - int idx = size - 6; // $1FFA - return (image[idx] == 0x50 && image[idx+1] == 0x4A); + if(image[size-6] == 0x50 && image[size-5] == 0x4A) + return true; + + // Program starts at $1Fxx with NOP $6Exx or NOP $6Fxx? + if(((image[0xfffd] & 0x1f) == 0x1f) && + (image[image[0xfffd] * 256 + image[0xfffc]] == 0x0c) && + ((image[image[0xfffd] * 256 + image[0xfffc] + 2] & 0xfe) == 0x6e)) + return true; + + return false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/DefProps.hxx b/src/emucore/DefProps.hxx index eb2df4435..659d1f1e3 100644 --- a/src/emucore/DefProps.hxx +++ b/src/emucore/DefProps.hxx @@ -1355,7 +1355,7 @@ static const char* DefProps[DEF_PROPS_SIZE][20] = { { "683bb0d0f0c5df58557fba9dffc32c40", "Arcadia Corporation, Scott Nelson", "AR-4300", "Fireball (1982) (Arcadia) [a]", "Uses the Paddle Controllers", "", "", "", "", "", "", "", "PADDLES", "", "", "", "", "", "", "" }, { "683dc64ef7316c13ba04ee4398e2b93a", "Ed Federmeyer", "", "Edtris (1995) (Ed Federmeyer)", "", "Extremely Rare", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "68449e4aaba677abcd7cde4264e02168", "", "", "Horizonal Color Bars Demo 2 (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, - { "6847ce70819b74febcfd03e99610243b", "", "", "Ruby Runner 4A50", "", "", "", "4A50", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "6847ce70819b74febcfd03e99610243b", "", "", "Ruby Runner 4A50", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "68489e60268a5e6e052bad9c62681635", "Bit Corporation", "PG201", "Sea Monster (1982) (BitCorp) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "36", "256", "", "" }, { "68597264c8e57ada93be3a5be4565096", "Data Age", "DA1005", "Bugs (1982) (Data Age)", "Uses the Paddle Controllers", "Uncommon", "", "", "", "", "", "", "PADDLES", "", "", "", "", "", "", "" }, { "685e9668dc270b6deeb9cfbfd4d633c3", "CommaVid, Irwin Gaines - Ariola", "CM-004 - 712 004-720", "Room of Doom (1982) (CommaVid) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index dcf59429a..090803ef4 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -59,7 +59,8 @@ EventHandler::EventHandler(OSystem* osystem) myOverlay(NULL), myState(S_NONE), myAllowAllDirectionsFlag(false), - myFryingFlag(false) + myFryingFlag(false), + mySkipMouseMotion(true) { // Create the event object which will be used for this handler myEvent = new Event(); @@ -565,6 +566,11 @@ void EventHandler::poll(uInt64 time) myOSystem->console().toggleFormat(); break; + case SDLK_g: // Ctrl-g (un)grabs mouse + if(!myOSystem->frameBuffer().fullScreen()) + myOSystem->frameBuffer().toggleGrabMouse(); + break; + case SDLK_l: // Ctrl-l toggles PAL color-loss effect myOSystem->console().toggleColorLoss(); break; @@ -645,20 +651,17 @@ void EventHandler::poll(uInt64 time) { if(myMouseEnabled) { - int x = event.motion.xrel, y = event.motion.yrel; - // Filter out extremely large movement, which is usually caused - // by a screen being re-created - if(abs(x) < 50) - myEvent->set(Event::MouseAxisXValue, x); - if(abs(y) < 50) - myEvent->set(Event::MouseAxisYValue, y); + if(!mySkipMouseMotion) + { + myEvent->set(Event::MouseAxisXValue, event.motion.xrel); + myEvent->set(Event::MouseAxisYValue, event.motion.yrel); + } + mySkipMouseMotion = false; } } else if(myOverlay) - { - int x = event.motion.x, y = event.motion.y; - myOverlay->handleMouseMotionEvent(x, y, 0); - } + myOverlay->handleMouseMotionEvent(event.motion.x, event.motion.y, 0); + break; // SDL_MOUSEMOTION case SDL_MOUSEBUTTONUP: @@ -2179,6 +2182,7 @@ void EventHandler::leaveDebugMode() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::setEventState(State state) { +cerr << "setEventState:" << state << endl; myState = state; switch(myState) @@ -2225,6 +2229,10 @@ void EventHandler::setEventState(State state) // Always clear any pending events when changing states myEvent->clear(); + + // Sometimes an extraneous mouse motion event is generated + // after a state change, which should be surpressed + mySkipMouseMotion = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx index f4e2576ef..bd70d7003 100644 --- a/src/emucore/EventHandler.hxx +++ b/src/emucore/EventHandler.hxx @@ -477,6 +477,11 @@ class EventHandler // a Ctrl combo when it isn't wanted) bool myUseCtrlKeyFlag; + // A bug in the SDL video handler creates an extraneous mouse motion + // event after a video state change + // We detect when this happens and discard the event + bool mySkipMouseMotion; + // Used for continuous snapshot mode uInt32 myContSnapshotInterval; uInt32 myContSnapshotCounter; diff --git a/src/emucore/FrameBuffer.cxx b/src/emucore/FrameBuffer.cxx index d021eb547..93169a112 100644 --- a/src/emucore/FrameBuffer.cxx +++ b/src/emucore/FrameBuffer.cxx @@ -67,7 +67,8 @@ FrameBuffer::~FrameBuffer(void) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -FBInitStatus FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height) +FBInitStatus FrameBuffer::initialize(const string& title, + uInt32 width, uInt32 height) { ostringstream buf; @@ -286,7 +287,6 @@ void FrameBuffer::update() default: return; - break; } // Draw any pending messages @@ -752,6 +752,14 @@ void FrameBuffer::setCursorState() showCursor(!emulation); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBuffer::toggleGrabMouse() +{ + bool state = myOSystem->settings().getBool("grabmouse"); + myOSystem->settings().setBool("grabmouse", !state); + setCursorState(); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBuffer::showCursor(bool show) { @@ -842,7 +850,7 @@ void FrameBuffer::setWindowIcon() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 FrameBuffer::getPhosphor(uInt8 c1, uInt8 c2) +uInt8 FrameBuffer::getPhosphor(uInt8 c1, uInt8 c2) const { if(c2 > c1) BSPF_swap(c1, c2); diff --git a/src/emucore/FrameBuffer.hxx b/src/emucore/FrameBuffer.hxx index c5d6e1ee4..5816c78fb 100644 --- a/src/emucore/FrameBuffer.hxx +++ b/src/emucore/FrameBuffer.hxx @@ -235,6 +235,12 @@ class FrameBuffer */ void setCursorState(); + /** + Toggles the use of grabmouse (only has effect in emulation mode). + The method changes the 'grabmouse' setting and saves it. + */ + void toggleGrabMouse(); + /** Shows or hides the cursor based on the given boolean value. */ @@ -488,7 +494,7 @@ class FrameBuffer @return Averaged value of the two colors */ - uInt8 getPhosphor(uInt8 c1, uInt8 c2); + uInt8 getPhosphor(uInt8 c1, uInt8 c2) const; /** Calculate the maximum level by which the base window can be zoomed and diff --git a/src/emucore/stella.pro b/src/emucore/stella.pro index 34674ed32..a2ed98d8a 100644 --- a/src/emucore/stella.pro +++ b/src/emucore/stella.pro @@ -7940,7 +7940,6 @@ "Cartridge.MD5" "6847ce70819b74febcfd03e99610243b" "Cartridge.Name" "Ruby Runner 4A50" -"Cartridge.Type" "4A50" "" "Cartridge.MD5" "68c80e7e1d30df98a0cf67ecbf39cc67"