Anyone got the Transfer Pak to work with PKMN Stadium?
It sees the game, but it says it doesn't see the save data. I copied the save file into the N64 save folder, but same results.
The online community for MiSTer FPGA enthusiasts
https://misterfpga.org/
It sees the game, but it says it doesn't see the save data. I copied the save file into the N64 save folder, but same results.
It cannot use the gb core save file, it uses it's own format currently.
This may change in the future.
Format of the n64 save(assuming Pokemon Stadium): first 128kbyte are flash save of pokemon stadium, next 32kbyte are big-endian swapped gb save, next 96kbyte are unused
And yes, i completed the GB game(german Red) inside Pokemon Stadium and also some cups with Pokemon of the GB save. But i didn't import any existign gb save.
FPGAzumSpass wrote: ↑Sun Oct 29, 2023 9:00 amIt cannot use the gb core save file, it uses it's own format currently.
This may change in the future.Format of the n64 save(assuming Pokemon Stadium): first 128kbyte are flash save of pokemon stadium, next 32kbyte are big-endian swapped gb save, next 96kbyte are unused
And yes, i completed the GB game(german Red) inside Pokemon Stadium and also some cups with Pokemon of the GB save. But i didn't import any existign gb save.
Hi Robert, thanks for the reply.
Putting aside the fact that Nintendo's GB emulator inside of the Pokemon Stadium games is pretty weak, it only plays the official Pokemon games, so ROM hacks won't work (Gen II graphic mod for example).
Also, many other games use the transfer pak besides Pokemon games. Mario Tennis and Mario Golf are great sport RPGs on the GBC and the save data are used to unlock stuff in their respective N64 games.
If it's loading the GB save data is tricky, then perhaps a program to convert a GB save data to N64?
Cheers
I mostly wanted to get the basic internal core features working and that goal is reached.
At this point it "just" needs to be improved for better user experience and some other memory controllers (MBC) added.
As this is less important than other core work, i postponed it.
I'm pretty sure at some point it will get a better handling, either by me or some other dev who wants to improve it.
Of course a simple program to extract/append gb saves could be done. I would assume it costs less than 1 hour to do so.
Hello, I made a small tutorial to use the current Transfer Pak implementation with Pokemon Stadium 1&2, I hope you will be able to play your game
Note1: I assume you will use compatible games, so if you play Pokemon Stadium PAL French version, I assume you will use a Pokemon French version too from Yellow, Red or Blue.
Note2: I can confirm this method is ok with Pokemon Stadium 2 with Pokemon Yellow. My Pokemon Cristal save is not 32KB/Ko but 33 and I dont know why... So it didn't worked for me for this version ; but I don't know if it's just my personal Cristal save which is wrong or if this method is not adapted for this game in perticular... Let me know
Also, my tutorial is for Windows users, I'm sorry Linux fans but I've no doubt someone will be able to bring you the solution.
From GB to Stadium
1. Pre-required Free Softwares
2. Prepare your saves
Copy your Pokemon Stadium save from MiSTer to your PC
Copy your Pokemon GameBoy save to your PC (MiSTer or other)
Ensure your Pokemon GameBoy save file size is 32 KB/Ko
Ensure your Pokemon GameBoy save file extension (format) is ".sav": if it's ".srm" you can just rename it to ".sav" and confirm
Ensure your Pokemon Stadium save file size is either 128KB/Ko or 256KB/Ko
MAKE A COPY of those saves, a "backup", so you won't lose anything if things go wrong!
3. Stadium file size to 256
If your Pokemon Stadium file size is already at 256KB/Ko, it means it already includes a GameBoy save: you can go to step 4.
If your Pokemon Stadium file size is 128KB/Ko, we will fill it with blank data so the nexts steps of this tutorial will be the same for all users.
4. Convert the GB save Byte order (endian)
5. Inject the converted GB save into Stadium save (256)
6. Go play!
From Stadium to GB
1. Pre-required Free Softwares
2. Prepare your saves
Copy your Pokemon Stadium save from MiSTer to your PC
Ensure your Pokemon Stadium save file size is 256KB/Ko ; if not you don't have any GB save in it!
MAKE A COPY of those saves, a "backup", so you won't lose anything if things go wrong!
3. Extract the GB save from Stadium save and convert Byte order (endian)
4. Update your old GB save
5. Go play!
Note that depending on where you play, you may need to rename its extension from ".sav" to ".srm".
@Phoenix
yeah, I think I'll wait for someone to make a program for this.
Sounds like something solvable with a single line of the 'dd' command. For GB to Stadium:
Code: Select all
dd if=<GBSave> of=<StadiumSave> seek=131072 count=32768 conv=notrunc,swab,count_bytes,seek_bytes
And the other way around:
Code: Select all
dd if=<StadiumSave> of=<GBSave> skip=131072 count=32768 conv=swab,count_bytes,skip_bytes
Untested, might need some tuning.
Can confirm that all English language Gen 1 and 2 saves taken from GB cartridges will work in Stadium 1/2.
Using a submodule gb01 all saves from GB cartridges came out as 32KB. Byte swapped and inserted into N64 sav files they all work.
As of the latest core todays date, the only thing that does not work is GB Tower for Gen 2 games in Stadium 2. Otherwise you can import teams from Red/Blue/Yellow/Gold/Silver/Crystal, move boxes around, items, GB Pokémon in minigames, etc. Even mystery gift works! (No RTC yet so I guess for one "day" only).
I have created a Python script to replicate the instructions Phoenix posted earlier in this thread:
https://github.com/mysterypaint/MiSTer-N64-Save-Utility
Usage instructions are on the GitHub page too... would love to get this script running directly from MiSTer eventually! Hoping it will speed up the save-editing process a bit (:
Fantastic work, mysterypaint. Any chance you can extend the tool to also work with Controller Pak saves? I have a mess of ghosts for Mario Kart, Wave Race, and Excitebike that I'd love to use on the core, but haven't been able to figure out importing/exporting them on my own.
Unrelated: is it true that Gen 2 doesn't work on GB Tower in Pokemon Stadium 2 currently? My experience when testing was that only Crystal failed to load (hangs on the loading screen). I was able to load Gold and Silver from the Transfer Pak normally and boot them up. That said, I didn't actually get into gameplay in either so maybe it gets messed up at some point, but they at least boot and the attract modes play normally, unlike Crystal. This testing was all done with USA roms.
I'll go test again on my end here in a minute and report back.
Edit: Had no issue playing Pokemon Silver via Pokemon Stadium 2 through the introductory section. I wonder if people are testing Crystal (which doesn't load currently) and concluding that Gen 2 doesn't work...
meauxdal wrote: ↑Sun Nov 12, 2023 3:24 pmFantastic work, mysterypaint. Any chance you can extend the tool to also work with Controller Pak saves? I have a mess of ghosts for Mario Kart, Wave Race, and Excitebike that I'd love to use on the core, but haven't been able to figure out importing/exporting them on my own.
Unrelated: is it true that Gen 2 doesn't work on GB Tower in Pokemon Stadium 2 currently? My experience when testing was that only Crystal failed to load (hangs on the loading screen). I was able to load Gold and Silver from the Transfer Pak normally and boot them up. That said, I didn't actually get into gameplay in either so maybe it gets messed up at some point, but they at least boot and the attract modes play normally, unlike Crystal. This testing was all done with USA roms.
I'll go test again on my end here in a minute and report back.
Edit: Had no issue playing Pokemon Silver via Pokemon Stadium 2 through the introductory section. I wonder if people are testing Crystal (which doesn't load currently) and concluding that Gen 2 doesn't work...
https://github.com/mysterypaint/MiSTer-N64-Save-Utility
I have updated the tool to support CPaks/TPaks! Please read the instructions very carefully, because usage is significantly different (but hopefully equally as simple to use) since the last update.
As a potentially-temporary solution, please convert any DexDrive saves to .mpk using this online tool: https://savefileconverter.com/#/n64/dexdrive
The tool is also heavily untested, so please report any issues to me either on Discord (castierook on the MisterFPGA Discord Server) or (mysterypainto -> gmail).
Finally, remember to make save backups before using this tool: I am not responsible for any lost data!
Regarding Gen 2: I think GB Tower is an issue with the N64 Core. I am able to load a Crystal save without any issues if I check the contents of the imported save on the in-game Lab's PC:
Yes, currently only MBC5 with fixed rom and ram size is really implemented, but second gen uses MBC3 and a different rom size, so they don't work yet.
mysterypaint wrote: ↑Fri Nov 17, 2023 2:03 amhttps://github.com/mysterypaint/MiSTer-N64-Save-Utility
I have updated the tool to support CPaks/TPaks! Please read the instructions very carefully, because usage is significantly different (but hopefully equally as simple to use) since the last update.
As a potentially-temporary solution, please convert any DexDrive saves to .mpk using this online tool: https://savefileconverter.com/#/n64/dexdrive
The tool is also heavily untested, so please report any issues to me either on Discord (castierook on the MisterFPGA Discord Server) or (mysterypainto -> gmail).
Finally, remember to make save backups before using this tool: I am not responsible for any lost data!
Regarding Gen 2: I think GB Tower is an issue with the N64 Core. I am able to load a Crystal save without any issues if I check the contents of the imported save on the in-game Lab's PC:
Hi there,
I've followed to instructions to the best of my knowledge, but it didn't work. Any idea what I did wrong?
Code: Select all
E:\Console Games\Utilities\MiSTer-N64-Save-Utility-main>python convert_n64_savedata.py -ini
Traceback (most recent call last):
File "E:\Console Games\Utilities\MiSTer-N64-Save-Utility-main\convert_n64_savedata.py", line 343, in
N64Database = populateN64Database()
^^^^^^^^^^^^^^^^^^^^^
File "E:\Console Games\Utilities\MiSTer-N64-Save-Utility-main\convert_n64_savedata.py", line 37, in populateN64Database
romName = line.split('#')[1].strip()
~~~~~~~~~~~~~~~^^^IndexError: list index out of range
E:\Console Games\Utilities\MiSTer-N64-Save-Utility-main>pause
Press any key to continue . . .
Here's my INI file:
Code: Select all
[PATHS]
InputN64SavePath = Before\Pokemon Stadium 1.sav ; Specify the input N64 save path, before the tool modifies the save file.
OutputSavePath = After\Pokemon Stadium 1.sav ; Specify the output save path, after the save has been modified with this tool.
; Specify the N64 Save's Cart ID or MD5 checksum, as it appears in N64-database.txt
; If you do not already have N64-database.txt, please download it:
; https://raw.githubusercontent.com/MiSTer-devel/N64_ROM_Database/main/N64-database.txt
[CART_ID]
CartID = NPO___
[OPTIONS]
DumpSaves = F ; Specify whether or not we should dump the CPak/TPak (and Gameboy) Save from the N64 Save File. Gets dumped to [OutputSavePath]
; If we are not dumping saves, specify the path for all TPaks, including any GB/GameBoy save files.
; If you are not using one, remove ALL text after the "=", like I did for TPak4 below.
; If you are using ANY CPaks, all of these fields must be blank.
; If the bytes are already in the correct format + don't need to be endian-flipped, add a * to the very beginning of your path like I did for TPak3.
; ^^^^If you do not understand what this means, you likely don't need to add the *: Gameboy .savs always
; need to be flipped, and unless you manually ripped the save yourself, you do not need to add the *
[TPAKS]
TPak1 = Before\Pokemon - Red Version Gen II GFX.sav
TPak2 =
TPak3 =
TPak4 =
; In port order, specify the path for all your CPaks.
; If you are not using one, remove ALL text after the "=", like I did for CPak4 below.
; If you are using ANY TPaks (Including any GB saves), all of these fields must be blank.
; If the bytes are already in the correct format + don't need to be endian-flipped, add a * to the very beginning of your path like I did for CPak3.
; ^^^^If you do not understand what this means, you likely don't need to flip them: .mpk files do not need the *
; Please remember to convert any of your CPak saves (e.g. DexDrive format) to the proper .mpk format prior to injection.
; I recommend this web-based tool to do the conversion: https://savefileconverter.com/#/n64/dexdrive (Make sure "Controller Pak" is highlighted when downloading the save.)
[CPAKS]
CPak1 =
CPak2 =
CPak3 =
CPak4 =
;Specify the N64 Save's Cart ID or MD5 checksum, as it appears in N64-database.txt
; If you do not already have N64-database.txt, please download it[CART_ID]
CartID = NPO___
Is that the right CartID?
ID:NPO___ flash128k|tpak # Pokémon Stadium
I guess the formatting of the ID just seemed weird to me. It looked like a placeholder rather than a valid code. I might try it without the underscores anyway.
Also flash128k|tpak are not a cart ID they are instructions to the N64 core to setup 128k of flash and allow a transfer pack
PistolsAtDawn wrote: ↑Thu Jan 25, 2024 3:22 pmI guess the formatting of the ID just seemed weird to me. It looked like a placeholder rather than a valid code. I might try it without the underscores anyway.
Well looking at the N64-database.txt file, each game has a unique ID made up by 3 characters or higher followed by a couple of underscores (removing them still gives me the error BTW). Wish mysterypaint would take a look ay this post or on the Github page in order to clarify this.
I know, I was just showing where I got the ID from and it was from that line.
Crash is on this line
romName = line.split('#')[1].strip()
which is getting a romname by splitting the inout line on the # character and then trying to find the 2nd entry of the split. So that suggets the file its parsing is incorrectly formatted. Its parsing the N64Database.txt at this point
So my guess is you have an incorrectly formatted N64Database,txt file
so a line is
62c1c8738ac652dce0c8df79f5dd53a6 ntsc|cic6102 # Bike Race '98 V1.2 by NAN
that code is splitting on that # symbol and trying to find whats on the right hand side. Now for whatever reason one of your n64database.txt lines is missing a # is my guess
FPGA64 wrote: ↑Fri Jan 26, 2024 7:59 amCrash is on this line
romName = line.split('#')[1].strip()
which is getting a romname by splitting the inout line on the # character and then trying to find the 2nd entry of the split. So that suggets the file its parsing is incorrectly formatted. Its parsing the N64Database.txt at this point
So my guess is you have an incorrectly formatted N64Database,txt file
so a line is
62c1c8738ac652dce0c8df79f5dd53a6 ntsc|cic6102 # Bike Race '98 V1.2 by NAN
that code is splitting on that # symbol and trying to find whats on the right hand side. Now for whatever reason one of your n64database.txt lines is missing a # is my guess
It's the official database: https://github.com/MiSTer-devel/N64_ROM ... tabase.txt
Waifu4Life wrote: ↑Mon Jan 29, 2024 3:14 amFPGA64 wrote: ↑Fri Jan 26, 2024 7:59 amCrash is on this line
romName = line.split('#')[1].strip()
which is getting a romname by splitting the inout line on the # character and then trying to find the 2nd entry of the split. So that suggets the file its parsing is incorrectly formatted. Its parsing the N64Database.txt at this point
So my guess is you have an incorrectly formatted N64Database,txt file
so a line is
62c1c8738ac652dce0c8df79f5dd53a6 ntsc|cic6102 # Bike Race '98 V1.2 by NAN
that code is splitting on that # symbol and trying to find whats on the right hand side. Now for whatever reason one of your n64database.txt lines is missing a # is my guess
It's the official database: https://github.com/MiSTer-devel/N64_ROM ... tabase.txt
ok looks like a bug in the python its ignoring lines that begin with # but there are a lot of lines beginning with ;
Looks like someone changed the comment character
so
replace line 33 in convert_n64_savedata.py with this
if not line.startswith(";") and not line.isspace():
This changes the comment character looked for and in my extremely limited testing it can now populate a N64 database. Note I didnt go through the whole thing as I have no save files to convert, but the above will at least allow the database to be populated
FPGA64 wrote: ↑Mon Jan 29, 2024 8:14 amok looks like a bug in the python its ignoring lines that begin with # but there are a lot of lines beginning with ;
Looks like someone changed the comment characterso
replace line 33 in convert_n64_savedata.py with this
if not line.startswith(";") and not line.isspace():
This changes the comment character looked for and in my extremely limited testing it can now populate a N64 database. Note I didnt go through the whole thing as I have no save files to convert, but the above will at least allow the database to be populated
That worked, I'll try the save data later, thanks.
EDIT: Works perfectly, thanks again.
More or less off-topic, https://discord.com/channels/6479093974 ... 6806611064
On the Discord test-builds section, there's a new MiSTer build called MiSTer-N64GameBoy_20240129-2
Code: Select all
Hot off the press MiSTer Main test build that implements improved (I hope) save handling for Transfer Pak games.
Automatically tries to load .sav files from "saves/GAMEBOY/[Game Name].sav" (or whatever "games/[Core Name]/" folder you used).
Backs up your Game Boy saves before mounting to the N64.
Writes progress directly to the file in "saves/GAMEBOY/".
Kind of backwards compatible with the old .tpk format. If no matching .sav file is found in "saves/GAMEBOY", it copies the .tpk to this location with a new file extension.
BEWARE: Resets the N64 core when a new Transfer Pak game is selected.
This is interesting.