31 #include "common/hardware/hwregs.h"
61 enum HResolutionExtended {
67 enum HResolution hResolution;
68 enum VResolution vResolution;
69 enum VideoMode videoMode;
70 enum ColorDepth colorDepth;
71 enum VideoInterlace videoInterlace;
72 enum HResolutionExtended hResolutionExtended;
75 static inline void waitGPU() {
76 while ((GPU_STATUS & 0x04000000) == 0)
80 static inline void sendGPUData(uint32_t data) {
85 static inline void sendGPUStatus(uint32_t status) {
89 static inline uint32_t generateDisableDisplay() {
return 0x03000001; }
90 static inline uint32_t generateEnableDisplay() {
return 0x03000000; }
91 static inline void disableDisplay() { sendGPUStatus(generateDisableDisplay()); }
92 static inline void enableDisplay() { sendGPUStatus(generateEnableDisplay()); }
94 static inline uint32_t generateDisplayMode(
const struct DisplayModeConfig* config) {
95 return 0x08000000 | (config->hResolution << 0) | (config->vResolution << 2) | (config->videoMode << 3) |
96 (config->colorDepth << 4) | (config->videoInterlace << 5) | (config->hResolutionExtended << 6);
100 sendGPUStatus(generateDisplayMode(config));
103 static inline uint32_t generateDisplayArea(int16_t x, int16_t y) {
return 0x05000000 | x | (y << 10); }
104 static inline void setDisplayArea(int16_t x, int16_t y) { sendGPUStatus(generateDisplayArea(x, y)); }
106 static inline uint32_t generateHorizontalRange(int16_t x1, int16_t x2) {
107 return 0x06000000 | (x1 + 0x260) | ((x1 + x2 + 0x260) << 12);
109 static inline void setHorizontalRange(int16_t x1, int16_t x2) { sendGPUStatus(generateHorizontalRange(x1, x2)); }
111 static inline uint32_t generateVerticalRange(int16_t y1, int16_t y2) {
return 0x07000000 | y1 | (y2 << 10); }
112 static inline void setVerticalRange(int16_t y1, int16_t y2) { sendGPUStatus(generateVerticalRange(y1, y2)); }
126 static inline void fastFill(
const struct FastFill* ff) {
128 GPU_DATA = 0x02000000 | ff->c.r | ff->c.g << 8 | ff->c.b << 16;
129 GPU_DATA = ff->x | ff->y << 16;
130 GPU_DATA = ff->w | ff->h << 16;
133 static inline uint32_t generateDrawingAreaStart(int16_t x, int16_t y) {
return 0xe3000000 | x | y << 10; }
134 static inline uint32_t generateDrawingAreaEnd(int16_t x, int16_t y) {
return 0xe4000000 | (x - 1) | (y - 1) << 10; }
135 static inline void setDrawingArea(int16_t x1, int16_t y1, int16_t x2, int16_t y2) {
136 sendGPUData(generateDrawingAreaStart(x1, y1));
137 sendGPUData(generateDrawingAreaEnd(x2, y2));
140 static inline uint32_t generateDrawingOffset(int16_t x, int16_t y) {
return 0xe5000000 | x | y << 11; }
141 static inline void setDrawingOffset(int16_t x, int16_t y) { sendGPUData(generateDrawingOffset(x, y)); }
169 enum Shading shading;
170 enum VerticesCount verticesCount;
171 enum Textured textured;
172 enum Transparency transparency;
173 enum Blending blending;
177 static inline uint32_t generatePolygonCommand(
const struct GPUPolygonCommand* c) {
178 return 0x20000000 | c->shading << 28 | c->verticesCount << 27 | c->textured << 26 | c->transparency << 25 |
179 c->blending << 24 | c->color.b << 16 | c->color.g << 8 | c->color.r;
181 static inline void startPolygonCommand(
const struct GPUPolygonCommand* c) { sendGPUData(generatePolygonCommand(c)); }
189 enum Shading shading;
190 enum LineStyle lineStyle;
191 enum Transparency transparency;
195 static inline uint32_t generateLineCommand(
const struct GPULineCommand* c) {
196 return 0x40000000 | c->shading << 28 | c->lineStyle << 27 | c->transparency << 25 | c->color.b << 16 |
197 c->color.g << 8 | c->color.r;
199 static inline void startLineCommand(
const struct GPULineCommand* c) { sendGPUData(generateLineCommand(c)); }
201 static inline uint32_t generateFlushGPUCache() {
return 0x01000000; }
202 static inline void flushGPUCache() { sendGPUData(generateFlushGPUCache()); }