mirror of
https://github.com/lesserkuma/FlashGBX.git
synced 2026-03-21 17:44:30 -05:00
4.6
This commit is contained in:
parent
c694ca8b1e
commit
d42b7e74a7
2
.github/workflows/build-macos.yaml
vendored
2
.github/workflows/build-macos.yaml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
|||
include:
|
||||
- os: macos-latest
|
||||
arch: arm64
|
||||
- os: macos-13
|
||||
- os: macos-15-intel
|
||||
arch: x86_64
|
||||
|
||||
steps:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
# Release notes
|
||||
### v4.6 (released 2026-01-27)
|
||||
- Added support for a new Game Boy Advance bootleg flash save chip (SST39VF6401B) used on “Quetzal” bootlegs *(thanks Grender, marv17, Pese)*
|
||||
- Added support for Gamebank-web DMG-29W-04 with M29W320DB
|
||||
- Updated the Game Boy and Game Boy Advance lookup databases for save types, ROM sizes and checksums
|
||||
|
||||
### v4.5 (released 2025-12-06)
|
||||
- Added support for SD007_T40_6401B\*CD_71_TS28 with 39VF6401B
|
||||
- Added support for ModRetro Chromatic Cartridge with IS29GL032 *(thanks Jayro)*
|
||||
|
|
|
|||
|
|
@ -676,7 +676,10 @@ class FlashGBX_CLI():
|
|||
elif self.CONN.GetMode() == "AGB":
|
||||
temp = "{:s}".format(Util.AGB_Header_Save_Types[save_type])
|
||||
if save_type == 0:
|
||||
msg_save_type_s = "Save Type: None or unknown (no save data detected)\n"
|
||||
if "Unknown" in save_chip:
|
||||
msg_save_type_s = "Save Type: {:s}\n".format(save_chip)
|
||||
else:
|
||||
msg_save_type_s = "Save Type: None or unknown (no save data detected)\n"
|
||||
else:
|
||||
if sram_unstable and "SRAM" in temp:
|
||||
msg_save_type_s = "Save Type: {:s} {:s}(not battery-backed){:s}\n".format(temp, ANSI.RED, ANSI.RESET)
|
||||
|
|
|
|||
|
|
@ -727,13 +727,13 @@ class FlashGBX_GUI(QtWidgets.QWidget):
|
|||
msg = "This software is being developed by Lesserkuma as a hobby project. There is no affiliation with Nintendo or any other company. 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!<br><br>"
|
||||
msg += f"© 2020–{datetime.datetime.now().year} Lesserkuma<br>"
|
||||
msg += "• Website: <a href=\"https://github.com/Lesserkuma/FlashGBX\">https://github.com/Lesserkuma/FlashGBX</a><br><br>"
|
||||
msg += "Acknowledgments and Contributors:<br>2358, 90sFlav, AcoVanConis, AdmirtheSableye, AlexiG, ALXCO-Hardware, AndehX, antPL, aronson, Ausar, bbsan, BennVenn, ccs21, chobby, ClassicOldSong, Cliffback, CodyWick13, Corborg, Cristóbal, crizzlycruz, Crystal, Därk, Davidish, delibird_deals, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Eldram, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, Gahr, gandalf1980, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, infinest, inYourBackline, iyatemu, Jayro, Jenetrix, JFox, joyrider3774, jrharbort, JS7457, julgr, Kaede, kane159, KOOORAY, kscheel, kyokohunter, Leif, Leitplanke, litlemoran, LovelyA72, Lu, Luca DS, LucentW, luxkiller65, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, Mufsta, olDirdey, orangeglo, paarongiroux, Paradoxical, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, RibShark, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, Sillyhatday, simonK, Sithdown, skite2001, Smelly-Ghost, Sonikks, Squiddy, Stitch, Super Maker, t5b6_de, Tauwasser, TheNFCookie, Timville, twitnic, velipso, Veund, voltagex, Voultar, Warez Waldo, wickawack, Winter1760, Wkr, x7l7j8cc, xactoes, xukkorz, yosoo, Zeii, Zelante, zipplet, Zoo, zvxr"
|
||||
msg += "Acknowledgments and Contributors:<br>2358, 90sFlav, AcoVanConis, AdmirtheSableye, AlexiG, ALXCO-Hardware, AndehX, antPL, aronson, Ausar, bbsan, BennVenn, ccs21, chobby, ClassicOldSong, Cliffback, CodyWick13, Corborg, Cristóbal, crizzlycruz, Crystal, Därk, Davidish, delibird_deals, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Eldram, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, Gahr, gandalf1980, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, infinest, inYourBackline, iyatemu, Jayro, Jenetrix, JFox, joyrider3774, jrharbort, JS7457, julgr, Kaede, kane159, KOOORAY, kscheel, kyokohunter, Leitplanke, litlemoran, LovelyA72, Lu, Luca DS, LucentW, luxkiller65, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, Mufsta, olDirdey, orangeglo, paarongiroux, Paradoxical, Pese, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, RibShark, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, Sillyhatday, simonK, Sithdown, skite2001, Smelly-Ghost, Sonikks, Squiddy, Stitch, Super Maker, t5b6_de, Tauwasser, TheNFCookie, Timville, twitnic, velipso, Veund, voltagex, Voultar, Warez Waldo, wickawack, Winter1760, Wkr, x7l7j8cc, xactoes, xukkorz, yosoo, Zeii, Zelante, zipplet, Zoo, zvxr"
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), msg, QtWidgets.QMessageBox.Ok)
|
||||
|
||||
def AboutGameDB(self):
|
||||
msg = f"{APPNAME} uses a game database that is based on the ongoing efforts of the No-Intro project. Visit <a href=\"https://no-intro.org/\">https://no-intro.org/</a> for more information.<br><br>"
|
||||
msg += f"No-Intro databases referenced for this version of {APPNAME}:<br>"
|
||||
msg += "• Nintendo - Game Boy (20251203-165423)<br>• Nintendo - Game Boy Advance (20251202-225320)<br>• Nintendo - Game Boy Advance (Video) (20251114-101831)<br>• Nintendo - Game Boy Color (20251127-150925)" # No-Intro DBs
|
||||
msg += "• Nintendo - Game Boy (20260113-102506)<br>• Nintendo - Game Boy Advance (20260124-113814)<br>• Nintendo - Game Boy Advance (Video) (20251114-101831)<br>• Nintendo - Game Boy Color (20260110-131928)" # No-Intro DBs
|
||||
QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), msg, QtWidgets.QMessageBox.Ok)
|
||||
|
||||
def OpenPath(self, path=None):
|
||||
|
|
@ -3048,7 +3048,10 @@ class FlashGBX_GUI(QtWidgets.QWidget):
|
|||
pass
|
||||
|
||||
if save_type == 0:
|
||||
msg_save_type_s = "<b>Save Type:</b> None or unknown (no save data detected)<br>"
|
||||
if "Unknown" in save_chip:
|
||||
msg_save_type_s = "<b>Save Type:</b> {:s}<br>".format(save_chip)
|
||||
else:
|
||||
msg_save_type_s = "<b>Save Type:</b> None or unknown (no save data detected)<br>"
|
||||
else:
|
||||
if sram_unstable and "SRAM" in temp:
|
||||
msg_save_type_s = "<b>Save Type:</b> {:s} <span style=\"color: red;\">(not stable or not battery-backed)</span><br>".format(temp)
|
||||
|
|
|
|||
|
|
@ -1264,21 +1264,25 @@ class LK_Device(ABC):
|
|||
if ret is not False:
|
||||
(flash_save_id, _) = ret
|
||||
try:
|
||||
if flash_save_id != 0 and flash_save_id in Util.AGB_Flash_Save_Chips:
|
||||
save_size = Util.AGB_Flash_Save_Chips_Sizes[list(Util.AGB_Flash_Save_Chips).index(flash_save_id)]
|
||||
save_chip = Util.AGB_Flash_Save_Chips[flash_save_id]
|
||||
|
||||
if flash_save_id in (0xBF4B, 0xBF5B, 0xFFFF): # Bootlegs
|
||||
if self.INFO["data"][0:0x20000] == bytearray([0xFF] * 0x20000):
|
||||
if flash_save_id != 0:
|
||||
if flash_save_id in Util.AGB_Flash_Save_Chips:
|
||||
save_size = Util.AGB_Flash_Save_Chips_Sizes[list(Util.AGB_Flash_Save_Chips).index(flash_save_id)]
|
||||
save_chip = Util.AGB_Flash_Save_Chips[flash_save_id]
|
||||
if flash_save_id in (0xBF4B, 0xBF5B, 0xFFFF, 0xBF6D): # Bootlegs
|
||||
if self.INFO["data"][0:0x20000] == bytearray([0xFF] * 0x20000):
|
||||
save_type = 5
|
||||
elif self.INFO["data"][0:0x10000] == self.INFO["data"][0x10000:0x20000]:
|
||||
save_type = 4
|
||||
else:
|
||||
save_type = 5
|
||||
elif save_size == 131072:
|
||||
save_type = 5
|
||||
elif self.INFO["data"][0:0x10000] == self.INFO["data"][0x10000:0x20000]:
|
||||
elif save_size == 65536:
|
||||
save_type = 4
|
||||
else:
|
||||
save_type = 5
|
||||
elif save_size == 131072:
|
||||
save_type = 5
|
||||
elif save_size == 65536:
|
||||
save_type = 4
|
||||
else: # Other bootleg chips
|
||||
save_type = 0
|
||||
save_size = 0
|
||||
save_chip = f"Unknown FLASH save chip (0x{flash_save_id:04X})"
|
||||
except:
|
||||
pass
|
||||
|
||||
|
|
@ -3123,6 +3127,8 @@ class LK_Device(ABC):
|
|||
(agb_flash_chip, _) = ret
|
||||
if agb_flash_chip in (0xBF4B, 0xBF5B, 0xFFFF): # Bootlegs
|
||||
buffer_len = 0x800
|
||||
elif agb_flash_chip == 0xBF6D:
|
||||
buffer_len = 0x8000
|
||||
elif args["save_type"] == 6: # DACS
|
||||
# self._write(self.DEVICE_CMD["AGB_BOOTUP_SEQUENCE"], wait=self.FW["fw_ver"] >= 12)
|
||||
empty_data_byte = 0xFF
|
||||
|
|
@ -3258,7 +3264,7 @@ class LK_Device(ABC):
|
|||
end_address = min(save_size, bank_size)
|
||||
|
||||
if save_size > bank_size:
|
||||
if args["save_type"] == 8 or agb_flash_chip in (0xBF4B, 0xBF5B, 0xFFFF): # Bootleg 1M
|
||||
if args["save_type"] == 8 or agb_flash_chip in (0xBF4B, 0xBF5B, 0xFFFF, 0xBF6D): # Bootleg 1M
|
||||
dprint("Switching to bootleg save bank {:d}".format(bank))
|
||||
self._cart_write(0x1000000, bank)
|
||||
elif args["save_type"] == 5: # FLASH 1M
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ from enum import Enum
|
|||
|
||||
# Common constants
|
||||
APPNAME = "FlashGBX"
|
||||
VERSION_PEP440 = "4.5"
|
||||
VERSION_PEP440 = "4.6"
|
||||
VERSION = "v{:s}".format(VERSION_PEP440)
|
||||
VERSION_TIMESTAMP = 1765034084
|
||||
VERSION_TIMESTAMP = 1769513530
|
||||
DEBUG = False
|
||||
DEBUG_LOG = []
|
||||
APP_PATH = ""
|
||||
|
|
@ -20,8 +20,8 @@ AGB_Header_ROM_Sizes = [ "32 KiB", "64 KiB", "128 KiB", "256 KiB", "512 KiB", "1
|
|||
AGB_Header_ROM_Sizes_Map = [ 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000 ]
|
||||
AGB_Header_Save_Types = [ "None", "4K EEPROM (512 Bytes)", "64K EEPROM (8 KiB)", "256K SRAM/FRAM (32 KiB)", "512K FLASH (64 KiB)", "1M FLASH (128 KiB)", "8M DACS (1 MiB)", "Unlicensed 512K SRAM (64 KiB)", "Unlicensed 1M SRAM (128 KiB)", "Unlicensed Batteryless SRAM" ]
|
||||
AGB_Header_Save_Sizes = [ 0, 512, 8192, 32768, 65536, 131072, 1048576, 65536, 131072, 0 ]
|
||||
AGB_Flash_Save_Chips = { 0xBFD4:"SST 39VF512", 0x1F3D:"Atmel AT29LV512", 0xC21C:"Macronix MX29L512", 0x321B:"Panasonic MN63F805MNP", 0xC209:"Macronix MX29L010", 0x6213:"SANYO LE26FV10N1TS", 0xBF4B:"Unlicensed SST25VF064C", 0xBF5B:"Unlicensed SST49LF080A", 0xFFFF:"Unlicensed 0xFFFF" }
|
||||
AGB_Flash_Save_Chips_Sizes = [ 0x10000, 0x10000, 0x10000, 0x10000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000 ]
|
||||
AGB_Flash_Save_Chips = { 0xBFD4:"SST 39VF512", 0x1F3D:"Atmel AT29LV512", 0xC21C:"Macronix MX29L512", 0x321B:"Panasonic MN63F805MNP", 0xC209:"Macronix MX29L010", 0x6213:"SANYO LE26FV10N1TS", 0xBF4B:"Unlicensed SST25VF064C", 0xBF5B:"Unlicensed SST49LF080A", 0xBF6D:"Unlicensed SST39VF6401B", 0xFFFF:"Unlicensed 0xFFFF" }
|
||||
AGB_Flash_Save_Chips_Sizes = [ 0x10000, 0x10000, 0x10000, 0x10000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000 ]
|
||||
|
||||
DMG_Header_Mapper = { 0x00:'None', 0x01:'MBC1', 0x02:'MBC1+SRAM', 0x03:'MBC1+SRAM+BATTERY', 0x06:'MBC2+SRAM+BATTERY', 0x0F:'MBC3+RTC+BATTERY', 0x10:'MBC3+RTC+SRAM+BATTERY', 0x110:'MBC30+RTC+SRAM+BATTERY', 0x12:'MBC3+SRAM', 0x13:'MBC3+SRAM+BATTERY', 0x19:'MBC5', 0x1A:'MBC5+SRAM', 0x1B:'MBC5+SRAM+BATTERY', 0x1C:'MBC5+RUMBLE', 0x1E:'MBC5+RUMBLE+SRAM+BATTERY', 0x20:'MBC6+SRAM+FLASH+BATTERY', 0x22:'MBC7+ACCELEROMETER+EEPROM', 0x101:'MBC1M', 0x103:'MBC1M+SRAM+BATTERY', 0x0B:'MMM01', 0x0D:'MMM01+SRAM+BATTERY', 0xFC:'MAC-GBD+SRAM+BATTERY', 0x105:'G-MMC1+SRAM+BATTERY', 0x104:'M161', 0xFF:'HuC-1+IR+SRAM+BATTERY', 0xFE:'HuC-3+RTC+SRAM+BATTERY', 0xFD:'TAMA5+RTC+EEPROM', 0x201:'Unlicensed 256M Mapper', 0x202:'Unlicensed Wisdom Tree Mapper', 0x203:'Unlicensed Xploder GB Mapper', 0x204:'Unlicensed Sachen Mapper', 0x205:'Unlicensed Datel Orbit V2 Mapper', 0x206:'Unlicensed MBCX Mapper' }
|
||||
DMG_Mapper_Types = { "None":[ 0x00, 0x08, 0x09 ], "MBC1":[ 0x01, 0x02, 0x03 ], "MBC2":[ 0x05, 0x06 ], "MBC3":[ 0x0F, 0x10, 0x11, 0x12, 0x13 ], "MBC30":[ 0x110 ], "MBC5":[ 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E ], "MBC6":[ 0x20 ], "MBC7":[ 0x22 ], "MBC1M":[ 0x101, 0x103 ], "MMM01":[ 0x0B, 0x0D ], "MAC-GBD":[ 0xFC ], "G-MMC1":[ 0x105 ], "M161":[ 0x104 ], "HuC-1":[ 0xFF ], "HuC-3":[ 0xFE ], "TAMA5":[ 0xFD ], "Unlicensed 256M Multi Cart Mapper":[ 0x201 ], "Unlicensed Wisdom Tree Mapper":[ 0x202 ], "Unlicensed Xploder GB Mapper":[ 0x203 ], "Unlicensed Sachen Mapper":[ 0x204 ], "Unlicensed Datel Orbit V2 Mapper":[ 0x205 ], "Unlicensed MBCX Mapper":[ 0x206 ] }
|
||||
|
|
|
|||
|
|
@ -10152,7 +10152,7 @@
|
|||
"rg": "Japan"
|
||||
},
|
||||
"935b5cefb158e2f283e435d02fae993d672a9456": {
|
||||
"gn": "Ninja Five-0",
|
||||
"gn": "Ninja Five-O",
|
||||
"ne": "(USA)",
|
||||
"gc": "ANXE",
|
||||
"rc": 3946403014,
|
||||
|
|
@ -25452,13 +25452,13 @@
|
|||
},
|
||||
"d081ad5f91422ae9ac82031bc1a0dd7b80b2391d": {
|
||||
"gn": "SpongeBob SquarePants and Friends Unite!",
|
||||
"ne": "(Europe) (En,Fr,De,Es,It)",
|
||||
"ne": "(Europe) (En,Fr,De,Es,Nl)",
|
||||
"gc": "BNUP",
|
||||
"rc": 1629275680,
|
||||
"rs": 4194304,
|
||||
"st": 0,
|
||||
"ss": 0,
|
||||
"lg": "En,Fr,De,Es,It",
|
||||
"lg": "En,Fr,De,Es,Nl",
|
||||
"rg": "Europe"
|
||||
},
|
||||
"0de0357f0a020bbdce5bb16049b2c81256417c0e": {
|
||||
|
|
@ -32085,7 +32085,7 @@
|
|||
},
|
||||
"c5b4c4295034d9696498391839e339c9b4fbdd21": {
|
||||
"gn": "AGB Aging Cartridge",
|
||||
"ne": "(World) (v1.0) (Test Program)",
|
||||
"ne": "(World) (Test Program)",
|
||||
"gc": "TCHK",
|
||||
"rc": 3538423347,
|
||||
"rs": 4194304,
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -5,14 +5,16 @@
|
|||
"GB-M968 with MX29LV320ABTC",
|
||||
"SD007_BV5_DRV with M29W320DT",
|
||||
"Gamebank-web DMG-29W-04 with M29W320ET",
|
||||
"Gamebank-web DMG-29W-04 with M29W320EB"
|
||||
"Gamebank-web DMG-29W-04 with M29W320EB",
|
||||
"Gamebank-web DMG-29W-04 with M29W320DB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x01, 0x01, 0x7E, 0x7E ],
|
||||
[ 0xC2, 0xC2, 0xA8, 0xA8 ],
|
||||
[ 0x20, 0x20, 0xCA, 0xCA ],
|
||||
[ 0x20, 0x20, 0x56, 0x56 ],
|
||||
[ 0x20, 0x20, 0x57, 0x57 ]
|
||||
[ 0x20, 0x20, 0x57, 0x57 ],
|
||||
[ 0x20, 0x20, 0xCB, 0xCB ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"voltage_variants":true,
|
||||
|
|
|
|||
|
|
@ -36,7 +36,11 @@ class FirmwareUpdater():
|
|||
values = struct.unpack(">IBHHH", self.DEVICE.read(11))
|
||||
data = dict(zip(keys, values))
|
||||
data["payload"] = self.DEVICE.read(data["payload_len"])
|
||||
data["outro"] = struct.unpack(">I", self.DEVICE.read(4))[0]
|
||||
try:
|
||||
data["outro"] = self.DEVICE.read(4)
|
||||
data["outro"] = struct.unpack(">I", data["outro"])[0]
|
||||
except struct.error:
|
||||
return {"clone":True, "error": "Erroneous outro response: " + ''.join(format(x, '02X') for x in data["outro"])}
|
||||
return data
|
||||
|
||||
def CRC16(self, data):
|
||||
|
|
@ -87,6 +91,9 @@ class FirmwareUpdater():
|
|||
if data is None:
|
||||
self.DEVICE = None
|
||||
return False
|
||||
if "error" in data:
|
||||
self.DEVICE = None
|
||||
return data
|
||||
if data["seq_no"] != seq_no:
|
||||
self.DEVICE = None
|
||||
return False
|
||||
|
|
@ -120,6 +127,9 @@ class FirmwareUpdater():
|
|||
else:
|
||||
data = self.TryConnect(self.PORT)
|
||||
|
||||
if "error" in data:
|
||||
fncSetStatus(text=data["error"], cloneError="clone" in data and data["clone"] is True)
|
||||
return 2
|
||||
if self.DEVICE is None:
|
||||
fncSetStatus("No device found.")
|
||||
return 2
|
||||
|
|
@ -409,8 +419,15 @@ try:
|
|||
answer = msgbox.exec()
|
||||
return False
|
||||
|
||||
def SetStatus(self, text, enableUI=False, setProgress=None):
|
||||
def SetStatus(self, text, enableUI=False, setProgress=None, cloneError=False):
|
||||
self.lblStatus.setText("Status: {:s}".format(text))
|
||||
|
||||
if cloneError:
|
||||
text = "Your GBFlash device reported a registration error, which means it may be an illegitimate clone. If the error persists, try to get a refund from the seller.\r\n\r\n" + text
|
||||
msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Critical, windowTitle="FlashGBX", text=text, standardButtons=QtWidgets.QMessageBox.Ok)
|
||||
answer = msgbox.exec()
|
||||
return False
|
||||
|
||||
if setProgress is not None:
|
||||
self.prgStatus.setValue(setProgress * 10)
|
||||
if enableUI:
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -87,6 +87,7 @@ for Windows, Linux, macOS (→ [Download](https://github.com/Lesserkuma/FlashGBX
|
|||
- Ferrante Crafts cart 64 KB
|
||||
- Ferrante Crafts cart 512 KB
|
||||
- FunnyPlaying MidnightTrace 4 MiB Flash Cart
|
||||
- Gamebank-web DMG-29W-04 with M29W320DB
|
||||
- Gamebank-web DMG-29W-04 with M29W320EB
|
||||
- Gamebank-web DMG-29W-04 with M29W320ET
|
||||
- GameShark Pro
|
||||
|
|
@ -301,7 +302,7 @@ Available in the GitHub [Releases](https://github.com/Lesserkuma/FlashGBX/releas
|
|||
* Ubuntu (.deb file): Install using `dpkg -i /path/to/FlashGBX_x.x_Ubuntu-all.deb`.
|
||||
* Other distributions: Pre-made Linux packages are available at [JJ-Fox’s repository](https://github.com/JJ-Fox/FlashGBX-Linux-builds/releases/latest).
|
||||
|
||||
* **macOS** *(Monterey 12 or newer)*
|
||||
* **macOS** *(Sequoia 15 or newer)*
|
||||
* x86-64/arm64 (.dmg file): Install by opening the .dmg file and copying over the “FlashGBX” application to the desktop.<br>If it doesn’t run, it probably got quarantined due to the lack of a Apple Developer Program certificate. Right-click the extracted FlashGBX icon, choose “Open Terminal at Folder” and enter this command to unquarantine it: `xattr -d com.apple.quarantine ../FlashGBX.app`.
|
||||
|
||||
*(If you have a Joey Jr and use macOS, please run the [Joey Jr Firmware Updater](https://github.com/Lesserkuma/JoeyJr_FWUpdater) before using FlashGBX.)*
|
||||
|
|
@ -384,7 +385,7 @@ Use this command in a Terminal or Command Prompt window to launch the installed
|
|||
|
||||
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, aronson, Ausar, bbsan, BennVenn, ccs21, chobby, ClassicOldSong, Cliffback, CodyWick13, Corborg, Cristóbal, crizzlycruz, Crystal, Därk, Davidish, delibird_deals, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Eldram, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, Gahr, gandalf1980, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, infinest, inYourBackline, iyatemu, Jayro, Jenetrix, JFox, joyrider3774, jrharbort, JS7457, julgr, Kaede, kane159, KOOORAY, kscheel, kyokohunter, Leitplanke, litlemoran, LovelyA72, Lu, Luca DS, LucentW, luxkiller65, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, Mufsta, olDirdey, orangeglo, paarongiroux, Paradoxical, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, RibShark, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, Sillyhatday, simonK, Sithdown, skite2001, Smelly-Ghost, Sonikks, Squiddy, Stitch, Super Maker, t5b6_de, Tauwasser, TheNFCookie, Timville, twitnic, velipso, Veund, voltagex, Voultar, Warez Waldo, wickawack, Winter1760, Wkr, x7l7j8cc, xactoes, xukkorz, yosoo, Zeii, Zelante, zipplet, Zoo, zvxr
|
||||
2358, 90sFlav, AcoVanConis, AdmirtheSableye, AlexiG, ALXCO-Hardware, AndehX, antPL, aronson, Ausar, bbsan, BennVenn, ccs21, chobby, ClassicOldSong, Cliffback, CodyWick13, Corborg, Cristóbal, crizzlycruz, Crystal, Därk, Davidish, delibird_deals, DevDavisNunez, Diddy_Kong, djedditt, Dr-InSide, dyf2007, easthighNerd, EchelonPrime, edo999, Eldram, Ell, EmperorOfTigers, endrift, Erba Verde, ethanstrax, eveningmoose, Falknör, FerrantePescara, frarees, Frost Clock, Gahr, gandalf1980, gboh, gekkio, Godan, Grender, HDR, Herax, Hiccup, hiks, howie0210, iamevn, Icesythe7, ide, infinest, inYourBackline, iyatemu, Jayro, Jenetrix, JFox, joyrider3774, jrharbort, JS7457, julgr, Kaede, kane159, KOOORAY, kscheel, kyokohunter, Leitplanke, litlemoran, LovelyA72, Lu, Luca DS, LucentW, luxkiller65, manuelcm1, marv17, Merkin, metroid-maniac, Mr_V, Mufsta, olDirdey, orangeglo, paarongiroux, Paradoxical, Pese, Rairch, Raphaël BOICHOT, redalchemy, RetroGorek, RevZ, RibShark, s1cp, Satumox, Sgt.DoudouMiel, SH, Shinichi999, Sillyhatday, simonK, Sithdown, skite2001, Smelly-Ghost, Sonikks, Squiddy, Stitch, Super Maker, t5b6_de, Tauwasser, TheNFCookie, Timville, twitnic, velipso, Veund, voltagex, Voultar, Warez Waldo, wickawack, Winter1760, Wkr, x7l7j8cc, xactoes, xukkorz, yosoo, Zeii, Zelante, zipplet, Zoo, zvxr
|
||||
|
||||
Thanks to the No-Intro project for their game databases which FlashGBX’s databases are partly based on.
|
||||
|
||||
|
|
|
|||
2
setup.py
2
setup.py
|
|
@ -8,7 +8,7 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read(
|
|||
|
||||
setuptools.setup(
|
||||
name="FlashGBX",
|
||||
version="4.5",
|
||||
version="4.6",
|
||||
author="Lesserkuma",
|
||||
description="Reads and writes Game Boy and Game Boy Advance cartridge data",
|
||||
url="https://github.com/Lesserkuma/FlashGBX",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user