GPU/External Registers

Map

  • 0x1EF00400 is the top screen
  • 0x1EF00500 is the bottom screen

Init Values from nngxInitialize for Top Screen

  • 0x1EF00400 = 0x1C2
  • 0x1EF00404 = 0xD1
  • 0x1EF00408 = 0x1C1
  • 0x1EF0040C = 0x1C1
  • 0x1EF00410 = 0
  • 0x1EF00414 = 0xCF
  • 0x1EF00418 = 0xD1
  • 0x1EF0041C = 0x1C501C1
  • 0x1EF00420 = 0x10000
  • 0x1EF00424 = 0x19D
  • 0x1EF00428 = 2
  • 0x1EF0042C = 0x1C2
  • 0x1EF00430 = 0x1C2
  • 0x1EF00434 = 0x1C2
  • 0x1EF00438 = 1
  • 0x1EF0043C = 2
  • 0x1EF00440 = 0x1960192
  • 0x1EF00444 = 0
  • 0x1EF00448 = 0
  • 0x1EF0045C = 0x19000F0
  • 0x1EF00460 = 0x1c100d1
  • 0x1EF00464 = 0x1920002
  • 0x1EF00470 = 0x80340
  • 0x1EF0049C = 0

More Init Values from nngxInitialize for Top Screen

  • 0x1EF00468 = 0x18300000, later changed by GSP module when updating state, framebuffer
  • 0x1EF0046C = 0x18300000, later changed by GSP module when updating state, framebuffer
  • 0x1EF00494 = 0x18300000
  • 0x1EF00498 = 0x18300000
  • 0x1EF00478 = 1, doesn't stay 1, read as 0
  • 0x1EF00474 = 0x10501

This register controls how the LCD framebuffer is displayed.

0x1EF018E0

Register address Description
0x1EF018E0 Buffer Size>>3
0x1EF018E8 Buffer physical address>>3
0x1EF018F0 Writing value 1 here triggers GPU processing for the specified buffer

These 3 registers are used by GX command 1. This is used for OpenGL commands.

0x1EF00010

Register address Description
0x1EF000X0 Buffer physical address>>3
0x1EF000X4 Associated buffer physical address>>3
0x1EF000X8 Buffer size
0x1EF000XC The low u16 for this register is overwritten by the GX command u16 parameter

These registers are used by GX command 2. 0x1EF00010 is used for the GX command buf0 parameters, while 0x1EF00020 is used for the GX command buf1 parameters.

0x1EF00C00

Register address Description
0x1EF00C00 VRAM framebuffer physical address>>3
0x1EF00C04 Output framebuffer physical address>>3
0x1EF00C08 Output framebuffer dimensions, used with cmd3
0x1EF00C0C VRAM framebuffer dimensions, used with cmd3
0x1EF00C10 Unknown, used with cmd3 and cmd4
0x1EF00C14 GSP module writes value 0 here prior to writing to 0x1EF00C18, for cmd3
0x1EF00C18 Writing value 1 here triggers GPU processing for the specified buffers
0x1EF00C20 Unknown, used with cmd4
0x1EF00C24 Unknown, used with cmd4
0x1EF00C28 Unknown, used with cmd4

These registers are used by GX command 3 and 4. For cmd4, *0x1EF00C18 |= 1 is used instead of just writing value 1.

GPU Commands

The buffer for GX command 1 with the registers at 0x1EF018E0 is used for GPU commands including OpenGL commands, each 8-byte entry in the buffer is a command. Cmd+0 is the command parameter, and cmd+4 is the cmdID.

Commands

CommandID Parameter Description
0x000F0010 Value is 0x12345678 This command is always the last command in the buffer.
0x000F0110 Value 0x1 This command is immediately before CmdID 0x000F0010, this is used elsewhere in the buffer as well.
0x000F0111 Value 0x1 This command is immediately before CmdID 0x000F0110, however CmdID 0x000F0110 doesn't always follow this command.
0x000F0042 float y vector This sets Y scaling for the current matrix.
0x000F0044 float x vector This sets X scaling for the current matrix.
0x000F02C0 0x80000000 | ID? When bit31 is clear, the specified vertices are not rendered via CmdID 0xXXXF02C1. This is used immediately before CmdID 0xXXXF02C1. The GL mode for drawing primitives is handled by the client application, not the GPU.
0xXXXF02C1 float This is used for vertices, the parameter value is unknown. CmdID is 0x000F02C1 | ((totalvertices<<22) - 0x100000). The 16-byte vertex entries is the data following the command.

Vertex Entry

Index Word Description
0 ?
1 ?
2 Y coordinate?
3 ?