Removed palettised blitting code.

This commit is contained in:
SarahW 2017-05-28 17:45:42 +01:00
commit 3c514a445f
18 changed files with 572 additions and 1079 deletions

View file

@ -137,7 +137,7 @@ void cga_poll(void *p)
int oldvc; int oldvc;
uint8_t chr, attr; uint8_t chr, attr;
uint16_t dat; uint16_t dat;
int cols[4]; uint32_t cols[4];
int col; int col;
int oldsc; int oldsc;
@ -158,20 +158,15 @@ void cga_poll(void *p)
// printf("Firstline %i\n",firstline); // printf("Firstline %i\n",firstline);
} }
cga->lastline = cga->displine; cga->lastline = cga->displine;
cols[0] = ((cga->cgamode & 0x12) == 0x12) ? 0 : (cga->cgacol & 15);
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
if ((cga->cgamode & 0x12) == 0x12) ((uint32_t *)buffer32->line[cga->displine])[c] = cols[0];
{ if (cga->cgamode & 1)
buffer->line[cga->displine][c] = 0; ((uint32_t *)buffer32->line[cga->displine])[c + (cga->crtc[1] << 3) + 8] = cols[0];
if (cga->cgamode & 1) buffer->line[cga->displine][c + (cga->crtc[1] << 3) + 8] = 0;
else buffer->line[cga->displine][c + (cga->crtc[1] << 4) + 8] = 0;
}
else else
{ ((uint32_t *)buffer32->line[cga->displine])[c + (cga->crtc[1] << 4) + 8] = cols[0];
buffer->line[cga->displine][c] = (cga->cgacol & 15) + 16;
if (cga->cgamode & 1) buffer->line[cga->displine][c + (cga->crtc[1] << 3) + 8] = (cga->cgacol & 15) + 16;
else buffer->line[cga->displine][c + (cga->crtc[1] << 4) + 8] = (cga->cgacol & 15) + 16;
}
} }
if (cga->cgamode & 1) if (cga->cgamode & 1)
{ {
@ -182,25 +177,25 @@ void cga_poll(void *p)
drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron); drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron);
if (cga->cgamode & 0x20) if (cga->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = attr & 15;
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = (attr >> 4) & 7;
if ((cga->cgablink & 8) && (attr & 0x80) && !cga->drawcursor) if ((cga->cgablink & 8) && (attr & 0x80) && !cga->drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = attr & 15;
cols[0] = (attr >> 4) + 16; cols[0] = attr >> 4;
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[cga->displine][(x << 3) + c + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[cga->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xffffff;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[cga->displine][(x << 3) + c + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[cga->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
cga->ma++; cga->ma++;
} }
@ -214,32 +209,35 @@ void cga_poll(void *p)
drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron); drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron);
if (cga->cgamode & 0x20) if (cga->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = attr & 15;
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = (attr >> 4) & 7;
if ((cga->cgablink & 8) && (attr & 0x80)) cols[1] = cols[0]; if ((cga->cgablink & 8) && (attr & 0x80) && !cga->drawcursor)
cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = attr & 15;
cols[0] = (attr >> 4) + 16; cols[0] = attr >> 4;
} }
cga->ma++; cga->ma++;
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[cga->displine][(x << 4)+(c << 1) + 8] = buffer->line[cga->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[cga->displine])[(x << 4)+(c << 1) + 8] =
((uint32_t *)buffer32->line[cga->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xffffff;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[cga->displine][(x << 4) + (c << 1) + 8] = buffer->line[cga->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[cga->displine])[(x << 4) + (c << 1) + 8] =
((uint32_t *)buffer32->line[cga->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][cga->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
} }
} }
else if (!(cga->cgamode & 16)) else if (!(cga->cgamode & 16))
{ {
cols[0] = (cga->cgacol & 15) | 16; cols[0] = cga->cgacol & 15;
col = (cga->cgacol & 16) ? 24 : 16; col = (cga->cgacol & 16) ? 8 : 0;
if (cga->cgamode & 4) if (cga->cgamode & 4)
{ {
cols[1] = col | 3; cols[1] = col | 3;
@ -264,22 +262,23 @@ void cga_poll(void *p)
cga->ma++; cga->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[cga->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[cga->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[cga->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[cga->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
} }
else else
{ {
cols[0] = 0; cols[1] = (cga->cgacol & 15) + 16; cols[0] = 0;
cols[1] = cga->cgacol & 15;
for (x = 0; x < cga->crtc[1]; x++) for (x = 0; x < cga->crtc[1]; x++)
{ {
dat = (cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000)] << 8) | cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000) + 1]; dat = (cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000)] << 8) | cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000) + 1];
cga->ma++; cga->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[cga->displine][(x << 4) + c + 8] = cols[dat >> 15]; ((uint32_t *)buffer32->line[cga->displine])[(x << 4) + c + 8] = cols[dat >> 15];
dat <<= 1; dat <<= 1;
} }
} }
@ -287,9 +286,9 @@ void cga_poll(void *p)
} }
else else
{ {
cols[0] = ((cga->cgamode & 0x12) == 0x12) ? 0 : (cga->cgacol & 15) + 16; cols[0] = ((cga->cgamode & 0x12) == 0x12) ? 0 : (cga->cgacol & 15);
if (cga->cgamode & 1) hline(buffer, 0, cga->displine, (cga->crtc[1] << 3) + 16, cols[0]); if (cga->cgamode & 1) hline(buffer32, 0, cga->displine, (cga->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, cga->displine, (cga->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, cga->displine, (cga->crtc[1] << 4) + 16, cols[0]);
} }
if (cga->cgamode & 1) x = (cga->crtc[1] << 3) + 16; if (cga->cgamode & 1) x = (cga->crtc[1] << 3) + 16;
@ -298,10 +297,15 @@ void cga_poll(void *p)
if (cga->composite) if (cga->composite)
{ {
for (c = 0; c < x; c++) for (c = 0; c < x; c++)
buffer32->line[cga->displine][c] = buffer->line[cga->displine][c] & 0xf; buffer32->line[cga->displine][c] = ((uint32_t *)buffer32->line[cga->displine])[c] & 0xf;
Composite_Process(cga->cgamode, 0, x >> 2, buffer32->line[cga->displine]); Composite_Process(cga->cgamode, 0, x >> 2, buffer32->line[cga->displine]);
} }
else
{
for (c = 0; c < x; c++)
((uint32_t *)buffer32->line[cga->displine])[c] = cgapal[((uint32_t *)buffer32->line[cga->displine])[c] & 0xf];
}
cga->sc = oldsc; cga->sc = oldsc;
if (cga->vc == cga->crtc[7] && !cga->sc) if (cga->vc == cga->crtc[7] && !cga->sc)
@ -380,10 +384,7 @@ void cga_poll(void *p)
updatewindowsize(xsize, (ysize << 1) + 16); updatewindowsize(xsize, (ysize << 1) + 16);
} }
if (cga->composite) video_blit_memtoscreen(0, cga->firstline - 4, 0, (cga->lastline - cga->firstline) + 8, xsize, (cga->lastline - cga->firstline) + 8);
video_blit_memtoscreen(0, cga->firstline - 4, 0, (cga->lastline - cga->firstline) + 8, xsize, (cga->lastline - cga->firstline) + 8);
else
video_blit_memtoscreen_8(0, cga->firstline - 4, xsize, (cga->lastline - cga->firstline) + 8);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -101,10 +101,10 @@ void colorplus_poll(void *p)
int cols[4]; int cols[4];
int col; int col;
int oldsc; int oldsc;
static const int cols16[16] = { 0x10,0x12,0x14,0x16, static const int cols16[16] = { 0x0,0x2,0x4,0x6,
0x18,0x1A,0x1C,0x1E, 0x8,0xA,0xC,0xE,
0x11,0x13,0x15,0x17, 0x1,0x3,0x5,0x7,
0x19,0x1B,0x1D,0x1F }; 0x9,0xB,0xD,0xF };
uint8_t *plane0 = colorplus->cga.vram; uint8_t *plane0 = colorplus->cga.vram;
uint8_t *plane1 = colorplus->cga.vram + 0x4000; uint8_t *plane1 = colorplus->cga.vram + 0x4000;
@ -137,8 +137,8 @@ void colorplus_poll(void *p)
/* Left / right border */ /* Left / right border */
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[colorplus->cga.displine][c] = ((uint32_t *)buffer32->line[colorplus->cga.displine])[c] =
buffer->line[colorplus->cga.displine][c + (colorplus->cga.crtc[1] << 4) + 8] = (colorplus->cga.cgacol & 15) + 16; ((uint32_t *)buffer32->line[colorplus->cga.displine])[c + (colorplus->cga.crtc[1] << 4) + 8] = cgapal[colorplus->cga.cgacol & 15];
} }
if (colorplus->control & COLORPLUS_320x200_MODE) if (colorplus->control & COLORPLUS_320x200_MODE)
{ {
@ -151,9 +151,9 @@ void colorplus_poll(void *p)
colorplus->cga.ma++; colorplus->cga.ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[colorplus->cga.displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[colorplus->cga.displine])[(x << 4) + (c << 1) + 8] =
buffer->line[colorplus->cga.displine][(x << 4) + (c << 1) + 1 + 8] = ((uint32_t *)buffer32->line[colorplus->cga.displine])[(x << 4) + (c << 1) + 1 + 8] =
cols16[(dat0 >> 14) | ((dat1 >> 14) << 2)]; cgapal[cols16[(dat0 >> 14) | ((dat1 >> 14) << 2)]];
dat0 <<= 2; dat0 <<= 2;
dat1 <<= 2; dat1 <<= 2;
} }
@ -161,25 +161,25 @@ void colorplus_poll(void *p)
} }
else if (colorplus->control & COLORPLUS_640x200_MODE) else if (colorplus->control & COLORPLUS_640x200_MODE)
{ {
cols[0] = (colorplus->cga.cgacol & 15) | 16; cols[0] = cgapal[colorplus->cga.cgacol & 15];
col = (colorplus->cga.cgacol & 16) ? 24 : 16; col = (colorplus->cga.cgacol & 16) ? 8 : 0;
if (colorplus->cga.cgamode & 4) if (colorplus->cga.cgamode & 4)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else if (colorplus->cga.cgacol & 32) else if (colorplus->cga.cgacol & 32)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 5; cols[2] = cgapal[col | 5];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else else
{ {
cols[1] = col | 2; cols[1] = cgapal[col | 2];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 6; cols[3] = cgapal[col | 6];
} }
for (x = 0; x < colorplus->cga.crtc[1]; x++) for (x = 0; x < colorplus->cga.crtc[1]; x++)
{ {
@ -190,7 +190,7 @@ void colorplus_poll(void *p)
colorplus->cga.ma++; colorplus->cga.ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[colorplus->cga.displine][(x << 4) + c + 8] = ((uint32_t *)buffer32->line[colorplus->cga.displine])[(x << 4) + c + 8] =
cols[(dat0 >> 15) | ((dat1 >> 15) << 1)]; cols[(dat0 >> 15) | ((dat1 >> 15) << 1)];
dat0 <<= 1; dat0 <<= 1;
dat1 <<= 1; dat1 <<= 1;
@ -200,8 +200,8 @@ void colorplus_poll(void *p)
} }
else /* Top / bottom border */ else /* Top / bottom border */
{ {
cols[0] = (colorplus->cga.cgacol & 15) + 16; cols[0] = cgapal[colorplus->cga.cgacol & 15];
hline(buffer, 0, colorplus->cga.displine, (colorplus->cga.crtc[1] << 4) + 16, cols[0]); hline(buffer32, 0, colorplus->cga.displine, (colorplus->cga.crtc[1] << 4) + 16, cols[0]);
} }
x = (colorplus->cga.crtc[1] << 4) + 16; x = (colorplus->cga.crtc[1] << 4) + 16;
@ -283,7 +283,7 @@ void colorplus_poll(void *p)
updatewindowsize(xsize, (ysize << 1) + 16); updatewindowsize(xsize, (ysize << 1) + 16);
} }
video_blit_memtoscreen_8(0, colorplus->cga.firstline - 4, xsize, (colorplus->cga.lastline - colorplus->cga.firstline) + 8); video_blit_memtoscreen(0, colorplus->cga.firstline - 4, 0, (colorplus->cga.lastline - colorplus->cga.firstline) + 8, xsize, (colorplus->cga.lastline - colorplus->cga.firstline) + 8);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -109,6 +109,8 @@ typedef struct genius_t
uint8_t *vram; uint8_t *vram;
} genius_t; } genius_t;
static uint32_t genius_pal[4];
/* Mapping of attributes to colours, in MDA emulation mode */ /* Mapping of attributes to colours, in MDA emulation mode */
static int mdacols[256][2][2]; static int mdacols[256][2][2];
@ -265,7 +267,7 @@ void genius_textline(genius_t *genius, uint8_t background)
uint16_t ma = (genius->mda_crtc[13] | (genius->mda_crtc[12] << 8)) & 0x3fff; uint16_t ma = (genius->mda_crtc[13] | (genius->mda_crtc[12] << 8)) & 0x3fff;
uint16_t ca = (genius->mda_crtc[15] | (genius->mda_crtc[14] << 8)) & 0x3fff; uint16_t ca = (genius->mda_crtc[15] | (genius->mda_crtc[14] << 8)) & 0x3fff;
unsigned char *framebuf = genius->vram + 0x10000; unsigned char *framebuf = genius->vram + 0x10000;
uint8_t col; uint32_t col;
/* Character height is 12-15 */ /* Character height is 12-15 */
charh = 15 - (genius->genius_charh & 3); charh = 15 - (genius->genius_charh & 3);
@ -317,13 +319,13 @@ void genius_textline(genius_t *genius, uint8_t background)
if (genius->genius_control & 0x20) if (genius->genius_control & 0x20)
{ {
col ^= 15; col ^= 0xffffff;
} }
for (c = 0; c < cw; c++) for (c = 0; c < cw; c++)
{ {
if (col != background) if (col != background)
buffer->line[genius->displine][(x * cw) + c] = col; ((uint32_t *)buffer32->line[genius->displine])[(x * cw) + c] = col;
} }
} }
else /* Draw 8 pixels of character */ else /* Draw 8 pixels of character */
@ -337,33 +339,35 @@ void genius_textline(genius_t *genius, uint8_t background)
if (genius->genius_control & 0x20) if (genius->genius_control & 0x20)
{ {
col ^= 15; col ^= 0xffffff;
} }
if (col != background) if (col != background)
{ {
buffer->line[genius->displine][(x * cw) + c] = col; ((uint32_t *)buffer32->line[genius->displine])[(x * cw) + c] = col;
} }
} }
/* The ninth pixel column... */ /* The ninth pixel column... */
if ((chr & ~0x1f) == 0xc0) if ((chr & ~0x1f) == 0xc0)
{ {
/* Echo column 8 for the graphics chars */ /* Echo column 8 for the graphics chars */
col = buffer->line[genius->displine][(x * cw) + 7]; col = ((uint32_t *)buffer32->line[genius->displine])[(x * cw) + 7];
if (col != background) buffer->line[genius->displine][(x * cw) + 8] = col; if (col != background)
((uint32_t *)buffer32->line[genius->displine])[(x * cw) + 8] = col;
} }
else /* Otherwise fill with background */ else /* Otherwise fill with background */
{ {
col = mdacols[attr][blink][0]; col = mdacols[attr][blink][0];
if (genius->genius_control & 0x20) if (genius->genius_control & 0x20)
{ {
col ^= 15; col ^= 0xffffff;
} }
if (col != background) buffer->line[genius->displine][(x * cw) + 8] = col; if (col != background)
((uint32_t *)buffer32->line[genius->displine])[(x * cw) + 8] = col;
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < cw; c++) for (c = 0; c < cw; c++)
buffer->line[genius->displine][(x * cw) + c] ^= mdacols[attr][0][1]; ((uint32_t *)buffer32->line[genius->displine])[(x * cw) + c] ^= mdacols[attr][0][1];
} }
++ma; ++ma;
} }
@ -378,10 +382,10 @@ void genius_cgaline(genius_t *genius)
{ {
int x, c; int x, c;
uint32_t dat; uint32_t dat;
uint8_t ink; uint32_t ink;
uint32_t addr; uint32_t addr;
ink = (genius->genius_control & 0x20) ? 16 : 16+15; ink = (genius->genius_control & 0x20) ? genius_pal[0] : genius_pal[3];
/* We draw the CGA at row 600 */ /* We draw the CGA at row 600 */
if (genius->displine < 600) if (genius->displine < 600)
{ {
@ -402,7 +406,7 @@ void genius_cgaline(genius_t *genius)
{ {
if (dat & 0x80) if (dat & 0x80)
{ {
buffer->line[genius->displine][x*8 + c] = ink; ((uint32_t *)buffer32->line[genius->displine])[x*8 + c] = ink;
} }
dat = dat << 1; dat = dat << 1;
} }
@ -420,7 +424,7 @@ void genius_hiresline(genius_t *genius)
uint8_t ink; uint8_t ink;
uint32_t addr; uint32_t addr;
ink = (genius->genius_control & 0x20) ? 16 : 16+15; ink = (genius->genius_control & 0x20) ? genius_pal[0] : genius_pal[3];
/* The first 512 lines live at A0000 */ /* The first 512 lines live at A0000 */
if (genius->displine < 512) if (genius->displine < 512)
{ {
@ -440,7 +444,7 @@ void genius_hiresline(genius_t *genius)
{ {
if (dat & 0x80) if (dat & 0x80)
{ {
buffer->line[genius->displine][x*8 + c] = ink; ((uint32_t *)buffer32->line[genius->displine])[x*8 + c] = ink;
} }
dat = dat << 1; dat = dat << 1;
} }
@ -466,11 +470,11 @@ void genius_poll(void *p)
{ {
if (genius->genius_control & 0x20) if (genius->genius_control & 0x20)
{ {
background = 16 + 15; background = genius_pal[3];
} }
else else
{ {
background = 16; background = genius_pal[0];
} }
if (genius->displine == 0) if (genius->displine == 0)
{ {
@ -479,7 +483,7 @@ void genius_poll(void *p)
/* Start off with a blank line */ /* Start off with a blank line */
for (x = 0; x < GENIUS_XSIZE; x++) for (x = 0; x < GENIUS_XSIZE; x++)
{ {
buffer->line[genius->displine][x] = background; ((uint32_t *)buffer32->line[genius->displine])[x] = background;
} }
/* If graphics display enabled, draw graphics on top /* If graphics display enabled, draw graphics on top
* of the blanked line */ * of the blanked line */
@ -536,7 +540,7 @@ void genius_poll(void *p)
if (ysize < 32) ysize = 200; if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize); updatewindowsize(xsize, ysize);
} }
video_blit_memtoscreen_8(0, 0, xsize, ysize); video_blit_memtoscreen(0, 0, 0, ysize, xsize, ysize);
frames++; frames++;
/* Fixed 728x1008 resolution */ /* Fixed 728x1008 resolution */
@ -566,27 +570,32 @@ void *genius_init()
io_sethandler(0x03b0, 0x000C, genius_in, NULL, NULL, genius_out, NULL, NULL, genius); io_sethandler(0x03b0, 0x000C, genius_in, NULL, NULL, genius_out, NULL, NULL, genius);
io_sethandler(0x03d0, 0x0010, genius_in, NULL, NULL, genius_out, NULL, NULL, genius); io_sethandler(0x03d0, 0x0010, genius_in, NULL, NULL, genius_out, NULL, NULL, genius);
genius_pal[0] = makecol(0x00, 0x00, 0x00);
genius_pal[1] = makecol(0x55, 0x55, 0x55);
genius_pal[2] = makecol(0xaa, 0xaa, 0xaa);
genius_pal[3] = makecol(0xff, 0xff, 0xff);
/* MDA attributes */ /* MDA attributes */
/* I don't know if the Genius's MDA emulation actually does /* I don't know if the Genius's MDA emulation actually does
* emulate bright / non-bright. For the time being pretend it does. */ * emulate bright / non-bright. For the time being pretend it does. */
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
{ {
mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = 16; mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = genius_pal[0];
if (c & 8) mdacols[c][0][1] = 15 + 16; if (c & 8) mdacols[c][0][1] = genius_pal[3];
else mdacols[c][0][1] = 7 + 16; else mdacols[c][0][1] = genius_pal[2];
} }
mdacols[0x70][0][1] = 16; mdacols[0x70][0][1] = genius_pal[0];
mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = 16 + 15; mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = genius_pal[3];
mdacols[0xF0][0][1] = 16; mdacols[0xF0][0][1] = genius_pal[0];
mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = 16 + 15; mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = genius_pal[3];
mdacols[0x78][0][1] = 16 + 7; mdacols[0x78][0][1] = genius_pal[2];
mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = 16 + 15; mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = genius_pal[3];
mdacols[0xF8][0][1] = 16 + 7; mdacols[0xF8][0][1] = genius_pal[2];
mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = 16 + 15; mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = genius_pal[3];
mdacols[0x00][0][1] = mdacols[0x00][1][1] = 16; mdacols[0x00][0][1] = mdacols[0x00][1][1] = genius_pal[0];
mdacols[0x08][0][1] = mdacols[0x08][1][1] = 16; mdacols[0x08][0][1] = mdacols[0x08][1][1] = genius_pal[0];
mdacols[0x80][0][1] = mdacols[0x80][1][1] = 16; mdacols[0x80][0][1] = mdacols[0x80][1][1] = genius_pal[0];
mdacols[0x88][0][1] = mdacols[0x88][1][1] = 16; mdacols[0x88][0][1] = mdacols[0x88][1][1] = genius_pal[0];
/* Start off in 80x25 text mode */ /* Start off in 80x25 text mode */
genius->cga_stat = 0xF4; genius->cga_stat = 0xF4;

View file

@ -32,7 +32,7 @@ typedef struct hercules_t
uint8_t *vram; uint8_t *vram;
} hercules_t; } hercules_t;
static int mdacols[256][2][2]; static uint32_t mdacols[256][2][2];
void hercules_recalctimings(hercules_t *hercules); void hercules_recalctimings(hercules_t *hercules);
void hercules_write(uint32_t addr, uint8_t val, void *p); void hercules_write(uint32_t addr, uint8_t val, void *p);
@ -153,7 +153,7 @@ void hercules_poll(void *p)
dat = (hercules->vram[((hercules->ma << 1) & 0x1fff) + ca] << 8) | hercules->vram[((hercules->ma << 1) & 0x1fff) + ca + 1]; dat = (hercules->vram[((hercules->ma << 1) & 0x1fff) + ca] << 8) | hercules->vram[((hercules->ma << 1) & 0x1fff) + ca + 1];
hercules->ma++; hercules->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
buffer->line[hercules->displine][(x << 4) + c] = (dat & (32768 >> c)) ? 7 : 0; ((uint32_t *)buffer32->line[hercules->displine])[(x << 4) + c] = (dat & (32768 >> c)) ? 0xffffff : 0;
} }
} }
else else
@ -167,20 +167,22 @@ void hercules_poll(void *p)
if (hercules->sc == 12 && ((attr & 7) == 1)) if (hercules->sc == 12 && ((attr & 7) == 1))
{ {
for (c = 0; c < 9; c++) for (c = 0; c < 9; c++)
buffer->line[hercules->displine][(x * 9) + c] = mdacols[attr][blink][1]; ((uint32_t *)buffer32->line[hercules->displine])[(x * 9) + c] = mdacols[attr][blink][1];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[hercules->displine][(x * 9) + c] = mdacols[attr][blink][(fontdatm[chr][hercules->sc] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[hercules->displine])[(x * 9) + c] = mdacols[attr][blink][(fontdatm[chr][hercules->sc] & (1 << (c ^ 7))) ? 1 : 0];
if ((chr & ~0x1f) == 0xc0) buffer->line[hercules->displine][(x * 9) + 8] = mdacols[attr][blink][fontdatm[chr][hercules->sc] & 1]; if ((chr & ~0x1f) == 0xc0)
else buffer->line[hercules->displine][(x * 9) + 8] = mdacols[attr][blink][0]; ((uint32_t *)buffer32->line[hercules->displine])[(x * 9) + 8] = mdacols[attr][blink][fontdatm[chr][hercules->sc] & 1];
else
((uint32_t *)buffer32->line[hercules->displine])[(x * 9) + 8] = mdacols[attr][blink][0];
} }
hercules->ma++; hercules->ma++;
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 9; c++) for (c = 0; c < 9; c++)
buffer->line[hercules->displine][(x * 9) + c] ^= mdacols[attr][0][1]; ((uint32_t *)buffer32->line[hercules->displine])[(x * 9) + c] ^= mdacols[attr][0][1];
} }
} }
} }
@ -268,7 +270,7 @@ void hercules_poll(void *p)
updatewindowsize(xsize, ysize); updatewindowsize(xsize, ysize);
} }
video_blit_memtoscreen_8(0, hercules->firstline, xsize, ysize); video_blit_memtoscreen(0, hercules->firstline, 0, ysize, xsize, ysize);
frames++; frames++;
if ((hercules->ctrl & 2) && (hercules->ctrl2 & 1)) if ((hercules->ctrl & 2) && (hercules->ctrl2 & 1))
@ -317,22 +319,22 @@ void *hercules_init()
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
{ {
mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = 16; mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = makecol32(0, 0, 0);
if (c & 8) mdacols[c][0][1] = 15 + 16; if (c & 8) mdacols[c][0][1] = makecol32(0xff, 0xff, 0xff);
else mdacols[c][0][1] = 7 + 16; else mdacols[c][0][1] = makecol32(0xaa, 0xaa, 0xaa);
} }
mdacols[0x70][0][1] = 16; mdacols[0x70][0][1] = makecol32(0, 0, 0);
mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = 16 + 15; mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0xF0][0][1] = 16; mdacols[0xF0][0][1] = makecol32(0, 0, 0);
mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = 16 + 15; mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0x78][0][1] = 16 + 7; mdacols[0x78][0][1] = makecol32(0xaa, 0xaa, 0xaa);
mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = 16 + 15; mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0xF8][0][1] = 16 + 7; mdacols[0xF8][0][1] = makecol32(0xaa, 0xaa, 0xaa);
mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = 16 + 15; mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0x00][0][1] = mdacols[0x00][1][1] = 16; mdacols[0x00][0][1] = mdacols[0x00][1][1] = makecol32(0, 0, 0);
mdacols[0x08][0][1] = mdacols[0x08][1][1] = 16; mdacols[0x08][0][1] = mdacols[0x08][1][1] = makecol32(0, 0, 0);
mdacols[0x80][0][1] = mdacols[0x80][1][1] = 16; mdacols[0x80][0][1] = mdacols[0x80][1][1] = makecol32(0, 0, 0);
mdacols[0x88][0][1] = mdacols[0x88][1][1] = 16; mdacols[0x88][0][1] = mdacols[0x88][1][1] = makecol32(0, 0, 0);
return hercules; return hercules;
} }

View file

@ -32,7 +32,7 @@ typedef struct mda_t
uint8_t *vram; uint8_t *vram;
} mda_t; } mda_t;
static int mdacols[256][2][2]; static uint32_t mdacols[256][2][2];
void mda_recalctimings(mda_t *mda); void mda_recalctimings(mda_t *mda);
@ -135,20 +135,22 @@ void mda_poll(void *p)
if (mda->sc == 12 && ((attr & 7) == 1)) if (mda->sc == 12 && ((attr & 7) == 1))
{ {
for (c = 0; c < 9; c++) for (c = 0; c < 9; c++)
buffer->line[mda->displine][(x * 9) + c] = mdacols[attr][blink][1]; ((uint32_t *)buffer32->line[mda->displine])[(x * 9) + c] = mdacols[attr][blink][1];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[mda->displine][(x * 9) + c] = mdacols[attr][blink][(fontdatm[chr][mda->sc] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[mda->displine])[(x * 9) + c] = mdacols[attr][blink][(fontdatm[chr][mda->sc] & (1 << (c ^ 7))) ? 1 : 0];
if ((chr & ~0x1f) == 0xc0) buffer->line[mda->displine][(x * 9) + 8] = mdacols[attr][blink][fontdatm[chr][mda->sc] & 1]; if ((chr & ~0x1f) == 0xc0)
else buffer->line[mda->displine][(x * 9) + 8] = mdacols[attr][blink][0]; ((uint32_t *)buffer32->line[mda->displine])[(x * 9) + 8] = mdacols[attr][blink][fontdatm[chr][mda->sc] & 1];
else
((uint32_t *)buffer32->line[mda->displine])[(x * 9) + 8] = mdacols[attr][blink][0];
} }
mda->ma++; mda->ma++;
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 9; c++) for (c = 0; c < 9; c++)
buffer->line[mda->displine][(x * 9) + c] ^= mdacols[attr][0][1]; ((uint32_t *)buffer32->line[mda->displine])[(x * 9) + c] ^= mdacols[attr][0][1];
} }
} }
} }
@ -233,7 +235,7 @@ void mda_poll(void *p)
updatewindowsize(xsize, ysize); updatewindowsize(xsize, ysize);
} }
video_blit_memtoscreen_8(0, mda->firstline, xsize, mda->lastline - mda->firstline); video_blit_memtoscreen(0, mda->firstline, 0, ysize, xsize, ysize);
frames++; frames++;
video_res_x = mda->crtc[1]; video_res_x = mda->crtc[1];
@ -273,22 +275,22 @@ void *mda_init()
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
{ {
mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = 16; mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = makecol32(0, 0, 0);
if (c & 8) mdacols[c][0][1] = 15 + 16; if (c & 8) mdacols[c][0][1] = makecol32(0xff, 0xff, 0xff);
else mdacols[c][0][1] = 7 + 16; else mdacols[c][0][1] = makecol32(0xaa, 0xaa, 0xaa);
} }
mdacols[0x70][0][1] = 16; mdacols[0x70][0][1] = makecol32(0, 0, 0);
mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = 16 + 15; mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0xF0][0][1] = 16; mdacols[0xF0][0][1] = makecol32(0, 0, 0);
mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = 16 + 15; mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0x78][0][1] = 16 + 7; mdacols[0x78][0][1] = makecol32(0xaa, 0xaa, 0xaa);
mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = 16 + 15; mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0xF8][0][1] = 16 + 7; mdacols[0xF8][0][1] = makecol32(0xaa, 0xaa, 0xaa);
mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = 16 + 15; mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = makecol32(0xff, 0xff, 0xff);
mdacols[0x00][0][1] = mdacols[0x00][1][1] = 16; mdacols[0x00][0][1] = mdacols[0x00][1][1] = makecol32(0, 0, 0);
mdacols[0x08][0][1] = mdacols[0x08][1][1] = 16; mdacols[0x08][0][1] = mdacols[0x08][1][1] = makecol32(0, 0, 0);
mdacols[0x80][0][1] = mdacols[0x80][1][1] = 16; mdacols[0x80][0][1] = mdacols[0x80][1][1] = makecol32(0, 0, 0);
mdacols[0x88][0][1] = mdacols[0x88][1][1] = 16; mdacols[0x88][0][1] = mdacols[0x88][1][1] = makecol32(0, 0, 0);
return mda; return mda;
} }

View file

@ -142,7 +142,7 @@ void m24_poll(void *p)
int oldvc; int oldvc;
uint8_t chr, attr; uint8_t chr, attr;
uint16_t dat, dat2; uint16_t dat, dat2;
int cols[4]; uint32_t cols[4];
int col; int col;
int oldsc; int oldsc;
if (!m24->linepos) if (!m24->linepos)
@ -167,15 +167,15 @@ void m24_poll(void *p)
{ {
if ((m24->cgamode & 0x12) == 0x12) if ((m24->cgamode & 0x12) == 0x12)
{ {
buffer->line[m24->displine][c] = 0; ((uint32_t *)buffer32->line[m24->displine])[c] = cgapal[0];
if (m24->cgamode & 1) buffer->line[m24->displine][c + (m24->crtc[1] << 3) + 8] = 0; if (m24->cgamode & 1) ((uint32_t *)buffer32->line[m24->displine])[c + (m24->crtc[1] << 3) + 8] = cgapal[0];
else buffer->line[m24->displine][c + (m24->crtc[1] << 4) + 8] = 0; else ((uint32_t *)buffer32->line[m24->displine])[c + (m24->crtc[1] << 4) + 8] = cgapal[0];
} }
else else
{ {
buffer->line[m24->displine][c] = (m24->cgacol & 15) + 16; ((uint32_t *)buffer32->line[m24->displine])[c] = cgapal[m24->cgacol & 15];
if (m24->cgamode & 1) buffer->line[m24->displine][c + (m24->crtc[1] << 3) + 8] = (m24->cgacol & 15) + 16; if (m24->cgamode & 1) ((uint32_t *)buffer32->line[m24->displine])[c + (m24->crtc[1] << 3) + 8] = cgapal[m24->cgacol & 15];
else buffer->line[m24->displine][c + (m24->crtc[1] << 4) + 8] = (m24->cgacol & 15) + 16; else ((uint32_t *)buffer32->line[m24->displine])[c + (m24->crtc[1] << 4) + 8] = cgapal[m24->cgacol & 15];
} }
} }
if (m24->cgamode & 1) if (m24->cgamode & 1)
@ -187,25 +187,25 @@ void m24_poll(void *p)
drawcursor = ((m24->ma == ca) && m24->con && m24->cursoron); drawcursor = ((m24->ma == ca) && m24->con && m24->cursoron);
if (m24->cgamode & 0x20) if (m24->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = cgapal[(attr >> 4) & 7];
if ((m24->blink & 16) && (attr & 0x80) && !drawcursor) if ((m24->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = (attr >> 4) + 16; cols[0] = cgapal[attr >> 4];
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[m24->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[m24->displine])[(x << 3) + c + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xffffff;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[m24->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[m24->displine])[(x << 3) + c + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0];
} }
m24->ma++; m24->ma++;
} }
@ -219,52 +219,52 @@ void m24_poll(void *p)
drawcursor = ((m24->ma == ca) && m24->con && m24->cursoron); drawcursor = ((m24->ma == ca) && m24->con && m24->cursoron);
if (m24->cgamode & 0x20) if (m24->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = cgapal[(attr >> 4) & 7];
if ((m24->blink & 16) && (attr & 0x80)) if ((m24->blink & 16) && (attr & 0x80))
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = (attr >> 4) + 16; cols[0] = cgapal[attr >> 4];
} }
m24->ma++; m24->ma++;
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[m24->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[m24->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xffffff;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[m24->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[m24->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdatm[chr][((m24->sc & 7) << 1) | m24->lineff] & (1 << (c ^ 7))) ? 1 : 0];
} }
} }
} }
else if (!(m24->cgamode & 16)) else if (!(m24->cgamode & 16))
{ {
cols[0] = (m24->cgacol & 15) | 16; cols[0] = cgapal[m24->cgacol & 15];
col = (m24->cgacol & 16) ? 24 : 16; col = (m24->cgacol & 16) ? 8 : 0;
if (m24->cgamode & 4) if (m24->cgamode & 4)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else if (m24->cgacol & 32) else if (m24->cgacol & 32)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 5; cols[2] = cgapal[col | 5];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else else
{ {
cols[1] = col | 2; cols[1] = cgapal[col | 2];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 6; cols[3] = cgapal[col | 6];
} }
for (x = 0; x < m24->crtc[1]; x++) for (x = 0; x < m24->crtc[1]; x++)
{ {
@ -273,8 +273,8 @@ void m24_poll(void *p)
m24->ma++; m24->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[m24->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[m24->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
@ -284,12 +284,14 @@ void m24_poll(void *p)
if (m24->ctrl & 1) if (m24->ctrl & 1)
{ {
dat2 = ((m24->sc & 1) * 0x4000) | (m24->lineff * 0x2000); dat2 = ((m24->sc & 1) * 0x4000) | (m24->lineff * 0x2000);
cols[0] = 0; cols[1] = /*(m24->cgacol & 15)*/15 + 16; cols[0] = cgapal[0];
cols[1] = cgapal[15];
} }
else else
{ {
dat2 = (m24->sc & 1) * 0x2000; dat2 = (m24->sc & 1) * 0x2000;
cols[0] = 0; cols[1] = (m24->cgacol & 15) + 16; cols[0] = cgapal[0];
cols[1] = cgapal[m24->cgacol & 15];
} }
for (x = 0; x < m24->crtc[1]; x++) for (x = 0; x < m24->crtc[1]; x++)
{ {
@ -297,7 +299,7 @@ void m24_poll(void *p)
m24->ma++; m24->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[m24->displine][(x << 4) + c + 8] = cols[dat >> 15]; ((uint32_t *)buffer32->line[m24->displine])[(x << 4) + c + 8] = cols[dat >> 15];
dat <<= 1; dat <<= 1;
} }
} }
@ -305,9 +307,9 @@ void m24_poll(void *p)
} }
else else
{ {
cols[0] = ((m24->cgamode & 0x12) == 0x12) ? 0 : (m24->cgacol & 15) + 16; cols[0] = cgapal[((m24->cgamode & 0x12) == 0x12) ? 0 : (m24->cgacol & 15)];
if (m24->cgamode & 1) hline(buffer, 0, m24->displine, (m24->crtc[1] << 3) + 16, cols[0]); if (m24->cgamode & 1) hline(buffer32, 0, m24->displine, (m24->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, m24->displine, (m24->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, m24->displine, (m24->crtc[1] << 4) + 16, cols[0]);
} }
if (m24->cgamode & 1) x = (m24->crtc[1] << 3) + 16; if (m24->cgamode & 1) x = (m24->crtc[1] << 3) + 16;
@ -396,7 +398,7 @@ void m24_poll(void *p)
updatewindowsize(xsize, ysize + 16); updatewindowsize(xsize, ysize + 16);
} }
video_blit_memtoscreen_8(0, m24->firstline - 8, xsize, (m24->lastline - m24->firstline) + 16); video_blit_memtoscreen(0, m24->firstline - 8, 0, (m24->lastline - m24->firstline) + 16, xsize, (m24->lastline - m24->firstline) + 16);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -187,15 +187,15 @@ static void pc1512_poll(void *p)
{ {
if ((pc1512->cgamode & 0x12) == 0x12) if ((pc1512->cgamode & 0x12) == 0x12)
{ {
buffer->line[pc1512->displine][c] = (pc1512->border & 15) + 16; ((uint32_t *)buffer32->line[pc1512->displine])[c] = cgapal[pc1512->border & 15];
if (pc1512->cgamode & 1) buffer->line[pc1512->displine][c + (pc1512->crtc[1] << 3) + 8] = 0; if (pc1512->cgamode & 1) ((uint32_t *)buffer32->line[pc1512->displine])[c + (pc1512->crtc[1] << 3) + 8] = 0;
else buffer->line[pc1512->displine][c + (pc1512->crtc[1] << 4) + 8] = 0; else ((uint32_t *)buffer32->line[pc1512->displine])[c + (pc1512->crtc[1] << 4) + 8] = 0;
} }
else else
{ {
buffer->line[pc1512->displine][c] = (pc1512->cgacol & 15) + 16; ((uint32_t *)buffer32->line[pc1512->displine])[c] = cgapal[pc1512->cgacol & 15];
if (pc1512->cgamode & 1) buffer->line[pc1512->displine][c + (pc1512->crtc[1] << 3) + 8] = (pc1512->cgacol & 15) + 16; if (pc1512->cgamode & 1) ((uint32_t *)buffer32->line[pc1512->displine])[c + (pc1512->crtc[1] << 3) + 8] = cgapal[pc1512->cgacol & 15];
else buffer->line[pc1512->displine][c + (pc1512->crtc[1] << 4) + 8] = (pc1512->cgacol & 15) + 16; else ((uint32_t *)buffer32->line[pc1512->displine])[c + (pc1512->crtc[1] << 4) + 8] = cgapal[pc1512->cgacol & 15];
} }
} }
if (pc1512->cgamode & 1) if (pc1512->cgamode & 1)
@ -207,25 +207,25 @@ static void pc1512_poll(void *p)
drawcursor = ((pc1512->ma == ca) && pc1512->con && pc1512->cursoron); drawcursor = ((pc1512->ma == ca) && pc1512->con && pc1512->cursoron);
if (pc1512->cgamode & 0x20) if (pc1512->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = cgapal[(attr >> 4) & 7];
if ((pc1512->blink & 16) && (attr & 0x80) && !drawcursor) if ((pc1512->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = (attr >> 4) + 16; cols[0] = cgapal[attr >> 4];
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pc1512->displine][(x << 3) + c + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pc1512->displine][(x << 3) + c + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
pc1512->ma++; pc1512->ma++;
} }
@ -239,52 +239,52 @@ static void pc1512_poll(void *p)
drawcursor = ((pc1512->ma == ca) && pc1512->con && pc1512->cursoron); drawcursor = ((pc1512->ma == ca) && pc1512->con && pc1512->cursoron);
if (pc1512->cgamode & 0x20) if (pc1512->cgamode & 0x20)
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = ((attr >> 4) & 7) + 16; cols[0] = cgapal[(attr >> 4) & 7];
if ((pc1512->blink & 16) && (attr & 0x80)) if ((pc1512->blink & 16) && (attr & 0x80))
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = (attr & 15) + 16; cols[1] = cgapal[attr & 15];
cols[0] = (attr >> 4) + 16; cols[0] = cgapal[attr >> 4];
} }
pc1512->ma++; pc1512->ma++;
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xffffff;
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pc1512->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
} }
} }
else if (!(pc1512->cgamode&16)) else if (!(pc1512->cgamode&16))
{ {
cols[0] = (pc1512->cgacol & 15) | 16; cols[0] = cgapal[pc1512->cgacol & 15];
col = (pc1512->cgacol & 16) ? 24 : 16; col = (pc1512->cgacol & 16) ? 8 : 0;
if (pc1512->cgamode & 4) if (pc1512->cgamode & 4)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else if (pc1512->cgacol & 32) else if (pc1512->cgacol & 32)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 5; cols[2] = cgapal[col | 5];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else else
{ {
cols[1] = col | 2; cols[1] = cgapal[col | 2];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 6; cols[3] = cgapal[col | 6];
} }
for (x = 0; x < 40; x++) for (x = 0; x < 40; x++)
{ {
@ -292,8 +292,8 @@ static void pc1512_poll(void *p)
pc1512->ma++; pc1512->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pc1512->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
@ -311,7 +311,7 @@ static void pc1512_poll(void *p)
pc1512->ma++; pc1512->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[pc1512->displine][(x << 4) + c + 8] = (((dat >> 15) | ((dat2 >> 15) << 1) | ((dat3 >> 15) << 2) | ((dat4 >> 15) << 3)) & (pc1512->cgacol & 15)) + 16; ((uint32_t *)buffer32->line[pc1512->displine])[(x << 4) + c + 8] = cgapal[((dat >> 15) | ((dat2 >> 15) << 1) | ((dat3 >> 15) << 2) | ((dat4 >> 15) << 3)) & (pc1512->cgacol & 15)];
dat <<= 1; dat <<= 1;
dat2 <<= 1; dat2 <<= 1;
dat3 <<= 1; dat3 <<= 1;
@ -322,9 +322,9 @@ static void pc1512_poll(void *p)
} }
else else
{ {
cols[0] = ((pc1512->cgamode & 0x12) == 0x12) ? 0 : (pc1512->cgacol & 15) + 16; cols[0] = cgapal[((pc1512->cgamode & 0x12) == 0x12) ? 0 : (pc1512->cgacol & 15)];
if (pc1512->cgamode & 1) hline(buffer, 0, pc1512->displine, (pc1512->crtc[1] << 3) + 16, cols[0]); if (pc1512->cgamode & 1) hline(buffer32, 0, pc1512->displine, (pc1512->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, pc1512->displine, (pc1512->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, pc1512->displine, (pc1512->crtc[1] << 4) + 16, cols[0]);
} }
pc1512->sc = oldsc; pc1512->sc = oldsc;
@ -402,7 +402,7 @@ static void pc1512_poll(void *p)
updatewindowsize(xsize, (ysize << 1) + 16); updatewindowsize(xsize, (ysize << 1) + 16);
} }
video_blit_memtoscreen_8(0, pc1512->firstline - 4, xsize, (pc1512->lastline - pc1512->firstline) + 8); video_blit_memtoscreen(0, pc1512->firstline - 4, 0, (pc1512->lastline - pc1512->firstline) + 8, xsize, (pc1512->lastline - pc1512->firstline) + 8);
// blit(buffer,vbuf,0,firstline-4,0,0,xsize,(lastline-firstline)+8+1); // blit(buffer,vbuf,0,firstline-4,0,0,xsize,(lastline-firstline)+8+1);
// if (vid_resize) stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,winsizex,winsizey); // if (vid_resize) stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,winsizex,winsizey);
// else stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,xsize,((lastline-firstline)<<1)+16+2); // else stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,xsize,((lastline-firstline)<<1)+16+2);

View file

@ -206,12 +206,12 @@ void pcjr_poll(void *p)
video_wait_for_buffer(); video_wait_for_buffer();
} }
pcjr->lastline = pcjr->displine; pcjr->lastline = pcjr->displine;
cols[0] = (pcjr->array[2] & 0xf) + 16; cols[0] = pcjr->array[2] & 0xf;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[pcjr->displine][c] = cols[0]; ((uint32_t *)buffer32->line[pcjr->displine])[c] = cols[0];
if (pcjr->array[0] & 1) buffer->line[pcjr->displine][c + (pcjr->crtc[1] << 3) + 8] = cols[0]; if (pcjr->array[0] & 1) ((uint32_t *)buffer32->line[pcjr->displine])[c + (pcjr->crtc[1] << 3) + 8] = cols[0];
else buffer->line[pcjr->displine][c + (pcjr->crtc[1] << 4) + 8] = cols[0]; else ((uint32_t *)buffer32->line[pcjr->displine])[c + (pcjr->crtc[1] << 4) + 8] = cols[0];
} }
switch (pcjr->addr_mode) switch (pcjr->addr_mode)
@ -235,14 +235,14 @@ void pcjr_poll(void *p)
dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) |
pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1];
pcjr->ma++; pcjr->ma++;
buffer->line[pcjr->displine][(x << 3) + 8] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 8] =
buffer->line[pcjr->displine][(x << 3) + 9] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 9] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 3) + 10] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 10] =
buffer->line[pcjr->displine][(x << 3) + 11] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 11] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 3) + 12] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 12] =
buffer->line[pcjr->displine][(x << 3) + 13] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 13] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 3) + 14] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 14] =
buffer->line[pcjr->displine][(x << 3) + 15] = pcjr->array[(dat & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 15] = pcjr->array[(dat & pcjr->array[1]) + 16];
} }
break; break;
case 0x12: /*160x200x16*/ case 0x12: /*160x200x16*/
@ -251,22 +251,22 @@ void pcjr_poll(void *p)
dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) |
pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1];
pcjr->ma++; pcjr->ma++;
buffer->line[pcjr->displine][(x << 4) + 8] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 8] =
buffer->line[pcjr->displine][(x << 4) + 9] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 9] =
buffer->line[pcjr->displine][(x << 4) + 10] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 10] =
buffer->line[pcjr->displine][(x << 4) + 11] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 11] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 4) + 12] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 12] =
buffer->line[pcjr->displine][(x << 4) + 13] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 13] =
buffer->line[pcjr->displine][(x << 4) + 14] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 14] =
buffer->line[pcjr->displine][(x << 4) + 15] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 15] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 4) + 16] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 16] =
buffer->line[pcjr->displine][(x << 4) + 17] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 17] =
buffer->line[pcjr->displine][(x << 4) + 18] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 18] =
buffer->line[pcjr->displine][(x << 4) + 19] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 19] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16];
buffer->line[pcjr->displine][(x << 4) + 20] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 20] =
buffer->line[pcjr->displine][(x << 4) + 21] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 21] =
buffer->line[pcjr->displine][(x << 4) + 22] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 22] =
buffer->line[pcjr->displine][(x << 4) + 23] = pcjr->array[(dat & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + 23] = pcjr->array[(dat & pcjr->array[1]) + 16];
} }
break; break;
case 0x03: /*640x200x4*/ case 0x03: /*640x200x4*/
@ -279,7 +279,7 @@ void pcjr_poll(void *p)
{ {
chr = (dat >> 7) & 1; chr = (dat >> 7) & 1;
chr |= ((dat >> 14) & 2); chr |= ((dat >> 14) & 2);
buffer->line[pcjr->displine][(x << 3) + 8 + c] = pcjr->array[(chr & pcjr->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + 8 + c] = pcjr->array[(chr & pcjr->array[1]) + 16];
dat <<= 1; dat <<= 1;
} }
} }
@ -292,31 +292,31 @@ void pcjr_poll(void *p)
drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron);
if (pcjr->array[3] & 4) if (pcjr->array[3] & 4)
{ {
cols[1] = pcjr->array[ ((attr & 15) & pcjr->array[1]) + 16] + 16; cols[1] = pcjr->array[ ((attr & 15) & pcjr->array[1]) + 16];
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16; cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16];
if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor) if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16];
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16];
} }
if (pcjr->sc & 8) if (pcjr->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pcjr->displine][(x << 3) + c + 8] = cols[0]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + c + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pcjr->displine][(x << 3) + c + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
// if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma); // if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma);
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pcjr->displine][(x << 3) + c + 8] ^= 15; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 3) + c + 8] ^= 15;
} }
pcjr->ma++; pcjr->ma++;
} }
@ -329,41 +329,41 @@ void pcjr_poll(void *p)
drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron);
if (pcjr->array[3] & 4) if (pcjr->array[3] & 4)
{ {
cols[1] = pcjr->array[ ((attr & 15) & pcjr->array[1]) + 16] + 16; cols[1] = pcjr->array[ ((attr & 15) & pcjr->array[1]) + 16];
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16; cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16];
if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor) if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16];
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16];
} }
pcjr->ma++; pcjr->ma++;
if (pcjr->sc & 8) if (pcjr->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 1 + 8] = cols[0]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
buffer->line[pcjr->displine][(x << 4) + c + 8] ^= 15; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + c + 8] ^= 15;
} }
} }
break; break;
case 0x02: /*320x200x4*/ case 0x02: /*320x200x4*/
cols[0] = pcjr->array[0 + 16] + 16; cols[0] = pcjr->array[0 + 16];
cols[1] = pcjr->array[1 + 16] + 16; cols[1] = pcjr->array[1 + 16];
cols[2] = pcjr->array[2 + 16] + 16; cols[2] = pcjr->array[2 + 16];
cols[3] = pcjr->array[3 + 16] + 16; cols[3] = pcjr->array[3 + 16];
for (x = 0; x < pcjr->crtc[1]; x++) for (x = 0; x < pcjr->crtc[1]; x++)
{ {
dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) |
@ -371,15 +371,15 @@ void pcjr_poll(void *p)
pcjr->ma++; pcjr->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[pcjr->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
break; break;
case 0x102: /*640x200x2*/ case 0x102: /*640x200x2*/
cols[0] = pcjr->array[0 + 16] + 16; cols[0] = pcjr->array[0 + 16];
cols[1] = pcjr->array[1 + 16] + 16; cols[1] = pcjr->array[1 + 16];
for (x = 0; x < pcjr->crtc[1]; x++) for (x = 0; x < pcjr->crtc[1]; x++)
{ {
dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) |
@ -387,7 +387,7 @@ void pcjr_poll(void *p)
pcjr->ma++; pcjr->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[pcjr->displine][(x << 4) + c + 8] = cols[dat >> 15]; ((uint32_t *)buffer32->line[pcjr->displine])[(x << 4) + c + 8] = cols[dat >> 15];
dat <<= 1; dat <<= 1;
} }
} }
@ -398,15 +398,15 @@ void pcjr_poll(void *p)
{ {
if (pcjr->array[3] & 4) if (pcjr->array[3] & 4)
{ {
if (pcjr->array[0] & 1) hline(buffer, 0, pcjr->displine, (pcjr->crtc[1] << 3) + 16, (pcjr->array[2] & 0xf) + 16); if (pcjr->array[0] & 1) hline(buffer32, 0, pcjr->displine, (pcjr->crtc[1] << 3) + 16, pcjr->array[2] & 0xf);
else hline(buffer, 0, pcjr->displine, (pcjr->crtc[1] << 4) + 16, (pcjr->array[2] & 0xf) + 16); else hline(buffer32, 0, pcjr->displine, (pcjr->crtc[1] << 4) + 16, pcjr->array[2] & 0xf);
} }
else else
{ {
// cols[0] = ((pcjr->mode & 0x12) == 0x12) ? 0 : (pcjr->col & 0xf) + 16; // cols[0] = ((pcjr->mode & 0x12) == 0x12) ? 0 : (pcjr->col & 0xf) + 16;
cols[0] = pcjr->array[0 + 16] + 16; cols[0] = pcjr->array[0 + 16];
if (pcjr->array[0] & 1) hline(buffer, 0, pcjr->displine, (pcjr->crtc[1] << 3) + 16, cols[0]); if (pcjr->array[0] & 1) hline(buffer32, 0, pcjr->displine, (pcjr->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, pcjr->displine, (pcjr->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, pcjr->displine, (pcjr->crtc[1] << 4) + 16, cols[0]);
} }
} }
if (pcjr->array[0] & 1) x = (pcjr->crtc[1] << 3) + 16; if (pcjr->array[0] & 1) x = (pcjr->crtc[1] << 3) + 16;
@ -414,10 +414,15 @@ void pcjr_poll(void *p)
if (pcjr->composite) if (pcjr->composite)
{ {
for (c = 0; c < x; c++) for (c = 0; c < x; c++)
buffer32->line[pcjr->displine][c] = buffer->line[pcjr->displine][c] & 0xf; buffer32->line[pcjr->displine][c] = ((uint32_t *)buffer32->line[pcjr->displine])[c] & 0xf;
Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[pcjr->displine]); Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[pcjr->displine]);
} }
else
{
for (c = 0; c < x; c++)
((uint32_t *)buffer32->line[pcjr->displine])[c] = cgapal[((uint32_t *)buffer32->line[pcjr->displine])[c] & 0xf];
}
pcjr->sc = oldsc; pcjr->sc = oldsc;
if (pcjr->vc == pcjr->crtc[7] && !pcjr->sc) if (pcjr->vc == pcjr->crtc[7] && !pcjr->sc)
{ {
@ -514,10 +519,7 @@ void pcjr_poll(void *p)
// printf("Blit %i %i\n",firstline,lastline); // printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize); //printf("Xsize is %i\n",xsize);
if (pcjr->composite) video_blit_memtoscreen(0, pcjr->firstline-4, 0, (pcjr->lastline - pcjr->firstline) + 8, xsize, (pcjr->lastline - pcjr->firstline) + 8);
video_blit_memtoscreen(0, pcjr->firstline-4, 0, (pcjr->lastline - pcjr->firstline) + 8, xsize, (pcjr->lastline - pcjr->firstline) + 8);
else
video_blit_memtoscreen_8(0, pcjr->firstline-4, xsize, (pcjr->lastline - pcjr->firstline) + 8);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -223,26 +223,26 @@ void tandy_poll(void *p)
// printf("Firstline %i\n",firstline); // printf("Firstline %i\n",firstline);
} }
tandy->lastline = tandy->displine; tandy->lastline = tandy->displine;
cols[0] = (tandy->array[2] & 0xf) + 16; cols[0] = tandy->array[2] & 0xf;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
if (tandy->array[3] & 4) if (tandy->array[3] & 4)
{ {
buffer->line[tandy->displine][c] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[c] = cols[0];
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = cols[0]; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = cols[0];
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = cols[0]; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = cols[0];
} }
else if ((tandy->mode & 0x12) == 0x12) else if ((tandy->mode & 0x12) == 0x12)
{ {
buffer->line[tandy->displine][c] = 0; ((uint32_t *)buffer32->line[tandy->displine])[c] = 0;
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = 0; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = 0;
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = 0; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = 0;
} }
else else
{ {
buffer->line[tandy->displine][c] = (tandy->col & 15) + 16; ((uint32_t *)buffer32->line[tandy->displine])[c] = tandy->col & 15;
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = (tandy->col & 15) + 16; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = tandy->col & 15;
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = (tandy->col & 15) + 16; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = tandy->col & 15;
} }
} }
// printf("X %i %i\n",c+(crtc[1]<<4)+8,c+(crtc[1]<<3)+8); // printf("X %i %i\n",c+(crtc[1]<<4)+8,c+(crtc[1]<<3)+8);
@ -254,14 +254,14 @@ void tandy_poll(void *p)
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) |
tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1]; tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1];
tandy->ma++; tandy->ma++;
buffer->line[tandy->displine][(x << 3) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 8] =
buffer->line[tandy->displine][(x << 3) + 9] = tandy->array[((dat >> 12) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 9] = tandy->array[((dat >> 12) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 3) + 10] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 10] =
buffer->line[tandy->displine][(x << 3) + 11] = tandy->array[((dat >> 8) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 11] = tandy->array[((dat >> 8) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 3) + 12] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 12] =
buffer->line[tandy->displine][(x << 3) + 13] = tandy->array[((dat >> 4) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 13] = tandy->array[((dat >> 4) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 3) + 14] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 14] =
buffer->line[tandy->displine][(x << 3) + 15] = tandy->array[(dat & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 15] = tandy->array[(dat & tandy->array[1]) + 16];
} }
} }
else if (tandy->array[3] & 0x10) /*160x200x16*/ else if (tandy->array[3] & 0x10) /*160x200x16*/
@ -271,22 +271,22 @@ void tandy_poll(void *p)
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) |
tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1]; tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1];
tandy->ma++; tandy->ma++;
buffer->line[tandy->displine][(x << 4) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 8] =
buffer->line[tandy->displine][(x << 4) + 9] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 9] =
buffer->line[tandy->displine][(x << 4) + 10] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 10] =
buffer->line[tandy->displine][(x << 4) + 11] = tandy->array[((dat >> 12) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 11] = tandy->array[((dat >> 12) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 4) + 12] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 12] =
buffer->line[tandy->displine][(x << 4) + 13] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 13] =
buffer->line[tandy->displine][(x << 4) + 14] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 14] =
buffer->line[tandy->displine][(x << 4) + 15] = tandy->array[((dat >> 8) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 15] = tandy->array[((dat >> 8) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 4) + 16] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 16] =
buffer->line[tandy->displine][(x << 4) + 17] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 17] =
buffer->line[tandy->displine][(x << 4) + 18] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 18] =
buffer->line[tandy->displine][(x << 4) + 19] = tandy->array[((dat >> 4) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 19] = tandy->array[((dat >> 4) & tandy->array[1]) + 16];
buffer->line[tandy->displine][(x << 4) + 20] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 20] =
buffer->line[tandy->displine][(x << 4) + 21] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 21] =
buffer->line[tandy->displine][(x << 4) + 22] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 22] =
buffer->line[tandy->displine][(x << 4) + 23] = tandy->array[(dat & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 23] = tandy->array[(dat & tandy->array[1]) + 16];
} }
} }
else if (tandy->array[3] & 0x08) /*640x200x4 - this implementation is a complete guess!*/ else if (tandy->array[3] & 0x08) /*640x200x4 - this implementation is a complete guess!*/
@ -300,7 +300,7 @@ void tandy_poll(void *p)
{ {
chr = (dat >> 7) & 1; chr = (dat >> 7) & 1;
chr |= ((dat >> 14) & 2); chr |= ((dat >> 14) & 2);
buffer->line[tandy->displine][(x << 3) + 8 + c] = tandy->array[(chr & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 8 + c] = tandy->array[(chr & tandy->array[1]) + 16];
dat <<= 1; dat <<= 1;
} }
} }
@ -314,31 +314,31 @@ void tandy_poll(void *p)
drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron); drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron);
if (tandy->mode & 0x20) if (tandy->mode & 0x20)
{ {
cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16];
cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16] + 16; cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16];
if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor) if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16];
cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16] + 16; cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16];
} }
if (tandy->sc & 8) if (tandy->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
// if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma); // if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma);
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] ^= 15; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] ^= 0xffffff;
} }
tandy->ma++; tandy->ma++;
} }
@ -352,40 +352,40 @@ void tandy_poll(void *p)
drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron); drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron);
if (tandy->mode & 0x20) if (tandy->mode & 0x20)
{ {
cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16];
cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16] + 16; cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16];
if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor) if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16];
cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16] + 16; cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16];
} }
tandy->ma++; tandy->ma++;
if (tandy->sc & 8) if (tandy->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
buffer->line[tandy->displine][(x << 4) + c + 8] ^= 15; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + c + 8] ^= 0xffffff;
} }
} }
} }
else if (!(tandy->mode& 16)) else if (!(tandy->mode & 16))
{ {
cols[0] = (tandy->col & 15) | 16; cols[0] = tandy->col & 15;
col = (tandy->col & 16) ? 24 : 16; col = (tandy->col & 16) ? 8 : 0;
if (tandy->mode & 4) if (tandy->mode & 4)
{ {
cols[1] = col | 3; cols[1] = col | 3;
@ -411,8 +411,8 @@ void tandy_poll(void *p)
tandy->ma++; tandy->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
@ -420,7 +420,7 @@ void tandy_poll(void *p)
else else
{ {
cols[0] = 0; cols[0] = 0;
cols[1] = tandy->array[(tandy->col & tandy->array[1]) + 16] + 16; cols[1] = tandy->array[(tandy->col & tandy->array[1]) + 16];
for (x = 0; x < tandy->crtc[1]; x++) for (x = 0; x < tandy->crtc[1]; x++)
{ {
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) |
@ -428,7 +428,7 @@ void tandy_poll(void *p)
tandy->ma++; tandy->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[tandy->displine][(x << 4) + c + 8] = cols[dat >> 15]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + c + 8] = cols[dat >> 15];
dat <<= 1; dat <<= 1;
} }
} }
@ -438,14 +438,14 @@ void tandy_poll(void *p)
{ {
if (tandy->array[3] & 4) if (tandy->array[3] & 4)
{ {
if (tandy->mode & 1) hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, (tandy->array[2] & 0xf) + 16); if (tandy->mode & 1) hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, tandy->array[2] & 0xf);
else hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, (tandy->array[2] & 0xf) + 16); else hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, tandy->array[2] & 0xf);
} }
else else
{ {
cols[0] = ((tandy->mode & 0x12) == 0x12) ? 0 : (tandy->col & 0xf) + 16; cols[0] = ((tandy->mode & 0x12) == 0x12) ? 0 : (tandy->col & 0xf);
if (tandy->mode & 1) hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, cols[0]); if (tandy->mode & 1) hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, cols[0]);
} }
} }
if (tandy->mode & 1) x = (tandy->crtc[1] << 3) + 16; if (tandy->mode & 1) x = (tandy->crtc[1] << 3) + 16;
@ -454,10 +454,15 @@ void tandy_poll(void *p)
if (tandy->composite) if (tandy->composite)
{ {
for (c = 0; c < x; c++) for (c = 0; c < x; c++)
buffer32->line[tandy->displine][c] = buffer->line[tandy->displine][c] & 0xf; buffer32->line[tandy->displine][c] = ((uint32_t *)buffer32->line[tandy->displine])[c] & 0xf;
Composite_Process(tandy->mode, 0, x >> 2, buffer32->line[tandy->displine]); Composite_Process(tandy->mode, 0, x >> 2, buffer32->line[tandy->displine]);
} }
else
{
for (c = 0; c < x; c++)
((uint32_t *)buffer32->line[tandy->displine])[c] = cgapal[((uint32_t *)buffer32->line[tandy->displine])[c] & 0xf];
}
tandy->sc = oldsc; tandy->sc = oldsc;
if (tandy->vc == tandy->crtc[7] && !tandy->sc) if (tandy->vc == tandy->crtc[7] && !tandy->sc)
@ -553,10 +558,7 @@ void tandy_poll(void *p)
// printf("Blit %i %i\n",firstline,lastline); // printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize); //printf("Xsize is %i\n",xsize);
if (tandy->composite) video_blit_memtoscreen(0, tandy->firstline-4, 0, (tandy->lastline - tandy->firstline) + 8, xsize, (tandy->lastline - tandy->firstline) + 8);
video_blit_memtoscreen(0, tandy->firstline-4, 0, (tandy->lastline - tandy->firstline) + 8, xsize, (tandy->lastline - tandy->firstline) + 8);
else
video_blit_memtoscreen_8(0, tandy->firstline-4, xsize, (tandy->lastline - tandy->firstline) + 8);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -287,26 +287,26 @@ static void tandysl_poll(void *p)
// printf("Firstline %i\n",firstline); // printf("Firstline %i\n",firstline);
} }
tandy->lastline = tandy->displine; tandy->lastline = tandy->displine;
cols[0] = (tandy->array[2] & 0xf) + 16; cols[0] = cgapal[tandy->array[2] & 0xf];
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
if (tandy->array[3] & 4) if (tandy->array[3] & 4)
{ {
buffer->line[tandy->displine][c] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[c] = cols[0];
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = cols[0]; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = cols[0];
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = cols[0]; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = cols[0];
} }
else if ((tandy->mode & 0x12) == 0x12) else if ((tandy->mode & 0x12) == 0x12)
{ {
buffer->line[tandy->displine][c] = 0; ((uint32_t *)buffer32->line[tandy->displine])[c] = cgapal[0];
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = 0; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = cgapal[0];
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = 0; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = cgapal[0];
} }
else else
{ {
buffer->line[tandy->displine][c] = (tandy->col & 15) + 16; ((uint32_t *)buffer32->line[tandy->displine])[c] = cgapal[tandy->col & 15];
if (tandy->mode & 1) buffer->line[tandy->displine][c + (tandy->crtc[1] << 3) + 8] = (tandy->col & 15) + 16; if (tandy->mode & 1) ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 3) + 8] = cgapal[tandy->col & 15];
else buffer->line[tandy->displine][c + (tandy->crtc[1] << 4) + 8] = (tandy->col & 15) + 16; else ((uint32_t *)buffer32->line[tandy->displine])[c + (tandy->crtc[1] << 4) + 8] = cgapal[tandy->col & 15];
} }
} }
if (tandy->array[5] & 1) /*640x200x16*/ if (tandy->array[5] & 1) /*640x200x16*/
@ -316,10 +316,10 @@ static void tandysl_poll(void *p)
dat = (tandy->vram[(tandy->ma << 1) & 0xffff] << 8) | dat = (tandy->vram[(tandy->ma << 1) & 0xffff] << 8) |
tandy->vram[((tandy->ma << 1) + 1) & 0xffff]; tandy->vram[((tandy->ma << 1) + 1) & 0xffff];
tandy->ma++; tandy->ma++;
buffer->line[tandy->displine][(x << 2) + 8] = tandy->array[((dat >> 12) & 0xf)/*tandy->array[1])*/ + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 2) + 8] = cgapal[tandy->array[((dat >> 12) & 0xf)/*tandy->array[1])*/ + 16]];
buffer->line[tandy->displine][(x << 2) + 9] = tandy->array[((dat >> 8) & 0xf)/*tandy->array[1])*/ + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 2) + 9] = cgapal[tandy->array[((dat >> 8) & 0xf)/*tandy->array[1])*/ + 16]];
buffer->line[tandy->displine][(x << 2) + 10] = tandy->array[((dat >> 4) & 0xf)/*tandy->array[1])*/ + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 2) + 10] = cgapal[tandy->array[((dat >> 4) & 0xf)/*tandy->array[1])*/ + 16]];
buffer->line[tandy->displine][(x << 2) + 11] = tandy->array[(dat & 0xf)/*tandy->array[1])*/ + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 2) + 11] = cgapal[tandy->array[(dat & 0xf)/*tandy->array[1])*/ + 16]];
} }
} }
else if ((tandy->array[3] & 0x10) && (tandy->mode & 1)) /*320x200x16*/ else if ((tandy->array[3] & 0x10) && (tandy->mode & 1)) /*320x200x16*/
@ -329,14 +329,14 @@ static void tandysl_poll(void *p)
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000)] << 8) |
tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1]; tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 3) * 0x2000) + 1];
tandy->ma++; tandy->ma++;
buffer->line[tandy->displine][(x << 3) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 8] =
buffer->line[tandy->displine][(x << 3) + 9] = tandy->array[((dat >> 12) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 9] = cgapal[tandy->array[((dat >> 12) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 3) + 10] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 10] =
buffer->line[tandy->displine][(x << 3) + 11] = tandy->array[((dat >> 8) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 11] = cgapal[tandy->array[((dat >> 8) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 3) + 12] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 12] =
buffer->line[tandy->displine][(x << 3) + 13] = tandy->array[((dat >> 4) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 13] = cgapal[tandy->array[((dat >> 4) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 3) + 14] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 14] =
buffer->line[tandy->displine][(x << 3) + 15] = tandy->array[(dat & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 15] = cgapal[tandy->array[(dat & tandy->array[1]) + 16]];
} }
} }
else if (tandy->array[3] & 0x10) /*160x200x16*/ else if (tandy->array[3] & 0x10) /*160x200x16*/
@ -346,22 +346,22 @@ static void tandysl_poll(void *p)
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) |
tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000) + 1]; tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000) + 1];
tandy->ma++; tandy->ma++;
buffer->line[tandy->displine][(x << 4) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 8] =
buffer->line[tandy->displine][(x << 4) + 9] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 9] =
buffer->line[tandy->displine][(x << 4) + 10] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 10] =
buffer->line[tandy->displine][(x << 4) + 11] = tandy->array[((dat >> 12) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 11] = cgapal[tandy->array[((dat >> 12) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 4) + 12] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 12] =
buffer->line[tandy->displine][(x << 4) + 13] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 13] =
buffer->line[tandy->displine][(x << 4) + 14] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 14] =
buffer->line[tandy->displine][(x << 4) + 15] = tandy->array[((dat >> 8) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 15] = cgapal[tandy->array[((dat >> 8) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 4) + 16] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 16] =
buffer->line[tandy->displine][(x << 4) + 17] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 17] =
buffer->line[tandy->displine][(x << 4) + 18] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 18] =
buffer->line[tandy->displine][(x << 4) + 19] = tandy->array[((dat >> 4) & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 19] = cgapal[tandy->array[((dat >> 4) & tandy->array[1]) + 16]];
buffer->line[tandy->displine][(x << 4) + 20] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 20] =
buffer->line[tandy->displine][(x << 4) + 21] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 21] =
buffer->line[tandy->displine][(x << 4) + 22] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 22] =
buffer->line[tandy->displine][(x << 4) + 23] = tandy->array[(dat & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + 23] = cgapal[tandy->array[(dat & tandy->array[1]) + 16]];
} }
} }
else if (tandy->array[3] & 0x08) /*640x200x4 - this implementation is a complete guess!*/ else if (tandy->array[3] & 0x08) /*640x200x4 - this implementation is a complete guess!*/
@ -375,7 +375,7 @@ static void tandysl_poll(void *p)
{ {
chr = (dat >> 7) & 1; chr = (dat >> 7) & 1;
chr |= ((dat >> 14) & 2); chr |= ((dat >> 14) & 2);
buffer->line[tandy->displine][(x << 3) + 8 + c] = tandy->array[(chr & tandy->array[1]) + 16] + 16; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + 8 + c] = cgapal[tandy->array[(chr & tandy->array[1]) + 16]];
dat <<= 1; dat <<= 1;
} }
} }
@ -389,31 +389,31 @@ static void tandysl_poll(void *p)
drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron); drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron);
if (tandy->mode & 0x20) if (tandy->mode & 0x20)
{ {
cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = cgapal[tandy->array[ ((attr & 15) & tandy->array[1]) + 16]];
cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16] + 16; cols[0] = cgapal[tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16]];
if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor) if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = cgapal[tandy->array[((attr & 15) & tandy->array[1]) + 16]];
cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16] + 16; cols[0] = cgapal[tandy->array[((attr >> 4) & tandy->array[1]) + 16]];
} }
if (tandy->sc & 8) if (tandy->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
// if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma); // if (!((ma^(crtc[15]|(crtc[14]<<8)))&0x3FFF)) printf("Cursor match! %04X\n",ma);
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 3) + c + 8] ^= 15; ((uint32_t *)buffer32->line[tandy->displine])[(x << 3) + c + 8] ^= 0xffffff;
} }
tandy->ma++; tandy->ma++;
} }
@ -427,57 +427,57 @@ static void tandysl_poll(void *p)
drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron); drawcursor = ((tandy->ma == ca) && tandy->con && tandy->cursoron);
if (tandy->mode & 0x20) if (tandy->mode & 0x20)
{ {
cols[1] = tandy->array[ ((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = cgapal[tandy->array[ ((attr & 15) & tandy->array[1]) + 16]];
cols[0] = tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16] + 16; cols[0] = cgapal[tandy->array[(((attr >> 4) & 7) & tandy->array[1]) + 16]];
if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor) if ((tandy->blink & 16) && (attr & 0x80) && !drawcursor)
cols[1] = cols[0]; cols[1] = cols[0];
} }
else else
{ {
cols[1] = tandy->array[((attr & 15) & tandy->array[1]) + 16] + 16; cols[1] = cgapal[tandy->array[((attr & 15) & tandy->array[1]) + 16]];
cols[0] = tandy->array[((attr >> 4) & tandy->array[1]) + 16] + 16; cols[0] = cgapal[tandy->array[((attr >> 4) & tandy->array[1]) + 16]];
} }
tandy->ma++; tandy->ma++;
if (tandy->sc & 8) if (tandy->sc & 8)
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[0];
} }
else else
{ {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][tandy->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
buffer->line[tandy->displine][(x << 4) + c + 8] ^= 15; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + c + 8] ^= 0xffffff;
} }
} }
} }
else if (!(tandy->mode& 16)) else if (!(tandy->mode & 16))
{ {
cols[0] = (tandy->col & 15) | 16; cols[0] = cgapal[tandy->col & 15];
col = (tandy->col & 16) ? 24 : 16; col = (tandy->col & 16) ? 8 : 0;
if (tandy->mode & 4) if (tandy->mode & 4)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else if (tandy->col & 32) else if (tandy->col & 32)
{ {
cols[1] = col | 3; cols[1] = cgapal[col | 3];
cols[2] = col | 5; cols[2] = cgapal[col | 5];
cols[3] = col | 7; cols[3] = cgapal[col | 7];
} }
else else
{ {
cols[1] = col | 2; cols[1] = cgapal[col | 2];
cols[2] = col | 4; cols[2] = cgapal[col | 4];
cols[3] = col | 6; cols[3] = cgapal[col | 6];
} }
for (x = 0; x < tandy->crtc[1]; x++) for (x = 0; x < tandy->crtc[1]; x++)
{ {
@ -486,16 +486,16 @@ static void tandysl_poll(void *p)
tandy->ma++; tandy->ma++;
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
{ {
buffer->line[tandy->displine][(x << 4) + (c << 1) + 8] = ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 8] =
buffer->line[tandy->displine][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14];
dat <<= 2; dat <<= 2;
} }
} }
} }
else else
{ {
cols[0] = 0; cols[0] = cgapal[0];
cols[1] = tandy->array[(tandy->col & tandy->array[1]) + 16] + 16; cols[1] = cgapal[tandy->array[(tandy->col & tandy->array[1]) + 16]];
for (x = 0; x < tandy->crtc[1]; x++) for (x = 0; x < tandy->crtc[1]; x++)
{ {
dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) | dat = (tandy->vram[((tandy->ma << 1) & 0x1fff) + ((tandy->sc & 1) * 0x2000)] << 8) |
@ -503,7 +503,7 @@ static void tandysl_poll(void *p)
tandy->ma++; tandy->ma++;
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
buffer->line[tandy->displine][(x << 4) + c + 8] = cols[dat >> 15]; ((uint32_t *)buffer32->line[tandy->displine])[(x << 4) + c + 8] = cols[dat >> 15];
dat <<= 1; dat <<= 1;
} }
} }
@ -513,14 +513,14 @@ static void tandysl_poll(void *p)
{ {
if (tandy->array[3] & 4) if (tandy->array[3] & 4)
{ {
if (tandy->mode & 1) hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, (tandy->array[2] & 0xf) + 16); if (tandy->mode & 1) hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, cgapal[tandy->array[2] & 0xf]);
else hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, (tandy->array[2] & 0xf) + 16); else hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, cgapal[tandy->array[2] & 0xf]);
} }
else else
{ {
cols[0] = ((tandy->mode & 0x12) == 0x12) ? 0 : (tandy->col & 0xf) + 16; cols[0] = cgapal[((tandy->mode & 0x12) == 0x12) ? 0 : (tandy->col & 0xf)];
if (tandy->mode & 1) hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, cols[0]); if (tandy->mode & 1) hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 3) + 16, cols[0]);
else hline(buffer, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, cols[0]); else hline(buffer32, 0, tandy->displine, (tandy->crtc[1] << 4) + 16, cols[0]);
} }
} }
if (tandy->mode & 1) x = (tandy->crtc[1] << 3) + 16; if (tandy->mode & 1) x = (tandy->crtc[1] << 3) + 16;
@ -631,7 +631,7 @@ static void tandysl_poll(void *p)
// printf("Blit %i %i\n",firstline,lastline); // printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize); //printf("Xsize is %i\n",xsize);
video_blit_memtoscreen_8(0, tandy->firstline-4, xsize, (tandy->lastline - tandy->firstline) + 8); video_blit_memtoscreen(0, tandy->firstline-4, 0, (tandy->lastline - tandy->firstline) + 8, xsize, (tandy->lastline - tandy->firstline) + 8);
frames++; frames++;
video_res_x = xsize - 16; video_res_x = xsize - 16;

View file

@ -149,6 +149,7 @@ static uint8_t mode_40x24[] =
0x0f, /* Maximum raster address */ 0x0f, /* Maximum raster address */
}; };
static uint32_t wy700_pal[4];
/* Font ROM: Two fonts, each containing 256 characters, 16x16 pixels */ /* Font ROM: Two fonts, each containing 256 characters, 16x16 pixels */
extern uint8_t fontdatw[512][32]; extern uint8_t fontdatw[512][32];
@ -553,7 +554,7 @@ void wy700_textline(wy700_t *wy700)
if (sc == 14 && mda && ((attr & 7) == 1)) if (sc == 14 && mda && ((attr & 7) == 1))
{ {
for (c = 0; c < cw; c++) for (c = 0; c < cw; c++)
buffer->line[wy700->displine][(x * cw) + c] = ((uint32_t *)buffer32->line[wy700->displine])[(x * cw) + c] =
mdacols[attr][blink][1]; mdacols[attr][blink][1];
} }
else /* Draw 16 pixels of character */ else /* Draw 16 pixels of character */
@ -565,21 +566,23 @@ void wy700_textline(wy700_t *wy700)
int col; int col;
if (c < 8) if (c < 8)
col = (mda ? mdacols : cgacols)[attr][blink][(bitmap[0] & (1 << (c ^ 7))) ? 1 : 0]; col = (mda ? mdacols : cgacols)[attr][blink][(bitmap[0] & (1 << (c ^ 7))) ? 1 : 0];
else col = (mda ? mdacols : cgacols)[attr][blink][(bitmap[1] & (1 << ((c & 7) ^ 7))) ? 1 : 0]; else
col = (mda ? mdacols : cgacols)[attr][blink][(bitmap[1] & (1 << ((c & 7) ^ 7))) ? 1 : 0];
if (!(wy700->enabled) || !(wy700->cga_ctrl & 8)) if (!(wy700->enabled) || !(wy700->cga_ctrl & 8))
col = mdacols[0][0][0]; col = mdacols[0][0][0];
if (w == 40) if (w == 40)
{ {
buffer->line[wy700->displine][(x * cw) + 2*c] = col; ((uint32_t *)buffer32->line[wy700->displine])[(x * cw) + 2*c] = col;
buffer->line[wy700->displine][(x * cw) + 2*c + 1] = col; ((uint32_t *)buffer32->line[wy700->displine])[(x * cw) + 2*c + 1] = col;
} }
else buffer->line[wy700->displine][(x * cw) + c] = col; else
((uint32_t *)buffer32->line[wy700->displine])[(x * cw) + c] = col;
} }
if (drawcursor) if (drawcursor)
{ {
for (c = 0; c < cw; c++) for (c = 0; c < cw; c++)
buffer->line[wy700->displine][(x * cw) + c] ^= (mda ? mdacols : cgacols)[attr][0][1]; ((uint32_t *)buffer32->line[wy700->displine])[(x * cw) + c] ^= (mda ? mdacols : cgacols)[attr][0][1];
} }
++ma; ++ma;
} }
@ -592,7 +595,7 @@ void wy700_cgaline(wy700_t *wy700)
{ {
int x, c; int x, c;
uint32_t dat; uint32_t dat;
uint8_t ink = 0; uint32_t ink = 0;
uint16_t addr; uint16_t addr;
uint16_t ma = (wy700->cga_crtc[13] | (wy700->cga_crtc[12] << 8)) & 0x3fff; uint16_t ma = (wy700->cga_crtc[13] | (wy700->cga_crtc[12] << 8)) & 0x3fff;
@ -614,11 +617,11 @@ void wy700_cgaline(wy700_t *wy700)
{ {
for (c = 0; c < 32; c++) for (c = 0; c < 32; c++)
{ {
ink = (dat & 0x80000000) ? 16 + 15: 16 + 0; ink = (dat & 0x80000000) ? wy700_pal[3]: wy700_pal[0];
if (!(wy700->enabled) || !(wy700->cga_ctrl & 8)) if (!(wy700->enabled) || !(wy700->cga_ctrl & 8))
ink = 16; ink = wy700_pal[0];
buffer->line[wy700->displine][x*64 + 2*c] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 2*c] =
buffer->line[wy700->displine][x*64 + 2*c+1] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 2*c+1] =
ink; ink;
dat = dat << 1; dat = dat << 1;
} }
@ -627,19 +630,13 @@ void wy700_cgaline(wy700_t *wy700)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
switch ((dat >> 30) & 3) ink = wy700_pal[(dat >> 30) & 3];
{
case 0: ink = 16 + 0; break;
case 1: ink = 16 + 8; break;
case 2: ink = 16 + 7; break;
case 3: ink = 16 + 15; break;
}
if (!(wy700->enabled) || !(wy700->cga_ctrl & 8)) if (!(wy700->enabled) || !(wy700->cga_ctrl & 8))
ink = 16; ink = wy700_pal[0];
buffer->line[wy700->displine][x*64 + 4*c] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c] =
buffer->line[wy700->displine][x*64 + 4*c+1] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+1] =
buffer->line[wy700->displine][x*64 + 4*c+2] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+2] =
buffer->line[wy700->displine][x*64 + 4*c+3] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+3] =
ink; ink;
dat = dat << 2; dat = dat << 2;
} }
@ -652,7 +649,7 @@ void wy700_medresline(wy700_t *wy700)
{ {
int x, c; int x, c;
uint32_t dat; uint32_t dat;
uint8_t ink = 0; uint32_t ink = 0;
uint32_t addr; uint32_t addr;
addr = (wy700->displine >> 1) * 80 + 4 * wy700->wy700_base; addr = (wy700->displine >> 1) * 80 + 4 * wy700->wy700_base;
@ -669,19 +666,14 @@ void wy700_medresline(wy700_t *wy700)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
switch ((dat >> 30) & 3) ink = wy700_pal[(dat >> 30) & 3];
{
case 0: ink = 16 + 0; break;
case 1: ink = 16 + 8; break;
case 2: ink = 16 + 7; break;
case 3: ink = 16 + 15; break;
}
/* Display disabled? */ /* Display disabled? */
if (!(wy700->wy700_mode & 8)) ink = 16; if (!(wy700->wy700_mode & 8))
buffer->line[wy700->displine][x*64 + 4*c] = ink = wy700_pal[0];
buffer->line[wy700->displine][x*64 + 4*c+1] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c] =
buffer->line[wy700->displine][x*64 + 4*c+2] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+1] =
buffer->line[wy700->displine][x*64 + 4*c+3] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+2] =
((uint32_t *)buffer32->line[wy700->displine])[x*64 + 4*c+3] =
ink; ink;
dat = dat << 2; dat = dat << 2;
} }
@ -690,11 +682,12 @@ void wy700_medresline(wy700_t *wy700)
{ {
for (c = 0; c < 32; c++) for (c = 0; c < 32; c++)
{ {
ink = (dat & 0x80000000) ? 16 + 15: 16 + 0; ink = (dat & 0x80000000) ? wy700_pal[3]: wy700_pal[0];
/* Display disabled? */ /* Display disabled? */
if (!(wy700->wy700_mode & 8)) ink = 16; if (!(wy700->wy700_mode & 8))
buffer->line[wy700->displine][x*64 + 2*c] = ink = wy700_pal[0];
buffer->line[wy700->displine][x*64 + 2*c+1] = ((uint32_t *)buffer32->line[wy700->displine])[x*64 + 2*c] =
((uint32_t *)buffer32->line[wy700->displine])[x*64 + 2*c+1] =
ink; ink;
dat = dat << 1; dat = dat << 1;
} }
@ -710,7 +703,7 @@ void wy700_hiresline(wy700_t *wy700)
{ {
int x, c; int x, c;
uint32_t dat; uint32_t dat;
uint8_t ink = 0; uint32_t ink = 0;
uint32_t addr; uint32_t addr;
addr = (wy700->displine >> 1) * 160 + 4 * wy700->wy700_base; addr = (wy700->displine >> 1) * 160 + 4 * wy700->wy700_base;
@ -731,17 +724,12 @@ void wy700_hiresline(wy700_t *wy700)
{ {
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
{ {
switch ((dat >> 30) & 3) ink = wy700_pal[(dat >> 30) & 3];
{
case 0: ink = 16 + 0; break;
case 1: ink = 16 + 8; break;
case 2: ink = 16 + 7; break;
case 3: ink = 16 + 15; break;
}
/* Display disabled? */ /* Display disabled? */
if (!(wy700->wy700_mode & 8)) ink = 16; if (!(wy700->wy700_mode & 8))
buffer->line[wy700->displine][x*32 + 2*c] = ink = wy700_pal[0];
buffer->line[wy700->displine][x*32 + 2*c+1] = ((uint32_t *)buffer32->line[wy700->displine])[x*32 + 2*c] =
((uint32_t *)buffer32->line[wy700->displine])[x*32 + 2*c+1] =
ink; ink;
dat = dat << 2; dat = dat << 2;
} }
@ -750,10 +738,11 @@ void wy700_hiresline(wy700_t *wy700)
{ {
for (c = 0; c < 32; c++) for (c = 0; c < 32; c++)
{ {
ink = (dat & 0x80000000) ? 16 + 15: 16 + 0; ink = (dat & 0x80000000) ? wy700_pal[3]: wy700_pal[0];
/* Display disabled? */ /* Display disabled? */
if (!(wy700->wy700_mode & 8)) ink = 16; if (!(wy700->wy700_mode & 8))
buffer->line[wy700->displine][x*32 + c] = ink; ink = wy700_pal[0];
((uint32_t *)buffer32->line[wy700->displine])[x*32 + c] = ink;
dat = dat << 1; dat = dat << 1;
} }
} }
@ -845,7 +834,7 @@ void wy700_poll(void *p)
if (ysize < 32) ysize = 200; if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize); updatewindowsize(xsize, ysize);
} }
video_blit_memtoscreen_8(0, 0, xsize, ysize); video_blit_memtoscreen(0, 0, 0, ysize, xsize, ysize);
frames++; frames++;
/* Fixed 1280x800 resolution */ /* Fixed 1280x800 resolution */
@ -888,72 +877,78 @@ void *wy700_init()
io_sethandler(0x03b0, 0x000C, wy700_in, NULL, NULL, wy700_out, NULL, NULL, wy700); io_sethandler(0x03b0, 0x000C, wy700_in, NULL, NULL, wy700_out, NULL, NULL, wy700);
io_sethandler(0x03d0, 0x0010, wy700_in, NULL, NULL, wy700_out, NULL, NULL, wy700); io_sethandler(0x03d0, 0x0010, wy700_in, NULL, NULL, wy700_out, NULL, NULL, wy700);
wy700_pal[0] = makecol(0x00, 0x00, 0x00);
wy700_pal[1] = makecol(0x55, 0x55, 0x55);
wy700_pal[2] = makecol(0xaa, 0xaa, 0xaa);
wy700_pal[3] = makecol(0xff, 0xff, 0xff);
/* Set up the emulated attributes. /* Set up the emulated attributes.
* CGA is done in four groups: 00-0F, 10-7F, 80-8F, 90-FF */ * CGA is done in four groups: 00-0F, 10-7F, 80-8F, 90-FF */
for (c = 0; c < 0x10; c++) for (c = 0; c < 0x10; c++)
{ {
cgacols[c][0][0] = cgacols[c][1][0] = cgacols[c][1][1] = 16; cgacols[c][0][0] = cgacols[c][1][0] = cgacols[c][1][1] = wy700_pal[0];
if (c & 8) cgacols[c][0][1] = 15 + 16; if (c & 8) cgacols[c][0][1] = wy700_pal[3];
else cgacols[c][0][1] = 7 + 16; else cgacols[c][0][1] = wy700_pal[2];
} }
for (c = 0x10; c < 0x80; c++) for (c = 0x10; c < 0x80; c++)
{ {
cgacols[c][0][0] = cgacols[c][1][0] = cgacols[c][1][1] = 16 + 7; cgacols[c][0][0] = cgacols[c][1][0] = cgacols[c][1][1] = wy700_pal[2];
if (c & 8) cgacols[c][0][1] = 15 + 16; if (c & 8) cgacols[c][0][1] = wy700_pal[3];
else cgacols[c][0][1] = 0 + 16; else cgacols[c][0][1] = wy700_pal[0];
if ((c & 0x0F) == 8) cgacols[c][0][1] = 8 + 16; if ((c & 0x0F) == 8)
cgacols[c][0][1] = wy700_pal[1];
} }
/* With special cases for 00, 11, 22, ... 77 */ /* With special cases for 00, 11, 22, ... 77 */
cgacols[0x00][0][1] = cgacols[0x00][1][1] = 16; cgacols[0x00][0][1] = cgacols[0x00][1][1] = wy700_pal[0];
for (c = 0x11; c <= 0x77; c += 0x11) for (c = 0x11; c <= 0x77; c += 0x11)
{ {
cgacols[c][0][1] = cgacols[c][1][1] = 16 + 7; cgacols[c][0][1] = cgacols[c][1][1] = wy700_pal[2];
} }
for (c = 0x80; c < 0x90; c++) for (c = 0x80; c < 0x90; c++)
{ {
cgacols[c][0][0] = 16 + 8; cgacols[c][0][0] = wy700_pal[1];
if (c & 8) cgacols[c][0][1] = 15 + 16; if (c & 8) cgacols[c][0][1] = wy700_pal[3];
else cgacols[c][0][1] = 7 + 16; else cgacols[c][0][1] = wy700_pal[2];
cgacols[c][1][0] = cgacols[c][1][1] = cgacols[c-0x80][0][0]; cgacols[c][1][0] = cgacols[c][1][1] = cgacols[c-0x80][0][0];
} }
for (c = 0x90; c < 0x100; c++) for (c = 0x90; c < 0x100; c++)
{ {
cgacols[c][0][0] = 16 + 15; cgacols[c][0][0] = wy700_pal[3];
if (c & 8) cgacols[c][0][1] = 8 + 16; if (c & 8) cgacols[c][0][1] = wy700_pal[1];
else cgacols[c][0][1] = 7 + 16; else cgacols[c][0][1] = wy700_pal[2];
if ((c & 0x0F) == 0) cgacols[c][0][1] = 16; if ((c & 0x0F) == 0) cgacols[c][0][1] = wy700_pal[0];
cgacols[c][1][0] = cgacols[c][1][1] = cgacols[c-0x80][0][0]; cgacols[c][1][0] = cgacols[c][1][1] = cgacols[c-0x80][0][0];
} }
/* Also special cases for 99, AA, ..., FF */ /* Also special cases for 99, AA, ..., FF */
for (c = 0x99; c <= 0xFF; c += 0x11) for (c = 0x99; c <= 0xFF; c += 0x11)
{ {
cgacols[c][0][1] = 16 + 15; cgacols[c][0][1] = wy700_pal[3];
} }
/* Special cases for 08, 80 and 88 */ /* Special cases for 08, 80 and 88 */
cgacols[0x08][0][1] = 16 + 8; cgacols[0x08][0][1] = wy700_pal[1];
cgacols[0x80][0][1] = 16; cgacols[0x80][0][1] = wy700_pal[0];
cgacols[0x88][0][1] = 16 + 8; cgacols[0x88][0][1] = wy700_pal[1];
/* MDA attributes */ /* MDA attributes */
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
{ {
mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = 16; mdacols[c][0][0] = mdacols[c][1][0] = mdacols[c][1][1] = wy700_pal[0];
if (c & 8) mdacols[c][0][1] = 15 + 16; if (c & 8) mdacols[c][0][1] = wy700_pal[3];
else mdacols[c][0][1] = 7 + 16; else mdacols[c][0][1] = wy700_pal[2];
} }
mdacols[0x70][0][1] = 16; mdacols[0x70][0][1] = wy700_pal[0];
mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = 16 + 15; mdacols[0x70][0][0] = mdacols[0x70][1][0] = mdacols[0x70][1][1] = wy700_pal[3];
mdacols[0xF0][0][1] = 16; mdacols[0xF0][0][1] = wy700_pal[0];
mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = 16 + 15; mdacols[0xF0][0][0] = mdacols[0xF0][1][0] = mdacols[0xF0][1][1] = wy700_pal[3];
mdacols[0x78][0][1] = 16 + 7; mdacols[0x78][0][1] = wy700_pal[2];
mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = 16 + 15; mdacols[0x78][0][0] = mdacols[0x78][1][0] = mdacols[0x78][1][1] = wy700_pal[3];
mdacols[0xF8][0][1] = 16 + 7; mdacols[0xF8][0][1] = wy700_pal[2];
mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = 16 + 15; mdacols[0xF8][0][0] = mdacols[0xF8][1][0] = mdacols[0xF8][1][1] = wy700_pal[3];
mdacols[0x00][0][1] = mdacols[0x00][1][1] = 16; mdacols[0x00][0][1] = mdacols[0x00][1][1] = wy700_pal[0];
mdacols[0x08][0][1] = mdacols[0x08][1][1] = 16; mdacols[0x08][0][1] = mdacols[0x08][1][1] = wy700_pal[0];
mdacols[0x80][0][1] = mdacols[0x80][1][1] = 16; mdacols[0x80][0][1] = mdacols[0x80][1][1] = wy700_pal[0];
mdacols[0x88][0][1] = mdacols[0x88][1][1] = 16; mdacols[0x88][0][1] = mdacols[0x88][1][1] = wy700_pal[0];
/* Start off in 80x25 text mode */ /* Start off in 80x25 text mode */
wy700->cga_stat = 0xF4; wy700->cga_stat = 0xF4;

View file

@ -245,7 +245,6 @@ int video_timing_b, video_timing_w, video_timing_l;
int video_res_x, video_res_y, video_bpp; int video_res_x, video_res_y, video_bpp;
void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h); void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h);
void (*video_blit_memtoscreen_8_func)(int x, int y, int w, int h);
void video_init() void video_init()
{ {
@ -314,7 +313,7 @@ void video_init()
} }
BITMAP *buffer, *buffer32; BITMAP *buffer32;
uint8_t fontdat[256][8]; uint8_t fontdat[256][8];
uint8_t fontdatm[256][16]; uint8_t fontdatm[256][16];
@ -323,8 +322,6 @@ uint8_t fontdat8x12[256][16]; /* MDSI Genius font */
int xsize=1,ysize=1; int xsize=1,ysize=1;
PALETTE cgapal;
void loadfont(char *s, int format) void loadfont(char *s, int format)
{ {
FILE *f=romfopen(s,"rb"); FILE *f=romfopen(s,"rb");
@ -419,7 +416,7 @@ void loadfont(char *s, int format)
static struct static struct
{ {
int x, y, y1, y2, w, h, blit8; int x, y, y1, y2, w, h;
int busy; int busy;
int buffer_in_use; int buffer_in_use;
@ -431,29 +428,14 @@ static struct
static void blit_thread(void *param); static void blit_thread(void *param);
uint32_t cgapal[16];
void initvideo() void initvideo()
{ {
int c, d, e; int c, d, e;
buffer32 = create_bitmap(2048, 2048); buffer32 = create_bitmap(2048, 2048);
buffer = create_bitmap(2048, 2048);
for (c = 0; c < 64; c++)
{
cgapal[c + 64].r = (((c & 4) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
cgapal[c + 64].g = (((c & 2) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
cgapal[c + 64].b = (((c & 1) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
if ((c & 0x17) == 6)
cgapal[c + 64].g >>= 1;
}
for (c = 0; c < 64; c++)
{
cgapal[c + 128].r = (((c & 4) ? 2 : 0) | ((c & 0x20) ? 1 : 0)) * 21;
cgapal[c + 128].g = (((c & 2) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
cgapal[c + 128].b = (((c & 1) ? 2 : 0) | ((c & 0x08) ? 1 : 0)) * 21;
}
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
{ {
e = c; e = c;
@ -484,6 +466,23 @@ void initvideo()
for (c = 0; c < 65536; c++) for (c = 0; c < 65536; c++)
video_16to32[c] = ((c & 31) << 3) | (((c >> 5) & 63) << 10) | (((c >> 11) & 31) << 19); video_16to32[c] = ((c & 31) << 3) | (((c >> 5) & 63) << 10) | (((c >> 11) & 31) << 19);
cgapal[0x0] = makecol(0x00, 0x00, 0x00);
cgapal[0x1] = makecol(0x00, 0x00, 0xaa);
cgapal[0x2] = makecol(0x00, 0xaa, 0x00);
cgapal[0x3] = makecol(0x00, 0xaa, 0xaa);
cgapal[0x4] = makecol(0xaa, 0x00, 0x00);
cgapal[0x5] = makecol(0xaa, 0x00, 0xaa);
cgapal[0x6] = makecol(0xaa, 0x55, 0x00);
cgapal[0x7] = makecol(0xaa, 0xaa, 0xaa);
cgapal[0x8] = makecol(0x55, 0x55, 0x55);
cgapal[0x9] = makecol(0x55, 0x55, 0xff);
cgapal[0xa] = makecol(0x55, 0xff, 0x55);
cgapal[0xb] = makecol(0x55, 0xff, 0xff);
cgapal[0xc] = makecol(0xff, 0x55, 0x55);
cgapal[0xd] = makecol(0xff, 0x55, 0xff);
cgapal[0xe] = makecol(0xff, 0xff, 0x55);
cgapal[0xf] = makecol(0xff, 0xff, 0xff);
blit_data.wake_blit_thread = thread_create_event(); blit_data.wake_blit_thread = thread_create_event();
blit_data.blit_complete = thread_create_event(); blit_data.blit_complete = thread_create_event();
blit_data.buffer_not_in_use = thread_create_event(); blit_data.buffer_not_in_use = thread_create_event();
@ -499,7 +498,6 @@ void closevideo()
free(video_15to32); free(video_15to32);
free(video_16to32); free(video_16to32);
destroy_bitmap(buffer);
destroy_bitmap(buffer32); destroy_bitmap(buffer32);
} }
@ -511,10 +509,7 @@ static void blit_thread(void *param)
thread_wait_event(blit_data.wake_blit_thread, -1); thread_wait_event(blit_data.wake_blit_thread, -1);
thread_reset_event(blit_data.wake_blit_thread); thread_reset_event(blit_data.wake_blit_thread);
if (blit_data.blit8) video_blit_memtoscreen_func(blit_data.x, blit_data.y, blit_data.y1, blit_data.y2, blit_data.w, blit_data.h);
video_blit_memtoscreen_8_func(blit_data.x, blit_data.y, blit_data.w, blit_data.h);
else
video_blit_memtoscreen_func(blit_data.x, blit_data.y, blit_data.y1, blit_data.y2, blit_data.w, blit_data.h);
blit_data.busy = 0; blit_data.busy = 0;
thread_set_event(blit_data.blit_complete); thread_set_event(blit_data.blit_complete);
@ -551,18 +546,5 @@ void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
blit_data.y2 = y2; blit_data.y2 = y2;
blit_data.w = w; blit_data.w = w;
blit_data.h = h; blit_data.h = h;
blit_data.blit8 = 0;
thread_set_event(blit_data.wake_blit_thread);
}
void video_blit_memtoscreen_8(int x, int y, int w, int h)
{
video_wait_for_blit();
blit_data.busy = 1;
blit_data.x = x;
blit_data.y = y;
blit_data.w = w;
blit_data.h = h;
blit_data.blit8 = 1;
thread_set_event(blit_data.wake_blit_thread); thread_set_event(blit_data.wake_blit_thread);
} }

View file

@ -29,7 +29,7 @@ typedef RGB PALETTE[256];
#endif #endif
extern BITMAP *buffer, *buffer32; extern BITMAP *buffer32;
int video_card_available(int card); int video_card_available(int card);
char *video_card_getname(int card); char *video_card_getname(int card);
@ -74,10 +74,8 @@ extern int readflash;
extern void (*video_recalctimings)(); extern void (*video_recalctimings)();
void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h); void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
void video_blit_memtoscreen_8(int x, int y, int w, int h);
extern void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h); extern void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h);
extern void (*video_blit_memtoscreen_8_func)(int x, int y, int w, int h);
extern int video_timing_b, video_timing_w, video_timing_l; extern int video_timing_b, video_timing_w, video_timing_l;
extern int video_speed; extern int video_speed;
@ -99,3 +97,5 @@ void video_updatetiming();
void hline(BITMAP *b, int x1, int y, int x2, int col); void hline(BITMAP *b, int x1, int y, int x2, int col);
void destroy_bitmap(BITMAP *b); void destroy_bitmap(BITMAP *b);
extern uint32_t cgapal[16];

View file

@ -15,7 +15,6 @@ extern "C" void device_force_redraw();
static void d3d_fs_init_objects(); static void d3d_fs_init_objects();
static void d3d_fs_close_objects(); static void d3d_fs_close_objects();
static void d3d_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h); static void d3d_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
static void d3d_fs_blit_memtoscreen_8(int x, int y, int w, int h);
extern "C" void video_blit_complete(); extern "C" void video_blit_complete();
@ -37,31 +36,6 @@ struct CUSTOMVERTEX
FLOAT tu, tv; FLOAT tu, tv;
}; };
static PALETTE cgapal=
{
{0,0,0},{0,42,0},{42,0,0},{42,21,0},
{0,0,0},{0,42,42},{42,0,42},{42,42,42},
{0,0,0},{21,63,21},{63,21,21},{63,63,21},
{0,0,0},{21,63,63},{63,21,63},{63,63,63},
{0,0,0},{0,0,42},{0,42,0},{0,42,42},
{42,0,0},{42,0,42},{42,21,00},{42,42,42},
{21,21,21},{21,21,63},{21,63,21},{21,63,63},
{63,21,21},{63,21,63},{63,63,21},{63,63,63},
{0,0,0},{0,21,0},{0,0,42},{0,42,42},
{42,0,21},{21,10,21},{42,0,42},{42,0,63},
{21,21,21},{21,63,21},{42,21,42},{21,63,63},
{63,0,0},{42,42,0},{63,21,42},{41,41,41},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
};
static uint32_t pal_lookup[256];
static CUSTOMVERTEX d3d_verts[] = static CUSTOMVERTEX d3d_verts[] =
{ {
{ 0.0f, 0.0f, 1.0f, 1.0f, 0xffffff, 0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f, 1.0f, 0xffffff, 0.0f, 0.0f},
@ -83,13 +57,9 @@ static CUSTOMVERTEX d3d_verts[] =
void d3d_fs_init(HWND h) void d3d_fs_init(HWND h)
{ {
int c;
d3d_fs_w = GetSystemMetrics(SM_CXSCREEN); d3d_fs_w = GetSystemMetrics(SM_CXSCREEN);
d3d_fs_h = GetSystemMetrics(SM_CYSCREEN); d3d_fs_h = GetSystemMetrics(SM_CYSCREEN);
for (c = 0; c < 256; c++)
pal_lookup[c] = makecol(cgapal[c].r << 2, cgapal[c].g << 2, cgapal[c].b << 2);
d3d_hwnd = h; d3d_hwnd = h;
d3d_device_window = CreateWindowEx ( d3d_device_window = CreateWindowEx (
@ -130,7 +100,6 @@ void d3d_fs_init(HWND h)
d3d_fs_init_objects(); d3d_fs_init_objects();
video_blit_memtoscreen_func = d3d_fs_blit_memtoscreen; video_blit_memtoscreen_func = d3d_fs_blit_memtoscreen;
video_blit_memtoscreen_8_func = d3d_fs_blit_memtoscreen_8;
} }
static void d3d_fs_close_objects() static void d3d_fs_close_objects()
@ -406,123 +375,3 @@ static void d3d_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL) if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
PostMessage(ghwnd, WM_RESETD3D, 0, 0); PostMessage(ghwnd, WM_RESETD3D, 0, 0);
} }
static void d3d_fs_blit_memtoscreen_8(int x, int y, int w, int h)
{
HRESULT hr = D3D_OK;
VOID* pVoid;
D3DLOCKED_RECT dr;
RECT window_rect;
int xx, yy;
double l, t, r, b;
if (!h)
{
video_blit_complete();
return; /*Nothing to do*/
}
if (hr == D3D_OK)
{
RECT lock_rect;
lock_rect.top = 0;
lock_rect.left = 0;
lock_rect.bottom = 2047;
lock_rect.right = 2047;
if (FAILED(d3dTexture->LockRect(0, &dr, &lock_rect, 0)))
fatal("LockRect failed\n");
for (yy = 0; yy < h; yy++)
{
uint32_t *p = (uint32_t *)((uintptr_t)dr.pBits + (yy * dr.Pitch));
if ((y + yy) >= 0 && (y + yy) < buffer->h)
{
for (xx = 0; xx < w; xx++)
p[xx] = pal_lookup[buffer->line[y + yy][x + xx]];
}
}
video_blit_complete();
d3dTexture->UnlockRect(0);
}
else
video_blit_complete();
d3d_verts[0].tu = d3d_verts[2].tu = d3d_verts[3].tu = 0;
d3d_verts[0].tv = d3d_verts[3].tv = d3d_verts[4].tv = 0;
d3d_verts[1].tu = d3d_verts[4].tu = d3d_verts[5].tu = (float)w / 2048.0;
d3d_verts[1].tv = d3d_verts[2].tv = d3d_verts[5].tv = (float)h / 2048.0;
d3d_verts[0].color = d3d_verts[1].color = d3d_verts[2].color =
d3d_verts[3].color = d3d_verts[4].color = d3d_verts[5].color =
d3d_verts[6].color = d3d_verts[7].color = d3d_verts[8].color =
d3d_verts[9].color = d3d_verts[10].color = d3d_verts[11].color = 0xffffff;
GetClientRect(d3d_device_window, &window_rect);
d3d_fs_size(window_rect, &l, &t, &r, &b, w, h);
d3d_verts[0].x = l;
d3d_verts[0].y = t;
d3d_verts[1].x = r;
d3d_verts[1].y = b;
d3d_verts[2].x = l;
d3d_verts[2].y = b;
d3d_verts[3].x = l;
d3d_verts[3].y = t;
d3d_verts[4].x = r;
d3d_verts[4].y = t;
d3d_verts[5].x = r;
d3d_verts[5].y = b;
d3d_verts[6].x = d3d_verts[8].x = d3d_verts[9].x = r - 40.5;
d3d_verts[6].y = d3d_verts[9].y = d3d_verts[10].y = t + 8.5;
d3d_verts[7].x = d3d_verts[10].x = d3d_verts[11].x = r - 8.5;
d3d_verts[7].y = d3d_verts[8].y = d3d_verts[11].y = t + 14.5;
if (hr == D3D_OK)
hr = v_buffer->Lock(0, 0, (void**)&pVoid, 0);
if (hr == D3D_OK)
memcpy(pVoid, d3d_verts, sizeof(d3d_verts));
if (hr == D3D_OK)
hr = v_buffer->Unlock();
if (hr == D3D_OK)
hr = d3ddev->BeginScene();
if (hr == D3D_OK)
{
if (hr == D3D_OK)
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0, 0);
if (hr == D3D_OK)
hr = d3ddev->SetTexture(0, d3dTexture);
if (hr == D3D_OK)
hr = d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
if (hr == D3D_OK)
hr = d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
if (hr == D3D_OK)
hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
if (hr == D3D_OK)
hr = d3ddev->SetTexture(0, NULL);
if (hr == D3D_OK && readflash && vid_disc_indicator)
{
hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 6, 2);
readflash = 0;
}
if (hr == D3D_OK)
hr = d3ddev->EndScene();
}
if (hr == D3D_OK)
hr = d3ddev->Present(NULL, NULL, d3d_device_window, NULL);
if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
PostMessage(ghwnd, WM_RESETD3D, 0, 0);
}

View file

@ -15,7 +15,6 @@ extern "C" void video_blit_complete();
void d3d_init_objects(); void d3d_init_objects();
void d3d_close_objects(); void d3d_close_objects();
void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h); void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
void d3d_blit_memtoscreen_8(int x, int y, int w, int h);
static LPDIRECT3D9 d3d = NULL; static LPDIRECT3D9 d3d = NULL;
static LPDIRECT3DDEVICE9 d3ddev = NULL; static LPDIRECT3DDEVICE9 d3ddev = NULL;
@ -32,31 +31,6 @@ struct CUSTOMVERTEX
FLOAT tu, tv; FLOAT tu, tv;
}; };
static PALETTE cgapal=
{
{0,0,0},{0,42,0},{42,0,0},{42,21,0},
{0,0,0},{0,42,42},{42,0,42},{42,42,42},
{0,0,0},{21,63,21},{63,21,21},{63,63,21},
{0,0,0},{21,63,63},{63,21,63},{63,63,63},
{0,0,0},{0,0,42},{0,42,0},{0,42,42},
{42,0,0},{42,0,42},{42,21,00},{42,42,42},
{21,21,21},{21,21,63},{21,63,21},{21,63,63},
{63,21,21},{63,21,63},{63,63,21},{63,63,63},
{0,0,0},{0,21,0},{0,0,42},{0,42,42},
{42,0,21},{21,10,21},{42,0,42},{42,0,63},
{21,21,21},{21,63,21},{42,21,42},{21,63,63},
{63,0,0},{42,42,0},{63,21,42},{41,41,41},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
};
static uint32_t pal_lookup[256];
static CUSTOMVERTEX d3d_verts[] = static CUSTOMVERTEX d3d_verts[] =
{ {
{ 0.0f, 0.0f, 1.0f, 1.0f, 0xffffff, 0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f, 1.0f, 0xffffff, 0.0f, 0.0f},
@ -78,11 +52,6 @@ static CUSTOMVERTEX d3d_verts[] =
void d3d_init(HWND h) void d3d_init(HWND h)
{ {
int c;
for (c = 0; c < 256; c++)
pal_lookup[c] = makecol(cgapal[c].r << 2, cgapal[c].g << 2, cgapal[c].b << 2);
d3d_hwnd = h; d3d_hwnd = h;
d3d = Direct3DCreate9(D3D_SDK_VERSION); d3d = Direct3DCreate9(D3D_SDK_VERSION);
@ -108,7 +77,6 @@ void d3d_init(HWND h)
d3d_init_objects(); d3d_init_objects();
video_blit_memtoscreen_func = d3d_blit_memtoscreen; video_blit_memtoscreen_func = d3d_blit_memtoscreen;
video_blit_memtoscreen_8_func = d3d_blit_memtoscreen_8;
} }
void d3d_close_objects() void d3d_close_objects()
@ -239,7 +207,7 @@ void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
RECT r; RECT r;
int yy; int yy;
if (y1 == y2) if (y1 == y2 || h <= 0)
{ {
video_blit_complete(); video_blit_complete();
return; /*Nothing to do*/ return; /*Nothing to do*/
@ -256,7 +224,10 @@ void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
fatal("LockRect failed\n"); fatal("LockRect failed\n");
for (yy = y1; yy < y2; yy++) for (yy = y1; yy < y2; yy++)
memcpy((void *)((uintptr_t)dr.pBits + ((yy - y1) * dr.Pitch)), &(((uint32_t *)buffer32->line[yy + y])[x]), w * 4); {
if ((y + yy) >= 0 && (y + yy) < buffer32->h)
memcpy((void *)((uintptr_t)dr.pBits + ((yy - y1) * dr.Pitch)), &(((uint32_t *)buffer32->line[yy + y])[x]), w * 4);
}
video_blit_complete(); video_blit_complete();
d3dTexture->UnlockRect(0); d3dTexture->UnlockRect(0);
@ -326,106 +297,3 @@ void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL) if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
PostMessage(d3d_hwnd, WM_RESETD3D, 0, 0); PostMessage(d3d_hwnd, WM_RESETD3D, 0, 0);
} }
void d3d_blit_memtoscreen_8(int x, int y, int w, int h)
{
VOID* pVoid;
D3DLOCKED_RECT dr;
RECT r;
int yy, xx;
HRESULT hr = D3D_OK;
if (h == 0)
{
video_blit_complete();
return; /*Nothing to do*/
}
r.top = 0;
r.left = 0;
r.bottom = h;
r.right = 2047;
if (hr == D3D_OK)
{
if (FAILED(d3dTexture->LockRect(0, &dr, &r, 0)))
fatal("LockRect failed\n");
for (yy = 0; yy < h; yy++)
{
uint32_t *p = (uint32_t *)((uintptr_t)dr.pBits + (yy * dr.Pitch));
if ((y + yy) >= 0 && (y + yy) < buffer->h)
{
for (xx = 0; xx < w; xx++)
p[xx] = pal_lookup[buffer->line[y + yy][x + xx]];
}
}
video_blit_complete();
d3dTexture->UnlockRect(0);
}
else
video_blit_complete();
d3d_verts[0].tu = d3d_verts[2].tu = d3d_verts[3].tu = 0;//0.5 / 2048.0;
d3d_verts[0].tv = d3d_verts[3].tv = d3d_verts[4].tv = 0;//0.5 / 2048.0;
d3d_verts[1].tu = d3d_verts[4].tu = d3d_verts[5].tu = (float)w / 2048.0;
d3d_verts[1].tv = d3d_verts[2].tv = d3d_verts[5].tv = (float)h / 2048.0;
d3d_verts[0].color = d3d_verts[1].color = d3d_verts[2].color =
d3d_verts[3].color = d3d_verts[4].color = d3d_verts[5].color =
d3d_verts[6].color = d3d_verts[7].color = d3d_verts[8].color =
d3d_verts[9].color = d3d_verts[10].color = d3d_verts[11].color = 0xffffff;
GetClientRect(d3d_hwnd, &r);
d3d_verts[0].x = d3d_verts[2].x = d3d_verts[3].x = -0.5;
d3d_verts[0].y = d3d_verts[3].y = d3d_verts[4].y = -0.5;
d3d_verts[1].x = d3d_verts[4].x = d3d_verts[5].x = (r.right - r.left) - 0.5;
d3d_verts[1].y = d3d_verts[2].y = d3d_verts[5].y = (r.bottom - r.top) - 0.5;
d3d_verts[6].x = d3d_verts[8].x = d3d_verts[9].x = (r.right - r.left) - 40.5;
d3d_verts[6].y = d3d_verts[9].y = d3d_verts[10].y = 8.5;
d3d_verts[7].x = d3d_verts[10].x = d3d_verts[11].x = (r.right - r.left) - 8.5;
d3d_verts[7].y = d3d_verts[8].y = d3d_verts[11].y = 14.5;
if (hr == D3D_OK)
hr = v_buffer->Lock(0, 0, (void**)&pVoid, 0); // lock the vertex buffer
if (hr == D3D_OK)
memcpy(pVoid, d3d_verts, sizeof(d3d_verts)); // copy the vertices to the locked buffer
if (hr == D3D_OK)
hr = v_buffer->Unlock(); // unlock the vertex buffer
if (hr == D3D_OK)
hr = d3ddev->BeginScene();
if (hr == D3D_OK)
{
if (hr == D3D_OK)
hr = d3ddev->SetTexture(0, d3dTexture);
if (hr == D3D_OK)
hr = d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
if (hr == D3D_OK)
hr = d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
if (hr == D3D_OK)
hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
if (hr == D3D_OK)
hr = d3ddev->SetTexture(0, NULL);
if (hr == D3D_OK && readflash && vid_disc_indicator)
{
hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 6, 2);
readflash = 0;
}
if (hr == D3D_OK)
hr = d3ddev->EndScene();
}
if (hr == D3D_OK)
hr = d3ddev->Present(NULL, NULL, d3d_hwnd, NULL);
if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
PostMessage(d3d_hwnd, WM_RESETD3D, 0, 0);
}

View file

@ -16,7 +16,6 @@ extern "C" void ddraw_fs_close();
extern "C" void video_blit_complete(); extern "C" void video_blit_complete();
static void ddraw_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h); static void ddraw_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
static void ddraw_fs_blit_memtoscreen_8(int x, int y, int w, int h);
static LPDIRECTDRAW lpdd = NULL; static LPDIRECTDRAW lpdd = NULL;
static LPDIRECTDRAW4 lpdd4 = NULL; static LPDIRECTDRAW4 lpdd4 = NULL;
@ -29,41 +28,11 @@ static DDSURFACEDESC2 ddsd;
static HWND ddraw_hwnd; static HWND ddraw_hwnd;
static int ddraw_w, ddraw_h; static int ddraw_w, ddraw_h;
static PALETTE cgapal =
{
{0,0,0},{0,42,0},{42,0,0},{42,21,0},
{0,0,0},{0,42,42},{42,0,42},{42,42,42},
{0,0,0},{21,63,21},{63,21,21},{63,63,21},
{0,0,0},{21,63,63},{63,21,63},{63,63,63},
{0,0,0},{0,0,42},{0,42,0},{0,42,42},
{42,0,0},{42,0,42},{42,21,00},{42,42,42},
{21,21,21},{21,21,63},{21,63,21},{21,63,63},
{63,21,21},{63,21,63},{63,63,21},{63,63,63},
{0,0,0},{0,21,0},{0,0,42},{0,42,42},
{42,0,21},{21,10,21},{42,0,42},{42,0,63},
{21,21,21},{21,63,21},{42,21,42},{21,63,63},
{63,0,0},{42,42,0},{63,21,42},{41,41,41},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
};
static uint32_t pal_lookup[256];
void ddraw_fs_init(HWND h) void ddraw_fs_init(HWND h)
{ {
int c;
ddraw_w = GetSystemMetrics(SM_CXSCREEN); ddraw_w = GetSystemMetrics(SM_CXSCREEN);
ddraw_h = GetSystemMetrics(SM_CYSCREEN); ddraw_h = GetSystemMetrics(SM_CYSCREEN);
for (c = 0; c < 256; c++)
pal_lookup[c] = makecol(cgapal[c].r << 2, cgapal[c].g << 2, cgapal[c].b << 2);
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL))) if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
fatal("DirectDrawCreate failed\n"); fatal("DirectDrawCreate failed\n");
@ -108,7 +77,6 @@ void ddraw_fs_init(HWND h)
pclog("DDRAW_INIT complete\n"); pclog("DDRAW_INIT complete\n");
ddraw_hwnd = h; ddraw_hwnd = h;
video_blit_memtoscreen_func = ddraw_fs_blit_memtoscreen; video_blit_memtoscreen_func = ddraw_fs_blit_memtoscreen;
video_blit_memtoscreen_8_func = ddraw_fs_blit_memtoscreen_8;
} }
void ddraw_fs_close() void ddraw_fs_close()
@ -260,77 +228,3 @@ static void ddraw_fs_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h
lpdds_pri->Flip(NULL, DDFLIP_NOVSYNC); lpdds_pri->Flip(NULL, DDFLIP_NOVSYNC);
} }
} }
static void ddraw_fs_blit_memtoscreen_8(int x, int y, int w, int h)
{
RECT r_src;
RECT r_dest;
RECT window_rect;
int xx, yy;
HRESULT hr;
DDBLTFX ddbltfx;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
hr = lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_back->Restore();
lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
device_force_redraw();
}
if (!ddsd.lpSurface)
{
video_blit_complete();
return;
}
for (yy = 0; yy < h; yy++)
{
if ((y + yy) >= 0 && (y + yy) < buffer->h)
{
uint32_t *p = (uint32_t *)((uintptr_t)ddsd.lpSurface + (yy * ddsd.lPitch));
for (xx = 0; xx < w; xx++)
p[xx] = pal_lookup[buffer->line[y + yy][x + xx]];
}
}
video_blit_complete();
lpdds_back->Unlock(NULL);
window_rect.left = 0;
window_rect.top = 0;
window_rect.right = ddraw_w;
window_rect.bottom = ddraw_h;
ddraw_fs_size(window_rect, &r_dest, w, h);
r_src.left = 0;
r_src.top = 0;
r_src.right = w;
r_src.bottom = h;
ddbltfx.dwSize = sizeof(ddbltfx);
ddbltfx.dwFillColor = 0;
lpdds_back2->Blt(&window_rect, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbltfx);
hr = lpdds_back2->Blt(&r_dest, lpdds_back, &r_src, DDBLT_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_back2->Restore();
lpdds_back2->Blt(&r_dest, lpdds_back, &r_src, DDBLT_WAIT, NULL);
}
if (readflash && vid_disc_indicator)
{
RECT r;
r.left = window_rect.right - 40;
r.right = window_rect.right - 8;
r.top = 8;
r.bottom = 14;
ddbltfx.dwFillColor = 0xffffff;
lpdds_back2->Blt(&r, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbltfx);
}
lpdds_pri->Flip(NULL, DDFLIP_NOVSYNC);
}

View file

@ -16,7 +16,6 @@ extern "C" void ddraw_close();
extern "C" void video_blit_complete(); extern "C" void video_blit_complete();
static void ddraw_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h); static void ddraw_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
static void ddraw_blit_memtoscreen_8(int x, int y, int w, int h);
static LPDIRECTDRAW lpdd = NULL; static LPDIRECTDRAW lpdd = NULL;
static LPDIRECTDRAW4 lpdd4 = NULL; static LPDIRECTDRAW4 lpdd4 = NULL;
@ -28,38 +27,8 @@ static DDSURFACEDESC2 ddsd;
static HWND ddraw_hwnd; static HWND ddraw_hwnd;
static PALETTE cgapal=
{
{0,0,0},{0,42,0},{42,0,0},{42,21,0},
{0,0,0},{0,42,42},{42,0,42},{42,42,42},
{0,0,0},{21,63,21},{63,21,21},{63,63,21},
{0,0,0},{21,63,63},{63,21,63},{63,63,63},
{0,0,0},{0,0,42},{0,42,0},{0,42,42},
{42,0,0},{42,0,42},{42,21,00},{42,42,42},
{21,21,21},{21,21,63},{21,63,21},{21,63,63},
{63,21,21},{63,21,63},{63,63,21},{63,63,63},
{0,0,0},{0,21,0},{0,0,42},{0,42,42},
{42,0,21},{21,10,21},{42,0,42},{42,0,63},
{21,21,21},{21,63,21},{42,21,42},{21,63,63},
{63,0,0},{42,42,0},{63,21,42},{41,41,41},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,42,42},{42,0,0},{42,42,42},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
{0,0,0},{0,63,63},{63,0,0},{63,63,63},
};
static uint32_t pal_lookup[256];
void ddraw_init(HWND h) void ddraw_init(HWND h)
{ {
int c;
for (c = 0; c < 256; c++)
pal_lookup[c] = makecol(cgapal[c].r << 2, cgapal[c].g << 2, cgapal[c].b << 2);
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL))) if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
fatal("DirectDrawCreate failed\n"); fatal("DirectDrawCreate failed\n");
@ -112,7 +81,6 @@ void ddraw_init(HWND h)
pclog("DDRAW_INIT complete\n"); pclog("DDRAW_INIT complete\n");
ddraw_hwnd = h; ddraw_hwnd = h;
video_blit_memtoscreen_func = ddraw_blit_memtoscreen; video_blit_memtoscreen_func = ddraw_blit_memtoscreen;
video_blit_memtoscreen_8_func = ddraw_blit_memtoscreen_8;
} }
void ddraw_close() void ddraw_close()
@ -154,6 +122,9 @@ static void ddraw_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
HRESULT hr; HRESULT hr;
// pclog("Blit memtoscreen %i,%i %i %i %i,%i\n", x, y, y1, y2, w, h); // pclog("Blit memtoscreen %i,%i %i %i %i,%i\n", x, y, y1, y2, w, h);
if (h <= 0)
return;
memset(&ddsd, 0, sizeof(ddsd)); memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd); ddsd.dwSize = sizeof(ddsd);
@ -171,7 +142,7 @@ static void ddraw_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
} }
for (yy = y1; yy < y2; yy++) for (yy = y1; yy < y2; yy++)
{ {
if ((y + yy) >= 0 && (y + yy) < buffer->h) if ((y + yy) >= 0 && (y + yy) < buffer32->h)
memcpy((void *)((uintptr_t)ddsd.lpSurface + (yy * ddsd.lPitch)), &(((uint32_t *)buffer32->line[y + yy])[x]), w * 4); memcpy((void *)((uintptr_t)ddsd.lpSurface + (yy * ddsd.lPitch)), &(((uint32_t *)buffer32->line[y + yy])[x]), w * 4);
} }
video_blit_complete(); video_blit_complete();
@ -223,87 +194,3 @@ static void ddraw_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
lpdds_pri->Blt(&r_dest, lpdds_back2, &r_src, DDBLT_WAIT, NULL); lpdds_pri->Blt(&r_dest, lpdds_back2, &r_src, DDBLT_WAIT, NULL);
} }
} }
static void ddraw_blit_memtoscreen_8(int x, int y, int w, int h)
{
RECT r_src;
RECT r_dest;
int xx, yy;
POINT po;
uint32_t *p;
HRESULT hr;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
hr = lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_back->Restore();
lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
device_force_redraw();
}
if (!ddsd.lpSurface)
{
video_blit_complete();
return;
}
for (yy = 0; yy < h; yy++)
{
if ((y + yy) >= 0 && (y + yy) < buffer->h)
{
p = (uint32_t *)((uintptr_t)ddsd.lpSurface + (yy * ddsd.lPitch));
for (xx = 0; xx < w; xx++)
p[xx] = pal_lookup[buffer->line[y + yy][x + xx]];
}
}
p = (uint32_t *)((uintptr_t)ddsd.lpSurface + (4 * ddsd.lPitch));
lpdds_back->Unlock(NULL);
video_blit_complete();
po.x = po.y = 0;
ClientToScreen(ddraw_hwnd, &po);
GetClientRect(ddraw_hwnd, &r_dest);
OffsetRect(&r_dest, po.x, po.y);
r_src.left = 0;
r_src.top = 0;
r_src.right = w;
r_src.bottom = h;
hr = lpdds_back2->Blt(&r_src, lpdds_back, &r_src, DDBLT_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_back2->Restore();
lpdds_back2->Blt(&r_src, lpdds_back, &r_src, DDBLT_WAIT, NULL);
}
if (readflash && vid_disc_indicator)
{
readflash = 0;
hr = lpdds_back2->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_back2->Restore();
lpdds_back2->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
device_force_redraw();
}
if (!ddsd.lpSurface) return;
for (yy = 8; yy < 14; yy++)
{
p = (uint32_t *)((uintptr_t)ddsd.lpSurface + (yy * ddsd.lPitch));
for (xx = (w - 40); xx < (w - 8); xx++)
p[xx] = 0xffffffff;
}
lpdds_back2->Unlock(NULL);
}
hr = lpdds_pri->Blt(&r_dest, lpdds_back2, &r_src, DDBLT_WAIT, NULL);
if (hr == DDERR_SURFACELOST)
{
lpdds_pri->Restore();
hr = lpdds_pri->Blt(&r_dest, lpdds_back2, &r_src, DDBLT_WAIT, NULL);
}
}

View file

@ -7,13 +7,11 @@ BITMAP *screen;
void hline(BITMAP *b, int x1, int y, int x2, int col) void hline(BITMAP *b, int x1, int y, int x2, int col)
{ {
if (y < 0 || y >= buffer->h) if (y < 0 || y >= buffer32->h)
return; return;
if (b == buffer) for (; x1 < x2; x1++)
memset(&b->line[y][x1], col, x2 - x1); ((uint32_t *)b->line[y])[x1] = col;
else
memset(&((uint32_t *)b->line[y])[x1], col, (x2 - x1) * 4);
} }
void blit(BITMAP *src, BITMAP *dst, int x1, int y1, int x2, int y2, int xs, int ys) void blit(BITMAP *src, BITMAP *dst, int x1, int y1, int x2, int y2, int xs, int ys)