2018-12-10 19:48:06 +11:00
|
|
|
# Work RAM
|
2018-12-17 16:01:23 +11:00
|
|
|
|
|
|
|
## External Work RAM (EWRAM)
|
|
|
|
|
|
|
|
* **Address Span:** `0x2000000` to `0x203FFFF` (256k)
|
|
|
|
|
|
|
|
This is a big pile of space, the use of which is up to each game. However, the
|
|
|
|
external work ram has only a 16-bit bus (if you read/write a 32-bit value it
|
|
|
|
silently breaks it up into two 16-bit operations) and also 2 wait cycles (extra
|
|
|
|
CPU cycles that you have to expend _per 16-bit bus use_).
|
|
|
|
|
|
|
|
It's most helpful to think of EWRAM as slower, distant memory, similar to the
|
|
|
|
"heap" in a normal application. You can take the time to go store something
|
|
|
|
within EWRAM, or to load it out of EWRAM, but if you've got several operations
|
|
|
|
to do in a row and you're worried about time you should pull that value into
|
|
|
|
local memory, work on your local copy, and then push it back out to EWRAM.
|
|
|
|
|
|
|
|
## Internal Work RAM (IWRAM)
|
|
|
|
|
|
|
|
* **Address Span:** `0x3000000` to `0x3007FFF` (32k)
|
|
|
|
|
|
|
|
This is a smaller pile of space, but it has a 32-bit bus and no wait.
|
|
|
|
|
|
|
|
By default, `0x3007F00` to `0x3007FFF` is reserved for interrupt and BIOS use.
|
|
|
|
The rest of it is mostly up to you. The user's stack space starts at `0x3007F00`
|
|
|
|
and proceeds _down_ from there. For best results you should probably start at
|
|
|
|
`0x3000000` and then go upwards. Under normal use it's unlikely that the two
|
|
|
|
memory regions will crash into each other.
|