diff options
| author | 2014-05-17 22:07:06 +0200 | |
|---|---|---|
| committer | 2014-06-12 06:10:47 -0400 | |
| commit | b1c8bad9a646b2f4ae1b03c45844d060d8889aab (patch) | |
| tree | f0eca82b818d9448f4713ad61ce1d515b0e8cae7 /src/core | |
| parent | Update CONTRIBUTING.md (diff) | |
| download | yuzu-b1c8bad9a646b2f4ae1b03c45844d060d8889aab.tar.gz yuzu-b1c8bad9a646b2f4ae1b03c45844d060d8889aab.tar.xz yuzu-b1c8bad9a646b2f4ae1b03c45844d060d8889aab.zip | |
Pica: Add command list registers.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hw/lcd.cpp | 45 | ||||
| -rw-r--r-- | src/core/hw/lcd.h | 12 |
2 files changed, 52 insertions, 5 deletions
diff --git a/src/core/hw/lcd.cpp b/src/core/hw/lcd.cpp index b57563a73..61ee99c1f 100644 --- a/src/core/hw/lcd.cpp +++ b/src/core/hw/lcd.cpp | |||
| @@ -7,11 +7,11 @@ | |||
| 7 | 7 | ||
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/mem_map.h" | 9 | #include "core/mem_map.h" |
| 10 | #include "core/hle/kernel/thread.h" | ||
| 10 | #include "core/hw/lcd.h" | 11 | #include "core/hw/lcd.h" |
| 11 | 12 | ||
| 12 | #include "video_core/video_core.h" | 13 | #include "video_core/video_core.h" |
| 13 | 14 | ||
| 14 | #include "core/hle/kernel/thread.h" | ||
| 15 | 15 | ||
| 16 | namespace LCD { | 16 | namespace LCD { |
| 17 | 17 | ||
| @@ -89,31 +89,70 @@ inline void Read(T &var, const u32 addr) { | |||
| 89 | case REG_FRAMEBUFFER_TOP_LEFT_1: | 89 | case REG_FRAMEBUFFER_TOP_LEFT_1: |
| 90 | var = g_regs.framebuffer_top_left_1; | 90 | var = g_regs.framebuffer_top_left_1; |
| 91 | break; | 91 | break; |
| 92 | |||
| 92 | case REG_FRAMEBUFFER_TOP_LEFT_2: | 93 | case REG_FRAMEBUFFER_TOP_LEFT_2: |
| 93 | var = g_regs.framebuffer_top_left_2; | 94 | var = g_regs.framebuffer_top_left_2; |
| 94 | break; | 95 | break; |
| 96 | |||
| 95 | case REG_FRAMEBUFFER_TOP_RIGHT_1: | 97 | case REG_FRAMEBUFFER_TOP_RIGHT_1: |
| 96 | var = g_regs.framebuffer_top_right_1; | 98 | var = g_regs.framebuffer_top_right_1; |
| 97 | break; | 99 | break; |
| 100 | |||
| 98 | case REG_FRAMEBUFFER_TOP_RIGHT_2: | 101 | case REG_FRAMEBUFFER_TOP_RIGHT_2: |
| 99 | var = g_regs.framebuffer_top_right_2; | 102 | var = g_regs.framebuffer_top_right_2; |
| 100 | break; | 103 | break; |
| 104 | |||
| 101 | case REG_FRAMEBUFFER_SUB_LEFT_1: | 105 | case REG_FRAMEBUFFER_SUB_LEFT_1: |
| 102 | var = g_regs.framebuffer_sub_left_1; | 106 | var = g_regs.framebuffer_sub_left_1; |
| 103 | break; | 107 | break; |
| 108 | |||
| 104 | case REG_FRAMEBUFFER_SUB_RIGHT_1: | 109 | case REG_FRAMEBUFFER_SUB_RIGHT_1: |
| 105 | var = g_regs.framebuffer_sub_right_1; | 110 | var = g_regs.framebuffer_sub_right_1; |
| 106 | break; | 111 | break; |
| 112 | |||
| 113 | case CommandListSize: | ||
| 114 | var = g_regs.command_list_size; | ||
| 115 | break; | ||
| 116 | |||
| 117 | case CommandListAddress: | ||
| 118 | var = g_regs.command_list_address; | ||
| 119 | break; | ||
| 120 | |||
| 121 | case ProcessCommandList: | ||
| 122 | var = g_regs.command_processing_enabled; | ||
| 123 | break; | ||
| 124 | |||
| 107 | default: | 125 | default: |
| 108 | ERROR_LOG(LCD, "unknown Read%d @ 0x%08X", sizeof(var) * 8, addr); | 126 | ERROR_LOG(LCD, "unknown Read%d @ 0x%08X", sizeof(var) * 8, addr); |
| 109 | break; | 127 | break; |
| 110 | } | 128 | } |
| 111 | |||
| 112 | } | 129 | } |
| 113 | 130 | ||
| 114 | template <typename T> | 131 | template <typename T> |
| 115 | inline void Write(u32 addr, const T data) { | 132 | inline void Write(u32 addr, const T data) { |
| 116 | ERROR_LOG(LCD, "unknown Write%d 0x%08X @ 0x%08X", sizeof(data) * 8, data, addr); | 133 | switch (addr) { |
| 134 | case CommandListSize: | ||
| 135 | g_regs.command_list_size = data; | ||
| 136 | break; | ||
| 137 | |||
| 138 | case CommandListAddress: | ||
| 139 | g_regs.command_list_address = data; | ||
| 140 | break; | ||
| 141 | |||
| 142 | case ProcessCommandList: | ||
| 143 | g_regs.command_processing_enabled = data; | ||
| 144 | if (g_regs.command_processing_enabled & 1) | ||
| 145 | { | ||
| 146 | // u32* buffer = (u32*)Memory::GetPointer(g_regs.command_list_address << 3); | ||
| 147 | ERROR_LOG(LCD, "Beginning %x bytes of commands from address %x", g_regs.command_list_size, g_regs.command_list_address << 3); | ||
| 148 | // TODO: Process command list! | ||
| 149 | } | ||
| 150 | break; | ||
| 151 | |||
| 152 | default: | ||
| 153 | ERROR_LOG(LCD, "unknown Write%d 0x%08X @ 0x%08X", sizeof(data) * 8, data, addr); | ||
| 154 | break; | ||
| 155 | } | ||
| 117 | } | 156 | } |
| 118 | 157 | ||
| 119 | // Explicitly instantiate template functions because we aren't defining this in the header: | 158 | // Explicitly instantiate template functions because we aren't defining this in the header: |
diff --git a/src/core/hw/lcd.h b/src/core/hw/lcd.h index 2dd3b4adc..2ae852d7c 100644 --- a/src/core/hw/lcd.h +++ b/src/core/hw/lcd.h | |||
| @@ -17,6 +17,10 @@ struct Registers { | |||
| 17 | u32 framebuffer_sub_left_2; | 17 | u32 framebuffer_sub_left_2; |
| 18 | u32 framebuffer_sub_right_1; | 18 | u32 framebuffer_sub_right_1; |
| 19 | u32 framebuffer_sub_right_2; | 19 | u32 framebuffer_sub_right_2; |
| 20 | |||
| 21 | u32 command_list_size; | ||
| 22 | u32 command_list_address; | ||
| 23 | u32 command_processing_enabled; | ||
| 20 | }; | 24 | }; |
| 21 | 25 | ||
| 22 | extern Registers g_regs; | 26 | extern Registers g_regs; |
| @@ -24,7 +28,7 @@ extern Registers g_regs; | |||
| 24 | enum { | 28 | enum { |
| 25 | TOP_ASPECT_X = 0x5, | 29 | TOP_ASPECT_X = 0x5, |
| 26 | TOP_ASPECT_Y = 0x3, | 30 | TOP_ASPECT_Y = 0x3, |
| 27 | 31 | ||
| 28 | TOP_HEIGHT = 240, | 32 | TOP_HEIGHT = 240, |
| 29 | TOP_WIDTH = 400, | 33 | TOP_WIDTH = 400, |
| 30 | BOTTOM_WIDTH = 320, | 34 | BOTTOM_WIDTH = 320, |
| @@ -57,12 +61,16 @@ enum { | |||
| 57 | REG_FRAMEBUFFER_SUB_LEFT_2 = 0x1EF0056C, // Sub LCD, second framebuffer | 61 | REG_FRAMEBUFFER_SUB_LEFT_2 = 0x1EF0056C, // Sub LCD, second framebuffer |
| 58 | REG_FRAMEBUFFER_SUB_RIGHT_1 = 0x1EF00594, // Sub LCD, unused first framebuffer | 62 | REG_FRAMEBUFFER_SUB_RIGHT_1 = 0x1EF00594, // Sub LCD, unused first framebuffer |
| 59 | REG_FRAMEBUFFER_SUB_RIGHT_2 = 0x1EF00598, // Sub LCD, unused second framebuffer | 63 | REG_FRAMEBUFFER_SUB_RIGHT_2 = 0x1EF00598, // Sub LCD, unused second framebuffer |
| 64 | |||
| 65 | CommandListSize = 0x1EF018E0, | ||
| 66 | CommandListAddress = 0x1EF018E8, | ||
| 67 | ProcessCommandList = 0x1EF018F0, | ||
| 60 | }; | 68 | }; |
| 61 | 69 | ||
| 62 | /// Framebuffer location | 70 | /// Framebuffer location |
| 63 | enum FramebufferLocation { | 71 | enum FramebufferLocation { |
| 64 | FRAMEBUFFER_LOCATION_UNKNOWN, ///< Framebuffer location is unknown | 72 | FRAMEBUFFER_LOCATION_UNKNOWN, ///< Framebuffer location is unknown |
| 65 | FRAMEBUFFER_LOCATION_FCRAM, ///< Framebuffer is in the GSP heap | 73 | FRAMEBUFFER_LOCATION_FCRAM, ///< Framebuffer is in the GSP heap |
| 66 | FRAMEBUFFER_LOCATION_VRAM, ///< Framebuffer is in VRAM | 74 | FRAMEBUFFER_LOCATION_VRAM, ///< Framebuffer is in VRAM |
| 67 | }; | 75 | }; |
| 68 | 76 | ||