From 00019e66bc484cbdef37910941bbbc3d8f68413e Mon Sep 17 00:00:00 2001 From: Lesserkuma Date: Tue, 8 Jun 2021 11:27:42 +0200 Subject: [PATCH] 2.3 --- CHANGES.md | 8 ++ FlashGBX/FlashGBX.py | 4 +- FlashGBX/FlashGBX_GUI.py | 5 +- FlashGBX/Flashcart.py | 12 ++- FlashGBX/Util.py | 2 +- FlashGBX/config/fc_AGB_29LV128DT.txt | 8 +- FlashGBX/config/fc_AGB_MSP55LV128M.txt | 6 +- FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt | 9 +- FlashGBX/config/fc_DMG_M29W320DT.txt | 6 +- ...0_AUDIO.txt => fc_DMG_MX29LV640_AUDIO.txt} | 0 FlashGBX/config/fc_DMG_Retrostage.txt | 11 +++ FlashGBX/config/fc_DMG_iG_1MB.txt | 27 +++--- FlashGBX/config/fc_DMG_iG_8MB.txt | 87 ++++++++++++++++++ FlashGBX/config/fc_DMG_iG_Power_Cart.txt | 11 +++ FlashGBX/fw_GBxCartRW_v1_3.py | 2 - FlashGBX/hw_GBxCartRW.py | 35 +++++-- FlashGBX/hw_GBxCartRW_ofw.py | 23 +++-- FlashGBX/res/config.zip | Bin 130642 -> 131804 bytes FlashGBX/res/fw_GBxCart_RW_v1_3.zip | Bin 15542 -> 15557 bytes README.md | 7 +- setup.py | 2 +- 21 files changed, 213 insertions(+), 52 deletions(-) rename FlashGBX/config/{fc_AGB_MX29LV640_AUDIO.txt => fc_DMG_MX29LV640_AUDIO.txt} (100%) create mode 100644 FlashGBX/config/fc_DMG_Retrostage.txt create mode 100644 FlashGBX/config/fc_DMG_iG_8MB.txt create mode 100644 FlashGBX/config/fc_DMG_iG_Power_Cart.txt diff --git a/CHANGES.md b/CHANGES.md index cbc3aa3..f934395 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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)* diff --git a/FlashGBX/FlashGBX.py b/FlashGBX/FlashGBX.py index 7ce18fb..d30353f 100644 --- a/FlashGBX/FlashGBX.py +++ b/FlashGBX/FlashGBX.py @@ -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) diff --git a/FlashGBX/FlashGBX_GUI.py b/FlashGBX/FlashGBX_GUI.py index 66176f9..8f5e8da 100644 --- a/FlashGBX/FlashGBX_GUI.py +++ b/FlashGBX/FlashGBX_GUI.py @@ -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:
" + flash_id + "
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:
" + flash_id + "
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:
" + flash_id + "
" + str(cfi_s) + "
", 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:
" + flash_id + "
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:
" + flash_id + "
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:
" + flash_id + "
" + str(cfi_s) + "
", QtWidgets.QMessageBox.Ok) with open(self.CONFIG_PATH + "/cfi.bin", "wb") as f: f.write(cfi['raw']) diff --git a/FlashGBX/Flashcart.py b/FlashGBX/Flashcart.py index d6716c3..5ee4eca 100644 --- a/FlashGBX/Flashcart.py +++ b/FlashGBX/Flashcart.py @@ -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 ], diff --git a/FlashGBX/Util.py b/FlashGBX/Util.py index 6ba3790..aa7656a 100644 --- a/FlashGBX/Util.py +++ b/FlashGBX/Util.py @@ -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 diff --git a/FlashGBX/config/fc_AGB_29LV128DT.txt b/FlashGBX/config/fc_AGB_29LV128DT.txt index 8f7fcc9..7262ba3 100644 --- a/FlashGBX/config/fc_AGB_29LV128DT.txt +++ b/FlashGBX/config/fc_AGB_29LV128DT.txt @@ -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":[ diff --git a/FlashGBX/config/fc_AGB_MSP55LV128M.txt b/FlashGBX/config/fc_AGB_MSP55LV128M.txt index 0730ad8..670a862 100644 --- a/FlashGBX/config/fc_AGB_MSP55LV128M.txt +++ b/FlashGBX/config/fc_AGB_MSP55LV128M.txt @@ -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, diff --git a/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt b/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt index 3c8fa47..2f0fcf5 100644 --- a/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt +++ b/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt @@ -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 ], diff --git a/FlashGBX/config/fc_DMG_M29W320DT.txt b/FlashGBX/config/fc_DMG_M29W320DT.txt index 26121ef..e5aaacf 100644 --- a/FlashGBX/config/fc_DMG_M29W320DT.txt +++ b/FlashGBX/config/fc_DMG_M29W320DT.txt @@ -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, diff --git a/FlashGBX/config/fc_AGB_MX29LV640_AUDIO.txt b/FlashGBX/config/fc_DMG_MX29LV640_AUDIO.txt similarity index 100% rename from FlashGBX/config/fc_AGB_MX29LV640_AUDIO.txt rename to FlashGBX/config/fc_DMG_MX29LV640_AUDIO.txt diff --git a/FlashGBX/config/fc_DMG_Retrostage.txt b/FlashGBX/config/fc_DMG_Retrostage.txt new file mode 100644 index 0000000..dc83ecc --- /dev/null +++ b/FlashGBX/config/fc_DMG_Retrostage.txt @@ -0,0 +1,11 @@ +{ + "type":"DMG", + "names":[ + "Retrostage GameBoy Blaster" + ], + "flash_ids":[], + "voltage":5, + "write_pin":"", + "command_set":"", + "commands":{} +} diff --git a/FlashGBX/config/fc_DMG_iG_1MB.txt b/FlashGBX/config/fc_DMG_iG_1MB.txt index 26be455..4a5032e 100644 --- a/FlashGBX/config/fc_DMG_iG_1MB.txt +++ b/FlashGBX/config/fc_DMG_iG_1MB.txt @@ -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":[ diff --git a/FlashGBX/config/fc_DMG_iG_8MB.txt b/FlashGBX/config/fc_DMG_iG_8MB.txt new file mode 100644 index 0000000..61b0565 --- /dev/null +++ b/FlashGBX/config/fc_DMG_iG_8MB.txt @@ -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 ] + ] + } +} diff --git a/FlashGBX/config/fc_DMG_iG_Power_Cart.txt b/FlashGBX/config/fc_DMG_iG_Power_Cart.txt new file mode 100644 index 0000000..25e2524 --- /dev/null +++ b/FlashGBX/config/fc_DMG_iG_Power_Cart.txt @@ -0,0 +1,11 @@ +{ + "type":"DMG", + "names":[ + "insideGadgets Power Cart 1 MB, 128 KB SRAM" + ], + "flash_ids":[], + "voltage":5, + "write_pin":"", + "command_set":"", + "commands":{} +} diff --git a/FlashGBX/fw_GBxCartRW_v1_3.py b/FlashGBX/fw_GBxCartRW_v1_3.py index 909a734..9ce5051 100644 --- a/FlashGBX/fw_GBxCartRW_v1_3.py +++ b/FlashGBX/fw_GBxCartRW_v1_3.py @@ -211,8 +211,6 @@ class FirmwareUpdater(QtWidgets.QDialog): fn = None text = "The following firmware will now be written to your GBxCart v1.3 device:
- {:s}".format(fw) - #if platform.system() == "Darwin": - # text += "

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 += "

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) diff --git a/FlashGBX/hw_GBxCartRW.py b/FlashGBX/hw_GBxCartRW.py index 80378af..dbe5b18 100644 --- a/FlashGBX/hw_GBxCartRW.py +++ b/FlashGBX/hw_GBxCartRW.py @@ -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 https://www.gbxcart.com/ 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 https://www.gbxcart.com/ 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 https://www.gbxcart.com/ 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 https://www.gbxcart.com/ 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) diff --git a/FlashGBX/hw_GBxCartRW_ofw.py b/FlashGBX/hw_GBxCartRW_ofw.py index d15e314..0fd5abd 100644 --- a/FlashGBX/hw_GBxCartRW_ofw.py +++ b/FlashGBX/hw_GBxCartRW_ofw.py @@ -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 https://www.gbxcart.com/ 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 https://www.gbxcart.com/ 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 diff --git a/FlashGBX/res/config.zip b/FlashGBX/res/config.zip index d1a98ce88d62b856ec474998a92a52984ba6bfec..40ed304712d182a426836b138fc5d8e93eab23c0 100644 GIT binary patch delta 4950 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 delta 3776 zcmZXX2{_c<7suxgO$s9!OVJdKP^0XUeXU4oUeZdIEU!w5N@(n*lw!C<3dtK0!l*>H zN>W0EY^jWW8T%CfJ2C&ao_FS%=ef`4e&?KX&-vYZ?(cI5Pu-8D{&`?)kWhJY7DaL3 zw2mjhU~VtLUnM$CUlTJj^8!Qi5xICZ*($+JK1;!++ z4xC7xf9|vCO@J&RX_CjM>YbyzQ>6JbugZoVgY3(dKQ*2Ddz9pj%99n_ZF{rM2n28? zBebN z6qzzXS)mnIy+qWjg(u5VGCkG)W`C(j#uX{~v?4*%G}T?P%_i#NSCU1H*15?hs!aJe zL>^AQ_ZOcY&D4p~fb(ASDkqb^g4#A5Up(A;;aRgPztj1xx3uDv=@l>54F#=x^SBbIk^Aj!Lic?9yw{#S8D= z(DK?NCS~McI#cP|wO!3Z7q>rLrg^qeI=Rk&bH|{Fjjn|m7dI*ah6lp~D=5&r7vSl0 z!60BA|6x?9%|*C^52#SvV0bE!q_!#${BU9O7Bd>V)HheP6l-kck2<(d&SjTjRCGQ* zpC&*nbW_ipFYf0h7%pGA7Msl2rqT2D`)3E+p}`>qW{*J*5IS9<#j?2{^7p4szB}j0 zPpLemI@7nK)vmrH#o>VpU&ng%_Xkw+M{*Ha#+KdUHf4>^jwN>ncAm zpEXIE*%sZUPkQMw0r3|wt1-u<(F1oK6fplfu#L%c-T?(sC^^hM8#8*@8d9lcw~ z_Yylu9*qI2r{3?&o?zDQd#5Q&<-JwjUmtHrwSKbm{iuqkuGj5e@t>lK`&oLTiq~$% zrEf5G^0In;;C}Oq1~cRF<4IfYQPb;9cBb%J$@7a(OJo(M%hq{p77tk`6eW4aj&C+n zEo~p^Zo>yHZz6ai{fxA;r%*jzWm|pv*$OwwU}vbay95NS8yQ$Bb>6nQqwbcIhfid7 z50AQj?ZYifwOrhHerT9+Ki)4&^pv)Kpr(|O;QQuSqR;Nii|(%ri?^R|dpKml?HSlE zV`bfISlzG`FHAHaZ&IqZl()`TqxGJNSnX~{HjNE3UlxyVj&ZLvjL~sQ{u=MpyxKLT znt51TonpQ05YuhGzb!X6Sbl!;?C6{T{Yn}L1`yW`M7i|08_?HvgY$rne*m5>Ib}@Aj7)lxXIDR@<+e|>_y~{hZAhkNO;5E&l%buD|tnw9YQnQ5JLyFn9)PX#e z?h93pxp%f2I+|S|R@9mp^j-F!Tkp%5ws8#Iq8B;LS34%8S4vb9`dm_pU5`ima5+iy`t5#(e7Yu`UZSX zJT6+(%~FnBYKq&t&)6~}TZtSZ!}r$N+T=ckhWGAgU9{4ZEA-fLR(68y6!q$DX;>rE zGLfOd(A;I+Ys_SEN0w}Hk5V?v;fJBAA>G#xI>+@GxlB1e3n`g90PJhvw2@_2!c$!_t)nn&;!PqsLrIhJCio zq-sZma`ov>-rCK0xWATEB!0kkyUZqEqJ;vUX0s#zWBW}Sp+5LtbF9{`s`^M#f?@xs ze7V%tWft(Auw5F9?CPd-a^nHIJayQs_nS!5J0Bql-{i90a=g|m39ym(0nIoiEYQoQ zXb00o#?|t=NRfz-!j7?`<9asdvPD}=(?TwpHZ6_l4Og`}VpS*GrE-NPs@wtvzetQ` zzSJ`$+{BhA7>Du*uBS-S)re|$Pl%edXbJEq2)(tb2xpQmWPXw!o=st4)D6tnC=;k1 zi8igYt)?UPe@(^KB$1`l06qRKaKX_}d;|hZ@VM9tN;CDIVFXHX;}UqK1+1a&K?(M2teDRp_f~|U zY*OvW$Py_*tU$0zv{!ARK%KCD*nC^7Dw+SyRnnK-gp)mq?GcZ?sAv3)8(6oZ{EdRP zf9ab_I95a|<-7CfwJerVJIZj~plH4Y1%L?kHZOTi}c0N%(D;0D-CO&)V$!h||`p!1azMCkOFph6Iq*dlF~&+6dhopy0i?sX0ME9!rquJEl+)Xx~5r9Y+JaU`s)QSG{vHJ6k0bhtk8if^1p z`kqnm#L%Nw686Rd6_*pzy_ThU>XrA@sJ7eE4L^f&99{1lkig;`GhvVWorK%Rr5*~lNh`3?PKBT=Z- z4^%j+<7mt^9}eKgYhXQm*^j)0vVJY06U~4`C_DgUILKfCs9@(J;Q0aMW>J=b7_fq! z13-a;LoS}05k!*VZk7f<)E)@WD8df0VNLFJA{xd3}vHOsaST( zixJ`)j|FgT99RQa4x=a+XUM}yoDA)Tfg%URvXLaL8Ad@asA5JCc?DHR{!gF_8@a>V zzoA-$xJXF=?ny#PB98v+Wa}srUxp_}!A6dg+icVa>qY@tbHPayIL-`8qp$w6&VO8J zcrX|d3<=er{aJ^8&QN0vNaJ}2yJOi8NaoI8t35u3Y#)b7V_-Ay0%`(*W??V{V7Dy) z{tv)7IoP7k2~p=Hz*u&FYzJ5#JV#2X33*mw4co>5nd^KyfRYb@7$h;#au)6DFj0Mo z51}U$V*zCr0 zI6VcFIXcB@#578v^E9gc;(sBVDVM^UX_UWO$c`vx2BESt=s$}}a=jERhn6$Q*}^0| ziDrQ|6r4qG9ECH0$l;&aJP%T5QE;1P(LPz!o6aI@@~_y|lsK%A&5~ckp;@q*!=zYf zc?E9(bgx2B>?sx?Xf0T10!KTa|0n%_wsZ_e@Q?I|y@fAWU@d;{l2C7#4NYJ%mOKxd_v5`H8^q5BY{Wm5$kJgyh1Yqqals$)eK+tA=idu8*Koc+stpCp% z|Lm#kH@)BYn^QA@5iQ70)jZ(C*CibyI3PQFV*-iC4!~~Y2`keYy$UOfoA}0FX!Lfh z3fJ^!02SMTXmm7|z~PS&|EC?mt_~m;J@ zR#!c?zu)nCZ(7aH{l-uKeU+{Jn9Rg{`N)&(6&c};A4@OPcWz73+!_$aaoAY#p`z}y z-q>@xy7kp{-5ZvNG;R~qkt`A9zVSjT@oDshch8iy?`<{aa4SyIDwA+;U~g7*>}Ad5 z2-|*QV|pjgrpsbXMy*_tw=L?oTzPG0s#xK-DCD&Q??>$wp>~p`KUN-pDS5p1=bguE zj_cd{O%Yjo%<1NuYxM>%Z07YPeJVNg^hA}0IKS6Zp|feFR$6Opw|@%uO*{1S-V^@m zN>2NYrgk2&Iz8XbAol<3cQbCj{Ncm;>*3X^FcHB=H|?j)Q>^NA|0O8F{CkmM=bqQb z8f*Km`o>&WtUTPKcT;SRzrgy;oahg!o^2}TMM4QHRo}ljeI<9pZZ+|va_8Mn?meO3X~YY^}~0vz5nVW%PAM2tAp@ n#)NV9WLujEMOg&~hGbx@Wu#UFc(a0{kbxNpp8@HU)*v1LOf2Iv delta 486 zcmX?FxvjE3z?+#xgn@y9gCRA0ZV7=WjYqv5#F|YKFyQX@fBf5HK>6@8nvYtH- z3@n?_GJo!D4a=Ih6Q7+=ez7cTx>Jgg_TF1sYil@9w%)9_Hnx@fTNC!;sL$%7yBFrO zvp)@<5Y_A{B&umQ)nP@TRZpU>am!Lo$7kX4j(et8wg`BBTJlJCm)!$Hr`L*yBRn@m zP4ie6xKTMs&on|MHCSck-JBJnn-4A9aBV{Ra-S%*9qa<93+~uI%x#`*+&8Q6`hzV8 zf3qELY8OzRwr0Bai~4zGYqaAwt#h)Q^ycGXhmHx4BlTZh7P--|TDZ7&gylw6fwwiHgaOtkwDU)cMYMWpkYoLQfXAF=6bP>|+z5$fv--kPM8b XjMRz%Z&py8F)#z+Ga$Xo8pHzt=Dg3E diff --git a/README.md b/README.md index 75c51d2..5b9e820 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/setup.py b/setup.py index 02f63a7..cb74caf 100644 --- a/setup.py +++ b/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",