diff --git a/README.md b/README.md index 6e399551..23d439df 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ An open source menu for N64 flashcarts. ## Current (notable) menu features * Fully Open Source. * Loads all known N64 games (including iQue and byteswapped ROMs). -* Emulator support (GB, GBC, NES) ROMs. +* Emulator support (NES, SNES, GB, GBC) ROMs. * N64 ROM box image support. * Background image (PNG) support. * Comprehensive ROM save database (including HomeBrew headers). @@ -24,7 +24,7 @@ An open source menu for N64 flashcarts. ## Getting started ### SC64 -Ensure the cart is running the latest [firmware](https://github.com/Polprzewodnikowy/SummerCart64/releases/latest) +Ensure the cart is running the latest [firmware](https://github.com/Polprzewodnikowy/SummerCart64/releases/latest). Download the `sc64menu.n64` ROM from the latest action run assets. Add it to the root folder on your SD card. @@ -36,16 +36,17 @@ The aim is to replace [Altra64](https://github.com/networkfusion/altra64) and [E ### Common to all #### ROM Boxart -To use boxart, you need to place png files of size 158x112 in the folder `sd://menu/boxart/` -Each file must be named according to the 2 letter ROM ID. e.g. for goldeneye, this would be `GE.png` -A known set of PNG files can be downloaded from https://mega.nz/file/6cNGwSqI#8X5ukb65n3YMlGaUtSOGXkKo9HxVnnMOgqn94Epcr7w +To use boxart, you need to place png files of size 158x112 in the folder `/menu/boxart` on the SD card. +Each file must be named according to the 2 letter ROM ID. e.g. for goldeneye, this would be `GE.png`. +A known set of PNG files can be downloaded [here](https://mega.nz/file/6cNGwSqI#8X5ukb65n3YMlGaUtSOGXkKo9HxVnnMOgqn94Epcr7w). #### Emulator support -Emulators should be added to the `sd:/emulators/` folder +Emulators should be added to the `/emulators` directory on the SD card. -The menu currently supports the following emulators and associated ROM's: -* neon64v2 (https://github.com/hcs64/neon64v2) - emu.nes -* gb64 (https://lambertjamesd.github.io/gb64/romwrapper/romwrapper.html) - emu.gb, emu.gbc +Menu currently supports the following emulators and associated ROM file names: + - **NES**: [neon64v2](https://github.com/hcs64/neon64v2) by *hcs64* - `neon64bu.rom` + - **SNES**: [sodium64](https://github.com/Hydr8gon/sodium64) by *Hydr8gon* - `sodium64.z64` + - **Game Boy** / **GB Color**: [gb64](https://lambertjamesd.github.io/gb64/romwrapper/romwrapper.html) by *lambertjamesd* - `gb.v64` / `gbc.v64` # Developer documentation @@ -94,9 +95,9 @@ Run `doxygen` from the dev container terminal. Make sure you fix the warnings before creating a PR! Generated documentation is located in `output/docs` folder. - -# OSS licenses used for libraries -* UNLICENSE (libdragon) -* BSD 2-Clause (libspng) -* CC0 1.0 Universal (minimp3) -* Permissive, unspecific (miniz) +# Open source software and licenses used + - [libdragon](https://github.com/DragonMinded/libdragon) (UNLICENSE License) + - [libspng](https://github.com/randy408/libspng) (BSD 2-Clause License) + - [mini.c](https://github.com/univrsal/mini.c) (BSD 2-Clause License) + - [minimp3](https://github.com/lieff/minimp3) (CC0 1.0 Universal) + - [miniz](https://github.com/richgel999/miniz) (MIT License) diff --git a/src/menu/cart_load.c b/src/menu/cart_load.c index 921aef64..a8f898dc 100644 --- a/src/menu/cart_load.c +++ b/src/menu/cart_load.c @@ -85,15 +85,20 @@ cart_load_err_t cart_load_emulator (menu_t *menu, cart_load_emu_type_t emu_type, switch (emu_type) { case CART_LOAD_EMU_TYPE_NES: - path_push(path, "emu.nes"); + path_push(path, "neon64bu.rom"); save_type = FLASHCART_SAVE_TYPE_SRAM_BANKED; break; + case CART_LOAD_EMU_TYPE_SNES: + path_push(path, "sodium64.z64"); + save_type = FLASHCART_SAVE_TYPE_SRAM; + emulated_rom_offset = 0x104000; + break; case CART_LOAD_EMU_TYPE_GAMEBOY: - path_push(path, "emu.gb"); + path_push(path, "gb.v64"); save_type = FLASHCART_SAVE_TYPE_FLASHRAM; break; case CART_LOAD_EMU_TYPE_GAMEBOY_COLOR: - path_push(path, "emu.gbc"); + path_push(path, "gbc.v64"); save_type = FLASHCART_SAVE_TYPE_FLASHRAM; break; } @@ -113,6 +118,14 @@ cart_load_err_t cart_load_emulator (menu_t *menu, cart_load_emu_type_t emu_type, path = path_clone_push(menu->browser.directory, menu->browser.entry->name); + switch (emu_type) { + case CART_LOAD_EMU_TYPE_SNES: + emulated_file_offset = ((file_get_size(path_get(path)) & 0x3FF) == 0x200) ? 0x200 : 0; + break; + default: + break; + } + menu->flashcart_error = flashcart_load_file(path_get(path), emulated_rom_offset, emulated_file_offset); if (menu->flashcart_error != FLASHCART_OK) { path_free(path); diff --git a/src/menu/cart_load.h b/src/menu/cart_load.h index 5527206b..3fde2d3c 100644 --- a/src/menu/cart_load.h +++ b/src/menu/cart_load.h @@ -25,6 +25,7 @@ typedef enum { typedef enum { CART_LOAD_EMU_TYPE_NES, + CART_LOAD_EMU_TYPE_SNES, CART_LOAD_EMU_TYPE_GAMEBOY, CART_LOAD_EMU_TYPE_GAMEBOY_COLOR, } cart_load_emu_type_t; diff --git a/src/menu/views/browser.c b/src/menu/views/browser.c index c29917fa..10fd5ed8 100644 --- a/src/menu/views/browser.c +++ b/src/menu/views/browser.c @@ -10,7 +10,7 @@ static const char *rom_extensions[] = { "z64", "n64", "v64", "rom", NULL }; -static const char *emulator_extensions[] = { "nes", "gb", "gbc", "smc", "gen", "smd", NULL }; +static const char *emulator_extensions[] = { "nes", "sfc", "smc", "gb", "gbc", NULL }; static const char *save_extensions[] = { "sav", NULL }; // TODO: "eep", "sra", "srm", "fla" could be used if transfered from different flashcarts. static const char *image_extensions[] = { "png", NULL }; static const char *music_extensions[] = { "mp3", NULL }; diff --git a/src/menu/views/load_emulator.c b/src/menu/views/load_emulator.c index 349d1812..8c8e6573 100644 --- a/src/menu/views/load_emulator.c +++ b/src/menu/views/load_emulator.c @@ -5,9 +5,9 @@ static const char *emu_nes_rom_extensions[] = { "nes", NULL }; +static const char *emu_snes_rom_extensions[] = { "sfc", "smc", NULL }; static const char *emu_gameboy_rom_extensions[] = { "gb", NULL }; static const char *emu_gameboy_color_rom_extensions[] = { "gbc", NULL }; -// static const char *emu_sega_rom_extensions[] = {"smc", "gen", "smd", NULL }; static bool load_pending; static cart_load_emu_type_t emu_type; @@ -87,12 +87,12 @@ void view_load_emulator_init (menu_t *menu) { if (file_has_extensions(path_get(path), emu_nes_rom_extensions)) { emu_type = CART_LOAD_EMU_TYPE_NES; + } else if (file_has_extensions(path_get(path), emu_snes_rom_extensions)) { + emu_type = CART_LOAD_EMU_TYPE_SNES; } else if (file_has_extensions(path_get(path), emu_gameboy_rom_extensions)) { emu_type = CART_LOAD_EMU_TYPE_GAMEBOY; } else if (file_has_extensions(path_get(path), emu_gameboy_color_rom_extensions)) { emu_type = CART_LOAD_EMU_TYPE_GAMEBOY_COLOR; - // } else if (file_has_extensions(path_get(path), emu_sega_rom_extensions)) { - // emu_type = CART_LOAD_EMU_TYPE_SEGA; } else { menu_show_error(menu, "Unsupported ROM"); }