mirror of
https://github.com/lesserkuma/FlashGBX.git
synced 2026-08-24 17:55:26 -05:00
2.3
This commit is contained in:
@@ -1,4 +1,12 @@
|
||||
# Release notes
|
||||
### v2.3 (released 2021-06-08)
|
||||
- Added support for AGB-E05-06L with 29LV128DBT2C-90Q *(thanks marv17)*
|
||||
- Nintendo Power GB Memory Cartridges will now be unlocked properly even if they’re stuck in erase mode *(thanks Grender for testing)*
|
||||
- Confirmed support for SD007_TSOP_48BALL_V10 with GL032M10BFIR3 *(thanks Mr_V)*
|
||||
- Added support for 2006_TSOP_64BALL_6106 with W29GL128SH9B *(thanks marv17)*
|
||||
- Fixed support for insideGadgets 1 MB, 128 KB SRAM *(thanks AlexiG)*
|
||||
- The [setup package](https://github.com/lesserkuma/FlashGBX/releases) now includes the CH341 USB serial driver for insideGadgets GBxCart RW devices
|
||||
|
||||
### v2.2 (released 2021-06-03)
|
||||
- Added support for insideGadgets 2 MB, 32 KB FRAM, v1.0 *(thanks t5b6_de)*
|
||||
- Added support for SD007_TSOP_29LV017D with M29W320DT *(thanks marv17)*
|
||||
|
||||
@@ -33,7 +33,7 @@ def LoadConfig(args):
|
||||
(config_version, fc_files) = ReadConfigFiles(args=args)
|
||||
if config_version != Util.VERSION:
|
||||
# Rename old files that have since been replaced/renamed/merged
|
||||
deprecated_files = [ "fc_AGB_M36L0R705.txt", "fc_AGB_TEST.txt", "fc_DMG_TEST.txt", "fc_AGB_Nintendo_E201850.txt", "fc_AGB_Nintendo_E201868.txt", "config.ini", "fc_DMG_MX29LV320ABTC.txt", "fc_DMG_iG_4MB_MBC3_RTC.txt", "fc_AGB_Flash2Advance.txt" ]
|
||||
deprecated_files = [ "fc_AGB_M36L0R705.txt", "fc_AGB_TEST.txt", "fc_DMG_TEST.txt", "fc_AGB_Nintendo_E201850.txt", "fc_AGB_Nintendo_E201868.txt", "config.ini", "fc_DMG_MX29LV320ABTC.txt", "fc_DMG_iG_4MB_MBC3_RTC.txt", "fc_AGB_Flash2Advance.txt", "fc_AGB_MX29LV640_AUDIO.txt" ]
|
||||
for file in deprecated_files:
|
||||
if os.path.exists(config_path + "/" + file):
|
||||
os.rename(config_path + "/" + file, config_path + "/" + file + "_" + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + ".bak")
|
||||
@@ -79,8 +79,8 @@ def main(portableMode=False):
|
||||
os.environ['QT_MAC_WANTS_LAYER'] = '1'
|
||||
|
||||
print("{:s} {:s} by Lesserkuma".format(Util.APPNAME, Util.VERSION))
|
||||
print("https://github.com/lesserkuma/FlashGBX")
|
||||
print("\nDISCLAIMER: This software is provided as-is and the developer is not responsible for any damage that is caused by the use of it. Use at your own risk!")
|
||||
print("\nFor troubleshooting please visit https://github.com/lesserkuma/FlashGBX\n")
|
||||
|
||||
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
||||
app_path = os.path.dirname(sys.executable)
|
||||
|
||||
@@ -486,6 +486,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
|
||||
self.SETTINGS.setValue("UpdateCheck", "disabled")
|
||||
|
||||
if update_check and update_check.lower() == "enabled":
|
||||
print("")
|
||||
if ".dev" in VERSION_PEP440:
|
||||
type = "test "
|
||||
url = "https://test.pypi.org/pypi/FlashGBX/json"
|
||||
@@ -933,7 +934,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
|
||||
if answer == QtWidgets.QMessageBox.Yes:
|
||||
(flash_id, cfi_s, cfi) = self.CONN.CheckFlashChip(limitVoltage)
|
||||
if cfi_s == "":
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre>There was no Common Flash Interface (CFI) response from the cartridge. It may be too old, not reflashable or the cartridge may not be seated correctly.", QtWidgets.QMessageBox.Ok)
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre>This cartridge does not provide Common Flash Interface (CFI) information.", QtWidgets.QMessageBox.Ok)
|
||||
else:
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre><pre>" + str(cfi_s) + "</pre>", QtWidgets.QMessageBox.Ok)
|
||||
with open(self.CONFIG_PATH + "/cfi.bin", "wb") as f: f.write(cfi['raw'])
|
||||
@@ -999,7 +1000,7 @@ class FlashGBX_GUI(QtWidgets.QWidget):
|
||||
if msgbox.clickedButton() == button_cfi:
|
||||
(flash_id, cfi_s, cfi) = self.CONN.CheckFlashChip(limitVoltage=limitVoltage, cart_type=cart_types[1][cart_type] if cart_type != 0 else None)
|
||||
if cfi_s == "" or cfi == False:
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre>There was no Common Flash Interface (CFI) response from the cartridge. If a flash chip exists on the cartridge PCB, it may be too old or require unique unlocking and handling.", QtWidgets.QMessageBox.Ok)
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre>This cartridge does not provide Common Flash Interface (CFI) information.", QtWidgets.QMessageBox.Ok)
|
||||
else:
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "Flash chip query result: <pre>" + flash_id + "</pre><pre>" + str(cfi_s) + "</pre>", QtWidgets.QMessageBox.Ok)
|
||||
with open(self.CONFIG_PATH + "/cfi.bin", "wb") as f: f.write(cfi['raw'])
|
||||
|
||||
@@ -699,7 +699,7 @@ class Flashcart_DMG_MMSA(Flashcart):
|
||||
[ 0x120, 0x09 ],
|
||||
[ 0x121, 0xAA ],
|
||||
[ 0x122, 0x55 ],
|
||||
[ 0x13F, 0xa5 ],
|
||||
[ 0x13F, 0xA5 ],
|
||||
]
|
||||
self.CartWrite(cmds)
|
||||
# Re-Enable writes to MBC registers
|
||||
@@ -720,6 +720,16 @@ class Flashcart_DMG_MMSA(Flashcart):
|
||||
self.CartWrite(cmds)
|
||||
self.CartWrite([[ 0x2100, 0x01 ]])
|
||||
|
||||
# Suspend potential previous erase
|
||||
cmds = [
|
||||
[ 0x120, 0x0F ],
|
||||
[ 0x125, 0x00 ],
|
||||
[ 0x126, 0x00 ],
|
||||
[ 0x127, 0xB0 ],
|
||||
[ 0x13F, 0xA5 ],
|
||||
]
|
||||
self.CartWrite(cmds)
|
||||
|
||||
# Unlock Hidden Sector
|
||||
cmds = [
|
||||
[ 0x120, 0x0F ],
|
||||
|
||||
@@ -7,7 +7,7 @@ from enum import Enum
|
||||
|
||||
# Common constants
|
||||
APPNAME = "FlashGBX"
|
||||
VERSION_PEP440 = "2.2"
|
||||
VERSION_PEP440 = "2.3"
|
||||
VERSION = "v{:s}".format(VERSION_PEP440)
|
||||
DEBUG = False
|
||||
|
||||
|
||||
@@ -2,16 +2,18 @@
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"AGB-E08-09 with 29LV128DTMC-90Q",
|
||||
"AGB-E05-01 with MX29GL128FHT2I-90G"
|
||||
"AGB-E05-01 with MX29GL128FHT2I-90G",
|
||||
"AGB-E05-06L with 29LV128DBT2C-90Q"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xC1, 0x00, 0x7D, 0x22 ],
|
||||
[ 0xC1, 0x00, 0x7D, 0x22 ]
|
||||
[ 0xC1, 0x00, 0x7D, 0x22 ],
|
||||
[ 0xC1, 0x00, 0x79, 0x22 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
"sector_size_from_cfi":true,
|
||||
"chip_erase_timeout":120,
|
||||
"chip_erase_timeout":150,
|
||||
"command_set":"AMD",
|
||||
"commands":{
|
||||
"reset":[
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
"BX2006_TSOP_64BALL with GL128S",
|
||||
"BX2006_TSOPBGA_0106 with M29W640GB6AZA6",
|
||||
"AGB-E05-02 with M29W128GH",
|
||||
"AGB-E05-02 with M29W128FH"
|
||||
"AGB-E05-02 with M29W128FH",
|
||||
"2006_TSOP_64BALL_6106 with W29GL128SH9B"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x02, 0x00, 0x7D, 0x22 ],
|
||||
@@ -16,7 +17,8 @@
|
||||
[ 0x02, 0x00, 0x7D, 0x22 ],
|
||||
[ 0x20, 0x00, 0x7D, 0x22 ],
|
||||
[ 0x20, 0x00, 0x7D, 0x22 ],
|
||||
[ 0x20, 0x00, 0x7D, 0x22 ]
|
||||
[ 0x20, 0x00, 0x7D, 0x22 ],
|
||||
[ 0xEF, 0x00, 0x7D, 0x22 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"first_bank":1,
|
||||
"write_pin":"AUDIO",
|
||||
"chip_erase_timeout":60,
|
||||
"sector_size":0x10000,
|
||||
"command_set":"AMD",
|
||||
"commands":{
|
||||
"reset":[
|
||||
@@ -27,21 +28,21 @@
|
||||
"read_cfi":[
|
||||
[ 0x555, 0x98 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
"sector_erase":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x80 ],
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x10 ]
|
||||
[ "SA", 0x30 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
[ "SA", 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xAA ],
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_TSOP_29LV017D with M29W320DT",
|
||||
"SD007_TSOP_48BALL_V10 with M29W320DT"
|
||||
"SD007_TSOP_48BALL_V10 with M29W320DT",
|
||||
"SD007_TSOP_48BALL_V10 with GL032M10BFIR3"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x02, 0x02, 0x7D, 0x7D ],
|
||||
[ 0x20, 0x20, 0xC9, 0xC9 ]
|
||||
[ 0x20, 0x20, 0xC9, 0xC9 ],
|
||||
[ 0x02, 0x02, 0x7D, 0x7D ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
|
||||
11
FlashGBX/config/fc_DMG_Retrostage.txt
Normal file
11
FlashGBX/config/fc_DMG_Retrostage.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"Retrostage GameBoy Blaster"
|
||||
],
|
||||
"flash_ids":[],
|
||||
"voltage":5,
|
||||
"write_pin":"",
|
||||
"command_set":"",
|
||||
"commands":{}
|
||||
}
|
||||
@@ -4,7 +4,8 @@
|
||||
"insideGadgets 1 MB, 128 KB SRAM"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xC2, 0xC2, 0x58, 0x58 ]
|
||||
[ 0xC2, 0xC2, 0x58, 0x58 ],
|
||||
[ 0xC2, 0xC2, 0xD6, 0xD6 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x100000,
|
||||
@@ -18,17 +19,17 @@
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x90 ]
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x80 ],
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x10 ]
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
@@ -39,9 +40,9 @@
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
|
||||
87
FlashGBX/config/fc_DMG_iG_8MB.txt
Normal file
87
FlashGBX/config/fc_DMG_iG_8MB.txt
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 8 MB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x01, 0x01, 0x7E, 0x7E ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x800000,
|
||||
"start_addr":0x4000,
|
||||
"first_bank":0,
|
||||
"write_pin":"WR",
|
||||
"sector_size_from_cfi":true,
|
||||
"chip_erase_timeout":60,
|
||||
"command_set":"AMD",
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0x0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ "SA", 0x30 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0xFF, 0xFF ]
|
||||
],
|
||||
"buffer_write":[
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ "SA", 0x25 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0x29 ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", "PD", 0xFFFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xAA ],
|
||||
[ 0x555, 0x55 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
11
FlashGBX/config/fc_DMG_iG_Power_Cart.txt
Normal file
11
FlashGBX/config/fc_DMG_iG_Power_Cart.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets Power Cart 1 MB, 128 KB SRAM"
|
||||
],
|
||||
"flash_ids":[],
|
||||
"voltage":5,
|
||||
"write_pin":"",
|
||||
"command_set":"",
|
||||
"commands":{}
|
||||
}
|
||||
@@ -211,8 +211,6 @@ class FirmwareUpdater(QtWidgets.QDialog):
|
||||
fn = None
|
||||
|
||||
text = "The following firmware will now be written to your GBxCart v1.3 device:<br>- {:s}".format(fw)
|
||||
#if platform.system() == "Darwin":
|
||||
# text += "<br><br>DISCLAIMER: In rare occasions, the firmware update may reportedly fail on some macOS systems with unstable drivers, so please proceed at your own risk. If an error occurs, your device can still be recovered using the official firmware update tool by insideGadgets."
|
||||
text += "<br><br>Do you want to continue?"
|
||||
msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Question, windowTitle="FlashGBX", text=text, standardButtons=QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
|
||||
msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
|
||||
|
||||
@@ -170,6 +170,8 @@ class GbxDevice:
|
||||
self.DEVICE = None
|
||||
return False
|
||||
|
||||
conn_msg.append([0, "For help please visit the insideGadgets Discord: https://gbxcart.com/discord"])
|
||||
|
||||
self.PORT = ports[i]
|
||||
|
||||
# Load Flash Cartridge Handlers
|
||||
@@ -1018,14 +1020,16 @@ class GbxDevice:
|
||||
flashcart.Reset(full_reset=False)
|
||||
flashcart.Unlock()
|
||||
if "flash_ids" in flashcart_meta:
|
||||
(verified, cart_flash_id) = flashcart.VerifyFlashID()
|
||||
if verified and cart_flash_id in flashcart_meta["flash_ids"]:
|
||||
flash_id = cart_flash_id
|
||||
flash_id_found = True
|
||||
flash_type = f
|
||||
flash_types.append(flash_type)
|
||||
flashcart.Reset(full_reset=True)
|
||||
dprint("Found the correct cartridge type!")
|
||||
vfid = flashcart.VerifyFlashID()
|
||||
if vfid is not False:
|
||||
(verified, cart_flash_id) = flashcart.VerifyFlashID()
|
||||
if verified and cart_flash_id in flashcart_meta["flash_ids"]:
|
||||
flash_id = cart_flash_id
|
||||
flash_id_found = True
|
||||
flash_type = f
|
||||
flash_types.append(flash_type)
|
||||
flashcart.Reset(full_reset=True)
|
||||
dprint("Found the correct cartridge type!")
|
||||
|
||||
if self.MODE == "DMG" and not flash_id_found:
|
||||
self._write(self.DEVICE_CMD["SET_VOLTAGE_5V"])
|
||||
@@ -1836,9 +1840,20 @@ class GbxDevice:
|
||||
cart_type = copy.deepcopy(supported_carts[args["cart_type"]])
|
||||
if cart_type == "RETAIL" or cart_type == "AUTODETECT": return False # Generic ROM Cartridge is not flashable
|
||||
|
||||
# Special carts
|
||||
if "Retrostage GameBoy Blaster" in cart_type["names"]:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The Retrostage GameBoy Blaster cartridge is currently not fully supported by FlashGBX. However, you can use the insideGadgets “Flasher” software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> to flash this cartridge.", "abortable":False})
|
||||
return False
|
||||
elif "insideGadgets Power Cart 1 MB, 128 KB SRAM" in cart_type["names"]:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The insideGadgets Power Cart is currently not fully supported by FlashGBX. However, you can use the dedicated insideGadgets “iG Power Cart Programs” software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> to flash this cartridge.", "abortable":False})
|
||||
return False
|
||||
# Special carts
|
||||
# Firmware check L1
|
||||
if "flash_commands_on_bank_1" in cart_type:
|
||||
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 firmware and interface software instead.", "abortable":False})
|
||||
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 firmware and interface software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> instead.", "abortable":False})
|
||||
return False
|
||||
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 firmware and interface software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> instead.", "abortable":False})
|
||||
return False
|
||||
# Firmware check L1
|
||||
|
||||
@@ -1856,7 +1871,7 @@ class GbxDevice:
|
||||
try:
|
||||
with open(os.path.splitext(args["path"])[0] + ".map", "rb") as file: args["buffer_map"] = file.read()
|
||||
except:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The GB Memory Cartridge requires a hidden sector file but was not found.\nExpected path: {:s}".format(os.path.splitext(args["path"])[0] + ".map"), "abortable":False})
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The GB Memory Cartridge requires a hidden sector file, but it wasn’t found.\nExpected path: {:s}".format(os.path.splitext(args["path"])[0] + ".map"), "abortable":False})
|
||||
return False
|
||||
#with open(args["path"], "rb") as f: rom_data = bytearray(f.read())
|
||||
#gbmem = GBMemory(None, rom_data, None)
|
||||
|
||||
@@ -211,11 +211,12 @@ class GbxDevice:
|
||||
self.DEVICE = None
|
||||
continue
|
||||
|
||||
if (self.FW[1] != 4):
|
||||
conn_msg.append([0, "NOTE: This version of FlashGBX was developed to be used with GBxCart RW v1.3 and v1.3 Pro. Other revisions are untested and may not be fully compatible."])
|
||||
else:
|
||||
conn_msg.append([0, "NOTE: FlashGBX is now optimized for the custom high compatibility firmware. You can install it from the Tools menu."])
|
||||
|
||||
if (self.FW[1] not in (4, 5, 100)):
|
||||
conn_msg.append([0, "NOTE: This version of FlashGBX was developed to be used with GBxCart RW v1.3, v1.4 and GBxCart RW Mini. Other revisions are untested and may not be fully compatible."])
|
||||
elif self.FW[1] == 4:
|
||||
conn_msg.append([0, "FlashGBX is now optimized for the custom high compatibility firmware. You can install it from the Tools menu."])
|
||||
conn_msg.append([0, "For help please visit the insideGadgets Discord: https://gbxcart.com/discord"])
|
||||
|
||||
self.PORT = ports[i]
|
||||
|
||||
# Load Flash Cartridge Handlers
|
||||
@@ -350,9 +351,6 @@ class GbxDevice:
|
||||
return ["DMG", "AGB"]
|
||||
|
||||
def IsSupportedMbc(self, mbc):
|
||||
#if (int(self.FW[0]) >= 26):
|
||||
# return mbc in ( 0x00, 0x01, 0x02, 0x03, 0x06, 0x0B, 0x0D, 0x10, 0x13, 0x19, 0x1B, 0x1C, 0x1E, 0xFC, 0xFD, 0xFE, 0xFF, 0x101, 0x103, 0x104, 0x105 )
|
||||
#else:
|
||||
return mbc in ( 0x00, 0x01, 0x02, 0x03, 0x06, 0x10, 0x13, 0x19, 0x1A, 0x1B, 0x1C, 0x1E, 0xFC, 0xFE, 0xFF, 0x101, 0x103 )
|
||||
|
||||
def IsSupported3dMemory(self):
|
||||
@@ -1816,6 +1814,14 @@ class GbxDevice:
|
||||
if cart_type == "RETAIL" or cart_type == "AUTODETECT": return False # Generic ROM Cartridge is not flashable
|
||||
flashcart_meta = copy.deepcopy(cart_type)
|
||||
|
||||
# Special carts
|
||||
if "Retrostage GameBoy Blaster" in cart_type["names"]:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The Retrostage GameBoy Blaster cartridge is currently not fully supported by FlashGBX. However, you can use the insideGadgets “Flasher” software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> to flash this cartridge.", "abortable":False})
|
||||
return False
|
||||
elif "insideGadgets Power Cart 1 MB, 128 KB SRAM" in cart_type["names"]:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"The insideGadgets Power Cart is currently not fully supported by FlashGBX. However, you can use the dedicated insideGadgets “iG Power Cart Programs” software available from <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> to flash this cartridge.", "abortable":False})
|
||||
return False
|
||||
# Special carts
|
||||
# Firmware check R20+
|
||||
if (int(self.FW[0]) < 20) and self.MODE == "AGB" and "buffer_write" in flashcart_meta["commands"] and flashcart_meta["commands"]["buffer_write"] == [[0xAAA, 0xAA], [0x555, 0x55], ['SA', 0x25], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0x29]]:
|
||||
self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"A firmware update is required to access this cartridge. Please update the firmware of your GBxCart RW device to version R20 or higher.", "abortable":False})
|
||||
@@ -1848,6 +1854,7 @@ class GbxDevice:
|
||||
del flashcart_meta["commands"]["buffer_write"]
|
||||
elif self.MODE == "AGB" and "single_write" in flashcart_meta["commands"] and "buffer_write" in flashcart_meta["commands"] and flashcart_meta["commands"]["buffer_write"] != [['SA', 0xE8], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0xD0], ['SA', 0xFF]]:
|
||||
print("NOTE: Update your GBxCart RW firmware to version L1 or higher for a better transfer rate with this cartridge.")
|
||||
|
||||
#if "dmg-mmsa-jpn" in flashcart_meta:
|
||||
# self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Flashing GB Memory cartridges is currently only supported via the high compatibility firmware which you can install from the Tools menu.", "abortable":False})
|
||||
# return False
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -14,7 +14,7 @@ for Windows, Linux, macOS
|
||||
- Many reproduction cartridges and flash cartridges can be auto-detected
|
||||
- A flash chip query (including Common Flash Interface information) can be performed for flash cartridges
|
||||
- Decode and extract Game Boy Camera photos from save data
|
||||
- Update firmware of GBxCart RW v1.3 devices
|
||||
- Update firmware of insideGadgets GBxCart RW v1.3 devices
|
||||
|
||||
### Confirmed working reader/writer hardware and firmware versions
|
||||
|
||||
@@ -114,12 +114,14 @@ for Windows, Linux, macOS
|
||||
- SD007_TSOP_48BALL with K8D3216UTC
|
||||
- SD007_TSOP_48BALL with M29W160ET
|
||||
- SD007_TSOP_48BALL with L160DB12VI
|
||||
- SD007_TSOP_48BALL_V10 with GL032M10BFIR3
|
||||
- SD007_TSOP_48BALL_V10 with M29W320DT
|
||||
|
||||
- Game Boy Advance
|
||||
|
||||
- 0121 with 0121M0Y0BE
|
||||
- 100BS6600_48BALL_V4 with 6600M0U0BE
|
||||
- 2006_TSOP_64BALL_6106 with W29GL128SH9B
|
||||
- 28F256L03B-DRV with 256L30B
|
||||
- 29LV128DBT2C-90Q and ALTERA CPLD
|
||||
- 36L0R8-39VF512 with M36L0R8060B
|
||||
@@ -137,9 +139,11 @@ for Windows, Linux, macOS
|
||||
- AGB-E05-01 with MX29GL128FHT2I-90G
|
||||
- AGB-E05-02 with M29W128FH
|
||||
- AGB-E05-02 with M29W128GH
|
||||
- AGB-E05-06L with 29LV128DBT2C-90Q
|
||||
- AGB-E08-09 with 29LV128DTMC-90Q
|
||||
- AGB-SD-E05 with MSP55LV128
|
||||
- B104 with MSP55LV128
|
||||
- B11 with 26L6420MC-90
|
||||
- BX2006_0106_NEW with S29GL128N10TFI01
|
||||
- BX2006_TSOP_64BALL with GL128S
|
||||
- BX2006_TSOP_64BALL with GL256S
|
||||
@@ -207,6 +211,7 @@ The author would like to thank the following very kind people for their help and
|
||||
- easthighNerd (feature suggestions)
|
||||
- eveningmoose (flash chip info)
|
||||
- Frost Clock (flash chip info)
|
||||
- Grender (testing)
|
||||
- howie0210 (flash chip info)
|
||||
- Icesythe7 (feature suggestions, testing, bug reports)
|
||||
- Jayro (flash chip info)
|
||||
|
||||
2
setup.py
2
setup.py
@@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read(
|
||||
|
||||
setuptools.setup(
|
||||
name="FlashGBX",
|
||||
version="2.2",
|
||||
version="2.3",
|
||||
author="Lesserkuma",
|
||||
description="Reads and writes Game Boy and Game Boy Advance cartridge data. Currently supports the GBxCart RW hardware device by insideGadgets.",
|
||||
url="https://github.com/lesserkuma/FlashGBX",
|
||||
|
||||
Reference in New Issue
Block a user