This commit is contained in:
Lesserkuma 2023-06-06 16:58:15 +02:00
parent fe0221da1c
commit 972bf8fd33
35 changed files with 304 additions and 123 deletions

View File

@ -1,4 +1,12 @@
# Release notes
### v3.30 (released 2023-06-06)
- Improved auto-detection of official GBA Video cartridges with the 3D Memory mapper including those that are less than 64 MiB
- Added support for Unknown 29LV320 variant (no PCB text) *(thanks Zoo)*
- Added support for new insideGadgets flash cart revisions *(thanks Smelly-Ghost)*
- Added support for Sillyhatday MBC5-DUAL-FLASH-4/8MB *(thanks Sillyhatday)*
- Confirmed support for SD007_T40_48BALL_71_TV_TS28 with M29W640 *(thanks marv17)*
- Updated the Game Boy Advance lookup database for save types, ROM sizes and checksums
### v3.29 (released 2023-05-14)
- Fixed an issue with writing to some flash cartridges using the old GBxCart RW v1.3 hardware revision *(thanks yosoo)*
- Fixed an issue with Batteryless SRAM save data restore *(thanks antPL)*

View File

@ -5,6 +5,8 @@
import traceback
from serial import SerialException
from . import pyside as PySide2
from . import Util
from .Util import dprint
class DataTransfer(PySide2.QtCore.QThread):
CONFIG = None
@ -51,5 +53,6 @@ class DataTransfer(PySide2.QtCore.QThread):
if error is not None:
print(tb)
dprint(tb)
self.updateProgress.emit({"action":"ABORT", "info_type":"msgbox_critical", "fatal":True, "info_msg":"An unresolvable error has occured. See console output for more information. Reconnect the device, restart the software and try again.\n\n{:s}: {:s}".format(type(error).__name__, str(error)), "abortable":False})
self.FINISHED = True

View File

@ -628,7 +628,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
if self.CONN is not None:
Util.dprint("Connected device: {:s}".format(self.CONN.GetFullNameExtended(more=True)))
else:
Util.dprint("No devices connected.")
Util.dprint("No device connected.")
Util.dprint("Now writing debug log file.")
except:
pass
@ -1945,7 +1945,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.DisconnectDevice()
self.CONN = None
self.DEVICES = {}
msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Warning, windowTitle="{:s} {:s}".format(APPNAME, VERSION), text="The connection to the device was lost!\n\nThis can be happen in one of the following cases:\n- The USB cable was unplugged or is faulty\n- The inserted cartridge may draw too much peak power (try re-connecting a few times or try hotswapping the cartridge after connecting)\n- The inserted cartrdige may introduce a short circuit (check for bad soldering)\n\nDo you want to try and reconnect to the device?", standardButtons=QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Warning, windowTitle="{:s} {:s}".format(APPNAME, VERSION), text="The connection to the device was lost!\n\nThis can be happen in one of the following cases:\n- The USB cable was unplugged or is faulty\n- The inserted cartridge may draw too much peak power (try re-connecting a few times or try hotswapping the cartridge after connecting)\n- The inserted cartrdige may induce a short circuit (check for bad soldering)\n\nDo you want to try and reconnect to the device?", standardButtons=QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
answer = msgbox.exec()
if answer == QtWidgets.QMessageBox.No:
@ -2072,6 +2072,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.lblDMGRomTitleResult.setText(data['game_title'])
self.lblDMGGameCodeRevision.setText("Game Code and Revision:")
self.lblDMGGameNameResult.setToolTip("")
if data["db"] is not None:
self.lblDMGGameCodeRevisionResult.setText("{:s}-{:s}".format(data["db"]["gc"], str(data["version"])))
temp = data["db"]["gn"]
@ -2081,8 +2082,6 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.lblDMGGameNameResult.setText(temp + "")
if temp != data["db"]["gn"]:
self.lblDMGGameNameResult.setToolTip(data["db"]["gn"])
else:
self.lblDMGGameNameResult.setToolTip("")
else:
self.lblDMGGameNameResult.setText("(Not in database)")
if len(data['game_code']) > 0:
@ -2174,6 +2173,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.cmbAGBCartridgeTypeResult.setCurrentIndex(data["flash_type"])
self.lblAGBRomTitleResult.setText(data['game_title'])
self.lblAGBGameNameResult.setToolTip("")
if data["db"] is not None:
self.lblAGBHeaderGameCodeRevisionResult.setText("{:s}-{:s}".format(data["db"]["gc"], str(data["version"])))
temp = data["db"]["gn"]
@ -2183,8 +2183,6 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.lblAGBGameNameResult.setText(temp + "")
if temp != data["db"]["gn"]:
self.lblAGBGameNameResult.setToolTip(data["db"]["gn"])
else:
self.lblAGBGameNameResult.setToolTip("")
else:
if len(data["game_code"]) > 0:
self.lblAGBHeaderGameCodeRevisionResult.setText("{:s}-{:s}".format(data['game_code'], str(data['version'])))
@ -2226,9 +2224,6 @@ class FlashGBX_GUI(QtWidgets.QWidget):
else:
self.cmbAGBHeaderROMSizeResult.setCurrentIndex(0)
if data["3d_memory"] is True:
self.cmbAGBHeaderROMSizeResult.setCurrentIndex(Util.AGB_Header_ROM_Sizes_Map.index(0x4000000))
if data["save_type"] == None:
self.cmbAGBSaveTypeResult.setCurrentIndex(0)
if data["db"] != None:

View File

@ -87,15 +87,15 @@ class RomFileAGB:
# 3D Memory (GBA Video 64 MB)
data["3d_memory"] = False
if (data["game_title"] == "DISNEYVOL002" and data["game_code"] == "MDSE" and data["header_checksum"] == 0x58) or \
(data["game_title"] == "SHARKS TALE" and data["game_code"] == "MSAE" and data["header_checksum"] == 0x98) or \
(data["game_title"] == "SHARKS TALE" and data["game_code"] == "MSAE" and data["header_checksum"] == 0x97) or \
(data["game_title"] == "SHREK MOVIE" and data["game_code"] == "MSKE" and data["header_checksum"] == 0x83) or \
(data["game_title"] == "SHREK MOVIE" and data["game_code"] == "MSKE" and data["header_checksum"] == 0x82) or \
(data["game_title"] == "SHREKSHARK21" and data["game_code"] == "MSTE" and data["header_checksum"] == 0x3E) or \
(data["game_title"] == "SHREK2MOVIE" and data["game_code"] == "M2SE" and data["header_checksum"] == 0x8A) or \
(data["game_title"] == "SHREK2MOVIE" and data["game_code"] == "M2SE" and data["header_checksum"] == 0x89):
data["3d_memory"] = True
# if (data["game_title"] == "DISNEYVOL002" and data["game_code"] == "MDSE" and data["header_checksum"] == 0x58) or \
# (data["game_title"] == "SHARKS TALE" and data["game_code"] == "MSAE" and data["header_checksum"] == 0x98) or \
# (data["game_title"] == "SHARKS TALE" and data["game_code"] == "MSAE" and data["header_checksum"] == 0x97) or \
# (data["game_title"] == "SHREK MOVIE" and data["game_code"] == "MSKE" and data["header_checksum"] == 0x83) or \
# (data["game_title"] == "SHREK MOVIE" and data["game_code"] == "MSKE" and data["header_checksum"] == 0x82) or \
# (data["game_title"] == "SHREKSHARK21" and data["game_code"] == "MSTE" and data["header_checksum"] == 0x3E) or \
# (data["game_title"] == "SHREK2MOVIE" and data["game_code"] == "M2SE" and data["header_checksum"] == 0x8A) or \
# (data["game_title"] == "SHREK2MOVIE" and data["game_code"] == "M2SE" and data["header_checksum"] == 0x89):
# data["3d_memory"] = True
# 8M FLASH DACS
data["dacs_8m"] = False
@ -112,6 +112,9 @@ class RomFileAGB:
data["unchanged"] = copy.copy(data)
self.DATA = data
data["db"] = self.GetDatabaseEntry()
if data["db"] is not None and "3d" in data["db"]:
data["3d_memory"] = data["db"]["3d"]
return data
def GetDatabaseEntry(self):

View File

@ -7,9 +7,9 @@ from enum import Enum
# Common constants
APPNAME = "FlashGBX"
VERSION_PEP440 = "3.29"
VERSION_PEP440 = "3.30"
VERSION = "v{:s}".format(VERSION_PEP440)
VERSION_TIMESTAMP = 1684079394
VERSION_TIMESTAMP = 1686057604
DEBUG = False
DEBUG_LOG = []
APP_PATH = ""

View File

@ -17361,6 +17361,17 @@
"lg": "En,Fr,De,Es,It,Nl",
"rg": "Europe"
},
"79b1b9e4e578b8c5927fa14f54ee6785c8dd2c75": {
"gn": "Pocket Monsters Diamond - Pocket Monsters Pearl - Manaphy Present Campaign Senyou Cartridge",
"ne": "(Japan) (En)",
"gc": "B5BJ",
"rc": 3809830607,
"rs": 2097152,
"st": 0,
"ss": 0,
"lg": "En",
"rg": "Japan"
},
"ad4048b726b9a9538f431cf689878623cf809aa0": {
"gn": "Namco Museum - 50th Anniversary",
"ne": "(USA)",
@ -23155,6 +23166,17 @@
"lg": "En,Fr,De,Es,It",
"rg": "Europe"
},
"d7197b51473664d1f802ab7c16cdb5eba7045fd9": {
"gn": "Glucoboy",
"ne": "(Australia)",
"gc": "BJGE",
"rc": 1848475391,
"rs": 16777216,
"st": 0,
"ss": 0,
"lg": "En",
"rg": "Australia"
},
"5b07e6ee13af3ae1d276c00d5fde0be1fa7f1d2c": {
"gn": "Justice League Heroes - The Flash",
"ne": "(USA)",
@ -31441,7 +31463,8 @@
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"abd17359c40ee817066fe3ab12829d4144dfd71f": {
"gn": "Game Boy Advance Video - Shrek 2",
@ -31453,7 +31476,8 @@
"ss": 0,
"rv": "Rev 6",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"7330e1c53f14ee6c6b570176ab0f4a648252da3d": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Volume 2",
@ -31464,7 +31488,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": true
},
"dd992df47247919cbb252015b4ff093e3156d320": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Limited Edition",
@ -31475,7 +31500,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"54a6e77c02eae428b8b438035ba8215d621dc54f": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Platinum Edition",
@ -31486,7 +31512,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": true
},
"73f8adcdf1fb2766c13ab65c0470af2b23801a7a": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Edition Platinum",
@ -31497,7 +31524,8 @@
"st": 0,
"ss": 0,
"lg": "Fr",
"rg": "France"
"rg": "France",
"3d": true
},
"e6976665b9e9979e270c95230fbbd08350f09f99": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Premium Edition",
@ -31508,7 +31536,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": true
},
"772d68fe78dc92febbb12b6c1172d26c68031706": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Edition Premium",
@ -31519,7 +31548,21 @@
"st": 0,
"ss": 0,
"lg": "Fr",
"rg": "France"
"rg": "France",
"3d": true
},
"790103a28c22bfcfa52de31f9a1061b17708dc3c": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Special Edition",
"ne": "(USA) (Rev 5)",
"gc": "MCSE",
"rc": 464467757,
"rs": 33554432,
"st": 0,
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA",
"3d": true
},
"d911da50f926a2485cd9dfc9fd8f7326adb12d49": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Special Edition",
@ -31530,7 +31573,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": true
},
"a9861107e3c0eadf7a2c6fbf970155cb059f869e": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Edition Speciale",
@ -31541,7 +31585,8 @@
"st": 0,
"ss": 0,
"lg": "Fr",
"rg": "France"
"rg": "France",
"3d": true
},
"590318cf40cad4d866dd385b6b208a99c6eeec62": {
"gn": "Game Boy Advance Video - Cartoon Network Collection - Volume 1",
@ -31552,7 +31597,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": false
},
"c2a1c8c479ada081407c754d23c73afc59f19e60": {
"gn": "Game Boy Advance Video - Dragon Ball GT - Volume 1",
@ -31563,7 +31609,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"28c8afa6b5d0d24d2c540413e948d4c9c7c44e63": {
"gn": "Game Boy Advance Video - Disney Channel Collection - Volume 1",
@ -31574,7 +31621,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"bfe44e65a6ca22ed091c82b475999a4818f60b83": {
"gn": "Game Boy Advance Video - Dora the Explorer - Volume 1",
@ -31585,7 +31633,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"0005b5d625d0b2b491f28f195a50d00e61b92de8": {
"gn": "Game Boy Advance Video - Disney Channel Collection - Volume 2",
@ -31597,7 +31646,8 @@
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"17bdd62f02187986ae429e21060473ebb5bb2897": {
"gn": "Game Boy Advance Video - The Fairly OddParents! - Volume 2",
@ -31609,7 +31659,8 @@
"ss": 0,
"rv": "Rev 1",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"7a4f484966b9591643a9ef2266e9dcd4d358d0bb": {
"gn": "Game Boy Advance Video - The Fairly OddParents! - Volume 1",
@ -31620,7 +31671,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"9818575de1f15e8fe74d9fc0cf1411d8fb4775d6": {
"gn": "Game Boy Advance Video - The Proud Family - Volume 1",
@ -31631,7 +31683,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"0c411aef0ac6be4e8e9ae9b9e8d259cae942b8b1": {
"gn": "Game Boy Advance Video - All Grown Up! - Volume 1",
@ -31642,7 +31695,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"f5f2f476128d979b5137485bc773758035fbf169": {
"gn": "Game Boy Advance Video - The Adventures of Jimmy Neutron Boy Genius - Volume 1",
@ -31653,7 +31707,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"0aca8eb33ed5aabd8e5c98331f8210a5561f7130": {
"gn": "Game Boy Advance Video - Codename - Kids Next Door - Volume 1",
@ -31664,7 +31719,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": false
},
"5f26b36473e99d35011a19a9bae0ef20afce2169": {
"gn": "Game Boy Advance Video - Nicktoons Collection - Volume 2",
@ -31675,7 +31731,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"1fc3d70d3f225dfdad2dfb70d8336368d4aa8982": {
"gn": "Game Boy Advance Video - Nicktoons - Volume 3",
@ -31686,7 +31743,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"49e8ad4da336076f9b0dc8c885e36f7192701fc9": {
"gn": "Game Boy Advance Video - Nicktoons Collection - Volume 1",
@ -31697,7 +31755,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"2a7a051cbecfa02957968cf2096a982029e23c66": {
"gn": "Game Boy Advance Video - Pokemon - Volume 1",
@ -31708,7 +31767,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"20c7cca75beb914994e4f813c82ad02d7d2ce380": {
"gn": "Game Boy Advance Video - Pokemon - Volume 2",
@ -31719,7 +31779,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"37ebe25dd5006c9c4d4a9fee18646d2624ccc5a0": {
"gn": "Game Boy Advance Video - Pokemon - Volume 3",
@ -31730,7 +31791,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"e92e5ced3f55f87aab6627230b93ffbbc1bb3db7": {
"gn": "Game Boy Advance Video - Pokemon - Volume 4",
@ -31741,7 +31803,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"3f057e9ec7b0f53e1cdc51aacf06f90fed6321c4": {
"gn": "Game Boy Advance Video - SpongeBob SquarePants - Volume 2",
@ -31753,7 +31816,8 @@
"ss": 0,
"rv": "Rev 1",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"1e6271fb6a9d7cf0ccd9958b166607bacf15b217": {
"gn": "Game Boy Advance Video - SpongeBob SquarePants - Volume 3",
@ -31764,7 +31828,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"41b14883cc3e05653a7f039944b11a1223f4cf66": {
"gn": "Game Boy Advance Video - Shark Tale",
@ -31776,7 +31841,8 @@
"ss": 0,
"rv": "Rev 6",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"648e46753ccbee3d04a6d12d82bcb265fcebd6f9": {
"gn": "Game Boy Advance Video - Shark Tale",
@ -31788,7 +31854,8 @@
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"e7985c20de15e58531c86ae59ea4af1d2dfb24ea": {
"gn": "Game Boy Advance Video - Strawberry Shortcake - Volume 1",
@ -31799,7 +31866,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"1ee65f7df7463beb098ad5f574dcc02f41115cdd": {
"gn": "Game Boy Advance Video - Sonic X - Volume 1",
@ -31810,7 +31878,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"212cd5a80ab96d5309d2cbe6b2cbfea0211a1018": {
"gn": "Game Boy Advance Video - Shrek",
@ -31822,7 +31891,8 @@
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"a31fe8a1abbc8276e87b93ddc9feb0250e116ec1": {
"gn": "Game Boy Advance Video - Shrek",
@ -31834,7 +31904,8 @@
"ss": 0,
"rv": "Rev 6",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"5da566868ba0be96838eb9b4454fc7a8abf092c0": {
"gn": "Game Boy Advance Video - Super Robot Monkey Team - Hyper Force Go! - Volume 1",
@ -31845,7 +31916,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"99bf48542a03e1bceb2a9a82da7257874ec30670": {
"gn": "Game Boy Advance Video - SpongeBob SquarePants - Volume 1",
@ -31857,7 +31929,8 @@
"ss": 0,
"rv": "Rev 1",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": false
},
"18a5b3b3010fd5f584700f711f303caf89937a99": {
"gn": "Game Boy Advance Video - Shrek + Shark Tale",
@ -31869,7 +31942,8 @@
"ss": 0,
"rv": "Rev 5",
"lg": "En",
"rg": "USA"
"rg": "USA",
"3d": true
},
"11f8d9886d50fcd56334fd4e84bed94eb9995638": {
"gn": "Game Boy Advance Video - Teenage Mutant Ninja Turtles - Things Change",
@ -31880,7 +31954,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": false
},
"36e93d44ad26dfa8b62bb09e50f9cff58cd4fc03": {
"gn": "Game Boy Advance Video - Teenage Mutant Ninja Turtles - Le Demenagement",
@ -31891,7 +31966,8 @@
"st": 0,
"ss": 0,
"lg": "Fr",
"rg": "France"
"rg": "France",
"3d": true
},
"dc0c4e5a4c2cdcbbf86e2a16ca9e2060fea6e943": {
"gn": "Game Boy Advance Video - Yu-Gi-Oh! - Yugi vs. Joey",
@ -31902,7 +31978,8 @@
"st": 0,
"ss": 0,
"lg": "En",
"rg": "USA, Europe"
"rg": "USA, Europe",
"3d": false
},
"2f863283e54ac28b2725dc8430adb9a13b2f5095": {
"gn": "Game Boy Advance Video - Yu-Gi-Oh! - Yugi vs. Joey",
@ -31913,7 +31990,8 @@
"st": 0,
"ss": 0,
"lg": "Fr",
"rg": "France"
"rg": "France",
"3d": true
},
"10b3242f409611c32749f9b42f7c7ea951c5fc6d": {
"gn": "Card e-Reader",
@ -31996,25 +32074,25 @@
},
"cf39d749e19c054368316def932b94e61351e4b8": {
"gn": "AGS Aging Cartridge",
"ne": "(World) (Rev 3, v9.0) (Test Program)",
"ne": "(World) (Rev 3) (v9.0) (Test Program)",
"gc": "TCHK",
"rc": 778659949,
"rs": 2097152,
"st": 1,
"ss": 512,
"rv": "Rev 3, v9.0",
"rv": "Rev 3",
"lg": "En",
"rg": "World"
},
"d2b43b4883d32d45ce7dcb70270aff278e0c079f": {
"gn": "AGS Aging Cartridge",
"ne": "(World) (Rev 1, v7.0) (Test Program)",
"ne": "(World) (Rev 1) (v7.0) (Test Program)",
"gc": "TCHK",
"rc": 3149310304,
"rs": 2097152,
"st": 1,
"ss": 512,
"rv": "Rev 1, v7.0",
"rv": "Rev 1",
"lg": "En",
"rg": "World"
},

View File

@ -125,6 +125,15 @@
"lg": "Ja",
"rg": "Japan"
},
"296c39c40bdc6061bff718a468b79e7e5f46553e": {
"gn": "Pocket Camera - Debug Game Tester - Second Impact",
"ne": "(Japan) (v10.24) (SGB Enhanced) (Test Program)",
"gc": "",
"rc": 359820684,
"rs": 1048576,
"lg": "Ja",
"rg": "Japan"
},
"ed08371c977511b4953cff43f49a98c66fbed58c": {
"gn": "Pocket Monsters Gin",
"ne": "(Japan) (Demo) (Spaceworld 1997) (SGB Enhanced)",

View File

@ -1,10 +1,9 @@
{
"type":"AGB",
"names":[
"3D Memory Cartridge (Large-size GBA Video)"
"3D Memory Cartridge (GBA Video)"
],
"voltage":3.3,
"flash_size":0x4000000,
"3d_memory":true,
"command_set":"3DMEMORY",
"commands":{}

View File

@ -2,11 +2,13 @@
"type":"AGB",
"names":[
"B54 with MX29LV320ET",
"B100 with MX29LV640ET"
"B100 with MX29LV640ET",
"Unknown 29LV320 variant (no PCB text)"
],
"flash_ids":[
[ 0xC2, 0x00, 0xA7, 0x22 ],
[ 0xC2, 0x00, 0xC9, 0x22 ]
[ 0xC2, 0x00, 0xC9, 0x22 ],
[ 0x04, 0x00, 0xF6, 0x22 ]
],
"voltage":3.3,
"flash_size":0x400000,

View File

@ -1,7 +1,7 @@
{
"type":"AGB",
"names":[
"insideGadgets 16 MB (28EW256A) + RTC/Solar"
"insideGadgets 16 MiB (28EW256A) + RTC/Solar"
],
"flash_ids":[
[ 0x89, 0x00, 0x7E, 0x22 ]

View File

@ -1,16 +1,18 @@
{
"type":"AGB",
"names":[
"insideGadgets 32 MB (28EW256A) + RTC/Rumble",
"insideGadgets 32 MB (S29GL512N) + RTC",
"insideGadgets 32 MiB (28EW256A) + RTC/Rumble",
"insideGadgets 32 MiB (S29GL512N) + RTC",
"AGB-E20-30 with S29GL256N10TFI01",
"insideGadgets 32 MB (IS29GL256)"
"insideGadgets 32 MiB (IS29GL256)",
"insideGadgets 32 MiB (W29GL256)"
],
"flash_ids":[
[ 0x89, 0x00, 0x7E, 0x22 ],
[ 0x01, 0x00, 0x7E, 0x22 ],
[ 0x01, 0x00, 0x7E, 0x22 ],
[ 0x9D, 0x00, 0x7E, 0x22 ]
[ 0x9D, 0x00, 0x7E, 0x22 ],
[ 0xEF, 0x00, 0x7E, 0x22 ]
],
"voltage":3.3,
"flash_size":0x2000000,

View File

@ -2,7 +2,7 @@
"type":"DMG",
"names":[
"DIY cart with AM29F016 @ WR",
"insideGadgets 2 MB, 32 KB FRAM, v1.0"
"insideGadgets 2 MiB, 32 KiB FRAM, v1.0"
],
"flash_ids":[
[ 0x01, 0xAD ],

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 4 MB, 32 KB FRAM, MBC3+RTC",
"insideGadgets 4 MiB, 32 KiB FRAM, MBC3+RTC",
"DIY cart with AM29F032 @ AUDIO",
"DIY cart with M29F032D @ AUDIO",
"DIY cart with MBM29F033C @ AUDIO"

View File

@ -2,7 +2,7 @@
"type":"DMG",
"names":[
"Ferrante Crafts cart 32 KB V2",
"marv17 32 KB Homebrew Flashcard (SST39SF040)"
"marv17 32 KiB Homebrew Flashcard (SST39SF040)"
],
"flash_ids":[
[ 0xBF, 0xFF, 0x25, 0xFF ],

View File

@ -2,9 +2,11 @@
"type":"DMG",
"names":[
"SD007_48BALL_64M with M29W640",
"SD007_BGA48_71TV_T28_DEEP with M29W640"
"SD007_BGA48_71TV_T28_DEEP with M29W640",
"SD007_T40_48BALL_71_TV_TS28 with M29W640"
],
"flash_ids":[
[ 0x20, 0x00, 0x7D, 0x00 ],
[ 0x20, 0x00, 0x7D, 0x00 ],
[ 0x20, 0x00, 0x7D, 0x00 ]
],

View File

@ -0,0 +1,74 @@
{
"type":"DMG",
"names":[
"Sillyhatday MBC5-DUAL-FLASH-4/8MB"
],
"voltage":5,
"flash_size":0x800000,
"start_addr":0x4000,
"first_bank":0,
"write_pin":"AUDIO",
"chip_erase_timeout":120,
"mbc":0x1B,
"command_set":"AMD",
"commands":{
"reset":[
[ 0x4000, 0xF0 ]
],
"read_identifier":[
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0x90 ]
],
"read_cfi":[
[ 0x4AAA, 0x98 ]
],
"chip_erase":[
[ 0x2100, 0x00, "WR" ],
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0x80 ],
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0x10 ],
[ 0x2100, 0x80, "WR" ],
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0x80 ],
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0x10 ],
[ 0x2100, 0x00, "WR" ]
],
"chip_erase_wait_for":[
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ 0x4000, 0xFF, 0xFF ],
[ 0x4000, 0xFF, 0xFF ]
],
"single_write":[
[ 0x4555, 0xAA ],
[ 0x42AA, 0x55 ],
[ 0x4555, 0xA0 ],
[ "PA", "PD" ]
],
"single_write_wait_for":[
[ null, null, null ],
[ null, null, null ],
[ null, null, null ],
[ null, null, null ]
]
}
}

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"Squareboi 4 MB (2× 2 MB)"
"Squareboi 4 MiB (2× 2 MiB)"
],
"voltage":5,
"flash_size":0x400000,

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 1 MB, 128 KB SRAM"
"insideGadgets 1 MiB, 128 KiB SRAM"
],
"flash_ids":[
[ 0xC2, 0xC2, 0x58, 0x58 ],

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 1 MB, 32 KB FRAM v2.0"
"insideGadgets 1 MiB, 32 KiB FRAM v2.0"
],
"flash_ids":[],
"voltage":5,

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM"
"insideGadgets 2 MiB, 128 KiB SRAM/32 KiB FRAM"
],
"flash_ids":[
[ 0x01, 0x01, 0xD2, 0xD2 ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM (2)"
"insideGadgets 2 MiB, 128 KiB SRAM/32 KiB FRAM (2)"
],
"flash_ids":[
[ 0x01, 0x01, 0xD8, 0xD8 ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 2 MB, Wisdom Tree"
"insideGadgets 2 MiB, Wisdom Tree"
],
"voltage":5,
"flash_size":0x200000,

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 32 KB"
"insideGadgets 32 KiB"
],
"flash_ids":[
[ 0xBF, 0xB5, 0x01, 0xFF ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 4 MB (S29GL032M)"
"insideGadgets 4 MiB (S29GL032M)"
],
"flash_ids":[
[ 0x01, 0x01, 0x7E, 0x7E ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 4 MB (S29JL032J)"
"insideGadgets 4 MiB (S29JL032J)"
],
"flash_ids":[
[ 0x01, 0x01, 0x56, 0x56 ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 4 MB (2× 2 MB), 32 KB FRAM, MBC5"
"insideGadgets 4 MiB (2× 2 MiB), 32 KiB FRAM, MBC5"
],
"voltage":5,
"flash_size":0x400000,

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 4 MB (MX29LV320ET)"
"insideGadgets 4 MiB (MX29LV320ET)"
],
"flash_ids":[
[ 0xC2, 0xC2, 0xA7, 0xA7 ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 128/256/512 KB"
"insideGadgets 128/256/512 KiB"
],
"flash_ids":[
[ 0xBF, 0xB5 ],

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets 8 MB"
"insideGadgets 8 MiB"
],
"flash_ids":[
[ 0x01, 0x01, 0x7E, 0x7E ]

View File

@ -1,7 +1,7 @@
{
"type":"DMG",
"names":[
"insideGadgets Power Cart 1 MB, 128 KB SRAM"
"insideGadgets Power Cart 1 MiB, 128 KiB SRAM"
],
"voltage":5,
"write_pin":"",

View File

@ -17,7 +17,7 @@ class GbxDevice:
DEVICE_NAME = "GBxCart RW"
DEVICE_MIN_FW = 1
DEVICE_MAX_FW = 10
DEVICE_LATEST_FW_TS = { 4:1683283512, 5:1681900614, 6:1681900614 }
DEVICE_LATEST_FW_TS = { 4:1686057604, 5:1681900614, 6:1681900614 }
DEVICE_CMD = {
"NULL":0x30,
@ -751,8 +751,6 @@ class GbxDevice:
if data["empty"] or data["empty_nocart"]:
data["rom_size"] = 0x2000000
elif (data["3d_memory"] == True):
data["rom_size"] = 0x4000000
else:
# Check where the ROM data repeats (for unlicensed carts)
size_check = header[0xA0:0xA0+16]
@ -1124,18 +1122,20 @@ class GbxDevice:
self._set_fw_variable("ADDRESS", address >> 1)
buffer = bytearray()
error = False
for _ in range(0, int(num / (buffer_size / length))): #32
for _ in range(0, int(buffer_size / length)): # 0x1000/0x200=8
self._write(self.DEVICE_CMD["AGB_CART_READ_3D_MEMORY"])
temp = self._read(length)
if isinstance(temp, int): temp = bytearray([temp])
if temp is False or len(temp) != length: return bytearray()
if temp is False or len(temp) != length:
error = True
buffer += temp
if self.INFO["action"] == self.ACTIONS["ROM_READ"] and not self.NO_PROG_UPDATE:
self.SetProgress({"action":"READ", "bytes_added":length})
if self.INFO["action"] == self.ACTIONS["ROM_READ"] and not self.NO_PROG_UPDATE:
self.SetProgress({"action":"READ", "bytes_added":length})
self._write(0)
if error: return bytearray()
return buffer
def ReadRAM(self, address, length, command=None, max_length=64):
@ -2042,6 +2042,7 @@ class GbxDevice:
self.FAST_READ = True
flashcart = False
#is_3dmemory = False
supported_carts = list(self.SUPPORTED_CARTS[self.MODE].values())
cart_type = copy.deepcopy(supported_carts[args["cart_type"]])
if not isinstance(cart_type, str):
@ -2129,6 +2130,8 @@ class GbxDevice:
else:
rom_banks = 1
rom_bank_size = 0x2000000
is_3dmemory = (self.MODE == "AGB" and "command_set" in cart_type and cart_type["command_set"] == "3DMEMORY")
if "verify_write" in args:
size = len(args["verify_write"])
@ -2153,7 +2156,7 @@ class GbxDevice:
max_length = self.MAX_BUFFER_LEN
dprint("Max buffer size: 0x{:X}".format(max_length))
if self.FAST_READ is True:
if (self.MODE == "AGB" and "command_set" in cart_type and cart_type["command_set"] == "3DMEMORY"):
if is_3dmemory:
max_length = min(max_length, 0x1000)
else:
max_length = min(max_length, 0x2000)
@ -2225,7 +2228,7 @@ class GbxDevice:
if self.CanPowerCycleCart(): self.CartPowerCycle()
return
if (self.MODE == "AGB" and "command_set" in cart_type and cart_type["command_set"] == "3DMEMORY"):
if is_3dmemory:
temp = self.ReadROM_3DMemory(address=pos, length=buffer_len, max_length=max_length)
else:
if self.FW["fw_ver"] >= 10 and "verify_write" in args and (self.MODE != "AGB" or args["verify_base_pos"] > 0xC9):
@ -2267,7 +2270,7 @@ class GbxDevice:
if (max_length >> 1) < 64:
dprint("Failed to receive 0x{:X} bytes from the device at position 0x{:X}.".format(buffer_len, pos_temp))
max_length = 64
elif lives > 18:
elif lives > 20:
dprint("Failed to receive 0x{:X} bytes from the device at position 0x{:X}.".format(buffer_len, pos_temp))
else:
dprint("Failed to receive 0x{:X} bytes from the device at position 0x{:X}. Decreasing maximum transfer buffer size to 0x{:X}.".format(buffer_len, pos_temp, max_length >> 1))

Binary file not shown.

Binary file not shown.

View File

@ -117,18 +117,19 @@ Use this command in a Terminal or Command Prompt window to launch the installed
- GB-CART32K-A with SST39SF020A
- GB Smart 32M
- HDR Game Boy Camera Flashcart
- insideGadgets 32 KB
- insideGadgets 128 KB
- insideGadgets 256 KB
- insideGadgets 512 KB
- insideGadgets 1 MB, 128 KB SRAM
- insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM
- insideGadgets 2 MB, 32 KB FRAM, v1.0
- insideGadgets 4 MB, 128 KB SRAM/FRAM
- insideGadgets 4 MB, 32 KB FRAM, MBC3+RTC
- insideGadgets 4 MB (2× 2 MB), 32 KB FRAM, MBC5
- insideGadgets 32 KiB
- insideGadgets 128 KiB
- insideGadgets 256 KiB
- insideGadgets 512 KiB
- insideGadgets 1 MiB, 128 KiB SRAM
- insideGadgets 2 MiB, 128 KiB SRAM/32 KiB FRAM
- insideGadgets 2 MiB, 32 KiB FRAM, v1.0
- insideGadgets 4 MiB, 128 KiB SRAM/FRAM
- insideGadgets 4 MiB, 32 KiB FRAM, MBC3+RTC
- insideGadgets 4 MiB (2× 2 MiB), 32 KiB FRAM, MBC5
- Mr Flash 64M
- Squareboi 4 MB (2× 2 MB)
- Sillyhatday MBC5-DUAL-FLASH-4/8MB
- Squareboi 4 MiB (2× 2 MiB)
- Game Boy Advance
@ -143,11 +144,11 @@ Use this command in a Terminal or Command Prompt window to launch the installed
- Flash2Advance Ultra 64M (with 2× 28F320C3B)
- Flash2Advance Ultra 256M (with 8× 3204C3B100)
- Flash Advance Card 64M (with 28F640J3A120)
- insideGadgets 16 MB, 64K EEPROM with Solar Sensor and RTC options
- insideGadgets 32 MB, 1M FLASH with RTC option
- insideGadgets 32 MB, 512K FLASH
- insideGadgets 32 MB, 4K/64K EEPROM
- insideGadgets 32 MB, 256K FRAM with Rumble option
- insideGadgets 16 MiB, 64K EEPROM with Solar Sensor and RTC options
- insideGadgets 32 MiB, 1M FLASH with RTC option
- insideGadgets 32 MiB, 512K FLASH
- insideGadgets 32 MiB, 4K/64K EEPROM
- insideGadgets 32 MiB, 256K FRAM with Rumble option
### Currently supported and tested reproduction cartridges
@ -186,6 +187,7 @@ Use this command in a Terminal or Command Prompt window to launch the installed
- SD007_BV5_V3 with HY29LV160BT-70
- SD007_BV5_V3 with AM29LV160MB
- SD007_K8D3216_32M with MX29LV160CT
- SD007_T40_48BALL_71_TV_TS28 with M29W640
- SD007_T40_64BALL_S71_TV_TS28 with TC58FVB016FT-85
- SD007_T40_64BALL_SOJ28 with 29LV016T
- SD007_T40_64BALL_TSOP28 with 29LV016T
@ -269,6 +271,7 @@ Use this command in a Terminal or Command Prompt window to launch the installed
- MSP54LV512 (no PCB text)
- MX29GL128EHT2I and ALTERA CPLD
- SUN100S_MSP54XXX with MSP54LV100
- Unknown 29LV320 variant (no PCB text)"
Many different reproduction cartridges share their flash chip command set, so even if yours is not on this list, it may still work fine or even be auto-detected as another one. Support for more cartridges can also be added by creating external config files that include the necessary flash chip commands.
@ -304,7 +307,7 @@ Many different reproduction cartridges share their flash chip command set, so ev
The author would like to thank the following very kind people for their help, contributions or documentation (in alphabetical order):
2358, 90sFlav, AcoVanConis, AdmirtheSableye, AlexiG, ALXCO-Hardware, AndehX, antPL, bbsan, BennVenn, ccs21, ClassicOldSong, CodyWick13, Corborg, Cristóbal, crizzlycruz, Därk, Davidish, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, Jayro, Jenetrix, JFox, joyrider3774, JS7457, julgr, Kaede, KOOORAY, kscheel, kyokohunter, litlemoran, LovelyA72, Luca DS, LucentW, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, orangeglo, paarongiroux, Paradoxical, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, sillyhatday, Sithdown, skite2001, Smelly-Ghost, Stitch, Super Maker, t5b6_de, Tauwasser, Timville, twitnic, velipso, Veund, voltagex, Voultar, wickawack, Wkr, x7l7j8cc, xactoes, yosoo, Zeii, Zelante, zvxr
2358, 90sFlav, AcoVanConis, AdmirtheSableye, AlexiG, ALXCO-Hardware, AndehX, antPL, bbsan, BennVenn, ccs21, ClassicOldSong, CodyWick13, Corborg, Cristóbal, crizzlycruz, Därk, Davidish, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, Jayro, Jenetrix, JFox, joyrider3774, JS7457, julgr, Kaede, KOOORAY, kscheel, kyokohunter, litlemoran, LovelyA72, Luca DS, LucentW, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, orangeglo, paarongiroux, Paradoxical, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, Sillyhatday, Sithdown, skite2001, Smelly-Ghost, Stitch, Super Maker, t5b6_de, Tauwasser, Timville, twitnic, velipso, Veund, voltagex, Voultar, wickawack, Wkr, x7l7j8cc, xactoes, yosoo, Zeii, Zelante, Zoo, zvxr
## DISCLAIMER

View File

@ -8,7 +8,7 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read(
setuptools.setup(
name="FlashGBX",
version="3.29",
version="3.30",
author="Lesserkuma",
description="Reads and writes Game Boy and Game Boy Advance cartridge data using the GBxCart RW by insideGadgets",
url="https://github.com/lesserkuma/FlashGBX",