summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2014-05-17 22:07:06 +0200
committerGravatar bunnei2014-06-12 06:10:47 -0400
commitb1c8bad9a646b2f4ae1b03c45844d060d8889aab (patch)
treef0eca82b818d9448f4713ad61ce1d515b0e8cae7 /src/core
parentUpdate CONTRIBUTING.md (diff)
downloadyuzu-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.cpp45
-rw-r--r--src/core/hw/lcd.h12
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
16namespace LCD { 16namespace 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
114template <typename T> 131template <typename T>
115inline void Write(u32 addr, const T data) { 132inline 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
22extern Registers g_regs; 26extern Registers g_regs;
@@ -24,7 +28,7 @@ extern Registers g_regs;
24enum { 28enum {
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
63enum FramebufferLocation { 71enum 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