├── .vs ├── slnx.sqlite ├── MemcardRex │ ├── v14 │ │ └── .suo │ └── v16 │ │ └── .suo └── VSWorkspaceState.json ├── MemcardRex.macOS ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ ├── icon_16x16.png │ │ ├── icon_32x32.png │ │ ├── icon_128x128.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_512x512@2x.png │ │ └── Contents.json ├── Resources │ ├── .DS_Store │ ├── amflag.bmp │ ├── euflag.bmp │ ├── jpflag.bmp │ ├── tmpbuffer.png │ └── info_template.png ├── Entitlements.plist ├── MacMain.cs ├── packages.config ├── MemcardRex.macOS.csproj ├── Info.plist └── macOS │ ├── GUI │ ├── CommentDialogController.designer.cs │ ├── HardwareDialogController.designer.cs │ ├── HeaderDialogController.designer.cs │ ├── WindowController.designer.cs │ ├── InfoDialogController.designer.cs │ ├── CommentDialogController.cs │ ├── PreferencesViewController.designer.cs │ ├── WindowController.cs │ ├── HeaderDialogController.cs │ ├── PreferencesViewController.cs │ ├── InfoDialogController.cs │ └── ViewController.designer.cs │ └── AppDelegate.designer.cs ├── MemcardRex.Windows ├── Resources │ ├── Thumbs.db │ ├── amflag.bmp │ ├── euflag.bmp │ ├── jpflag.bmp │ ├── linked.bmp │ ├── naflag.bmp │ ├── plugin.png │ ├── comments.png │ ├── copycard.png │ ├── dxdread.png │ ├── dxdwrite.png │ ├── iconedit.png │ ├── infoicon.png │ ├── newcard.png │ ├── opencard.png │ ├── options.png │ ├── quiticon.png │ ├── readicon.png │ ├── savecard.png │ ├── closecard.png │ ├── comparetemp.png │ ├── deletesave.png │ ├── exportsave.png │ ├── formatsave.png │ ├── headeredit.png │ ├── importsave.png │ ├── memcardrex.ico │ ├── pastecard.png │ ├── savecardas.png │ ├── closeallcards.png │ ├── undeletesave.png │ └── linked disabled.bmp ├── Properties │ ├── Settings.settings │ └── Settings.Designer.cs ├── app.config ├── Program.cs ├── Windows │ └── GUI │ │ ├── commentsWindow.cs │ │ ├── aboutWindow.cs │ │ ├── headerWindow.cs │ │ ├── compareWindow.cs │ │ ├── pluginsWindow.cs │ │ ├── cardReaderWindow.designer.cs │ │ ├── preferencesWindow.cs │ │ ├── pocketStationInfo.cs │ │ ├── commentsWindow.Designer.cs │ │ ├── commentsWindow.resx │ │ ├── headerWindow.resx │ │ ├── pocketStationInfo.resx │ │ ├── preferencesWindow.resx │ │ ├── aboutWindow.resx │ │ ├── cardReaderWindow.resx │ │ ├── compareWindow.resx │ │ ├── pluginsWindow.resx │ │ ├── informationWindow.resx │ │ ├── pluginsWindow.Designer.cs │ │ └── compareWindow.Designer.cs ├── app.manifest └── MemcardRex.csproj ├── MemcardRex.Core ├── MemcardRex.Core.csproj ├── Support │ ├── xmlSettingsEditor.cs │ ├── ProgramSettings.cs │ └── BmpBuilder.cs └── Hardware │ └── HardwareInterface.cs ├── .vscode ├── tasks.json └── launch.json ├── .gitattributes ├── MONO.md ├── MemcardRex.sln ├── README.md └── .gitignore /.vs/slnx.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/.vs/slnx.sqlite -------------------------------------------------------------------------------- /.vs/MemcardRex/v14/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/.vs/MemcardRex/v14/.suo -------------------------------------------------------------------------------- /.vs/MemcardRex/v16/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/.vs/MemcardRex/v16/.suo -------------------------------------------------------------------------------- /.vs/VSWorkspaceState.json: -------------------------------------------------------------------------------- 1 | { 2 | "ExpandedNodes": [ 3 | "" 4 | ], 5 | "PreviewInSolutionExplorer": false 6 | } -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/.DS_Store -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/Thumbs.db -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/amflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/amflag.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/euflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/euflag.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/jpflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/jpflag.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/linked.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/linked.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/naflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/naflag.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/plugin.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/amflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/amflag.bmp -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/euflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/euflag.bmp -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/jpflag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/jpflag.bmp -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/comments.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/copycard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/copycard.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/dxdread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/dxdread.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/dxdwrite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/dxdwrite.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/iconedit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/iconedit.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/infoicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/infoicon.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/newcard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/newcard.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/opencard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/opencard.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/options.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/quiticon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/quiticon.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/readicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/readicon.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/savecard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/savecard.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/tmpbuffer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/tmpbuffer.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/closecard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/closecard.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/comparetemp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/comparetemp.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/deletesave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/deletesave.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/exportsave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/exportsave.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/formatsave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/formatsave.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/headeredit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/headeredit.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/importsave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/importsave.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/memcardrex.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/memcardrex.ico -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/pastecard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/pastecard.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/savecardas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/savecardas.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Resources/info_template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Resources/info_template.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/closeallcards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/closeallcards.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/undeletesave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/undeletesave.png -------------------------------------------------------------------------------- /MemcardRex.Windows/Resources/linked disabled.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.Windows/Resources/linked disabled.bmp -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex/HEAD/MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /MemcardRex.macOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MemcardRex.macOS/MacMain.cs: -------------------------------------------------------------------------------- 1 | using AppKit; 2 | 3 | namespace MemcardRex 4 | { 5 | static class MainClass 6 | { 7 | static void Main (string [] args) 8 | { 9 | NSApplication.Init (); 10 | NSApplication.Main (args); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MemcardRex.macOS/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MemcardRex.macOS/MemcardRex.macOS.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net7.0-macos 6 | memcardrex 7 | enable 8 | enable 9 | 13.0 10 | 11 | 12 | 13 | 14 | {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 15 | MemcardRex.Core 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /MemcardRex.Core/MemcardRex.Core.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | Library 5 | false 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /MemcardRex.macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleName 6 | MemcardRex 7 | CFBundleIdentifier 8 | com.shendoxt.MemcardRex 9 | CFBundleShortVersionString 10 | 2.0 11 | CFBundleVersion 12 | 1 13 | LSMinimumSystemVersion 14 | 13.0 15 | CFBundleDevelopmentRegion 16 | en 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | NSHumanReadableCopyright 24 | ${AuthorCopyright:HtmlEncode} 25 | NSPrincipalClass 26 | NSApplication 27 | NSMainStoryboardFile 28 | Main 29 | XSAppIconAssets 30 | Assets.xcassets/AppIcon.appiconset 31 | 32 | 33 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/CommentDialogController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("CommentDialogController")] 13 | partial class CommentDialogController 14 | { 15 | [Outlet] 16 | AppKit.NSTextFieldCell CommentTextField { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSTextField CommentTextInput { get; set; } 20 | 21 | [Action ("CancelDialog:")] 22 | partial void CancelDialog (Foundation.NSObject sender); 23 | 24 | [Action ("ConfirmDialog:")] 25 | partial void ConfirmDialog (Foundation.NSObject sender); 26 | 27 | void ReleaseDesignerOutlets () 28 | { 29 | if (CommentTextInput != null) { 30 | CommentTextInput.Dispose (); 31 | CommentTextInput = null; 32 | } 33 | 34 | if (CommentTextField != null) { 35 | CommentTextField.Dispose (); 36 | CommentTextField = null; 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace MemcardRex.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/HardwareDialogController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex.macOS 11 | { 12 | [Register ("HardwareDialogController")] 13 | partial class HardwareDialogController 14 | { 15 | [Outlet] 16 | AppKit.NSButton abortButton { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSTextField deviceLabel { get; set; } 20 | 21 | [Outlet] 22 | AppKit.NSProgressIndicator progressBar { get; set; } 23 | 24 | [Action ("abortDialog:")] 25 | partial void abortDialog (Foundation.NSObject sender); 26 | 27 | void ReleaseDesignerOutlets () 28 | { 29 | if (deviceLabel != null) { 30 | deviceLabel.Dispose (); 31 | deviceLabel = null; 32 | } 33 | 34 | if (progressBar != null) { 35 | progressBar.Dispose (); 36 | progressBar = null; 37 | } 38 | 39 | if (abortButton != null) { 40 | abortButton.Dispose (); 41 | abortButton = null; 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "armbuild", 6 | "command": "dotnet", 7 | "type": "process", 8 | "args": [ 9 | "build", 10 | "-c", 11 | "debug", 12 | "-r", 13 | "osx-arm64", 14 | "MemcardRex.macOS" 15 | ], 16 | "problemMatcher": "$msCompile" 17 | }, 18 | { 19 | "label": "x64build", 20 | "command": "dotnet", 21 | "type": "process", 22 | "args": [ 23 | "build", 24 | "-c", 25 | "debug", 26 | "-r", 27 | "osx-x64", 28 | "MemcardRex.macOS" 29 | ], 30 | "problemMatcher": "$msCompile" 31 | }, 32 | { 33 | "label": "publish", 34 | "command": "dotnet", 35 | "type": "process", 36 | "args": [ 37 | "build", 38 | "-c", 39 | "release", 40 | "MemcardRex.macOS" 41 | ], 42 | "problemMatcher": "$msCompile" 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /MemcardRex.Windows/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Program.cs: -------------------------------------------------------------------------------- 1 | /* 2 | This program is free software: you can redistribute it and/or modify 3 | it under the terms of the GNU General Public License as published by 4 | the Free Software Foundation, either version 3 of the License, or 5 | (at your option) any later version. 6 | 7 | This program is distributed in the hope that it will be useful, 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 | GNU General Public License for more details. 11 | 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System; 17 | using System.Collections.Generic; 18 | using System.Windows.Forms; 19 | using System.Runtime.Versioning; 20 | 21 | namespace MemcardRex 22 | { 23 | [SupportedOSPlatform("windows")] 24 | static class Program 25 | { 26 | /// 27 | /// The main entry point for the application. 28 | /// 29 | [STAThread] 30 | static void Main() 31 | { 32 | Application.EnableVisualStyles(); 33 | Application.SetCompatibleTextRenderingDefault(false); 34 | Application.Run(new mainWindow()); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/commentsWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Versioning; 3 | using System.Windows.Forms; 4 | 5 | namespace MemcardRex 6 | { 7 | [SupportedOSPlatform("windows")] 8 | public partial class commentsWindow : Form 9 | { 10 | //If OK is pressed this will be true 11 | public bool okPressed = false; 12 | public string saveComment = null; 13 | 14 | public commentsWindow() 15 | { 16 | InitializeComponent(); 17 | } 18 | 19 | //Load initial values 20 | public void initializeDialog(string dialogTitle, string saveComment) 21 | { 22 | //Set window title to save name 23 | this.Text = dialogTitle; 24 | commentsTextBox.Text = saveComment; 25 | 26 | //A fix for selected all behaviour 27 | commentsTextBox.Select(commentsTextBox.Text.Length, 0); 28 | } 29 | 30 | private void cancelButton_Click(object sender, EventArgs e) 31 | { 32 | this.Close(); 33 | } 34 | 35 | private void okButton_Click(object sender, EventArgs e) 36 | { 37 | //Return value given by the dialog 38 | saveComment = commentsTextBox.Text; 39 | 40 | okPressed = true; 41 | this.Close(); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /MemcardRex.macOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_16x16.png", 5 | "idiom" : "mac", 6 | "scale" : "1x", 7 | "size" : "16x16" 8 | }, 9 | { 10 | "filename" : "icon_16x16@2x.png", 11 | "idiom" : "mac", 12 | "scale" : "2x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "icon_32x32.png", 17 | "idiom" : "mac", 18 | "scale" : "1x", 19 | "size" : "32x32" 20 | }, 21 | { 22 | "filename" : "icon_32x32@2x.png", 23 | "idiom" : "mac", 24 | "scale" : "2x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "icon_128x128.png", 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "filename" : "icon_128x128@2x.png", 35 | "idiom" : "mac", 36 | "scale" : "2x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "icon_256x256.png", 41 | "idiom" : "mac", 42 | "scale" : "1x", 43 | "size" : "256x256" 44 | }, 45 | { 46 | "filename" : "icon_256x256@2x.png", 47 | "idiom" : "mac", 48 | "scale" : "2x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "icon_512x512.png", 53 | "idiom" : "mac", 54 | "scale" : "1x", 55 | "size" : "512x512" 56 | }, 57 | { 58 | "filename" : "icon_512x512@2x.png", 59 | "idiom" : "mac", 60 | "scale" : "2x", 61 | "size" : "512x512" 62 | } 63 | ], 64 | "info" : { 65 | "author" : "xcode", 66 | "version" : 1 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/HeaderDialogController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("HeaderDialogController")] 13 | partial class HeaderDialogController 14 | { 15 | [Outlet] 16 | AppKit.NSButton CancelButton { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSTextField IdentifierInput { get; set; } 20 | 21 | [Outlet] 22 | AppKit.NSButton OkButton { get; set; } 23 | 24 | [Outlet] 25 | AppKit.NSTextField ProductCodeInput { get; set; } 26 | 27 | [Outlet] 28 | AppKit.NSComboBox RegionCombo { get; set; } 29 | 30 | [Action ("CancelDialog:")] 31 | partial void CancelDialog (Foundation.NSObject sender); 32 | 33 | [Action ("ConfirmDialog:")] 34 | partial void ConfirmDialog (Foundation.NSObject sender); 35 | 36 | void ReleaseDesignerOutlets () 37 | { 38 | if (CancelButton != null) { 39 | CancelButton.Dispose (); 40 | CancelButton = null; 41 | } 42 | 43 | if (IdentifierInput != null) { 44 | IdentifierInput.Dispose (); 45 | IdentifierInput = null; 46 | } 47 | 48 | if (OkButton != null) { 49 | OkButton.Dispose (); 50 | OkButton = null; 51 | } 52 | 53 | if (ProductCodeInput != null) { 54 | ProductCodeInput.Dispose (); 55 | ProductCodeInput = null; 56 | } 57 | 58 | if (RegionCombo != null) { 59 | RegionCombo.Dispose (); 60 | RegionCombo = null; 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "MemcardRex.macOS.debug.x64", 9 | "type": "coreclr", 10 | "request": "launch", 11 | "preLaunchTask": "x64build", 12 | "program": "${workspaceFolder}/MemcardRex.macOS/bin/Debug/net7.0-macos/osx-x64/memcardrex.app/Contents/MacOS/memcardrex", 13 | "args": [], 14 | "cwd": "${workspaceFolder}", 15 | "stopAtEntry": false, 16 | "console": "internalConsole" 17 | }, 18 | { 19 | "name": "MemcardRex.macOS.debug.arm64", 20 | "type": "coreclr", 21 | "request": "launch", 22 | "preLaunchTask": "armbuild", 23 | "program": "${workspaceFolder}/MemcardRex.macOS/bin/Debug/net7.0-macos/osx-arm64/MemcardRex.app/Contents/MacOS/MemcardRex", 24 | "args": [], 25 | "cwd": "${workspaceFolder}", 26 | "stopAtEntry": false, 27 | "console": "internalConsole" 28 | }, 29 | { 30 | "name": "MemcardRex.macOS.publish", 31 | "type": "coreclr", 32 | "request": "launch", 33 | "preLaunchTask": "publish", 34 | "program": "${workspaceFolder}/MemcardRex.macOS/bin/Release/net7.0-macos/MemcardRex.app/Contents/MacOS/MemcardRex", 35 | "args": [], 36 | "cwd": "${workspaceFolder}", 37 | "stopAtEntry": false, 38 | "console": "internalConsole" 39 | } 40 | ], 41 | } -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/WindowController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("WindowController")] 13 | partial class WindowController 14 | { 15 | [Outlet] 16 | AppKit.NSView AccessoryViewGoBar { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSToolbarItem tmpBufferToolbar { get; set; } 20 | 21 | [Action ("editCommentToolbar:")] 22 | partial void editCommentToolbar (Foundation.NSObject sender); 23 | 24 | [Action ("editHeaderToolbar:")] 25 | partial void editHeaderToolbar (Foundation.NSObject sender); 26 | 27 | [Action ("editIconToolbar:")] 28 | partial void editIconToolbar (Foundation.NSObject sender); 29 | 30 | [Action ("exportSaveToolbar:")] 31 | partial void exportSaveToolbar (Foundation.NSObject sender); 32 | 33 | [Action ("importSaveToolbar:")] 34 | partial void importSaveToolbar (Foundation.NSObject sender); 35 | 36 | [Action ("openDocToolbar:")] 37 | partial void openDocToolbar (Foundation.NSObject sender); 38 | 39 | [Action ("saveDocToolbar:")] 40 | partial void saveDocToolbar (Foundation.NSObject sender); 41 | 42 | [Action ("tmpBufferToolbarAction:")] 43 | partial void tmpBufferToolbarAction (Foundation.NSObject sender); 44 | 45 | void ReleaseDesignerOutlets () 46 | { 47 | if (AccessoryViewGoBar != null) { 48 | AccessoryViewGoBar.Dispose (); 49 | AccessoryViewGoBar = null; 50 | } 51 | 52 | if (tmpBufferToolbar != null) { 53 | tmpBufferToolbar.Dispose (); 54 | tmpBufferToolbar = null; 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/InfoDialogController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("InfoDialogController")] 13 | partial class InfoDialogController 14 | { 15 | [Outlet] 16 | AppKit.NSTextField iconFramesLabel { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSImageView iconImage { get; set; } 20 | 21 | [Outlet] 22 | AppKit.NSTextField identifierLabel { get; set; } 23 | 24 | [Outlet] 25 | AppKit.NSTextField productCodeLabel { get; set; } 26 | 27 | [Outlet] 28 | AppKit.NSTextField regionLabel { get; set; } 29 | 30 | [Outlet] 31 | AppKit.NSTextField sizeLabel { get; set; } 32 | 33 | [Outlet] 34 | AppKit.NSTextField slotLabel { get; set; } 35 | 36 | [Outlet] 37 | AppKit.NSTextField titleLabel { get; set; } 38 | 39 | [Action ("CloseDialog:")] 40 | partial void CloseDialog (Foundation.NSObject sender); 41 | 42 | void ReleaseDesignerOutlets () 43 | { 44 | if (titleLabel != null) { 45 | titleLabel.Dispose (); 46 | titleLabel = null; 47 | } 48 | 49 | if (productCodeLabel != null) { 50 | productCodeLabel.Dispose (); 51 | productCodeLabel = null; 52 | } 53 | 54 | if (identifierLabel != null) { 55 | identifierLabel.Dispose (); 56 | identifierLabel = null; 57 | } 58 | 59 | if (regionLabel != null) { 60 | regionLabel.Dispose (); 61 | regionLabel = null; 62 | } 63 | 64 | if (slotLabel != null) { 65 | slotLabel.Dispose (); 66 | slotLabel = null; 67 | } 68 | 69 | if (sizeLabel != null) { 70 | sizeLabel.Dispose (); 71 | sizeLabel = null; 72 | } 73 | 74 | if (iconFramesLabel != null) { 75 | iconFramesLabel.Dispose (); 76 | iconFramesLabel = null; 77 | } 78 | 79 | if (iconImage != null) { 80 | iconImage.Dispose (); 81 | iconImage = null; 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/aboutWindow.cs: -------------------------------------------------------------------------------- 1 | //Generic about window 2 | //Shendo 2009-2024 3 | 4 | using System; 5 | using System.Runtime.Versioning; 6 | using System.Windows.Forms; 7 | 8 | namespace MemcardRex 9 | { 10 | [SupportedOSPlatform("windows")] 11 | public partial class AboutWindow : Form 12 | { 13 | public AboutWindow() 14 | { 15 | InitializeComponent(); 16 | } 17 | 18 | /// 19 | /// Shows the application about dialog 20 | /// 21 | /// Handle of the window which hosts this dialog 22 | /// Name of the host application 23 | /// Version of the host application 24 | /// Date of the compilation 25 | /// The copyright info shown in the bottom area of the dialog 26 | /// Used for additional information such as credits 27 | public void initDialog(mainWindow owner, string applicationName, string applicationVersion, string compileDate, string copyrightInfo, string additionalInfo) 28 | { 29 | //Display program name 30 | appNameLabel.Text = applicationName; 31 | 32 | //Display program version 33 | appVersionLabel.Text = "Version: " + applicationVersion; 34 | 35 | //Display program compile date 36 | compileDateLabel.Text = "Compile date: " + compileDate; 37 | 38 | //Display copyright information 39 | copyrightLabel.Text = copyrightInfo; 40 | 41 | //Display other info 42 | infoLabel.Text = additionalInfo; 43 | 44 | //Resize dialog according to the quantity of text 45 | this.Height = (int)(owner.xScale * 132 + infoLabel.Height); 46 | compileDateLabel.Width = (int)(150 * owner.xScale); 47 | 48 | //Display a dialog 49 | this.ShowDialog(owner); 50 | } 51 | 52 | private void OKbutton_Click(object sender, EventArgs e) 53 | { 54 | //Close the form 55 | this.Close(); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/CommentDialogController.cs: -------------------------------------------------------------------------------- 1 | // This file has been autogenerated from a class added in the UI designer. 2 | 3 | using System; 4 | 5 | using Foundation; 6 | using AppKit; 7 | using System.Drawing; 8 | 9 | namespace MemcardRex 10 | { 11 | public partial class CommentDialogController : NSViewController 12 | { 13 | #region Private Variables 14 | private string _dialogTitle = ""; 15 | private string _comment = ""; 16 | private NSViewController _presentor; 17 | #endregion 18 | 19 | #region Computed Properties 20 | public string DialogTitle 21 | { 22 | get { return _dialogTitle; } 23 | set { _dialogTitle = value; } 24 | } 25 | 26 | public string Comment 27 | { 28 | get { return _comment; } 29 | set { _comment = value; } 30 | } 31 | 32 | public NSViewController Presentor 33 | { 34 | get { return _presentor; } 35 | set { _presentor = value; } 36 | } 37 | #endregion 38 | 39 | public CommentDialogController (IntPtr handle) : base (handle) 40 | { 41 | } 42 | 43 | #region Override Methods 44 | public override void ViewWillAppear() 45 | { 46 | base.ViewWillAppear(); 47 | 48 | this.View.Window.Title = DialogTitle; 49 | 50 | CommentTextInput.StringValue = Comment; 51 | 52 | //Disable resizing of modal dialog 53 | this.View.Window.StyleMask &= ~NSWindowStyle.Resizable; 54 | } 55 | #endregion 56 | 57 | #region Events 58 | public EventHandler DialogAccepted; 59 | 60 | internal void RaiseDialogAccepted() 61 | { 62 | if (this.DialogAccepted != null) 63 | this.DialogAccepted(this, EventArgs.Empty); 64 | } 65 | #endregion 66 | 67 | [Export("ConfirmDialog:")] 68 | void AcceptDialog(NSObject sender) 69 | { 70 | //Save changes 71 | Comment = CommentTextInput.StringValue; 72 | 73 | RaiseDialogAccepted(); 74 | Presentor.DismissViewController(this); 75 | } 76 | 77 | [Export("CancelDialog:")] 78 | void CancelDialoga(NSObject sender) 79 | { 80 | Presentor.DismissViewController(this); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/headerWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Versioning; 3 | using System.Windows.Forms; 4 | 5 | namespace MemcardRex 6 | { 7 | [SupportedOSPlatform("windows")] 8 | public partial class headerWindow : Form 9 | { 10 | //If OK is pressed this value will be true 11 | public bool okPressed = false; 12 | 13 | //Name of the host application 14 | string appName = null; 15 | 16 | //Save header data 17 | public string prodCode = null; 18 | public string saveIdentifier = null; 19 | public string saveRegion = null; 20 | 21 | public headerWindow() 22 | { 23 | InitializeComponent(); 24 | } 25 | 26 | private void headerWindow_Load(object sender, EventArgs e) 27 | { 28 | 29 | } 30 | 31 | //Initialize dialog by loading provided values 32 | public void initializeDialog(string applicationName, string dialogTitle, string prodCode, string identifier, string region) 33 | { 34 | appName = applicationName; 35 | this.Text = dialogTitle; 36 | prodCodeTextbox.Text = prodCode; 37 | identifierTextbox.Text = identifier; 38 | regionCombobox.Text = region; 39 | 40 | //A fix for selected all behaviour 41 | prodCodeTextbox.Select(prodCodeTextbox.Text.Length, 0); 42 | identifierTextbox.Select(identifierTextbox.Text.Length, 0); 43 | } 44 | 45 | private void cancelButton_Click(object sender, EventArgs e) 46 | { 47 | this.Close(); 48 | } 49 | 50 | private void okButton_Click(object sender, EventArgs e) 51 | { 52 | //Check if values are valid to be submitted 53 | if (prodCodeTextbox.Text.Length < 10 && identifierTextbox.Text.Length != 0) 54 | { 55 | //String is not valid 56 | MessageBox.Show("Product code must be exactly 10 characters long.", appName, MessageBoxButtons.OK, MessageBoxIcon.Warning); 57 | } 58 | else 59 | { 60 | //String is valid 61 | prodCode = prodCodeTextbox.Text; 62 | saveIdentifier = identifierTextbox.Text; 63 | saveRegion = regionCombobox.Text; 64 | 65 | //OK is pressed 66 | okPressed = true; 67 | this.Close(); 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/compareWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Versioning; 3 | using System.Windows.Forms; 4 | 5 | namespace MemcardRex 6 | { 7 | [SupportedOSPlatform("windows")] 8 | public partial class compareWindow : Form 9 | { 10 | 11 | public compareWindow() 12 | { 13 | InitializeComponent(); 14 | } 15 | 16 | //Show compare dialog 17 | public void initializeDialog(mainWindow hostWindow, string appName, byte[] save1Data, string save1Title, byte[] save2Data, string save2Title) 18 | { 19 | //Set window title 20 | this.Text = "Compare saves"; 21 | 22 | compareListView.Columns[0].Width = (int)(compareListView.Columns[0].Width * hostWindow.xScale); 23 | compareListView.Columns[1].Width = (int)(compareListView.Columns[1].Width * hostWindow.xScale); 24 | compareListView.Columns[2].Width = (int)(compareListView.Columns[2].Width * hostWindow.xScale); 25 | 26 | //Set save titles 27 | save1Label.Text = "Save 1: " + save1Title; 28 | save2Label.Text = "Save 2: " + save2Title; 29 | 30 | //Compare saves 31 | for (int i = 0; i < save1Data.Length; i++) 32 | { 33 | //Check if the bytes are different 34 | if (save1Data[i] != save2Data[i]) 35 | { 36 | compareListView.Items.Add("0x" + i.ToString("X4") + " (" + i.ToString() + ")"); 37 | compareListView.Items[compareListView.Items.Count - 1].SubItems.Add("0x" + save1Data[i].ToString("X2") + " (" + save1Data[i].ToString() + ")"); 38 | compareListView.Items[compareListView.Items.Count - 1].SubItems.Add("0x" + save2Data[i].ToString("X2") + " (" + save2Data[i].ToString() + ")"); 39 | } 40 | } 41 | 42 | //Check if the list contains any items 43 | if (compareListView.Items.Count < 1) 44 | { 45 | MessageBox.Show("Compared saves are identical.", appName, MessageBoxButtons.OK, MessageBoxIcon.Information); 46 | return; 47 | } 48 | 49 | 50 | this.ShowDialog(hostWindow); 51 | 52 | } 53 | 54 | private void compareWindow_Load(object sender, EventArgs e) 55 | { 56 | 57 | } 58 | 59 | private void okButton_Click(object sender, EventArgs e) 60 | { 61 | this.Close(); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/PreferencesViewController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("PreferencesViewController")] 13 | partial class PreferencesViewController 14 | { 15 | [Outlet] 16 | AppKit.NSTextField addressInput { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSButton backupCheckbox { get; set; } 20 | 21 | [Outlet] 22 | AppKit.NSPopUpButton cardPopup { get; set; } 23 | 24 | [Outlet] 25 | AppKit.NSButton fixCheckbox { get; set; } 26 | 27 | [Outlet] 28 | AppKit.NSPopUpButton formatPopup { get; set; } 29 | 30 | [Outlet] 31 | AppKit.NSPopUpButton iconPopup { get; set; } 32 | 33 | [Outlet] 34 | AppKit.NSTextField portInput { get; set; } 35 | 36 | [Outlet] 37 | AppKit.NSPopUpButton portPopup { get; set; } 38 | 39 | [Outlet] 40 | AppKit.NSButton restoreCheckbox { get; set; } 41 | 42 | [Outlet] 43 | AppKit.NSPopUpButton speedPopup { get; set; } 44 | 45 | [Action ("cancelDialog:")] 46 | partial void cancelDialog (Foundation.NSObject sender); 47 | 48 | [Action ("confirmDialog:")] 49 | partial void confirmDialog (Foundation.NSObject sender); 50 | 51 | void ReleaseDesignerOutlets () 52 | { 53 | if (portPopup != null) { 54 | portPopup.Dispose (); 55 | portPopup = null; 56 | } 57 | 58 | if (speedPopup != null) { 59 | speedPopup.Dispose (); 60 | speedPopup = null; 61 | } 62 | 63 | if (addressInput != null) { 64 | addressInput.Dispose (); 65 | addressInput = null; 66 | } 67 | 68 | if (portInput != null) { 69 | portInput.Dispose (); 70 | portInput = null; 71 | } 72 | 73 | if (formatPopup != null) { 74 | formatPopup.Dispose (); 75 | formatPopup = null; 76 | } 77 | 78 | if (cardPopup != null) { 79 | cardPopup.Dispose (); 80 | cardPopup = null; 81 | } 82 | 83 | if (iconPopup != null) { 84 | iconPopup.Dispose (); 85 | iconPopup = null; 86 | } 87 | 88 | if (backupCheckbox != null) { 89 | backupCheckbox.Dispose (); 90 | backupCheckbox = null; 91 | } 92 | 93 | if (restoreCheckbox != null) { 94 | restoreCheckbox.Dispose (); 95 | restoreCheckbox = null; 96 | } 97 | 98 | if (fixCheckbox != null) { 99 | fixCheckbox.Dispose (); 100 | fixCheckbox = null; 101 | } 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/WindowController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Foundation; 3 | using AppKit; 4 | 5 | namespace MemcardRex 6 | { 7 | public partial class WindowController : NSWindowController 8 | { 9 | #region Application Access 10 | /// 11 | /// A helper shortcut to the app delegate. 12 | /// 13 | /// The app. 14 | public static AppDelegate App 15 | { 16 | get { return (AppDelegate)NSApplication.SharedApplication.Delegate; } 17 | } 18 | #endregion 19 | 20 | #region Constructor 21 | public WindowController(IntPtr handle) : base(handle) 22 | { 23 | 24 | } 25 | #endregion 26 | 27 | #region Override Methods 28 | public override void WindowDidLoad() 29 | { 30 | base.WindowDidLoad(); 31 | 32 | Window.TabbingIdentifier = "Main"; 33 | 34 | //Disable Temp buffer toolbar button if temp buffer is empty 35 | if(App.TempBuffer == null) tmpBufferToolbar.Enabled = false; 36 | } 37 | 38 | public void SetPasteFromBufferToolbar(NSImage icon, bool itemState) 39 | { 40 | if (icon != null) tmpBufferToolbar.Image = icon; 41 | tmpBufferToolbar.Enabled = itemState; 42 | } 43 | 44 | public override void GetNewWindowForTab(NSObject sender) 45 | { 46 | // Ask app to open a new document window 47 | App.NewDocument(this); 48 | } 49 | 50 | [Export("tmpBufferToolbarAction:")] 51 | void TmpBufferToolbarAction(NSObject sender) 52 | { 53 | var window = NSApplication.SharedApplication.KeyWindow.ContentViewController as ViewController; 54 | window.PasteFromTempBuffer(sender); 55 | } 56 | 57 | [Export("editHeaderToolbar:")] 58 | void EditHeaderToolbar(NSObject sender) 59 | { 60 | var window = NSApplication.SharedApplication.KeyWindow.ContentViewController as ViewController; 61 | window.EditHeader(sender); 62 | } 63 | 64 | [Export("editCommentToolbar:")] 65 | void EditCommentToolbar(NSObject sender) 66 | { 67 | var window = NSApplication.SharedApplication.KeyWindow.ContentViewController as ViewController; 68 | window.EditSaveComment(sender); 69 | } 70 | 71 | [Export("openDocToolbar:")] 72 | void OpenDocToolbar(NSObject sender) 73 | { 74 | App.OpenDialog(sender); 75 | } 76 | 77 | [Export("saveDocToolbar:")] 78 | void SaveDocToolbar(NSObject sender) 79 | { 80 | var window = NSApplication.SharedApplication.KeyWindow.ContentViewController as ViewController; 81 | window.SaveDialog(sender); 82 | } 83 | 84 | #endregion 85 | } 86 | } 87 | 88 | -------------------------------------------------------------------------------- /MONO.md: -------------------------------------------------------------------------------- 1 | # How to build and/or run MemcardRex on Linux 2 | 3 | The project is working well with Mono. 4 | 5 | If you just want to run MemcardRex, follow Step 1 of [Install Build tools and Dependencies](#install-build-tools-and-dependencies) below, and then download MemcardRex from [releases](https://github.com/ShendoXT/memcardrex/releases). Then, follow [Run MemcardRex](#run-memcardrex) and you're running! 6 | > Note: This last step has to be done every time you want to run MemcardRex. If you want to make this easier, make a `.sh` or `.desktop` file. 7 | 8 | ### Clone the project 9 | In a directory of your choice, download MemcardRex: 10 | 11 | ``git clone https://github.com/ShendoXT/memcardrex.git`` 12 | 13 | ### Install Build tools and Dependencies 14 | 15 | 1. Install mono from either the [official site](http://www.mono-project.com/download/), or your distribution's package manager. The package included on some Linux distributions may not work properly. 16 | 2. Install nuget from your package manager. If you installed Mono following the website instructions, your package manager will now install the official version of nuget. 17 | 3. Update nuget: ``sudo nuget update -self`` 18 | 4. Edit nuget's configuration file in `~/.config/NuGet/NuGet.Config` 19 | 20 | Either use the configuration below, or make your own with [Microsoft's documentation](https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior). 21 | ``` 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | ``` 45 | 46 | 5. `cd` to wherever you downloaded MemcardRex to. 47 | 6. Run `nuget restore -NoCache` to download project dependencies. 48 | 49 | ### Build MemcardRex 50 | 51 | In the folder where the git project is located, run `msbuild` in your terminal. 52 | If that didn't work (probably because your distro's version of mono is misconfigured) try: ``xbuild /property:TargetFrameworkVersion=v4.0`` 53 | 54 | If the build is successful, the executable will be in `memcardrex/MemcardRex/bin/Debug/` 55 | 56 | ### Run MemcardRex 57 | 58 | Navigate to where the executable is located (see last step) in terminal and run `mono MemcardRex.exe` 59 | 60 | If you are trying to use a DexDrive connected by serial port or USB serial, you may have to run mono as root: `sudo mono MemcardRex.exe` 61 | > If you don't want to run MemcardRex with `sudo`, try adding your user to the `dialout` user group with `sudo usermod -a -G dialout $USER` as detailed in this StackExchange post: [Unix StackExchange](https://unix.stackexchange.com/questions/14354/read-write-to-a-serial-port-without-root) 62 | 63 | -------------------------------------------------------------------------------- /MemcardRex.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio Version 17 3 | VisualStudioVersion = 17.11.35222.181 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MemcardRex", "MemcardRex.Windows\MemcardRex.csproj", "{39B94E8A-7BD1-4072-8A60-D90464326B18}" 6 | EndProject 7 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MemcardRex.Core", "MemcardRex.Core\MemcardRex.Core.csproj", "{5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}" 8 | EndProject 9 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MemcardRex.macOS", "MemcardRex.macOS\MemcardRex.macOS.csproj", "{6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}" 10 | EndProject 11 | Global 12 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 13 | Debug|Any CPU = Debug|Any CPU 14 | Debug|x64 = Debug|x64 15 | Release|Any CPU = Release|Any CPU 16 | Release|x64 = Release|x64 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Debug|x64.ActiveCfg = Debug|x64 22 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Debug|x64.Build.0 = Debug|x64 23 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Release|Any CPU.ActiveCfg = Release|Any CPU 24 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Release|Any CPU.Build.0 = Release|Any CPU 25 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Release|x64.ActiveCfg = Release|x64 26 | {39B94E8A-7BD1-4072-8A60-D90464326B18}.Release|x64.Build.0 = Release|x64 27 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 28 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Debug|Any CPU.Build.0 = Debug|Any CPU 29 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Debug|x64.ActiveCfg = Debug|Any CPU 30 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Debug|x64.Build.0 = Debug|Any CPU 31 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Release|Any CPU.ActiveCfg = Release|Any CPU 32 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Release|Any CPU.Build.0 = Release|Any CPU 33 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Release|x64.ActiveCfg = Release|Any CPU 34 | {5567EB5B-5E1F-4C7E-B174-214C57BFAEAD}.Release|x64.Build.0 = Release|Any CPU 35 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 36 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Debug|Any CPU.Build.0 = Debug|Any CPU 37 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Debug|x64.ActiveCfg = Debug|Any CPU 38 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Debug|x64.Build.0 = Debug|Any CPU 39 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Release|Any CPU.ActiveCfg = Release|Any CPU 40 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Release|Any CPU.Build.0 = Release|Any CPU 41 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Release|x64.ActiveCfg = Release|Any CPU 42 | {6EE5516B-12A6-4B9D-9750-BACCE0AAB60F}.Release|x64.Build.0 = Release|Any CPU 43 | EndGlobalSection 44 | GlobalSection(SolutionProperties) = preSolution 45 | HideSolutionNode = FALSE 46 | EndGlobalSection 47 | GlobalSection(ExtensibilityGlobals) = postSolution 48 | SolutionGuid = {EAAD5AA5-E759-4F8A-B6CF-F6687EB273B2} 49 | EndGlobalSection 50 | EndGlobal 51 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/HeaderDialogController.cs: -------------------------------------------------------------------------------- 1 | // This file has been autogenerated from a class added in the UI designer. 2 | 3 | using System; 4 | 5 | using Foundation; 6 | using AppKit; 7 | 8 | namespace MemcardRex 9 | { 10 | public partial class HeaderDialogController : NSViewController 11 | { 12 | #region Private Variables 13 | private string _dialogTitle = ""; 14 | private string _productCode = ""; 15 | private string _identifier = ""; 16 | private string _region = ""; 17 | private NSViewController _presentor; 18 | #endregion 19 | 20 | #region Computed Properties 21 | public string DialogTitle 22 | { 23 | get { return _dialogTitle; } 24 | set { _dialogTitle = value; } 25 | } 26 | 27 | public string ProductCode 28 | { 29 | get { return _productCode; } 30 | set { _productCode = value; } 31 | } 32 | 33 | public string IdentifierString 34 | { 35 | get { return _identifier; } 36 | set { _identifier = value; } 37 | } 38 | 39 | public string Region 40 | { 41 | get { return _region; } 42 | set { _region = value; } 43 | } 44 | 45 | public NSViewController Presentor 46 | { 47 | get { return _presentor; } 48 | set { _presentor = value; } 49 | } 50 | #endregion 51 | 52 | public HeaderDialogController (IntPtr handle) : base (handle) 53 | { 54 | } 55 | 56 | #region Override Methods 57 | public override void ViewWillAppear() 58 | { 59 | base.ViewWillAppear(); 60 | 61 | this.View.Window.Title = DialogTitle; 62 | 63 | IdentifierInput.StringValue = IdentifierString; 64 | ProductCodeInput.StringValue = ProductCode; 65 | RegionCombo.StringValue = Region; 66 | 67 | //Disable resizing of modal dialog 68 | this.View.Window.StyleMask &= ~NSWindowStyle.Resizable; 69 | } 70 | #endregion 71 | 72 | #region Events 73 | public EventHandler DialogAccepted; 74 | 75 | internal void RaiseDialogAccepted() 76 | { 77 | if (this.DialogAccepted != null) 78 | this.DialogAccepted(this, EventArgs.Empty); 79 | } 80 | 81 | public EventHandler DialogCanceled; 82 | 83 | internal void RaiseDialogCanceled() 84 | { 85 | if (this.DialogCanceled != null) 86 | this.DialogCanceled(this, EventArgs.Empty); 87 | } 88 | #endregion 89 | 90 | [Export("CancelDialog:")] 91 | void CancelDialoga(NSObject sender) 92 | { 93 | RaiseDialogCanceled(); 94 | Presentor.DismissViewController(this); 95 | } 96 | 97 | [Export("ConfirmDialog:")] 98 | void AcceptDialog(NSObject sender) 99 | { 100 | //Save changes 101 | IdentifierString = IdentifierInput.StringValue; 102 | ProductCode = ProductCodeInput.StringValue; 103 | Region = RegionCombo.StringValue; 104 | 105 | RaiseDialogAccepted(); 106 | Presentor.DismissViewController(this); 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/pluginsWindow.cs: -------------------------------------------------------------------------------- 1 | //Plugin information dialog 2 | //Shendo 2010 - 2024 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Runtime.Versioning; 7 | using System.Windows.Forms; 8 | 9 | namespace MemcardRex 10 | { 11 | [SupportedOSPlatform("windows")] 12 | public partial class pluginsWindow : Form 13 | { 14 | //Form that hosted this dialog 15 | mainWindow hostFrm = null; 16 | 17 | //Descriptive data for each loaded plugin 18 | List loadedMetadata = new List(); 19 | 20 | //Currently selected plugin 21 | int pluginIndex = 0; 22 | 23 | public pluginsWindow() 24 | { 25 | InitializeComponent(); 26 | } 27 | 28 | //Load default values 29 | public void initializeDialog(mainWindow hostForm, List plgMetadata) 30 | { 31 | hostFrm = hostForm; 32 | loadedMetadata = plgMetadata; 33 | pluginListView.Columns[0].Width = (int)(pluginListView.Columns[0].Width * hostFrm.xScale); 34 | pluginListView.Columns[1].Width = (int)(pluginListView.Columns[1].Width * hostFrm.xScale); 35 | pluginListView.Columns[2].Width = (int)(pluginListView.Columns[2].Width * hostFrm.xScale); 36 | 37 | //Apply the native theme to the listview 38 | //glassSupport.SetWindowTheme(pluginListView.Handle, "Explorer", null); 39 | 40 | //Check if list contains any members 41 | if (loadedMetadata.Count > 0) 42 | { 43 | //Populate list with plugins 44 | for (int i = 0; i < loadedMetadata.Count; i++) 45 | { 46 | pluginListView.Items.Add(loadedMetadata[i].pluginName); 47 | pluginListView.Items[i].SubItems.Add(loadedMetadata[i].pluginAuthor); 48 | pluginListView.Items[i].SubItems.Add(loadedMetadata[i].pluginSupportedGames); 49 | 50 | //Select first item in the list 51 | pluginListView.Items[0].Selected = true; 52 | } 53 | } 54 | } 55 | 56 | //Close this dialog 57 | private void OKbutton_Click(object sender, EventArgs e) 58 | { 59 | this.Close(); 60 | } 61 | 62 | //Show about info 63 | private void aboutButton_Click(object sender, EventArgs e) 64 | { 65 | //Check if there are any loaded plugins 66 | if (loadedMetadata.Count > 0) 67 | { 68 | //Show plugin about dialog 69 | hostFrm.pluginSystem.showAboutDialog(pluginIndex); 70 | } 71 | } 72 | 73 | private void configButton_Click(object sender, EventArgs e) 74 | { 75 | //Check if there are any loaded plugins 76 | if (loadedMetadata.Count > 0) 77 | { 78 | //Show plugin config dialog 79 | hostFrm.pluginSystem.showConfigDialog(pluginIndex); 80 | } 81 | } 82 | 83 | private void pluginListView_SelectedIndexChanged(object sender, EventArgs e) 84 | { 85 | //Check if there are any items selected 86 | if (pluginListView.SelectedIndices.Count == 0) return; 87 | 88 | //Update currenty selected plugin 89 | pluginIndex = pluginListView.SelectedIndices[0]; 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /MemcardRex.Windows/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | true 58 | true 59 | 60 | 61 | 62 | 63 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/PreferencesViewController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Foundation; 4 | using AppKit; 5 | using System.IO.Ports; 6 | 7 | 8 | namespace MemcardRex 9 | { 10 | public partial class PreferencesViewController : NSViewController 11 | { 12 | public static AppDelegate App 13 | { 14 | get { return (AppDelegate)NSApplication.SharedApplication.Delegate; } 15 | } 16 | 17 | public PreferencesViewController (IntPtr handle) : base (handle) 18 | { 19 | } 20 | 21 | public override void ViewWillAppear() 22 | { 23 | base.ViewWillAppear(); 24 | 25 | this.View.Window.Title = "Preferences"; 26 | 27 | //Disable resizing and closing of modal dialog 28 | this.View.Window.StyleMask &= ~NSWindowStyle.Resizable; 29 | this.View.Window.StyleMask &= ~NSWindowStyle.Closable; 30 | 31 | //Load all valid COM ports found on the system 32 | foreach (string port in SerialPort.GetPortNames()) 33 | { 34 | if (port.Contains("/dev/tty.")) portPopup.AddItem(port); 35 | } 36 | 37 | //Read program settings 38 | iconPopup.SelectItem(iconPopup.ItemAtIndex(App.appSettings.IconBackgroundColor)); 39 | formatPopup.SelectItem(formatPopup.ItemAtIndex(App.appSettings.FormatType)); 40 | //speedPopup.SelectItem(speedPopup.ItemAtIndex(App.appSettings.CommunicationSpeed)); 41 | cardPopup.SelectItem(cardPopup.ItemAtIndex(App.appSettings.CardSlot)); 42 | 43 | addressInput.StringValue = App.appSettings.RemoteCommAddress; 44 | portInput.IntValue = App.appSettings.RemoteCommPort; 45 | 46 | backupCheckbox.IntValue = App.appSettings.BackupMemcards; 47 | restoreCheckbox.IntValue = App.appSettings.RestoreWindowPosition; 48 | fixCheckbox.IntValue = App.appSettings.FixCorruptedCards; 49 | 50 | NSMenuItem comItem = portPopup.ItemWithTitle(App.appSettings.CommunicationPort); 51 | 52 | if(portPopup.ItemCount > 0) 53 | { 54 | if (comItem != null) portPopup.SelectItem(comItem); 55 | } 56 | else 57 | { 58 | portPopup.Enabled = false; 59 | } 60 | } 61 | 62 | [Export("confirmDialog:")] 63 | void ConfirmDialog(NSObject sender) 64 | { 65 | //Save program settings 66 | App.appSettings.IconBackgroundColor = (int) iconPopup.IndexOfSelectedItem; 67 | App.appSettings.FormatType = (int) formatPopup.IndexOfSelectedItem; 68 | //App.appSettings.CommunicationSpeed = (int)speedPopup.IndexOfSelectedItem; 69 | App.appSettings.CardSlot = (int)cardPopup.IndexOfSelectedItem; 70 | 71 | if (addressInput.StringValue != "") 72 | App.appSettings.RemoteCommAddress = addressInput.StringValue; 73 | else 74 | App.appSettings.RemoteCommAddress = "192.168.1.4"; 75 | 76 | App.appSettings.RemoteCommPort = portInput.IntValue; 77 | 78 | App.appSettings.BackupMemcards = backupCheckbox.IntValue; 79 | App.appSettings.RestoreWindowPosition = restoreCheckbox.IntValue; 80 | App.appSettings.FixCorruptedCards = fixCheckbox.IntValue; 81 | 82 | //Save com port if there are any 83 | if (portPopup.ItemCount > 0) App.appSettings.CommunicationPort = portPopup.TitleOfSelectedItem; 84 | 85 | this.View.Window.Close(); 86 | } 87 | 88 | [Export("cancelDialog:")] 89 | void CancelDialog(NSObject sender) 90 | { 91 | this.View.Window.Close(); 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /MemcardRex.Core/Support/xmlSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | //XML Writer/Reader class for MemcardRex 2 | //Shendo 2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using System.Xml; 8 | 9 | namespace MemcardRex.Core 10 | { 11 | public class xmlSettingsEditor 12 | { 13 | //Writer and reader declarations 14 | XmlTextWriter xmlWriter = null; 15 | XmlTextReader xmlReader = null; 16 | 17 | //List of all the XML elements and values 18 | List xmlElements = new List(); 19 | List xmlValues = new List(); 20 | 21 | //In order to read an XML file this function needs to be called 22 | public void openXmlReader(string fileName) 23 | { 24 | xmlReader = new XmlTextReader(fileName); 25 | 26 | //Read every node in the XML file 27 | while (xmlReader.Read()) 28 | { 29 | switch (xmlReader.NodeType) 30 | { 31 | case XmlNodeType.Element: 32 | xmlElements.Add(xmlReader.Name); 33 | break; 34 | 35 | case XmlNodeType.Text: 36 | xmlValues.Add(xmlReader.Value); 37 | break; 38 | } 39 | } 40 | 41 | //Cleanly close the file 42 | xmlReader.Close(); 43 | } 44 | 45 | //Read a key and a value from the XML file 46 | public string readXmlEntry(string key) 47 | { 48 | string returnString = null; 49 | 50 | //Check if the key element exists 51 | if (xmlElements.Contains(key)) 52 | { 53 | returnString = xmlValues[xmlElements.IndexOf(key) - 1]; 54 | } 55 | 56 | return returnString; 57 | } 58 | 59 | //Read a key and an int value from the XML file 60 | public int readXmlEntryInt(string key, int minValue, int maxValue) 61 | { 62 | int returnInt = 0; 63 | string returnString = null; 64 | 65 | //Check if the key element exists 66 | if (xmlElements.Contains(key)) 67 | { 68 | returnString = xmlValues[xmlElements.IndexOf(key) - 1]; 69 | } 70 | 71 | if (int.TryParse(returnString, out returnInt)) 72 | { 73 | //Check if the value is lower then the minimum given value 74 | if (returnInt < minValue) returnInt = minValue; 75 | 76 | //Check if the value exceeds the maximum given value 77 | if (returnInt > maxValue) returnInt = maxValue; 78 | } 79 | 80 | return returnInt; 81 | } 82 | 83 | //In order to write to XML file this function needs to be called 84 | public void openXmlWriter(string fileName, string applicationComment) 85 | { 86 | xmlWriter = new XmlTextWriter(fileName, Encoding.UTF8); 87 | 88 | xmlWriter.WriteStartDocument(); 89 | xmlWriter.WriteComment(applicationComment); 90 | xmlWriter.WriteStartElement("Settings"); 91 | } 92 | 93 | //Write a value in the associated key 94 | public void writeXmlEntry(string key, string value) 95 | { 96 | xmlWriter.WriteStartElement(key); 97 | xmlWriter.WriteString(value); 98 | xmlWriter.WriteEndElement(); 99 | } 100 | 101 | //When program is done writing to XML file clean close is needed 102 | public void closeXmlWriter() 103 | { 104 | xmlWriter.WriteEndElement(); 105 | xmlWriter.WriteEndDocument(); 106 | xmlWriter.Close(); 107 | } 108 | } 109 | } -------------------------------------------------------------------------------- /MemcardRex.Windows/MemcardRex.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0-windows 4 | windows 5 | WinExe 6 | true 7 | win-x64 8 | false 9 | MemcardRex.Program 10 | Resources\memcardrex.ico 11 | publish\ 12 | true 13 | Disk 14 | false 15 | Foreground 16 | 7 17 | Days 18 | false 19 | false 20 | true 21 | 0 22 | 1.0.0.%2a 23 | false 24 | true 25 | true 26 | true 27 | true 28 | 29 | 30 | 31 | 32 | 33 | app.manifest 34 | 35 | 36 | bin\x64\Debug\ 37 | default 38 | 39 | 40 | bin\x64\Release\ 41 | default 42 | 43 | 44 | 45 | Component 46 | 47 | 48 | 49 | 50 | False 51 | .NET Framework 3.5 SP1 Client Profile 52 | false 53 | 54 | 55 | False 56 | .NET Framework 2.0 %28x86%29 57 | false 58 | 59 | 60 | False 61 | .NET Framework 3.0 %28x86%29 62 | false 63 | 64 | 65 | False 66 | .NET Framework 3.5 67 | true 68 | 69 | 70 | False 71 | .NET Framework 3.5 SP1 72 | false 73 | 74 | 75 | False 76 | Windows Installer 3.1 77 | true 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/InfoDialogController.cs: -------------------------------------------------------------------------------- 1 | // This file has been autogenerated from a class added in the UI designer. 2 | 3 | using System; 4 | using System.Drawing; 5 | using Foundation; 6 | using AppKit; 7 | using MemcardRex.Core; 8 | 9 | namespace MemcardRex 10 | { 11 | public partial class InfoDialogController : NSViewController 12 | { 13 | #region Private Variables 14 | private string _dialogTitle = ""; 15 | private string _saveTitle = ""; 16 | private string _productCode = ""; 17 | private string _identifier = ""; 18 | private string _region = ""; 19 | private int _frames = 0; 20 | private int _size = 0; 21 | private int[] _slots = new int[1]; 22 | private Color[,][] _icons; 23 | private NSViewController _presentor; 24 | #endregion 25 | 26 | #region Computed Properties 27 | public string DialogTitle 28 | { 29 | get { return _dialogTitle; } 30 | set { _dialogTitle = value; } 31 | } 32 | 33 | public string SaveTitle 34 | { 35 | get { return _saveTitle; } 36 | set { _saveTitle = value; } 37 | } 38 | 39 | public string ProductCode 40 | { 41 | get { return _productCode; } 42 | set { _productCode = value; } 43 | } 44 | 45 | public string IdentifierString 46 | { 47 | get { return _identifier; } 48 | set { _identifier = value; } 49 | } 50 | 51 | public string Region 52 | { 53 | get { return _region; } 54 | set { _region = value; } 55 | } 56 | 57 | public int Size 58 | { 59 | get { return _size; } 60 | set { _size = value; } 61 | } 62 | 63 | public int Frames 64 | { 65 | get { return _frames; } 66 | set { _frames = value; } 67 | } 68 | 69 | public int[] Slots 70 | { 71 | get { return _slots; } 72 | set { _slots = value; } 73 | } 74 | 75 | public Color[,][] Icons 76 | { 77 | get { return _icons; } 78 | set { _icons = value; } 79 | } 80 | 81 | public NSViewController Presentor 82 | { 83 | get { return _presentor; } 84 | set { _presentor = value; } 85 | } 86 | #endregion 87 | 88 | public InfoDialogController (IntPtr handle) : base (handle) 89 | { 90 | } 91 | 92 | #region Override Methods 93 | public override void ViewWillAppear() 94 | { 95 | string ocupiedSlots = ""; 96 | 97 | base.ViewWillAppear(); 98 | 99 | this.View.Window.Title = DialogTitle; 100 | 101 | titleLabel.StringValue = SaveTitle; 102 | identifierLabel.StringValue = IdentifierString; 103 | productCodeLabel.StringValue = ProductCode; 104 | regionLabel.StringValue = Region; 105 | sizeLabel.StringValue = Size.ToString() + " KB"; 106 | iconFramesLabel.StringValue = Frames.ToString(); 107 | 108 | for (int i = 0; i < Slots.Length; i++) 109 | ocupiedSlots += (Slots[i] + 1).ToString() + ", "; 110 | 111 | //Show ocupied slots 112 | slotLabel.StringValue = ocupiedSlots.Remove(ocupiedSlots.Length - 2); 113 | 114 | //Prepare icons 115 | BmpBuilder bmpImage = new BmpBuilder(); 116 | 117 | NSData imageData = NSData.FromArray(bmpImage.BuildBmp(Icons[Slots[0],0])); 118 | NSImage image = new NSImage(imageData); 119 | var newImage = new NSImage(new CoreGraphics.CGSize(48, 48)); 120 | var targetRect = new CoreGraphics.CGRect(0, 0, 48, 48); 121 | 122 | image.Flipped = true; 123 | 124 | newImage.LockFocus(); 125 | image.Draw(targetRect, CoreGraphics.CGRect.Empty, NSCompositingOperation.Copy, 1.0f); 126 | newImage.UnlockFocus(); 127 | 128 | iconImage.Image = newImage; 129 | 130 | //Disable resizing of modal dialog 131 | this.View.Window.StyleMask &= ~NSWindowStyle.Resizable; 132 | } 133 | #endregion 134 | 135 | [Export("CloseDialog:")] 136 | void CloseDialoga(NSObject sender) 137 | { 138 | Presentor.DismissViewController(this); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/cardReaderWindow.designer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | 4 | namespace MemcardRex 5 | { 6 | partial class cardReaderWindow 7 | { 8 | /// 9 | /// Required designer variable. 10 | /// 11 | private System.ComponentModel.IContainer components = null; 12 | 13 | /// 14 | /// Clean up any resources being used. 15 | /// 16 | /// true if managed resources should be disposed; otherwise, false. 17 | protected override void Dispose(bool disposing) 18 | { 19 | if (disposing && (components != null)) 20 | { 21 | components.Dispose(); 22 | } 23 | base.Dispose(disposing); 24 | } 25 | 26 | #region Windows Form Designer generated code 27 | 28 | /// 29 | /// Required method for Designer support - do not modify 30 | /// the contents of this method with the code editor. 31 | /// 32 | private void InitializeComponent() 33 | { 34 | this.abortButton = new System.Windows.Forms.Button(); 35 | this.progressBar = new System.Windows.Forms.ProgressBar(); 36 | this.deviceLabel = new System.Windows.Forms.Label(); 37 | this.spacerLabel = new System.Windows.Forms.Label(); 38 | this.SuspendLayout(); 39 | // 40 | // abortButton 41 | // 42 | this.abortButton.Location = new System.Drawing.Point(228, 52); 43 | this.abortButton.Name = "abortButton"; 44 | this.abortButton.Size = new System.Drawing.Size(76, 24); 45 | this.abortButton.TabIndex = 0; 46 | this.abortButton.Text = "Abort"; 47 | this.abortButton.UseVisualStyleBackColor = true; 48 | this.abortButton.Click += new System.EventHandler(this.OKbutton_Click); 49 | // 50 | // progressBar 51 | // 52 | this.progressBar.Location = new System.Drawing.Point(4, 24); 53 | this.progressBar.Maximum = 1024; 54 | this.progressBar.Name = "progressBar"; 55 | this.progressBar.Size = new System.Drawing.Size(300, 16); 56 | this.progressBar.TabIndex = 5; 57 | // 58 | // deviceLabel 59 | // 60 | this.deviceLabel.AutoSize = true; 61 | this.deviceLabel.Location = new System.Drawing.Point(4, 5); 62 | this.deviceLabel.Name = "deviceLabel"; 63 | this.deviceLabel.Size = new System.Drawing.Size(106, 13); 64 | this.deviceLabel.TabIndex = 6; 65 | this.deviceLabel.Text = "infoLabelPlaceholder"; 66 | this.deviceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 67 | // 68 | // spacerLabel 69 | // 70 | this.spacerLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 71 | this.spacerLabel.Location = new System.Drawing.Point(4, 46); 72 | this.spacerLabel.Name = "spacerLabel"; 73 | this.spacerLabel.Size = new System.Drawing.Size(300, 2); 74 | this.spacerLabel.TabIndex = 9; 75 | // 76 | // cardReaderWindow 77 | // 78 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 79 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 80 | this.ClientSize = new System.Drawing.Size(308, 81); 81 | this.Controls.Add(this.spacerLabel); 82 | this.Controls.Add(this.deviceLabel); 83 | this.Controls.Add(this.progressBar); 84 | this.Controls.Add(this.abortButton); 85 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 86 | this.MaximizeBox = false; 87 | this.MinimizeBox = false; 88 | this.Name = "cardReaderWindow"; 89 | this.ShowInTaskbar = false; 90 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 91 | this.Text = "cardReaderWindow"; 92 | this.Load += new System.EventHandler(this.cardReaderWindow_Load); 93 | this.ResumeLayout(false); 94 | this.PerformLayout(); 95 | 96 | } 97 | #endregion 98 | 99 | private System.Windows.Forms.Button abortButton; 100 | private System.Windows.Forms.ProgressBar progressBar; 101 | private System.Windows.Forms.Label deviceLabel; 102 | private System.Windows.Forms.Label spacerLabel; 103 | } 104 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MemcardRex 2 | ### Advanced PlayStation 1 Memory Card editor 3 | ![memcardrex](https://github.com/user-attachments/assets/82553694-5cd2-49e8-b900-524dc32ccade) 4 | 5 |
**Features:** 6 | * Tabbed interface - multiple Memory Cards can be opened at the same time. 7 | * Ability to copy, delete, restore, export, import and edit saves. 8 | * Plugin support for 3rd party save editors. 9 | * Hardware interfaces for communication with real Memory Cards. 10 | * PocketStation support (read serial, dump BIOS, push PC time) 11 | 12 |
**Requirements:** 13 | * .NET 8. 14 | 15 |
**Supported Memory Card formats:** 16 | * ePSXe/PSEmu Pro Memory Card(*.mcr) 17 | * DexDrive Memory Card(*.gme) 18 | * pSX/AdriPSX Memory Card(*.bin) 19 | * Bleem! Memory Card(*.mcd) 20 | * VGS Memory Card(*.mem, *.vgs) 21 | * PSXGame Edit Memory Card(*.mc) 22 | * DataDeck Memory Card(*.ddf) 23 | * WinPSM Memory Card(*.ps) 24 | * Smart Link Memory Card(*.psm) 25 | * MCExplorer(*.mci) 26 | * PCSX ReARMed/RetroArch(*.srm) 27 | * PSP virtual Memory Card(*.VMP) 28 | * PS3 virtual Memory Card(*.VM1) 29 | * PS Vita "MCX" PocketStation Memory Card(*.BIN) 30 | * POPStarter Virtual Memory Card(*.VMC) 31 | 32 |
**Supported single save formats:** 33 | * PSXGame Edit single save(*.mcs) 34 | * XP, AR, GS, Caetla single save(*.psx) 35 | * Memory Juggler(*.ps1) 36 | * Smart Link(*.mcb) 37 | * Datel(*.mcx,*.pda) 38 | * RAW single saves 39 | * PS3 virtual saves (*.psv) 40 | 41 | ### Hardware interfaces 42 | MemcardRex supports communication with the real Memory Cards via external devices. 43 |
Make sure to select a proper COM port in Options->Preferences. 44 | 45 |
46 | 1. DexDrive 47 | Original way of transferring data from MemoryCard to PC and vice versa albeit a little quirky. 48 |
If you encounter problems, unplug power from DexDrive, unplug it from COM port and connect it all again. 49 | 50 | It is recommended that a power cord is connected to DexDrive, otherwise some cards won't be detected. 51 |
Works with native COM port or USB based adapters. 52 |
53 | 54 | 55 |
56 | 2. MemCARDuino 57 | MemCARDuino is an open source Memory Card communication software for various Arduino boards. 58 | https://github.com/ShendoXT/memcarduino 59 |
60 | 61 | 62 |
63 | 3. PS1CardLink 64 | PS1CardLink is a software for the actual PlayStation and PSOne consoles. 65 |
It requires an official or home made TTL serial cable for communication with PC. 66 | 67 | With it your console becomes a Memory Card reader similar to the DexDrive and MemCARDuino. 68 | 69 | MemcardRex can also talk to the serial port remotely by using a Serial Port Bridge like [esp-link](https://github.com/jeelabs/esp-link). 70 |
It conveniently fits into a PSOne which has otherwise no external hardware ports. 71 |
https://github.com/ShendoXT/ps1cardlink 72 |
73 | 74 | 75 |
76 | 4. Unirom 77 | Unirom is a shell for the PlayStation and PSOne consoles. 78 |
It requires an official or home made TTL serial cable for communication with PC. 79 |
https://unirom.github.io. 80 |
81 | 82 | 83 |
84 | 5. PS3 Memory Card Adaptor 85 | The PS3 Memory Card Adaptor is an official Sony USB adapter that allows reading and writing PS1 Memory Cards on a PlayStation 3. 86 |
To use it on a Windows PC, a custom USB driver needs to be installed. 87 | 88 | This USB driver can be easily created and installed using [Zadig](https://zadig.akeo.ie) by following these steps: 89 | * Plug the PS3 Memory Card Adaptor into a free USB port and start Zadig. 90 | * Zadig should display the PS3 MCA as an "Unknown Device". Verify that the USB ID matches: 054C 02EA 91 | * Click the Edit checkbox and name the device "PS3 Memory Card Adaptor" 92 | * Ensure that "WinUSB" is selected from the list of Driver options and click the Install Driver button. 93 | - If you need LibUSB driver support place "libusb-1.0.dll" inside MemcardRex's directory (2.0 RC1 and up only). 94 | * After about 30 seconds Zadig should show a message that the driver was installed successfully. 95 | 96 | With the USB driver installed and the PS3 Memory Card Adaptor plugged in, you should now be able to read, write and format PS1 Memory Cards. 97 |
98 | 99 | 100 | ### Credits 101 | **Authors:** 102 |
Alvaro Tanarro, bitrot-alpha, lmiori92, Nico de Poel, KuromeSan, Robxnano, Shendo. 103 | 104 | **Beta testers:** 105 |
Gamesoul Master, Xtreme2damax, Carmax91 and NKO. 106 | 107 | **Thanks to:** 108 |
@ruantec, Cobalt, TheCloudOfSmoke, RedawgTS, Hard core Rikki, RainMotorsports, Zieg, Bobbi, OuTman, Kevstah2004, Kubusleonidas, Frédéric Brière, Mark James, Cor'e, DeadlySystem, Padraig Flood and Martin Korth (nocash). 109 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/preferencesWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using System.IO.Ports; 4 | using System.Collections.Generic; 5 | using System.Runtime.Versioning; 6 | 7 | namespace MemcardRex 8 | { 9 | [SupportedOSPlatform("windows")] 10 | public partial class preferencesWindow : Form 11 | { 12 | //Window that hosted this dialog 13 | mainWindow hostWindow; 14 | 15 | //Saved Hardware COM port (in case it's a removable USB adapter) 16 | string SavedComPort = null; 17 | 18 | public preferencesWindow() 19 | { 20 | InitializeComponent(); 21 | } 22 | 23 | //Load default values 24 | public void initializeDialog(mainWindow window, List registeredInterfaces) 25 | { 26 | hostWindow = window; 27 | 28 | backgroundCombo.SelectedIndex = hostWindow.appSettings.IconBackgroundColor; 29 | formatCombo.SelectedIndex = hostWindow.appSettings.FormatType; 30 | SavedComPort = hostWindow.appSettings.CommunicationPort; 31 | if (hostWindow.appSettings.ShowListGrid == 1) gridCheckbox.Checked = true; else gridCheckbox.Checked = false; 32 | if (hostWindow.appSettings.BackupMemcards == 1) backupCheckbox.Checked = true; else backupCheckbox.Checked = false; 33 | if (hostWindow.appSettings.RestoreWindowPosition == 1) restorePositionCheckbox.Checked = true; else restorePositionCheckbox.Checked = false; 34 | if (hostWindow.appSettings.FixCorruptedCards == 1) fixCorruptedCardsCheckbox.Checked = true; else fixCorruptedCardsCheckbox.Checked = false; 35 | if (hostWindow.appSettings.WarningMessages == 1) warningCheckBox.Checked = true; else warningCheckBox.Checked = false; 36 | remoteAddressBox.Text = hostWindow.appSettings.RemoteCommAddress; 37 | remotePortUpDown.Value = hostWindow.appSettings.RemoteCommPort; 38 | cardSlotCombo.SelectedIndex = hostWindow.appSettings.CardSlot; 39 | 40 | //Load all COM ports found on the system 41 | foreach (string port in SerialPort.GetPortNames()) 42 | { 43 | dexDriveCombo.Items.Add(port); 44 | } 45 | 46 | //Load all available hardware interfaces 47 | foreach(mainWindow.HardInterfaces iface in registeredInterfaces) 48 | { 49 | hardwareInterfacesCombo.Items.Add(iface.displayName); 50 | } 51 | 52 | hardwareInterfacesCombo.SelectedIndex = hostWindow.appSettings.ActiveInterface; 53 | 54 | //If there are no ports disable combobox 55 | if(dexDriveCombo.Items.Count < 1) dexDriveCombo.Enabled = false; 56 | 57 | //Select a com port (if it exists) 58 | dexDriveCombo.SelectedItem = hostWindow.appSettings.CommunicationPort; 59 | 60 | this.ShowDialog(hostWindow); 61 | } 62 | 63 | //Apply configured settings 64 | private void applySettings() 65 | { 66 | hostWindow.appSettings.IconBackgroundColor = backgroundCombo.SelectedIndex; 67 | hostWindow.appSettings.FormatType = formatCombo.SelectedIndex; 68 | hostWindow.appSettings.CommunicationPort = SavedComPort; 69 | hostWindow.appSettings.RemoteCommAddress = remoteAddressBox.Text; 70 | hostWindow.appSettings.RemoteCommPort = Convert.ToUInt16(remotePortUpDown.Value); 71 | hostWindow.appSettings.ActiveInterface = hardwareInterfacesCombo.SelectedIndex; 72 | hostWindow.appSettings.CardSlot = cardSlotCombo.SelectedIndex; 73 | 74 | if (gridCheckbox.Checked) hostWindow.appSettings.ShowListGrid = 1; else hostWindow.appSettings.ShowListGrid = 0; 75 | if (backupCheckbox.Checked) hostWindow.appSettings.BackupMemcards = 1; else hostWindow.appSettings.BackupMemcards = 0; 76 | if (warningCheckBox.Checked) hostWindow.appSettings.WarningMessages = 1; else hostWindow.appSettings.WarningMessages = 0; 77 | if (restorePositionCheckbox.Checked) hostWindow.appSettings.RestoreWindowPosition = 1; else hostWindow.appSettings.RestoreWindowPosition = 0; 78 | if (fixCorruptedCardsCheckbox.Checked) hostWindow.appSettings.FixCorruptedCards = 1; else hostWindow.appSettings.FixCorruptedCards = 0; 79 | 80 | //hostWindow.appSettings.SaveSettings(hostWindow.appPath, hostWindow.appName, hostWindow.appVersion); 81 | } 82 | 83 | private void cancelButton_Click(object sender, EventArgs e) 84 | { 85 | this.Close(); 86 | } 87 | 88 | private void okButton_Click(object sender, EventArgs e) 89 | { 90 | applySettings(); 91 | this.Close(); 92 | } 93 | 94 | private void dexDriveCombo_SelectedIndexChanged(object sender, EventArgs e) 95 | { 96 | //Save the COM port if the user selected a new one 97 | SavedComPort = dexDriveCombo.Text; 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/GUI/ViewController.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | [Register ("ViewController")] 13 | partial class ViewController 14 | { 15 | [Outlet] 16 | AppKit.NSClipView CardList { get; set; } 17 | 18 | [Outlet] 19 | AppKit.NSTableView CardTable { get; set; } 20 | 21 | [Outlet] 22 | AppKit.NSTextField ClickedLabel { get; set; } 23 | 24 | [Outlet] 25 | AppKit.NSMenuItem compareSaveItem { get; set; } 26 | 27 | [Outlet] 28 | AppKit.NSMenuItem cpyTempBufferItem { get; set; } 29 | 30 | [Outlet] 31 | AppKit.NSMenuItem deleteSaveItem { get; set; } 32 | 33 | [Outlet] 34 | AppKit.NSMenuItem editIconItem { get; set; } 35 | 36 | [Outlet] 37 | AppKit.NSMenuItem editSaveCommentItem { get; set; } 38 | 39 | [Outlet] 40 | AppKit.NSMenuItem editSaveHeaderItem { get; set; } 41 | 42 | [Outlet] 43 | AppKit.NSMenuItem exportSaveItem { get; set; } 44 | 45 | [Outlet] 46 | AppKit.NSMenuItem exportSaveRawItem { get; set; } 47 | 48 | [Outlet] 49 | AppKit.NSMenuItem getInfoItem { get; set; } 50 | 51 | [Outlet] 52 | AppKit.NSTableColumn IdentifierColumn { get; set; } 53 | 54 | [Outlet] 55 | AppKit.NSMenuItem importSaveItem { get; set; } 56 | 57 | [Outlet] 58 | AppKit.NSMenuItem pasteTempBufferItem { get; set; } 59 | 60 | [Outlet] 61 | AppKit.NSTableColumn ProductColumn { get; set; } 62 | 63 | [Outlet] 64 | AppKit.NSMenuItem removeSaveItem { get; set; } 65 | 66 | [Outlet] 67 | AppKit.NSMenuItem restoreSaveItem { get; set; } 68 | 69 | [Outlet] 70 | AppKit.NSTableColumn TitleColumn { get; set; } 71 | 72 | [Action ("compareTempBuffer:")] 73 | partial void compareTempBuffer (Foundation.NSObject sender); 74 | 75 | [Action ("copyToTempBuffer:")] 76 | partial void copyToTempBuffer (Foundation.NSObject sender); 77 | 78 | [Action ("deleteSave:")] 79 | partial void deleteSave (Foundation.NSObject sender); 80 | 81 | [Action ("editIcon:")] 82 | partial void editIcon (Foundation.NSObject sender); 83 | 84 | [Action ("editSaveComment:")] 85 | partial void editSaveComment (Foundation.NSObject sender); 86 | 87 | [Action ("exporrtSaveRaw:")] 88 | partial void exporrtSaveRaw (Foundation.NSObject sender); 89 | 90 | [Action ("exportSave:")] 91 | partial void exportSave (Foundation.NSObject sender); 92 | 93 | [Action ("getInfo:")] 94 | partial void getInfo (Foundation.NSObject sender); 95 | 96 | [Action ("importSave:")] 97 | partial void importSave (Foundation.NSObject sender); 98 | 99 | [Action ("pasteFromTempBuffer:")] 100 | partial void pasteFromTempBuffer (Foundation.NSObject sender); 101 | 102 | [Action ("removeSave:")] 103 | partial void removeSave (Foundation.NSObject sender); 104 | 105 | [Action ("restoreSave:")] 106 | partial void restoreSave (Foundation.NSObject sender); 107 | 108 | void ReleaseDesignerOutlets () 109 | { 110 | if (CardList != null) { 111 | CardList.Dispose (); 112 | CardList = null; 113 | } 114 | 115 | if (CardTable != null) { 116 | CardTable.Dispose (); 117 | CardTable = null; 118 | } 119 | 120 | if (ClickedLabel != null) { 121 | ClickedLabel.Dispose (); 122 | ClickedLabel = null; 123 | } 124 | 125 | if (compareSaveItem != null) { 126 | compareSaveItem.Dispose (); 127 | compareSaveItem = null; 128 | } 129 | 130 | if (cpyTempBufferItem != null) { 131 | cpyTempBufferItem.Dispose (); 132 | cpyTempBufferItem = null; 133 | } 134 | 135 | if (deleteSaveItem != null) { 136 | deleteSaveItem.Dispose (); 137 | deleteSaveItem = null; 138 | } 139 | 140 | if (editIconItem != null) { 141 | editIconItem.Dispose (); 142 | editIconItem = null; 143 | } 144 | 145 | if (editSaveCommentItem != null) { 146 | editSaveCommentItem.Dispose (); 147 | editSaveCommentItem = null; 148 | } 149 | 150 | if (editSaveHeaderItem != null) { 151 | editSaveHeaderItem.Dispose (); 152 | editSaveHeaderItem = null; 153 | } 154 | 155 | if (exportSaveItem != null) { 156 | exportSaveItem.Dispose (); 157 | exportSaveItem = null; 158 | } 159 | 160 | if (exportSaveRawItem != null) { 161 | exportSaveRawItem.Dispose (); 162 | exportSaveRawItem = null; 163 | } 164 | 165 | if (getInfoItem != null) { 166 | getInfoItem.Dispose (); 167 | getInfoItem = null; 168 | } 169 | 170 | if (IdentifierColumn != null) { 171 | IdentifierColumn.Dispose (); 172 | IdentifierColumn = null; 173 | } 174 | 175 | if (importSaveItem != null) { 176 | importSaveItem.Dispose (); 177 | importSaveItem = null; 178 | } 179 | 180 | if (pasteTempBufferItem != null) { 181 | pasteTempBufferItem.Dispose (); 182 | pasteTempBufferItem = null; 183 | } 184 | 185 | if (ProductColumn != null) { 186 | ProductColumn.Dispose (); 187 | ProductColumn = null; 188 | } 189 | 190 | if (removeSaveItem != null) { 191 | removeSaveItem.Dispose (); 192 | removeSaveItem = null; 193 | } 194 | 195 | if (restoreSaveItem != null) { 196 | restoreSaveItem.Dispose (); 197 | restoreSaveItem = null; 198 | } 199 | 200 | if (TitleColumn != null) { 201 | TitleColumn.Dispose (); 202 | TitleColumn = null; 203 | } 204 | } 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/pocketStationInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.Drawing; 5 | using System.IO; 6 | using System.Runtime.Versioning; 7 | using System.Windows.Forms; 8 | 9 | namespace MemcardRex.Windows.GUI 10 | { 11 | [SupportedOSPlatform("windows")] 12 | public partial class pocketStationInfo : Form 13 | { 14 | private const string dialogName = "PocketStation info"; 15 | private byte[] biosData; 16 | 17 | struct KnownReleases 18 | { 19 | public string _comment; 20 | public UInt32 _checksum; 21 | 22 | public KnownReleases(string comment, UInt32 checksum) 23 | { 24 | _comment = comment; 25 | _checksum = checksum; 26 | } 27 | } 28 | 29 | //Crete array of known releases 30 | static readonly IList releaseArray = new ReadOnlyCollection 31 | (new[] { 32 | new KnownReleases ("1st release", 0x27E94C07), 33 | new KnownReleases ("2nd release", 0xB16CE96C), 34 | new KnownReleases ("DTL-H4000", 0x1BABAF29) 35 | }); 36 | 37 | public pocketStationInfo() 38 | { 39 | InitializeComponent(); 40 | } 41 | 42 | private UInt32 calcChecksum() 43 | { 44 | UInt32 checkum = 0; 45 | 46 | for(int i = 0; i < biosData.Length; i+=4) 47 | checkum += (UInt32)(biosData[i] | biosData[i + 1] << 8 | biosData[i + 2] << 16 | biosData[i + 3] << 24); 48 | 49 | return checkum; 50 | } 51 | 52 | private void displaySerial(UInt32 serial) 53 | { 54 | //Get ascii character 55 | serialTextbox.Text = ((char)(serial >> 24)).ToString(); 56 | 57 | //Get rest of the serial in BCD form 58 | serialTextbox.Text += ((serial & 0xFFFFFF)).ToString("D8"); 59 | } 60 | 61 | private void displayRemark(UInt32 checksum) 62 | { 63 | remarkTextbox.Text = ""; 64 | 65 | foreach(KnownReleases kRel in releaseArray) 66 | { 67 | if(checksum == kRel._checksum) 68 | { 69 | remarkTextbox.Text = kRel._comment; 70 | } 71 | } 72 | 73 | if (remarkTextbox.Text == "") remarkTextbox.Text = "Unknown / bad dump"; 74 | } 75 | 76 | public void ShowSerial(UInt32 serial) 77 | { 78 | displaySerial(serial); 79 | 80 | this.Height = (int) (104 * CreateGraphics().DpiX / 96.0); 81 | this.Text = dialogName; 82 | this.ShowDialog(); 83 | } 84 | 85 | //Show everything about the dumped BIOS 86 | public void ShowBios(UInt32 serial, byte[] bData) 87 | { 88 | biosData = bData; 89 | UInt32 checksum; 90 | 91 | //Enable BIOS specific controls 92 | versionLabel.Visible = true; 93 | versionTextbox.Visible = true; 94 | 95 | dateLabel.Visible = true; 96 | dateTextbox.Visible = true; 97 | 98 | checksumLabel.Visible = true; 99 | checksumTextbox.Visible = true; 100 | 101 | remarkLabel.Visible = true; 102 | remarkTextbox.Visible = true; 103 | 104 | saveButton.Visible = true; 105 | 106 | //Display date 107 | dateTextbox.Text = bData[0x17].ToString("X") + bData[0x16].ToString("X") 108 | + "/" + bData[0x15].ToString("X") + "/" + bData[0x14].ToString("X"); 109 | 110 | //Display version 111 | versionTextbox.Text = ""; 112 | 113 | //Kernel version 114 | for(int i = 0; i < 4; i++) 115 | versionTextbox.Text += ((char)bData[0x1DFC + i]).ToString(); 116 | 117 | versionTextbox.Text += ", "; 118 | 119 | //GUI version 120 | for (int i = 0; i < 4; i++) 121 | versionTextbox.Text += ((char)bData[0x3FFC + i]).ToString(); 122 | 123 | //Display checksum 124 | checksum = calcChecksum(); 125 | checksumTextbox.Text = checksum.ToString("X8"); 126 | 127 | displayRemark(checksum); 128 | 129 | displaySerial(serial); 130 | this.Text = dialogName; 131 | this.ShowDialog(); 132 | } 133 | 134 | private void okButton_Click(object sender, EventArgs e) 135 | { 136 | this.Close(); 137 | } 138 | 139 | //Save BIOS to a file 140 | private void saveButton_Click(object sender, EventArgs e) 141 | { 142 | SaveFileDialog saveFileDlg = new SaveFileDialog 143 | { 144 | Title = "Save PocketStation BIOS", 145 | Filter = "Binary image|bin.*", 146 | FileName = "BIOS.bin" 147 | }; 148 | 149 | if(saveFileDlg.ShowDialog() != DialogResult.OK) return; 150 | 151 | try 152 | { 153 | BinaryWriter binWriter = new BinaryWriter(File.Open(saveFileDlg.FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)); 154 | 155 | binWriter.Write(biosData); 156 | binWriter.Close(); 157 | } 158 | catch(Exception ex) 159 | { 160 | Console.WriteLine(ex.Message); 161 | } 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/commentsWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace MemcardRex 2 | { 3 | partial class commentsWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | commentsTextBox = new System.Windows.Forms.TextBox(); 32 | warningLabel = new System.Windows.Forms.Label(); 33 | cancelButton = new System.Windows.Forms.Button(); 34 | okButton = new System.Windows.Forms.Button(); 35 | spacerLabel = new System.Windows.Forms.Label(); 36 | SuspendLayout(); 37 | // 38 | // commentsTextBox 39 | // 40 | commentsTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; 41 | commentsTextBox.Location = new System.Drawing.Point(4, 4); 42 | commentsTextBox.MaxLength = 255; 43 | commentsTextBox.Multiline = true; 44 | commentsTextBox.Name = "commentsTextBox"; 45 | commentsTextBox.Size = new System.Drawing.Size(301, 100); 46 | commentsTextBox.TabIndex = 0; 47 | // 48 | // warningLabel 49 | // 50 | warningLabel.AutoSize = true; 51 | warningLabel.Location = new System.Drawing.Point(4, 108); 52 | warningLabel.Name = "warningLabel"; 53 | warningLabel.Size = new System.Drawing.Size(299, 15); 54 | warningLabel.TabIndex = 10; 55 | warningLabel.Text = "Comments are only supported by DexDrive (.gme) files."; 56 | // 57 | // cancelButton 58 | // 59 | cancelButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; 60 | cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.System; 61 | cancelButton.Location = new System.Drawing.Point(229, 134); 62 | cancelButton.Name = "cancelButton"; 63 | cancelButton.Size = new System.Drawing.Size(76, 23); 64 | cancelButton.TabIndex = 2; 65 | cancelButton.Text = "Cancel"; 66 | cancelButton.UseVisualStyleBackColor = true; 67 | cancelButton.Click += cancelButton_Click; 68 | // 69 | // okButton 70 | // 71 | okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; 72 | okButton.FlatStyle = System.Windows.Forms.FlatStyle.System; 73 | okButton.Location = new System.Drawing.Point(149, 134); 74 | okButton.Name = "okButton"; 75 | okButton.Size = new System.Drawing.Size(76, 23); 76 | okButton.TabIndex = 1; 77 | okButton.Text = "OK"; 78 | okButton.UseVisualStyleBackColor = true; 79 | okButton.Click += okButton_Click; 80 | // 81 | // spacerLabel 82 | // 83 | spacerLabel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; 84 | spacerLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 85 | spacerLabel.Location = new System.Drawing.Point(4, 128); 86 | spacerLabel.Name = "spacerLabel"; 87 | spacerLabel.Size = new System.Drawing.Size(301, 2); 88 | spacerLabel.TabIndex = 11; 89 | // 90 | // commentsWindow 91 | // 92 | AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 93 | AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 94 | ClientSize = new System.Drawing.Size(309, 161); 95 | Controls.Add(spacerLabel); 96 | Controls.Add(cancelButton); 97 | Controls.Add(okButton); 98 | Controls.Add(warningLabel); 99 | Controls.Add(commentsTextBox); 100 | FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 101 | MaximizeBox = false; 102 | MinimizeBox = false; 103 | Name = "commentsWindow"; 104 | ShowInTaskbar = false; 105 | StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 106 | Text = "commentsWindow"; 107 | ResumeLayout(false); 108 | PerformLayout(); 109 | } 110 | 111 | #endregion 112 | 113 | private System.Windows.Forms.TextBox commentsTextBox; 114 | private System.Windows.Forms.Label warningLabel; 115 | private System.Windows.Forms.Button cancelButton; 116 | private System.Windows.Forms.Button okButton; 117 | private System.Windows.Forms.Label spacerLabel; 118 | } 119 | } -------------------------------------------------------------------------------- /MemcardRex.macOS/macOS/AppDelegate.designer.cs: -------------------------------------------------------------------------------- 1 | // WARNING 2 | // 3 | // This file has been generated automatically by Visual Studio to store outlets and 4 | // actions made in the UI designer. If it is removed, they will be lost. 5 | // Manual changes to this file may not be handled correctly. 6 | // 7 | using Foundation; 8 | using System.CodeDom.Compiler; 9 | 10 | namespace MemcardRex 11 | { 12 | partial class AppDelegate 13 | { 14 | [Outlet] 15 | AppKit.NSMenuItem compareBufferMItem { get; set; } 16 | 17 | [Outlet] 18 | AppKit.NSMenuItem cpySaveTempBufferMItem { get; set; } 19 | 20 | [Outlet] 21 | AppKit.NSMenuItem deleteSaveMItem { get; set; } 22 | 23 | [Outlet] 24 | AppKit.NSMenuItem editIconMItem { get; set; } 25 | 26 | [Outlet] 27 | AppKit.NSMenuItem editSaveCommentMItem { get; set; } 28 | 29 | [Outlet] 30 | AppKit.NSMenuItem editSaveHeaderMItem { get; set; } 31 | 32 | [Outlet] 33 | AppKit.NSMenuItem exportSaveMItem { get; set; } 34 | 35 | [Outlet] 36 | AppKit.NSMenuItem exportSaveRawMItem { get; set; } 37 | 38 | [Outlet] 39 | AppKit.NSMenu hardFormatMenu { get; set; } 40 | 41 | [Outlet] 42 | AppKit.NSMenu hardReadMenu { get; set; } 43 | 44 | [Outlet] 45 | AppKit.NSMenu hardWriteMenu { get; set; } 46 | 47 | [Outlet] 48 | AppKit.NSMenuItem importSaveMItem { get; set; } 49 | 50 | [Outlet] 51 | AppKit.NSMenuItem pasteSaveTempBufferMItem { get; set; } 52 | 53 | [Outlet] 54 | AppKit.NSMenuItem redoMItem { get; set; } 55 | 56 | [Outlet] 57 | AppKit.NSMenuItem removeSaveMItem { get; set; } 58 | 59 | [Outlet] 60 | AppKit.NSMenuItem restoreSaveMItem { get; set; } 61 | 62 | [Outlet] 63 | AppKit.NSMenuItem undoMItem { get; set; } 64 | 65 | [Action ("cardlinkRead:")] 66 | partial void cardlinkRead (Foundation.NSObject sender); 67 | 68 | [Action ("cardlinkReadTcp:")] 69 | partial void cardlinkReadTcp (Foundation.NSObject sender); 70 | 71 | [Action ("compareTempBuffer:")] 72 | partial void compareTempBuffer (Foundation.NSObject sender); 73 | 74 | [Action ("copyToTempBuffer:")] 75 | partial void copyToTempBuffer (Foundation.NSObject sender); 76 | 77 | [Action ("deleteSave:")] 78 | partial void deleteSave (Foundation.NSObject sender); 79 | 80 | [Action ("dexdriveRead:")] 81 | partial void dexdriveRead (Foundation.NSObject sender); 82 | 83 | [Action ("dexDriveRead:")] 84 | partial void dexDriveRead (Foundation.NSObject sender); 85 | 86 | [Action ("editIcon:")] 87 | partial void editIcon (Foundation.NSObject sender); 88 | 89 | [Action ("editSaveComment:")] 90 | partial void editSaveComment (Foundation.NSObject sender); 91 | 92 | [Action ("exportSave:")] 93 | partial void exportSave (Foundation.NSObject sender); 94 | 95 | [Action ("exportSaveRaw:")] 96 | partial void exportSaveRaw (Foundation.NSObject sender); 97 | 98 | [Action ("importSave:")] 99 | partial void importSave (Foundation.NSObject sender); 100 | 101 | [Action ("memcarduinoRead:")] 102 | partial void memcarduinoRead (Foundation.NSObject sender); 103 | 104 | [Action ("pasteFromTempBuffer:")] 105 | partial void pasteFromTempBuffer (Foundation.NSObject sender); 106 | 107 | [Action ("redoOperation:")] 108 | partial void redoOperation (Foundation.NSObject sender); 109 | 110 | [Action ("removeSave:")] 111 | partial void removeSave (Foundation.NSObject sender); 112 | 113 | [Action ("restoreSave:")] 114 | partial void restoreSave (Foundation.NSObject sender); 115 | 116 | [Action ("undoOperation:")] 117 | partial void undoOperation (Foundation.NSObject sender); 118 | 119 | [Action ("uniromRead:")] 120 | partial void uniromRead (Foundation.NSObject sender); 121 | 122 | [Action ("uniromReadTcp:")] 123 | partial void uniromReadTcp (Foundation.NSObject sender); 124 | 125 | void ReleaseDesignerOutlets () 126 | { 127 | if (compareBufferMItem != null) { 128 | compareBufferMItem.Dispose (); 129 | compareBufferMItem = null; 130 | } 131 | 132 | if (cpySaveTempBufferMItem != null) { 133 | cpySaveTempBufferMItem.Dispose (); 134 | cpySaveTempBufferMItem = null; 135 | } 136 | 137 | if (deleteSaveMItem != null) { 138 | deleteSaveMItem.Dispose (); 139 | deleteSaveMItem = null; 140 | } 141 | 142 | if (editIconMItem != null) { 143 | editIconMItem.Dispose (); 144 | editIconMItem = null; 145 | } 146 | 147 | if (editSaveCommentMItem != null) { 148 | editSaveCommentMItem.Dispose (); 149 | editSaveCommentMItem = null; 150 | } 151 | 152 | if (editSaveHeaderMItem != null) { 153 | editSaveHeaderMItem.Dispose (); 154 | editSaveHeaderMItem = null; 155 | } 156 | 157 | if (exportSaveMItem != null) { 158 | exportSaveMItem.Dispose (); 159 | exportSaveMItem = null; 160 | } 161 | 162 | if (exportSaveRawMItem != null) { 163 | exportSaveRawMItem.Dispose (); 164 | exportSaveRawMItem = null; 165 | } 166 | 167 | if (hardFormatMenu != null) { 168 | hardFormatMenu.Dispose (); 169 | hardFormatMenu = null; 170 | } 171 | 172 | if (hardReadMenu != null) { 173 | hardReadMenu.Dispose (); 174 | hardReadMenu = null; 175 | } 176 | 177 | if (hardWriteMenu != null) { 178 | hardWriteMenu.Dispose (); 179 | hardWriteMenu = null; 180 | } 181 | 182 | if (importSaveMItem != null) { 183 | importSaveMItem.Dispose (); 184 | importSaveMItem = null; 185 | } 186 | 187 | if (pasteSaveTempBufferMItem != null) { 188 | pasteSaveTempBufferMItem.Dispose (); 189 | pasteSaveTempBufferMItem = null; 190 | } 191 | 192 | if (redoMItem != null) { 193 | redoMItem.Dispose (); 194 | redoMItem = null; 195 | } 196 | 197 | if (removeSaveMItem != null) { 198 | removeSaveMItem.Dispose (); 199 | removeSaveMItem = null; 200 | } 201 | 202 | if (restoreSaveMItem != null) { 203 | restoreSaveMItem.Dispose (); 204 | restoreSaveMItem = null; 205 | } 206 | 207 | if (undoMItem != null) { 208 | undoMItem.Dispose (); 209 | undoMItem = null; 210 | } 211 | } 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /MemcardRex.Core/Hardware/HardwareInterface.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace MemcardRex.Core 4 | { 5 | public class HardwareInterface 6 | { 7 | private Types _type; 8 | private Modes _mode; 9 | private CommModes _commMode; 10 | private int _cardSlot; 11 | private int _frameCount = 1024; //Default number of frames on a standard Memory Card 12 | private UInt32 _lastChecksum; 13 | private bool _storedInRam; 14 | private const string pocketstationError = "PocketStation commands are not supported by this interface"; 15 | 16 | /// 17 | /// All supported interface types 18 | /// 19 | public enum Types : int 20 | { 21 | dexdrive, 22 | memcarduino, 23 | ps1cardlink, 24 | unirom, 25 | ps3mca 26 | }; 27 | 28 | /// 29 | /// Supported operation modes 30 | /// 31 | public enum Modes : int 32 | { 33 | serial, 34 | tcp 35 | }; 36 | 37 | /// 38 | /// Supported communication modes 39 | /// 40 | public enum CommModes : int 41 | { 42 | read, 43 | write, 44 | format, 45 | realtime, 46 | psinfo, 47 | psbios, 48 | pstime 49 | } 50 | 51 | /// 52 | /// Features supported by the 53 | /// 54 | public enum SupportedFeatures : int 55 | { 56 | TcpMode = 1, //Interface supports TCP protocol 57 | RealtimeMode = 1 << 1, //Fast reading of directories, updating in realtime 58 | PocketStation = 1 << 2 //Interface supports custom pocketstation commands 59 | } 60 | 61 | public Modes Mode 62 | { 63 | get { return _mode; } 64 | set { _mode = value; } 65 | } 66 | 67 | public CommModes CommMode 68 | { 69 | get { return _commMode; } 70 | set { _commMode = value; } 71 | } 72 | 73 | public int CardSlot 74 | { 75 | get { return _cardSlot; } 76 | set { _cardSlot = value; } 77 | } 78 | 79 | public int FrameCount 80 | { 81 | get { return _frameCount; } 82 | set { _frameCount = value; } 83 | } 84 | 85 | public UInt32 LastChecksum 86 | { 87 | get { return _lastChecksum; } 88 | set { _lastChecksum = value; } 89 | } 90 | 91 | public Types Type 92 | { 93 | get { return _type; } 94 | set { _type = value; } 95 | } 96 | 97 | public bool StoredInRam 98 | { 99 | get { return _storedInRam; } 100 | set { _storedInRam = value; } 101 | } 102 | 103 | public HardwareInterface() 104 | { 105 | //Set default values 106 | _mode = Modes.serial; 107 | _commMode = CommModes.read; 108 | } 109 | 110 | public UInt32 CalculateChecksum(byte[] inBytes) 111 | { 112 | UInt32 returnVal = 0; 113 | for (int i = 0; i < inBytes.Length; i++) 114 | { 115 | returnVal += (UInt32)inBytes[i]; 116 | } 117 | return returnVal; 118 | } 119 | 120 | /// 121 | /// Init hardware interface 122 | /// 123 | /// Serial or TCP port 124 | /// Link speed 125 | /// Returns error message or null on success 126 | public virtual string Start(string port, int speed) 127 | { 128 | return "This interface is yet not supported"; 129 | } 130 | 131 | /// 132 | /// Cleanly stop the interface 133 | /// 134 | public virtual void Stop() 135 | { 136 | 137 | } 138 | 139 | /// 140 | /// Return name of a device 141 | /// 142 | /// 143 | public virtual string Name() 144 | { 145 | return "Dummy interface"; 146 | } 147 | 148 | /// 149 | /// Return firmware version of a device 150 | /// 151 | /// 152 | public virtual string Firmware() 153 | { 154 | return ""; 155 | } 156 | 157 | /// 158 | /// Return all supported features of this interface 159 | /// 160 | /// 161 | public virtual SupportedFeatures Features() 162 | { 163 | return 0; 164 | } 165 | 166 | /// 167 | /// Read a single 128 byte frame from a device 168 | /// 169 | /// Frame to read 170 | /// 171 | public virtual byte[] ReadMemoryCardFrame(ushort FrameNumber) 172 | { 173 | return null; 174 | } 175 | 176 | /// 177 | /// Write a single 128 byte frame to a device 178 | /// 179 | /// Frame to write 180 | /// Data to write 181 | /// Returns success of the operation 182 | public virtual bool WriteMemoryCardFrame(ushort FrameNumber, byte[] FrameData) 183 | { 184 | return false; 185 | } 186 | 187 | /// 188 | /// Read serial from PocketStation 189 | /// 190 | /// Descriptive error message 191 | /// Serial as BCD 192 | public virtual UInt32 ReadPocketStationSerial(out string errorMsg) 193 | { 194 | errorMsg = pocketstationError; 195 | return 0; 196 | } 197 | 198 | /// 199 | /// Dump 16KB BIOS from PocketStation 200 | /// 201 | /// Part of the BIOS to dump 202 | /// 16KB BIOS data 203 | public virtual byte[] DumpPocketStationBIOS(int part) 204 | { 205 | return null; 206 | } 207 | 208 | /// 209 | /// Push current date and time from a PC to PocketStation 210 | /// 211 | /// Descriptive error message 212 | /// Operation success 213 | public virtual bool SetPocketStationTime(out string errorMsg) 214 | { 215 | errorMsg = pocketstationError; 216 | return false; 217 | } 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/commentsWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/headerWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/pocketStationInfo.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/preferencesWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/aboutWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/cardReaderWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/compareWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/pluginsWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/informationWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/pluginsWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace MemcardRex 2 | { 3 | partial class pluginsWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.OKbutton = new System.Windows.Forms.Button(); 32 | this.aboutButton = new System.Windows.Forms.Button(); 33 | this.configButton = new System.Windows.Forms.Button(); 34 | this.pluginListView = new System.Windows.Forms.ListView(); 35 | this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 36 | this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 37 | this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 38 | this.SuspendLayout(); 39 | // 40 | // OKbutton 41 | // 42 | this.OKbutton.FlatStyle = System.Windows.Forms.FlatStyle.System; 43 | this.OKbutton.Location = new System.Drawing.Point(376, 256); 44 | this.OKbutton.Name = "OKbutton"; 45 | this.OKbutton.Size = new System.Drawing.Size(76, 24); 46 | this.OKbutton.TabIndex = 0; 47 | this.OKbutton.Text = "OK"; 48 | this.OKbutton.UseMnemonic = false; 49 | this.OKbutton.UseVisualStyleBackColor = true; 50 | this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click); 51 | // 52 | // aboutButton 53 | // 54 | this.aboutButton.Location = new System.Drawing.Point(84, 256); 55 | this.aboutButton.Name = "aboutButton"; 56 | this.aboutButton.Size = new System.Drawing.Size(76, 24); 57 | this.aboutButton.TabIndex = 3; 58 | this.aboutButton.Text = "About"; 59 | this.aboutButton.UseVisualStyleBackColor = true; 60 | this.aboutButton.Click += new System.EventHandler(this.aboutButton_Click); 61 | // 62 | // configButton 63 | // 64 | this.configButton.Location = new System.Drawing.Point(4, 256); 65 | this.configButton.Name = "configButton"; 66 | this.configButton.Size = new System.Drawing.Size(76, 24); 67 | this.configButton.TabIndex = 2; 68 | this.configButton.Text = "Config"; 69 | this.configButton.UseVisualStyleBackColor = true; 70 | this.configButton.Click += new System.EventHandler(this.configButton_Click); 71 | // 72 | // pluginListView 73 | // 74 | this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 75 | this.columnHeader1, 76 | this.columnHeader2, 77 | this.columnHeader3}); 78 | this.pluginListView.FullRowSelect = true; 79 | this.pluginListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; 80 | this.pluginListView.HideSelection = false; 81 | this.pluginListView.Location = new System.Drawing.Point(4, 4); 82 | this.pluginListView.MultiSelect = false; 83 | this.pluginListView.Name = "pluginListView"; 84 | this.pluginListView.Size = new System.Drawing.Size(448, 248); 85 | this.pluginListView.TabIndex = 1; 86 | this.pluginListView.UseCompatibleStateImageBehavior = false; 87 | this.pluginListView.View = System.Windows.Forms.View.Details; 88 | this.pluginListView.SelectedIndexChanged += new System.EventHandler(this.pluginListView_SelectedIndexChanged); 89 | // 90 | // columnHeader1 91 | // 92 | this.columnHeader1.Text = "Plugin name"; 93 | this.columnHeader1.Width = 131; 94 | // 95 | // columnHeader2 96 | // 97 | this.columnHeader2.Text = "Author"; 98 | this.columnHeader2.Width = 92; 99 | // 100 | // columnHeader3 101 | // 102 | this.columnHeader3.Text = "Supported game(s)"; 103 | this.columnHeader3.Width = 219; 104 | // 105 | // pluginsWindow 106 | // 107 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 108 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 109 | this.ClientSize = new System.Drawing.Size(456, 283); 110 | this.Controls.Add(this.pluginListView); 111 | this.Controls.Add(this.configButton); 112 | this.Controls.Add(this.aboutButton); 113 | this.Controls.Add(this.OKbutton); 114 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 115 | this.MaximizeBox = false; 116 | this.MinimizeBox = false; 117 | this.Name = "pluginsWindow"; 118 | this.ShowInTaskbar = false; 119 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 120 | this.Text = "Plugins"; 121 | this.ResumeLayout(false); 122 | 123 | } 124 | 125 | #endregion 126 | 127 | private System.Windows.Forms.Button OKbutton; 128 | private System.Windows.Forms.Button aboutButton; 129 | private System.Windows.Forms.Button configButton; 130 | private System.Windows.Forms.ListView pluginListView; 131 | private System.Windows.Forms.ColumnHeader columnHeader1; 132 | private System.Windows.Forms.ColumnHeader columnHeader2; 133 | private System.Windows.Forms.ColumnHeader columnHeader3; 134 | } 135 | } -------------------------------------------------------------------------------- /MemcardRex.Core/Support/ProgramSettings.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | 3 | namespace MemcardRex.Core 4 | { 5 | public class ProgramSettings 6 | { 7 | public int ShowListGrid = 0; //List grid settings 8 | public int IconBackgroundColor = 0; //Various colors based on PS1 BIOS backgrounds 9 | public int BackupMemcards = 0; //Backup Memory Card settings 10 | public int RestoreWindowPosition = 0; //Restore window position 11 | public int FixCorruptedCards = 0; //Try to fix corrupted memory cards 12 | public int FormatType = 0; //Type of formatting for hardware interfaces 13 | public string CommunicationPort = "COM1"; //Communication port for Hardware interfaces 14 | public int LastSaveFormat = 0; //Last used format to save memory card 15 | public int LastExportFormat = 0; //Last used format to export save 16 | public string RemoteCommAddress = "192.168.4.1"; //Address / hostname of the remote serial bridge host 17 | public int RemoteCommPort = 23; //Port to open a socket for the remote serial bridge 18 | public int CardSlot = 0; //Active card slot for reading data from PS1CardLink or Unirom 19 | public int ActiveInterface = 0; //Currently active hardware interface 20 | public int WarningMessages = 1; //Show warning messages for dangerous tasks 21 | public int WindowPositionX = 0; //Saved window X coordinate 22 | public int WindowPositionY = 0; //Saved window Y coordinate 23 | public int GridColorValue = 128; //Saved grid value for icon editor 24 | public int IconGridEnabled = 1; //Show grid in icon editor 25 | 26 | private const string settingsFilename = "Settings.xml"; 27 | 28 | public ProgramSettings() 29 | { 30 | } 31 | 32 | /// 33 | /// Load settings from permanent storage 34 | /// 35 | /// Directory to save settings to 36 | public void LoadSettings(string directory) 37 | { 38 | if (!Directory.Exists(directory)) return; 39 | 40 | string filename = Path.Combine(directory, settingsFilename); 41 | 42 | if (!File.Exists(filename)) return; 43 | 44 | xmlSettingsEditor xmlAppSettings = new xmlSettingsEditor(); 45 | 46 | //Open XML file for reading, file is auto-closed 47 | xmlAppSettings.openXmlReader(filename); 48 | 49 | ShowListGrid = xmlAppSettings.readXmlEntryInt("ShowGrid", 0, 1); 50 | 51 | CommunicationPort = xmlAppSettings.readXmlEntry("ComPort"); 52 | 53 | RemoteCommAddress = xmlAppSettings.readXmlEntry("RemoteComAddress"); 54 | RemoteCommPort = xmlAppSettings.readXmlEntryInt("RemoteComPort", 0, 65535); 55 | 56 | IconBackgroundColor = xmlAppSettings.readXmlEntryInt("IconBackgroundColor", 0, 4); 57 | 58 | BackupMemcards = xmlAppSettings.readXmlEntryInt("BackupMemoryCards", 0, 1); 59 | 60 | RestoreWindowPosition = xmlAppSettings.readXmlEntryInt("RestoreWindowPosition", 0, 1); 61 | 62 | WindowPositionX = xmlAppSettings.readXmlEntryInt("WindowPositionX", -65535, 65535); 63 | 64 | WindowPositionY = xmlAppSettings.readXmlEntryInt("WindowPositionY", -65535, 65535); 65 | 66 | FormatType = xmlAppSettings.readXmlEntryInt("HardwareFormatType", 0, 1); 67 | 68 | FixCorruptedCards = xmlAppSettings.readXmlEntryInt("FixCorruptedCards", 0, 1); 69 | 70 | LastSaveFormat = xmlAppSettings.readXmlEntryInt("LastSaveFormat", 0, 13); 71 | 72 | LastExportFormat = xmlAppSettings.readXmlEntryInt("LastExportFormat", 0, 7); 73 | 74 | CardSlot = xmlAppSettings.readXmlEntryInt("CardSlot", 0, 1); 75 | 76 | ActiveInterface = xmlAppSettings.readXmlEntryInt("ActiveInterface", 0, 10); 77 | 78 | WarningMessages = xmlAppSettings.readXmlEntryInt("WarningMessages", 0, 1); 79 | 80 | GridColorValue = xmlAppSettings.readXmlEntryInt("GridColorValue", 0, 255); 81 | 82 | IconGridEnabled = xmlAppSettings.readXmlEntryInt("IconGridEnabled", 0, 1); 83 | } 84 | 85 | /// 86 | /// Save settings to permanent storage 87 | /// 88 | /// Full path to settings file 89 | public void SaveSettings(string directory, string appName, string appVersion) 90 | { 91 | //Create directory if it doesn't exist 92 | if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); 93 | 94 | xmlSettingsEditor xmlAppSettings = new xmlSettingsEditor(); 95 | 96 | xmlAppSettings.openXmlWriter(Path.Combine(directory, settingsFilename), appName + " " + appVersion + " settings data"); 97 | 98 | xmlAppSettings.writeXmlEntry("ShowGrid", ShowListGrid.ToString()); 99 | 100 | xmlAppSettings.writeXmlEntry("ComPort", CommunicationPort); 101 | 102 | xmlAppSettings.writeXmlEntry("RemoteComAddress", RemoteCommAddress); 103 | xmlAppSettings.writeXmlEntry("RemoteComPort", RemoteCommPort.ToString()); 104 | 105 | xmlAppSettings.writeXmlEntry("IconBackgroundColor", IconBackgroundColor.ToString()); 106 | 107 | xmlAppSettings.writeXmlEntry("BackupMemoryCards", BackupMemcards.ToString()); 108 | 109 | xmlAppSettings.writeXmlEntry("RestoreWindowPosition", RestoreWindowPosition.ToString()); 110 | 111 | xmlAppSettings.writeXmlEntry("WindowPositionX", WindowPositionX.ToString()); 112 | 113 | xmlAppSettings.writeXmlEntry("WindowPositionY", WindowPositionY.ToString()); 114 | 115 | xmlAppSettings.writeXmlEntry("HardwareFormatType", FormatType.ToString()); 116 | 117 | xmlAppSettings.writeXmlEntry("FixCorruptedCards", FixCorruptedCards.ToString()); 118 | 119 | xmlAppSettings.writeXmlEntry("LastSaveFormat", LastSaveFormat.ToString()); 120 | 121 | xmlAppSettings.writeXmlEntry("LastExportFormat", LastExportFormat.ToString()); 122 | 123 | xmlAppSettings.writeXmlEntry("CardSlot", CardSlot.ToString()); 124 | 125 | xmlAppSettings.writeXmlEntry("ActiveInterface", ActiveInterface.ToString()); 126 | 127 | xmlAppSettings.writeXmlEntry("WarningMessages", WarningMessages.ToString()); 128 | 129 | xmlAppSettings.writeXmlEntry("GridColorValue", GridColorValue.ToString()); 130 | 131 | xmlAppSettings.writeXmlEntry("IconGridEnabled", IconGridEnabled.ToString()); 132 | 133 | xmlAppSettings.closeXmlWriter(); 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /MemcardRex.Windows/Windows/GUI/compareWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace MemcardRex 2 | { 3 | partial class compareWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.compareListView = new System.Windows.Forms.ListView(); 32 | this.offsetColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 33 | this.save1Column = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 34 | this.save2Column = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 35 | this.save1Label = new System.Windows.Forms.Label(); 36 | this.save2Label = new System.Windows.Forms.Label(); 37 | this.spacerLabel = new System.Windows.Forms.Label(); 38 | this.okButton = new System.Windows.Forms.Button(); 39 | this.SuspendLayout(); 40 | // 41 | // compareListView 42 | // 43 | this.compareListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 44 | this.offsetColumn, 45 | this.save1Column, 46 | this.save2Column}); 47 | this.compareListView.FullRowSelect = true; 48 | this.compareListView.HideSelection = false; 49 | this.compareListView.Location = new System.Drawing.Point(4, 44); 50 | this.compareListView.MultiSelect = false; 51 | this.compareListView.Name = "compareListView"; 52 | this.compareListView.Size = new System.Drawing.Size(368, 216); 53 | this.compareListView.TabIndex = 0; 54 | this.compareListView.UseCompatibleStateImageBehavior = false; 55 | this.compareListView.View = System.Windows.Forms.View.Details; 56 | // 57 | // offsetColumn 58 | // 59 | this.offsetColumn.Text = "Offset (hex, int)"; 60 | this.offsetColumn.Width = 115; 61 | // 62 | // save1Column 63 | // 64 | this.save1Column.Text = "Save1 (hex, int)"; 65 | this.save1Column.Width = 115; 66 | // 67 | // save2Column 68 | // 69 | this.save2Column.Text = "Save2 (hex, int)"; 70 | this.save2Column.Width = 115; 71 | // 72 | // save1Label 73 | // 74 | this.save1Label.AutoSize = true; 75 | this.save1Label.Location = new System.Drawing.Point(4, 4); 76 | this.save1Label.Name = "save1Label"; 77 | this.save1Label.Size = new System.Drawing.Size(62, 13); 78 | this.save1Label.TabIndex = 1; 79 | this.save1Label.Text = "save1Label"; 80 | // 81 | // save2Label 82 | // 83 | this.save2Label.AutoSize = true; 84 | this.save2Label.Location = new System.Drawing.Point(4, 24); 85 | this.save2Label.Name = "save2Label"; 86 | this.save2Label.Size = new System.Drawing.Size(64, 13); 87 | this.save2Label.TabIndex = 2; 88 | this.save2Label.Text = "save2Labell"; 89 | // 90 | // spacerLabel 91 | // 92 | this.spacerLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 93 | this.spacerLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 94 | this.spacerLabel.Location = new System.Drawing.Point(4, 265); 95 | this.spacerLabel.Name = "spacerLabel"; 96 | this.spacerLabel.Size = new System.Drawing.Size(368, 2); 97 | this.spacerLabel.TabIndex = 11; 98 | // 99 | // okButton 100 | // 101 | this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 102 | this.okButton.Location = new System.Drawing.Point(296, 269); 103 | this.okButton.Name = "okButton"; 104 | this.okButton.Size = new System.Drawing.Size(76, 24); 105 | this.okButton.TabIndex = 10; 106 | this.okButton.Text = "OK"; 107 | this.okButton.UseVisualStyleBackColor = true; 108 | this.okButton.Click += new System.EventHandler(this.okButton_Click); 109 | // 110 | // compareWindow 111 | // 112 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 113 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 114 | this.ClientSize = new System.Drawing.Size(376, 297); 115 | this.Controls.Add(this.spacerLabel); 116 | this.Controls.Add(this.okButton); 117 | this.Controls.Add(this.save2Label); 118 | this.Controls.Add(this.save1Label); 119 | this.Controls.Add(this.compareListView); 120 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 121 | this.MaximizeBox = false; 122 | this.MinimizeBox = false; 123 | this.Name = "compareWindow"; 124 | this.ShowInTaskbar = false; 125 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 126 | this.Text = "compareWindow"; 127 | this.Load += new System.EventHandler(this.compareWindow_Load); 128 | this.ResumeLayout(false); 129 | this.PerformLayout(); 130 | 131 | } 132 | 133 | #endregion 134 | 135 | private System.Windows.Forms.ListView compareListView; 136 | private System.Windows.Forms.ColumnHeader save1Column; 137 | private System.Windows.Forms.ColumnHeader save2Column; 138 | private System.Windows.Forms.ColumnHeader offsetColumn; 139 | private System.Windows.Forms.Label save1Label; 140 | private System.Windows.Forms.Label save2Label; 141 | private System.Windows.Forms.Label spacerLabel; 142 | private System.Windows.Forms.Button okButton; 143 | } 144 | } -------------------------------------------------------------------------------- /MemcardRex.Core/Support/BmpBuilder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | 4 | namespace MemcardRex.Core 5 | { 6 | public class BmpBuilder 7 | { 8 | public BmpBuilder() 9 | { 10 | } 11 | 12 | byte ReverseBits(byte b) 13 | { 14 | byte reversed = 0; 15 | for (int i = 0; i < 8; i++) 16 | { 17 | // Shift the reversed byte to the left 18 | reversed <<= 1; 19 | // Get the least significant bit of the original byte and add it to the reversed byte 20 | reversed |= (byte)(b & 1); 21 | // Shift the original byte to the right 22 | b >>= 1; 23 | } 24 | return reversed; 25 | } 26 | 27 | /// 28 | /// Create a 32x32 monochrome BMP image 29 | /// 30 | /// 31 | /// 32 | public byte[] BuildBmp(byte[] RawImageData) 33 | { 34 | byte[] monoBmpHeader = { 35 | 0x42, 0x4D, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 36 | 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 37 | 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 38 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 40 | 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 51 | }; 52 | 53 | byte[] monoBmpImage = new byte[190]; 54 | 55 | //Copy BMP header to bmp data array 56 | Array.Copy(monoBmpHeader, monoBmpImage, monoBmpHeader.Length); 57 | 58 | for (int i = 0; i < 0x80; i += 4) 59 | { 60 | monoBmpImage[monoBmpImage.Length - 4 - i] = (byte)~ReverseBits(RawImageData[0 + i]); 61 | monoBmpImage[monoBmpImage.Length - 3 - i] = (byte)~ReverseBits(RawImageData[1 + i]); 62 | monoBmpImage[monoBmpImage.Length - 2 - i] = (byte)~ReverseBits(RawImageData[2 + i]); 63 | monoBmpImage[monoBmpImage.Length - 1 - i] = (byte)~ReverseBits(RawImageData[3 + i]); 64 | } 65 | 66 | return monoBmpImage; 67 | } 68 | 69 | /// 70 | /// Create 16x16 ARGB BMP image 71 | /// 72 | /// 73 | /// 74 | public byte[] BuildBmp(Color[] RawImageData) 75 | { 76 | byte[] ArgbBmpHeader = new byte[] // All values are little-endian 77 | { 78 | 0x42, 0x4D, // Signature 'BM' 79 | 0x8a, 0x40, 0x00, 0x00, // Size: 1162 bytes 80 | 0x00, 0x00, // Unused 81 | 0x00, 0x00, // Unused 82 | 0x8a, 0x00, 0x00, 0x00, // Offset to image data 83 | 84 | 0x7c, 0x00, 0x00, 0x00, // DIB header size (124 bytes) 85 | 0x10, 0x00, 0x00, 0x00, // Width (16px) 86 | 0x10, 0x00, 0x00, 0x00, // Height (16px) 87 | 0x01, 0x00, // Planes (1) 88 | 0x20, 0x00, // Bits per pixel (32) 89 | 0x03, 0x00, 0x00, 0x00, // Format (bitfield = use bitfields | no compression) 90 | 0x00, 0x04, 0x00, 0x00, // Image raw size (1024 bytes) 91 | 0x13, 0x0B, 0x00, 0x00, // Horizontal print resolution (2835 = 72dpi * 39.3701) 92 | 0x13, 0x0B, 0x00, 0x00, // Vertical print resolution (2835 = 72dpi * 39.3701) 93 | 0x00, 0x00, 0x00, 0x00, // Colors in palette (none) 94 | 0x00, 0x00, 0x00, 0x00, // Important colors (0 = all) 95 | 0x00, 0x00, 0xFF, 0x00, // R bitmask (00FF0000) 96 | 0x00, 0xFF, 0x00, 0x00, // G bitmask (0000FF00) 97 | 0xFF, 0x00, 0x00, 0x00, // B bitmask (000000FF) 98 | 0x00, 0x00, 0x00, 0xFF, // A bitmask (FF000000) 99 | 0x42, 0x47, 0x52, 0x73, // sRGB color space 100 | 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 | 0x00, 0x00, 0x00, 0x00, // Unused R, G, B entries for color space 106 | 107 | 0x00, 0x00, 0x00, 0x00, // Unused Gamma X entry for color space 108 | 0x00, 0x00, 0x00, 0x00, // Unused Gamma Y entry for color space 109 | 0x00, 0x00, 0x00, 0x00, // Unused Gamma Z entry for color space 110 | 111 | 0x00, 0x00, 0x00, 0x00, // Unknown 112 | 0x00, 0x00, 0x00, 0x00, // Unknown 113 | 0x00, 0x00, 0x00, 0x00, // Unknown 114 | 0x00, 0x00, 0x00, 0x00, // Unknown 115 | }; 116 | 117 | const int totalSize = 1162; 118 | const int width = 16; 119 | const int dataOffset = 138; 120 | 121 | byte[] bmpImage = new byte[totalSize]; 122 | 123 | // Copy BMP header 124 | Buffer.BlockCopy(ArgbBmpHeader, 0, bmpImage, 0, ArgbBmpHeader.Length); 125 | 126 | // Flip Y-axis directly when writing data 127 | for (int y = 0; y < width; y++) 128 | { 129 | int srcRowStart = y * width; 130 | int destRowStart = dataOffset + (width - 1 - y) * width * 4; 131 | 132 | for (int x = 0; x < width; x++) 133 | { 134 | Color pixel = RawImageData[srcRowStart + x]; 135 | int destIndex = destRowStart + x * 4; 136 | 137 | // Write BGRA format directly (little-endian for BMP) 138 | bmpImage[destIndex] = pixel.B; 139 | bmpImage[destIndex + 1] = pixel.G; 140 | bmpImage[destIndex + 2] = pixel.R; 141 | bmpImage[destIndex + 3] = pixel.A; 142 | } 143 | } 144 | 145 | return bmpImage; 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Oo]ut/ 33 | [Ll]og/ 34 | [Ll]ogs/ 35 | 36 | # Visual Studio 2015/2017 cache/options directory 37 | .vs/ 38 | # Uncomment if you have tasks that create the project's static files in wwwroot 39 | #wwwroot/ 40 | 41 | # Visual Studio 2017 auto generated files 42 | Generated\ Files/ 43 | 44 | # MSTest test Results 45 | [Tt]est[Rr]esult*/ 46 | [Bb]uild[Ll]og.* 47 | 48 | # NUnit 49 | *.VisualState.xml 50 | TestResult.xml 51 | nunit-*.xml 52 | 53 | # Build Results of an ATL Project 54 | [Dd]ebugPS/ 55 | [Rr]eleasePS/ 56 | dlldata.c 57 | 58 | # Benchmark Results 59 | BenchmarkDotNet.Artifacts/ 60 | 61 | # .NET Core 62 | project.lock.json 63 | project.fragment.lock.json 64 | artifacts/ 65 | 66 | # ASP.NET Scaffolding 67 | ScaffoldingReadMe.txt 68 | 69 | # StyleCop 70 | StyleCopReport.xml 71 | 72 | # Files built by Visual Studio 73 | *_i.c 74 | *_p.c 75 | *_h.h 76 | *.ilk 77 | *.meta 78 | *.obj 79 | *.iobj 80 | *.pch 81 | *.pdb 82 | *.ipdb 83 | *.pgc 84 | *.pgd 85 | *.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio LightSwitch build output 298 | **/*.HTMLClient/GeneratedArtifacts 299 | **/*.DesktopClient/GeneratedArtifacts 300 | **/*.DesktopClient/ModelManifest.xml 301 | **/*.Server/GeneratedArtifacts 302 | **/*.Server/ModelManifest.xml 303 | _Pvt_Extensions 304 | 305 | # Paket dependency manager 306 | .paket/paket.exe 307 | paket-files/ 308 | 309 | # FAKE - F# Make 310 | .fake/ 311 | 312 | # CodeRush personal settings 313 | .cr/personal 314 | 315 | # Python Tools for Visual Studio (PTVS) 316 | __pycache__/ 317 | *.pyc 318 | 319 | # Cake - Uncomment if you are using it 320 | # tools/** 321 | # !tools/packages.config 322 | 323 | # Tabs Studio 324 | *.tss 325 | 326 | # Telerik's JustMock configuration file 327 | *.jmconfig 328 | 329 | # BizTalk build output 330 | *.btp.cs 331 | *.btm.cs 332 | *.odx.cs 333 | *.xsd.cs 334 | 335 | # OpenCover UI analysis results 336 | OpenCover/ 337 | 338 | # Azure Stream Analytics local run output 339 | ASALocalRun/ 340 | 341 | # MSBuild Binary and Structured Log 342 | *.binlog 343 | 344 | # NVidia Nsight GPU debugger configuration file 345 | *.nvuser 346 | 347 | # MFractors (Xamarin productivity tool) working folder 348 | .mfractor/ 349 | 350 | # Local History for Visual Studio 351 | .localhistory/ 352 | 353 | # BeatPulse healthcheck temp database 354 | healthchecksdb 355 | 356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 357 | MigrationBackup/ 358 | 359 | # Ionide (cross platform F# VS Code tools) working folder 360 | .ionide/ 361 | 362 | # Fody - auto-generated XML schema 363 | FodyWeavers.xsd 364 | /MemcardRex/.DS_Store 365 | .DS_Store 366 | MemcardRex.macOS/Resources/.DS_Store 367 | --------------------------------------------------------------------------------