Improvements

This commit is contained in:
Robin Jones 2024-03-15 21:14:28 +00:00
parent 2258df3c1f
commit 9fb88b6022
3 changed files with 85 additions and 29 deletions

View File

@ -1,57 +1,93 @@
#include <fatfs/ff.h>
#include <libdragon.h>
#include "utils/fs.h"
#include "rom_patcher.h"
rom_patcher_err_t rom_patcher_load_file (char *path)
{
// ROM file should be loaded before patch is applied.
// See https://github.com/marcrobledo/RomPatcher.js/ for an example lib.
// Though needs conversion from JS to C
// apply patch dependent on extension.
//return apply_patch_type_bps(path);
//return apply_patch_type_ips(path);
//return apply_patch_type_aps(path);
//return apply_patch_type_ups(path);
//return apply_patch_type_xdelta(path);
// aps should be PATCH_ERR_UNSUPPORTED; as not really a thing?!
return PATCH_ERR_IO;
}
rom_patcher_err_t apply_patch_type_bps(char *path)
rom_patcher_err_t apply_patch_type_bps(FIL *fil)
{
// https://github.com/Alcaro/Flips/blob/master/bps_spec.md
// https://www.romhacking.net/documents/746/
return PATCH_ERR_UNSUPPORTED;
}
rom_patcher_err_t apply_patch_type_ips(char *path)
rom_patcher_err_t apply_patch_type_ips(FIL *fil)
{
// http://www.smwiki.net/wiki/IPS_file_format
return PATCH_ERR_INVALID;
}
rom_patcher_err_t apply_patch_type_aps(char *path)
rom_patcher_err_t apply_patch_type_aps(FIL *fil)
{
// https://github.com/btimofeev/UniPatcher/wiki/APS-(N64)
return PATCH_ERR_INVALID;
}
rom_patcher_err_t apply_patch_type_ups(char *path)
rom_patcher_err_t apply_patch_type_ups(FIL *fil)
{
// http://www.romhacking.net/documents/392/
return PATCH_ERR_UNSUPPORTED;
}
rom_patcher_err_t apply_patch_type_xdelta(char *path)
rom_patcher_err_t apply_patch_type_xdelta(FIL *fil)
{
return PATCH_ERR_UNSUPPORTED;
}
rom_patcher_err_t rom_patcher_load_file (char *path)
{
FIL fil;
rom_patcher_err_t err;
// Krikzz implementation:
if (f_open(&fil, strip_sd_prefix(path), FA_READ) != FR_OK) {
return PATCH_ERR_NO_FILE;
}
// ROM file should be loaded before patch is applied.
// See https://github.com/marcrobledo/RomPatcher.js/ for an example lib.
// Though needs conversion from JS to C
// apply patch dependent on extension.
rom_patch_type_t patch_ext_type = PATCH_TYPE_IPS; // FIXME: should be the extension of the file!
switch (patch_ext_type)
{
case PATCH_TYPE_BPS:
err = apply_patch_type_bps(&fil);
break;
case PATCH_TYPE_IPS:
err = apply_patch_type_ips(&fil);
break;
case PATCH_TYPE_APS:
err = apply_patch_type_aps(&fil);
break;
case PATCH_TYPE_UPS:
err = apply_patch_type_ups(&fil);
break;
case PATCH_TYPE_XDELTA:
err = apply_patch_type_xdelta(&fil);
break;
default:
return PATCH_ERR_UNSUPPORTED;
}
if (f_close(&fil) != FR_OK) {
return PATCH_ERR_IO;
}
if (err != PATCH_OK) {
return err;
}
return PATCH_OK;
}
// Krikzz implementation for ref:
// #define APS_BUFF_SIZE 32768
// static uint8_t aps_buff[APS_BUFF_SIZE];
@ -99,7 +135,6 @@ rom_patcher_err_t apply_patch_type_xdelta(char *path)
// // for (i = 0; i < 5; i++)apsGetNextByte();
// // gSetXY(4, 4);
// while (aps_addr < len) {

View File

@ -1,5 +1,5 @@
/**
* @file patcher.h
* @file rom_patcher.h
* @brief N64 ROM patcher
* @ingroup menu
*/
@ -20,6 +20,15 @@ typedef enum {
PATCH_ERR_UNSUPPORTED,
} rom_patcher_err_t;
/** @brief Patch type enumeration. */
typedef enum {
PATCH_TYPE_BPS,
PATCH_TYPE_APS,
PATCH_TYPE_IPS,
PATCH_TYPE_UPS,
PATCH_TYPE_XDELTA,
} rom_patch_type_t;
rom_patcher_err_t rom_patcher_load_file (char *path);
#endif

View File

@ -60,14 +60,14 @@ static void draw (menu_t *menu, surface_t *d) {
component_actions_bar_text_draw(
ALIGN_LEFT, VALIGN_TOP,
"A: Load ROM\n"
"A: Load and run patched ROM\n"
"B: Exit"
);
if (menu->load.rom_path) {
component_actions_bar_text_draw(
ALIGN_RIGHT, VALIGN_TOP,
"R: Load patched ROM"
"R: Load with ROM"
);
}
}
@ -107,9 +107,21 @@ static void load (menu_t *menu) {
// }
menu->next_mode = MENU_MODE_BOOT;
menu->boot_params->device_type = BOOT_DEVICE_TYPE_ROM;
menu->boot_params->tv_type = BOOT_TV_TYPE_PASSTHROUGH;
menu->boot_params->detect_cic_seed = true;
if (load_rom) {
menu->boot_params->device_type = BOOT_DEVICE_TYPE_ROM;
menu->boot_params->detect_cic_seed = rom_info_get_cic_seed(&menu->load.rom_info, &menu->boot_params->cic_seed);
switch (rom_info_get_tv_type(&menu->load.rom_info)) {
case ROM_TV_TYPE_PAL: menu->boot_params->tv_type = BOOT_TV_TYPE_PAL; break;
case ROM_TV_TYPE_NTSC: menu->boot_params->tv_type = BOOT_TV_TYPE_NTSC; break;
case ROM_TV_TYPE_MPAL: menu->boot_params->tv_type = BOOT_TV_TYPE_MPAL; break;
default: menu->boot_params->tv_type = BOOT_TV_TYPE_PASSTHROUGH; break;
}
} else {
menu->boot_params->device_type = BOOT_DEVICE_TYPE_ROM;
menu->boot_params->tv_type = BOOT_TV_TYPE_NTSC;
menu->boot_params->detect_cic_seed = true;
}
}