Here's a compilation of some stuff I wrote for someone awhile back.
There isn't an automated way to make a multi-game ROM yet. I know one person was planning to write a program to create multi-game ROMs but I haven't heard of any progress for a couple months. To do it manually, you'll need to gather the games that you want and then create the menu entries starting at 0x62000. You'll need to know the ROM and RAM sizes and place those into the game entry. As you add each game, then the offset to the ROM and RAM needs to be calculated. Once the sizes and offsets are in the game entry, then you need to create the game title for the menu. Final step would be to create the mapping file which would also include the offsets for each game and the LoROM/HiROM setting.
I'd start out with a list of games and write down their characteristics:
Game 1: LoROM 512KB ROM, 8KB RAM
Game 2: HiROM 512KB ROM
Game 3: LoROM 512KB ROM, 2KB RAM
and so on.
Then write the corresponding bytes into each menu entry. Game 1 would be at 0x62000, Game 2 would be at 0x64000, Game 3 would be at 0x66000, and each subsequent game +0x2000. Keep in mind that the Menu uses ROM Block 0 when calculating the ROM offset.
===============================
If you look at a multi-game cart dump, then the first 0x80000 bytes are the "MENU PROGRAM". Within the Menu Program, there are entries used by the menu. The Menu entry is at address 0x60000. The Game 1 entry is at address 0x62000. The Game 2 entry is at address 0x64000. If there were more games, then they would be at +0x2000 bytes (0x66000, 0x68000, and so on).
Each game entry basically has 0x1D8 bytes of unique data within the 0x2000 bytes. At the end of the block, there is the "MULTICASSETTE 32" text.
The full documentation is in nocash's FullSNES here:
http://problemkaputt.de/fullsnes.htm#sn ... rdirectory
Code: Select all
Directory Entry Format
0000h 1 Directory index (00h..07h for Entry 0..7) (or FFh=Unused Entry)
0001h 1 First 512K-FLASH block (00h..07h for block 0..7)
0002h 1 First 2K-SRAM block (00h..0Fh for block 0..15)
0003h 2 Number of 512K-FLASH blocks (mul 4) (=0004h..001Ch for 1..7 blks)
0005h 2 Number of 2K-SRAM blocks (mul 16) (=0000h..0100h for 0..16 blks)
0007h 12 Gamecode (eg. "SHVC-MENU- ", "SHVC-AGPJ- ", or "SHVC-CS - ")
0013h 44 Title in Shift-JIS format (padded with 00h's) (not used by Menu)
003Fh 384 Title Bitmap (192x12 pixels, in 30h*8 bytes, ie. 180h bytes)
01BFh 10 Date "MM/DD/YYYY" (or "YYYY/MM/DD" on "NINnnnnn" carts)
01C9h 8 Time "HH:MM:SS"
01D1h 8 Law "LAWnnnnn" or "NINnnnnn" (eg. "LAW01712", or "NIN11001")
01D9h 7703 Unused (1E17h bytes, FFh-filled)
1FF0h 16 For File0: "MULTICASSETTE 32" / For Files 1-7: Unused (FFh-filled)
You'll need to understand bytes 0x0-0x6. Byte 0 is the Game Entry#. Byte 1 is the ROM block offset. Byte 2 is the SRAM block offset. Bytes 3-4 are the number of ROM blocks used by the game. Bytes 5-6 are the number of RAM blocks used by the game. The game code at 0x7 can be anything but I'd suggest using the Nintendo assigned game code. The Shift-JIS text at 0x13 can be anything or padded out. The title bitmap at 0x3F is the text that is shown in the Menu. You'll have to convert your game title text to the format that the menu uses. The time/date/location stamp at 0x1BF can be left the same as you already have.
For example, a multi-game cart with 2 games (Shin Megami Tensei 1 & Shin Megami Tensei 2):
0x62000: 01 01 00 0C 00 40 00: Entry 1, ROM Block 1, RAM Block 0, ROM Blocks 0xC, RAM Blocks 0x40
0x64000: 02 04 04 10 00 40 00: Entry 2, ROM Block 4, RAM Block 4, ROM Blocks 0x10, RAM Blocks 0x40
If you look at Game 2, the game starts at ROM Block 4 because Game 1 uses 3 (0xC/4) ROM Blocks. Same goes for the RAM, Game 2 start at RAM Block 4 because Game 1 uses 4 (0x40/16) RAM Blocks.
Good Luck!