Table of Contents

F3DDKR Microcode

F3DDKR (unofficial name) is a modified version of the Fast3D microcode. It was created by Rareware for the game Diddy Kong Racing.


Changes from Fast3D

  1. The commands G_CULLDL, G_TRI1, and G_POPMTX were removed, and are now NOPS (No operations).
  2. Triangles are drawn in batches; up to 16 triangles per batch.
  3. The number of vertices was increased from 16 to 24.
  4. The vertex structure is smaller, being only 10 bytes per vertex instead of 16.
  5. UV coordinates are per-face instead of per-vertex.
  6. The lighting overlay was removed. Dynamic lighting & environment mapping for objects are calculated on the CPU.
  7. The matrix stack has been removed; there are now only 3 matrices at fixed offsets.
  8. The number of segment banks has been reduced from 16 to 8
  9. Mipmapping cannot be done, due to some changes in the triangle setup routine.

Structures

Vertex (10 bytes)

[XX XX] [YY YY] [ZZ ZZ] [RR] [GG] [BB] [AA]

XXXX short Position on X axis
YYYY short Position on Y axis
ZZZZ short Position on Z axis
RR ubyte Red color channel
GG ubyte Green color channel
BB ubyte Blue color channel
AA ubyte Alpha (Transparency)

Triangle Face (16 bytes)

[BF] [V0] [V1] [V2] [U1U1] [V1V1] [U2U2] [V2V2] [U3U3] [V3V3]

BF ubyte 0x40 = Draw the backface of the triangle, 0x00 = Cull backface
V0 ubyte First vertex index
V1 ubyte Second vertex index
V2 ubyte Third vertex index
U1U1 short Texture coordinate on the U axis for the first vertex
V1V1 short Texture coordinate on the V axis for the first vertex
U2U2 short Texture coordinate on the U axis for the second vertex
V2V2 short Texture coordinate on the V axis for the second vertex
U3U3 short Texture coordinate on the U axis for the third vertex
V3V3 short Texture coordinate on the V axis for the third vertex

Added/Modified Commands

01: G_MTX

Loads a matrix from a segmented address.

01 [II] 00 40 [AA AA AA AA]

I Index in the matrix array within DMEM. 0x00, 0x40, or 0x80
A Segmented address of vectors

04: G_VTX

Loads up to 24 vertices from a segment address.

04 [NO] [II II] [SS SS SS SS]

NO Upper 5 bits = Number of vertices - 1, Lower 3 bits = Offset within vertex struct to start at
I (Where to start writing vertices inside the vertex buffer) * 2
S Segmented address to load vertices from

05: G_TRIN

Draws a batch of triangles from a segmented address. Up to 16 triangles can be drawn at once.

05 [N] [T] [LL LL] [SS SS SS SS]

N Number of triangles - 1
T 0x01 = Enable texture, 0x00 = Disable texture
L Length of data to write in bytes ((N+1)*16)
S Segmented address to load triangle data from

07: G_DMADL

DMAs a fixed-size display list from RDRAM and outputs the commands directly to the RDP. This is used by the game engine to load textures for models.

07 [NN] [LL LL] [SS SS SS SS]

N Number of commands
L Length of data in bytes (N*8)
S Segmented address to the display list.

B5: G_SETPERSPNORM

Sets the perspective normal value. Might be unused.

B5 00 00 00 [PP PP] 00 00

P PERSPNORM value

BC: G_MOVEWORD

The format is still the same as Fast3D, but two indices have been changed:

G_MW_BILLBOARD 0x02 0x01 = billboarding enabled, 0x00 = disabled
G_MW_MVMATRIX 0x0A Specifies the index of the modelview matrix.

References