Romdisk Swapping

Jump to navigation Jump to search

Author: Lerabot/Magnes


When I started adding things to the ROM disk, I didn't realize that my 10MB+ .elf file would be problematic (i.e. not load) on the Dreamcast. Also it's been mentioned in a forum topic that loading a romdisk instead of multiple files would be faster. **Need source** I also think that it could be a neat way to handle/manage your memory altogether.

2020 edit : Removed the GZ compression as it seemed to cause problem with filename longer than a certain length (16 IIRC?)


Organize your assets

Organize the content or your romdisk in multiple folders:


Convert to romdisk

In your Makefile, duplicate the usual romdisk generation command but change the romdisk name and directory.

This is the usual romdisk command, you can still keep this

$(KOS_GENROMFS) -f romdisk.img -d path/to/romdisk -v

This is your new romdisk, replace the romdisk_name and romdisk_folder with what you want.

$(KOS_GENROMFS) -f romdisk_name.img -d path/to/romdisk_folder -v

If I'm using the example from earlier, I could make a "level1" romdisk this way

$(KOS_GENROMFS) -f level1.img -d path/to/level -v

Using your romdisk

In your code you'll need a way to load those new romdisks, we'll use this code snippet by BlackAura. For more info, check this topic [1]

#include <kos.h>
#include <zlib/zlib.h>

// Thanks BlackAura ;)
int mount_romdisk(char *filename, char *mountpoint) {
  void *buffer;
  int length = zlib_getlength(filename);

  // Check failure
  if(length == 0)
      return 0;

  // Allocate memory, read file
  buffer = malloc(length);
  gzread(file, buffer, length);

  // Mount
  fs_romdisk_mount(mountpoint, buffer, 1);
  return 1;

It is important that your mount point start with a '/' -> "/level1" and not "level1"

You can now load files that are located at "/level1". Example "/level1/spritesheet.png"

You can unload the romdisk using:


Usage with a Broadband adapter or dc-ipload

In order to use these new romdisk, you need to enable /pc redirection in your dc-tool, update your dc-tool command to use -c:

dc-tool-ip -t dreamcast -c /path/to/project -x program_name.elf

You can now use the function below to access files in the /rd folder:

mount_romdisk("/pc/romdisk_name.img", "/rd");

Keep in mind that you'll have to switch /pc/ to /cd/ when you burn this to a CD.