diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h
index 4a9f18b0c4..8e0110f2d1 100644
--- a/hw/xbox/nv2a/nv2a_regs.h
+++ b/hw/xbox/nv2a/nv2a_regs.h
@@ -1041,13 +1041,30 @@
 #   define NV097_SET_LIGHT_LOCAL_POSITION                     0x0000105C
 #   define NV097_SET_LIGHT_LOCAL_ATTENUATION                  0x00001068
 #   define NV097_SET_VERTEX4F                                 0x00001518
-#   define NV097_SET_NORMAL                                   0x00001530
+#   define NV097_SET_NORMAL3F                                 0x00001530
+#   define NV097_SET_NORMAL3S                                 0x00001540
 #   define NV097_SET_DIFFUSE_COLOR4F                          0x00001550
+#   define NV097_SET_DIFFUSE_COLOR3F                          0x00001560
+#   define NV097_SET_DIFFUSE_COLOR4UB                         0x0000156C
 #   define NV097_SET_SPECULAR_COLOR4F                         0x00001570
-#   define NV097_SET_TEXCOORD0                                0x00001590
-#   define NV097_SET_TEXCOORD1                                0x000015B8
-#   define NV097_SET_TEXCOORD2                                0x000015E0
-#   define NV097_SET_TEXCOORD3                                0x00001608
+#   define NV097_SET_SPECULAR_COLOR3F                         0x00001580
+#   define NV097_SET_SPECULAR_COLOR4UB                        0x0000158C
+#   define NV097_SET_TEXCOORD0_2F                             0x00001590
+#   define NV097_SET_TEXCOORD0_4F                             0x000015A0
+#   define NV097_SET_TEXCOORD0_2S                             0x00001598
+#   define NV097_SET_TEXCOORD0_4S                             0x000015B0
+#   define NV097_SET_TEXCOORD1_2F                             0x000015B8
+#   define NV097_SET_TEXCOORD1_4F                             0x000015C8
+#   define NV097_SET_TEXCOORD1_2S                             0x000015C0
+#   define NV097_SET_TEXCOORD1_4S                             0x000015D8
+#   define NV097_SET_TEXCOORD2_2F                             0x000015E0
+#   define NV097_SET_TEXCOORD2_4F                             0x000015F0
+#   define NV097_SET_TEXCOORD2_2S                             0x000015E8
+#   define NV097_SET_TEXCOORD2_4S                             0x00001600
+#   define NV097_SET_TEXCOORD3_2F                             0x00001608
+#   define NV097_SET_TEXCOORD3_4F                             0x00001620
+#   define NV097_SET_TEXCOORD3_2S                             0x00001610
+#   define NV097_SET_TEXCOORD3_4S                             0x00001630
 #   define NV097_SET_VERTEX_DATA_ARRAY_OFFSET                 0x00001720
 #   define NV097_SET_VERTEX_DATA_ARRAY_FORMAT                 0x00001760
 #       define NV097_SET_VERTEX_DATA_ARRAY_FORMAT_TYPE            0x0000000F
diff --git a/hw/xbox/nv2a/pgraph.c b/hw/xbox/nv2a/pgraph.c
index a1703be5c3..f1861a54d7 100644
--- a/hw/xbox/nv2a/pgraph.c
+++ b/hw/xbox/nv2a/pgraph.c
@@ -2260,7 +2260,107 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F)
     }
 }
 
-#define SET_VERTEX_ATTRIBUTE(command, attr_index) \
+DEF_METHOD_INC(NV097, SET_NORMAL3S)
+{
+    int slot = (method - NV097_SET_NORMAL3S) / 4;
+    unsigned int part = slot % 2;
+    VertexAttribute *attribute =
+        &pg->vertex_attributes[NV2A_VERTEX_ATTR_NORMAL];
+    pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_NORMAL);
+    int16_t val = parameter & 0xFFFF;
+    attribute->inline_value[part * 2 + 0] = MAX(-1.0f, (float)val / 32767.0f);
+    val = parameter >> 16;
+    attribute->inline_value[part * 2 + 1] = MAX(-1.0f, (float)val / 32767.0f);
+}
+
+#define SET_VERTEX_ATTRIBUTE_4S(command, attr_index)                     \
+    do {                                                                   \
+        int slot = (method - (command)) / 4;                               \
+        unsigned int part = slot % 2;                                      \
+        VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
+        pgraph_allocate_inline_buffer_vertices(pg, (attr_index));          \
+        attribute->inline_value[part * 2 + 0] =                            \
+            (float)(int16_t)(parameter & 0xFFFF);                          \
+        attribute->inline_value[part * 2 + 1] =                            \
+            (float)(int16_t)(parameter >> 16);                             \
+    } while (0)
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD0_4S)
+{
+    SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD0_4S, NV2A_VERTEX_ATTR_TEXTURE0);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD1_4S)
+{
+    SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD1_4S, NV2A_VERTEX_ATTR_TEXTURE1);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD2_4S)
+{
+    SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD2_4S, NV2A_VERTEX_ATTR_TEXTURE2);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD3_4S)
+{
+    SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD3_4S, NV2A_VERTEX_ATTR_TEXTURE3);
+}
+
+#undef SET_VERTEX_ATTRIBUTE_4S
+
+#define SET_VERTEX_ATRIBUTE_TEX_2S(attr_index)                             \
+    do {                                                                   \
+        VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
+        pgraph_allocate_inline_buffer_vertices(pg, (attr_index));          \
+        attribute->inline_value[0] = (float)(int16_t)(parameter & 0xFFFF); \
+        attribute->inline_value[1] = (float)(int16_t)(parameter >> 16);    \
+        attribute->inline_value[2] = 0.0f;                                 \
+        attribute->inline_value[3] = 1.0f;                                 \
+    } while (0)
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD0_2S)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE0);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD1_2S)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE1);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD2_2S)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE2);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD3_2S)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE3);
+}
+
+#undef SET_VERTEX_ATRIBUTE_TEX_2S
+
+#define SET_VERTEX_COLOR_3F(command, attr_index)                           \
+    do {                                                                   \
+        int slot = (method - (command)) / 4;                               \
+        VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
+        pgraph_allocate_inline_buffer_vertices(pg, (attr_index));          \
+        attribute->inline_value[slot] = *(float*)&parameter;               \
+        attribute->inline_value[3] = 1.0f;                                 \
+    } while (0)
+
+DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR3F)
+{
+    SET_VERTEX_COLOR_3F(NV097_SET_DIFFUSE_COLOR3F, NV2A_VERTEX_ATTR_DIFFUSE);
+}
+
+DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR3F)
+{
+    SET_VERTEX_COLOR_3F(NV097_SET_SPECULAR_COLOR3F, NV2A_VERTEX_ATTR_SPECULAR);
+}
+
+#undef SET_VERTEX_COLOR_3F
+
+#define SET_VERTEX_ATTRIBUTE_F(command, attr_index)                        \
     do {                                                                   \
         int slot = (method - (command)) / 4;                               \
         VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
@@ -2268,42 +2368,104 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F)
         attribute->inline_value[slot] = *(float*)&parameter;               \
     } while (0)
 
-DEF_METHOD_INC(NV097, SET_NORMAL)
+DEF_METHOD_INC(NV097, SET_NORMAL3F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_NORMAL, NV2A_VERTEX_ATTR_NORMAL);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_NORMAL3F, NV2A_VERTEX_ATTR_NORMAL);
 }
 
 DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_DIFFUSE_COLOR4F, NV2A_VERTEX_ATTR_DIFFUSE);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_DIFFUSE_COLOR4F, NV2A_VERTEX_ATTR_DIFFUSE);
 }
 
 DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_SPECULAR_COLOR4F, NV2A_VERTEX_ATTR_SPECULAR);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_SPECULAR_COLOR4F,
+                           NV2A_VERTEX_ATTR_SPECULAR);
 }
 
-DEF_METHOD_INC(NV097, SET_TEXCOORD0)
+DEF_METHOD_INC(NV097, SET_TEXCOORD0_4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD0, NV2A_VERTEX_ATTR_TEXTURE0);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD0_4F, NV2A_VERTEX_ATTR_TEXTURE0);
 }
 
-DEF_METHOD_INC(NV097, SET_TEXCOORD1)
+DEF_METHOD_INC(NV097, SET_TEXCOORD1_4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD1, NV2A_VERTEX_ATTR_TEXTURE1);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD1_4F, NV2A_VERTEX_ATTR_TEXTURE1);
 }
 
-DEF_METHOD_INC(NV097, SET_TEXCOORD2)
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD2_4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD2, NV2A_VERTEX_ATTR_TEXTURE2);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD2_4F, NV2A_VERTEX_ATTR_TEXTURE2);
 }
 
-DEF_METHOD_INC(NV097, SET_TEXCOORD3)
+DEF_METHOD_INC(NV097, SET_TEXCOORD3_4F)
 {
-    SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD3, NV2A_VERTEX_ATTR_TEXTURE3);
+    SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD3_4F, NV2A_VERTEX_ATTR_TEXTURE3);
 }
 
-#undef SET_VERTEX_ATTRIBUTE
+#undef SET_VERTEX_ATTRIBUTE_F
+
+#define SET_VERTEX_ATRIBUTE_TEX_2F(command, attr_index)                    \
+    do {                                                                   \
+        int slot = (method - (command)) / 4;                               \
+        VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
+        pgraph_allocate_inline_buffer_vertices(pg, (attr_index));          \
+        attribute->inline_value[slot] = *(float*)&parameter;               \
+        attribute->inline_value[2] = 0.0f;                                 \
+        attribute->inline_value[3] = 1.0f;                                 \
+    } while (0)
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD0_2F)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD0_2F,
+                               NV2A_VERTEX_ATTR_TEXTURE0);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD1_2F)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD1_2F,
+                               NV2A_VERTEX_ATTR_TEXTURE1);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD2_2F)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD2_2F,
+                               NV2A_VERTEX_ATTR_TEXTURE2);
+}
+
+DEF_METHOD_INC(NV097, SET_TEXCOORD3_2F)
+{
+    SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD3_2F,
+                               NV2A_VERTEX_ATTR_TEXTURE3);
+}
+
+#undef SET_VERTEX_ATRIBUTE_TEX_2F
+
+#define SET_VERTEX_ATTRIBUTE_4UB(command, attr_index)                       \
+    do {                                                                   \
+        VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \
+        pgraph_allocate_inline_buffer_vertices(pg, (attr_index));          \
+        attribute->inline_value[0] = (parameter & 0xFF) / 255.0f;          \
+        attribute->inline_value[1] = ((parameter >> 8) & 0xFF) / 255.0f;   \
+        attribute->inline_value[2] = ((parameter >> 16) & 0xFF) / 255.0f;  \
+        attribute->inline_value[3] = ((parameter >> 24) & 0xFF) / 255.0f;  \
+    } while (0)
+
+DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR4UB)
+{
+    SET_VERTEX_ATTRIBUTE_4UB(NV097_SET_DIFFUSE_COLOR4UB,
+                             NV2A_VERTEX_ATTR_DIFFUSE);
+}
+
+DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR4UB)
+{
+    SET_VERTEX_ATTRIBUTE_4UB(NV097_SET_SPECULAR_COLOR4UB,
+                             NV2A_VERTEX_ATTR_SPECULAR);
+}
+
+#undef SET_VERTEX_ATTRIBUTE_4UB
 
 DEF_METHOD_INC(NV097, SET_VERTEX_DATA_ARRAY_FORMAT)
 {
diff --git a/hw/xbox/nv2a/pgraph_methods.h b/hw/xbox/nv2a/pgraph_methods.h
index fb29b51e26..c5fe209904 100644
--- a/hw/xbox/nv2a/pgraph_methods.h
+++ b/hw/xbox/nv2a/pgraph_methods.h
@@ -108,13 +108,30 @@ DEF_METHOD_RANGE(NV097, SET_VERTEX3F, 3)
 DEF_METHOD_RANGE(NV097, SET_BACK_LIGHT_AMBIENT_COLOR, 8*16)
 DEF_METHOD_RANGE(NV097, SET_LIGHT_AMBIENT_COLOR, 8*32)
 DEF_METHOD_RANGE(NV097, SET_VERTEX4F, 4)
-DEF_METHOD_RANGE(NV097, SET_NORMAL, 3)
+DEF_METHOD_RANGE(NV097, SET_NORMAL3F, 3)
+DEF_METHOD_RANGE(NV097, SET_NORMAL3S, 3)
 DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR4F, 4)
+DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR3F, 3)
+DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR4UB, 1)
 DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR4F, 4)
-DEF_METHOD_RANGE(NV097, SET_TEXCOORD0, 2)
-DEF_METHOD_RANGE(NV097, SET_TEXCOORD1, 2)
-DEF_METHOD_RANGE(NV097, SET_TEXCOORD2, 2)
-DEF_METHOD_RANGE(NV097, SET_TEXCOORD3, 2)
+DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR3F, 3)
+DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR4UB, 1)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_2F, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_4F, 4)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_2S, 1)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_4S, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_2F, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_4F, 4)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_2S, 1)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_4S, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_2F, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_4F, 4)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_2S, 1)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_4S, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_2F, 2)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_4F, 4)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_2S, 1)
+DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_4S, 2)
 DEF_METHOD_RANGE(NV097, SET_VERTEX_DATA_ARRAY_FORMAT, 16)
 DEF_METHOD_RANGE(NV097, SET_VERTEX_DATA_ARRAY_OFFSET, 16)
 DEF_METHOD(NV097, SET_LOGIC_OP_ENABLE)