From c0e10fe8f19e19f4b198063150845055b42f558d Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 8 Mar 2024 20:46:55 +0800 Subject: [PATCH] vga: delete This is replaced with the (slightly cleaner) holly/video_output. --- dve.hpp | 2 +- example/clipping.cpp | 4 +- example/clipping2.cpp | 4 +- example/clipping_textured.cpp | 4 +- example/cube.cpp | 4 +- example/dump_object_list.cpp | 4 +- example/example.mk | 56 +++---- example/font_bitmap.cpp | 4 +- example/font_outline.cpp | 4 +- example/font_outline_punch_through.cpp | 4 +- example/heart.cpp | 4 +- example/icosphere.cpp | 4 +- example/macaw.cpp | 4 +- example/macaw_cube.cpp | 4 +- example/macaw_cube_render_to_texture.cpp | 4 +- example/macaw_multipass.cpp | 4 +- example/macaw_twiddle.cpp | 4 +- example/maple_analog.cpp | 4 +- example/maple_controller.cpp | 4 +- example/maple_vibrator.cpp | 4 +- example/maple_wink.cpp | 4 - example/modifier_volume.cpp | 4 +- example/modifier_volume_with_two_volumes.cpp | 4 +- example/software_ta.cpp | 4 +- example/sprite.cpp | 4 +- example/translucency.cpp | 4 +- example/viewing_system.cpp | 4 +- example/wiffle_attenuation.cpp | 4 +- headers.mk | 2 +- holly/core.cpp | 17 +- holly/core.hpp | 2 +- holly/ta_fifo_polygon_converter.cpp | 28 ++-- holly/video_output.cpp | 35 ++++- holly/video_output.hpp | 7 + ..._output_mode.cpp => video_output_mode.inc} | 0 maple/maple.cpp | 6 +- regs/dve.csv | 2 +- regs/dve.ods | Bin 15513 -> 15949 bytes regs/systembus_bits.csv | 104 ++++++------- regs/systembus_bits.ods | Bin 14382 -> 14439 bytes systembus_bits.hpp | 104 ++++++------- vga.cpp | 147 ------------------ vga.hpp | 6 - 43 files changed, 248 insertions(+), 374 deletions(-) rename holly/{video_output_mode.cpp => video_output_mode.inc} (100%) delete mode 100644 vga.cpp delete mode 100644 vga.hpp diff --git a/dve.hpp b/dve.hpp index 1ed33be..15122fd 100644 --- a/dve.hpp +++ b/dve.hpp @@ -15,7 +15,7 @@ namespace vreg { namespace pdtra { namespace cable_type { constexpr uint32_t vga = 0b00 << 8; - constexpr uint32_t rbg = 0b10 << 8; + constexpr uint32_t rgb = 0b10 << 8; constexpr uint32_t cvbs_yc = 0b11 << 8; constexpr uint32_t bit_mask = 0x3 << 8; diff --git a/example/clipping.cpp b/example/clipping.cpp index 2114941..5fe6f71 100644 --- a/example/clipping.cpp +++ b/example/clipping.cpp @@ -3,7 +3,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -240,7 +240,7 @@ void main() uint32_t * command_buf = align_32byte(_command_buf); uint32_t * receive_buf = align_32byte(_receive_buf); - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/clipping2.cpp b/example/clipping2.cpp index 1b65f72..459039a 100644 --- a/example/clipping2.cpp +++ b/example/clipping2.cpp @@ -3,7 +3,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -218,7 +218,7 @@ void main() uint32_t * command_buf = align_32byte(_command_buf); uint32_t * receive_buf = align_32byte(_receive_buf); - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/clipping_textured.cpp b/example/clipping_textured.cpp index 7027986..174deeb 100644 --- a/example/clipping_textured.cpp +++ b/example/clipping_textured.cpp @@ -3,7 +3,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -257,7 +257,7 @@ void main() uint32_t * command_buf = align_32byte(_command_buf); uint32_t * receive_buf = align_32byte(_receive_buf); - vga(); + video_output::set_mode_vga(); init_macaw_texture(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/cube.cpp b/example/cube.cpp index a4f17bf..0f49e56 100644 --- a/example/cube.cpp +++ b/example/cube.cpp @@ -2,7 +2,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -150,7 +150,7 @@ uint32_t _ta_parameter_buf[((32 * (5 * 6 + 1)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/dump_object_list.cpp b/example/dump_object_list.cpp index 840cad8..801acda 100644 --- a/example/dump_object_list.cpp +++ b/example/dump_object_list.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -186,7 +186,7 @@ void dump() void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/example.mk b/example/example.mk index 1fe2dff..b5b8795 100644 --- a/example/example.mk +++ b/example/example.mk @@ -1,6 +1,6 @@ SPRITE_OBJ = \ example/sprite.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -11,11 +11,11 @@ example/sprite.elf: $(START_OBJ) $(SPRITE_OBJ) MACAW_OBJ = \ example/macaw.o \ - vga.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ + holly/video_output.o \ macaw.data.o example/macaw.elf: LDSCRIPT = $(LIB)/alt.lds @@ -23,7 +23,7 @@ example/macaw.elf: $(START_OBJ) $(MACAW_OBJ) MACAW_TWIDDLE_OBJ = \ example/macaw_twiddle.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -35,7 +35,7 @@ example/macaw_twiddle.elf: $(START_OBJ) $(MACAW_TWIDDLE_OBJ) FONT_BITMAP_OBJ = \ example/font_bitmap.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -47,7 +47,7 @@ example/font_bitmap.elf: $(START_OBJ) $(FONT_BITMAP_OBJ) FONT_OUTLINE_OBJ = \ example/font_outline.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -59,7 +59,7 @@ example/font_outline.elf: $(START_OBJ) $(FONT_OUTLINE_OBJ) FONT_OUTLINE_PUNCH_THROUGH_OBJ = \ example/font_outline_punch_through.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -71,7 +71,7 @@ example/font_outline_punch_through.elf: $(START_OBJ) $(FONT_OUTLINE_PUNCH_THROUG MACAW_MULTIPASS_OBJ = \ example/macaw_multipass.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -83,7 +83,7 @@ example/macaw_multipass.elf: $(START_OBJ) $(MACAW_MULTIPASS_OBJ) TRANSLUCENCY_OBJ = \ example/translucency.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -95,7 +95,7 @@ example/translucency.elf: $(START_OBJ) $(TRANSLUCENCY_OBJ) CUBE_OBJ = \ example/cube.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -106,7 +106,7 @@ example/cube.elf: $(START_OBJ) $(CUBE_OBJ) ICOSPHERE_OBJ = \ example/icosphere.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -117,7 +117,7 @@ example/icosphere.elf: $(START_OBJ) $(ICOSPHERE_OBJ) SUZANNE_PROFILE_OBJ = \ example/suzanne_profile.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -131,7 +131,7 @@ example/suzanne_profile.elf: $(START_OBJ) $(SUZANNE_PROFILE_OBJ) WIFFLE_ATTENUATION_OBJ = \ example/wiffle_attenuation.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -142,7 +142,7 @@ example/wiffle_attenuation.elf: $(START_OBJ) $(WIFFLE_ATTENUATION_OBJ) MODIFIER_VOLUME_OBJ = \ example/modifier_volume.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -153,7 +153,7 @@ example/modifier_volume.elf: $(START_OBJ) $(MODIFIER_VOLUME_OBJ) MODIFIER_VOLUME_WITH_TWO_VOLUMES_OBJ = \ example/modifier_volume_with_two_volumes.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -168,7 +168,7 @@ example/modifier_volume_with_two_volumes.elf: $(START_OBJ) $(MODIFIER_VOLUME_WIT HEART_OBJ = \ example/heart.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -179,7 +179,7 @@ example/heart.elf: $(START_OBJ) $(HEART_OBJ) VIEWING_SYSTEM_OBJ = \ example/viewing_system.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -191,7 +191,7 @@ example/viewing_system.elf: $(START_OBJ) $(VIEWING_SYSTEM_OBJ) MACAW_CUBE_OBJ = \ example/macaw_cube.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -203,7 +203,7 @@ example/macaw_cube.elf: $(START_OBJ) $(MACAW_CUBE_OBJ) MACAW_CUBE_RENDER_TO_TEXTURE_OBJ = \ example/macaw_cube_render_to_texture.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -215,7 +215,7 @@ example/macaw_cube_render_to_texture.elf: $(START_OBJ) $(MACAW_CUBE_RENDER_TO_TE CLIPPING_OBJ = \ example/clipping.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -227,7 +227,7 @@ example/clipping.elf: $(START_OBJ) $(CLIPPING_OBJ) CLIPPING2_OBJ = \ example/clipping2.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -241,7 +241,7 @@ example/clipping2.elf: $(START_OBJ) $(CLIPPING2_OBJ) CLIPPING_TEXTURED_OBJ = \ example/clipping_textured.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -256,7 +256,7 @@ example/clipping_textured.elf: $(START_OBJ) $(CLIPPING_TEXTURED_OBJ) MAPLE_DEVICE_REQUEST_OBJ = \ example/maple_device_request.o \ - vga.o \ + holly/video_output.o \ sh7091/serial.o \ maple/maple.o @@ -265,7 +265,7 @@ example/maple_device_request.elf: $(START_OBJ) $(MAPLE_DEVICE_REQUEST_OBJ) MAPLE_CONTROLLER_OBJ = \ example/maple_controller.o \ - vga.o \ + holly/video_output.o \ sh7091/serial.o \ maple/maple.o @@ -274,7 +274,7 @@ example/maple_controller.elf: $(START_OBJ) $(MAPLE_CONTROLLER_OBJ) MAPLE_WINK_OBJ = \ example/maple_wink.o \ - vga.o \ + holly/video_output.o \ rgb.o \ sh7091/serial.o \ maple/maple.o \ @@ -285,7 +285,7 @@ example/maple_wink.elf: $(START_OBJ) $(MAPLE_WINK_OBJ) MAPLE_VIBRATOR_OBJ = \ example/maple_vibrator.o \ - vga.o \ + holly/video_output.o \ rgb.o \ sh7091/serial.o \ maple/maple.o @@ -295,7 +295,7 @@ example/maple_vibrator.elf: $(START_OBJ) $(MAPLE_VIBRATOR_OBJ) MAPLE_ANALOG_OBJ = \ example/maple_analog.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -322,7 +322,7 @@ example/interrupt.elf: $(START_OBJ) $(INTERRUPT_OBJ) DUMP_OBJECT_LIST_OBJ = \ example/dump_object_list.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ @@ -341,7 +341,7 @@ example/dump_ram.elf: $(START_OBJ) $(DUMP_RAM_OBJ) SOFTWARE_TA_OBJ = \ example/software_ta.o \ - vga.o \ + holly/video_output.o \ holly/core.o \ holly/region_array.o \ holly/background.o \ diff --git a/example/font_bitmap.cpp b/example/font_bitmap.cpp index 38cfa9e..2128b3d 100644 --- a/example/font_bitmap.cpp +++ b/example/font_bitmap.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -227,7 +227,7 @@ uint32_t _ta_parameter_buf[((32 * 10 * 17) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto src = reinterpret_cast(&_binary_sperrypc_8x8_data_start); inflate_font(src); diff --git a/example/font_outline.cpp b/example/font_outline.cpp index 672a2de..92a93b5 100644 --- a/example/font_outline.cpp +++ b/example/font_outline.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -212,7 +212,7 @@ uint32_t _ta_parameter_buf[((32 * 10 * 17) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto font = reinterpret_cast(&_binary_dejavusansmono_data_start); auto glyphs = reinterpret_cast(&font[1]); diff --git a/example/font_outline_punch_through.cpp b/example/font_outline_punch_through.cpp index 27c49ff..cf4c7a7 100644 --- a/example/font_outline_punch_through.cpp +++ b/example/font_outline_punch_through.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -216,7 +216,7 @@ uint32_t _ta_parameter_buf[((32 * 10 * 17) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto font = reinterpret_cast(&_binary_dejavusansmono_mono_data_start); auto glyphs = reinterpret_cast(&font[1]); diff --git a/example/heart.cpp b/example/heart.cpp index 3b8e280..1a1f2d2 100644 --- a/example/heart.cpp +++ b/example/heart.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -247,7 +247,7 @@ uint32_t _ta_parameter_buf[((32 * 8192) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/icosphere.cpp b/example/icosphere.cpp index 8a56f4b..0d9f83c 100644 --- a/example/icosphere.cpp +++ b/example/icosphere.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" @@ -235,7 +235,7 @@ uint32_t _ta_parameter_buf[((32 * 8192) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/macaw.cpp b/example/macaw.cpp index bcb8417..e90eb53 100644 --- a/example/macaw.cpp +++ b/example/macaw.cpp @@ -1,7 +1,6 @@ #include #include "align.hpp" -#include "vga.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -15,6 +14,7 @@ #include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" +#include "holly/video_output.hpp" #include "memorymap.hpp" #include "macaw.hpp" @@ -137,7 +137,7 @@ uint32_t _ta_parameter_buf[((32 * (strip_length + 2)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); copy_macaw_texture(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/macaw_cube.cpp b/example/macaw_cube.cpp index 700d3de..06bd8bb 100644 --- a/example/macaw_cube.cpp +++ b/example/macaw_cube.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -167,7 +167,7 @@ uint32_t _ta_parameter_buf[((32 * (5 * 6 + 1)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); copy_macaw_texture(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/macaw_cube_render_to_texture.cpp b/example/macaw_cube_render_to_texture.cpp index 144067c..62bcb63 100644 --- a/example/macaw_cube_render_to_texture.cpp +++ b/example/macaw_cube_render_to_texture.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -230,7 +230,7 @@ uint32_t _ta_parameter_buf[((32 * (5 * 6 + 1)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); copy_macaw_texture(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/macaw_multipass.cpp b/example/macaw_multipass.cpp index 356922f..5383899 100644 --- a/example/macaw_multipass.cpp +++ b/example/macaw_multipass.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly.hpp" @@ -100,7 +100,7 @@ uint32_t _ta_parameter_buf[((32 * (strip_length + 2)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto src = reinterpret_cast(&_binary_macaw_data_start); auto size = reinterpret_cast(&_binary_macaw_data_size); diff --git a/example/macaw_twiddle.cpp b/example/macaw_twiddle.cpp index b30fdda..05d21f4 100644 --- a/example/macaw_twiddle.cpp +++ b/example/macaw_twiddle.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -141,7 +141,7 @@ uint32_t _ta_parameter_buf[((32 * (strip_length + 2)) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); init_macaw_texture(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/maple_analog.cpp b/example/maple_analog.cpp index fda34b0..8378645 100644 --- a/example/maple_analog.cpp +++ b/example/maple_analog.cpp @@ -3,7 +3,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -164,7 +164,7 @@ void main() uint32_t * command_buf = align_32byte(_command_buf); uint32_t * receive_buf = align_32byte(_receive_buf); - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/maple_controller.cpp b/example/maple_controller.cpp index 7337c4f..3d02c66 100644 --- a/example/maple_controller.cpp +++ b/example/maple_controller.cpp @@ -1,6 +1,6 @@ #include -#include "vga.hpp" +#include "holly/video_output.hpp" #include "align.hpp" #include "maple/maple.hpp" @@ -107,7 +107,7 @@ void main() // flycast needs this in HLE mode, or else it won't start the vcount // counter. - vga(); + video_output::set_mode_vga(); while (1) { v_sync_in(); diff --git a/example/maple_vibrator.cpp b/example/maple_vibrator.cpp index b15d348..16f2d34 100644 --- a/example/maple_vibrator.cpp +++ b/example/maple_vibrator.cpp @@ -1,6 +1,6 @@ #include -#include "vga.hpp" +#include "holly/video_output.hpp" #include "align.hpp" #include "maple/maple.hpp" @@ -184,7 +184,7 @@ void main() command_buf = reinterpret_cast(reinterpret_cast(command_buf) | 0xa000'0000); receive_buf = align_32byte(_receive_buf); - vga(); + video_output::set_mode_vga(); while (1) { for (int i = 0; i < 120; i++) { diff --git a/example/maple_wink.cpp b/example/maple_wink.cpp index a54ad99..9b9fe29 100644 --- a/example/maple_wink.cpp +++ b/example/maple_wink.cpp @@ -3,7 +3,6 @@ #include "maple/maple.hpp" #include "maple/maple_bus_commands.hpp" #include "maple/maple_bus_bits.hpp" -#include "vga.hpp" #include "align.hpp" #include "sh7091/serial.hpp" @@ -58,8 +57,5 @@ void main() serial::integer(host_response->bus_data.source_ap); serial::integer(host_response->bus_data.data_size); - vga(); - v_sync_in(); - vga_fill_framebuffer(); while(1); } diff --git a/example/modifier_volume.cpp b/example/modifier_volume.cpp index 5173ad4..5c3f0c6 100644 --- a/example/modifier_volume.cpp +++ b/example/modifier_volume.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly.hpp" @@ -184,7 +184,7 @@ uint32_t _ta_parameter_buf[((32 * 8192) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/modifier_volume_with_two_volumes.cpp b/example/modifier_volume_with_two_volumes.cpp index ce402e8..ad26f8e 100644 --- a/example/modifier_volume_with_two_volumes.cpp +++ b/example/modifier_volume_with_two_volumes.cpp @@ -2,7 +2,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -348,7 +348,7 @@ uint32_t _receive_buf[(1024 + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto src0 = reinterpret_cast(&_binary_macaw_data_start); auto size0 = reinterpret_cast(&_binary_macaw_data_size); diff --git a/example/software_ta.cpp b/example/software_ta.cpp index 4385d74..3db1492 100644 --- a/example/software_ta.cpp +++ b/example/software_ta.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" @@ -154,7 +154,7 @@ constexpr software_ta::point rotate(const software_ta::point& p, const float the void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/sprite.cpp b/example/sprite.cpp index 124d30f..7526e62 100644 --- a/example/sprite.cpp +++ b/example/sprite.cpp @@ -2,7 +2,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" @@ -71,7 +71,7 @@ uint32_t _ta_parameter_buf[((32 + 64 + 32) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/translucency.cpp b/example/translucency.cpp index 9c147a2..36e3e2b 100644 --- a/example/translucency.cpp +++ b/example/translucency.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" @@ -148,7 +148,7 @@ uint32_t _ta_parameter_buf[((32 * (strip_length + 2)) * 2 + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); auto src = reinterpret_cast(&_binary_macaw_data_start); auto size = reinterpret_cast(&_binary_macaw_data_size); diff --git a/example/viewing_system.cpp b/example/viewing_system.cpp index 3f86995..5e0f534 100644 --- a/example/viewing_system.cpp +++ b/example/viewing_system.cpp @@ -2,7 +2,7 @@ #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/texture_memory_alloc.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" @@ -118,7 +118,7 @@ void init_texture_memory(const struct opb_size& opb_size) void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/example/wiffle_attenuation.cpp b/example/wiffle_attenuation.cpp index c1a8f16..40e8226 100644 --- a/example/wiffle_attenuation.cpp +++ b/example/wiffle_attenuation.cpp @@ -1,7 +1,7 @@ #include #include "align.hpp" -#include "vga.hpp" +#include "holly/video_output.hpp" #include "holly/holly.hpp" #include "holly/core.hpp" @@ -246,7 +246,7 @@ uint32_t _ta_parameter_buf[((32 * 8192) + 32) / 4]; void main() { - vga(); + video_output::set_mode_vga(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. diff --git a/headers.mk b/headers.mk index 31dfc21..ac32a8e 100644 --- a/headers.mk +++ b/headers.mk @@ -36,7 +36,7 @@ holly/ta_vertex_parameter.hpp: regs/vertex_parameter_format.csv regs/gen/ta_para holly/object_list_data.hpp: regs/object_list.csv regs/gen/core_bits.py python regs/gen/core_bits.py $< object_list_data > $@ -holly/video_output_mode.cpp: regs/video_output.csv regs/gen/video_output.py +holly/video_output_mode.inc: regs/video_output.csv regs/gen/video_output.py python regs/gen/video_output.py $< > $@ # MAPLE diff --git a/holly/core.cpp b/holly/core.cpp index 90a73c1..d54a911 100644 --- a/holly/core.cpp +++ b/holly/core.cpp @@ -52,7 +52,7 @@ void core_init() } void core_start_render(uint32_t frame_address, - uint32_t frame_linestride, // in pixels + uint32_t frame_width, // in pixels uint32_t frame_size, // in bytes uint32_t frame_ix, uint32_t num_frames) { @@ -65,9 +65,10 @@ void core_start_render(uint32_t frame_address, holly.ISP_BACKGND_D = _i(1.f/100000.f); holly.FB_W_CTRL = fb_w_ctrl::fb_dither | fb_w_ctrl::fb_packmode::_565_rgb_16bit; - holly.FB_W_LINESTRIDE = (frame_linestride * 2) / 8; + constexpr uint32_t bytes_per_pixel = 2; + holly.FB_W_LINESTRIDE = (frame_width * bytes_per_pixel) / 8; - uint32_t w_fb = (frame_ix & num_frames) * frame_size; + const uint32_t w_fb = (frame_ix & num_frames) * frame_size; holly.FB_W_SOF1 = frame_address + w_fb; holly.STARTRENDER = 1; @@ -76,7 +77,7 @@ void core_start_render(uint32_t frame_address, void core_start_render(uint32_t frame_ix, uint32_t num_frames) { core_start_render((offsetof (struct texture_memory_alloc, framebuffer)), - 640, // frame_linestride + 640, // frame_width 0x00096000, // frame_size frame_ix, num_frames); } @@ -89,10 +90,10 @@ void core_wait_end_of_render_video() "Furthermore, it is strongly recommended that the End of ISP and End of Video interrupts be cleared at the same time in order to make debugging easier when an error occurs." */ - while ((system.ISTNRM & ISTNRM__END_OF_RENDER_TSP) == 0); - system.ISTNRM = ISTNRM__END_OF_RENDER_TSP - | ISTNRM__END_OF_RENDER_ISP - | ISTNRM__END_OF_RENDER_VIDEO; + while ((system.ISTNRM & istnrm::end_of_render_tsp) == 0); + system.ISTNRM = istnrm::end_of_render_tsp + | istnrm::end_of_render_isp + | istnrm::end_of_render_video; } void core_flip(uint32_t frame_ix, uint32_t num_frames) diff --git a/holly/core.hpp b/holly/core.hpp index 95c25e3..608024a 100644 --- a/holly/core.hpp +++ b/holly/core.hpp @@ -3,7 +3,7 @@ void core_init(); void core_start_render(uint32_t frame_address, - uint32_t frame_linestride, // in pixels + uint32_t frame_width, // in pixels uint32_t frame_size, // in bytes uint32_t frame_ix, uint32_t num_frames); void core_start_render(uint32_t frame_ix, uint32_t num_frames); diff --git a/holly/ta_fifo_polygon_converter.cpp b/holly/ta_fifo_polygon_converter.cpp index eb68ca0..db89a49 100644 --- a/holly/ta_fifo_polygon_converter.cpp +++ b/holly/ta_fifo_polygon_converter.cpp @@ -96,40 +96,40 @@ void ta_polygon_converter_transfer(volatile uint32_t * buf, uint32_t size) sh7091.DMAC.DMAOR = dmaor::ddt::on_demand_data_transfer_mode /* on-demand data transfer mode */ | dmaor::pr::ch2_ch0_ch1_ch3 /* priority mode; CH2 > CH0 > CH1 > CH3 */ | dmaor::dme::operation_enabled_on_all_channels; /* DMAC master enable */ - system.C2DSTAT = C2DSTAT__ADDRESS(0x10000000); /* CH2-DMA destination address */ - system.C2DLEN = CD2LEN__LENGTH(size); /* CH2-DMA length (must be a multiple of 32) */ + system.C2DSTAT = c2dstat::texture_memory_start_address(0x10000000); /* CH2-DMA destination address */ + system.C2DLEN = c2dlen::transfer_length(size); /* CH2-DMA length (must be a multiple of 32) */ system.C2DST = 1; /* CH2-DMA start (an 'external' request from SH7091's perspective) */ - // wait for CH2-DMA completion - while ((system.ISTNRM & ISTNRM__END_OF_DMA_CH2_DMA) == 0); - // reset CH2-DMA interrupt status - system.ISTNRM = ISTNRM__END_OF_DMA_CH2_DMA; + // wait for ch2-dma completion + while ((system.ISTNRM & istnrm::end_of_dma_ch2_dma) == 0); + // reset ch2-dma interrupt status + system.ISTNRM = istnrm::end_of_dma_ch2_dma; } void ta_wait_opaque_list() { - while ((system.ISTNRM & ISTNRM__END_OF_TRANSFERRING_OPAQUE_LIST) == 0); + while ((system.ISTNRM & istnrm::end_of_transferring_opaque_list) == 0); - system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_OPAQUE_LIST; + system.ISTNRM = istnrm::end_of_transferring_opaque_list; } void ta_wait_opaque_modifier_volume_list() { - while ((system.ISTNRM & ISTNRM__END_OF_TRANSFERRING_OPAQUE_MODIFIER_VOLUME_LIST) == 0); + while ((system.ISTNRM & istnrm::end_of_transferring_opaque_modifier_volume_list) == 0); - system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_OPAQUE_MODIFIER_VOLUME_LIST; + system.ISTNRM = istnrm::end_of_transferring_opaque_modifier_volume_list; } void ta_wait_translucent_list() { - while ((system.ISTNRM & ISTNRM__END_OF_TRANSFERRING_TRANSLUCENT_LIST) == 0); + while ((system.ISTNRM & istnrm::end_of_transferring_translucent_list) == 0); - system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_TRANSLUCENT_LIST; + system.ISTNRM = istnrm::end_of_transferring_translucent_list; } void ta_wait_punch_through_list() { - while ((system.ISTNRM & ISTNRM__END_OF_TRANSFERRING_PUNCH_THROUGH_LIST) == 0); + while ((system.ISTNRM & istnrm::end_of_transferring_punch_through_list) == 0); - system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_PUNCH_THROUGH_LIST; + system.ISTNRM = istnrm::end_of_transferring_punch_through_list; } diff --git a/holly/video_output.cpp b/holly/video_output.cpp index be749bb..b42ac6b 100644 --- a/holly/video_output.cpp +++ b/holly/video_output.cpp @@ -1,11 +1,14 @@ #include +#include "sh7091/sh7091.hpp" #include "sh7091/serial.hpp" +#include "aica/aica.hpp" #include "dve.hpp" #include "holly.hpp" -#include "holly_bits.hpp" +#include "holly/core_bits.hpp" #include "video_output.hpp" +#include "video_output_mode.inc" namespace video_output { @@ -61,25 +64,45 @@ uint32_t get_cable_type() return sh7091.BSC.PDTRA & pdtra::cable_type::bit_mask; } -void automatic() +void set_mode_automatic() { switch (get_cable_type()) { + default: [[fallthrough]]; case pdtra::cable_type::vga: set_mode(vga); set_framebuffer_resolution(640, 480); - aica.common.VREG(vreg::output_mode::vga); + aica_sound.common.VREG(vreg::output_mode::vga); break; case pdtra::cable_type::rgb: set_mode(ntsc_ni); set_framebuffer_resolution(320, 240); - aica.common.VREG(vreg::output_mode::rgb); + aica_sound.common.VREG(vreg::output_mode::rgb); break; case pdtra::cable_type::cvbs_yc: - set_mode(pal_ni); + set_mode(ntsc_ni); set_framebuffer_resolution(320, 240); - aica.common.VREG(vreg::output_mode::cvbs_yc); + aica_sound.common.VREG(vreg::output_mode::cvbs_yc); break; } } +void set_mode_vga() +{ + set_mode(vga); + set_framebuffer_resolution(640, 480); + aica_sound.common.VREG(vreg::output_mode::vga); +} + +void reset_sdram() +{ + holly.SOFTRESET = softreset::sdram_if_soft_reset + | softreset::pipeline_soft_reset + | softreset::ta_soft_reset; + + holly.SDRAM_CFG = 0x15D1C951; + holly.SDRAM_REFRESH = 0x00000020; + + holly.SOFTRESET = 0; +} + } diff --git a/holly/video_output.hpp b/holly/video_output.hpp index 64adf0a..cc34016 100644 --- a/holly/video_output.hpp +++ b/holly/video_output.hpp @@ -24,4 +24,11 @@ extern const struct mode ntsc_i; extern const struct mode pal_ni; extern const struct mode pal_i; +void set_framebuffer_resolution(const uint32_t x_size, const uint32_t y_size); +void set_mode(const struct mode& mode); +uint32_t get_cable_type(); +void set_mode_automatic(); +void set_mode_vga(); +void reset_sdram(); + } diff --git a/holly/video_output_mode.cpp b/holly/video_output_mode.inc similarity index 100% rename from holly/video_output_mode.cpp rename to holly/video_output_mode.inc diff --git a/maple/maple.cpp b/maple/maple.cpp index b9d48e8..3ee4494 100644 --- a/maple/maple.cpp +++ b/maple/maple.cpp @@ -116,7 +116,7 @@ static inline void _dma_start(const uint32_t * command_buf) | dmaor::dme::operation_enabled_on_all_channels; /* DMAC master enable */ // clear maple-DMA end status - system.ISTNRM = ISTNRM__END_OF_DMA_MAPLE_DMA; + system.ISTNRM = istnrm::end_of_dma_maple_dma; // disable maple-DMA maple_if.MDEN = mden::dma_enable::abort; @@ -169,8 +169,8 @@ void dma_start(const uint32_t * command_buf, } // wait for maple DMA completion - while ((system.ISTNRM & ISTNRM__END_OF_DMA_MAPLE_DMA) == 0); - system.ISTNRM = ISTNRM__END_OF_DMA_MAPLE_DMA; + while ((system.ISTNRM & istnrm::end_of_dma_maple_dma) == 0); + system.ISTNRM = istnrm::end_of_dma_maple_dma; } // wait for completion diff --git a/regs/dve.csv b/regs/dve.csv index f12d65d..c13c96f 100644 --- a/regs/dve.csv +++ b/regs/dve.csv @@ -4,7 +4,7 @@ "VREG","output_mode","1-0","cvbs_yc","0b11",, ,,,,,, "PDTRA","cable_type","9-8","vga","0b00",, -"PDTRA","cable_type","9-8","rbg","0b10",, +"PDTRA","cable_type","9-8","rgb","0b10",, "PDTRA","cable_type","9-8","cvbs_yc","0b11",, ,,,,,, "PDTRA","video_mode","4-2","ntsc","0b000",, diff --git a/regs/dve.ods b/regs/dve.ods index e5e9db07df6cc7e36d6ca2ab6f5527e9060aae37..4ece97c94da2fcaa5a0a8e9b6190d764339a59c7 100644 GIT binary patch delta 13813 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 nQlNiE_ut9!h`V delta 13420 zcmb_@XFQxi*S9XZBm|3)5WPfLokSu;ThaTfA$s)g3JKAcuzK%pu|zLRLag4RtS)*d zdgqn68a}Y(c7%j07nY@?`twHI}jFIm_Ve5?YzeMnq&mqScN}uuRZaccyxW!@GzMnPkBtuQoWz{Imbszk4O44+ohCRvRtnhE7ex&^ z^VdlQ=<%L%C#ahDRa4O*G*%BSSn;vRatfcQ(MHGljCD&Ir|?YL30sI86^%`jIHj8P zH=^Hk8XAvl9JSnypHX=fzbiswRj6MpVOiSES@GfRML@upZ5ire(I2s<`dir%1$0(k zZ(QQ@)M723)Ms<#{m#f0Q>6oDHWXrBdN1wk{BD_=EUMrG{jfJI%i-q-1HMw)=&aIlj?eW=xr$Q!<5j+yF8Tl0i zs-`}c(go+!A6vd%h*plhhaa=QJQqdvL{FPX9-`j<`e@f(GBi*d`;PrE9d zN1Un-47+Aq5zIuQSqiR;mj`DeLN2p2*B|=Yz7jlTm+UlqLq+VFeK;3A23eA%WJs@R?f|cY8Cc~?JfMnE_qcv*m3~pZ7!a%Bw#XBwxLVc-Me>gglkh!0Ibg^1 zKEkJ8j{g~~;2LPEx8_DF{Myj8kX0)a{ z$K1?I;&}zq>pi@m-PB#^b{lxR9ch29Sc!6h)(aAAXGiqs*=BffZ*Ew#&=J>L`lQ-q zpO>t=`i*Srzs1j11m|=mxGyA4a1G%gqxib$8|CtYSw+KGzw;DE?8*)+mm7xQ@jZP? zl2GO`uQk=PwhnA-e^!#!!oK4bPub{Ue`x{_%(Nt~G_-HF%6ceLR8!(o<}%+WHXu~|8SAQ(5z|oiX7p~VqaijYO>uLN zNDxBt^ese8s5efwbh48AZe}l?(`qVPpw9A zFgv4!J@&2m$17kGH@L!s3ubY+Ooj(Vjq;m-Xa}(sj`%)2dVAZl!IEkcjn$ehvMr*= zGd9d4QaHp;SRpUIFKt)jYm-H7RsL{V^v(5-^9qskkeu&-1J9v?aZb&OKA(^6$)I<3 zAEet(65apx<`$bcMNWpfuoR_$Z%{tyec|3y=?*KX(T2CA_JoO}+BbL&EDQi+=#u!dROG~K&N`2ysW-r+2w(yUiI zu&wSW`zefkvptj3{eNSxyAu;EU{0Nn&P zjXTcz0Tui9aK4ynIVT=O*JCPP(rG5{SKH{Sz>f$yq8Q2hEBm=omA~qC_ONtnU8RDO zO0?{@>E&?>deD|rbfaKx)8Qu@L$u)`Y#}o5fkKCq@!I6X8t+3!c65yaGA*$OQ$$5U z*-+XiBQWpsZRV({sO(sl4|`<0nm1>qHKk%2KPFT8h=+Tt-}240=f#Y45m6TP8W)Uoudi}!}F3DT#)CGUAhnk4EB8lnU zfks^N<+g1*7xl@ilhl`*j~mrq7#pw||JXd#(thSstTV&Q@WEOv%^XIhFvnswWlqViCvXHPBpt+ z?u4QDUJ4{h(<@1Pkjo4)?j^Wp0kI^cT2x1UZ+(Pt|Fvq$u3fU|DZ6KJ5 zY#aSz{=bG}b+#UsgkQS(1mp4!Ui3Mv8515$C!z9x zH?w*9aH5W)e-%FBEow>Exv2gz%f%hAoatv>?rU=$c6Vtzj;~c|he)Q3Z>&n+wj>++iDE)d&KY+jCDp}R zntDQNbTg5VH zNS(y)d>*SXJ4?lhJd-4(TX4Z%t$I;^KW!K2?yc4nBp1sFBLO&N1t{A3ECnZ(S%NINnzTzZER<)Zt@6A&cp)dNC70B_N*!UG7 z_T&7AN|$@dtEE=2cxRmMu?l?@;#WVL5`BO;Z!^u#9Pg1z%4C&mq|B%*dP@7 zvRy+4$0z#53zH(>9{m#9A!Py5yE5HQ4;i#BU40UgB$J{>y!UhZFVX+T_w zUA_h|@818p+ei?b5?>(jGk-r>r1QAoK=)SA%>$)^!w63up@L?1mmd|DiPOfXbAf^T zO!U5%gC{n{)WFwl!}CWv*%9cFWpF$W35Q1%-dxr=1tD%DwipwR@*Wu$S|ss6*wFTS zIp0xRCXDI+loSnz&z(A3uELrX6mWgOzq{hbUdOhWlSR_FKNy)3-0yWa2d^Z={vg$o zM3bKgTlVv5Bnpc(mz1g}^J`o{;`eVNLabf9)q{^i1ZbFbjO2yH+t1w5BV`rb1y1g) zMlZ>d76)P^BZ;#*?sN`Qzged2KEjG62{*a7|AoG#Ncd|wey0IT$@~g{;pXpJSvMz#F-YU*v6uF6;eC4L zbieKoWeGntyW2(E1C>H1--bhIR*i65XeIqU0)u8+TUav5Ii*^mNvX@BPYUUG6lKyR zK6m>qzs`N$mzt6~o+@ab-v)HQ(;@G4_x$vsA@*X1_lc90KAnnIHrl!f@-E1sN<7$o z=H018Rl=de)syg=^1dvoN7ZU)qM_39XFS|3%)g}zojezF9Y24wFYpZbG{-FiuRqsIpus; zd_rni!M=|>FYM2pC&v7Pmk3XzJtl`S`Rh_lewF$IM6eJD6;r+Hr1)VAB^o}WbCRy3 z_aXmWP!h+HgZgZ-S5t%|yrq7@bmD>eILg=USC3sKL)+#SG+WT>gxyt#_pC5gt&d|^ zmR_#kgK>g9o-A@Sh*TFKn*1?TE;N2akNq?3xmNp?oV9PP1IcD$@~5|$>94;+vJ?1o z-k(|+<;0o9ZEq(@enWIpMp;(2NuJY5`uN83hj}z!l zZy{#rL|wC<3ug9B4|7VF3|$btT))a9Hmbd1O_`vP-%9T=sd>J%cF}yIpvd+SSR|;VSpS#>Ht5 zld*-q;KM&htagUE6Y|S;1bD##EL$k|Bv+%xpLfi>3@I#PUjAHOpG87D4>c&7%Q#1< z;UxqO_rRVyuZ52dfJArXpOFjEdKBSC|5+%_Uya50t<&)>^XDg<Fo$JjUzm^j{Kq7G?VunG(k3H`}h+NLBH85nL}AwrufjIX267e&FZh=O1WW$zxTWNkk-t2v37o@58{wvP>d<$~2EV?^1b4e|D4|2P0(p%<|8k5^6zw!+cgwftv zMO@G2+0?Sp<037H$3B*fq=dY8z9&1(EPg$26mA1ru(SS_WJ*>#u;&JEyXA1+EF3b@)t!awFEdeS}{Gm2A9 zwpiIrhuoYtw6$a2F_S;Y6q5H^XJ8ag#r^v5+_0Z7?P5=5yZ3DJY#FCOV@GC6o}c(d zax#JW`%vl3ZS`8ISPcmM<0n&{LKyol0B6vCv04DHeqzkOxgm|XXNLzrAu6GNI4+kvBwPC)FF{o;VyU2g@#>Gy_C<8~(UuccA! z4%O@CpS*+6CT}18q4;T{%yEXaqZlM)%eEis?Sgbqe(Yl=+7THtc=BUL4Bf)joF>8+ zf|KYfF8BKFGtpdmG#)^zvC_l2UI10+U9_KxwA+JGl6o0x*+3(KIHed&h5oZX(nBMQLONUz zYUQ`@X^8LJpWP>Q-T3483(Cr#xpb<+=2bbEavV|-0O3N@$}7{49~W`qS$ucRFY&2h zGsR2xMI;uBs4B5F+MoJ1H?udP@qCvj z@KN^EbX7L>=BAiS5p0(vu6#(4g_9=hw9Ig5@D#fRAqJPt@OpnQqxNlzhCr7X9?v$3 z_kEwJLX{tmU6|+Jbv=M*Zbr6N6`gF)KW|5Wt+LN;{)KbS%q*;Y)kj68m9aUW+3Ga# z!We0_%lEqOiNlEmM^f<7)0p(oUzc{T2fqw1L}k;Di3tpabzBS5)J&b3OC8!hxymdjDs4IMl0mI?(53;m2RVdyf><(2&G4|W z`XBwv5MfdN;{fozZX+ww;PfFD)+tuH)>O5G?;98JfLfpx?*VO%UyMTAIs&CWzEHk370I@r~q}a*`y%%Nsd<0 z__RwFeL1l4Ng6VeDh^dj<8X`Nd#@G$2K+fv2hn}c0TJ9uBoF@Lw$7CEk{S}4GUO4r znoB|hm#FWaj`bfohd58szngEMG6;VkHf>lWsXs!cd3Z(Zy?xL7XgzLu{zBc^ugg|u6N^PRGr;J14-=qI zgMEY2dy5~Gy@}=Ce_O>x<^MiZec~lwa2jEDSKzu{XLqfFc>xeEKe5!e1sB)PNd0+>;5i(;0lY$e~sZ_g+4@a z=fC1T?2fXj%g)J=*EBC8HBc)W`F+9kt%2`QbSYE(P0v>iDGln5*NM*0e)6cm_3d7< zYe=S1zm9)N8_by+U|`o*@;TR?e@ngiBcC<1^0^yNyPlQ8ny=;g4@%vdr|Ton{Fd3d zT7ldI`UP)}iC+Swk1Tiy`uZd)K!-)z9UgD4SojK0itNJuHP*(2ek}{Sa`v@zyw6^d zGtRSi*$%o({u~yd6O^vI-0Kuw@h&Obn3gdoH@^XzwYFYTh?Cd3;uMc7a;1L4-SEV< z=v6|DUQl*YzFz<3rmc4T5F|b;T&&{R7bgH(HYMy9>t(od|IUuiOsJMpN2zr7^7*~C zEjgR2Y460*?(@V!8G|Dj2cLK-+9hn-FP#2s;%L3(}kH4wU-ZaN0vNpc)9pZ zGD)k4`gdn_ZmCc^D`TG`x$Bqs{8uG%#P5SZaHo2U(fi!MnA5;WJA)qnA>!EbgA6th zPe9d9B+FrQenW`ZNY)Zv_xY5k=k~>aS>0{p@Kc<8UMy8v5t@NdOWVoT7I4?&BSyVj z4$;%gPUsCQqnr~U_6rKuIpl5-uX#<)gEzx}G#&BKsBT(tBz(`uW|n;LfX!x5szc8Ar%ueIo*J z=UP9{r$+JGmE{SnUnFw(3f!&XPGy=!mJx5OG8t=Y7d_=|Fxl24H8k|QT`x9VZnp1- zQ=^1N1Z#Km<83&H?S4lKUvVR<4Az z_H~?xPsJCMM%6n?e?hb+3^iVFSf;J~=02QOh};}#jUMHVJQbS6P$Ra|)zYluuW*m@ z%Cu1_UL-Rd;!1Za8!ji}g3|$^!^P1i)XR9tRI)H< zwyJRY>zfM0Y)#$xcL}OuRd$YLwjzMQGo{NZsC50jHSPN3mBM1Hb1aD{JfUQzbsYJQM$6ta~%&MEW8_ zW9jVjiEDV`q}H;J)i4lHoYcc|IF_3sKR>{&|E*TdDlF1CAx{6^0Jp~v#R<*It~Jit zbr+Eb@AiMD#&T7PNa_A2FHPch_n_Cvv&?y!Ln|r&j&H^~qUdhBz@5m)8|ExK_cau_ zK}t44WzXZ~UZ7eSr%4{xBj^J)gIU(l(@Vv(QcCEqc=fqkOtfK=&FcNe)kU z>znnBKWRP6T0b9It)1KFN3o|ja`7$;a4U_D2;oFk@QC^8MOdGeKa-R4n$n=xxAC8S z6k_GS)pkNX_Z2OOtNl>d>GP6_t{y!eR;AXbA7qLOEIN`Bl(LN`V2zB0y;q!pgTs93 zNvdt4%3MzC>YwAQfxck@Mjx}%tV_)kZp&qMQfrPee>b!ZGbl$u01?3*eU4Jth2XrK zEZd~L(rSr`UX3)2;HnM5r+Q;e3wNP8QXg$7bNqQhTS?gUohJKtrK^UeTb<14$6r@!rq2G($8#fyrk2obfRyE+%6 z3&Srot9*(gPo1@wL*d*pdPecaUd>~t^7ke86$E9H*7dp^*pg^_^Yu)+SCD*@ z1k+hSRpbkBgjm4^;#hUBUeUa{j?(LE+y}LQL>+g*eAUxr2zsQG_OIt&uzHjPa<5@E z)d$vJ17-1R)?iT$?oK;IG(s0W|A1iL$v1P*MT_3Xbsa+F(DM@zEWr!rR)#`vkst*I zji(4n`UIrI zVoQ%y6LS|n$=<+)eA}PW*OV~LL&=@=+G@t{c_W>KJ5*8V<=@~*{y(5N6`BB5|KF?# zZ6ARPlOr;ulg7;kKT2+K+Lod0d=w4M(JFO=%OS7UT4#w62FRhhW01&E5EI}98?J4V z%h5;cbszXwqcHCU5s8~)8mJNP5To*jLr~+17i@tWIYjPi?)@7KN%4a9h6NIXwZj5j z1p+_tmo)E#U^e6B-Eqbge!XK7sJ=&qyI`TKD~ZP-TUzIHA#^mq<3fZ`>caGiZCs z8tU9O+5LT=T*RSh5b3@HhP0KjZO?=-ZGcywQZuq zHe3Na*c*4+Thi99>tuMtBzkO>n~y=TzKp2STE2#MmKIH4o&FVCGbv{t)XXGO}Zye(xA>3=|o=o?sLY3KJdoi z^iaWuTZuoAgYgtWMt|*5(Ixv*^INmK4^t7ugy{S*@Sr^Z!RqSdoY#8d)n*gg$P1RS z3@%n_LI;4@nI4l_iXX-JN%7BfV-efyvz{E*uNTsH60 zl~BggtWlBC;fXr6DiC^xWLGDuNv`Ea1aW~0)X*vlpIgwYjP))aIWb(CV#6WJ|X@7d(ktLw6mAE+Ao~>>E{OsXX+l4Sd z{;D5gT{Kx!YXpCzzj;vX?|t<-?LwYY)`7XBZAGY3t+W!=Tvf-TC5YnSNW=->*6qKKzuG!v92SrW-uPU+ZYAk0ZLGmtg`Galr zcE$5APs%{^VZ6s$)7$>AoO1gwOu5D`-m&D@$#LIOp9)D96=}t-UT^8nWSOr-u7+zz z@ru8~UmyKe*c*1OXe*if>nLl!q0Eyq$a{Ft%qLW`HlwJseZp+$b-Vz6 zoEd)%ZDB`1B?min_2sYa-&Q%{y`4Bp$B#qJF==)pJ+ke7tIxF5Hn!wCvb{fR_gY6) zZqv+ust8hqY2HKv+v2aA`t(^PZvWk?`Yzr0*IsY5*4_GSR4N?NZ82YtC=P-#c0c$y zmkgD+HJw4`5{CI)zXm0M{IYDp#H%Wdb(E4*yqag}3QK~TwnDQ?8QHPzWwUph?A1zD zhu<#dbZbKBtjn=q1JvfG5t35X!Nl+z87O>g>r3h0uMX+}k3)8$6ciWWmnQhyEha=- zMA`$R^SCb>b&yW{N(Jea;s>DZPnh@VxA4`F+Ix#&stY3C&jDE}zLvUH4;1n{64%-(nw#ANaUX+lJvQXG!I5Hqt%K0T8YTj!+tzbFu+d=XA~YU?vdFvQK8VEB zo$EYQePp)`vO@ zBq)}E<}@6GfEu~IAj~-Q7W6oOS|f*A{s5pH9UmB>HXbJe!rikIFdBy`bYwU|p)=YO zNRSn%eNe*rW6d(?V#Ci3CU2O*cB!5Vea%L|%XyA{)FGmc5^)Qpd3x*a{(o`M2ex?+ zF?Rx*c|2=j`?~p)_G2F3Vto2Y_nIiLV>m`s>JO+9j?qQ6*~S7(V9OL9FQD%N{4fEc zrNW6yi@^0LGV+AkF0DLChPeYJ{*9Q^i1Q5k$TgiWdvoL{bhXv?&kvu0BOg5NU80hy z@|e2hH64uiEs%YdnD#%mZ8`*Po1D%-bKnlMRs+f%Cj$nCKCt^uXqWBxEpnbP51WSJ zD-eH^96mDI&9Mb-N_YW)TWy;dOSjzq){9KuF8)6tM?Ir0OkHwh<2Z7!+qTNT9z$#Y z;iPUB=>%rgOM-}WB(AB=x_;P;KJ6&t_(f~(2`rC>*?;4fF8 z(ReRdP9s!xRdq}>Mx13a;M?Nu*OG(i#X5z`4R`d0$_3atY%s$$@bD1=s%tA#8Qlf7 zOElFWY&1X0z5!dw1<=*@LF!7e2VzyU&a^m^fnpqN6 zmNI=gjM6W+II^XM7o-K^s^QYxWeSi4F!Y7=Zr%g(fprE`Z(zsu0+Vv|$5B11w?xB(+@>Y(NK6%b# z&YHjV99(vM5?3M{b8bScYj$Sz^t(2Yx6gzgKrGw2i@KftMGy(wn9g}lVlBtQSPk=3 zXR64}$zx^GQRnXV`P`Rm@+Hp__yAyIGj*F)bZc|m`1SXAUA4u1LrBHMd%T~vQuh!) z7kvWnM}4_ygP3J{U;D#~EAnQZarb>^(_R$nADNqU(Pr6gl5es!?>ci+c={AEt|M0+ zf%&wrE}O+4Siu*j#;e_=!iQDKmFgy0DHI@(aD0(a=eg_;8zB^ZRUx8f{ss&Te}vs< z`~sPyoYHtW`vUfRr`F-F<6$i?k9RG=Q^Z7*l36;5|PJO2f;c1TzMhM^VRG}Qd-uV`n*$!mXzyYW00 zNb0yfkcx*e|EbYU9@95B;RN=7kcM?8*AYja9Qz-&UV&Df^`b;pyThZ9o>U}lt+_|iji>Z`vD6=$LqtmkxpW&~P5LL{%6wii2k#2uip^=% zhZ3u}#4RZt zXFOr^qxuMWDWJ`^YP-0=2P-8LQq@9xdI{FNwcbHAo#(j7A@3wi=Pfb}B2Woqk>{g5 zV{fGnK=rK0Afr{)TR-Fpl!d=cBIMn%(VVlpM~nJ^@vEa%sJUPB*v5SG4HYsP*V^$7 z|JRER9sVigUazgtge}hi3Jo#zhFzYt+E(2nlNS(*>Fg!C$KSO%)d(_ZvS~rzdP`6F zQRv}2*R;5+O1Dl$9%fC{8bY13ND!*F%}&t#p#{z41=}V;$suga#AA43AmBd#72eDX z^KjGvVe_o*<UT6^q({SOgh+c>rKIJI8fh}ByF4#kZ7_t^5x-g+O8 zw=`Hbo|$`Dk@}`!-XGiz9ZcT`-403+6Al`%BX=~dzK4PJ zHvVdVOZI+td)`OrY-3J~FrGjf=Cso`6}hv4JOY8a57MqSv@XE@8(`=%cxTww*Q3RI z-XGR7Yime;6m#T*4j86-_`@+FO}9oqg9N&`dkDH1?3?S~paDE#NP|~L6&TtoSm7Ka z?mResz(DfW?IW`~xG}Ta>uEyIbKx{k+G_gmuh16y2VpvG3!$^+&|PqI9CZ`gKs&<| z)~z}>j=YuLW)|l5^yJChPh#jIiq><^cFDV_3@~U3+==3Kmu9L1kb5d#w*Z60S-M7{ zPsYdu{s1R;po@-{_{h6g8!X2+1jvdr8-lvC9rQb;vqD7?rPPQcoszE@PlO`t{(+}C z)ObzaM*^~AjbqBd*NrGe;QCf9GdH0d!S z6%MD13{wJ&^SL=F^Vvich7U?ShTEg`S^eZ*to_u8mJAE{1L8Ml-Yq~U1UP=2E+_yL z<+mpi1ryq~ISKqLYFX0I&L23|ugEgg7)mVj^Wu{RbZTU^<0UhUH8kOta|b_44Q|KN zq(!^Gj1j(jq5;4V@yiWmv`2kgi~fJdK^497X>)n0m{RjI-I}_W-Cc=hZi@=?$nH;9 zX2*xzUibTMtx=)za?>jo0TU`2AXf?86NLFdhI`&$GN9-8t#*-)yTOWjOcEA8;+QQR zuP=DQEo`(D8Yfx4zgr%N@r=^y_%RkW=I}}<|KO(}bzGx3an2_e}?8rR{ zW{OciR|8SI=V!G=UwfV+uD%5xuZG&)jlNEx4#tG|A5HkJXZ!(e5<(Xz8lF&`ShRG( z84!-&UP2d3cRXP_4L5l6UgS$l{T(3Vq=*Esn0@+LOh*%b6I#LrP&V%L{`$(7-S`M? zaoHoOa4RX?={$^XB_^>1YVN%V&bQzChUhV6m+3iZ{p*^)n z?x~S4nZu)@mB~Pa(!h30EE5~cMQnHH!${uSwU#q*yXd=ZePeOY#w{#9aSyTOI7Fgw4y@fxmwuUauH2j8q7o&gK!S(N-ASN50(Q!)`UnJgI2cHt@ zJ^Km#VRfq)z^!8ZW{2i@&4c}yUIf#KeT`C)d+Z}bXU^@B z<^mt8hIe-F5D?x<<%k`+xOk-fT##<_vx;1Oa>U}To2B^tV%w$GXEa~zYxvx-U&#dl z_Yzo|M-e)DyasNlc8SL2WLkaU-(%6MygMXB*Mx2%@HzyEKpl@FyFzGBH}L>%6Z`;b zU77#wRQvWT!L1|q|4f1ZAEN)D382QiW%|FD0{>$7R{(hb5XS#j`u`Hk6UGs8eQ zP{w$7zj*uh`!trqYlv*wOOwF=j8~|%5q14XsL5}!e*~aBm0*BB6Q_drW0S(KC5Zn9 zp%6q$p87 z@x{rhJE=aT~I{-ycPD@DZruK)XxciY6p)ywXk3!kUG z-CL!9PUD{e9Pf4i^9BIve`)vo9z0VD#Qc}}zwZLv-Up!lFGRjH@JT7Qe-ND-e0(Hu a8zjPWd!K;%zYrA*!IKL1O4ekS+z08bXj50Y&Ks1*ExjcXx+UBb@_?fOOZ;C>;ZWbp21? zd;fa>f7iNepKtGd&ptQS-TQpI%4y4q;5h^hog4(h27w&)tl|l@(0+@zkNy_mM0;Ue zy#G23i~MW37RF6{h=TnG4ucboP{@A|6P;1S{>Vy{Kc0yjD3br^!HHI)gnuT(#>V~~ zt=0%t8s(2M6O9fSbXa&u+;+}`E~+0veu}N$hdcIElgl8Fe=HN6NSDl~PD@VF3>eGM zbNtK~J8-hFv{XqZ+A0js`O-L#;8Qh;VE#P8WuM7+Rec>L;rUTE3Av*JAs*;QVvDY_ z1WD2sHBdzB57>>vh&2M@+7ExoMrS)>7YefxXt{p;SsMb}u^5mSx<^Vn2A3Ny;TkgL zQ^?`Ep|%=?QB|e&X4tX`=#`FS_A9HPVk&Au62!qg=XQ0s&bBpXwTQSKmtx5+{_b}X z5{I-bEY3b}HK*?tp&!J8q3tlroC2FAWLiCUY4^ladQ41)1}us~-mgh-8xU-2pLJM; zH?wM^EY1OI6$egLww`3+o}@!k{$qurK=ZDbBhI4A`t$p^s-bJ&t9Ngv%C8zsZ}1=; z0t|;E#)Ip|)_Ii?V*405%>+>D?h*aitJSr=q^!kn9!A~!NUa5A+kJnePy93epxge| z6(+R)ouyI@x?qIK@q{B1@W{8PR6WoQ=o@`san z!}=iOtRNk4cw7>P{?kJ{;RkW7t7+_!{a@oS%|blldRVnII>|6# zXdkotUUG*8xdF->(Pqr)?^r)&v2n7$FA1R0RMDQ!mZ^L+cuF~o#>KH~L(P>uV&qnD zkX^}cX~er2Dy5$)5mAwBs3L&gyC3(pLk`VespetxwvZYsXl+EATu4s9{cUfWbvs2UY#U@&2il(J%sIx3Iw$~ zpyg+!RR(~Qg16Sm7PTD%nUy-(-6-Ds@}4IY!fS&?e9Zf$XP&P&w&DfzM}B!;nCOCa zzJ!CeJ#?>mBsjBvdM3w`r(9-O+AfxQif&etMD5nPx5R;eD(g!_OC4|1LP$04nU_LfHvGm+Q)Ksh zAi(vYpt;6^#V8FQRz8j15+Fk|!s|O7!dB8|?agb)4r8J7}W4a}m2ZwK&pL zpa9_XH@C2_D4km2y-D^}A%G%RDu77j;U~nBQn&T6lq21yzL0E=kLZ?S=F&yk*MzWI zwOcJsHr%TDKD{5oJm-v8I2Mz09&kR!i{13f10Wqgt)5 zA510Y-Y@Macft)`T6?s!etGnnS0hAs7}$Kqfgv6KJgHBv&(c|Ltnd-XYDAt~Ws6NU zxv^Ho50W?T#~WGf9$2(zSwaqW15M+Io}ORk4eDwLQQ2$h>=o_-gDpi?`ou>r4hYh62tSVW<~HNT>6IA7V1DZwl0UAkCJ+~;en)$$3NnNR(I#$@{6Dh%OW29s;8IMKk=Rn8MUJsiiF-KuqByO_hqouLL z77i!oZ!_Sx72GQEW2GH8!>{il;WwSryrTqm?op*V`Mhb)Z3qW;Cus$!V$jFEK@)UW z*7WMdWQhb$8K>!0hXs7=0Q!*4AmB?rw}M(1lu9UrNRDzW!0F9o;AH9YS3;Fa&aWt> zP=_@x+>?&tH{;D-_Idic4j&8y>t4W&{IL|AiJ;or_!hF8QiUHazu7M>H`&0_?zMH~ z?_UIv`$ON{4A64)dae4*=J{KS=V^MC%S`4~N-oOrvc$|6F>xh>kRgG)P{274pLT+6 zM`TQ~zVWC&0n*s!xr5yE@EJx|9B!MD(4DB0KYj`ESBro$-252)CHv~- zDe`E@roFE*44yo{G;zCdv2`7q%kX;Y+Gpzw*FsI&(#&P^6v7_Hn3xtBEkKb~;S*H7 z%-6~gH9nsibQIg>q?`kG1gS_SS9P|>jqevw_YA@X8J8(MIsti!=|kxk@zEXIqcTyT?SN~=9bmFjsH zb~{%ZJLH;B@HistSw(1=YeM0QTvX|H2Te8M0n6BoO8XtLeM%L>#I#D8Z)lZzL!HiP z6n8D+^5c-lc(+BHXJis$-#c4zILW-MQ7v74OrSDz_px?1u)cxO*2VR_f9iPZQI2GP zf2y?B;EO}|T~-$3hpt)!yES-6SPoA=DS>9YUcExX?_W3C#cWt;gfvziETyRn*{OjqnGbfJ~fUeAr_}Kl+E*Zd2}qCucW}q!DXe-X?&-K|5euR4aY?Y zDN=^%##)@RRg-uf9tq{Xh86M*&SI?&dM5yI!a81KMn8cQoO8*|8gCy^JO0+P%nFtC z+0zg+9UlOb>$)j3XTn?@hscG36>(zX7%!9+fK{|Fdx7#ds?h) zsALUNc5FO!_LTP6gbts^_+_1END9KpTO}pB!c#2?p>VTIXk}V{7ho=mk;{)kPzjXp zifCCRBH6TNbWa(1YY`uUZ|u_?3V$&in~Anod6c#3M4(4iF`vbJ`TdMatJ1%ptSCR1 zZkp2cxXYv6t63&{jRokLd(V}@jdcYx9Y$r+)J{!p8yG5xDxyO}OLnd;4`AYvui#NTOzcptJAwLbGz2(g-#*4l7lo0>!VY7`HwB7-FX@I(mMSsE_9Gy z4Sp*qVdwrR5{?*Q2r^HUJ`=mk?VQ-grrXUGxKE<8FiZ#6b#M;6r?d6-F_&gh)yo*a zph)b&FyeZ+_?COEPw1aQ10G=z#xVm~1r zu(uR3S+tkM6z)C>|B38lNuE4ez?Tw>6H+*SB$kCMcFGPAR4XY~U&49Q_45|kj?or^X63(}Bcy;!BF z;fwUv%{J)O-G|m}J4-V87x%Zx0@e&bXyanzc2ch(QeHFg&1R`DzW9*?@uF<)gGSpN z*Y`n@Jze@bc+n~|ERw%4x&pk1hOQUfvnkQ~@7- zjoPZ+>4&T5)%JO=u))QW{dpuGKE!z6ww>5jlo*DIrgwxS$kBw!^5%vl}?2@Sx(GnIaWGQfT<1g7;LtI?;yFZK#9HGnE6&m-#CQ0Sn zqC7aM%JI2UC>;1kob*H|(_3q#Eakha(*3YK1*0AsX4^;&yj6M(skcM|kvv-mbX%H! z;w?_EJ6!1F@hCIE-fo+|M7UkP4y(WN_NEjdZK+*G7hpZ+58uRxY~oOVD(^Fh`7!Hi z-+i|4=mI*8>9*+mUcz2c3?RzrMgQ7?Lk1d%b2OVFMA_vumvdraQi z@VSw?v2pZ=UdYg&d0mnFYKGn*S&=t6%ij*qyJE1CSDyqMlM)goR7P=ImaSV2&5DG{ z7VCU)$>BRw@Gh{TdK{PV;LRbeSJr?@|J%r3jOHShPeHvk!vG%p=(7Wfs5j(NqnrLW zyDJCWcq3{)y-KSTVCj3IN7If;)g8^>!Q*xXAA!r=;#7nM@sGWI4QQ!mckFhR(eYb} zLR`)X1+I`8HwpwpA7#&R2AZAtj-0S?^w~Wr9E+Sq-7^kyq^ZAS>3k59y zS_$dZFWooMi+h>{vMlpMGTGn1(!!~b&2!Gd?Au1-a zO+@`-2DFIhfPLVpC>gl4A>l<+Sf9SkD#38Jj)Scq;!vKj_~7iE8=4PY(x$xEcFA}t z*6-M3qJUp|UrVhwy1cgT?)Iz7XqAF#=AMtKDPSvqV|Tk3^-_1_IR==UH@MQ<+T+@u zbqa79IkRkBX>FpF$AoefcxS)GEH28o-L{c&0eC&;Z>B$a1{K|1wk^T? zIfD+0Y#)?XA%QZi?;`d+kjGkS%mt9mcJLJ1-7eNGmC^(K{Hx1vGmF#0Ga)+Rq7`8% zKx2E^J$Bg#+X6u+)i^h_BgOV`>=LEd4^IM`TX9j1eX#ti{oGj5ds+aV~Qh+ulTc(s>l{#MWJ_L^-34>RMfs6szdW@ZWcz|;Z=OndVgzw zD)2icx|bj2<6(h7vK;@WM67>#g(V6mz^y=%-1l)u!QgDIq_$W3cbn|s8AAcRX2dZi zlTB}&Qv#D@#~u1qRSa4-q3W#k6qSl{JG>U*)^yc?e>9FN6vNqEmF2C)trX`zrDW#$ zs(NVTr}>8Ak6a$fbS9!1pWSCDtl!g~g4aoXSsTe-pL3=&HG@rxG*FbRW6^GX>VW>5UN@7 zjfxhAjtUK>LvuUlfu!o;Q=aiGJz7HvyV#Yc`7HBWwxW z>s4pkbI<3(Sg4*x%e|TSTm$FQ1M=I#!#)ZpmG8os0CaC6j)Dj4g2z3)cr7K~@I}UU ztZ|o=e$RvQve#`?_u`;6L1tMac_5WCsy0`(rP?#iVTv7w{Zq|2?PntG*^ES3ZK^mBdYPB4#ct&txY$=<38%b;IX9sKJUIa zq(hLgy`U&G8uiPq&~q%DJHLpUyuo)SI5v?c146p3AKn?1XLm?p0Ny{UQ<#z%RufJ* znIxmVh%agy#HHg2&E--Y{f+#1j0gdX4R>`mL7fmqp_$8@{vnsm;R>uOegchU z)m@qx(KZpi1S4`-6H=mUs(4Z0jD2>{88NaxvtP|LXGC+#yC<3I=Sy*vueBZAuxM0< zJ*i1F6+Qv{!DFFCJ&ef?NjYSLbtVqM?NL-jQ=>oEOEL1fj$EznbtGd*#WhVu%+MtI zcD}oS{qa2jrOafnc$xs>8p1+lV{c>kGaR%LlpBhU14=L)?ugyoen+7A?ljQQ+o>jotek+sty$GrsKYmGxh zHP5$L;N&Ej4w^B2K>Up%=;3Gnp{h#Ot%RC~b!Ts^=7&p`v=$ncyvGg@-E~t9vMo~$ z)SJ+3DR%fnTMef|5v7?2kLT?d+_gtCOUw!CKcw6_sUI#b&!42a{zZ&#@625GbrtT7 zW?a{9`Vu(!VF+7lt&;kwawe0yd)*G)$JagF0L-^FJmBLAbS>s*ijYHBSQrSxLNFnj zWw!MIV?`47BArzu^ZCpNEbhRQ*H^H}Dm}@1Yl);^7=A;;%gQdxp0Dax%Ig+=)lO3n z9m_n7*+uUDY=mAfKnVshK%fQIfB*Xbv>~9y-A~dXlz-98f1T8z+Ic!h%HMs0S~Vf( zzZ(W!kN$Kh5@m(y63K))|1=R~g`fVBLBh}e!E}jR|JX=H{?-|YDE+Y&{e$;KRR3TD z5xPVjQQkk}Kv6M*zk)&km+MaaCd$S5Tl3$Y8y@Jthgl+#7%ld1pWmr0QBaIh0!9b| zIlFk+nLG2l+uJ>dprDe2$U*<4HRylu9sj>GfsPaX#OVGkBu9)6aYIp>Rq*KueJZZ?OfrErLKgGLV$pPj(`wAZy1O52Kjd|<@q~M$2H>p z$%gs<0T2ene+V_i0FmG~g}5Pt{={;`KPt#3qR>B_8X|>6^gFLLKoUXx1JjYo0hO2u zPJ)(G7Mj|b+31Sv=|GaatA;p6WU; z%eQtm(yf(aQdLKheOIE~ECt{k zR+WceHjY+#u;nVm$0hYM@E+F&0S}^j1o_@ELe`BAEhme-)<+`fjvOXBm=B$s6Yt#E zdaOKlGqNI~R5_*uKJjY_Ws6^Qwr0w|kJqq%cmJwU4kLHTFdJ#^HL<7wU1;4qeX{h@ z4BNb&>g3U?T%f3(o=SKp@V>JnEcBP83jV;_r`|ddXu?Ef5e9oiP|c?$Yk;sRw-~wt zg0ikR<5{~WZ~J^h-BnCClq}^m@MjeUotL)17(dax@Tk7pzA9I|BO>!3elX)W8gls7 zK~-N7sPzghyJ%&D^3XYYcPXEH>HMm-KSuDg(er3xYaj^SB6%@jCn1T;P}%5a_`U&c zuZuGeM^PG|G7SQLH#_plRABc#>XY}arcdc(hLJ1fV`p3_`IJowQ!($U(fdUTA z#t!4?R#F&h(;uAFvNOLtcs0NcPC227sV0;bTnY*JN7B1+QA6Q4h!$>%I6$2UiVwHw zjDxzy=cM$9KV=Z1SJ3u4`8q;3qi=u%eNmDg2-OmDS?V!!sU|UW=5ouXG|=2)Jjq*B z^kv|*T7ZTIf9ua|B4OGXV$${3pYjgZYJq`4lrc*!bwr8oauZp%@Z07-DjF`=_cVlx zNHwJ)@Ct3rP=jvQ(7Q1+Ow@aI&bS6H-yo2aUn1jEo7Ol zNbCn=N70s^EGAXS@)FKsDwo8pn_ZxHS|LjX(|*S zX+GN9wcOj?)xl0qnL?!6&<*jT*d5$J;fHdU_t2N(+O^?e8gOIdbjBFV-)xy^E&)B z!(SuY&Fd4)m*3~kS;Y5f(&z~X8yy;{q{iZb7r3@mSwV>D^D=Ih!@ZuSlkMdfs69_< zmTq1bU!tpqA+4F+r`r614*EJ zASYoEaO@`}zHNmSMz!$Jh99Ivd$=+YhR;ZAlp?i?4aenNLp?4RE@-bQ?qBVT=1Cva zeW6A+o1mC7iff(>Z06sXpRLc)XtPXf{_NsIVHvTnf`FCLl1Uc$;8sqHcxh`{uz8&@ z8TZlBWxNuw<>wG8@l>NBpsyi5`L2a~_ER|=Tjr}|{#V;-0%LXi3)=Zmxomcuc&{AO zQL%NfdM_4xMMZDu9Dh)agZHtE2qmRi#;lC?Q4iSiMscDnuiqdNJyT{NGV*d)kp=GL z!Vuo2DP!K9VdX&2J-+N1Qomqm80q0o->L8;Qa~GUMt{>gDO*HF!AwM=Y&kGiQ&(g^ zY>#_BaM=A~KPkm|@(fnegA{vcnK6S39HRz5d{y`1=fP?%ZSKqLukev4`J$*nH?+&~ zSoPykgGSt$Z_o{y{Q0_v1tVtR3y!y+!^J3RSZQBR{_@}ovU-(TEs`J@&&cCEwNf$v z%qEBe02hARmC_DNnKU=-CwauRDAdP|Haa`oohUP1fD$FFB4Dt-9nmD%5?A_`=N8i| zQCYh9v)%;?^WA*5NRuYlF|HKxZK%)RfdGr5!Naesv^5A|V)l5{3?lg9_i;6jFS^5T zrPXfC-C{OxRQe0nguDK^Ct7u+fNiR+LdmBKpgFKoXxg4>0xLECOvjI$??)#{v0~|D z57u0=eU%nY$>&|JSxQ&;`pRg_GKcIu?etkGF2szZa(&&@*Lbwd*TdVK-*{80yI1*_ z^r8#q(Y(*iT~^dRtN{QMn`+*tIhvsK+P~b$(l5zd7a7xxc3h$7 z@VezoMT$9h!%)o7ou=?s_E)nCjuf~Q=6%?hczy6gwfT;m7`FfBn0Q_ALoUls7-~P* zE5%{K@@=g3EDcyv1nGfRc_2*uvgjH8s8}}s>UM)dI4dmF0bw5PASN1=i+SV;s0OPa z&?QmBacoN$*jp)=Fo9JNiG{;nfcq_AR<;EC?64n*oMtI0iSr9xIq ziGeBwSX1VJp~L}QGQ*iu>$(oW4f~{~+6WQRQ%KS4MEE59JumUoHUWO%awL4*E6}Uv z;p}J(rWR$=1&(A7$Oel&MWQKKMwE6}N zpGk3f><`L6&ef(Ma&%H|I0T(6;!>pe$skmG0Cn!z!4cn?!$y4G-3w z?4hbem(@tb;pKGMU^*V__JkW)B{MPO)QkI?8q4Q-i&QT$(ZzSuuB}nUY0nT;%V+5# z3t?S<&R`XGzb)evc1;2QRIIa%#gfR@;KX~D>iM$ma?{=H_b9?l|A*=1Bgw0A3+_^XD+H3dB z#b?0#$UsDh_J{s2nuhxa&TDow!P)@Q;$VY%SKQg!x2sgOx#uwl_v2NlR6``F}wW(^&SYI=oR5Z#*SWp6WWjF#%C6Xwq)i2+=u(Ysx`6VZ1JbTXEK zTkXIlx4`jeGCVV$RSLrZN~cR)wSlY&pf3r%=-#(AI8_g2%9*3lsfl!Q3tPNkVWQH0={ zF;ZBsx^tIL=$?e1@lVK{eqH9SVb?Td@qJivc)}D<_knOBkNR6CNV_!uR3pgHu?=R; z!Q*7ZFn2|O@9$EMA2x=wJu9L`1qw3vP$+x1WFVy}1Ss{@j%p+)>-cw!tjBgns2icJ zGrXjTNN*{^izm#<56hmct z&T6&%wgB<=ljW9+2b8dU%)=>6IDV5!?vqY0>xau6nxET5syH`BQgz*Ef~+Ag&FIa% zBD?YsOK{b?4_uHLHRuVk7cN-t(C%Ot%R%wy^P47=J%uy!bRP$DOq=x@x#}Ho&2N=4 zZ_Vs`J!&ls128KQo&bVRrkIPRrzHpCcA9w=azY3+o-moc zNN|;lVdyJfR82OB^SVyR6y-^Nu41(Vp;F6__`>yUz#q$%3q^@9HY{&bE9LH?98N?Y z_8P_VEt!*xMq7^!TiSa<-T9)#0+OhtqruGzqb370?*-NIq-nCLl7_+xb$vILn{|zl zR$3ryP_vaLHKgRZh3I;69307Kt3;we&%pIta^4FU24$@XA&YtRL*^^(h4srKo!QYl zVU(KlmnIi`b!DT7lA12YCnaUyq|2t&XwGe{_5CesRAP493J6-+I~G>4q^}i!(#)U~ zwUQRlH%VI-)o`9WvS0p%V*jvw98DITN&k>$rqr(jVL4aCNic&>9zN@k5wt0(H!vWk;{vLAj~be;DcQvrZSA1c{9EP*P3 zZ^BbPA_dYfsPr`T>ot~GN4K`)KfI;RQKd=f^8KIGF?eQKRycY(u{p5oI*?|+mZ zN8xt)dbxy|YP#22X~*o-Ls$B-%%`j6b7{&AMb6To@O6@s{h_3!#?9_7Cf~1 zdPSb3aQvvNsUfM|t^ue7FA%=n#{;drd@A84*~JM-*rMXQ+S=h;HE83EV)${lA#eN| ze6K_5)&?%f(8{#pS9$7X#zg}@eq;q7%=rlkE>pHv&xGl~x9c?$)=rmc= zE{&(&yqs_k(##s)%pt2pCmM}Gf$fc|tD$@$9_y{nUy{ zM-G8<;rFfQW{K%+PKbF{SQxJ`WNvrWB!1PgyEijt1{8BB$_GATJ_;M%y+gTL!QhT& zY$|&ZpvjCD>pdxF;j3FcG_vZmDYu@DDU?cuGaaxegGjd)D@DCQ6i5|=Z*<9+O65ak z2319rYf+Uz@G%6uJ;+|y2%~^Q*<*b}Er-K8^VO2)uy)JibVh^%&b-vJ2TfWxj zIYp*`xfGL10VU83!KR;w$9;`(>kXs19g}A7bh~lMR^#~Wjwx;6x*6Nx-aak{3Efx0 zcO0*}*;(Q@Z}5YTKTk93ZZBt5KbK<%lLdD`O)cFtS)~9U{O50M7>TEhB_GhQh*YHo z`^`5#>k_%E2nxd~+R%QuCw=$*rL3(c9s!ViIKqAYl0Bzg1+#ZfjY*W24a_Fq$rX9~ zK$LF4X@is~YlbTablV_(?J2^5$_DoBEYS8od+l&}aA$iSyI4B|DT zEf_}OFvUD5+{ee{S*6s_0Ux|nkuRAFs5`MS)x=1<6~CN(ApRk)#RoOA~)&h z%HV+IU%bo!FL%MQ&@1XPBsVU?Ge)UVjV=Uo%6yXM51WN6r{?E_QeNj{pCmMOXilkv z6&N_amEm(^TkvjXABw-AyFz9j2x5N)rY~lTU>fwzk%LXF>;2m3I)@9#z)%X#5Rx1FQt1QZnsyDa7@Mi&9@VmqX0Zdh?|3QB|k>gk)dM)}!Fz&9AiuXwydu!A{#~Y+=n+mW! z6^AQWz)+q_YWbV*wyFh~>Qhm%bOt2-`bkK5wU2tePOG}abaqTsMKZx2~RAw%Jd zX3g`1?Va9ztj5z7leY(umf=i^zQ7NF&=y$sYddN$vIsAX{L6%WjIC|wzE^v>(#Z8y$p*DKc>UP$1m@{W1=P*%VZe~I#ILk3Jl2zpE-ClLO@6VYP zRPUfI)~5zY>KNs3ken))58)7^!j@+XOio04CkPEgy6<;uf6+fTF@-AV>V`solC77K zT$H*ioYY`gax@gxgATDCOTXI|DD6L&QmDMOWV=u`JzZWXSz6B695F6!znd#ey97ad zAAc|JmST}pbx#lw`sx0&y#I4>P>b>+@Nc6(gxl?JqyLuY&mjVYi&yH8@z2Fe4vFVw z{FArx%KVp6@%@L9L#+6i|8NMO+@H9__qUFoU-8egEC1iTg&&0VmmmG^zfN^Li0R#L z@b4`dCc?ijqrZOJ+{w}1($SsW+reI42@#0^fdJv3>h$j4h3o0R-$RIkd<2oc{QdEN zkN(;JXvQE-Ao4$&f^LaaB_afb-#5wsXxbpBpjUrJK_NhnC=L-6U_`Cu`7QZBUet33 diff --git a/systembus_bits.hpp b/systembus_bits.hpp index f458bdf..14b0784 100644 --- a/systembus_bits.hpp +++ b/systembus_bits.hpp @@ -15,61 +15,61 @@ namespace c2dst { } namespace istnrm { - constexpr uint32_t end_of_transferring_punch_through_list(uint32_t reg) { return (reg >> 21) & 0x1; } - constexpr uint32_t end_of_dma_sort_dma(uint32_t reg) { return (reg >> 20) & 0x1; } - constexpr uint32_t end_of_dma_ch2_dma(uint32_t reg) { return (reg >> 19) & 0x1; } - constexpr uint32_t end_of_dma_dev_dma(uint32_t reg) { return (reg >> 18) & 0x1; } - constexpr uint32_t end_of_dma_ext_dma2(uint32_t reg) { return (reg >> 17) & 0x1; } - constexpr uint32_t end_of_dma_ext_dma1(uint32_t reg) { return (reg >> 16) & 0x1; } - constexpr uint32_t end_of_dma_aica_dma(uint32_t reg) { return (reg >> 15) & 0x1; } - constexpr uint32_t end_of_dma_gd_dma(uint32_t reg) { return (reg >> 14) & 0x1; } - constexpr uint32_t maple_v_blank_over_interrupt(uint32_t reg) { return (reg >> 13) & 0x1; } - constexpr uint32_t end_of_dma_maple_dma(uint32_t reg) { return (reg >> 12) & 0x1; } - constexpr uint32_t end_of_dma_pvr_dma(uint32_t reg) { return (reg >> 11) & 0x1; } - constexpr uint32_t end_of_transferring_translucent_modifier_volume_list(uint32_t reg) { return (reg >> 10) & 0x1; } - constexpr uint32_t end_of_transferring_translucent_list(uint32_t reg) { return (reg >> 9) & 0x1; } - constexpr uint32_t end_of_transferring_opaque_modifier_volume_list(uint32_t reg) { return (reg >> 8) & 0x1; } - constexpr uint32_t end_of_transferring_opaque_list(uint32_t reg) { return (reg >> 7) & 0x1; } - constexpr uint32_t end_of_transferring_yuv(uint32_t reg) { return (reg >> 6) & 0x1; } - constexpr uint32_t h_blank_in_interrupt(uint32_t reg) { return (reg >> 5) & 0x1; } - constexpr uint32_t v_blank_out_interrupt(uint32_t reg) { return (reg >> 4) & 0x1; } - constexpr uint32_t v_blank_in_interrupt(uint32_t reg) { return (reg >> 3) & 0x1; } - constexpr uint32_t end_of_render_tsp(uint32_t reg) { return (reg >> 2) & 0x1; } - constexpr uint32_t end_of_render_isp(uint32_t reg) { return (reg >> 1) & 0x1; } - constexpr uint32_t end_of_render_video(uint32_t reg) { return (reg >> 0) & 0x1; } + constexpr uint32_t end_of_transferring_punch_through_list = 1 << 21; + constexpr uint32_t end_of_dma_sort_dma = 1 << 20; + constexpr uint32_t end_of_dma_ch2_dma = 1 << 19; + constexpr uint32_t end_of_dma_dev_dma = 1 << 18; + constexpr uint32_t end_of_dma_ext_dma2 = 1 << 17; + constexpr uint32_t end_of_dma_ext_dma1 = 1 << 16; + constexpr uint32_t end_of_dma_aica_dma = 1 << 15; + constexpr uint32_t end_of_dma_gd_dma = 1 << 14; + constexpr uint32_t maple_v_blank_over_interrupt = 1 << 13; + constexpr uint32_t end_of_dma_maple_dma = 1 << 12; + constexpr uint32_t end_of_dma_pvr_dma = 1 << 11; + constexpr uint32_t end_of_transferring_translucent_modifier_volume_list = 1 << 10; + constexpr uint32_t end_of_transferring_translucent_list = 1 << 9; + constexpr uint32_t end_of_transferring_opaque_modifier_volume_list = 1 << 8; + constexpr uint32_t end_of_transferring_opaque_list = 1 << 7; + constexpr uint32_t end_of_transferring_yuv = 1 << 6; + constexpr uint32_t h_blank_in_interrupt = 1 << 5; + constexpr uint32_t v_blank_out_interrupt = 1 << 4; + constexpr uint32_t v_blank_in_interrupt = 1 << 3; + constexpr uint32_t end_of_render_tsp = 1 << 2; + constexpr uint32_t end_of_render_isp = 1 << 1; + constexpr uint32_t end_of_render_video = 1 << 0; } namespace isterr { - constexpr uint32_t sh4__if_access_inhibited_area(uint32_t reg) { return (reg >> 31) & 0x1; } - constexpr uint32_t ddt__if_sort_dma_command_error(uint32_t reg) { return (reg >> 28) & 0x1; } - constexpr uint32_t g2__time_out_in_cpu_access(uint32_t reg) { return (reg >> 27) & 0x1; } - constexpr uint32_t g2__dev_dma_time_out(uint32_t reg) { return (reg >> 26) & 0x1; } - constexpr uint32_t g2__ext_dma2_time_out(uint32_t reg) { return (reg >> 25) & 0x1; } - constexpr uint32_t g2__ext_dma1_time_out(uint32_t reg) { return (reg >> 24) & 0x1; } - constexpr uint32_t g2__aica_dma_time_out(uint32_t reg) { return (reg >> 23) & 0x1; } - constexpr uint32_t g2__dev_dma_over_run(uint32_t reg) { return (reg >> 22) & 0x1; } - constexpr uint32_t g2__ext_dma2_over_run(uint32_t reg) { return (reg >> 21) & 0x1; } - constexpr uint32_t g2__ext_dma1_over_run(uint32_t reg) { return (reg >> 20) & 0x1; } - constexpr uint32_t g2__aica_dma_over_run(uint32_t reg) { return (reg >> 19) & 0x1; } - constexpr uint32_t g2__dev_dma_illegal_address_set(uint32_t reg) { return (reg >> 18) & 0x1; } - constexpr uint32_t g2__ext_dma2_illegal_address_set(uint32_t reg) { return (reg >> 17) & 0x1; } - constexpr uint32_t g2__ext_dma1_illegal_address_set(uint32_t reg) { return (reg >> 16) & 0x1; } - constexpr uint32_t g2__aica_dma_illegal_address_set(uint32_t reg) { return (reg >> 15) & 0x1; } - constexpr uint32_t g1__rom_flash_access_at_gd_dma(uint32_t reg) { return (reg >> 14) & 0x1; } - constexpr uint32_t g1__gd_dma_over_run(uint32_t reg) { return (reg >> 13) & 0x1; } - constexpr uint32_t g1__illegal_address_set(uint32_t reg) { return (reg >> 12) & 0x1; } - constexpr uint32_t maple__illegal_command(uint32_t reg) { return (reg >> 11) & 0x1; } - constexpr uint32_t maple__write_fifo_over_flow(uint32_t reg) { return (reg >> 10) & 0x1; } - constexpr uint32_t maple__dma_over_run(uint32_t reg) { return (reg >> 9) & 0x1; } - constexpr uint32_t maple__illegal_address_set(uint32_t reg) { return (reg >> 8) & 0x1; } - constexpr uint32_t pvrif__dma_over_run(uint32_t reg) { return (reg >> 7) & 0x1; } - constexpr uint32_t pvrif__illegal_address_set(uint32_t reg) { return (reg >> 6) & 0x1; } - constexpr uint32_t ta__fifo_overflow(uint32_t reg) { return (reg >> 5) & 0x1; } - constexpr uint32_t ta__illegal_parameter(uint32_t reg) { return (reg >> 4) & 0x1; } - constexpr uint32_t ta__object_list_pointer_overflow(uint32_t reg) { return (reg >> 3) & 0x1; } - constexpr uint32_t ta__isp_tsp_parameter_overflow(uint32_t reg) { return (reg >> 2) & 0x1; } - constexpr uint32_t render__hazard_processing_of_strip_buffer(uint32_t reg) { return (reg >> 1) & 0x1; } - constexpr uint32_t render__isp_out_of_cache(uint32_t reg) { return (reg >> 0) & 0x1; } + constexpr uint32_t sh4__if_access_inhibited_area = 1 << 31; + constexpr uint32_t ddt__if_sort_dma_command_error = 1 << 28; + constexpr uint32_t g2__time_out_in_cpu_access = 1 << 27; + constexpr uint32_t g2__dev_dma_time_out = 1 << 26; + constexpr uint32_t g2__ext_dma2_time_out = 1 << 25; + constexpr uint32_t g2__ext_dma1_time_out = 1 << 24; + constexpr uint32_t g2__aica_dma_time_out = 1 << 23; + constexpr uint32_t g2__dev_dma_over_run = 1 << 22; + constexpr uint32_t g2__ext_dma2_over_run = 1 << 21; + constexpr uint32_t g2__ext_dma1_over_run = 1 << 20; + constexpr uint32_t g2__aica_dma_over_run = 1 << 19; + constexpr uint32_t g2__dev_dma_illegal_address_set = 1 << 18; + constexpr uint32_t g2__ext_dma2_illegal_address_set = 1 << 17; + constexpr uint32_t g2__ext_dma1_illegal_address_set = 1 << 16; + constexpr uint32_t g2__aica_dma_illegal_address_set = 1 << 15; + constexpr uint32_t g1__rom_flash_access_at_gd_dma = 1 << 14; + constexpr uint32_t g1__gd_dma_over_run = 1 << 13; + constexpr uint32_t g1__illegal_address_set = 1 << 12; + constexpr uint32_t maple__illegal_command = 1 << 11; + constexpr uint32_t maple__write_fifo_over_flow = 1 << 10; + constexpr uint32_t maple__dma_over_run = 1 << 9; + constexpr uint32_t maple__illegal_address_set = 1 << 8; + constexpr uint32_t pvrif__dma_over_run = 1 << 7; + constexpr uint32_t pvrif__illegal_address_set = 1 << 6; + constexpr uint32_t ta__fifo_overflow = 1 << 5; + constexpr uint32_t ta__illegal_parameter = 1 << 4; + constexpr uint32_t ta__object_list_pointer_overflow = 1 << 3; + constexpr uint32_t ta__isp_tsp_parameter_overflow = 1 << 2; + constexpr uint32_t render__hazard_processing_of_strip_buffer = 1 << 1; + constexpr uint32_t render__isp_out_of_cache = 1 << 0; } namespace ffst { diff --git a/vga.cpp b/vga.cpp deleted file mode 100644 index aab1450..0000000 --- a/vga.cpp +++ /dev/null @@ -1,147 +0,0 @@ -#include - -#include "sh7091/sh7091.hpp" -#include "sh7091/sh7091_bits.hpp" -#include "holly/holly.hpp" -#include "holly/core_bits.hpp" -#include "aica/aica.hpp" -#include "memorymap.hpp" - -#include "vga.hpp" -#include "rgb.hpp" - -/* -uint32_t get_cable_type() -{ - // set all pins to input - sh7091.BSC.PCTRA = 0; - - // get cable type from pins 9 + 8 - return sh7091.BSC.PDTRA & PDTRA__MASK; -} -*/ - -void vga1() -{ - 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; - - holly.SPG_VBLANK_INT = spg_vblank_int::vblank_out_interrupt_line_number(0x0015) - | spg_vblank_int::vblank_in_interrupt_line_number(0x0208); - - holly.SPG_CONTROL = spg_control::sync_direction::output; - - constexpr uint32_t hbstart = 0x0345; - holly.SPG_HBLANK = spg_hblank::hbend(0x007e) // default - | spg_hblank::hbstart(hbstart); // default - - holly.SPG_LOAD = spg_load::vcount(0x020c) // default - | spg_load::hcount(0x0359); // non-default - - holly.SPG_VBLANK = spg_vblank::vbend(0x0028) // non-default - | spg_vblank::vbstart(0x0208); // non-default - - holly.SPG_WIDTH = spg_width::eqwidth(0x000f) - | spg_width::bpwidth(0x0319) - | spg_width::vswidth(0x0003) - | spg_width::hswidth(0x003f); - - 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 = spg_hblank_int::line_comp_val(hbstart); -} - -void vga2() -{ - holly.FB_BURSTCTRL = fb_burstctrl::wr_burst(0x09) - | fb_burstctrl::vid_lat(0x3f) - | fb_burstctrl::vid_burst(0x39); - - constexpr uint32_t x_size = 640; - constexpr uint32_t y_size = 480; - - holly.FB_X_CLIP = fb_x_clip::fb_x_clip_max(x_size - 1) - | fb_x_clip::fb_x_clip_min(0); - - holly.FB_Y_CLIP = fb_y_clip::fb_y_clip_max(y_size - 1) - | fb_y_clip::fb_y_clip_min(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); - - holly.Y_COEFF = y_coeff::coefficient_1(0x80) - | y_coeff::coefficient_0_2(0x40); - - // in 6.10 fixed point; 0x0400 is 1x vertical scale - holly.SCALER_CTL = scaler_ctl::vertical_scale_factor(0x0400); - - 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); - - 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; - -#define DVE_OUTPUT_MODE__VGA (0b00 << 0) - aica.common.VREG(DVE_OUTPUT_MODE__VGA); -#undef DVE_OUTPUT_MODE__VGA -} - -void v_sync_in() -{ - while (!spg_status::vsync(holly.SPG_STATUS)) { - } - while (spg_status::vsync(holly.SPG_STATUS)) { - } -} - -void v_sync_out() -{ - while (spg_status::vsync(holly.SPG_STATUS)) { - } - while (!spg_status::vsync(holly.SPG_STATUS)) { - } -} - -void vga() -{ - 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); - - holly.SDRAM_CFG = 0x15D1C951; - holly.SDRAM_REFRESH = 0x00000020; - - v_sync_in(); - - holly.SOFTRESET = 0; -} - -void vga_fill_framebuffer() -{ - volatile uint16_t * vram = reinterpret_cast(texture_memory32); - for (int y = 0; y < 480; y++) { - for (int x = 0; x < 640; x++) { - struct hsv hsv = {(y * 255) / 480, 255, 255}; - struct rgb rgb = hsv_to_rgb(hsv); - vram[y * 640 + x] = ((rgb.r >> 3) << 11) | ((rgb.g >> 2) << 5) | ((rgb.b >> 3) << 0); - } - } -} diff --git a/vga.hpp b/vga.hpp deleted file mode 100644 index 41061b7..0000000 --- a/vga.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -void vga(); -void v_sync_in(); -void v_sync_out(); -void vga_fill_framebuffer();