diff --git a/CHANGES.md b/CHANGES.md
index 29524f2..6a9b903 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,4 +1,13 @@
# Release notes
+### v3.1 (released 2021-12-01)
+- Added support for the GBxCart RW Mini v1.0d hardware revision
+- Added support for insideGadgets 4 MB (2× 2 MB), 32 KB FRAM, MBC5 flash cartridges *(thanks AlexiG)*
+- Bundles GBxCart RW v1.4 firmware version R33+L4 (fixes an issue with accessing save data of some FRAM cartridge modifications)
+- Added support for SD007_TSOP_48BALL with AM29LV160DT *(thanks crizzlycruz)*
+- Confirmed support for SD007_TSOP_48BALL_V10 with 29LV320CTXEI *(thanks marv17)*
+- Added support for AA1030_TSOP88BALL with M36W0R603 *(thanks LucentW)*
+- Added support for Ferrante Crafts cart with SST39SF010A *(thanks skite2001)*
+
### v3.0 (released 2021-11-15)
- Added support for the GBxCart RW v1.4a hardware revision
- Bundles GBxCart RW v1.4 firmware version R32+L3 (improves ROM writing speed for Development AGB Cartridge 256M Flash S, E201868)
diff --git a/FlashGBX/FlashGBX_GUI.py b/FlashGBX/FlashGBX_GUI.py
index 483c298..0d5c908 100644
--- a/FlashGBX/FlashGBX_GUI.py
+++ b/FlashGBX/FlashGBX_GUI.py
@@ -645,11 +645,10 @@ class FlashGBX_GUI(QtWidgets.QWidget):
self.btnConfig.setEnabled(True)
self.btnCancel.setEnabled(False)
- if self.CONN.CanPowerCycleCart():
- self.mnuConfig.actions()[6].setEnabled(True)
- else:
- self.mnuConfig.actions()[6].setEnabled(False)
- self.mnuConfig.actions()[6].setChecked(False)
+ # Firmware Update Menu
+ self.mnuTools.actions()[2].setEnabled(True)
+ if self.CONN.SupportsFirmwareUpdates() is False:
+ self.mnuTools.actions()[2].setEnabled(False)
self.SetProgressBars(min=0, max=1, value=0)
@@ -1727,7 +1726,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
# Save Type
msg_save_type_s = ""
- if not canSkipMessage and save_type is not False:
+ if not canSkipMessage and save_type is not False and save_type is not None:
if save_chip is not None:
temp = "{:s} ({:s})".format(Util.AGB_Header_Save_Types[save_type], save_chip)
else:
@@ -2030,7 +2029,11 @@ class FlashGBX_GUI(QtWidgets.QWidget):
except:
return False
else:
- FirmwareUpdater = self.CONN.GetFirmwareUpdaterClass()[1]
+ if not self.CONN.SupportsFirmwareUpdates():
+ QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "{:s} currently does not support updaing the firmware of your device.".format(APPNAME), QtWidgets.QMessageBox.Ok)
+ return False
+ else:
+ FirmwareUpdater = self.CONN.GetFirmwareUpdaterClass()[1]
self.FWUPWIN = None
self.FWUPWIN = FirmwareUpdater(self, app_path=self.APP_PATH, icon=self.windowIcon(), device=self.CONN)
self.FWUPWIN.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
diff --git a/FlashGBX/Util.py b/FlashGBX/Util.py
index 457c585..0045610 100644
--- a/FlashGBX/Util.py
+++ b/FlashGBX/Util.py
@@ -7,7 +7,7 @@ from enum import Enum
# Common constants
APPNAME = "FlashGBX"
-VERSION_PEP440 = "3.0"
+VERSION_PEP440 = "3.1"
VERSION = "v{:s}".format(VERSION_PEP440)
DEBUG = False
diff --git a/FlashGBX/config/fc_AGB_M36W0R603.txt b/FlashGBX/config/fc_AGB_M36W0R603.txt
new file mode 100644
index 0000000..b93b445
--- /dev/null
+++ b/FlashGBX/config/fc_AGB_M36W0R603.txt
@@ -0,0 +1,59 @@
+{
+ "type":"AGB",
+ "names":[
+ "AA1030_TSOP88BALL with M36W0R603"
+ ],
+ "flash_ids":[
+ [ 0x20, 0x00, 0x10, 0x88 ]
+ ],
+ "voltage":3.3,
+ "flash_size":0x800000,
+ "sector_size_from_cfi":true,
+ "reset_every":0x100000,
+ "command_set":"INTEL",
+ "commands":{
+ "reset":[
+ [ 0, 0x50 ],
+ [ 0, 0xFF ]
+ ],
+ "read_identifier":[
+ [ 0, 0x90 ]
+ ],
+ "sector_erase":[
+ [ "SA", 0x60 ],
+ [ "SA", 0xD0 ],
+ [ "SA", 0x20 ],
+ [ "SA", 0xD0 ]
+ ],
+ "sector_erase_wait_for":[
+ [ null, null, null ],
+ [ null, null, null ],
+ [ null, null, null ],
+ [ "SA", 0x80, 0xFFFF ]
+ ],
+ "buffer_write":[
+ [ "SA", 0xE8 ],
+ [ "SA", "BS" ],
+ [ "PA", "PD" ],
+ [ "SA", 0xD0 ],
+ [ "SA", 0xFF ]
+ ],
+ "buffer_write_wait_for":[
+ [ "SA", 0x80, 0xFFFF ],
+ [ null, null, null ],
+ [ null, null, null ],
+ [ "SA", 0x80, 0xFFFF ],
+ [ null, null, null ]
+ ],
+ "single_write":[
+ [ 0, 0x70 ],
+ [ 0, 0x10 ],
+ [ "PA", "PD" ]
+ ],
+ "single_write_wait_for":[
+ [ 0, 0x80, 0x80 ],
+ [ null, null, null ],
+ [ null, null, null ]
+ ]
+ }
+}
diff --git a/FlashGBX/config/fc_DMG_AM29LV160MB.txt b/FlashGBX/config/fc_DMG_AM29LV160MB.txt
index 3699be0..0477f98 100644
--- a/FlashGBX/config/fc_DMG_AM29LV160MB.txt
+++ b/FlashGBX/config/fc_DMG_AM29LV160MB.txt
@@ -6,7 +6,8 @@
"SD007_TSOP_48BALL with AM29LV160DB",
"2006_TSOP_64BALL_QFP48 with AL016J55FFAR2",
"SD007_TSOP_64BALL_SOP28 with unlabeled flash chip",
- "SD007_TSOP_29LV017D with L017D70VC"
+ "SD007_TSOP_29LV017D with L017D70VC",
+ "SD007_TSOP_48BALL with AM29LV160DT"
],
"flash_ids":[
[ 0x02, 0x02, 0x4A, 0x4A ],
@@ -14,7 +15,8 @@
[ 0x02, 0x02, 0x4A, 0x4A ],
[ 0x02, 0x02, 0x4A, 0x4A ],
[ 0x02, 0x02, 0x4A, 0x4A ],
- [ 0x02, 0xC8, 0x00, 0x00 ]
+ [ 0x02, 0xC8, 0x00, 0x00 ],
+ [ 0x02, 0x02, 0xC4, 0xC4 ]
],
"voltage":3.3,
"flash_size":0x200000,
diff --git a/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt b/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt
index cdff2c4..e3695ac 100644
--- a/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt
+++ b/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt
@@ -2,11 +2,13 @@
"type":"DMG",
"names":[
"DIY cart with AT49F040 @ AUDIO",
- "GB-CART32K-A with SST39SF020A"
+ "GB-CART32K-A with SST39SF020A",
+ "Ferrante Crafts cart with SST39SF010A"
],
"flash_ids":[
[ 0x1F, 0x13, 0xFE, 0xFF ],
- [ 0xBF, 0xB6, 0x01, 0xFF ]
+ [ 0xBF, 0xB6, 0x01, 0xFF ],
+ [ 0xBF, 0xB5, 0x01, 0xFF ]
],
"voltage":5,
"flash_size":0x8000,
diff --git a/FlashGBX/config/fc_DMG_MX29LV320BTC.txt b/FlashGBX/config/fc_DMG_MX29LV320BTC.txt
index 96ddfa8..b8f61d0 100644
--- a/FlashGBX/config/fc_DMG_MX29LV320BTC.txt
+++ b/FlashGBX/config/fc_DMG_MX29LV320BTC.txt
@@ -2,10 +2,12 @@
"type":"DMG",
"names":[
"SD007_BV5_V2 with MX29LV320BTC",
- "SD007_TSOP_48BALL_V8 with 29LV320CTTC"
+ "SD007_TSOP_48BALL_V8 with 29LV320CTTC",
+ "SD007_TSOP_48BALL_V10 with 29LV320CTXEI"
],
"flash_ids":[
[ 0xC1, 0xC1, 0xA8, 0xA8 ],
+ [ 0xC1, 0xC1, 0xA7, 0xA7 ],
[ 0xC1, 0xC1, 0xA7, 0xA7 ]
],
"voltage":3.3,
diff --git a/FlashGBX/hw_GBxCartRW.py b/FlashGBX/hw_GBxCartRW.py
index 90516a0..b3ba4f2 100644
--- a/FlashGBX/hw_GBxCartRW.py
+++ b/FlashGBX/hw_GBxCartRW.py
@@ -15,7 +15,7 @@ from . import Util
class GbxDevice:
DEVICE_NAME = "GBxCart RW"
DEVICE_MIN_FW = 1
- DEVICE_MAX_FW = 3
+ DEVICE_MAX_FW = 4
DEVICE_CMD = {
"NULL":0x30,
@@ -80,7 +80,7 @@ class GbxDevice:
"DMG_WRITE_CS_PULSE":[8, 0x09],
}
- PCB_VERSIONS = {4:'v1.3', 5:'v1.4', 6:'v1.4a'}
+ PCB_VERSIONS = {4:'v1.3', 5:'v1.4', 6:'v1.4a', 101:'Mini v1.0d'}
ACTIONS = {"ROM_READ":1, "SAVE_READ":2, "SAVE_WRITE":3, "ROM_WRITE":4, "ROM_WRITE_VERIFY":4}
SUPPORTED_CARTS = {}
@@ -135,7 +135,7 @@ class GbxDevice:
self.DEVICE = None
self.BAUDRATE = 1000000
return False
- elif max_baud >= 1700000 and self.FW["pcb_ver"] in (5, 6) and self.BAUDRATE < 1700000:
+ elif max_baud >= 1700000 and self.FW["pcb_ver"] in (5, 6, 101) and self.BAUDRATE < 1700000:
# Switch to higher baud rate
self._write(self.DEVICE_CMD["OFW_USART_1_7M_SPEED"])
self.BAUDRATE = 1700000
@@ -166,7 +166,7 @@ class GbxDevice:
elif self.FW["fw_ver"] > self.DEVICE_MAX_FW:
conn_msg.append([0, "NOTE: The GBxCart RW device on port " + ports[i] + " is running a firmware version that is newer than what this version of FlashGBX was developed to work with, so errors may occur."])
- if (self.FW["pcb_ver"] not in (4, 5, 6)): # only the v1.3 and v1.4/v1.4a pcb revisions are supported
+ if (self.FW["pcb_ver"] not in (4, 5, 6, 101)): # only the v1.3, v1.4, v1.4a, Mini v1.1 PCB revisions are supported
dev.close()
self.DEVICE = None
return False
@@ -238,7 +238,10 @@ class GbxDevice:
return self.FW["pcb_ver"] in (5, 6)
def GetSupprtedModes(self):
- return ["DMG", "AGB"]
+ if self.FW["pcb_ver"] == 101:
+ return ["DMG"]
+ else:
+ return ["DMG", "AGB"]
def IsSupportedMbc(self, mbc):
return mbc in ( 0x00, 0x01, 0x02, 0x03, 0x06, 0x0B, 0x0D, 0x10, 0x13, 0x19, 0x1A, 0x1B, 0x1C, 0x1E, 0x20, 0x22, 0xFC, 0xFD, 0xFE, 0xFF, 0x101, 0x103, 0x104, 0x105 )
@@ -247,7 +250,7 @@ class GbxDevice:
return True
def IsClkConnected(self):
- return self.FW["pcb_ver"] in (5, 6)
+ return self.FW["pcb_ver"] in (5, 6, 101)
def UpdateFlashCarts(self, flashcarts):
self.SUPPORTED_CARTS = {
@@ -275,7 +278,7 @@ class GbxDevice:
def Close(self):
if self.IsConnected():
try:
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
self._write(self.DEVICE_CMD["OFW_CART_MODE"])
self._read(1)
self._write(self.DEVICE_CMD["OFW_CART_PWR_OFF"])
@@ -289,7 +292,7 @@ class GbxDevice:
return "GBxCart RW"
def GetFirmwareVersion(self, more=False):
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
s = "R{:d}+{:s}{:d}".format(self.FW["ofw_ver"], self.FW["cfw_id"], self.FW["fw_ver"])
else:
s = "{:s}{:d}".format(self.FW["cfw_id"], self.FW["fw_ver"])
@@ -467,7 +470,7 @@ class GbxDevice:
print("Error!")
def _clk_toggle(self, num):
- if self.FW["pcb_ver"] not in (5, 6): return False
+ if self.FW["pcb_ver"] not in (5, 6, 101): return False
for _ in range(0, num):
self._write(self.DEVICE_CMD["CLK_HIGH"])
self._write(self.DEVICE_CMD["CLK_LOW"])
@@ -526,7 +529,7 @@ class GbxDevice:
self.POS = 0
self.SIGNAL = None
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
self._write(self.DEVICE_CMD["OFW_CART_MODE"]) # Reset LEDs
self._read(1)
self.CartPowerOn()
@@ -537,7 +540,7 @@ class GbxDevice:
self._set_fw_variable("DMG_READ_CS_PULSE", 0)
self._set_fw_variable("DMG_WRITE_CS_PULSE", 0)
elif self.MODE == "AGB":
- if self.FW["pcb_ver"] in (5, 6) and self.FW["fw_ver"] > 1:
+ if self.FW["pcb_ver"] in (5, 6, 101) and self.FW["fw_ver"] > 1:
self._write(self.DEVICE_CMD["AGB_BOOTUP_SEQUENCE"], wait=True)
header = self.ReadROM(0, 0x180)
@@ -548,7 +551,7 @@ class GbxDevice:
with open("debug_header.bin", "wb") as f: f.write(header)
# Unlock DACS carts on older firmware
- if self.MODE == "AGB" and (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] == 1):
+ if self.MODE == "AGB" and (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] == 1):
if header[0x04:0x04+0x9C] == bytearray([0x00] * 0x9C):
self.ReadROM(0x1FFFFE0, 20)
header = self.ReadROM(0, 0x180)
@@ -573,7 +576,7 @@ class GbxDevice:
elif self.MODE == "AGB":
data = RomFileAGB(header).GetHeader()
- if data["logo_correct"] is False: # try to fix weird bootlegs
+ if data["logo_correct"] is False: # workaround for weird bootlegs
self._cart_write(0, 0xFF)
time.sleep(0.1)
header = self.ReadROM(0, 0x180)
@@ -1018,7 +1021,7 @@ class GbxDevice:
def WriteROM(self, address, buffer, flash_buffer_size=False, skip_init=False, rumble_stop=False):
length = len(buffer)
- if self.FW["pcb_ver"] not in (5, 6):
+ if self.FW["pcb_ver"] not in (5, 6, 101):
max_length = 256
else:
max_length = 1024
@@ -1268,7 +1271,7 @@ class GbxDevice:
return (flash_types, flash_type_id, flash_id, cfi_s, cfi)
def CheckFlashChip(self, limitVoltage=False, cart_type=None): # aka. the most horribly written function
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
self._write(self.DEVICE_CMD["OFW_CART_MODE"])
self._read(1)
self.CartPowerOn()
@@ -1916,7 +1919,7 @@ class GbxDevice:
if self.MODE == "DMG" and _mbc.GetName() == "MBC7":
self.WriteEEPROM_MBC7(address=pos, buffer=buffer[buffer_offset:buffer_offset+buffer_len])
elif self.MODE == "DMG" and _mbc.GetName() == "MBC6" and bank > 7: # MBC6 flash save memory
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
self.WriteROM(address=pos, buffer=buffer[buffer_offset:buffer_offset+buffer_len])
self._cart_write(pos + buffer_len - 1, 0xF0)
else:
@@ -2074,12 +2077,12 @@ class GbxDevice:
elif cart_type["type"] == "DMG" and "write_pin" in cart_type and cart_type["write_pin"] == "WR+RESET":
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is currently not supported by FlashGBX. Please try the official GBxCart RW interface software available from https://www.gbxcart.com/ instead.", "abortable":False})
return False
- elif (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] < 2) and ("pulse_reset_after_write" in cart_type and cart_type["pulse_reset_after_write"] is True):
- self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is only supported by FlashGBX using GBxCart RW v1.4 and firmware version R31+L2 or higher. You can also try the official GBxCart RW firmware and interface software available from https://www.gbxcart.com/ instead.", "abortable":False})
+ elif (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] < 2) and ("pulse_reset_after_write" in cart_type and cart_type["pulse_reset_after_write"] is True):
+ self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is not supported by FlashGBX using your GBxCart RW hardware revision and/or firmware version. You can also try the official GBxCart RW firmware and interface software available from https://www.gbxcart.com/ instead.", "abortable":False})
return False
# Firmware check L1
# Firmware check L2
- elif (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] < 3) and ("command_set" in cart_type and cart_type["command_set"] == "SHARP") and ("buffer_write" in cart_type["commands"]):
+ elif (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] < 3) and ("command_set" in cart_type and cart_type["command_set"] == "SHARP") and ("buffer_write" in cart_type["commands"]):
if self.FW["pcb_ver"] in (5, 6):
print("NOTE: Update your GBxCart RW firmware to version L3 or higher for a better transfer rate with this cartridge.")
del(cart_type["commands"]["buffer_write"])
@@ -2178,7 +2181,7 @@ class GbxDevice:
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is currently not supported for ROM flashing.", "abortable":False})
return False
- if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] not in (5, 6):
+ if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] not in (5, 6, 101):
self._set_fw_variable("FLASH_WE_PIN", 0x01)
dprint("Using GB Memory mode on GBxCart RW v1.3")
else:
@@ -2195,7 +2198,7 @@ class GbxDevice:
[ "SA", 0xFF ]
]
dprint("Using Flash2Advance mode with a buffer of {:d} bytes".format(flash_buffer_size))
- elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6):
+ elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6, 101):
self._write(0x03) # FLASH_METHOD_DMG_MMSA
dprint("Using GB Memory mode on GBxCart RW v1.4")
elif flashcart.SupportsBufferWrite() and flash_buffer_size > 0:
@@ -2355,7 +2358,7 @@ class GbxDevice:
if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] < 5:
status = self.WriteROM_GBMEMORY(address=pos, buffer=data_import[buffer_pos:buffer_pos+buffer_len], bank=bank)
- elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6):
+ elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6, 101):
status = self.WriteROM(address=pos, buffer=data_import[buffer_pos:buffer_pos+buffer_len], flash_buffer_size=flash_buffer_size, skip_init=(skip_init and not self.SKIPPING))
self._cart_write(pos + buffer_len - 1, 0xF0)
else:
@@ -2440,7 +2443,7 @@ class GbxDevice:
def TransferData(self, args, signal):
self.ERROR = False
if self.IsConnected():
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
self._write(self.DEVICE_CMD["OFW_CART_MODE"])
self._read(1)
self.CartPowerOn()
@@ -2452,7 +2455,7 @@ class GbxDevice:
elif args['mode'] == 3: ret = self._BackupRestoreRAM(args)
elif args['mode'] == 4: ret = self._FlashROM(args)
- if self.FW["pcb_ver"] in (5, 6):
+ if self.FW["pcb_ver"] in (5, 6, 101):
if ret is True:
self._write(self.DEVICE_CMD["OFW_DONE_LED_ON"])
elif self.ERROR is True:
diff --git a/FlashGBX/hw_GBxCartRW_ofw.py b/FlashGBX/hw_GBxCartRW_ofw.py
index 67a087d..3994390 100644
--- a/FlashGBX/hw_GBxCartRW_ofw.py
+++ b/FlashGBX/hw_GBxCartRW_ofw.py
@@ -117,7 +117,7 @@ class GbxDevice:
"CART_PWR_OFF":'.',
"QUERY_CART_PWR":']'
}
- PCB_VERSIONS = {1:'v1.0', 2:'v1.1', 4:'v1.3', 90:'XMAS', 100:'Mini'}
+ PCB_VERSIONS = {1:'v1.0', 2:'v1.1', 4:'v1.3', 90:'XMAS', 100:'Mini v1.0', 101:'Mini v1.0d'}
SUPPORTED_CARTS = {}
FW = []
diff --git a/FlashGBX/res/config.zip b/FlashGBX/res/config.zip
index 0544ab7..1c66a7d 100644
Binary files a/FlashGBX/res/config.zip and b/FlashGBX/res/config.zip differ
diff --git a/FlashGBX/res/fw_GBxCart_RW_v1_4.zip b/FlashGBX/res/fw_GBxCart_RW_v1_4.zip
index bcfc50c..30840ab 100644
Binary files a/FlashGBX/res/fw_GBxCart_RW_v1_4.zip and b/FlashGBX/res/fw_GBxCart_RW_v1_4.zip differ
diff --git a/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip b/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip
index 41eb8b9..45a2a91 100644
Binary files a/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip and b/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip differ
diff --git a/README.md b/README.md
index 75a7f19..1dd1df6 100644
--- a/README.md
+++ b/README.md
@@ -18,9 +18,9 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https://
### Confirmed working reader/writer hardware and firmware versions
-- [insideGadgets GBxCart RW Mini, v1.3 and v1.4 (Standard and Pro versions)](https://www.gbxcart.com/)
- - Official firmware versions R30 to R32 (other hardware revisions and firmware versions may also work, but are untested)
- - Lesserkuma’s high compatibility firmware versions L1 to L3
+- [insideGadgets GBxCart RW v1.3, v1.4 and Mini](https://www.gbxcart.com/)
+ - Official firmware versions R30 to R33 (other hardware revisions and firmware versions may also work, but are untested)
+ - Lesserkuma’s high compatibility firmware versions L1 to L4
### Currently supported official cartridge memory mappers
@@ -58,6 +58,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https://
- DIY cart with AT49F040
- DIY cart with MBC1 and AM29F080
- DIY cart with MBC3 and MX29LV640
+ - Ferrante Crafts cart with SST39SF010A
- GB-CART32K-A with SST39SF020A
- GB Smart 32M
- insideGadgets 32 KB
@@ -122,6 +123,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https://
- SD007_TSOP_48BALL with L160DB12VI
- SD007_TSOP_48BALL_V9 with 29LV160CBTC-70G
- SD007_TSOP_48BALL_V10 with 29DL32TF-70
+ - SD007_TSOP_48BALL_V10 with 29LV320CTXEI
- SD007_TSOP_48BALL_V10 with GL032M10BFIR3
- SD007_TSOP_48BALL_V10 with M29W320DT
- SD007_TSOP_64BALL_SOP28 with EN29LV160AB-70TCP
@@ -145,6 +147,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https://
- 4050_4400_4000_4350_36L0R_V5 with M36L0R8060T
- 4400 with 4400L0ZDQ0
- 4455_4400_4000_4350_36L0R_V3 with M36L0R7050T
+ - AA1030_TSOP88BALL with M36W0R603
- AGB-E05-01 with GL128S
- AGB-E05-01 with MSP55LV128M
- AGB-E05-01 with MX29GL128FHT2I-90G
@@ -186,7 +189,7 @@ Available in the GitHub [Releases](https://github.com/lesserkuma/FlashGBX/releas
1. Download and install [Python](https://www.python.org/downloads/) (version 3.7 or higher)
2. Open a Terminal or Command Prompt window
3. Install or upgrade FlashGBX with this command:
`pip3 install -U FlashGBX`
-* If you see an error about a conflict involving PySide2, try these commands instead:
`pip3 install pyserial Pillow setuptools requests python-dateutil`
`pip3 install --no-deps -U FlashGBX`
`pip3 install -U PySide2 --ignore-requires-python`
+* If you see an error about a conflict involving PySide2, try these commands instead:
`pip3 install pyserial Pillow setuptools requests python-dateutil`
`pip3 install --no-deps -U FlashGBX`
`pip3 install --ignore-requires-python -U PySide2`
* Pre-made Linux packages and instructions for select distributions are available [here](https://github.com/JJ-Fox/FlashGBX-Linux-builds/releases/latest).
@@ -234,6 +237,7 @@ The author would like to thank the following very kind people for their help and
- antPL (flash chip info)
- bbsan (flash chip info)
- ClassicOldSong (bug reports)
+- crizzlycruz (flash chip info)
- djedditt (testing)
- dyf2007 (flash chip info)
- easthighNerd (feature suggestions)
diff --git a/setup.py b/setup.py
index 084f2ec..cad169e 100644
--- a/setup.py
+++ b/setup.py
@@ -4,9 +4,9 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read(
setuptools.setup(
name="FlashGBX",
- version="3.0",
+ version="3.1",
author="Lesserkuma",
- description="Reads and writes Game Boy and Game Boy Advance cartridge data. Currently supports the GBxCart RW hardware device by insideGadgets.",
+ description="Reads and writes Game Boy and Game Boy Advance cartridge data. Supported hardware: GBxCart RW v1.3 and v1.4 by insideGadgets.",
url="https://github.com/lesserkuma/FlashGBX",
packages=setuptools.find_packages(),
install_requires=['PySide2', 'pyserial', 'Pillow', 'setuptools', 'requests', 'python-dateutil'],