Mach64 changes :

No longer implements CRTC registers beyond 0x18 - NT no longer detects ET4000.
RGBA8888 mode supported - fixes NT 32-bit colour mode.
Bit order controls supported for CPU 1-bit data - fixes NT 24-bit colour mode.
This commit is contained in:
TomW 2014-07-24 21:30:17 +01:00
commit 8cd1b2d29c
5 changed files with 93 additions and 12 deletions

View file

@ -23,6 +23,7 @@ bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT
#include "video.h"
#include "vid_svga.h"
#include "vid_ati68860_ramdac.h"
#include "vid_svga_render.h"
void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga)
{
@ -43,6 +44,38 @@ void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac,
break;
default:
ramdac->regs[addr & 0xf] = val;
switch (addr & 0xf)
{
case 0xb:
switch (val)
{
case 0x82:
ramdac->render = svga_render_4bpp_highres;
break;
case 0x83:
ramdac->render = svga_render_8bpp_highres;
break;
case 0xa0:
ramdac->render = svga_render_15bpp_highres;
break;
case 0xa1: case 0xb1:
ramdac->render = svga_render_16bpp_highres;
break;
case 0xc0: case 0xd0:
ramdac->render = svga_render_24bpp_highres;
break;
case 0xe2:
ramdac->render = svga_render_32bpp_highres;
break;
case 0xf2:
ramdac->render = svga_render_RGBA8888_highres;
break;
default:
ramdac->render = svga_render_8bpp_highres;
break;
}
break;
}
break;
}
}
@ -81,3 +114,8 @@ uint8_t ati68860_ramdac_in(uint16_t addr, ati68860_ramdac_t *ramdac, svga_t *svg
// pclog("ati68860_in : addr %04X ret %02X %04X:%04X\n", addr, ret, CS,pc);
return ret;
}
void ati68860_ramdac_init(ati68860_ramdac_t *ramdac)
{
ramdac->render = svga_render_8bpp_highres;
}

View file

@ -1,7 +1,9 @@
typedef struct ati68860_ramdac_t
{
uint8_t regs[16];
void (*render)(struct svga_t *svga);
} ati68860_ramdac_t;
void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga);
uint8_t ati68860_ramdac_in(uint16_t addr, ati68860_ramdac_t *ramdac, svga_t *svga);
void ati68860_ramdac_init(ati68860_ramdac_t *ramdac);

View file

@ -11,7 +11,6 @@
#include "vid_ati68860_ramdac.h"
#include "vid_ati_eeprom.h"
#include "vid_ics2595.h"
#include "vid_svga_render.h"
//#define MACH64_DEBUG
@ -182,6 +181,11 @@ enum
SRC_LINEAR_EN = 4
};
enum
{
DP_BYTE_PIX_ORDER = (1 << 24)
};
static int mach64_width[8] = {0, 0, 0, 1, 1, 2, 2, 0};
enum
@ -238,10 +242,12 @@ void mach64_out(uint16_t addr, uint8_t val, void *p)
break;
case 0x3D4:
svga->crtcreg = val & 0x3f;
svga->crtcreg = val & 0x1f;
return;
case 0x3D5:
if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return;
if (svga->crtcreg > 0x18)
return;
old = svga->crtc[svga->crtcreg];
svga->crtc[svga->crtcreg] = val;
@ -281,6 +287,8 @@ uint8_t mach64_in(uint16_t addr, void *p)
case 0x3D4:
return svga->crtcreg;
case 0x3D5:
if (svga->crtcreg > 0x18)
return 0xff;
return svga->crtc[svga->crtcreg];
}
return svga_in(addr, svga);
@ -305,35 +313,36 @@ void mach64_recalctimings(svga_t *svga)
svga->vblankstart = svga->dispend;
// svga_htotal <<= 1;
// svga_hdisp <<= 1;
svga->rowoffset <<= 1;
svga->rowoffset <<= 1;
svga->render = mach64->ramdac.render;
switch ((mach64->crtc_gen_cntl >> 8) & 7)
{
case 1:
svga->render = svga_render_4bpp_highres;
// svga->render = svga_render_4bpp_highres;
svga->hdisp *= 8;
break;
case 2:
svga->render = svga_render_8bpp_highres;
// svga->render = svga_render_8bpp_highres;
svga->hdisp *= 8;
svga->rowoffset /= 2;
break;
case 3:
svga->render = svga_render_15bpp_highres;
// svga->render = svga_render_15bpp_highres;
svga->hdisp *= 8;
//svga_rowoffset *= 2;
break;
case 4:
svga->render = svga_render_16bpp_highres;
// svga->render = svga_render_16bpp_highres;
svga->hdisp *= 8;
//svga_rowoffset *= 2;
break;
case 5:
svga->render = svga_render_24bpp_highres;
// svga->render = svga_render_24bpp_highres;
svga->hdisp *= 8;
svga->rowoffset = (svga->rowoffset * 3) / 2;
break;
case 6:
svga->render = svga_render_32bpp_highres;
// svga->render = svga_render_32bpp_highres;
svga->hdisp *= 8;
svga->rowoffset *= 2;
break;
@ -706,8 +715,16 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
switch (mach64->accel.source_mix)
{
case MONO_SRC_HOST:
mix = cpu_dat >> 31;
cpu_dat <<= 1;
if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER)
{
mix = cpu_dat & 1;
cpu_dat >>= 1;
}
else
{
mix = cpu_dat >> 31;
cpu_dat <<= 1;
}
break;
case MONO_SRC_PAT:
mix = mach64->accel.pattern[dst_y & 7][dst_x & 7];
@ -1722,7 +1739,7 @@ void mach64_ext_writel(uint32_t addr, uint32_t val, void *p)
case 0x210: case 0x214: case 0x218: case 0x21c:
case 0x220: case 0x224: case 0x228: case 0x22c:
case 0x230: case 0x234: case 0x238: case 0x23c:
if (mach64->accel.source_host)
if (mach64->accel.source_host || (mach64->dp_pix_width & DP_BYTE_PIX_ORDER))
mach64_blit(val, 32, mach64);
else
mach64_blit(((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24), 32, mach64);
@ -2243,6 +2260,8 @@ void *mach64gx_init()
ati_eeprom_load(&mach64->eeprom, "mach64.nvr", 1);
ati68860_ramdac_init(&mach64->ramdac);
mach64->dac_cntl = 5 << 16; /*ATI 68860 RAMDAC*/
mach64->dst_cntl = 3;

View file

@ -638,3 +638,24 @@ void svga_render_32bpp_highres(svga_t *svga)
}
}
void svga_render_RGBA8888_highres(svga_t *svga)
{
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
for (x = 0; x <= svga->hdisp; x++)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
p[x] = dat >> 8;
}
svga->ma += 4;
svga->ma &= svga->vrammask;
}
}

View file

@ -27,5 +27,6 @@ void svga_render_24bpp_lowres(svga_t *svga);
void svga_render_24bpp_highres(svga_t *svga);
void svga_render_32bpp_lowres(svga_t *svga);
void svga_render_32bpp_highres(svga_t *svga);
void svga_render_RGBA8888_highres(svga_t *svga);
extern void (*svga_render)(svga_t *svga);