From 67f809c98d2fd34393504e3efd3b2d0567852b53 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sat, 2 Dec 2023 20:50:53 +0800 Subject: [PATCH] vga: use core_bits.h --- .gitignore | 1 + addresses.lds | 15 +- aica.h | 1 + holly/core_bits.h | 453 ++++++++++++++++++++++++++++++++++++ holly/ta_bits.h | 120 ++++++++++ maple-notes.txt | 52 +++++ regs/core_bits.csv | 529 +++++++++++++++++++++--------------------- regs/core_bits.ods | Bin 22216 -> 22187 bytes regs/gen/core_bits.py | 219 +++++++++++++++++ regs/gen/sh7091.py | 3 +- regs/memorymap.ods | Bin 17212 -> 17218 bytes regs/ta_bits.csv | 63 +++++ regs/ta_bits.ods | Bin 18304 -> 18336 bytes ta.h | 4 - vga.cpp | 171 +++++--------- 15 files changed, 1247 insertions(+), 384 deletions(-) create mode 100644 aica.h create mode 100644 holly/core_bits.h create mode 100644 holly/ta_bits.h create mode 100644 maple-notes.txt create mode 100644 regs/gen/core_bits.py create mode 100644 regs/ta_bits.csv diff --git a/.gitignore b/.gitignore index a610673..fbee810 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,6 @@ __pycache__ *.cdi *.o *.out +*.gch scramble cdi4dc diff --git a/addresses.lds b/addresses.lds index e4e20d5..a49809a 100644 --- a/addresses.lds +++ b/addresses.lds @@ -1,8 +1,4 @@ -sh7091_ic_a = 0xf0000000; -sh7091_ic_d = 0xf1000000; -sh7091_oc_a = 0xf4000000; -sh7091_oc_d = 0xf5000000; -sh7091 = 0xff000000; +system_boot_rom = 0xa0000000; system = 0xa05f6800; maple_if = 0xa05f6c00; @@ -12,8 +8,9 @@ g2_if = 0xa05f7800; pvr_if = 0xa05f7c00; holly = 0xa05f8000; modem = 0xa0600000; +aica = 0xa0700000; +aica_rtc = 0xa0710000; -system_boot_rom = 0xa0000000; aica_wave_memory = 0xa0800000; texture_memory = 0xa5000000; system_memory = 0xac000000; @@ -24,3 +21,9 @@ ta_fifo_polygon_converter_mirror = 0x12000000; ta_fifo_yuv_converter_mirror = 0x12800000; ta_fifo_texture_memory_mirror = 0x13000000; store_queue = 0xe0000000; + +sh7091_ic_a = 0xf0000000; +sh7091_ic_d = 0xf1000000; +sh7091_oc_a = 0xf4000000; +sh7091_oc_d = 0xf5000000; +sh7091 = 0xff000000; diff --git a/aica.h b/aica.h new file mode 100644 index 0000000..64b856f --- /dev/null +++ b/aica.h @@ -0,0 +1 @@ +extern reg32 aica[0x8000] __asm("aica"); diff --git a/holly/core_bits.h b/holly/core_bits.h new file mode 100644 index 0000000..f114bd5 --- /dev/null +++ b/holly/core_bits.h @@ -0,0 +1,453 @@ +#include + +#include "float_uint32.h" + +namespace id { + constexpr uint32_t device_id(uint32_t reg) { return (reg >> 16) & 0xffff; } + constexpr uint32_t vendor_id(uint32_t reg) { return (reg >> 0) & 0xffff; } +} + +namespace revision { + constexpr uint32_t chip_revision(uint32_t reg) { return (reg >> 0) & 0xffff; } +} + +namespace softreset { + constexpr uint32_t sdram_if_soft_reset = 1 << 2; + constexpr uint32_t pipeline_soft_reset = 1 << 1; + constexpr uint32_t ta_soft_reset = 1 << 0; +} + +namespace startrender { + constexpr uint32_t start_render = 1 << 0; +} + +namespace test_select { + constexpr uint32_t diagdb_data(uint32_t reg) { return (reg >> 5) & 0x1f; } + constexpr uint32_t diagda_data(uint32_t reg) { return (reg >> 0) & 0x1f; } +} + +namespace param_base { + constexpr uint32_t base_address(uint32_t num) { return (num & 0xf00000) << 0; } +} + +namespace region_base { + constexpr uint32_t base_address(uint32_t num) { return (num & 0xfffffc) << 0; } +} + +namespace span_sort_cfg { + constexpr uint32_t cache_bypass = 1 << 16; + constexpr uint32_t offset_sort_enable = 1 << 8; + constexpr uint32_t span_sort_enable = 1 << 0; +} + +namespace vo_border_col { + constexpr uint32_t chroma(uint32_t num) { return (num & 0x1) << 24; } + constexpr uint32_t red(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t green(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t blue(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fb_r_ctrl { + namespace vclk_div { + constexpr uint32_t pclk_vclk_2 = 0 << 23; + constexpr uint32_t pclk_vclk_1 = 1 << 23; + } + + constexpr uint32_t fb_strip_buf_en = 1 << 22; + constexpr uint32_t fb_stripsize(uint32_t num) { return (num & 0x3e) << 16; } + constexpr uint32_t fb_chroma_threshold(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t fb_concat(uint32_t num) { return (num & 0x3) << 4; } + + namespace fb_depth { + constexpr uint32_t _0555_rgb_16bit = 0 << 2; + constexpr uint32_t _0565_rgb_16bit = 1 << 2; + constexpr uint32_t _888_rgb_24bit_packed = 2 << 2; + constexpr uint32_t _0888_rgb_32bit = 3 << 2; + } + + constexpr uint32_t fb_line_double = 1 << 1; + constexpr uint32_t fb_enable = 1 << 0; +} + +namespace fb_w_ctrl { + constexpr uint32_t fb_alpha_threshold(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t fb_kval(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t fb_dither = 1 << 3; + + namespace fb_packmode { + constexpr uint32_t _0555_krgb_16bit = 0 << 0; + constexpr uint32_t _565_rgb_16bit = 1 << 0; + constexpr uint32_t _4444_argb_16bit = 2 << 0; + constexpr uint32_t _1555_argb_16bit = 3 << 0; + constexpr uint32_t _888_rgb_24bit_packed = 4 << 0; + constexpr uint32_t _0888_krgb_32bit = 5 << 0; + constexpr uint32_t _8888_argb_32bit = 6 << 0; + } +} + +namespace fb_w_linestride { + constexpr uint32_t fb_line_stride(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fb_r_sof1 { + constexpr uint32_t frame_buffer_read_address_frame_1(uint32_t num) { return (num & 0xfffffc) << 0; } +} + +namespace fb_r_sof2 { + constexpr uint32_t frame_buffer_read_address_frame_2(uint32_t num) { return (num & 0xfffffc) << 0; } +} + +namespace fb_r_size { + constexpr uint32_t fb_modulus(uint32_t num) { return (num & 0x3ff) << 20; } + constexpr uint32_t fb_y_size(uint32_t num) { return (num & 0x3ff) << 10; } + constexpr uint32_t fb_x_size(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace fb_w_sof1 { + constexpr uint32_t frame_buffer_write_address_frame_1(uint32_t num) { return (num & 0x1fffffc) << 0; } +} + +namespace fb_w_sof2 { + constexpr uint32_t frame_buffer_write_address_frame_2(uint32_t num) { return (num & 0x1fffffc) << 0; } +} + +namespace fb_x_clip { + constexpr uint32_t fb_x_clip_max(uint32_t num) { return (num & 0x7ff) << 16; } + constexpr uint32_t fb_x_clip_min(uint32_t num) { return (num & 0x7ff) << 0; } +} + +namespace fb_y_clip { + constexpr uint32_t fb_y_clip_max(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t fb_y_clip_min(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace fpu_shad_scale { + namespace simple_shadow_enable { + constexpr uint32_t parameter_selection_volume_mode = 0 << 8; + constexpr uint32_t intensity_volume_mode = 1 << 8; + } + + constexpr uint32_t scale_factor_for_shadows(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fpu_cull_val { + constexpr uint32_t culling_comparison_value(float num) { return _i(__builtin_fabsf(num));; } +} + +namespace fpu_param_cfg { + namespace region_header_type { + constexpr uint32_t type_1 = 0 << 21; + constexpr uint32_t type_2 = 1 << 21; + } + + constexpr uint32_t tsp_parameter_burst_threshold(uint32_t num) { return (num & 0x3f) << 14; } + constexpr uint32_t isp_parameter_burst_threshold(uint32_t num) { return (num & 0x3f) << 8; } + constexpr uint32_t pointer_burst_size(uint32_t num) { return (num & 0xf) << 4; } + constexpr uint32_t pointer_first_burst_size(uint32_t num) { return (num & 0xf) << 0; } +} + +namespace half_offset { + namespace tsp_texel_sampling_position { + constexpr uint32_t top_left(uint32_t reg) { return (reg >> 2) & 0x1; } + constexpr uint32_t center(uint32_t reg) { return (reg >> 2) & 0x1; } + } + + namespace tsp_pixel_sampling_position { + constexpr uint32_t top_left(uint32_t reg) { return (reg >> 1) & 0x1; } + constexpr uint32_t center(uint32_t reg) { return (reg >> 1) & 0x1; } + } + + namespace fpu_pixel_sampling_position { + constexpr uint32_t top_left(uint32_t reg) { return (reg >> 0) & 0x1; } + constexpr uint32_t center(uint32_t reg) { return (reg >> 0) & 0x1; } + } +} + +namespace fpu_perp_val { + constexpr uint32_t perpendicular_triangle_compare(float num) { return _i(__builtin_fabsf(num));; } +} + +namespace isp_backgnd_d { + constexpr uint32_t background_plane_depth(float num) { return _i(num) & 0xfffffff0; } +} + +namespace isp_backgnd_t { + constexpr uint32_t cache_bypass = 1 << 28; + constexpr uint32_t shadow = 1 << 27; + constexpr uint32_t skip(uint32_t num) { return (num & 0x7) << 24; } + constexpr uint32_t tag_address(uint32_t num) { return (num & 0x1fffff) << 3; } + constexpr uint32_t tag_offset(uint32_t num) { return (num & 0x7) << 0; } +} + +namespace isp_feed_cfg { + constexpr uint32_t cache_size_for_translucency(uint32_t num) { return (num & 0x3ff) << 14; } + constexpr uint32_t punch_through_chunk_size(uint32_t num) { return (num & 0x3ff) << 4; } + constexpr uint32_t discard_mode = 1 << 3; + constexpr uint32_t pre_sort_mode = 1 << 0; +} + +namespace sdram_refresh { + constexpr uint32_t refresh_counter_value(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace sdram_arb_cfg { + namespace override_value { + constexpr uint32_t priority_only = 0x0 << 18; + constexpr uint32_t rendered_data = 0x1 << 18; + constexpr uint32_t texture_vq_index = 0x2 << 18; + constexpr uint32_t texture_normal_data_and_vq_codebook = 0x3 << 18; + constexpr uint32_t tile_accelerator_isp_tsp_data = 0x4 << 18; + constexpr uint32_t tile_accelerator_pointers = 0x5 << 18; + constexpr uint32_t sh4 = 0x6 << 18; + constexpr uint32_t tsp_parameters = 0x7 << 18; + constexpr uint32_t tsp_region_data = 0x8 << 18; + constexpr uint32_t isp_pointer_data = 0x9 << 18; + constexpr uint32_t isp_parameters = 0xa << 18; + constexpr uint32_t crt_controller = 0xb << 18; + } + + namespace arbiter_priority_control { + constexpr uint32_t priority_arbitration_only = 0x0 << 16; + constexpr uint32_t override_value_field = 0x1 << 16; + constexpr uint32_t round_robin_counter = 0x2 << 16; + } + + constexpr uint32_t arbiter_crt_page_break_latency_count_value(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t arbiter_page_break_latency_count_value(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace sdram_cfg { + constexpr uint32_t read_command_to_returned_data_delay(uint32_t num) { return (num & 0x7) << 26; } + constexpr uint32_t cas_latency_value(uint32_t num) { return (num & 0x7) << 23; } + constexpr uint32_t activate_to_activate_period(uint32_t num) { return (num & 0x3) << 21; } + constexpr uint32_t read_to_write_period(uint32_t num) { return (num & 0x7) << 18; } + constexpr uint32_t refresh_to_activate_period(uint32_t num) { return (num & 0xf) << 14; } + constexpr uint32_t pre_charge_to_activate_period(uint32_t num) { return (num & 0x3) << 10; } + constexpr uint32_t activate_to_pre_charge_period(uint32_t num) { return (num & 0xf) << 6; } + constexpr uint32_t activate_to_read_write_command_period(uint32_t num) { return (num & 0x3) << 4; } + constexpr uint32_t write_to_pre_charge_period(uint32_t num) { return (num & 0x3) << 2; } + constexpr uint32_t read_to_pre_charge_period(uint32_t num) { return (num & 0x3) << 0; } +} + +namespace fog_col_ram { + constexpr uint32_t red(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t green(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t blue(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fog_col_vert { + constexpr uint32_t red(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t green(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t blue(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fog_density { + constexpr uint32_t fog_scale_mantissa(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t fog_scale_exponent(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fog_clamp_max { + constexpr uint32_t alpha(uint32_t num) { return (num & 0xff) << 24; } + constexpr uint32_t red(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t green(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t blue(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fog_clamp_min { + constexpr uint32_t alpha(uint32_t num) { return (num & 0xff) << 24; } + constexpr uint32_t red(uint32_t num) { return (num & 0xff) << 16; } + constexpr uint32_t green(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t blue(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace spg_trigger_pos { + constexpr uint32_t trigger_v_count(uint32_t reg) { return (reg >> 16) & 0x3ff; } + constexpr uint32_t trigger_h_count(uint32_t reg) { return (reg >> 0) & 0x3ff; } +} + +namespace spg_hblank_int { + constexpr uint32_t hblank_in_interrupt(uint32_t reg) { return (reg >> 16) & 0x3ff; } + + namespace hblank_int_mode { + constexpr uint32_t output_equal_line_comp_val = 0x0 << 12; + constexpr uint32_t output_every_line_comp_val = 0x1 << 12; + constexpr uint32_t output_every_line = 0x2 << 12; + } + + constexpr uint32_t line_comp_val(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace spg_vblank_int { + constexpr uint32_t vblank_out_interrupt_line_number(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t vblank_in_interrupt_line_number(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace spg_control { + namespace csync_on_h { + constexpr uint32_t hsync = 0 << 9; + constexpr uint32_t csync = 1 << 9; + } + + namespace sync_direction { + constexpr uint32_t input = 0 << 8; + constexpr uint32_t output = 1 << 8; + } + + constexpr uint32_t pal = 1 << 7; + constexpr uint32_t ntsc = 1 << 6; + constexpr uint32_t force_field2 = 1 << 5; + constexpr uint32_t interlace = 1 << 4; + constexpr uint32_t spg_lock = 1 << 3; + + namespace mcsync_pol { + constexpr uint32_t active_low = 0 << 2; + constexpr uint32_t active_high = 1 << 2; + } + + namespace mvsync_pol { + constexpr uint32_t active_low = 0 << 1; + constexpr uint32_t active_high = 1 << 1; + } + + namespace mhsync_pol { + constexpr uint32_t active_low = 0 << 0; + constexpr uint32_t active_high = 1 << 0; + } +} + +namespace spg_hblank { + constexpr uint32_t hbend(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t hbstart(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace spg_load { + constexpr uint32_t vcount(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t hcount(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace spg_vblank { + constexpr uint32_t vbend(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t vbstart(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace spg_width { + constexpr uint32_t eqwidth(uint32_t num) { return (num & 0x3ff) << 22; } + constexpr uint32_t bpwidth(uint32_t num) { return (num & 0x3ff) << 12; } + constexpr uint32_t vswidth(uint32_t num) { return (num & 0xf) << 8; } + constexpr uint32_t hswidth(uint32_t num) { return (num & 0x7f) << 0; } +} + +namespace text_control { + namespace code_book_endian { + constexpr uint32_t little_endian = 0 << 17; + constexpr uint32_t big_endian = 1 << 17; + } + + namespace index_endian { + constexpr uint32_t little_endian = 0 << 16; + constexpr uint32_t big_endian = 1 << 16; + } + + constexpr uint32_t bank_bit(uint32_t num) { return (num & 0x1f) << 8; } + constexpr uint32_t stride(uint32_t num) { return (num & 0x1f) << 0; } +} + +namespace vo_control { + constexpr uint32_t pclk_delay_reset = 1 << 21; + constexpr uint32_t pclk_delay(uint32_t num) { return (num & 0xf) << 16; } + constexpr uint32_t pixel_double = 1 << 8; + + namespace field_mode { + constexpr uint32_t use_field_flag_from_spg = 0x0 << 4; + constexpr uint32_t use_inverse_of_field_flag_from_spg = 0x1 << 4; + constexpr uint32_t field_1_fixed = 0x2 << 4; + constexpr uint32_t field_2_fixed = 0x3 << 4; + constexpr uint32_t field_1_when_the_active_edges_of_hsync_and_vsync_match = 0x4 << 4; + constexpr uint32_t field_2_when_the_active_edges_of_hsync_and_vsync_match = 0x5 << 4; + constexpr uint32_t field_1_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge = 0x6 << 4; + constexpr uint32_t field_2_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge = 0x7 << 4; + constexpr uint32_t inverted_at_the_active_edge_of_vsync = 0x8 << 4; + } + + constexpr uint32_t blank_video = 1 << 3; + + namespace blank_pol { + constexpr uint32_t active_low = 0 << 2; + constexpr uint32_t active_high = 1 << 2; + } + + namespace vsync_pol { + constexpr uint32_t active_low = 0 << 1; + constexpr uint32_t active_high = 1 << 1; + } + + namespace hsync_pol { + constexpr uint32_t active_low = 0 << 0; + constexpr uint32_t active_high = 1 << 0; + } +} + +namespace vo_startx { + constexpr uint32_t horizontal_start_position(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace vo_starty { + constexpr uint32_t vertical_start_position_on_field_2(uint32_t num) { return (num & 0x3ff) << 16; } + constexpr uint32_t vertical_start_position_on_field_1(uint32_t num) { return (num & 0x3ff) << 0; } +} + +namespace scaler_ctl { + namespace field_select { + constexpr uint32_t field_1 = 0 << 18; + constexpr uint32_t field_2 = 1 << 18; + } + + constexpr uint32_t interlace = 1 << 17; + constexpr uint32_t horizontal_scaling_enable = 1 << 16; + constexpr uint32_t vertical_scale_factor(uint32_t num) { return (num & 0xffff) << 0; } +} + +namespace pal_ram_ctl { + namespace pixel_format { + constexpr uint32_t argb1555 = 0 << 0; + constexpr uint32_t rgb565 = 1 << 0; + constexpr uint32_t argb4444 = 2 << 0; + constexpr uint32_t argb8888 = 3 << 0; + } +} + +namespace spg_status { + constexpr uint32_t vsync(uint32_t reg) { return (reg >> 13) & 0x1; } + constexpr uint32_t hsync(uint32_t reg) { return (reg >> 12) & 0x1; } + constexpr uint32_t blank(uint32_t reg) { return (reg >> 11) & 0x1; } + constexpr uint32_t fieldnum(uint32_t reg) { return (reg >> 10) & 0x1; } + constexpr uint32_t scanline(uint32_t reg) { return (reg >> 0) & 0x3ff; } +} + +namespace fb_burstctrl { + constexpr uint32_t wr_burst(uint32_t num) { return (num & 0xf) << 16; } + constexpr uint32_t vid_lat(uint32_t num) { return (num & 0x7f) << 8; } + constexpr uint32_t vid_burst(uint32_t num) { return (num & 0x3f) << 0; } +} + +namespace fb_c_sof { + constexpr uint32_t frame_buffer_current_read_address(uint32_t reg) { return (reg >> 0) & 0xffffff; } +} + +namespace y_coeff { + constexpr uint32_t coefficient_1(uint32_t num) { return (num & 0xff) << 8; } + constexpr uint32_t coefficient_0_2(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace pt_alpha_ref { + constexpr uint32_t alpha_reference_for_punch_through(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace fog_table { + constexpr uint32_t fog_table_data(uint32_t num) { return (num & 0xffff) << 0; } +} + +namespace palette_ram { + constexpr uint32_t palette_data(uint32_t num) { return (num & 0xffffffff) << 0; } +} + diff --git a/holly/ta_bits.h b/holly/ta_bits.h new file mode 100644 index 0000000..04b2917 --- /dev/null +++ b/holly/ta_bits.h @@ -0,0 +1,120 @@ +#include + +#include "float_uint32.h" + +namespace ta_ol_base { + constexpr uint32_t base_address(uint32_t num) { return (num & 0xffffe0) << 0; } +} + +namespace ta_isp_base { + constexpr uint32_t base_address(uint32_t num) { return (num & 0xfffffc) << 0; } +} + +namespace ta_ol_limit { + constexpr uint32_t limit_address(uint32_t num) { return (num & 0xffffe0) << 0; } +} + +namespace ta_isp_limit { + constexpr uint32_t limit_address(uint32_t num) { return (num & 0xfffffc) << 0; } +} + +namespace ta_next_opb { + constexpr uint32_t address(uint32_t num) { return (num & 0xffffe0) << 0; } +} + +namespace ta_itp_current { + constexpr uint32_t address(uint32_t reg) { return (reg >> 0) & 0xffffff; } +} + +namespace ta_glob_tile_clip { + constexpr uint32_t tile_y_num(uint32_t num) { return (num & 0xf) << 16; } + constexpr uint32_t tile_x_num(uint32_t num) { return (num & 0x1f) << 0; } +} + +namespace ta_alloc_ctrl { + namespace opb_mode { + constexpr uint32_t decreasing_addresses = 0 << 20; + constexpr uint32_t increasing_addresses = 1 << 20; + } + + namespace pt_opb { + constexpr uint32_t no_list = 0 << 16; + constexpr uint32_t _8x4byte = 1 << 16; + constexpr uint32_t _16x4byte = 2 << 16; + constexpr uint32_t _32x4byte = 3 << 16; + } + + namespace tm_opb { + constexpr uint32_t no_list = 0 << 12; + constexpr uint32_t _8x4byte = 1 << 12; + constexpr uint32_t _16x4byte = 2 << 12; + constexpr uint32_t _32x4byte = 3 << 12; + } + + namespace t_opb { + constexpr uint32_t no_list = 0 << 8; + constexpr uint32_t _8x4byte = 1 << 8; + constexpr uint32_t _16x4byte = 2 << 8; + constexpr uint32_t _32x4byte = 3 << 8; + } + + namespace om_opb { + constexpr uint32_t no_list = 0 << 4; + constexpr uint32_t _8x4byte = 1 << 4; + constexpr uint32_t _16x4byte = 2 << 4; + constexpr uint32_t _32x4byte = 3 << 4; + } + + namespace o_opb { + constexpr uint32_t no_list = 0 << 0; + constexpr uint32_t _8x4byte = 1 << 0; + constexpr uint32_t _16x4byte = 2 << 0; + constexpr uint32_t _32x4byte = 3 << 0; + } +} + +namespace ta_list_init { + constexpr uint32_t list_init = 1 << 31; +} + +namespace ta_yuv_tex_base { + constexpr uint32_t base_address(uint32_t num) { return (num & 0xfffff8) << 0; } +} + +namespace ta_yuv_tex_ctrl { + namespace yuv_form { + constexpr uint32_t yuv420 = 0 << 24; + constexpr uint32_t yuv422 = 1 << 24; + } + + namespace yuv_tex { + constexpr uint32_t one_texture = 0 << 16; + constexpr uint32_t multiple_textures = 1 << 16; + } + + constexpr uint32_t yuv_v_size(uint32_t num) { return (num & 0x3f) << 8; } + constexpr uint32_t yuv_u_size(uint32_t num) { return (num & 0x3f) << 0; } +} + +namespace ta_yuv_tex_cnt { + constexpr uint32_t yuv_num(uint32_t reg) { return (reg >> 0) & 0x1fff; } +} + +namespace ta_list_cont { + constexpr uint32_t list_cont = 1 << 31; +} + +namespace ta_next_opb_init { + constexpr uint32_t address(uint32_t num) { return (num & 0xffffe0) << 0; } +} + +namespace ta_ol_pointers { + constexpr uint32_t entry(uint32_t reg) { return (reg >> 31) & 0x1; } + constexpr uint32_t sprite(uint32_t reg) { return (reg >> 30) & 0x1; } + constexpr uint32_t triangle(uint32_t reg) { return (reg >> 29) & 0x1; } + constexpr uint32_t number_of_triangles_quads(uint32_t reg) { return (reg >> 25) & 0xf; } + constexpr uint32_t shadow(uint32_t reg) { return (reg >> 24) & 0x1; } + constexpr uint32_t pointer_address(uint32_t reg) { return (reg >> 2) & 0x3fffff; } + constexpr uint32_t skip(uint32_t reg) { return (reg >> 0) & 0x3; } +} + diff --git a/maple-notes.txt b/maple-notes.txt new file mode 100644 index 0000000..debb191 --- /dev/null +++ b/maple-notes.txt @@ -0,0 +1,52 @@ +KAEDE/Mpglobal.h +KAEDE/MPDRV_.C +KAEDE/MPAPI_.C + +MAPLE82E.pdf Chapter 6 "COMMAND REFERENCE" + +jargon: + +AP - Absolute Position ; MAPLE82E.pdf page 13 + +(Address) (Data) +0x0C700000 → 0x00000000 Port 0, 4-byte data transmission (instruction to Maple-Host) +0x0C700004 → 0x0C800000 Port 0, reception data storage address (instruction to Maple-Host) +0x0C700008 → 0x01200000 [Device Request], transfer destination AP: 0x20, transfer source AP: 0x00 +0x0C70000C → 0x00010000 Port 1, 4-byte data transmission +0x0C700010 → 0x0C800100 Port 1, reception data storage address +0x0C700014 → 0x01604000 [Device Request], transfer destination AP: 0x60, transfer source AP: 0x40 +0x0C700018 → 0x00020000 Port 2, 4-byte data transmission +0x0C70001C → 0x0C800200 Port 2, reception data storage address +0x0C700020 → 0x01A08000 [Device Request], transfer destination AP: 0xA0, transfer source AP: 0x80 +0x0C700024 → 0x80030000 Port 3, 4-byte data transmission +0x0C700028 → 0x0C800300 Port 3, reception data storage address +0x0C70002C → 0x01E0C000 [Device Request], transfer destination AP: 0xE0, transfer source AP: 0xC0 + +--- + +(Specified reception data storage address: 0x0C800000) +0x0C800000 → 0x0500201C [Device Status], transfer destination AP:00, transfer source AP:20 +0x0C800004 → 0x00000001 112 bytes of fixed data follows � � +0x0C800070 → 0x00000000 +0x0C800000 → 0xFFFFFFFF No connection +0x0C800000 → 0xFFFFFF00 Reception data error + +---- + +(Address) (Data) +0x0C700000 → 0x00000001 Port 0, 8-byte data transmission (instruction to Maple-Host) +0x0C700004 → 0x0C800000 Port 0, reception data storage address (instruction to Maple-Host) +0x0C700008 → 0x09200001 [Get Condition], transfer destination AP: 0x20, transfer source AP: 0x00 +0x0C70000C → 0x00000001 Function type +0x0C700010 → 0x00010001 Port 2, 8-byte data transmission +0x0C700014 → 0x0C800100 Port1, reception data storage address +0x0C700018 → 0x09604001 [Get Condition], transfer destination AP:0x60, transfer source AP:0x40 +0x0C70001C → 0x00000001 Function Type +0x0C700020 → 0x00020001 Port 2, 8-byte data transmission +0x0C700024 → 0x0C800200 Port 2, reception data storage address +0x0C700028 → 0x09A08001 [Get Condition], transfer destination AP: 0x80, transfer source AP: 0xA0 +0x0C70002C → 0x00000001 Function type +0x0C700030 → 0x80030001 command list end Port 3, 8-byte data transmission, +0x0C700034 → 0x0C800300 Port 3, reception data storage address +0x0C700038 → 0x09E0C001 [Get Condition], transfer destination AP: 0xC0, transfer source AP: 0xE0 +0x0C70003C → 0x00000001 Function Type diff --git a/regs/core_bits.csv b/regs/core_bits.csv index aafec82..d70f83b 100644 --- a/regs/core_bits.csv +++ b/regs/core_bits.csv @@ -1,265 +1,264 @@ -"register_name","enum_name","bits","bit_name","value","mask","description" -"ID",,"31-16","device_id",,, -"ID",,"15-0","vendor_id",,, -,,,,,, -"REVISION",,"15-0","chip_revision",,, -,,,,,, -"SOFTRESET",,2,"sdram_if_soft_reset",1,, -"SOFTRESET",,1,"pipeline_soft_reset",1,, -"SOFTRESET",,0,"ta_soft_reset",1,, -,,,,,, -"STARTRENDER",,0,"start_render",1,, -,,,,,, -"TEST_SELECT",,"9-5","diagdb_data",,, -"TEST_SELECT",,"4-0","diagda_data",,, -,,,,,, -"PARAM_BASE",,"23-0","base_address",,"0xf00000", -,,,,,, -"REGION_BASE",,"23-0","base_address",,"0xfffffc", -,,,,,, -"SPAN_SORT_CFG",,16,"cache_bypass",1,, -"SPAN_SORT_CFG",,8,"offset_sort_enable",1,, -"SPAN_SORT_CFG",,0,"span_sort_enable",1,, -,,,,,, -"VO_BORDER_COL",,24,"chroma",,"0b1", -"VO_BORDER_COL",,"23-16","red",,"0xff", -"VO_BORDER_COL",,"15-8","green",,"0xff", -"VO_BORDER_COL",,"7-0","blue",,"0xff", -,,,,,, -"FB_R_CTRL","vclk_div",23,"pclk_vclk_2",0,, -"FB_R_CTRL","vclk_div",23,"pclk_vclk_1",1,, -"FB_R_CTRL",,22,"fb_strip_buf_en",1,, -"FB_R_CTRL",,"21-16","fb_stripsize",,"0b111_110","In units of 16 lines, in multiples of 32 lines. 0x02 is 32 lines, 0x04 is 64 lines, 0x03 is an illegal value" -"FB_R_CTRL",,"15-8","fb_chroma_threshold",,"0xff", -"FB_R_CTRL",,"6-4","fb_concat",,"0b11", -"FB_R_CTRL","fb_depth","3-2","0555_RGB_16BIT",0,, -"FB_R_CTRL","fb_depth","3-2","0565_RGB_16BIT",1,, -"FB_R_CTRL","fb_depth","3-2","888_RGB_24BIT_PACKED",2,, -"FB_R_CTRL","fb_depth","3-2","0888_RGB_32BIT",3,, -"FB_R_CTRL",,1,"fb_line_double",1,, -"FB_R_CTRL",,0,"fb_enable",1,, -,,,,,, -"FB_W_CTRL",,"23-16","fb_alpha_threshold",,"0xff", -"FB_W_CTRL",,"15-8","fb_kval",,"0xff", -"FB_W_CTRL",,3,"fb_dither",1,, -"FB_W_CTRL","fb_packmode","2-0","0555_krgb_16bit",0,, -"FB_W_CTRL","fb_packmode","2-0","565_rgb_16bit",1,, -"FB_W_CTRL","fb_packmode","2-0","4444_argb_16bit",2,, -"FB_W_CTRL","fb_packmode","2-0","1555_argb_16bit",3,, -"FB_W_CTRL","fb_packmode","2-0","888_rgb_24bit_packed",4,, -"FB_W_CTRL","fb_packmode","2-0","0888_krgb_32bit",5,, -"FB_W_CTRL","fb_packmode","2-0","8888_argb_32bit",6,, -,,,,,, -"FB_W_LINESTRIDE",,"8-0","fb_line_stride",,"0xff","In 8-byte units" -,,,,,, -"FB_R_SOF1",,"23-0","frame_buffer_read_address_frame_1",,"0xfffffc", -,,,,,, -"FB_R_SOF2",,"23-0","frame_buffer_read_address_frame_2",,"0xfffffc", -,,,,,, -"FB_R_SIZE",,"29-20","fb_modulus",,"0x3ff","In 4-byte units" -"FB_R_SIZE",,"19-10","fb_y_size",,"0x3ff", -"FB_R_SIZE",,"9-0","fb_x_size",,"0x3ff", -,,,,,, -"FB_W_SOF1",,"24-0","frame_buffer_write_address_frame_1",,"0x1fffffc", -,,,,,, -"FB_W_SOF2",,"24-0","frame_buffer_write_address_frame_2",,"0x1fffffc", -,,,,,, -"FB_X_CLIP",,"26-16","fb_x_clip_max",,"0x7ff", -"FB_X_CLIP",,"10-0","fb_x_clip_min",,"0x7ff", -,,,,,, -"FB_Y_CLIP",,"25-16","fb_y_clip_max",,"0x3ff", -"FB_Y_CLIP",,"9-0","fb_y_clip_min",,"0x3ff", -,,,,,, -"FPU_SHAD_SCALE","simple_shadow_enable",8,"parameter_selection_volume_mode",0,, -"FPU_SHAD_SCALE","simple_shadow_enable",8,"intensity_volume_mode",1,, -"FPU_SHAD_SCALE",,"7-0","scale_factor_for_shadows",,"0xff", -,,,,,, -"FPU_CULL_VAL",,"30-0","culling_comparison_value",,"float_0_8_23", -,,,,,, -"FPU_PARAM_CFG","region_header_type",21,"type_1",0,, -"FPU_PARAM_CFG","region_header_type",21,"type_2",1,, -"FPU_PARAM_CFG",,"19-14","tsp_parameter_burst_threshold",,"0x3f", -"FPU_PARAM_CFG",,"13-8","isp_parameter_burst_threshold",,"0x3f", -"FPU_PARAM_CFG",,"7-4","pointer_burst_size",,"0xf", -"FPU_PARAM_CFG",,"3-0","pointer_first_burst_size",,"0xf", -,,,,,, -"HALF_OFFSET","tsp_texel_sampling_position",2,"top_left",,, -"HALF_OFFSET","tsp_texel_sampling_position",2,"center",,, -"HALF_OFFSET","tsp_pixel_sampling_position",1,"top_left",,, -"HALF_OFFSET","tsp_pixel_sampling_position",1,"center",,, -"HALF_OFFSET","fpu_pixel_sampling_position",0,"top_left",,, -"HALF_OFFSET","fpu_pixel_sampling_position",0,"center",,, -,,,,,, -"FPU_PERP_VAL",,"30-0","perpendicular_triangle_compare",,"float_0_8_23", -,,,,,, -"ISP_BACKGND_D",,"31-4","background_plane_depth",,"float_1_8_19", -,,,,,, -"ISP_BACKGND_T",,28,"cache_bypass",1,, -"ISP_BACKGND_T",,27,"shadow",1,, -"ISP_BACKGND_T",,"26-24","skip",,"0b111", -"ISP_BACKGND_T",,"23-3","tag_address",,"0x1fffff","In 32-bit units" -"ISP_BACKGND_T",,"2-0","tag_offset",,"0b111", -,,,,,, -"ISP_FEED_CFG",,"23-14","cache_size_for_translucency",,"0x3ff","Must be between 0x020 and 0x200" -"ISP_FEED_CFG",,"13-4","punch_through_chunk_size",,"0x3ff","Must be between 0x020 and 0x200, must be larger than cache_size_for_translucency" -"ISP_FEED_CFG",,3,"discard_mode",1,, -"ISP_FEED_CFG",,0,"pre_sort_mode",1,, -,,,,,, -"SDRAM_REFRESH",,"7-0","refresh_counter_value",,"0xff", -,,,,,, -"SDRAM_ARB_CFG","override_value","21-18","priority_only","0x0",, -"SDRAM_ARB_CFG","override_value","21-18","rendered_data","0x1",, -"SDRAM_ARB_CFG","override_value","21-18","texture_vq_index","0x2",, -"SDRAM_ARB_CFG","override_value","21-18","texture_normal_data_and_vq_codebook","0x3",, -"SDRAM_ARB_CFG","override_value","21-18","tile_accelerator_isp_tsp_data","0x4",, -"SDRAM_ARB_CFG","override_value","21-18","tile_accelerator_pointers","0x5",, -"SDRAM_ARB_CFG","override_value","21-18","sh4","0x6",, -"SDRAM_ARB_CFG","override_value","21-18","tsp_parameters","0x7",, -"SDRAM_ARB_CFG","override_value","21-18","tsp_region_data","0x8",, -"SDRAM_ARB_CFG","override_value","21-18","isp_pointer_data","0x9",, -"SDRAM_ARB_CFG","override_value","21-18","isp_parameters","0xa",, -"SDRAM_ARB_CFG","override_value","21-18","crt_controller","0xb",, -"SDRAM_ARB_CFG","arbiter_priority_control","17-16","priority_arbitration_only","0x0",, -"SDRAM_ARB_CFG","arbiter_priority_control","17-16","override_value_field","0x1",, -"SDRAM_ARB_CFG","arbiter_priority_control","17-16","round_robin_counter","0x2",, -"SDRAM_ARB_CFG",,"15-8","arbiter_crt_page_break_latency_count_value",,"0xff", -"SDRAM_ARB_CFG",,"7-0","arbiter_page_break_latency_count_value",,"0xff", -,,,,,, -"SDRAM_CFG",,"28-26","read_command_to_returned_data_delay",,"0b111", -"SDRAM_CFG",,"25-23","cas_latency_value",,"0b111", -"SDRAM_CFG",,"22-21","activate_to_activate_period",,"0b11", -"SDRAM_CFG",,"20-18","read_to_write_period",,"0b111", -"SDRAM_CFG",,"17-14","refresh_to_activate_period",,"0b1111", -"SDRAM_CFG",,"11-10","pre_charge_to_activate_period",,"0b11", -"SDRAM_CFG",,"9-6","activate_to_pre_charge_period",,"0b1111", -"SDRAM_CFG",,"5-4","activate_to_read_write_command_period",,"0b11", -"SDRAM_CFG",,"3-2","write_to_pre_charge_period",,"0b11", -"SDRAM_CFG",,"1-0","read_to_pre_charge_period",,"0b11", -,,,,,, -"FOG_COL_RAM",,"23-16","red",,"0xff", -"FOG_COL_RAM",,"15-8","green",,"0xff", -"FOG_COL_RAM",,"7-0","blue",,"0xff", -,,,,,, -"FOG_COL_VERT",,"23-16","red",,"0xff", -"FOG_COL_VERT",,"15-8","green",,"0xff", -"FOG_COL_VERT",,"7-0","blue",,"0xff", -,,,,,, -"FOG_DENSITY",,"15-8","fog_scale_mantissa",,"0xff", -"FOG_DENSITY",,"7-0","fog_scale_exponent",,"0xff", -,,,,,, -"FOG_CLAMP_MAX",,"31-24","alpha",,"0xff", -"FOG_CLAMP_MAX",,"23-16","red",,"0xff", -"FOG_CLAMP_MAX",,"15-8","green",,"0xff", -"FOG_CLAMP_MAX",,"7-0","blue",,"0xff", -,,,,,, -"FOG_CLAMP_MIN",,"31-24","alpha",,"0xff", -"FOG_CLAMP_MIN",,"23-16","red",,"0xff", -"FOG_CLAMP_MIN",,"15-8","green",,"0xff", -"FOG_CLAMP_MIN",,"7-0","blue",,"0xff", -,,,,,, -"SPG_TRIGGER_POS",,"25-16","trigger_v_count",,, -"SPG_TRIGGER_POS",,"9-0","trigger_h_count",,, -,,,,,, -"SPG_HBLANK_INT",,"25-16","hblank_in_interrupt",,, -"SPG_HBLANK_INT","hblank_int_mode","13-12","output_equal_line_comp_val","0x0",, -"SPG_HBLANK_INT","hblank_int_mode","13-12","output_every_line_comp_val","0x1",, -"SPG_HBLANK_INT","hblank_int_mode","13-12","output_every_line","0x2",, -"SPG_HBLANK_INT",,"9-0","line_comp_val",,"0x3ff", -,,,,,, -"SPG_VBLANK_INT",,"25-16","vblank_out_interrupt_line_number",,"0x3ff", -"SPG_VBLANK_INT",,"9-0","vblank_in_interrupt_line_number",,"0x3ff", -,,,,,, -"SPG_CONTROL","csync_on_h",9,"hsync",0,, -"SPG_CONTROL","cysnc_on_h",9,"csync",1,, -"SPG_CONTROL","sync_direction",8,"input",0,, -"SPG_CONTROL","sync_direction",8,"output",1,, -"SPG_CONTROL",,7,"pal",1,, -"SPG_CONTROL",,6,"ntsc",1,, -"SPG_CONTROL",,5,"force_field2",1,, -"SPG_CONTROL",,4,"interlace",1,, -"SPG_CONTROL",,3,"spg_lock",1,, -"SPG_CONTROL","mcsync_pol",2,"active_low",0,, -"SPG_CONTROL","mcsync_pol",2,"active_high",1,, -"SPG_CONTROL","mvsync_pol",1,"active_low",0,, -"SPG_CONTROL","mvsync_pol",1,"active_high",1,, -"SPG_CONTROL","mhsync_pol",0,"active_low",0,, -"SPG_CONTROL","mhsync_pol",0,"active_high",1,, -,,,,,, -"SPG_HBLANK",,"25-16","hbend",,"0x3ff", -"SPG_HBLANK",,"9-0","hbstart",,"0x3ff", -,,,,,, -"SPG_LOAD",,"25-16","vcount",,"0x3ff", -"SPG_LOAD",,"9-0","hcount",,"0x3ff", -,,,,,, -"SPG_VBLANK",,"25-16","vbend",,"0x3ff", -"SPG_VBLANK",,"9-0","vbstart",,"0x3ff", -,,,,,, -"SPG_WIDTH",,"31-22","eqwidth",,"0x3ff", -"SPG_WIDTH",,"21-12","bpwidth",,"0x3ff", -"SPG_WIDTH",,"11-8","vswidth",,"0b1111", -"SPG_WIDTH",,"6-0","hswidth",,"0x7f", -,,,,,, -"TEXT_CONTROL","code_book_endian",17,"little_endian",0,, -"TEXT_CONTROL","code_book_endian",17,"big_endian",1,, -"TEXT_CONTROL","index_endian",16,"little_endian",0,, -"TEXT_CONTROL","index_endian",16,"big_endian",1,, -"TEXT_CONTROL",,"12-8","bank_bit",,"0x1f", -"TEXT_CONTROL",,"4-0","stride",,"0x1f", -,,,,,, -"VO_CONTROL",,21,"pclk_delay_reset",1,, -"VO_CONTROL",,"20-16","pclk_delay",,"0b1111", -"VO_CONTROL",,8,"pixel_double",1,, -"VO_CONTROL","field_mode","7-4","use_field_flag_from_spg","0x0",, -"VO_CONTROL","field_mode","7-4","use_inverse_of_field_flag_from_spg","0x1",, -"VO_CONTROL","field_mode","7-4","field_1_fixed","0x2",, -"VO_CONTROL","field_mode","7-4","field_2_fixed","0x3",, -"VO_CONTROL","field_mode","7-4","field_1_when_the_active_edges_of_hsync_and_vsync_match","0x4",, -"VO_CONTROL","field_mode","7-4","field_2_when_the_active_edges_of_hsync_and_vsync_match","0x5",, -"VO_CONTROL","field_mode","7-4","field_1_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge","0x6",, -"VO_CONTROL","field_mode","7-4","field_2_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge","0x7",, -"VO_CONTROL","field_mode","7-4","inverted_at_the_active_edge_of_vsync","0x8",, -"VO_CONTROL","blank_video",3,"display_the_screen",0,, -"VO_CONTROL","blank_video",3,"do_not_display_the_screen",1,, -"VO_CONTROL","blank_pol",2,"active_low",0,, -"VO_CONTROL","blank_pol",2,"active_high",1,, -"VO_CONTROL","vsync_pol",1,"active_low",0,, -"VO_CONTROL","vsync_pol",1,"active_high",1,, -"VO_CONTROL","hsync_pol",0,"active_low",0,, -"VO_CONTROL","hsync_pol",0,"active_high",1,, -,,,,,, -"VO_STARTX",,"9-0","horizontal_start_position",,"0x3ff", -,,,,,, -"VO_STARTY",,"25-16","vertical_start_position_on_field_2",,"0x3ff", -"VO_STARTY",,"9-0","vertical_start_position_on_field_1",,"0x3ff", -,,,,,, -"SCALER_CTL","field_select",18,"field_1",0,, -"SCALER_CTL","field_select",18,"field_2",1,, -"SCALER_CTL",,17,"interlace",1,, -"SCALER_CTL",,16,"horizontal_scaling_enable",1,, -"SCALER_CTL",,"15-0","vertical_scale_factor",,"0xffff", -,,,,,, -"PAL_RAM_CTL","pixel_format","1-0","argb1555",0,, -"PAL_RAM_CTL","pixel_format","1-0","rgb565",1,, -"PAL_RAM_CTL","pixel_format","1-0","argb4444",2,, -"PAL_RAM_CTL","pixel_format","1-0","argb8888",3,, -,,,,,, -"SPG_STATUS",,13,"vsync",,, -"SPG_STATUS",,12,"hsync",,, -"SPG_STATUS",,11,"blank",,, -"SPG_STATUS",,10,"fieldnum",,, -"SPG_STATUS",,"9-0","scanline",,, -,,,,,, -"FB_BURSTCTRL",,"19-16","wr_burst",,"0b1111", -"FB_BURSTCTRL",,"14-8","vid_lat",,"0x7f", -"FB_BURSTCTRL",,"5-0","vid_burst",,"0x3f", -,,,,,, -"FB_C_SOF",,"23-2","frame_buffer_current_read_address",,, -,,,,,, -"Y_COEFF",,"15-8","coefficient_1",,"0xff", -"Y_COEFF",,"7-0","coefficient_0_2",,"0xff", -,,,,,, -"PT_ALPHA_REF",,"7-0","alpha_reference_for_punch_through",,"0xff", -,,,,,, -"FOG_TABLE",,"15-0","fog_table_data",,"0xffff", -,,,,,, -"PALETTE_RAM",,"31-0","palette_data",,"0xffff_ffff", +"register_name","enum_name","bits","bit_name","value","mask","description",,,,, +"ID",,"31-16","device_id",,,,,,,, +"ID",,"15-0","vendor_id",,,,,,,, +,,,,,,,,,,, +"REVISION",,"15-0","chip_revision",,,,,,,, +,,,,,,,,,,, +"SOFTRESET",,2,"sdram_if_soft_reset",1,,,,,,, +"SOFTRESET",,1,"pipeline_soft_reset",1,,,,,,, +"SOFTRESET",,0,"ta_soft_reset",1,,,,,,, +,,,,,,,,,,, +"STARTRENDER",,0,"start_render",1,,,,,,, +,,,,,,,,,,, +"TEST_SELECT",,"9-5","diagdb_data",,,,,,,, +"TEST_SELECT",,"4-0","diagda_data",,,,,,,, +,,,,,,,,,,, +"PARAM_BASE",,"23-0","base_address",,"0xf00000",,,,,, +,,,,,,,,,,, +"REGION_BASE",,"23-0","base_address",,"0xfffffc",,,,,, +,,,,,,,,,,, +"SPAN_SORT_CFG",,16,"cache_bypass",1,,,,,,, +"SPAN_SORT_CFG",,8,"offset_sort_enable",1,,,,,,, +"SPAN_SORT_CFG",,0,"span_sort_enable",1,,,,,,, +,,,,,,,,,,, +"VO_BORDER_COL",,24,"chroma",,"0b1",,,,,, +"VO_BORDER_COL",,"23-16","red",,"0xff",,,,,, +"VO_BORDER_COL",,"15-8","green",,"0xff",,,,,, +"VO_BORDER_COL",,"7-0","blue",,"0xff",,,,,, +,,,,,,,,,,, +"FB_R_CTRL","vclk_div",23,"pclk_vclk_2",0,,,,,,, +"FB_R_CTRL","vclk_div",23,"pclk_vclk_1",1,,,,,,, +"FB_R_CTRL",,22,"fb_strip_buf_en",1,,,,,,, +"FB_R_CTRL",,"21-16","fb_stripsize",,"0b111_110","In units of 16 lines, in multiples of 32 lines. 0x02 is 32 lines, 0x04 is 64 lines, 0x03 is an illegal value",,,,, +"FB_R_CTRL",,"15-8","fb_chroma_threshold",,"0xff",,,,,, +"FB_R_CTRL",,"6-4","fb_concat",,"0b11",,,,,, +"FB_R_CTRL","fb_depth","3-2","_0555_rgb_16bit",0,,,,,,, +"FB_R_CTRL","fb_depth","3-2","_0565_rgb_16bit",1,,,,,,, +"FB_R_CTRL","fb_depth","3-2","_888_rgb_24bit_packed",2,,,,,,, +"FB_R_CTRL","fb_depth","3-2","_0888_rgb_32bit",3,,,,,,, +"FB_R_CTRL",,1,"fb_line_double",1,,,,,,, +"FB_R_CTRL",,0,"fb_enable",1,,,,,,, +,,,,,,,,,,, +"FB_W_CTRL",,"23-16","fb_alpha_threshold",,"0xff",,,,,, +"FB_W_CTRL",,"15-8","fb_kval",,"0xff",,,,,, +"FB_W_CTRL",,3,"fb_dither",1,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_0555_krgb_16bit",0,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_565_rgb_16bit",1,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_4444_argb_16bit",2,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_1555_argb_16bit",3,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_888_rgb_24bit_packed",4,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_0888_krgb_32bit",5,,,,,,, +"FB_W_CTRL","fb_packmode","2-0","_8888_argb_32bit",6,,,,,,, +,,,,,,,,,,, +"FB_W_LINESTRIDE",,"8-0","fb_line_stride",,"0xff","In 8-byte units",,,,, +,,,,,,,,,,, +"FB_R_SOF1",,"23-0","frame_buffer_read_address_frame_1",,"0xfffffc",,,,,, +,,,,,,,,,,, +"FB_R_SOF2",,"23-0","frame_buffer_read_address_frame_2",,"0xfffffc",,,,,, +,,,,,,,,,,, +"FB_R_SIZE",,"29-20","fb_modulus",,"0x3ff","In 4-byte units",,,,, +"FB_R_SIZE",,"19-10","fb_y_size",,"0x3ff",,,,,, +"FB_R_SIZE",,"9-0","fb_x_size",,"0x3ff",,,,,, +,,,,,,,,,,, +"FB_W_SOF1",,"24-0","frame_buffer_write_address_frame_1",,"0x1fffffc",,,,,, +,,,,,,,,,,, +"FB_W_SOF2",,"24-0","frame_buffer_write_address_frame_2",,"0x1fffffc",,,,,, +,,,,,,,,,,, +"FB_X_CLIP",,"26-16","fb_x_clip_max",,"0x7ff",,,,,, +"FB_X_CLIP",,"10-0","fb_x_clip_min",,"0x7ff",,,,,, +,,,,,,,,,,, +"FB_Y_CLIP",,"25-16","fb_y_clip_max",,"0x3ff",,,,,, +"FB_Y_CLIP",,"9-0","fb_y_clip_min",,"0x3ff",,,,,, +,,,,,,,,,,, +"FPU_SHAD_SCALE","simple_shadow_enable",8,"parameter_selection_volume_mode",0,,,,,,, +"FPU_SHAD_SCALE","simple_shadow_enable",8,"intensity_volume_mode",1,,,,,,, +"FPU_SHAD_SCALE",,"7-0","scale_factor_for_shadows",,"0xff",,,,,, +,,,,,,,,,,, +"FPU_CULL_VAL",,"30-0","culling_comparison_value",,"float_0_8_23",,,,,, +,,,,,,,,,,, +"FPU_PARAM_CFG","region_header_type",21,"type_1",0,,,,,,, +"FPU_PARAM_CFG","region_header_type",21,"type_2",1,,,,,,, +"FPU_PARAM_CFG",,"19-14","tsp_parameter_burst_threshold",,"0x3f",,,,,, +"FPU_PARAM_CFG",,"13-8","isp_parameter_burst_threshold",,"0x3f",,,,,, +"FPU_PARAM_CFG",,"7-4","pointer_burst_size",,"0xf",,,,,, +"FPU_PARAM_CFG",,"3-0","pointer_first_burst_size",,"0xf",,,,,, +,,,,,,,,,,, +"HALF_OFFSET","tsp_texel_sampling_position",2,"top_left",,,,,,,, +"HALF_OFFSET","tsp_texel_sampling_position",2,"center",,,,,,,, +"HALF_OFFSET","tsp_pixel_sampling_position",1,"top_left",,,,,,,, +"HALF_OFFSET","tsp_pixel_sampling_position",1,"center",,,,,,,, +"HALF_OFFSET","fpu_pixel_sampling_position",0,"top_left",,,,,,,, +"HALF_OFFSET","fpu_pixel_sampling_position",0,"center",,,,,,,, +,,,,,,,,,,, +"FPU_PERP_VAL",,"30-0","perpendicular_triangle_compare",,"float_0_8_23",,,,,, +,,,,,,,,,,, +"ISP_BACKGND_D",,"31-4","background_plane_depth",,"float_1_8_19",,,,,, +,,,,,,,,,,, +"ISP_BACKGND_T",,28,"cache_bypass",1,,,,,,, +"ISP_BACKGND_T",,27,"shadow",1,,,,,,, +"ISP_BACKGND_T",,"26-24","skip",,"0b111",,,,,, +"ISP_BACKGND_T",,"23-3","tag_address",,"0x1fffff","In 32-bit units",,,,, +"ISP_BACKGND_T",,"2-0","tag_offset",,"0b111",,,,,, +,,,,,,,,,,, +"ISP_FEED_CFG",,"23-14","cache_size_for_translucency",,"0x3ff","Must be between 0x020 and 0x200",,,,, +"ISP_FEED_CFG",,"13-4","punch_through_chunk_size",,"0x3ff","Must be between 0x020 and 0x200, must be larger than cache_size_for_translucency",,,,, +"ISP_FEED_CFG",,3,"discard_mode",1,,,,,,, +"ISP_FEED_CFG",,0,"pre_sort_mode",1,,,,,,, +,,,,,,,,,,, +"SDRAM_REFRESH",,"7-0","refresh_counter_value",,"0xff",,,,,, +,,,,,,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","priority_only","0x0",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","rendered_data","0x1",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","texture_vq_index","0x2",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","texture_normal_data_and_vq_codebook","0x3",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","tile_accelerator_isp_tsp_data","0x4",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","tile_accelerator_pointers","0x5",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","sh4","0x6",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","tsp_parameters","0x7",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","tsp_region_data","0x8",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","isp_pointer_data","0x9",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","isp_parameters","0xa",,,,,,, +"SDRAM_ARB_CFG","override_value","21-18","crt_controller","0xb",,,,,,, +"SDRAM_ARB_CFG","arbiter_priority_control","17-16","priority_arbitration_only","0x0",,,,,,, +"SDRAM_ARB_CFG","arbiter_priority_control","17-16","override_value_field","0x1",,,,,,, +"SDRAM_ARB_CFG","arbiter_priority_control","17-16","round_robin_counter","0x2",,,,,,, +"SDRAM_ARB_CFG",,"15-8","arbiter_crt_page_break_latency_count_value",,"0xff",,,,,, +"SDRAM_ARB_CFG",,"7-0","arbiter_page_break_latency_count_value",,"0xff",,,,,, +,,,,,,,,,,, +"SDRAM_CFG",,"28-26","read_command_to_returned_data_delay",,"0b111",,,,,, +"SDRAM_CFG",,"25-23","cas_latency_value",,"0b111",,,,,, +"SDRAM_CFG",,"22-21","activate_to_activate_period",,"0b11",,,,,, +"SDRAM_CFG",,"20-18","read_to_write_period",,"0b111",,,,,, +"SDRAM_CFG",,"17-14","refresh_to_activate_period",,"0b1111",,,,,, +"SDRAM_CFG",,"11-10","pre_charge_to_activate_period",,"0b11",,,,,, +"SDRAM_CFG",,"9-6","activate_to_pre_charge_period",,"0b1111",,,,,, +"SDRAM_CFG",,"5-4","activate_to_read_write_command_period",,"0b11",,,,,, +"SDRAM_CFG",,"3-2","write_to_pre_charge_period",,"0b11",,,,,, +"SDRAM_CFG",,"1-0","read_to_pre_charge_period",,"0b11",,,,,, +,,,,,,,,,,, +"FOG_COL_RAM",,"23-16","red",,"0xff",,,,,, +"FOG_COL_RAM",,"15-8","green",,"0xff",,,,,, +"FOG_COL_RAM",,"7-0","blue",,"0xff",,,,,, +,,,,,,,,,,, +"FOG_COL_VERT",,"23-16","red",,"0xff",,,,,, +"FOG_COL_VERT",,"15-8","green",,"0xff",,,,,, +"FOG_COL_VERT",,"7-0","blue",,"0xff",,,,,, +,,,,,,,,,,, +"FOG_DENSITY",,"15-8","fog_scale_mantissa",,"0xff",,,,,, +"FOG_DENSITY",,"7-0","fog_scale_exponent",,"0xff",,,,,, +,,,,,,,,,,, +"FOG_CLAMP_MAX",,"31-24","alpha",,"0xff",,,,,, +"FOG_CLAMP_MAX",,"23-16","red",,"0xff",,,,,, +"FOG_CLAMP_MAX",,"15-8","green",,"0xff",,,,,, +"FOG_CLAMP_MAX",,"7-0","blue",,"0xff",,,,,, +,,,,,,,,,,, +"FOG_CLAMP_MIN",,"31-24","alpha",,"0xff",,,,,, +"FOG_CLAMP_MIN",,"23-16","red",,"0xff",,,,,, +"FOG_CLAMP_MIN",,"15-8","green",,"0xff",,,,,, +"FOG_CLAMP_MIN",,"7-0","blue",,"0xff",,,,,, +,,,,,,,,,,, +"SPG_TRIGGER_POS",,"25-16","trigger_v_count",,,,,,,, +"SPG_TRIGGER_POS",,"9-0","trigger_h_count",,,,,,,, +,,,,,,,,,,, +"SPG_HBLANK_INT",,"25-16","hblank_in_interrupt",,,,,,,, +"SPG_HBLANK_INT","hblank_int_mode","13-12","output_equal_line_comp_val","0x0",,,,,,, +"SPG_HBLANK_INT","hblank_int_mode","13-12","output_every_line_comp_val","0x1",,,,,,, +"SPG_HBLANK_INT","hblank_int_mode","13-12","output_every_line","0x2",,,,,,, +"SPG_HBLANK_INT",,"9-0","line_comp_val",,"0x3ff",,,,,, +,,,,,,,,,,, +"SPG_VBLANK_INT",,"25-16","vblank_out_interrupt_line_number",,"0x3ff",,,,,, +"SPG_VBLANK_INT",,"9-0","vblank_in_interrupt_line_number",,"0x3ff",,,,,, +,,,,,,,,,,, +"SPG_CONTROL","csync_on_h",9,"hsync",0,,,,,,, +"SPG_CONTROL","csync_on_h",9,"csync",1,,,,,,, +"SPG_CONTROL","sync_direction",8,"input",0,,,,,,, +"SPG_CONTROL","sync_direction",8,"output",1,,,,,,, +"SPG_CONTROL",,7,"pal",1,,,,,,, +"SPG_CONTROL",,6,"ntsc",1,,,,,,, +"SPG_CONTROL",,5,"force_field2",1,,,,,,, +"SPG_CONTROL",,4,"interlace",1,,,,,,, +"SPG_CONTROL",,3,"spg_lock",1,,,,,,, +"SPG_CONTROL","mcsync_pol",2,"active_low",0,,,,,,, +"SPG_CONTROL","mcsync_pol",2,"active_high",1,,,,,,, +"SPG_CONTROL","mvsync_pol",1,"active_low",0,,,,,,, +"SPG_CONTROL","mvsync_pol",1,"active_high",1,,,,,,, +"SPG_CONTROL","mhsync_pol",0,"active_low",0,,,,,,, +"SPG_CONTROL","mhsync_pol",0,"active_high",1,,,,,,, +,,,,,,,,,,, +"SPG_HBLANK",,"25-16","hbend",,"0x3ff",,,,,, +"SPG_HBLANK",,"9-0","hbstart",,"0x3ff",,,,,, +,,,,,,,,,,, +"SPG_LOAD",,"25-16","vcount",,"0x3ff",,,,,, +"SPG_LOAD",,"9-0","hcount",,"0x3ff",,,,,, +,,,,,,,,,,, +"SPG_VBLANK",,"25-16","vbend",,"0x3ff",,,,,, +"SPG_VBLANK",,"9-0","vbstart",,"0x3ff",,,,,, +,,,,,,,,,,, +"SPG_WIDTH",,"31-22","eqwidth",,"0x3ff",,,,,, +"SPG_WIDTH",,"21-12","bpwidth",,"0x3ff",,,,,, +"SPG_WIDTH",,"11-8","vswidth",,"0b1111",,,,,, +"SPG_WIDTH",,"6-0","hswidth",,"0x7f",,,,,, +,,,,,,,,,,, +"TEXT_CONTROL","code_book_endian",17,"little_endian",0,,,,,,, +"TEXT_CONTROL","code_book_endian",17,"big_endian",1,,,,,,, +"TEXT_CONTROL","index_endian",16,"little_endian",0,,,,,,, +"TEXT_CONTROL","index_endian",16,"big_endian",1,,,,,,, +"TEXT_CONTROL",,"12-8","bank_bit",,"0x1f",,,,,, +"TEXT_CONTROL",,"4-0","stride",,"0x1f",,,,,, +,,,,,,,,,,, +"VO_CONTROL",,21,"pclk_delay_reset",1,,,,,,, +"VO_CONTROL",,"20-16","pclk_delay",,"0b1111",,,,,, +"VO_CONTROL",,8,"pixel_double",1,,,,,,, +"VO_CONTROL","field_mode","7-4","use_field_flag_from_spg","0x0",,,,,,, +"VO_CONTROL","field_mode","7-4","use_inverse_of_field_flag_from_spg","0x1",,,,,,, +"VO_CONTROL","field_mode","7-4","field_1_fixed","0x2",,,,,,, +"VO_CONTROL","field_mode","7-4","field_2_fixed","0x3",,,,,,, +"VO_CONTROL","field_mode","7-4","field_1_when_the_active_edges_of_hsync_and_vsync_match","0x4",,,,,,, +"VO_CONTROL","field_mode","7-4","field_2_when_the_active_edges_of_hsync_and_vsync_match","0x5",,,,,,, +"VO_CONTROL","field_mode","7-4","field_1_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge","0x6",,,,,,, +"VO_CONTROL","field_mode","7-4","field_2_when_hsync_becomes_active_in_the_middle_of_the_vsync_active_edge","0x7",,,,,,, +"VO_CONTROL","field_mode","7-4","inverted_at_the_active_edge_of_vsync","0x8",,,,,,, +"VO_CONTROL",,3,"blank_video",1,,,,,,, +"VO_CONTROL","blank_pol",2,"active_low",0,,,,,,, +"VO_CONTROL","blank_pol",2,"active_high",1,,,,,,, +"VO_CONTROL","vsync_pol",1,"active_low",0,,,,,,, +"VO_CONTROL","vsync_pol",1,"active_high",1,,,,,,, +"VO_CONTROL","hsync_pol",0,"active_low",0,,,,,,, +"VO_CONTROL","hsync_pol",0,"active_high",1,,,,,,, +,,,,,,,,,,, +"VO_STARTX",,"9-0","horizontal_start_position",,"0x3ff",,,,,, +,,,,,,,,,,, +"VO_STARTY",,"25-16","vertical_start_position_on_field_2",,"0x3ff",,,,,, +"VO_STARTY",,"9-0","vertical_start_position_on_field_1",,"0x3ff",,,,,, +,,,,,,,,,,, +"SCALER_CTL","field_select",18,"field_1",0,,,,,,, +"SCALER_CTL","field_select",18,"field_2",1,,,,,,, +"SCALER_CTL",,17,"interlace",1,,,,,,, +"SCALER_CTL",,16,"horizontal_scaling_enable",1,,,,,,, +"SCALER_CTL",,"15-0","vertical_scale_factor",,"0xffff",,,,,, +,,,,,,,,,,, +"PAL_RAM_CTL","pixel_format","1-0","argb1555",0,,,,,,, +"PAL_RAM_CTL","pixel_format","1-0","rgb565",1,,,,,,, +"PAL_RAM_CTL","pixel_format","1-0","argb4444",2,,,,,,, +"PAL_RAM_CTL","pixel_format","1-0","argb8888",3,,,,,,, +,,,,,,,,,,, +"SPG_STATUS",,13,"vsync",,,,,,,, +"SPG_STATUS",,12,"hsync",,,,,,,, +"SPG_STATUS",,11,"blank",,,,,,,, +"SPG_STATUS",,10,"fieldnum",,,,,,,, +"SPG_STATUS",,"9-0","scanline",,,,,,,, +,,,,,,,,,,, +"FB_BURSTCTRL",,"19-16","wr_burst",,"0b1111",,,,,, +"FB_BURSTCTRL",,"14-8","vid_lat",,"0x7f",,,,,, +"FB_BURSTCTRL",,"5-0","vid_burst",,"0x3f",,,,,," >" +,,,,,,,,,,, +"FB_C_SOF",,"23-0","frame_buffer_current_read_address",,,,,,,, +,,,,,,,,,,, +"Y_COEFF",,"15-8","coefficient_1",,"0xff",,,,,, +"Y_COEFF",,"7-0","coefficient_0_2",,"0xff",,,,,, +,,,,,,,,,,, +"PT_ALPHA_REF",,"7-0","alpha_reference_for_punch_through",,"0xff",,,,,, +,,,,,,,,,,, +"FOG_TABLE",,"15-0","fog_table_data",,"0xffff",,,,,, +,,,,,,,,,,, +"PALETTE_RAM",,"31-0","palette_data",,"0xffff_ffff",,,,,, diff --git a/regs/core_bits.ods b/regs/core_bits.ods index e377ef589da43b93792392ebbc592c07ecc30445..21a62de688110b4f3becbc4760398259375a6d95 100644 GIT binary patch delta 10416 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 delta 10420 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 a2KhfP^q(IH@qalPfWtJ1VB}T)g8u~{H1LZ6 diff --git a/regs/gen/core_bits.py b/regs/gen/core_bits.py new file mode 100644 index 0000000..9706524 --- /dev/null +++ b/regs/gen/core_bits.py @@ -0,0 +1,219 @@ +import sys +from collections import defaultdict +from pprint import pprint +from dataclasses import dataclass +from typing import Union + +from sh7091 import read_input +from generate import renderer + +def aggregate_registers(d): + aggregated = defaultdict(list) + for row in d: + assert row["register_name"] != "" + aggregated[row["register_name"]].append(row) + return dict(aggregated) + +def parse_bit_number(s): + assert '-' not in s + return int(s, 10) + +def parse_bit_range(s): + if '-' in s: + left, right = map(parse_bit_number, s.split('-', maxsplit=1)) + assert left > right, (left, right) + return set(range(right, left+1)) + else: + num = parse_bit_number(s) + return set([num]) + +def aggregate_enums(aggregated_rows): + non_enum = [] + enum_aggregated = defaultdict(list) + all_bits = set() + enum_bits = dict() + + def assert_unique_ordered(bits): + nonlocal all_bits + assert all(bit not in all_bits for bit in bits), bits + assert max(all_bits, default=32) > max(bits) + all_bits |= bits + + for row in aggregated_rows: + bits = parse_bit_range(row["bits"]) + assert row["bit_name"] != "" + if row["enum_name"] == "": + assert_unique_ordered(bits) + non_enum.append(row) + else: + if row["enum_name"] not in enum_bits: + assert_unique_ordered(bits) + non_enum.append(row["enum_name"]) + else: + assert enum_bits[row["enum_name"]] == bits + + enum_bits[row["enum_name"]] = bits + enum_aggregated[row["enum_name"]].append(row) + + return non_enum, dict(enum_aggregated) + +@dataclass +class enum: + name: str + defs: list[dict] + +@dataclass +class register: + name: str + defs: list[Union[dict, enum]] + +def aggregate_all_enums(aggregated): + out = [] + for register_name, rows in aggregated.items(): + non_enum, enum_aggregated = aggregate_enums(rows) + def resolve(row_or_string): + if type(row_or_string) == str: + return enum(row_or_string, + enum_aggregated[row_or_string]) + elif type(row_or_string) == dict: + return row_or_string + else: + assert False, (row_or_string, type(row_or_string)) + out.append( + register(register_name, + [resolve(aggregate) for aggregate in non_enum])) + return out + +''' + register(name='SCALER_CTL', + defs=[enum(name='field_select', + defs=[{'bit_name': 'field_1', + 'bits': '18', + 'description': '', + 'enum_name': 'field_select', + 'mask': '', + 'register_name': 'SCALER_CTL', + 'value': '0'}, + {...}]), + {'bit_name': 'interlace', + 'bits': '17', + 'description': '', + 'enum_name': '', + 'mask': '', + 'register_name': 'SCALER_CTL', + 'value': '1'}, + {...}, + ...]), +''' + +def mask_from_bits(bits): + mask = 2 ** len(bits) - 1 + return mask + +def parse_value(value): + return eval(value) + +def render_read_only(bit_def): + assert bit_def["value"] == "" + assert bit_def["mask"] == "" + bits = parse_bit_range(bit_def["bits"]) + mask_value = mask_from_bits(bits) + yield ( + f"constexpr uint32_t {bit_def['bit_name']}(uint32_t reg) {{ " + f"return (reg >> {min(bits)}) & {hex(mask_value)};" + " }" + ) + +def render_float_mask(mask): + if mask == "float_0_8_23": + return "_i(__builtin_fabsf(num));" + elif mask == "float_1_8_23": + return "_i(num)" + else: + assert mask.startswith("float_") + mask = mask.removeprefix("float_") + sign, exponent, fraction = map(int, mask.split('_')) + assert exponent == 8, exponent + assert sign == 1 + bit_length = (sign + exponent + fraction) + mask = (2 ** bit_length - 1) << (32 - bit_length) + return f"_i(num) & {hex(mask)}" + +def render_mask(bit_def): + assert bit_def["value"] == "" + mask = bit_def["mask"] + bits = parse_bit_range(bit_def["bits"]) + if mask.startswith("float_"): + yield ( + f"constexpr uint32_t {bit_def['bit_name']}(float num) {{ " + f"return {render_float_mask(mask)};" + " }" + ) + else: + assert mask.startswith("0x") or mask.startswith("0b") or mask[0] in set(range(0, 9+1)), mask + mask_value = eval(mask) + assert mask_value & mask_from_bits(bits) == mask_value, (mask_value, mask_from_bits(bits)) + + yield ( + f"constexpr uint32_t {bit_def['bit_name']}(uint32_t num) {{ " + f"return (num & {hex(mask_value)}) << {min(bits)};" + " }" + ) + +def render_value(bit_def): + assert bit_def["mask"] == "" + bits = parse_bit_range(bit_def["bits"]) + assert parse_value(bit_def["value"]) <= mask_from_bits(bits), bit_def["value"] + bit_ix = min(bits) + yield f"constexpr uint32_t {bit_def['bit_name']} = {bit_def['value']} << {bit_ix};" + +def render_defs(bit_def): + if bit_def["value"] != "": + yield from render_value(bit_def) + elif bit_def["mask"] != "": + yield from render_mask(bit_def) + else: + yield from render_read_only(bit_def) + +def render_enum(enum_def): + yield f"namespace {enum_def.name.lower()} {{" + for bit_def in enum_def.defs: + yield from render_defs(bit_def) + yield "}" + +def render_register(register): + yield f"namespace {register.name.lower()} {{" + + last = None + for ix, bit_def in enumerate(register.defs): + if type(bit_def) is enum: + if ix != 0: + yield "" + yield from render_enum(bit_def) + else: + if ix != 0 and type(last) is enum: + yield "" + yield from render_defs(bit_def) + last = bit_def + + yield "}" + yield "" + +def render_registers(registers): + for register in registers: + yield from render_register(register) + +def header(): + yield "#include " + yield "" + yield '#include "float_uint32.h"' + yield "" + +if __name__ == "__main__": + d = read_input(sys.argv[1]) + aggregated = aggregate_registers(d) + registers = aggregate_all_enums(aggregated) + render, out = renderer() + render(header()) + render(render_registers(registers)) + sys.stdout.write(out.getvalue()) diff --git a/regs/gen/sh7091.py b/regs/gen/sh7091.py index d6b0722..d24390b 100644 --- a/regs/gen/sh7091.py +++ b/regs/gen/sh7091.py @@ -5,7 +5,8 @@ from pprint import pprint from generate import renderer -def as_dict(header, row): +def as_dict(header, row0): + row = [s.strip() for s in row0] return dict(zip(header, row)) def read_input(filename): diff --git a/regs/memorymap.ods b/regs/memorymap.ods index 373544aa3218f24601b995cb6c8c68045501afd9..dd874acba17efbdb4f7db05e67413df620997979 100644 GIT binary patch delta 4287 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 Q07Dd|ngDT^(r@wq0L(%5!~g&Q delta 4389 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 diff --git a/ta.h b/ta.h index 43a6662..6dd6715 100644 --- a/ta.h +++ b/ta.h @@ -3,10 +3,6 @@ #define FPU_SHAD_SCALE__INTENSITY_SHADOW_ENABLE (1 << 8) #define FPU_SHAD_SCALE__SCALE_FACTOR(n) (((n) & 0xff) << 0) -#define FPU_CULL_VAL__COMPARISON_VALUE(n) (_u32(__builtin_fabsf(n))) - -#define FPU_PERP_VAL__COMPARISON_VALUE(n) (_u32(__builtin_fabsf(n))) - #define SPAN_SORT_CFG__CACHE_BYPASS (1 << 16) #define SPAN_SORT_CFG__OFFSET_SORT_ENABLE (1 << 8) #define SPAN_SORT_CFG__SPAN_SORT_ENABLE (1 << 0) diff --git a/vga.cpp b/vga.cpp index 8974135..4720a30 100644 --- a/vga.cpp +++ b/vga.cpp @@ -3,6 +3,9 @@ #include "sh7091.h" #include "sh7091_bits.h" #include "holly.h" +#include "holly/core_bits.h" +#include "aica.h" +#include "memorymap.h" #include "vga.h" #include "rgb.h" @@ -18,112 +21,78 @@ uint32_t get_cable_type() void vga1() { - uint32_t fb_r_ctrl = holly.FB_R_CTRL; - holly.FB_R_CTRL = fb_r_ctrl & ~(1 << 0); // fb_enable = 0 - uint32_t blank_video = 1; - holly.VO_CONTROL |= (blank_video << 3); // blank_video + holly.FB_R_CTRL = holly.FB_R_CTRL & ~fb_r_ctrl::fb_enable; + holly.VO_CONTROL |= vo_control::blank_video; holly.FB_R_SIZE = 0; - uint32_t vblank_in = 0x0208; - uint32_t vblank_out = 0x0015; - holly.SPG_VBLANK_INT = (vblank_out << 16) | (vblank_in << 0); + holly.SPG_VBLANK_INT = spg_vblank_int::vblank_out_interrupt_line_number(0x0015) + | spg_vblank_int::vblank_in_interrupt_line_number(0x0208); - uint32_t sync_direction = 1; - holly.SPG_CONTROL = (sync_direction << 8); + holly.SPG_CONTROL = spg_control::sync_direction::output; - uint32_t hbstart = 0x0345; // default - uint32_t hbend = 0x007e; // default - holly.SPG_HBLANK = (hbend << 16) | (hbstart << 0); + constexpr uint32_t hbstart = 0x0345; + holly.SPG_HBLANK = spg_hblank::hbend(0x007e) // default + | spg_hblank::hbstart(hbstart); // default - uint32_t hcount = 0x0359; // default - uint32_t vcount = 0x020c; // non-default - holly.SPG_LOAD = (vcount << 16) | (hcount << 0); + holly.SPG_LOAD = spg_load::vcount(0x020c) // default + | spg_load::hcount(0x0359); // non-default - uint32_t vbstart = 0x0208; // non-default - uint32_t vbend = 0x0028; // non-default - holly.SPG_VBLANK = (vbend << 16) | (vbstart << 0); + holly.SPG_VBLANK = spg_vblank::vbend(0x0028) // non-default + | spg_vblank::vbstart(0x0208); // non-default - uint32_t hswidth = 0x003f; - uint32_t vswidth = 0x0003; - uint32_t bpwidth = 0x0319; - uint32_t eqwidth = 0x000f; - holly.SPG_WIDTH = - (hswidth << 0) - | (vswidth << 8) - | (bpwidth << 12) - | (eqwidth << 22); + holly.SPG_WIDTH = spg_width::eqwidth(0x000f) + | spg_width::bpwidth(0x0319) + | spg_width::vswidth(0x0003) + | spg_width::hswidth(0x003f); - uint32_t startx = 0x0a8; - uint32_t starty = 0x028; - holly.VO_STARTX = startx; - holly.VO_STARTY = (starty << 16) | (starty << 0); + constexpr uint32_t starty = 0x028; + holly.VO_STARTX = vo_startx::horizontal_start_position(0x0a8); + holly.VO_STARTY = vo_starty::vertical_start_position_on_field_2(starty) + | vo_starty::vertical_start_position_on_field_1(starty); - holly.SPG_HBLANK_INT = hbstart << 16; + holly.SPG_HBLANK_INT = spg_hblank_int::line_comp_val(hbstart); } void vga2() { - holly.FB_BURSTCTRL = 0x00093f39; + holly.FB_BURSTCTRL = fb_burstctrl::wr_burst(0x09) + | fb_burstctrl::vid_lat(0x3f) + | fb_burstctrl::vid_burst(0x39); - uint32_t xsize = 640; - uint32_t ysize = 480; + constexpr uint32_t x_size = 640; + constexpr uint32_t y_size = 480; - uint32_t fb_xclip_min = 0; - uint32_t fb_xclip_max = xsize-1; - holly.FB_X_CLIP = (fb_xclip_max << 16) | (fb_xclip_min << 0); - uint32_t fb_yclip_min = 0; - uint32_t fb_yclip_max = ysize-1; - holly.FB_Y_CLIP = (fb_yclip_max << 16) | (fb_yclip_min << 0); + holly.FB_X_CLIP = fb_x_clip::fb_x_clip_max(x_size - 1) + | fb_x_clip::fb_x_clip_min(0); - uint32_t fb_xsize = (xsize * 16)/(32) - 1; - uint32_t fb_ysize = ysize - 3; - uint32_t fb_mod = 1; - holly.FB_R_SIZE = 0 - | (fb_xsize << 0) - | (fb_ysize << 10) - | (fb_mod << 20); + holly.FB_Y_CLIP = fb_y_clip::fb_y_clip_max(y_size - 1) + | fb_y_clip::fb_y_clip_min(0); - uint32_t coeff0 = 0x40; - uint32_t coeff1 = 0x80; - holly.Y_COEFF = (coeff1 << 8) | (coeff0 << 0); + holly.FB_R_SIZE = fb_r_size::fb_modulus(1) + | fb_r_size::fb_y_size(y_size - 3) + | fb_r_size::fb_x_size((x_size * 16) / 32 - 1); - uint32_t vscale_factor = 0x0400; - holly.SCALER_CTL = (vscale_factor << 0); + holly.Y_COEFF = y_coeff::coefficient_1(0x80) + | y_coeff::coefficient_0_2(0x40); - holly.FB_W_SOF1 = 0; - holly.FB_W_SOF2 = 0; - holly.FB_R_SOF1 = 0; - holly.FB_R_SOF2 = 0; + // in 6.10 fixed point; 0x0400 is 1x vertical scale + holly.SCALER_CTL = scaler_ctl::vertical_scale_factor(0x0400); - holly.FB_R_CTRL = 0 - | 1 << 23 // vclk_div - | 0 << 22 // fb_strip_buf_en - | 0 << 16 // fb_strip_size - | 0 << 8 // fb_chroma_threshold - | 0 << 4 // fb_concat - | 1 << 2 // fb_depth - | 0 << 1 // fb_line_double - | 1 << 0 // fb_enable - ; + holly.FB_W_SOF1 = fb_w_sof1::frame_buffer_write_address_frame_1(0); + holly.FB_W_SOF2 = fb_w_sof2::frame_buffer_write_address_frame_2(0); + holly.FB_R_SOF1 = fb_r_sof1::frame_buffer_read_address_frame_1(0); + holly.FB_R_SOF2 = fb_r_sof2::frame_buffer_read_address_frame_2(0); - uint32_t hsync_pol = 0; - uint32_t vsync_pol = 0; - uint32_t blank_pol = 0; - uint32_t blank_video = 0; - uint32_t field_mode = 0; - uint32_t pixel_double = 0; - uint32_t pclk_delay = 0x16; - holly.VO_CONTROL = 0 - | (( pclk_delay & 0x3f) << 16 ) - | (( pixel_double & 0x01) << 8 ) - | (( field_mode & 0x0f) << 4 ) - | (( blank_video & 0x01) << 3 ) - | (( blank_pol & 0x01) << 2 ) - | (( vsync_pol & 0x01) << 1 ) - | (( hsync_pol & 0x01) << 0 ); + holly.FB_R_CTRL = fb_r_ctrl::vclk_div::pclk_vclk_1 + | fb_r_ctrl::fb_depth::_0565_rgb_16bit + | fb_r_ctrl::fb_enable; - *((reg32 *)0xa0702c00) = 0; +#define DVE_OUTPUT_MODE (&aica[0x2c00]) +#define DVE_OUTPUT_MODE__VGA (0b00 << 0) + *DVE_OUTPUT_MODE = DVE_OUTPUT_MODE__VGA; +#undef DVE_OUTPUT_MODE +#undef DVE_OUTPUT_MODE__VGA } void v_sync_in() @@ -154,41 +123,27 @@ void vga() { get_cable_type(); - holly.SOFTRESET = 0b111; - holly.TEXT_CONTROL = 3; - holly.FB_W_CTRL = 9; + holly.SOFTRESET = softreset::sdram_if_soft_reset + | softreset::pipeline_soft_reset + | softreset::ta_soft_reset; + holly.TEXT_CONTROL = text_control::stride(3); - /* - */ vga1(); vga2(); + holly.VO_BORDER_COL = vo_border_col::red(0x00) + | vo_border_col::green(0xff) + | vo_border_col::blue(0x00); + holly.VO_CONTROL = vo_control::pclk_delay(0x16); + v_sync_in(); - holly.VO_BORDER_COL = (63 << 5) | (31 << 0); - //holly.VO_CONTROL = 0x0016; - uint32_t hsync_pol = 0; - uint32_t vsync_pol = 0; - uint32_t blank_pol = 0; - uint32_t blank_video = 0; - uint32_t field_mode = 0; - uint32_t pixel_double = 0; - uint32_t pclk_delay = 0x16; - HOLLY.VO_CONTROL = 0 - | (( pclk_delay & 0x3f) << 16 ) - | (( pixel_double & 0x01) << 8 ) - | (( field_mode & 0x0f) << 4 ) - | (( blank_video & 0x01) << 3 ) - | (( blank_pol & 0x01) << 2 ) - | (( vsync_pol & 0x01) << 1 ) - | (( hsync_pol & 0x01) << 0 ); - - holly.SOFTRESET = 0b000; + holly.SOFTRESET = 0; } void fill_framebuffer() { - reg16 * vram = (reg16 *)0xa5000000; + volatile uint16_t * vram = reinterpret_cast(texture_memory); for (int y = 0; y < 480; y++) { for (int x = 0; x < 640; x++) { struct hsv hsv = {(y * 255) / 480, 255, 255};