diff --git a/bits.h b/bits.h index 0ee698d..1f3fe1f 100644 --- a/bits.h +++ b/bits.h @@ -113,6 +113,122 @@ #define BG3CNT__mosaic__enable (0x1 << 6) #define BG3CNT__character_base_block(v) (((v) & 0xf) << 2) #define BG3CNT__priority(v) (((v) & 0x3) << 0) +#define DISP3DCNT__clear_image__disable (0x0 << 14) +#define DISP3DCNT__clear_image__enable (0x1 << 14) +#define DISP3DCNT__polygon_list_ram_and_vertex_ram_overflow (0x1 << 13) +#define DISP3DCNT__color_buffer_underflow (0x1 << 12) +#define DISP3DCNT__fog_shift(v) (((v) & 0xf) << 8) +#define DISP3DCNT__fog_master__disable (0x0 << 7) +#define DISP3DCNT__fog_master__enable (0x1 << 7) +#define DISP3DCNT__fog_mode__blending_using_pixel_color_value_and_alpha_value (0x0 << 6) +#define DISP3DCNT__fog_mode__blending_using_only_pixel_alpha_value (0x1 << 6) +#define DISP3DCNT__edge_marking__disable (0x0 << 5) +#define DISP3DCNT__edge_marking__enable (0x1 << 5) +#define DISP3DCNT__anti_aliasing__disable (0x0 << 4) +#define DISP3DCNT__anti_aliasing__enable (0x1 << 4) +#define DISP3DCNT__alpha_blending__disable (0x0 << 3) +#define DISP3DCNT__alpha_blending__enable (0x1 << 3) +#define DISP3DCNT__alpha_test__disable (0x0 << 2) +#define DISP3DCNT__alpha_test__enable (0x1 << 2) +#define DISP3DCNT__toon_highlight__toon_shading (0x0 << 1) +#define DISP3DCNT__toon_highlight__highlight_shading (0x1 << 1) +#define DISP3DCNT__texture_mapping__disable (0x0 << 0) +#define DISP3DCNT__texture_mapping__enable (0x1 << 0) +#define MTX_MODE__matrix_mode__projection (0x0 << 0) +#define MTX_MODE__matrix_mode__position (0x1 << 0) +#define MTX_MODE__matrix_mode__position_and_vector (0x2 << 0) +#define MTX_MODE__matrix_mode__texture (0x3 << 0) +#define MTX_POP__number_of_pops(v) (((v) & 0x3f) << 0) +#define MTX_STORE__index(v) (((v) & 0x1f) << 0) +#define MTX_RESTORE__position(v) (((v) & 0x1f) << 0) +#define NORMAL__z_component(v) (((v) & 0x3ff) << 20) +#define NORMAL__y_component(v) (((v) & 0x3ff) << 10) +#define NORMAL__x_component(v) (((v) & 0x3ff) << 0) +#define TEXCOORD__t_coordinate(v) (((v) & 0xffff) << 16) +#define TEXCOORD__x_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_16__y_coordinate(v) (((v) & 0xffff) << 16) +#define VTX_16__x_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_16__z_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_10__z_coordinate(v) (((v) & 0x3ff) << 20) +#define VTX_10__y_coordinate(v) (((v) & 0x3ff) << 10) +#define VTX_10__x_coordinate(v) (((v) & 0x3ff) << 0) +#define VTX_XY__y_coordinate(v) (((v) & 0xffff) << 16) +#define VTX_XY__x_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_XZ__z_coordinate(v) (((v) & 0xffff) << 16) +#define VTX_XZ__z_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_YZ__z_coordinate(v) (((v) & 0xffff) << 16) +#define VTX_YZ__y_coordinate(v) (((v) & 0xffff) << 0) +#define VTX_DIFF__z_coordinate(v) (((v) & 0x3ff) << 20) +#define VTX_DIFF__y_coordinate(v) (((v) & 0x3ff) << 10) +#define VTX_DIFF__x_coordinate(v) (((v) & 0x3ff) << 0) +#define POLYGON_ATTR__polygon_id(v) (((v) & 0x3f) << 24) +#define POLYGON_ATTR__alpha_value(v) (((v) & 0x1f) << 16) +#define POLYGON_ATTR__fog__disable (0x0 << 15) +#define POLYGON_ATTR__fog__enable (0x1 << 15) +#define POLYGON_ATTR__depth_test_condition__render_when_depth_value_is_smaller_than_buffer_value (0x0 << 14) +#define POLYGON_ATTR__depth_test_condition__render_when_depth_value_is_equal_to_buffer_value (0x1 << 14) +#define POLYGON_ATTR__one_dot_polygon__do_not_render (0x0 << 13) +#define POLYGON_ATTR__one_dot_polygon__render (0x1 << 13) +#define POLYGON_ATTR__far_plane_intersection__delete (0x0 << 12) +#define POLYGON_ATTR__far_plane_intersection__clip (0x1 << 12) +#define POLYGON_ATTR__translucent_depth_value_update__do_not_update (0x0 << 11) +#define POLYGON_ATTR__translucent_depth_value_update__update (0x1 << 11) +#define POLYGON_ATTR__render_front_surface__disable (0x0 << 7) +#define POLYGON_ATTR__render_front_surface__enable (0x1 << 7) +#define POLYGON_ATTR__render_back_surface__disable (0x0 << 6) +#define POLYGON_ATTR__render_back_surface__enable (0x1 << 6) +#define POLYGON_ATTR__polygon_mode__modulation (0x0 << 4) +#define POLYGON_ATTR__polygon_mode__decal (0x1 << 4) +#define POLYGON_ATTR__polygon_mode__toon (0x2 << 4) +#define POLYGON_ATTR__polygon_mode__shadow (0x3 << 4) +#define POLYGON_ATTR__light_3__disable (0x0 << 3) +#define POLYGON_ATTR__light_3__enable (0x1 << 3) +#define POLYGON_ATTR__light_2__disable (0x0 << 2) +#define POLYGON_ATTR__light_2__enable (0x1 << 2) +#define POLYGON_ATTR__light_1__disable (0x0 << 1) +#define POLYGON_ATTR__light_1__enable (0x1 << 1) +#define POLYGON_ATTR__light_0__disable (0x0 << 0) +#define POLYGON_ATTR__light_0__enable (0x1 << 0) +#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__do_not_transform_texture_coordinates (0x0 << 30) +#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__texcoord_source (0x1 << 30) +#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__normal_source (0x2 << 30) +#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__vextex_source (0x3 << 30) +#define TEXIMAGE_PARAM__palette_color0_transparency__palette_setting (0x0 << 29) +#define TEXIMAGE_PARAM__palette_color0_transparency__always_transparent (0x1 << 29) +#define TEXIMAGE_PARAM__texture_format__no_texture (0x0 << 26) +#define TEXIMAGE_PARAM__texture_format__a3i5_translucent (0x1 << 26) +#define TEXIMAGE_PARAM__texture_format__4_color_palette (0x2 << 26) +#define TEXIMAGE_PARAM__texture_format__16_color_palette (0x3 << 26) +#define TEXIMAGE_PARAM__texture_format__256_color_palette (0x4 << 26) +#define TEXIMAGE_PARAM__texture_format__4x4_texel_compressed (0x5 << 26) +#define TEXIMAGE_PARAM__texture_format__a5i3_translucent (0x6 << 26) +#define TEXIMAGE_PARAM__texture_format__direct (0x7 << 26) +#define TEXIMAGE_PARAM__t_size__8_texels (0x0 << 23) +#define TEXIMAGE_PARAM__t_size__16_texels (0x1 << 23) +#define TEXIMAGE_PARAM__t_size__32_texels (0x2 << 23) +#define TEXIMAGE_PARAM__t_size__64_texels (0x3 << 23) +#define TEXIMAGE_PARAM__t_size__128_texels (0x4 << 23) +#define TEXIMAGE_PARAM__t_size__256_texels (0x5 << 23) +#define TEXIMAGE_PARAM__t_size__512_texels (0x6 << 23) +#define TEXIMAGE_PARAM__t_size__1024_texels (0x7 << 23) +#define TEXIMAGE_PARAM__s_size__8_texels (0x0 << 20) +#define TEXIMAGE_PARAM__s_size__16_texels (0x1 << 20) +#define TEXIMAGE_PARAM__s_size__32_texels (0x2 << 20) +#define TEXIMAGE_PARAM__s_size__64_texels (0x3 << 20) +#define TEXIMAGE_PARAM__s_size__128_texels (0x4 << 20) +#define TEXIMAGE_PARAM__s_size__256_texels (0x5 << 20) +#define TEXIMAGE_PARAM__s_size__512_texels (0x6 << 20) +#define TEXIMAGE_PARAM__s_size__1024_texels (0x7 << 20) +#define TEXIMAGE_PARAM__flip_t__do_not_flip (0x0 << 19) +#define TEXIMAGE_PARAM__flip_t__flip (0x1 << 19) +#define TEXIMAGE_PARAM__flip_s__do_not_flip (0x0 << 18) +#define TEXIMAGE_PARAM__flip_s__flip (0x1 << 18) +#define TEXIMAGE_PARAM__repeat_t__do_not_repeat (0x0 << 17) +#define TEXIMAGE_PARAM__repeat_t__repeat (0x1 << 17) +#define TEXIMAGE_PARAM__repeat_s__do_not_repeat (0x0 << 16) +#define TEXIMAGE_PARAM__repeat_s__repeat (0x1 << 16) +#define TEXIMAGE_PARAM__texture_starting_address(v) (((v) & 0xffff) << 0) +#define TEXPLTT_BASE__base_address(v) (((v) & 0x1fff) << 0) #define OBJ_ATTRIBUTE_0__obj_shape__square (0x0 << 14) #define OBJ_ATTRIBUTE_0__obj_shape__long_rectangle (0x1 << 14) #define OBJ_ATTRIBUTE_0__obj_shape__tall_rectangle (0x2 << 14) diff --git a/registers/format_bits.py b/registers/format_bits.py index 1a7e1c1..4af0886 100644 --- a/registers/format_bits.py +++ b/registers/format_bits.py @@ -24,7 +24,7 @@ def render_bit(prefix, bit): elif bit.value is None: # variable macro mask_value = mask_from_bits(bit.bits) - assert bit.mask & mask_value == mask_value, (bit.mask, mask_value) + assert bit.mask & mask_value == mask_value, (bit.mask, mask_value, bit) yield f"#define {macro_name}(v) (((v) & {hex(mask_value)}) << {min(bit.bits)})" else: assert False, bit diff --git a/registers/graphics_engine_bits.csv b/registers/graphics_engine_bits.csv index b05b1e8..99a8663 100644 --- a/registers/graphics_engine_bits.csv +++ b/registers/graphics_engine_bits.csv @@ -40,8 +40,8 @@ "DISPCNT","bitmap_obj_mapping_mode","6-5","1d_mapping","0b10",, "DISPCNT","character_obj_mapping_mode",4,"2d_mapping",0,, "DISPCNT","character_obj_mapping_mode",4,"1d_mapping",1,, -"DISPCNT","2d_3d_display_selection_for_bg0",3,"display_2d_graphics",0,, -"DISPCNT","2d_3d_display_selection_for_bg0",3,"display_3d_graphics",1,, +"DISPCNT","display_selection_for_bg0",3,"2d_graphics",0,, +"DISPCNT","display_selection_for_bg0",3,"3d_graphics",1,, "DISPCNT","bg_mode","2-0","text0_text1_text2_text3",0,, "DISPCNT","bg_mode","2-0","text0_text1_text2_affine3",1,, "DISPCNT","bg_mode","2-0","text0_text1_affine2_affine3",2,, @@ -121,6 +121,166 @@ "BG3CNT",,"5-2","character_base_block",,"0b1111", "BG3CNT",,"1-0","priority",,"0b11", ,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +"DISP3DCNT","clear_image",14,"disable",0,, +"DISP3DCNT","clear_image",14,"enable",1,, +"DISP3DCNT",,13,"polygon_list_ram_and_vertex_ram_overflow",1,, +"DISP3DCNT",,12,"color_buffer_underflow",1,, +"DISP3DCNT",,"11-8","fog_shift",,"0b1111", +"DISP3DCNT","fog_master",7,"disable",0,, +"DISP3DCNT","fog_master",7,"enable",1,, +"DISP3DCNT","fog_mode",6,"blending_using_pixel_color_value_and_alpha_value",0,, +"DISP3DCNT","fog_mode",6,"blending_using_only_pixel_alpha_value",1,, +"DISP3DCNT","edge_marking",5,"disable",0,, +"DISP3DCNT","edge_marking",5,"enable",1,, +"DISP3DCNT","anti_aliasing",4,"disable",0,, +"DISP3DCNT","anti_aliasing",4,"enable",1,, +"DISP3DCNT","alpha_blending",3,"disable",0,, +"DISP3DCNT","alpha_blending",3,"enable",1,, +"DISP3DCNT","alpha_test",2,"disable",0,, +"DISP3DCNT","alpha_test",2,"enable",1,, +"DISP3DCNT","toon_highlight",1,"toon_shading",0,, +"DISP3DCNT","toon_highlight",1,"highlight_shading",1,, +"DISP3DCNT","texture_mapping",0,"disable",0,, +"DISP3DCNT","texture_mapping",0,"enable",1,, +,,,,,, +"MTX_MODE","matrix_mode","1-0","projection","0b00",, +"MTX_MODE","matrix_mode","1-0","position","0b01",, +"MTX_MODE","matrix_mode","1-0","position_and_vector","0b10",, +"MTX_MODE","matrix_mode","1-0","texture","0b11",, +,,,,,, +"MTX_POP",,"5-0","number_of_pops",,"0b111111", +,,,,,, +"MTX_STORE",,"4-0","index",,"0b11111", +,,,,,, +"MTX_RESTORE",,"4-0","position",,"0b11111", +,,,,,, +"NORMAL",,"29-20","z_component",,"0x7ff", +"NORMAL",,"19-10","y_component",,"0x7ff", +"NORMAL",,"9-0","x_component",,"0x7ff", +,,,,,, +"TEXCOORD",,"31-16","t_coordinate",,"0xffff", +"TEXCOORD",,"15-0","x_coordinate",,"0xffff", +,,,,,, +"VTX_16",,"31-16","y_coordinate",,"0xffff", +"VTX_16",,"15-0","x_coordinate",,"0xffff", +"VTX_16",,"15-0","z_coordinate",,"0xffff", +,,,,,, +"VTX_10",,"29-20","z_coordinate",,"0x7ff", +"VTX_10",,"19-10","y_coordinate",,"0x7ff", +"VTX_10",,"9-0","x_coordinate",,"0x7ff", +,,,,,, +"VTX_XY",,"31-16","y_coordinate",,"0xffff", +"VTX_XY",,"15-0","x_coordinate",,"0xffff", +,,,,,, +"VTX_XZ",,"31-16","z_coordinate",,"0xffff", +"VTX_XZ",,"15-0","z_coordinate",,"0xffff", +,,,,,, +"VTX_YZ",,"31-16","z_coordinate",,"0xffff", +"VTX_YZ",,"15-0","y_coordinate",,"0xffff", +,,,,,, +"VTX_DIFF",,"29-20","z_coordinate",,"0x7ff", +"VTX_DIFF",,"19-10","y_coordinate",,"0x7ff", +"VTX_DIFF",,"9-0","x_coordinate",,"0x7ff", +,,,,,, +"POLYGON_ATTR",,"29-24","polygon_id",,"0b111111", +"POLYGON_ATTR",,"20-16","alpha_value",,"0b11111", +"POLYGON_ATTR","fog",15,"disable",0,, +"POLYGON_ATTR","fog",15,"enable",1,, +"POLYGON_ATTR","depth_test_condition",14,"render_when_depth_value_is_smaller_than_buffer_value",0,, +"POLYGON_ATTR","depth_test_condition",14,"render_when_depth_value_is_equal_to_buffer_value",1,, +"POLYGON_ATTR","one_dot_polygon",13,"do_not_render",0,, +"POLYGON_ATTR","one_dot_polygon",13,"render",1,, +"POLYGON_ATTR","far_plane_intersection",12,"delete",0,, +"POLYGON_ATTR","far_plane_intersection",12,"clip",1,, +"POLYGON_ATTR","translucent_depth_value_update",11,"do_not_update",0,, +"POLYGON_ATTR","translucent_depth_value_update",11,"update",1,, +"POLYGON_ATTR","render_front_surface",7,"disable",0,, +"POLYGON_ATTR","render_front_surface",7,"enable",1,, +"POLYGON_ATTR","render_back_surface",6,"disable",0,, +"POLYGON_ATTR","render_back_surface",6,"enable",1,, +"POLYGON_ATTR","polygon_mode","5-4","modulation","0b00",, +"POLYGON_ATTR","polygon_mode","5-4","decal","0b01",, +"POLYGON_ATTR","polygon_mode","5-4","toon","0b10",, +"POLYGON_ATTR","polygon_mode","5-4","shadow","0b11",, +"POLYGON_ATTR","light_3",3,"disable",0,, +"POLYGON_ATTR","light_3",3,"enable",1,, +"POLYGON_ATTR","light_2",2,"disable",0,, +"POLYGON_ATTR","light_2",2,"enable",1,, +"POLYGON_ATTR","light_1",1,"disable",0,, +"POLYGON_ATTR","light_1",1,"enable",1,, +"POLYGON_ATTR","light_0",0,"disable",0,, +"POLYGON_ATTR","light_0",0,"enable",1,, +,,,,,, +"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","do_not_transform_texture_coordinates","0b00",, +"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","texcoord_source","0b01",, +"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","normal_source","0b10",, +"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","vextex_source","0b11",, +"TEXIMAGE_PARAM","palette_color0_transparency",29,"palette_setting",0,, +"TEXIMAGE_PARAM","palette_color0_transparency",29,"always_transparent",1,, +"TEXIMAGE_PARAM","texture_format","28-26","no_texture",0,, +"TEXIMAGE_PARAM","texture_format","28-26","a3i5_translucent",1,, +"TEXIMAGE_PARAM","texture_format","28-26","4_color_palette",2,, +"TEXIMAGE_PARAM","texture_format","28-26","16_color_palette",3,, +"TEXIMAGE_PARAM","texture_format","28-26","256_color_palette",4,, +"TEXIMAGE_PARAM","texture_format","28-26","4x4_texel_compressed",5,, +"TEXIMAGE_PARAM","texture_format","28-26","a5i3_translucent",6,, +"TEXIMAGE_PARAM","texture_format","28-26","direct",7,, +"TEXIMAGE_PARAM","t_size","25-23","8_texels",0,, +"TEXIMAGE_PARAM","t_size","25-23","16_texels",1,, +"TEXIMAGE_PARAM","t_size","25-23","32_texels",2,, +"TEXIMAGE_PARAM","t_size","25-23","64_texels",3,, +"TEXIMAGE_PARAM","t_size","25-23","128_texels",4,, +"TEXIMAGE_PARAM","t_size","25-23","256_texels",5,, +"TEXIMAGE_PARAM","t_size","25-23","512_texels",6,, +"TEXIMAGE_PARAM","t_size","25-23","1024_texels",7,, +"TEXIMAGE_PARAM","s_size","22-20","8_texels",0,, +"TEXIMAGE_PARAM","s_size","22-20","16_texels",1,, +"TEXIMAGE_PARAM","s_size","22-20","32_texels",2,, +"TEXIMAGE_PARAM","s_size","22-20","64_texels",3,, +"TEXIMAGE_PARAM","s_size","22-20","128_texels",4,, +"TEXIMAGE_PARAM","s_size","22-20","256_texels",5,, +"TEXIMAGE_PARAM","s_size","22-20","512_texels",6,, +"TEXIMAGE_PARAM","s_size","22-20","1024_texels",7,, +"TEXIMAGE_PARAM","flip_t",19,"do_not_flip",0,, +"TEXIMAGE_PARAM","flip_t",19,"flip",1,, +"TEXIMAGE_PARAM","flip_s",18,"do_not_flip",0,, +"TEXIMAGE_PARAM","flip_s",18,"flip",1,, +"TEXIMAGE_PARAM","repeat_t",17,"do_not_repeat",0,, +"TEXIMAGE_PARAM","repeat_t",17,"repeat",1,, +"TEXIMAGE_PARAM","repeat_s",16,"do_not_repeat",0,, +"TEXIMAGE_PARAM","repeat_s",16,"repeat",1,, +"TEXIMAGE_PARAM",,"15-0","texture_starting_address",,"0xffff", +,,,,,, +"TEXPLTT_BASE",,"12-0","base_address",,"0x1fff", +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, +,,,,,, "OBJ_ATTRIBUTE_0","obj_shape","15-14","square","0b00",, "OBJ_ATTRIBUTE_0","obj_shape","15-14","long_rectangle","0b01",, "OBJ_ATTRIBUTE_0","obj_shape","15-14","tall_rectangle","0b10",, @@ -137,3 +297,11 @@ "OBJ_ATTRIBUTE_0","affine_transformation",8,"disable",0,, "OBJ_ATTRIBUTE_0","affine_transformation",8,"enable",1,, "OBJ_ATTRIBUTE_0",,"7-0","y_coordinate",,"0xff", +,,,,,, +"OBJ_ATTRIBUTE_1",,"15-14","obj_size",,"0b11", +"OBJ_ATTRIBUTE_1",,"13-9","affine_transformation_parameter",,"0b11111", +"OBJ_ATTRIBUTE_1",,"8-0","x_coordinate",,"0x1ff", +,,,,,, +"OBJ_ATTRIBUTE_2",,"15-12","color_parameter",,"0b1111", +"OBJ_ATTRIBUTE_2",,"11-10","display_priority",,"0b11", +"OBJ_ATTRIBUTE_2",,"9-0","character_name",,"0x3ff", diff --git a/registers/graphics_engine_bits.ods b/registers/graphics_engine_bits.ods index a7c21c5..d85e2e8 100644 Binary files a/registers/graphics_engine_bits.ods and b/registers/graphics_engine_bits.ods differ diff --git a/registers/parse_bits.py b/registers/parse_bits.py index ef01bcf..337ead3 100644 --- a/registers/parse_bits.py +++ b/registers/parse_bits.py @@ -75,6 +75,7 @@ def aggregate_enums(aggregated_rows): enum_aggregated = defaultdict(list) all_bits = set() enum_bits = dict() + non_enum_bits = list() def assert_unique_ordered(bits, row): nonlocal all_bits @@ -86,11 +87,14 @@ def aggregate_enums(aggregated_rows): bit = parse_row(row) assert row["bit_name"] != "", row if row["enum_name"] == "": - assert_unique_ordered(bit.bits, row) + if bit.bits not in non_enum_bits: + assert_unique_ordered(bit.bits, row) non_enum.append(bit) + non_enum_bits.append(bit.bits) else: if row["enum_name"] not in enum_bits: - assert_unique_ordered(bit.bits, row) + if bit.bits not in enum_bits.values(): + assert_unique_ordered(bit.bits, row) non_enum.append(row["enum_name"]) else: assert enum_bits[row["enum_name"]] == bit.bits, row