mirror of
https://github.com/lesserkuma/FlashGBX.git
synced 2026-08-26 18:54:28 -05:00
v0.7β
This commit is contained in:
BIN
.github/FlashGBX_Ubuntu.png
vendored
Normal file
BIN
.github/FlashGBX_Ubuntu.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
BIN
.github/FlashGBX_Windows.png
vendored
Normal file
BIN
.github/FlashGBX_Windows.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
140
README.md
Normal file
140
README.md
Normal file
@@ -0,0 +1,140 @@
|
||||
# FlashGBX
|
||||
|
||||
by Lesserkuma
|
||||
|
||||
<img src="/.github/FlashGBX_Windows.png" alt="Screenshot" width="500">
|
||||
<img src="/.github/FlashGBX_Ubuntu.png" alt="Screenshot" width="500">
|
||||
|
||||
## Introduction
|
||||
|
||||
### Software features
|
||||
|
||||
- Backup and restore save data from Game Boy and Game Boy Advance game cartridges
|
||||
- Backup ROM data from Game Boy and Game Boy Advance game cartridges
|
||||
- Flash new ROMs to a wide variety of Game Boy and Game Boy Advance flash cartridges
|
||||
- Many flash cartridges can be auto-detected
|
||||
- A Flash ID check can be performed for unsupported flash cartridges
|
||||
|
||||
### Confirmed working reader/writer hardware
|
||||
|
||||
- [insideGadgets GBxCart RW v1.3 and v1.3 Pro](https://www.gbxcart.com/) with firmware versions from R17 up to R19 (other hardware revisions and firmware versions may also work, but are untested)
|
||||
|
||||
### Currently supported flash cartridges
|
||||
|
||||
- Game Boy
|
||||
|
||||
- insideGadgets 32 KB *(thanks AlexiG)*
|
||||
- insideGadgets 512 KB *(thanks AlexiG)*
|
||||
- insideGadgets 1 MB, 128 KB SRAM *(thanks AlexiG)*
|
||||
- insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM *(thanks AlexiG)*
|
||||
- insideGadgets 4 MB, 128 KB SRAM/FRAM *(thanks AlexiG)*
|
||||
- insideGadgets 4 MB, 32 KB FRAM, MBC3+RTC *(thanks AlexiG)*
|
||||
- BUNG Doctor GB Card 64M
|
||||
- GB Smart 32M
|
||||
|
||||
- Game Boy Advance
|
||||
|
||||
- Flash2Advance 256M (non-ultra variant)
|
||||
- Nintendo AGB Cartridge 128M Flash S, E201850
|
||||
- Nintendo AGB Cartridge 256M Flash S, E201868
|
||||
|
||||
### Currently supported bootleg cartridges
|
||||
|
||||
- Game Boy
|
||||
|
||||
- DIY cart with AM29F016/AM29F016B *(thanks RevZ)*
|
||||
- ES29LV160_DRV with 29DL32TF-70
|
||||
- GB-M968 with M29W160EB *(thanks RevZ)*
|
||||
- GB-M968 with MX29LV320ABTC
|
||||
- S29GL032 (no PCB text)
|
||||
- SD007_48BALL_64M with GL032M11BAIR4 *(thanks RevZ)*
|
||||
- SD007_48BALL_64M with M29W640
|
||||
- SD007_48BALL_64M_V3 with 29DL161TD-90
|
||||
- SD007_48BALL_64M_V5 with 36VF3204
|
||||
- SD007_48BALL_64M_V6 with 29DL163BD-90 *(thanks LovelyA72)*
|
||||
- SD007_BV5_V2 with HY29LV160TT *(thanks RevZ)*
|
||||
- SD007_BV5_V2 with MX29LV320BTC *(thanks RevZ)*
|
||||
- SD007_BV5_V3 with AM29LV160MB *(thanks RevZ)*
|
||||
|
||||
- Game Boy Advance
|
||||
|
||||
- 28F256L03B-DRV with 256L30B
|
||||
- 4455_4400_4000_4350_36L0R_V3 with M36L0R705
|
||||
- AGB-E05-01 with MSP55LV128M
|
||||
- AGB-SD-E05 with MSP55LV128 *(thanks RevZ)*
|
||||
- BX2006_0106_NEW with S29GL128N10TFI01 *(thanks litlemoran)*
|
||||
|
||||
Many different bootleg cartridges share their command set, so even if yours is not on this list, it may still work fine or even be detected as another one. Support for more cartridges can also be added by creating external config files that include the necessary flash chip commands.
|
||||
|
||||
## DISCLAIMER
|
||||
|
||||
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!
|
||||
|
||||
## System Requirements and Setup Instructions
|
||||
|
||||
Requires [Python 3.8+](https://www.python.org/downloads/) with [PySide2](https://pypi.org/project/PySide2/) and [pyserial](https://pypi.org/project/pyserial/) packages. If these are available for your Operating System, it should be compatible.
|
||||
|
||||
Developed and tested using the *insideGadgets GBxCart RW v1.3 Pro* hardware device on Windows 10. Also confirmed working on most Debian-based Linux distributions including Ubuntu.
|
||||
|
||||
### Windows
|
||||
|
||||
There are multiple options to run this application on Windows:
|
||||
|
||||
* You can install the app with the Setup program. This will add the app to the start menu and optionally create a desktop icon.
|
||||
* Or, you can extract the Portable package and run the precompiled `FlashGBX.exe` file (created with *PyInstaller*) which includes the Python interpreter, required packages and libraries.
|
||||
* Or, you can install Python and run the app directly from source code:
|
||||
1. Install [Python 3.8+](https://www.python.org/downloads/)
|
||||
2. Open a Command Prompt window and install PySide2 and pyserial like so:<br>`pip install PySide2 pyserial`
|
||||
3. Run `FlashGBX.py`
|
||||
|
||||
### Linux
|
||||
|
||||
#### Manual setup procedure tested on Ubuntu 20.04.1 LTS
|
||||
|
||||
1. Update the package list:<br>`sudo apt update`
|
||||
2. Install Python3, pip for Python 3 and the XCB library package (required by PySide2/Qt5):<br>`sudo apt install python3 python3-pip libxcb-xinerama0`<br>If it says “Package 'python3-pip' has no installation candidate”, you may need to run this command first and then try again:<br>`sudo add-apt-repository universe`
|
||||
3. Install PySide2 and pyserial using pip:<br>`sudo pip3 install PySide2 pyserial`
|
||||
4. At this point you could run the app with `sudo` privileges, but to avoid that you will need access permissions for your cart reader/writer hardware. Here are some ways to do that:
|
||||
* Add yourself to the *dialout* usergroup and then reboot the system:<br>`sudo adduser $USER dialout`<br>`sudo reboot`
|
||||
* Or, add permanent user permissions to your device. (No reboot required.)
|
||||
1. Create a udev rules file:<br>`sudoedit /etc/udev/rules.d/50-ttyusb.rules`
|
||||
2. Add the following line to this file (GBxCart RW uses Vendor ID *1a86* and Product ID *7523*):<br>`KERNEL=="ttyUSB[0-9]*",ATTRS{idVendor}=="1a86",ATTRS{idProduct}=="7523",MODE="0666"`
|
||||
3. Reload your udev configuration:<br>`sudo udevadm control --reload`
|
||||
4. Connect your cart reader/writer to a USB port. (If it was already connected, unplug and reconnect it.)
|
||||
6. Run the app:<br>`python3 FlashGBX.py`
|
||||
|
||||
#### Automated install script for Debian-based distributions
|
||||
|
||||
A third-party install script contributed by *RevZ* for your convenience is also available. This is not maintained by me, but this should take care of installing all the prerequisites and copy everything to a subdirectory in your home directory. It also adds a shortcut to your desktop.
|
||||
|
||||
After extracting all FlashGBX files into a temporary directory, get the installer [here](https://pastebin.com/fDsYh1Eb), place it into the same directory, adjust permissions (`chmod +x installer.sh`) and run it (`./installer.sh`). After the install is complete you may still have to reboot, and right click the Desktop icon to “Allow Launching”.
|
||||
|
||||
## Contributions
|
||||
|
||||
The author would like to thank the following kind people for their help and contributions:
|
||||
|
||||
- AlexiG (GBxCart RW hardware, bug reports, flash chip info)
|
||||
- RevZ (install script for Linux, testing, bug reports, flash chip info)
|
||||
- AndehX (app icon)
|
||||
- LovelyA72 (flash chip info)
|
||||
- litlemoran (flash chip info)
|
||||
|
||||
## Changes
|
||||
|
||||
### v0.7β
|
||||
|
||||
- First started tracking changes
|
||||
- Added a way to launch the flash cartridge type auto-detection process from the type list
|
||||
- Added support for SD007_48BALL_64M_V6 with 29DL163BD-90 *(thanks LovelyA72)*
|
||||
- Confirmed support for BX2006_0106_NEW with S29GL128N10TFI01 (same as AGB-E05-01 with MSP55LV128M) *(thanks litlemoran)*
|
||||
- Fixed config file for 4455_4400_4000_4350_36L0R_V3 with M36L0R705 (sector size map was incomplete)
|
||||
- Renamed some labels of flash cartridge types
|
||||
- Made config files UTF-8 compatible
|
||||
- File open and save dialogs will now remember the last used directory for ROM files and save data files respectively (stored in config.ini in AppData/Roaming), clearable with the `--resetconfig` switch
|
||||
- Added CRC32 checksum comparison for Game Boy Advance games by using a database based on header SHA1 hashes
|
||||
- Fixed a bug with save data restore and improved save data backup speed
|
||||
- Fixed a few status message errors
|
||||
- Added a warning when changing platforms
|
||||
- Made some messages suppressible (stored in config.ini)
|
||||
- Added detection of ungraceful device disconnects when starting a new task, with optional automatic reconnect
|
||||
- First public beta release
|
||||
42
src/DataTransfer.py
Normal file
42
src/DataTransfer.py
Normal file
@@ -0,0 +1,42 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# UTF-8
|
||||
import sys
|
||||
from PySide2.QtCore import QThread, Signal
|
||||
|
||||
class DataTransfer(QThread):
|
||||
CONFIG = None
|
||||
RUNNING = False
|
||||
|
||||
updateProgress = Signal(object, int, int, float, float, float)
|
||||
|
||||
def __init__(self, config=None):
|
||||
QThread.__init__(self)
|
||||
self.CONFIG = config
|
||||
|
||||
def isRunning(self):
|
||||
return self.RUNNING
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
if self.CONFIG == None:
|
||||
pass
|
||||
elif self.CONFIG['mode'] == 1:
|
||||
self.RUNNING = True
|
||||
self.CONFIG['port']._TransferData(1, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['rom_banks'], self.CONFIG['agb_rom_size'] ])
|
||||
self.RUNNING = False
|
||||
elif self.CONFIG['mode'] == 2:
|
||||
self.RUNNING = True
|
||||
self.CONFIG['port']._TransferData(2, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['save_type'] ])
|
||||
self.RUNNING = False
|
||||
elif self.CONFIG['mode'] == 3:
|
||||
self.RUNNING = True
|
||||
self.CONFIG['port']._TransferData(3, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['save_type'] ])
|
||||
self.RUNNING = False
|
||||
elif self.CONFIG['mode'] == 4:
|
||||
self.RUNNING = True
|
||||
self.CONFIG['port']._TransferData(4, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['cart_type'] ])
|
||||
self.RUNNING = False
|
||||
|
||||
except Exception as e:
|
||||
self.updateProgress.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"An error has occured!\nPlease try to reconnect the hardware and restart the application.\n\n" + str(e), "abortable":False}, 0, 0, 0, 0, 0)
|
||||
self.RUNNING = False
|
||||
1248
src/FlashGBX.py
Normal file
1248
src/FlashGBX.py
Normal file
File diff suppressed because it is too large
Load Diff
71
src/RomFileAGB.py
Normal file
71
src/RomFileAGB.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# UTF-8
|
||||
import hashlib, re, zlib, sys, string
|
||||
|
||||
class RomFileAGB:
|
||||
ROMFILE_PATH = None
|
||||
ROMFILE = bytearray()
|
||||
|
||||
def __init__(self, file=None):
|
||||
if isinstance(file, str):
|
||||
self.ROMFILE_PATH = file
|
||||
if self.ROMFILE_PATH != None: self.Load()
|
||||
elif isinstance(file, bytearray):
|
||||
self.ROMFILE = file
|
||||
|
||||
def Open(self, file):
|
||||
self.ROMFILE_PATH = file
|
||||
self.Load()
|
||||
|
||||
def Load(self):
|
||||
with open(self.ROMFILE_PATH, "rb") as f:
|
||||
self.ROMFILE = bytearray(f.read())
|
||||
|
||||
def CalcChecksumHeader(self, fix=False):
|
||||
buffer = self.ROMFILE
|
||||
checksum = 0
|
||||
for i in range(0xA0, 0xBD):
|
||||
checksum = checksum - buffer[i]
|
||||
checksum = (checksum - 0x19) & 0xFF
|
||||
|
||||
if fix: buffer[0x14D] = checksum
|
||||
return checksum
|
||||
|
||||
def CalcChecksumGlobal(self):
|
||||
buffer = self.ROMFILE
|
||||
return (zlib.crc32(buffer) & 0xffffffff)
|
||||
|
||||
def FixChecksums(self):
|
||||
self.CalcChecksumHeader(True)
|
||||
|
||||
def GetHeader(self):
|
||||
buffer = self.ROMFILE
|
||||
data = {}
|
||||
data["logo_correct"] = hashlib.sha1(buffer[0x04:0xA0]).digest() == bytearray([ 0x17, 0xDA, 0xA0, 0xFE, 0xC0, 0x2F, 0xC3, 0x3C, 0x0F, 0x6A, 0xBB, 0x54, 0x9A, 0x8B, 0x80, 0xB6, 0x61, 0x3B, 0x48, 0xEE ])
|
||||
game_title = bytearray(buffer[0xA0:0xAC]).decode("ascii", "replace")
|
||||
game_title = re.sub(r"(\x00+)$", "", game_title).replace("\x00", "_")
|
||||
game_title = ''.join(filter(lambda x: x in set(string.printable), game_title))
|
||||
data["game_title"] = game_title
|
||||
game_code = bytearray(buffer[0xAC:0xB0]).decode("ascii", "replace")
|
||||
game_code = re.sub(r"(\x00+)$", "", game_code).replace("\x00", "_")
|
||||
game_code = ''.join(filter(lambda x: x in set(string.printable), game_code))
|
||||
data["game_code"] = game_code
|
||||
maker_code = bytearray(buffer[0xB0:0xB2]).decode("ascii", "replace")
|
||||
maker_code = re.sub(r"(\x00+)$", "", maker_code).replace("\x00", "_")
|
||||
maker_code = ''.join(filter(lambda x: x in set(string.printable), maker_code))
|
||||
|
||||
data["maker_code"] = maker_code
|
||||
data["header_checksum"] = int(buffer[0xBD])
|
||||
data["header_checksum_calc"] = self.CalcChecksumHeader()
|
||||
data["header_checksum_correct"] = data["header_checksum"] == data["header_checksum_calc"]
|
||||
data["header_sha1"] = hashlib.sha1(buffer[0x00:0xC0]).hexdigest()
|
||||
data["version"] = int(buffer[0xBC])
|
||||
data["96h_correct"] = (buffer[0xB2] == 0x96)
|
||||
data["rom_checksum_calc"] = self.CalcChecksumGlobal()
|
||||
data["rom_size_calc"] = int(len(buffer))
|
||||
data["save_type"] = None
|
||||
data["save_size"] = 0
|
||||
return data
|
||||
|
||||
def GetData(self):
|
||||
return self.ROMFILE
|
||||
93
src/RomFileDMG.py
Normal file
93
src/RomFileDMG.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# UTF-8
|
||||
import hashlib, re, sys, string
|
||||
|
||||
class RomFileDMG:
|
||||
DMG_Header_Features = { 0x00:'ROM ONLY', 0x01:'MBC1', 0x02:'MBC1+RAM', 0x03:'MBC1+RAM+BATTERY', 0x05:'MBC2', 0x06:'MBC2+BATTERY', 0x08:'ROM+RAM', 0x09:'ROM+RAM+BATTERY', 0x0B:'MMM01', 0x0C:'MMM01+RAM', 0x0D:'MMM01+RAM+BATTERY', 0x0F:'MBC3+TIMER+BATTERY', 0x10:'MBC3+TIMER+RAM+BATTERY', 0x11:'MBC3', 0x12:'MBC3+RAM', 0x13:'MBC3+RAM+BATTERY', 0x15:'MBC4', 0x16:'MBC4+RAM', 0x17:'MBC4+RAM+BATTERY', 0x19:'MBC5', 0x1A:'MBC5+RAM', 0x1B:'MBC5+RAM+BATTERY', 0x1C:'MBC5+RUMBLE', 0x1D:'MBC5+RUMBLE+RAM', 0x1E:'MBC5+RUMBLE+RAM+BATTERY', 0x20:'MBC6', 0x22:'MBC7+SENSOR+RUMBLE+RAM+BATTERY', 0x55:'Game Genie', 0x56:'Game Genie v3.0', 0xFC:'POCKET CAMERA', 0xFD:'BANDAI TAMA5', 0xFE:'HuC3', 0xFF:'HuC1+RAM+BATTERY' }
|
||||
DMG_Header_ROM_Sizes = { 0x00:0x8000, 0x01:0x10000, 0x02:0x20000, 0x03:0x40000, 0x04:0x80000, 0x05:0x100000, 0x52:0x120000, 0x53:0x140000, 0x54:0x180000, 0x06:0x200000, 0x07:0x400000, 0x08:0x800000 }
|
||||
DMG_Header_RAM_Sizes = { 0x00:0, 0x01:0x800, 0x02:0x2000, 0x03:0x8000, 0x05:0x10000, 0x04:0x20000 }
|
||||
DMG_Header_SGB = { 0x00:'No support', 0x03:'Supported' }
|
||||
DMG_Header_CGB = { 0x00:'No support', 0x80:'Supported', 0xC0:'Required' }
|
||||
|
||||
ROMFILE_PATH = None
|
||||
ROMFILE = bytearray()
|
||||
|
||||
def __init__(self, file=None):
|
||||
if isinstance(file, str):
|
||||
self.ROMFILE_PATH = file
|
||||
if self.ROMFILE_PATH != None: self.Load()
|
||||
elif isinstance(file, bytearray):
|
||||
self.ROMFILE = file
|
||||
|
||||
def Open(self, file):
|
||||
self.ROMFILE_PATH = file
|
||||
self.Load()
|
||||
|
||||
def Load(self):
|
||||
with open(self.ROMFILE_PATH, "rb") as f:
|
||||
self.ROMFILE = bytearray(f.read())
|
||||
|
||||
def CalcChecksumHeader(self, fix=False):
|
||||
buffer = self.ROMFILE
|
||||
checksum = 0
|
||||
for i in range(0x134, 0x14D):
|
||||
checksum = checksum - buffer[i] - 1
|
||||
checksum = checksum & 0xFF
|
||||
|
||||
if fix: buffer[0x14D] = checksum
|
||||
return checksum
|
||||
|
||||
def CalcChecksumGlobal(self, fix=False):
|
||||
buffer = self.ROMFILE
|
||||
checksum = 0
|
||||
for i in range(0, len(buffer), 2):
|
||||
if i != 0x14E:
|
||||
checksum = checksum + buffer[i + 1]
|
||||
checksum = checksum + buffer[i]
|
||||
|
||||
if fix:
|
||||
buffer[0x14E] = checksum >> 8
|
||||
buffer[0x14F] = checksum & 0xFF
|
||||
return checksum & 0xFFFF
|
||||
|
||||
def FixChecksums(self):
|
||||
self.CalcChecksumHeader(True)
|
||||
self.CalcChecksumGlobal(True)
|
||||
|
||||
def GetHeader(self):
|
||||
buffer = self.ROMFILE
|
||||
data = {}
|
||||
data["logo_correct"] = hashlib.sha1(buffer[0x104:0x134]).digest() == bytearray([ 0x07, 0x45, 0xFD, 0xEF, 0x34, 0x13, 0x2D, 0x1B, 0x3D, 0x48, 0x8C, 0xFB, 0xDF, 0x03, 0x79, 0xA3, 0x9F, 0xD5, 0x4B, 0x4C ])
|
||||
game_title = bytearray(buffer[0x134:0x143]).decode("ascii", "replace")
|
||||
game_title = re.sub(r"(\x00+)$", "", game_title).replace("\x00", "_")
|
||||
game_title = ''.join(filter(lambda x: x in set(string.printable), game_title))
|
||||
data["game_title"] = game_title
|
||||
data["maker_code"] = format(int(buffer[0x14B]), "02X")
|
||||
if data["maker_code"] == '33':
|
||||
maker_code = bytearray(buffer[0x144:0x146]).decode("ascii", "replace")
|
||||
maker_code = ''.join(filter(lambda x: x in set(string.printable), maker_code))
|
||||
data["maker_code_new"] = maker_code
|
||||
data["cgb"] = int(buffer[0x143])
|
||||
data["sgb"] = int(buffer[0x146])
|
||||
data["features_raw"] = int(buffer[0x147])
|
||||
data["features"] = "?"
|
||||
if buffer[0x147] in self.DMG_Header_Features: data["features"] = self.DMG_Header_Features[buffer[0x147]]
|
||||
data["rom_size_raw"] = int(buffer[0x148])
|
||||
data["rom_size"] = "?"
|
||||
if buffer[0x148] in self.DMG_Header_ROM_Sizes: data["rom_size"] = self.DMG_Header_ROM_Sizes[buffer[0x148]]
|
||||
data["ram_size_raw"] = int(buffer[0x149])
|
||||
if data["features"] == 0x05 or data["features"] == 0x06:
|
||||
data["ram_size"] = 0x200
|
||||
else:
|
||||
data["ram_size"] = "?"
|
||||
if buffer[0x149] in self.DMG_Header_RAM_Sizes: data["ram_size"] = self.DMG_Header_RAM_Sizes[buffer[0x149]]
|
||||
data["header_checksum"] = int(buffer[0x14D])
|
||||
data["header_checksum_calc"] = self.CalcChecksumHeader()
|
||||
data["header_checksum_correct"] = data["header_checksum"] == data["header_checksum_calc"]
|
||||
data["rom_checksum"] = int(256 * buffer[0x14E] + buffer[0x14F])
|
||||
data["rom_checksum_calc"] = self.CalcChecksumGlobal()
|
||||
data["rom_checksum_correct"] = data["rom_checksum"] == data["rom_checksum_calc"]
|
||||
return data
|
||||
|
||||
def GetData(self):
|
||||
return self.ROMFILE
|
||||
1
src/config/db_AGB.json
Normal file
1
src/config/db_AGB.json
Normal file
File diff suppressed because one or more lines are too long
77
src/config/fc_AGB_256L30B.txt
Normal file
77
src/config/fc_AGB_256L30B.txt
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"28F256L03B-DRV with 256L30B"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x8A, 0x00, 0x15, 0x88 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x2000000,
|
||||
"sector_size":[
|
||||
[0x08000, 4],
|
||||
[0x20000, 255]
|
||||
],
|
||||
"single_write_7FC0_to_7FFF":true,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ],
|
||||
[ 0x200000, 0xFF ],
|
||||
[ 0x400000, 0xFF ],
|
||||
[ 0x600000, 0xFF ],
|
||||
[ 0x800000, 0xFF ],
|
||||
[ 0xA00000, 0xFF ],
|
||||
[ 0xC00000, 0xFF ],
|
||||
[ 0xE00000, 0xFF ],
|
||||
[ 0x1000000, 0xFF ],
|
||||
[ 0x1200000, 0xFF ],
|
||||
[ 0x1400000, 0xFF ],
|
||||
[ 0x1600000, 0xFF ],
|
||||
[ 0x1800000, 0xFF ],
|
||||
[ 0x1A00000, 0xFF ],
|
||||
[ 0x1C00000, 0xFF ],
|
||||
[ 0x1E00000, 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, 0x80 ]
|
||||
],
|
||||
"buffer_write":[
|
||||
[ "SA", 0x60 ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA", 0xE8 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA", 0xFF ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0x80 ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0x80 ],
|
||||
[ null, null, null ]
|
||||
],
|
||||
"single_write":[
|
||||
[ "PA", 0x40 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0x80 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
74
src/config/fc_AGB_Flash2Advance.txt
Normal file
74
src/config/fc_AGB_Flash2Advance.txt
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"Flash2Advance 256M with 2x 28F128J3A150"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x89, 0x00, 0x89, 0x00, 0x18, 0x00, 0x18, 0x00 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x2000000,
|
||||
"sector_size":0x40000,
|
||||
"commands":{
|
||||
"unlock":[
|
||||
[ 0x130ECA8, 0x5354, 1 ],
|
||||
[ 0x002468A, 0x1234, 5 ],
|
||||
[ 0x000ECA8, 0x5354, 1 ],
|
||||
[ 0x002468A, 0x5354, 1 ],
|
||||
[ 0x002468A, 0x5678, 5 ],
|
||||
[ 0x130ECA8, 0x5354, 1 ],
|
||||
[ 0x002468A, 0x5354, 1 ],
|
||||
[ 0x0ECA800, 0x5678, 1 ],
|
||||
[ 0x00268A0, 0x1234, 1 ],
|
||||
[ 0x002468A, 0xABCD, 5 ],
|
||||
[ 0x130ECA8, 0x5354, 1 ],
|
||||
[ 0x1E2468A, 0x9413, 1 ]
|
||||
],
|
||||
"reset":[
|
||||
[ 0, 0xFF ],
|
||||
[ 2, 0xFF ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0, 0x90 ],
|
||||
[ 2, 0x90 ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ "SA", 0x20 ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA+2", 0x20 ],
|
||||
[ "SA+2", 0xD0 ],
|
||||
[ null, null ],
|
||||
[ null, null ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0xFFFF ],
|
||||
[ "SA+2", 0x80, 0xFFFF ]
|
||||
],
|
||||
"buffer_write":[
|
||||
[ "SA", 0xE8 ],
|
||||
[ "SA+2", 0xE8 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "SA+2", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA+2", 0xD0 ],
|
||||
[ null, null ],
|
||||
[ null, null ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ 0, 0x80, 0x8080 ],
|
||||
[ 2, 0x80, 0x8080 ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0x80, 0xFFFF ],
|
||||
[ 2, 0x80, 0xFFFF ]
|
||||
]
|
||||
}
|
||||
}
|
||||
68
src/config/fc_AGB_M36L0R705.txt
Normal file
68
src/config/fc_AGB_M36L0R705.txt
Normal file
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"4455_4400_4000_4350_36L0R_V3 with M36L0R705"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x20, 0x00, 0xC4, 0x88 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
"sector_size":[
|
||||
[0x20000, 127],
|
||||
[0x08000, 4]
|
||||
],
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ],
|
||||
[ 0x100000, 0xFF ],
|
||||
[ 0x200000, 0xFF ],
|
||||
[ 0x300000, 0xFF ],
|
||||
[ 0x400000, 0xFF ],
|
||||
[ 0x500000, 0xFF ],
|
||||
[ 0x600000, 0xFF ],
|
||||
[ 0x700000, 0xFF ],
|
||||
[ 0x800000, 0xFF ],
|
||||
[ 0x900000, 0xFF ],
|
||||
[ 0xA00000, 0xFF ],
|
||||
[ 0xB00000, 0xFF ],
|
||||
[ 0xC00000, 0xFF ],
|
||||
[ 0xD00000, 0xFF ],
|
||||
[ 0xE00000, 0xFF ],
|
||||
[ 0xF00000, 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", 0x60 ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA", 0xE8 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA", 0xFF ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0xFFFF ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0xFFFF ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
67
src/config/fc_AGB_MSP55LV128.txt
Normal file
67
src/config/fc_AGB_MSP55LV128.txt
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"AGB-SD-E05 with MSP55LV128"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x04, 0x00, 0x7D, 0x22 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
"sector_size":0x10000,
|
||||
"chip_erase_timeout":75,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFFFF, 0xFFFF ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ "SA", 0x30 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0xFFFF, 0xFFFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xA9 ],
|
||||
[ 0x2AA, 0x56 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
69
src/config/fc_AGB_MSP55LV128M.txt
Normal file
69
src/config/fc_AGB_MSP55LV128M.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"AGB-E05-01 with MSP55LV128M",
|
||||
"BX2006_0106_NEW with S29GL128N10TFI01"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x02, 0x00, 0x7D, 0x22 ],
|
||||
[ 0x02, 0x00, 0x7D, 0x22 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
"sector_size":0x20000,
|
||||
"chip_erase_timeout":75,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFFFF, 0xFFFF ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ "SA", 0x30 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0xFFFF, 0xFFFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xA9 ],
|
||||
[ 0x2AA, 0x56 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
62
src/config/fc_AGB_Nintendo_E201850.txt
Normal file
62
src/config/fc_AGB_Nintendo_E201850.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"Nintendo AGB Cartridge 128M Flash S, E201850"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xB0, 0x00, 0xE2, 0x00 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x1000000,
|
||||
"chip_erase_timeout":80,
|
||||
"wait_read_status_register":true,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ]
|
||||
],
|
||||
"read_status_register":[
|
||||
[ 0, 0x70 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0, 0x30 ],
|
||||
[ 0, 0xD0 ],
|
||||
[ 0x400000, 0x30 ],
|
||||
[ 0x400000, 0xD0 ],
|
||||
[ 0x800000, 0x30 ],
|
||||
[ 0x800000, 0xD0 ],
|
||||
[ 0xC00000, 0x30 ],
|
||||
[ 0xC00000, 0xD0 ],
|
||||
[ 0, 0x70 ],
|
||||
[ 0x400000, 0x70 ],
|
||||
[ 0x800000, 0x70 ],
|
||||
[ 0xC00000, 0x70 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0x80, 0x80 ],
|
||||
[ 0x400000, 0x80, 0x80 ],
|
||||
[ 0x800000, 0x80, 0x80 ],
|
||||
[ 0xC00000, 0x80, 0x80 ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0, 0x70 ],
|
||||
[ 0, 0x10 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ 0, 0x80, 0x80 ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
57
src/config/fc_AGB_Nintendo_E201868.txt
Normal file
57
src/config/fc_AGB_Nintendo_E201868.txt
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"type":"AGB",
|
||||
"names":[
|
||||
"Nintendo AGB Cartridge 256M Flash S, E201868"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xB0, 0x00, 0xB0, 0x00 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x2000000,
|
||||
"sector_size":[
|
||||
[0x10000, 127],
|
||||
[0x02000, 8],
|
||||
[0x10000, 127],
|
||||
[0x02000, 8],
|
||||
[0x10000, 127],
|
||||
[0x02000, 8],
|
||||
[0x10000, 127],
|
||||
[0x02000, 8]
|
||||
],
|
||||
"wait_read_status_register":true,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ]
|
||||
],
|
||||
"read_status_register":[
|
||||
[ 0, 0x70 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0, 0x90 ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ "SA", 0x60 ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ "SA", 0x20 ],
|
||||
[ "SA", 0xD0 ],
|
||||
[ 0, 0x70 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0x80 ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0, 0x70 ],
|
||||
[ 0, 0x10 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ 0, 0x80, 0x80 ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
55
src/config/fc_DMG_29DL161TD-90.txt
Normal file
55
src/config/fc_DMG_29DL161TD-90.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_48BALL_64M_V3 with 29DL161TD-90",
|
||||
"SD007_48BALL_64M_V6 with 29DL163BD-90"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x04, 0x04, 0x35, 0x35 ],
|
||||
[ 0x04, 0x04, 0x2B, 0x2B ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":50,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_29DL32TF-70.txt
Normal file
53
src/config/fc_DMG_29DL32TF-70.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"ES29LV160_DRV with 29DL32TF-70"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x04, 0x04, 0x7D, 0x7D ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":50,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_36VF3204.txt
Normal file
53
src/config/fc_DMG_36VF3204.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_48BALL_64M_V5 with 36VF3204"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xBF, 0x00, 0x53, 0x73 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":5,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_AM29F016.txt
Normal file
53
src/config/fc_DMG_AM29F016.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"AM29F016/AM29F016B (DIY cart)"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x01, 0xAD, 0x00, 0x00 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":60,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x80 ],
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_AM29LV160MB.txt
Normal file
53
src/config/fc_DMG_AM29LV160MB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_BV5_V3 with AM29LV160MB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x02, 0x02, 0x4A, 0x4A ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":70,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
43
src/config/fc_DMG_Doctor_GB_Card_64M.txt
Normal file
43
src/config/fc_DMG_Doctor_GB_Card_64M.txt
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"BUNG Doctor GB Card 64M"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x89, 0x89, 0x15, 0x15 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x800000,
|
||||
"sector_size":0x20000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"VIN",
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0, 0x90 ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ 0x4000, 0x20 ],
|
||||
[ 0x4000, 0xD0 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ 0x4000, 0x80, 0x80 ]
|
||||
],
|
||||
"buffer_write":[
|
||||
[ "SA", 0xE8 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0xD0 ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ "SA", 0x80, 0xFF ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0xFF ]
|
||||
]
|
||||
}
|
||||
}
|
||||
43
src/config/fc_DMG_GB_Smart_32M.txt
Normal file
43
src/config/fc_DMG_GB_Smart_32M.txt
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"GB Smart 32M"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x89, 0x89, 0x14, 0x14 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x400000,
|
||||
"sector_size":0x20000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"VIN",
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xFF ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0, 0x90 ]
|
||||
],
|
||||
"sector_erase":[
|
||||
[ 0x4000, 0x20 ],
|
||||
[ 0x4000, 0xD0 ]
|
||||
],
|
||||
"sector_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ 0x4000, 0x80, 0x80 ]
|
||||
],
|
||||
"buffer_write":[
|
||||
[ "SA", 0xE8 ],
|
||||
[ "SA", "BS" ],
|
||||
[ "PA", "PD" ],
|
||||
[ "SA", 0xD0 ]
|
||||
],
|
||||
"buffer_write_wait_for":[
|
||||
[ "SA", 0x80, 0xFF ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ "SA", 0x80, 0xFF ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_HY29LV160TT.txt
Normal file
53
src/config/fc_DMG_HY29LV160TT.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_BV5_V2 with HY29LV160TT"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xAE, 0xAE, 0xC4, 0xC4 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":60,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_M29W160EB.txt
Normal file
53
src/config/fc_DMG_M29W160EB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"GB-M968 with M29W160EB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x20, 0x20, 0x49, 0x49 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":30,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 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 ]
|
||||
],
|
||||
"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 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_M29W640.txt
Normal file
53
src/config/fc_DMG_M29W640.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_48BALL_64M with M29W640"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x20, 0x00, 0x7D, 0x00 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":70,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_MX29LV320ABTC.txt
Normal file
53
src/config/fc_DMG_MX29LV320ABTC.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"GB-M968 with MX29LV320ABTC"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xC2, 0xC2, 0xA8, 0xA8 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":60,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 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 ]
|
||||
],
|
||||
"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 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_MX29LV320BTC.txt
Normal file
53
src/config/fc_DMG_MX29LV320BTC.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_BV5_V2 with MX29LV320BTC"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xC1, 0xC1, 0xA8, 0xA8 ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":70,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x80 ],
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0xAAA, 0xA9 ],
|
||||
[ 0x555, 0x56 ],
|
||||
[ 0xAAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
55
src/config/fc_DMG_S29GL032.txt
Normal file
55
src/config/fc_DMG_S29GL032.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"SD007_48BALL_64M with GL032M11BAIR4",
|
||||
"S29GL032 (no PCB text)"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x02, 0x02, 0x7D, 0x7D ],
|
||||
[ 0x02, 0x02, 0x7D, 0x7D ]
|
||||
],
|
||||
"voltage":3.3,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0x4000,
|
||||
"first_bank":0,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":60,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0x7000, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x7AAA, 0xA9 ],
|
||||
[ 0x7555, 0x56 ],
|
||||
[ 0x7AAA, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x7AAA, 0xA9 ],
|
||||
[ 0x7555, 0x56 ],
|
||||
[ 0x7AAA, 0x80 ],
|
||||
[ 0x7AAA, 0xA9 ],
|
||||
[ 0x7555, 0x56 ],
|
||||
[ 0x7AAA, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x7AAA, 0xA9 ],
|
||||
[ 0x7555, 0x56 ],
|
||||
[ 0x7AAA, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_iG_1MB.txt
Normal file
53
src/config/fc_DMG_iG_1MB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 1 MB, 128 KB SRAM"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xC2, 0xC2, 0x58, 0x58 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x100000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":120,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x80 ],
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
55
src/config/fc_DMG_iG_2MB.txt
Normal file
55
src/config/fc_DMG_iG_2MB.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM",
|
||||
"insideGadgets 2 MB, 128 KB SRAM/32 KB FRAM"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x01, 0x01, 0xD2, 0xD2 ],
|
||||
[ 0x01, 0xAD, 0x00, 0x00 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x200000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":120,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 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 ]
|
||||
],
|
||||
"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 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_iG_32KB.txt
Normal file
53
src/config/fc_DMG_iG_32KB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 32 KB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xBF, 0xB5, 0x01, 0xFF ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x8000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":20,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x80 ],
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_iG_4MB.txt
Normal file
53
src/config/fc_DMG_iG_4MB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 4 MB, 128 KB SRAM/FRAM"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x01, 0x01, 0x7E, 0x7E ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0x4000,
|
||||
"first_bank":0,
|
||||
"write_pin":"WR",
|
||||
"chip_erase_timeout":60,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0x000, 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 ]
|
||||
],
|
||||
"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 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_iG_4MB_MBC3_RTC.txt
Normal file
53
src/config/fc_DMG_iG_4MB_MBC3_RTC.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 4 MB, 32 KB FRAM, MBC3+RTC"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0x04, 0x04, 0x00, 0x00 ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x400000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"VIN",
|
||||
"chip_erase_timeout":120,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x80 ],
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x555, 0xAA ],
|
||||
[ 0x2AA, 0x55 ],
|
||||
[ 0x555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
53
src/config/fc_DMG_iG_512KB.txt
Normal file
53
src/config/fc_DMG_iG_512KB.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type":"DMG",
|
||||
"names":[
|
||||
"insideGadgets 512 KB"
|
||||
],
|
||||
"flash_ids":[
|
||||
[ 0xBF, 0xB7, 0x01, 0xFF ]
|
||||
],
|
||||
"voltage":5,
|
||||
"flash_size":0x80000,
|
||||
"start_addr":0,
|
||||
"first_bank":1,
|
||||
"write_pin":"VIN",
|
||||
"chip_erase_timeout":30,
|
||||
"commands":{
|
||||
"reset":[
|
||||
[ 0, 0xF0 ]
|
||||
],
|
||||
"read_identifier":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x90 ]
|
||||
],
|
||||
"chip_erase":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x80 ],
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0x10 ]
|
||||
],
|
||||
"chip_erase_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ 0, 0xFF, 0xFF ]
|
||||
],
|
||||
"single_write":[
|
||||
[ 0x5555, 0xAA ],
|
||||
[ 0x2AAA, 0x55 ],
|
||||
[ 0x5555, 0xA0 ],
|
||||
[ "PA", "PD" ]
|
||||
],
|
||||
"single_write_wait_for":[
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ],
|
||||
[ null, null, null ]
|
||||
]
|
||||
}
|
||||
}
|
||||
1234
src/hw_GBxCartRW.py
Normal file
1234
src/hw_GBxCartRW.py
Normal file
File diff suppressed because it is too large
Load Diff
BIN
src/res/icon.ico
Normal file
BIN
src/res/icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 127 KiB |
BIN
src/res/icon.png
Normal file
BIN
src/res/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
Reference in New Issue
Block a user