5 #include "build-info.hh" 6 #include "components.hh" 12 template <
class Pixel>
14 : vdp(vdp_), vram(vdp.getVRAM()), palette64(palette64_)
18 template <
class Pixel>
20 Pixel* linePtr,
unsigned displayX,
unsigned displayWidth,
21 unsigned displayY,
unsigned displayYA,
bool drawSprites)
23 unsigned displayAX = (displayX + vdp.
getScrollAX()) & 1023;
27 unsigned scrollYBase = scrollY & ~rollMask & 0x1FF;
28 unsigned displayAY = scrollYBase + ((displayYA + scrollY) & rollMask);
30 unsigned displayEnd = displayX + displayWidth;
35 memset(linePtr, displayWidth, bgcol);
38 int visibleSprites[16 + 1];
40 determineVisibleSprites(visibleSprites, displayY);
41 renderSprites(linePtr, displayX, displayEnd, displayY,
42 visibleSprites,
false);
47 renderPattern(linePtr, displayWidth, displayAX, displayAY, pal);
51 renderSprites(linePtr, displayX, displayEnd, displayY,
52 visibleSprites,
true);
56 template <
class Pixel>
58 Pixel* __restrict buffer,
unsigned width,
unsigned x,
unsigned y,
61 static const unsigned patternTable = 0x00000;
62 static const unsigned nameTable = 0x7C000;
65 const Pixel* palette = palette64 + pal;
67 unsigned nameAddr = nameTable + (((y / 8) * 128 + (x / 8)) * 2);
73 unsigned x2 = (patternNum % 64) * 4 + ((x & 7) / 2);
74 unsigned y2 = (patternNum / 64) * 2048 + y;
75 unsigned address = patternTable + y2 + x2;
78 while ((x & 7) && width) {
87 if (p) buffer[0] = palette[p];
92 nameAddr = (nameAddr & ~255) | ((nameAddr + 2) & 255);
94 assert((x & 7) == 0 || (width == 0));
98 unsigned x2 = (patternNum % 64) * 4;
99 unsigned y2 = (patternNum / 64) * 2048 + y;
100 unsigned address = patternTable + y2 + x2;
103 byte p0 = data0 >> 4;
104 if (p0) buffer[0] = palette[p0];
105 byte p1 = data0 & 0x0F;
106 if (p1) buffer[1] = palette[p1];
109 byte p2 = data1 >> 4;
110 if (p2) buffer[2] = palette[p2];
112 if (p3) buffer[3] = palette[
p3];
116 if (p4) buffer[4] = palette[
p4];
117 byte p5 = data2 & 0x0F;
118 if (p5) buffer[5] = palette[p5];
121 byte p6 = data3 >> 4;
122 if (p6) buffer[6] = palette[p6];
123 byte p7 = data3 & 0x0F;
124 if (p7) buffer[7] = palette[p7];
128 nameAddr = (nameAddr & ~255) | ((nameAddr + 2) & 255);
134 unsigned x2 = (patternNum % 64) * 4;
135 unsigned y2 = (patternNum / 64) * 2048 + y;
136 unsigned address = patternTable + y2 + x2;
140 if (p0) buffer[0] = palette[p0];
142 byte p1 = data & 0x0F;
143 if (p1) buffer[1] = palette[p1];
147 }
while (
int(width) > 0);
151 template <
class Pixel>
153 int* __restrict visibleSprites,
int displayY)
155 static const unsigned spriteTable = 0x3FE00;
159 for (
int sprite = 0; sprite < 125; ++sprite) {
160 int spriteInfo = spriteTable + 4 * sprite;
162 byte posY = displayY - spriteY;
170 visibleSprites[index++] = sprite;
172 if (index == index_max)
break;
177 visibleSprites[index] = -1;
181 template <
class Pixel>
183 Pixel* __restrict buffer,
int displayX,
int displayEnd,
unsigned displayY,
184 const int* __restrict visibleSprites,
bool front)
186 static const unsigned spriteTable = 0x3FE00;
189 for (
unsigned sprite = 0; visibleSprites[sprite] != -1; ++sprite) {
190 unsigned addr = spriteTable + 4 * visibleSprites[sprite];
192 if (front ^ !!(spriteAttr & 0x20)) {
194 spriteX += 256 * (spriteAttr & 0x03);
195 if (spriteX > 1008) spriteX -= 1024;
198 spriteY = displayY - (spriteY + 1);
199 unsigned patAddr = spritePatternTable
200 + (256 * (((spriteNo & 0xE0) >> 1) + spriteY))
201 + ( 8 * (spriteNo & 0x1F));
202 const Pixel* palette = palette64 + ((spriteAttr >> 2) & 0x30);
203 for (
int x = 0; x < 16; x +=2) {
205 int xPos = spriteX + x;
206 if ((displayX <= xPos) && (xPos < displayEnd)) {
208 if (p) buffer[xPos - displayX] = palette[p];
211 if ((displayX <= xPos) && (xPos < displayEnd)) {
212 byte p = data & 0x0F;
213 if (p) buffer[xPos - displayX] = palette[p];
224 #if HAVE_32BPP || COMPONENT_GL Implementation of the Yamaha V9990 VDP as used in the GFX9000 cartridge by Sunrise.
void convertLine(Pixel *linePtr, unsigned displayX, unsigned displayWidth, unsigned displayY, unsigned displayYA, bool drawSprites)
V9990P2Converter(V9990 &vdp_, const Pixel *palette64)
unsigned getRollMask(unsigned maxMask) const
Returns the vertical roll mask.
int getSpritePatternAddress(V9990DisplayMode m) const
Return the sprite pattern table base address.
byte readVRAMBx(unsigned address)
uint8_t byte
8 bit unsigned integer
mat3 p3(vec3(1, 2, 3), vec3(4, 5, 6), vec3(7, 0, 9))
constexpr auto data(C &c) -> decltype(c.data())
auto reverse(Range &&range)
byte getPaletteOffset() const
Get palette offset.
Thanks to enen for testing this on a real cartridge:
mat4 p4(vec4(1, 2, 3, 4), vec4(3, 4, 5, 6), vec4(5, 0, 7, 8), vec4(7, 8, 9, 0))
unsigned getScrollAX() const
Returns the X scroll offset for screen A of P1 and other modes.
byte readVRAMDirect(unsigned address)
unsigned getScrollAY() const
Returns the Y scroll offset for screen A of P1 and other modes.
byte getBackDropColor() const
Return the current back drop color.