Code segmentation guide

From N64brew Wiki
Jump to navigation Jump to search

You've been working hard on your Homebrew title, slowly adding in more content, when suddenly you realize that the game's having weird hanging issues related to any new assets that you've just added to your ROM. What gives?

Why does the Code segment size matter?

When the console boots, the Initial Program Load which is contained in every ROM copies the first megabyte (1,048,576 bytes) of code to RAM and executes it. This means that if you've been linking your assets directly into your code segment, you can very quickly go past this 1MB limit.

Code by itself usually has a very small memory footprint (but not negligible footprint, as we'll see later!), therefore, depending on how your engine is set up, you might only be required to split your assets from the main code and not have to worry about anything else.

Where to go from here?

These pages are aimed at providing users who are new to embedded systems programming to work around this limitation. It is expected that you have a strong understanding of C. The code for the example ROMs provided in these pages should all be available in this repository. The sample code is written for libultra, using the makefile and spec file format expected from the library. The knowledge can be easily transferred to other SDKs or build systems.

Before you do anything, have a brief look over the code of the original sample, as this is our "bad" starting ROM which we will improve upon. As soon as you've done that, look through the following pages (preferably in order):

After you have read through those three pages (and more importantly, understood them), it is also recommended you look into techniques to split your code. It is preferable that you write your game to support at least one of these methods before you start adding too much to it, as it might become more challenging to modify such an intricate part of your engine after the fact: