mirror of
https://github.com/lesserkuma/GBA_MultiMenu.git
synced 2026-08-23 17:14:10 -05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3c4a44893 | ||
|
|
cbe17ef7c5 | ||
|
|
8dc1d10a95 |
@@ -15,7 +15,8 @@ The following section must be edited in order to specify the cartridge type to u
|
|||||||
```json
|
```json
|
||||||
"cartridge": {
|
"cartridge": {
|
||||||
"type": 2,
|
"type": 2,
|
||||||
"battery_present": false
|
"battery_present": false,
|
||||||
|
"min_rom_size": 4194304
|
||||||
},
|
},
|
||||||
```
|
```
|
||||||
Set `type` to `1` or `2`:
|
Set `type` to `1` or `2`:
|
||||||
@@ -24,6 +25,8 @@ Set `type` to `1` or `2`:
|
|||||||
|
|
||||||
Set `battery_present` to `true` or `false`. This will enable enhanced save data handling which will only be functional with a working battery.
|
Set `battery_present` to `true` or `false`. This will enable enhanced save data handling which will only be functional with a working battery.
|
||||||
|
|
||||||
|
Set `min_rom_size` to whatever your cartridge supports as the smallest possible ROM size. Many newer cartridges only support ROMs no smaller than 4 MiB (`4194304`) while some older cartridges can go as low as 512 KiB (`524288`).
|
||||||
|
|
||||||
In the `games` section, you can edit the game-related stuff:
|
In the `games` section, you can edit the game-related stuff:
|
||||||
```json
|
```json
|
||||||
"games": [
|
"games": [
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
import sys, os, glob, json, math, re, struct, hashlib, argparse, datetime
|
import sys, os, glob, json, math, re, struct, hashlib, argparse, datetime
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
app_version = "0.4"
|
app_version = "0.7"
|
||||||
default_file = "LK_MULTIMENU_<CODE>.gba"
|
default_file = "LK_MULTIMENU_<CODE>.gba"
|
||||||
|
|
||||||
################################
|
################################
|
||||||
@@ -83,6 +83,7 @@ if not os.path.exists(args.config):
|
|||||||
games = []
|
games = []
|
||||||
cartridge_type = 1
|
cartridge_type = 1
|
||||||
battery_present = False
|
battery_present = False
|
||||||
|
min_rom_size = 0x400000
|
||||||
for file in files:
|
for file in files:
|
||||||
d = {
|
d = {
|
||||||
"enabled": True,
|
"enabled": True,
|
||||||
@@ -102,6 +103,7 @@ if not os.path.exists(args.config):
|
|||||||
"cartridge": {
|
"cartridge": {
|
||||||
"type": cartridge_type + 1,
|
"type": cartridge_type + 1,
|
||||||
"battery_present": battery_present,
|
"battery_present": battery_present,
|
||||||
|
"min_rom_size": min_rom_size,
|
||||||
},
|
},
|
||||||
"games": games,
|
"games": games,
|
||||||
}
|
}
|
||||||
@@ -124,6 +126,10 @@ else:
|
|||||||
games = j["games"]
|
games = j["games"]
|
||||||
cartridge_type = j["cartridge"]["type"] - 1
|
cartridge_type = j["cartridge"]["type"] - 1
|
||||||
battery_present = j["cartridge"]["battery_present"]
|
battery_present = j["cartridge"]["battery_present"]
|
||||||
|
if "min_rom_size" in j["cartridge"]:
|
||||||
|
min_rom_size = j["cartridge"]["min_rom_size"]
|
||||||
|
else:
|
||||||
|
min_rom_size = 0x400000
|
||||||
|
|
||||||
# Prepare compilation
|
# Prepare compilation
|
||||||
flash_size = cartridge_types[cartridge_type]["flash_size"]
|
flash_size = cartridge_types[cartridge_type]["flash_size"]
|
||||||
@@ -172,6 +178,13 @@ for game in games:
|
|||||||
x = 0x80000
|
x = 0x80000
|
||||||
while (x < size): x *= 2
|
while (x < size): x *= 2
|
||||||
size = x
|
size = x
|
||||||
|
if size < 0x400000:
|
||||||
|
with open(f"roms/{game['file']}", "rb") as f:
|
||||||
|
buffer = f.read()
|
||||||
|
if b"Batteryless mod by Lesserkuma" in buffer:
|
||||||
|
size = max(0x400000, min_rom_size)
|
||||||
|
else:
|
||||||
|
size = max(size, min_rom_size)
|
||||||
game["index"] = index
|
game["index"] = index
|
||||||
game["size"] = size
|
game["size"] = size
|
||||||
if "title_font" in game:
|
if "title_font" in game:
|
||||||
@@ -316,7 +329,7 @@ logp("Menu ROM: 0x{:07X}–0x{:07X}".format(0, len(menu_rom)))
|
|||||||
logp("Game List: 0x{:07X}–0x{:07X}".format(item_list_offset * sector_size, item_list_offset * sector_size + len(item_list)))
|
logp("Game List: 0x{:07X}–0x{:07X}".format(item_list_offset * sector_size, item_list_offset * sector_size + len(item_list)))
|
||||||
logp("Status Area: 0x{:07X}–0x{:07X}".format(status_offset * sector_size, status_offset * sector_size + 0x1000))
|
logp("Status Area: 0x{:07X}–0x{:07X}".format(status_offset * sector_size, status_offset * sector_size + 0x1000))
|
||||||
logp("")
|
logp("")
|
||||||
logp("Cartridge Type: {:d} ({:s} {:s})".format(cartridge_type, cartridge_types[cartridge_type]["name"], "with battery" if battery_present else "without battery"))
|
logp("Cartridge Type: {:d} ({:s}) {:s}".format(cartridge_type + 1, cartridge_types[cartridge_type]["name"], "with battery" if battery_present else "without battery"))
|
||||||
logp("Output ROM Size: {:.2f} MiB".format(rom_size / 1024 / 1024))
|
logp("Output ROM Size: {:.2f} MiB".format(rom_size / 1024 / 1024))
|
||||||
logp("Output ROM Code: {:s}".format(rom_code))
|
logp("Output ROM Code: {:s}".format(rom_code))
|
||||||
output_file = output_file.replace("<CODE>", rom_code)
|
output_file = output_file.replace("<CODE>", rom_code)
|
||||||
@@ -326,7 +339,7 @@ if args.split:
|
|||||||
size = 0x2000000
|
size = 0x2000000
|
||||||
if pos > len(compilation[:rom_size]): break
|
if pos > len(compilation[:rom_size]): break
|
||||||
if pos + size > rom_size: size = rom_size - pos
|
if pos + size > rom_size: size = rom_size - pos
|
||||||
output_file_part = "{:s}_part{:d}{:s}".format(os.path.splitext(output_file)[0], i + 1, os.path.splitext(output_file)[1])
|
output_file_part = "{:s}_part{:d}{:s}".format(os.path.splitext(output_file)[0], i, os.path.splitext(output_file)[1])
|
||||||
with open(output_file_part, "wb") as f: f.write(compilation[pos:pos+size])
|
with open(output_file_part, "wb") as f: f.write(compilation[pos:pos+size])
|
||||||
else:
|
else:
|
||||||
with open(output_file, "wb") as f: f.write(compilation[:rom_size])
|
with open(output_file, "wb") as f: f.write(compilation[:rom_size])
|
||||||
|
|||||||
@@ -215,14 +215,11 @@ IWRAM_CODE u8 BootGame(ItemConfig config, FlashStatus status)
|
|||||||
if (_flash_type == 0)
|
if (_flash_type == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// Temporarily store SRAM values at mapper registers
|
// Temporarily store SRAM values located at mapper registers
|
||||||
if (status.last_boot_save_type == SRAM_NONE)
|
sram_register_backup[0] = *(vu8 *)MAPPER_CONFIG1;
|
||||||
{
|
sram_register_backup[1] = *(vu8 *)MAPPER_CONFIG2;
|
||||||
sram_register_backup[0] = *(vu8 *)MAPPER_CONFIG1;
|
sram_register_backup[2] = *(vu8 *)MAPPER_CONFIG3;
|
||||||
sram_register_backup[1] = *(vu8 *)MAPPER_CONFIG2;
|
sram_register_backup[3] = *(vu8 *)MAPPER_CONFIG4;
|
||||||
sram_register_backup[2] = *(vu8 *)MAPPER_CONFIG3;
|
|
||||||
sram_register_backup[3] = *(vu8 *)MAPPER_CONFIG4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable SRAM access
|
// Enable SRAM access
|
||||||
*(vu8 *)MAPPER_CONFIG4 = 1;
|
*(vu8 *)MAPPER_CONFIG4 = 1;
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ Author: Lesserkuma (github.com/lesserkuma)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define MAGIC_FLASH_STATUS 0x414D554B
|
#define MAGIC_FLASH_STATUS 0x414D554B
|
||||||
#define FLASH_STATUS_LOCATION 0xA0000
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) FlashStatus_
|
typedef struct __attribute__((packed)) FlashStatus_
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user