[crabemu-svn-commits] SF.net SVN: crabemu:[243] trunk/CrabEmu
Status: Beta
Brought to you by:
ljsebald
From: <ljs...@us...> - 2014-10-09 02:07:06
|
Revision: 243 http://sourceforge.net/p/crabemu/code/243 Author: ljsebald Date: 2014-10-09 02:07:01 +0000 (Thu, 09 Oct 2014) Log Message: ----------- Hooray for a needlessly large batch commit. Saving E-Trees is awesome! This one has been a while coming, and really should've been broken up. I pretty much forgot that I hadn't committed a bunch of this stuff... Anyway, here's the higlights of the changes: 1. Implemented the debugging functions for SMS and ColecoVision. 2. Changed the Z80 debugger to use the new debugging functions. 3. Simplified a few things in the OS X GUI code for the changed debugger stuff. 4. Added support for the (unreleased) Sega Graphic Board that was recently obtained by Bock over at SMS Power. Thanks to Bock for obtaining such a gem of SMS hardware and Maxim and Bock for figuring out how it works! Note that currently there is a bit more GUI work that is needed to actually make the graphic board usable, but that's pretty easy to deal with in the end. Modified Paths: -------------- trunk/CrabEmu/BUGS trunk/CrabEmu/CHANGELOG trunk/CrabEmu/README trunk/CrabEmu/osx/CrabEmu.xcodeproj/project.pbxproj trunk/CrabEmu/osx/English.lproj/MainMenu.xib trunk/CrabEmu/src/console.h trunk/CrabEmu/src/consoles/colecovision/colecovision.c trunk/CrabEmu/src/consoles/colecovision/colecovision.h trunk/CrabEmu/src/consoles/nes/nes.c trunk/CrabEmu/src/consoles/nes/nes.h trunk/CrabEmu/src/consoles/sms/sms.c trunk/CrabEmu/src/consoles/sms/sms.h trunk/CrabEmu/src/consoles/sms/smsmem.c trunk/CrabEmu/src/osx/EmuController.h trunk/CrabEmu/src/osx/EmuController.m trunk/CrabEmu/src/osx/EmuOGLView.m trunk/CrabEmu/src/osx/M6502DebugController.m trunk/CrabEmu/src/osx/Z80DebugController.h trunk/CrabEmu/src/osx/Z80DebugController.m trunk/CrabEmu/src/osx/main.m Modified: trunk/CrabEmu/BUGS =================================================================== --- trunk/CrabEmu/BUGS 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/BUGS 2014-10-09 02:07:01 UTC (rev 243) @@ -6,3 +6,6 @@ support offers a little bit of protection, but not really. - The NES support is very... basic. Pretty much no mappers are currently supported. This will hopefully change over time. +- The Smurfs for the Game Gear does not work. I don't think anyone would really + consider this a killer bug, but it is something I know about, so I figured I'd + mention it here. \ No newline at end of file Modified: trunk/CrabEmu/CHANGELOG =================================================================== --- trunk/CrabEmu/CHANGELOG 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/CHANGELOG 2014-10-09 02:07:01 UTC (rev 243) @@ -21,6 +21,7 @@ Sega Master System: - Added a bit of functionality to run the BIOS without loading a rom. +- Added support for emulating the (unreleased) Sega Graphic Board. SG-1000: - Improved the Terebi Oekaki emulation code a little bit. @@ -64,6 +65,8 @@ whether it should have been or not, unless the option was changed after starting the emulator. - Added a menu option to run the SMS BIOS without a rom loaded. +- Added a 6502 debugger for NES emulation. +- Cleaned up the way the Z80 debugger works to match how the 6502 one does. Other: - Added blargg's sms_ntsc image filtering library as an option for rendering Modified: trunk/CrabEmu/README =================================================================== --- trunk/CrabEmu/README 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/README 2014-10-09 02:07:01 UTC (rev 243) @@ -122,6 +122,38 @@ Save State (to VMU in slot A1) Right Trigger + A Load State (from A1) Right Trigger + B +What mappers are supported on the emulated consoles? +---------------------------------------------------- +For the Sega Master System/Game Gear, all of the mappers that I am aware of are +supported. This includes the following list: + - No mapper (for roms small enough to fit in the memory space) + - Sega Mapper (most commonly used mapper on the console) + - Sega Mapper + 93c46 EEPROM (for a bunch of baseball games) + - Codemasters Mapper + - Codemasters Mapper + Extra RAM (for Ernie Els Golf) + - Janggun-ui Adeul Mapper + - 4PAK All Action Mapper + - Korean Mapper + - Korean MSX-like Mapper + +For SG-1000 and SC-3000, the following mappers are supported (once again, all +the ones that I am aware of): + - No mapper (used for most games) + - Castle "mapper" (no mapper with extra RAM) + - Terebi Oekaki "mapper" (no mapper + drawing board) + - Taiwanese MSX-like Mapper A + - Taiwanese MSX-like Mapper B + +For the NES, very few mappers are supported, and some of them aren't supported +very well. Here's the list of mappers with at least partial support: + - iNES Mapper 0 (NROM) + - iNES Mapper 1 (SxROM/MMC1) + - iNES Mapper 2 (UxROM) + - iNES Mapper 3 (CNROM) + - iNES Mapper 7 (AxROM) + - iNES Mapper 9 (PxROM/MMC2) + - iNES Mapper 66 (GxROM) + How do I make a CrabEmu disc (for Dreamcast)? --------------------------------------------- Well, to make a disc for CrabEmu, you need all the files in the Dreamcast binary @@ -209,7 +241,7 @@ from the SD card. What do I need to build CrabEmu (for *nix or Windows)? --------------------------------------------- +------------------------------------------------------ In order to build CrabEmu with the Qt GUI, you must have CMake, Qt 4.x or 5.x, and SDL installed. Since you will be compiling, you will need both the libraries themselves and the development packages installed as well. You will also Modified: trunk/CrabEmu/osx/CrabEmu.xcodeproj/project.pbxproj =================================================================== --- trunk/CrabEmu/osx/CrabEmu.xcodeproj/project.pbxproj 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/osx/CrabEmu.xcodeproj/project.pbxproj 2014-10-09 02:07:01 UTC (rev 243) @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 44; + objectVersion = 45; objects = { /* Begin PBXBuildFile section */ @@ -786,7 +786,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CrabEmu" */; - compatibilityVersion = "Xcode 3.0"; + compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( @@ -949,8 +949,7 @@ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)"; - ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; @@ -977,13 +976,14 @@ GCC_MODEL_TUNING = G4; GCC_OPTIMIZATION_LEVEL = s; GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_VERSION = ""; + GCC_VERSION = com.apple.compilers.llvmgcc42; + "GCC_VERSION[sdk=macosx10.4][arch=*]" = 4.0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.3; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; PRODUCT_NAME = CrabEmu; - SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + SDKROOT = macosx10.4; "SDKROOT[arch=x86_64]" = macosx; WRAPPER_EXTENSION = app; }; @@ -1084,6 +1084,7 @@ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = NO; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_VERSION = ""; + "GCC_VERSION[sdk=macosx10.4][arch=*]" = 4.0; GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; @@ -1130,6 +1131,9 @@ ); PREBINDING = NO; SDKROOT = macosx; + "SDKROOT[arch=i386]" = macosx10.4; + "SDKROOT[arch=ppc]" = macosx10.4; + "SDKROOT[arch=x86_64]" = macosx; WARNING_CFLAGS = ( "-Wno-import", "-Wall", Modified: trunk/CrabEmu/osx/English.lproj/MainMenu.xib =================================================================== --- trunk/CrabEmu/osx/English.lproj/MainMenu.xib 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/osx/English.lproj/MainMenu.xib 2014-10-09 02:07:01 UTC (rev 243) @@ -2,7 +2,7 @@ <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> <data> <int key="IBDocument.SystemTarget">1030</int> - <string key="IBDocument.SystemVersion">13E28</string> + <string key="IBDocument.SystemVersion">13F34</string> <string key="IBDocument.InterfaceBuilderVersion">851</string> <string key="IBDocument.AppKitVersion">1265.21</string> <string key="IBDocument.HIToolboxVersion">698.00</string> @@ -13,7 +13,7 @@ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> <integer value="2283"/> - <integer value="1694"/> + <integer value="2420"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -557,6 +557,90 @@ <reference key="NSOnImage" ref="342564429"/> <reference key="NSMixedImage" ref="747610586"/> </object> + <object class="NSMenuItem" id="461066619"> + <reference key="NSMenu" ref="797970290"/> + <string key="NSTitle">Peripherals</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + <string key="NSAction">submenuAction:</string> + <reference key="NSTarget" ref="58343546"/> + <object class="NSMenu" key="NSSubmenu" id="58343546"> + <string key="NSTitle">Peripherals</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="41913932"> + <reference key="NSMenu" ref="58343546"/> + <string key="NSTitle">Control 1</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + <string key="NSAction">submenuAction:</string> + <reference key="NSTarget" ref="972403593"/> + <object class="NSMenu" key="NSSubmenu" id="972403593"> + <string key="NSTitle">Control 1</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="404483195"> + <reference key="NSMenu" ref="972403593"/> + <string key="NSTitle">Control Pad</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <int key="NSState">1</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + </object> + <object class="NSMenuItem" id="902102381"> + <reference key="NSMenu" ref="972403593"/> + <string key="NSTitle">Sega Graphic Board</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="714991819"> + <reference key="NSMenu" ref="58343546"/> + <string key="NSTitle">Control 2</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + <string key="NSAction">submenuAction:</string> + <reference key="NSTarget" ref="82681082"/> + <object class="NSMenu" key="NSSubmenu" id="82681082"> + <string key="NSTitle">Control 2</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="162108893"> + <reference key="NSMenu" ref="82681082"/> + <string key="NSTitle">Control Pad</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <int key="NSState">1</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="460667799"> + <reference key="NSMenu" ref="797970290"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="342564429"/> + <reference key="NSMixedImage" ref="747610586"/> + </object> <object class="NSMenuItem" id="897021750"> <reference key="NSMenu" ref="797970290"/> <string key="NSTitle">PSG Channels</string> @@ -11805,6 +11889,14 @@ </object> <int key="connectionID">2413</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">z80DebugController</string> + <reference key="source" ref="157328933"/> + <reference key="destination" ref="402403488"/> + </object> + <int key="connectionID">2414</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -12215,6 +12307,8 @@ <reference ref="470202606"/> <reference ref="92925551"/> <reference ref="490233243"/> + <reference ref="461066619"/> + <reference ref="460667799"/> </object> <reference key="parent" ref="406923185"/> </object> @@ -17703,6 +17797,82 @@ <reference key="object" ref="940578489"/> <reference key="parent" ref="47723645"/> </object> + <object class="IBObjectRecord"> + <int key="objectID">2415</int> + <reference key="object" ref="461066619"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="58343546"/> + </object> + <reference key="parent" ref="797970290"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2416</int> + <reference key="object" ref="58343546"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="41913932"/> + <reference ref="714991819"/> + </object> + <reference key="parent" ref="461066619"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2418</int> + <reference key="object" ref="460667799"/> + <reference key="parent" ref="797970290"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2419</int> + <reference key="object" ref="41913932"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="972403593"/> + </object> + <reference key="parent" ref="58343546"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2420</int> + <reference key="object" ref="972403593"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="404483195"/> + <reference ref="902102381"/> + </object> + <reference key="parent" ref="41913932"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2421</int> + <reference key="object" ref="404483195"/> + <reference key="parent" ref="972403593"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2422</int> + <reference key="object" ref="714991819"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="82681082"/> + </object> + <reference key="parent" ref="58343546"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2423</int> + <reference key="object" ref="82681082"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="162108893"/> + </object> + <reference key="parent" ref="714991819"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2424</int> + <reference key="object" ref="162108893"/> + <reference key="parent" ref="82681082"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2425</int> + <reference key="object" ref="902102381"/> + <reference key="parent" ref="972403593"/> + </object> </object> </object> <object class="NSMutableDictionary" key="flattenedProperties"> @@ -18569,6 +18739,19 @@ <string>2385.IBPluginDependency</string> <string>2406.IBPluginDependency</string> <string>2407.IBPluginDependency</string> + <string>2415.IBPluginDependency</string> + <string>2416.IBEditorWindowLastContentRect</string> + <string>2416.IBPluginDependency</string> + <string>2418.IBPluginDependency</string> + <string>2419.IBPluginDependency</string> + <string>2420.IBEditorWindowLastContentRect</string> + <string>2420.IBPluginDependency</string> + <string>2421.IBPluginDependency</string> + <string>2422.IBPluginDependency</string> + <string>2423.IBEditorWindowLastContentRect</string> + <string>2423.IBPluginDependency</string> + <string>2424.IBPluginDependency</string> + <string>2425.IBPluginDependency</string> <string>274.IBEditorWindowLastContentRect</string> <string>274.IBPluginDependency</string> <string>274.IBWindowTemplateEditedContentRect</string> @@ -20049,7 +20232,7 @@ <string>{256, 192}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{555, 256}, {223, 173}}</string> + <string>{{334, 544}, {223, 173}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -20153,7 +20336,7 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{778, 146}, {273, 283}}</string> + <string>{{557, 404}, {273, 313}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -20388,6 +20571,19 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{830, 604}, {116, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{946, 604}, {184, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{946, 604}, {132, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>{{434, 324}, {550, 441}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>{{434, 324}, {550, 441}}</string> @@ -20413,7 +20609,7 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{417, 429}, {466, 20}}</string> + <string>{{196, 717}, {466, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -20898,14 +21094,14 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{866, 808}, {130, 23}}</string> + <string>{{811, 406}, {130, 23}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{866, 788}, {130, 23}}</string> + <string>{{811, 386}, {130, 23}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -21153,7 +21349,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">2413</int> + <int key="maxID">2425</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -21996,6 +22192,7 @@ <string>tone2</string> <string>vdpPalettePanel</string> <string>vdpPatternPanel</string> + <string>z80DebugController</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -22059,6 +22256,7 @@ <string>NSMenuItem</string> <string>NSPanel</string> <string>NSPanel</string> + <string>Z80DebugController</string> </object> </object> <object class="NSMutableDictionary" key="toOneOutletInfosByName"> @@ -22125,6 +22323,7 @@ <string>tone2</string> <string>vdpPalettePanel</string> <string>vdpPatternPanel</string> + <string>z80DebugController</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -22368,6 +22567,10 @@ <string key="name">vdpPatternPanel</string> <string key="candidateClassName">NSPanel</string> </object> + <object class="IBToOneOutletInfo"> + <string key="name">z80DebugController</string> + <string key="candidateClassName">Z80DebugController</string> + </object> </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> Modified: trunk/CrabEmu/src/console.h =================================================================== --- trunk/CrabEmu/src/console.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/console.h 2014-10-09 02:07:01 UTC (rev 243) @@ -48,10 +48,8 @@ int (*reset)(void); int (*soft_reset)(void); - /* Run one frame of output. The return value from this function is passed - into the next call as prev. This should generally be used for any cycles - the CPU was run extra on one pass. */ - int (*frame)(int prev, int skip); + /* Run one frame of output. */ + void (*frame)(int skip); /* Save state management */ int (*load_state)(const char *fn); @@ -70,13 +68,15 @@ /* Cheats */ int (*save_cheats)(const char *fn); - /* Debugging related functions. */ - void (*scanline)(void); - void (*step)(void); - void (*finish_frame)(void); - void (*finish_line)(void); - int (*current_scanline)(void); - int (*current_cycles)(void); + /* Debugging related functions. */ + void (*scanline)(void); + void (*step)(void); + void (*finish_frame)(void); + void (*finish_line)(void); + int (*current_scanline)(void); + int (*current_cycles)(void); + + void (*set_control)(int player, int control); } console_t; ENDCLINK Modified: trunk/CrabEmu/src/consoles/colecovision/colecovision.c =================================================================== --- trunk/CrabEmu/src/consoles/colecovision/colecovision.c 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/colecovision/colecovision.c 2014-10-09 02:07:01 UTC (rev 243) @@ -69,6 +69,16 @@ static int cycles_run, cycles_to_run, scanline; +#ifndef _arch_dreamcast +static void coleco_frame(int); +static void coleco_scanline(void); +static void coleco_single_step(void); +static void coleco_finish_frame(void); +static void coleco_finish_scanline(void); +#endif +static int coleco_current_scanline(void); +static int coleco_cycles_left(void); + /* Console declaration... */ colecovision_t colecovision_cons = { { @@ -84,19 +94,27 @@ #endif &coleco_load_state, &coleco_save_state, - NULL, + NULL, /* save_sram */ &coleco_button_pressed, &coleco_button_released, &sms_vdp_framebuffer, &sms_vdp_framesize, &tms9918a_vdp_activeframe, + NULL, /* save_cheats */ +#ifndef _arch_dreamcast + &coleco_scanline, + &coleco_single_step, + &coleco_finish_frame, + &coleco_finish_scanline, +#else NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL + NULL, + NULL, + NULL, +#endif + &coleco_current_scanline, + &coleco_cycles_left, + NULL /* set_control */ } }; @@ -289,12 +307,19 @@ } #ifndef _arch_dreamcast -int coleco_frame(int run, int skip) { +static __INLINE__ int update_sound(int16 buf[], int start, int line) { + if(sms_psg_enabled) + sn76489_execute_samples(&psg, buf + start, psg_samples[line]); + else + memset(buf + start, 0, psg_samples[line] << 2); + + return start + (psg_samples[line] << 1); +} + +static void coleco_frame(int skip) { int16 buf[882 << 1]; - int line, total_lines, samples = 0; + int samples = 0, total_lines, line; - (void)run; - if(sms_region & SMS_VIDEO_NTSC) total_lines = NTSC_LINES_PER_FRAME; else @@ -306,14 +331,98 @@ cycles_run += tms9918a_vdp_execute(line, &sms_z80_nmi, skip); cycles_run += sms_z80_run(cycles_to_run - cycles_run); - if(sms_psg_enabled) { - sn76489_execute_samples(&psg, buf + samples, psg_samples[line]); + samples = update_sound(buf, samples, line); + } + + sound_update_buffer(buf, samples << 1); + + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; +} + +static void coleco_scanline(void) { + int16 buf[882 << 1]; + int total_lines, samples = 0; + + cycles_to_run += SMS_CYCLES_PER_LINE; + + /* Run the VDP and Z80 for the whole line. */ + cycles_run += sms_vdp_execute(scanline, 0); + cycles_run += tms9918a_vdp_execute(scanline, &sms_z80_nmi, 0); + + samples = update_sound(buf, 0, scanline); + sound_update_buffer(buf, samples << 1); + + /* See if we hit the end of a frame by running this scanline. */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; + } +} + +static void coleco_single_step(void) { + int16 buf[882 << 1]; + int total_lines, run; + + /* If we're at the start of a frame, set things up for the first line. Also, + if we finished a line last time (or are starting a new frame), run the + VDP for the line. */ + if(!cycles_to_run || cycles_run >= cycles_to_run) { + cycles_to_run += SMS_CYCLES_PER_LINE; + if((run = tms9918a_vdp_execute(scanline, &sms_z80_nmi, 0))) { + cycles_run += run; + return; } - else { - memset(buf + samples, 0, psg_samples[line] << 2); + } + + /* Run our one instruction. */ + cycles_run += sms_z80_run(1); + + /* Did we finish a line? */ + if(cycles_run >= cycles_to_run) { + run = update_sound(buf, 0, scanline); + sound_update_buffer(buf, run << 1); + + /* Was it the last line in the frame? */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; } + } +} - samples += psg_samples[line] << 1; +static void coleco_finish_frame(void) { + int16 buf[882 << 1]; + int samples = 0, total_lines, line; + + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + for(line = scanline; line < total_lines; ++line) { + cycles_to_run += SMS_CYCLES_PER_LINE; + + cycles_run += tms9918a_vdp_execute(scanline, &sms_z80_nmi, 0); + cycles_run += sms_z80_run(cycles_to_run - cycles_run); + + samples = update_sound(buf, samples, line); } sound_update_buffer(buf, samples << 1); @@ -322,11 +431,46 @@ cycles_run -= cycles_to_run; cycles_to_run = 0; scanline = 0; - - return 0; } + +static void coleco_finish_scanline(void) { + int16 buf[882 << 1]; + int total_lines, samples = 0; + + /* Make sure we have something to do. */ + if(cycles_run >= cycles_to_run) + return; + + /* Run the Z80 for the rest of the line. The VDP should've already been + run. */ + cycles_run += sms_z80_run(cycles_to_run - cycles_run); + + samples = update_sound(buf, 0, scanline); + sound_update_buffer(buf, samples << 1); + + /* See if we hit the end of a frame by finishing this line. */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; + } +} #endif +static int coleco_current_scanline(void) { + return scanline; +} + +static int coleco_cycles_left(void) { + return cycles_to_run - cycles_run; +} + #ifdef _arch_dreamcast static int coleco_save_state_int(const char *filename) #else Modified: trunk/CrabEmu/src/consoles/colecovision/colecovision.h =================================================================== --- trunk/CrabEmu/src/consoles/colecovision/colecovision.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/colecovision/colecovision.h 2014-10-09 02:07:01 UTC (rev 243) @@ -50,8 +50,6 @@ extern int coleco_soft_reset(void); extern int coleco_shutdown(void); -extern int coleco_frame(int run, int skip); - extern void coleco_button_pressed(int player, int button); extern void coleco_button_released(int player, int button); Modified: trunk/CrabEmu/src/consoles/nes/nes.c =================================================================== --- trunk/CrabEmu/src/consoles/nes/nes.c 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/nes/nes.c 2014-10-09 02:07:01 UTC (rev 243) @@ -84,7 +84,8 @@ &nes_finish_frame, &nes_finish_scanline, &nes_current_scanline, - &nes_cycles_left + &nes_cycles_left, + NULL } }; @@ -158,9 +159,8 @@ return 0; } -int nes_frame(int run, int skip) { +void nes_frame(int skip) { int i; - (void)run; /* Lines 0-239 */ for(i = 0; i < 240; ++i) { @@ -199,8 +199,6 @@ cycles_run -= cycles_to_run; cycles_to_run = 0; scanline = 0; - - return 0; } static void nes_scanline(void) { Modified: trunk/CrabEmu/src/consoles/nes/nes.h =================================================================== --- trunk/CrabEmu/src/consoles/nes/nes.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/nes/nes.h 2014-10-09 02:07:01 UTC (rev 243) @@ -29,7 +29,7 @@ extern int nes_reset(void); extern int nes_soft_reset(void); extern int nes_shutdown(void); -extern int nes_frame(int run, int skip); +extern void nes_frame(int skip); extern int nes_cycles_elapsed(void); extern void nes_assert_irq(void); Modified: trunk/CrabEmu/src/consoles/sms/sms.c =================================================================== --- trunk/CrabEmu/src/consoles/sms/sms.c 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/sms/sms.c 2014-10-09 02:07:01 UTC (rev 243) @@ -65,9 +65,21 @@ extern uint8 sms_gg_regs[7]; extern int sms_bios_active; +extern int sms_control_type[2]; +extern uint32 sms_gfxbd_data[2]; static int cycles_run, cycles_to_run, scanline; +#ifndef _arch_dreamcast +static void sms_frame(int); +static void sms_scanline(void); +static void sms_single_step(void); +static void sms_finish_frame(void); +static void sms_finish_scanline(void); +#endif +static int sms_current_scanline(void); +static int sms_cycles_left(void); + /* Console declaration... */ sms_t sms_cons = { { @@ -90,12 +102,20 @@ &sms_vdp_framesize, &sms_vdp_activeframe, &sms_cheat_write, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL +#ifndef _arch_dreamcast + &sms_scanline, + &sms_single_step, + &sms_finish_frame, + &sms_finish_scanline, +#else + NULL, + NULL, + NULL, + NULL, +#endif + &sms_current_scanline, + &sms_cycles_left, + NULL /* set control */ } }; @@ -228,13 +248,34 @@ } #ifndef _arch_dreamcast -int sms_frame(int run, int skip) { - int16 buf[882 << 1], fmbuf[882 << 1]; - int line, total_lines, tmp, samples = 0; +static __INLINE__ int update_sound(int16 buf[], int start, int line) { + int16 fmbuf[16]; /* More than we'll need, but meh. */ + int16 tmp; uint32 i; - (void)run; + if(sms_psg_enabled) + sn76489_execute_samples(&psg, buf + start, psg_samples[line]); + else + memset(buf + start, 0, psg_samples[line] << 2); + if(sms_ym2413_enabled) { + YM2413UpdateOne(0, fmbuf, psg_samples[line]); + + /* Mix in the FM unit's samples */ + for(i = 0; i < psg_samples[line]; ++i) { + tmp = (fmbuf[i << 1] + fmbuf[(i << 1) + 1]) / 2; + buf[(i << 1) + start] += tmp; + buf[(i << 1) + 1 + start] += tmp; + } + } + + return start + (psg_samples[line] << 1); +} + +static void sms_frame(int skip) { + int16 buf[882 << 1]; + int samples = 0, total_lines, line; + if(sms_region & SMS_VIDEO_NTSC) total_lines = NTSC_LINES_PER_FRAME; else @@ -247,25 +288,101 @@ cycles_run += sms_vdp_execute(line, skip); cycles_run += sms_z80_run(cycles_to_run - cycles_run); - if(sms_psg_enabled) { - sn76489_execute_samples(&psg, buf + samples, psg_samples[line]); + samples = update_sound(buf, samples, line); + } + + sound_update_buffer(buf, samples << 1); + + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; +} + +static void sms_scanline(void) { + int16 buf[882 << 1]; + int total_lines, samples = 0; + + cycles_to_run += SMS_CYCLES_PER_LINE; + sms_cheat_frame(); + + /* Run the VDP and Z80 for the whole line. */ + cycles_run += sms_vdp_execute(scanline, 0); + cycles_run += sms_z80_run(cycles_to_run - cycles_run); + + samples = update_sound(buf, 0, scanline); + sound_update_buffer(buf, samples << 1); + + /* See if we hit the end of a frame by running this scanline. */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; + } +} + +static void sms_single_step(void) { + int16 buf[882 << 1]; + int total_lines, run; + + /* If we're at the start of a frame, set things up for the first line. Also, + if we finished a line last time (or are starting a new frame), run the + VDP for the line. */ + if(!cycles_to_run || cycles_run >= cycles_to_run) { + cycles_to_run += SMS_CYCLES_PER_LINE; + sms_cheat_frame(); + if((run = sms_vdp_execute(scanline, 0))) { + cycles_run += run; + return; } - else { - memset(buf + samples, 0, psg_samples[line] << 2); - } + } - if(sms_ym2413_enabled) { - YM2413UpdateOne(0, fmbuf, psg_samples[line]); + /* Run our one instruction. */ + cycles_run += sms_z80_run(1); - /* Mix in the FM unit's samples */ - for(i = 0; i < psg_samples[line]; ++i) { - tmp = (fmbuf[i << 1] + fmbuf[(i << 1) + 1]) / 2; - buf[(i << 1) + samples] += tmp; - buf[(i << 1) + 1 + samples] += tmp; - } + /* Did we finish a line? */ + if(cycles_run >= cycles_to_run) { + run = update_sound(buf, 0, scanline); + sound_update_buffer(buf, run << 1); + + /* Was it the last line in the frame? */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; } + } +} - samples += psg_samples[line] << 1; +static void sms_finish_frame(void) { + int16 buf[882 << 1]; + int samples = 0, total_lines, line; + + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + for(line = scanline; line < total_lines; ++line) { + cycles_to_run += SMS_CYCLES_PER_LINE; + sms_cheat_frame(); + + cycles_run += sms_vdp_execute(line, 0); + cycles_run += sms_z80_run(cycles_to_run - cycles_run); + + samples = update_sound(buf, samples, line); } sound_update_buffer(buf, samples << 1); @@ -274,9 +391,37 @@ cycles_run -= cycles_to_run; cycles_to_run = 0; scanline = 0; +} - return 0; +static void sms_finish_scanline(void) { + int16 buf[882 << 1]; + int total_lines, samples = 0; + + /* Make sure we have something to do. */ + if(cycles_run >= cycles_to_run) + return; + + /* Run the Z80 for the rest of the line. The VDP should've already been + run. */ + cycles_run += sms_z80_run(cycles_to_run - cycles_run); + + samples = update_sound(buf, 0, scanline); + sound_update_buffer(buf, samples << 1); + + /* See if we hit the end of a frame by finishing this line. */ + if(sms_region & SMS_VIDEO_NTSC) + total_lines = NTSC_LINES_PER_FRAME; + else + total_lines = PAL_LINES_PER_FRAME; + + if(++scanline == total_lines) { + /* Reset the state for the next frame. */ + cycles_run -= cycles_to_run; + cycles_to_run = 0; + scanline = 0; + } } + #endif void sms_button_pressed(int player, int button) { @@ -285,35 +430,57 @@ if(player < 1 || player > 2) return; - if(button < SMS_UP || button > SMS_CONSOLE_RESET || button == SMS_QUIT) - return; + if(sms_control_type[player - 1] == SMS_PADTYPE_CONTROL_PAD) { + if(button < SMS_UP || button > SMS_CONSOLE_RESET || button == SMS_QUIT) + return; - switch(button) { - case SMS_UP: - case SMS_DOWN: - case SMS_LEFT: - case SMS_RIGHT: - case SMS_BUTTON_1: - case SMS_BUTTON_2: - mask = (player == 1) ? (1 << button) : (1 << (button + 6)); - break; + switch(button) { + case SMS_UP: + case SMS_DOWN: + case SMS_LEFT: + case SMS_RIGHT: + case SMS_BUTTON_1: + case SMS_BUTTON_2: + mask = (player == 1) ? (1 << button) : (1 << (button + 6)); + break; - case SMS_CONSOLE_RESET: - mask = SMS_RESET; - break; + case SMS_CONSOLE_RESET: + mask = SMS_RESET; + break; - case GAMEGEAR_START: - if(sms_cons._base.console_type == CONSOLE_GG) { - sms_gg_regs[0] &= 0x7F; - } - else if(sms_cons._base.console_type == CONSOLE_SMS) { - sms_z80_nmi(); - } - return; + case GAMEGEAR_START: + if(sms_cons._base.console_type == CONSOLE_GG) { + sms_gg_regs[0] &= 0x7F; + } + else if(sms_cons._base.console_type == CONSOLE_SMS) { + sms_z80_nmi(); + } + return; + } + + /* Update the pad */ + sms_pad &= ~mask; } + else if(sms_control_type[player - 1] == SMS_PADTYPE_GFX_BOARD) { + switch(button) { + case SMS_GFXBD_1: + case SMS_GFXBD_2: + case SMS_GFXBD_3: + sms_gfxbd_data[player - 1] &= ~(1 << button); + break; - /* Update the pad */ - sms_pad &= ~mask; + case SMS_CONSOLE_RESET: + sms_pad &= ~SMS_RESET; + break; + + case GAMEGEAR_START: + if(sms_cons._base.console_type == CONSOLE_GG) + sms_gg_regs[0] &= 0x7F; + else if(sms_cons._base.console_type == CONSOLE_SMS) + sms_z80_nmi(); + break; + } + } } void sms_button_released(int player, int button) { @@ -322,32 +489,52 @@ if(player < 1 || player > 2) return; - if(button < SMS_UP || button > SMS_CONSOLE_RESET || button == SMS_QUIT) - return; + if(sms_control_type[player - 1] == SMS_PADTYPE_CONTROL_PAD) { + if(button < SMS_UP || button > SMS_CONSOLE_RESET || button == SMS_QUIT) + return; - switch(button) { - case SMS_UP: - case SMS_DOWN: - case SMS_LEFT: - case SMS_RIGHT: - case SMS_BUTTON_1: - case SMS_BUTTON_2: - mask = (player == 1) ? (1 << button) : (1 << (button + 6)); - break; + switch(button) { + case SMS_UP: + case SMS_DOWN: + case SMS_LEFT: + case SMS_RIGHT: + case SMS_BUTTON_1: + case SMS_BUTTON_2: + mask = (player == 1) ? (1 << button) : (1 << (button + 6)); + break; - case SMS_CONSOLE_RESET: - mask = SMS_RESET; - break; + case SMS_CONSOLE_RESET: + mask = SMS_RESET; + break; - case GAMEGEAR_START: - if(sms_cons._base.console_type == CONSOLE_GG) { - sms_gg_regs[0] |= 0x80; - } - return; + case GAMEGEAR_START: + if(sms_cons._base.console_type == CONSOLE_GG) { + sms_gg_regs[0] |= 0x80; + } + return; + } + + /* Update the pad */ + sms_pad |= mask; } + else if(sms_control_type[player - 1] == SMS_PADTYPE_GFX_BOARD) { + switch(button) { + case SMS_GFXBD_1: + case SMS_GFXBD_2: + case SMS_GFXBD_3: + sms_gfxbd_data[player - 1] |= (1 << button); + break; - /* Update the pad */ - sms_pad |= mask; + case SMS_CONSOLE_RESET: + sms_pad |= SMS_RESET; + break; + + case GAMEGEAR_START: + if(sms_cons._base.console_type == CONSOLE_GG) + sms_gg_regs[0] |= 0x80; + break; + } + } } void sms_set_console(int console) { @@ -387,6 +574,14 @@ sms_cons._base.console_type = console; } +static int sms_current_scanline(void) { + return scanline; +} + +static int sms_cycles_left(void) { + return cycles_to_run - cycles_run; +} + int sms_cycles_elapsed(void) { return cycles_run + sms_z80_get_cycles(); } Modified: trunk/CrabEmu/src/consoles/sms/sms.h =================================================================== --- trunk/CrabEmu/src/consoles/sms/sms.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/sms/sms.h 2014-10-09 02:07:01 UTC (rev 243) @@ -32,8 +32,6 @@ extern int sms_soft_reset(void); extern int sms_shutdown(void); -extern int sms_frame(int run, int skip); - extern void sms_button_pressed(int player, int button); extern void sms_button_released(int player, int button); @@ -74,6 +72,16 @@ #define SMS_QUIT 7 /* This one is ignored... */ #define SMS_CONSOLE_RESET 8 +/* Buttons for the Graphic Board */ +#define SMS_GFXBD_1 0 +#define SMS_GFXBD_2 1 +#define SMS_GFXBD_3 2 + +/* Control pad types. */ +#define SMS_PADTYPE_NONE 0 +#define SMS_PADTYPE_CONTROL_PAD 1 +#define SMS_PADTYPE_GFX_BOARD 2 + #define SMS_PAD1_TL SMS_PAD1_A #define SMS_PAD1_TR SMS_PAD1_B #define SMS_PAD2_TL SMS_PAD2_A Modified: trunk/CrabEmu/src/consoles/sms/smsmem.c =================================================================== --- trunk/CrabEmu/src/consoles/sms/smsmem.c 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/consoles/sms/smsmem.c 2014-10-09 02:07:01 UTC (rev 243) @@ -103,10 +103,13 @@ uint8 sms_dummy_areaw[256]; uint8 sms_cart_ram[0x8000]; int sms_bios_active = 0; +int sms_control_type[2] = { SMS_PADTYPE_CONTROL_PAD, SMS_PADTYPE_CONTROL_PAD }; static uint8 sms_fm_detect = 0; static uint8 sms_ym2413_regs[0x41] = { 0 }; static int sms_ym2413_in_use = 0; static uint32 rom_crc, rom_adler; +static int gfx_board_nibble[2] = { 0, 0 }; +uint32 sms_gfxbd_data[2] = { 0x0000000F, 0x0000000F }; typedef void (*remap_page_func)(); remap_page_func sms_mem_remap_page[4]; @@ -567,6 +570,7 @@ void sms_mem_handle_ioctl(uint8 data) { int old, new; + uint8 tmp; /* Make sure we're emulating an export SMS, the Japanese SMS (and earlier hardware) did not have the I/O Control Register functionality. */ @@ -575,6 +579,7 @@ sms_cons._base.console_type == CONSOLE_SG1000) return; + tmp = sms_ioctl; sms_ioctl = data; old = ((sms_pad & sms_ioctl_input_mask) | (sms_ioctl_output_bits & sms_ioctl_output_mask)) ^ SMS_TH_MASK; @@ -599,8 +604,71 @@ if(old & new) sms_vdp_hcnt_latch(sms_cycles_elapsed() % SMS_CYCLES_PER_LINE); + + /* Handle any graphics boards hooked up. Information from the SMS Power + forums provided by Maxim and Bock here: + http://www.smspower.org/forums/viewtopic.php?p=81920#81920 */ + if(sms_control_type[0] == SMS_PADTYPE_GFX_BOARD) { + if((tmp ^ data) & SMS_IOCTL_TH_A_LEVEL) + gfx_board_nibble[0] = (gfx_board_nibble[0] + 1) & 7; + if(data & SMS_IOCTL_TR_A_LEVEL) + gfx_board_nibble[0] = 0; + } + + if(sms_control_type[1] == SMS_PADTYPE_GFX_BOARD) { + if((tmp ^ data) & SMS_IOCTL_TH_B_LEVEL) + gfx_board_nibble[1] = (gfx_board_nibble[1] + 1) & 7; + if(data & SMS_IOCTL_TR_B_LEVEL) + gfx_board_nibble[1] = 0; + } } +static uint8 sms_read_controls(uint16 port) { + uint16 output = sms_ioctl_output_bits & sms_ioctl_output_mask; + uint16 input = sms_pad; + + /* The information here came from the forum thread linked to above... */ + if(sms_control_type[0] == SMS_PADTYPE_GFX_BOARD) { + if(sms_ioctl & SMS_IOCTL_TR_A_LEVEL) { + input &= 0xFFE0; + } + else { + input = (input & 0xFFF0) | + ((sms_gfxbd_data[0] >> (gfx_board_nibble[0] << 2)) & 0x0F); + + if(gfx_board_nibble[0] == 0) + input &= ~SMS_PAD1_TL; + } + } + + /* This is totally a guess until someone actually tests this out, but it + seems logical, at least. */ + if(sms_control_type[1] == SMS_PADTYPE_GFX_BOARD) { + if(sms_ioctl & SMS_IOCTL_TR_B_LEVEL) { + input &= 0xF83F; + } + else { + input = (input & 0xFC3F) | + (((sms_gfxbd_data[1] >> (gfx_board_nibble[1] << 2)) & + 0x0F) <<6); + + if(gfx_board_nibble[1] == 0) + input &= ~SMS_PAD2_TL; + } + } + + input &= sms_ioctl_input_mask; + + if(port & 0x01) { + /* I/O port B/misc register */ + return ((input | output) >> 8) & 0xFF; + } + else { + /* I/O port A/B register */ + return (input | output) & 0xFF; + } +} + void sms_port_write(uint16 port, uint8 data) { port &= 0xFF; @@ -683,18 +751,7 @@ } else { if(!(sms_memctl & SMS_MEMCTL_IO)) { - if(port & 0x01) { - /* I/O port B/misc register */ - return (((sms_pad & sms_ioctl_input_mask) | - (sms_ioctl_output_bits & - sms_ioctl_output_mask)) >> 8) & 0xFF; - } - else { - /* I/O port A/B register */ - return ((sms_pad & sms_ioctl_input_mask) | - (sms_ioctl_output_bits & - sms_ioctl_output_mask)) & 0xFF; - } + return sms_read_controls(port); } else if(sms_ym2413_enabled && port == 0xF2) { sms_ym2413_in_use = 1; @@ -2076,6 +2133,9 @@ ram[0] = sms_memctl; sms_bios_active = 0; + gfx_board_nibble[0] = gfx_board_nibble[1] = 0; + sms_gfxbd_data[0] = sms_gfxbd_data[1] = 0x0000000F; + memset(ram, 0xF0, 8 * 1024); return 0; @@ -2144,6 +2204,9 @@ sms_ioctl = SMS_IOCTL_TR_A_DIRECTION | SMS_IOCTL_TH_A_DIRECTION | SMS_IOCTL_TR_B_DIRECTION | SMS_IOCTL_TH_B_DIRECTION; + gfx_board_nibble[0] = gfx_board_nibble[1] = 0; + sms_gfxbd_data[0] = sms_gfxbd_data[1] = 0x0000000F; + memset(ram, 0xF0, 8 * 1024); reorganize_pages(); Modified: trunk/CrabEmu/src/osx/EmuController.h =================================================================== --- trunk/CrabEmu/src/osx/EmuController.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/osx/EmuController.h 2014-10-09 02:07:01 UTC (rev 243) @@ -25,6 +25,7 @@ #include "PaletteGLView.h" #include "PatternGLView.h" #include "NESPatternGLView.h" +#include "Z80DebugController.h" #include "M6502DebugController.h" #include "SDSCView.h" #include "SMSCheatController.h" @@ -42,11 +43,12 @@ IBOutlet NSMenuItem *tone1; IBOutlet NSMenuItem *tone2; IBOutlet NSMenuItem *debugger; - IBOutlet NSMenuItem *nesDebugger; + IBOutlet NSMenuItem *nesDebugger; IBOutlet NSWindow *debuggerWindow; IBOutlet NSWindow *smsVdpDebuggerWindow; - IBOutlet NSWindow *m6502debugWindow; - IBOutlet M6502DebugController *m6502DebugController; + IBOutlet NSWindow *m6502debugWindow; + IBOutlet Z80DebugController *z80DebugController; + IBOutlet M6502DebugController *m6502DebugController; IBOutlet NSMenuItem *rExport; IBOutlet NSMenuItem *rDomestic; IBOutlet NSMenuItem *pal; Modified: trunk/CrabEmu/src/osx/EmuController.m =================================================================== --- trunk/CrabEmu/src/osx/EmuController.m 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/osx/EmuController.m 2014-10-09 02:07:01 UTC (rev 243) @@ -24,6 +24,7 @@ #include "NSCondition.h" #include "EmuController.h" #include "EmuOGLView.h" +#include "SMSVDPDebugController.h" #include "sms.h" #include "colecovision.h" #include "smsmem.h" @@ -47,9 +48,9 @@ extern EmuController *thecont; extern void emu_loop(); extern BOOL debuggerEnabled; -extern NSCondition *ss_sem; extern BOOL ntscVideo; extern console_t *cur_console; +extern SMSVDPDebugController *vdpDebugger; /* from sms.c */ extern int sms_psg_enabled; @@ -568,27 +569,35 @@ - (IBAction)enableDebugger:(id)sender { if([debugger state] == NSOffState) { + [memoryLock lock]; [debugger setState:NSOnState]; [smsVdpDebuggerWindow makeKeyAndOrderFront:self]; [debuggerWindow makeKeyAndOrderFront:self]; debuggerEnabled = YES; + [z80DebugController updateWithCycles:cur_console->current_cycles() + scanline:cur_console->current_scanline()]; + [vdpDebugger update]; + [memoryLock unlock]; } else { [debugger setState:NSOffState]; [smsVdpDebuggerWindow orderOut:self]; [debuggerWindow orderOut:self]; debuggerEnabled = NO; - [ss_sem signal]; } } - (IBAction)enableNESDebugger:(id)sender { if([nesDebugger state] == NSOffState) { + [memoryLock lock]; [nesDebugger setState:NSOnState]; [m6502debugWindow makeKeyAndOrderFront:self]; [m6502DebugController setCPU:&nescpu]; + [m6502DebugController updateWithCycles:cur_console->current_cycles() + scanline:cur_console->current_scanline()]; debuggerEnabled = YES; + [memoryLock unlock]; } else { [nesDebugger setState:NSOffState]; Modified: trunk/CrabEmu/src/osx/EmuOGLView.m =================================================================== --- trunk/CrabEmu/src/osx/EmuOGLView.m 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/osx/EmuOGLView.m 2014-10-09 02:07:01 UTC (rev 243) @@ -346,6 +346,10 @@ unichar character = [str characterAtIndex:0]; int len, i; + /* Discard repeat events. */ + if([event isARepeat]) + return; + str = [controller keyListForConsole:cur_console->console_type player:1]; len = (int)[str length]; @@ -411,6 +415,8 @@ } } +extern uint32 sms_gfxbd_data[2]; + - (void)mouseDown:(NSEvent *)event { NSPoint loc = [self convertPoint:[event locationInWindow] @@ -428,11 +434,30 @@ y = (192 - y) > 0 ? 192 - y : 0; terebi_update(x, y, 1); + + y += 36; + x -= 4; + + if(x < 0) + x = 0; + if(x > 255) + x = 255; + + if(y < 0) + y = 0; + if(y > 255) + y = 255; + + sms_gfxbd_data[0] &= 0x0000000F; + sms_gfxbd_data[0] |= 0xEF << 4; + sms_gfxbd_data[0] |= (((x >> 4) & 0x0f) | ((x & 0x0f) << 4)) << 12; + sms_gfxbd_data[0] |= (((y >> 4) & 0x0f) | ((y & 0x0f) << 4)) << 20; } - (void)mouseUp:(NSEvent *)event { terebi_update(0, 0, 0); + sms_gfxbd_data[0] &= 0x0000000F; } - (void)mouseDragged:(NSEvent *)event @@ -440,6 +465,17 @@ [self mouseDown:event]; } +- (void)mouseEntered:(NSEvent *)e +{ + [window setAcceptsMouseMovedEvents:YES]; + [window makeFirstResponder:self]; +} + +- (void)mouseExited:(NSEvent *)e +{ + [window setAcceptsMouseMovedEvents:NO]; +} + - (float)width { if(!isFullscreen) { Modified: trunk/CrabEmu/src/osx/M6502DebugController.m =================================================================== --- trunk/CrabEmu/src/osx/M6502DebugController.m 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/osx/M6502DebugController.m 2014-10-09 02:07:01 UTC (rev 243) @@ -113,7 +113,6 @@ cur_console->step(); lastMode = 1; - [self updateWithCycles:cur_console->current_cycles() scanline:cur_console->current_scanline()]; } @@ -128,7 +127,6 @@ cur_console->scanline(); lastMode = 2; - [self updateWithCycles:cur_console->current_cycles() scanline:cur_console->current_scanline()]; } @@ -145,7 +143,7 @@ cur_console->finish_frame(); } else { - cur_console->frame(0, 0); + cur_console->frame(0); } lastMode = 3; Modified: trunk/CrabEmu/src/osx/Z80DebugController.h =================================================================== --- trunk/CrabEmu/src/osx/Z80DebugController.h 2014-09-23 18:52:25 UTC (rev 242) +++ trunk/CrabEmu/src/osx/Z80DebugController.h 2014-10-09 02:07:01 UTC (rev 243) @@ -1,7 +1,7 @@ /* This file is part of CrabEmu. - Copyright (C) 2006 Lawrence Sebald + Copyright (C) 2006, 2014 Lawrence Sebald CrabEmu is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 @@ -17,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef Z80DebugController_h +#define Z80DebugController_h + #import <Cocoa/Cocoa.h> @interface Z80DebugController : NSObject @@ -49,6 +52,8 @@ IBOutlet NSButton *stateHalted; IBOutlet NSButton *stateIFF1; IBOutlet NSButton *stateIFF2; + + int lastMode; } - (void)updateWithCycles:(int)cycles scanline:(int)scanline; @@ -57,3 +62... [truncated message content] |