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:
parent
f0eafa60c9
commit
8cd1b2d29c
5 changed files with 93 additions and 12 deletions
|
|
@ -23,6 +23,7 @@ bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "vid_svga.h"
|
#include "vid_svga.h"
|
||||||
#include "vid_ati68860_ramdac.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)
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
ramdac->regs[addr & 0xf] = val;
|
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;
|
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);
|
// pclog("ati68860_in : addr %04X ret %02X %04X:%04X\n", addr, ret, CS,pc);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ati68860_ramdac_init(ati68860_ramdac_t *ramdac)
|
||||||
|
{
|
||||||
|
ramdac->render = svga_render_8bpp_highres;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
typedef struct ati68860_ramdac_t
|
typedef struct ati68860_ramdac_t
|
||||||
{
|
{
|
||||||
uint8_t regs[16];
|
uint8_t regs[16];
|
||||||
|
void (*render)(struct svga_t *svga);
|
||||||
} ati68860_ramdac_t;
|
} ati68860_ramdac_t;
|
||||||
|
|
||||||
void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga);
|
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);
|
uint8_t ati68860_ramdac_in(uint16_t addr, ati68860_ramdac_t *ramdac, svga_t *svga);
|
||||||
|
void ati68860_ramdac_init(ati68860_ramdac_t *ramdac);
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@
|
||||||
#include "vid_ati68860_ramdac.h"
|
#include "vid_ati68860_ramdac.h"
|
||||||
#include "vid_ati_eeprom.h"
|
#include "vid_ati_eeprom.h"
|
||||||
#include "vid_ics2595.h"
|
#include "vid_ics2595.h"
|
||||||
#include "vid_svga_render.h"
|
|
||||||
|
|
||||||
//#define MACH64_DEBUG
|
//#define MACH64_DEBUG
|
||||||
|
|
||||||
|
|
@ -182,6 +181,11 @@ enum
|
||||||
SRC_LINEAR_EN = 4
|
SRC_LINEAR_EN = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DP_BYTE_PIX_ORDER = (1 << 24)
|
||||||
|
};
|
||||||
|
|
||||||
static int mach64_width[8] = {0, 0, 0, 1, 1, 2, 2, 0};
|
static int mach64_width[8] = {0, 0, 0, 1, 1, 2, 2, 0};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
|
@ -238,10 +242,12 @@ void mach64_out(uint16_t addr, uint8_t val, void *p)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x3D4:
|
case 0x3D4:
|
||||||
svga->crtcreg = val & 0x3f;
|
svga->crtcreg = val & 0x1f;
|
||||||
return;
|
return;
|
||||||
case 0x3D5:
|
case 0x3D5:
|
||||||
if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return;
|
if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return;
|
||||||
|
if (svga->crtcreg > 0x18)
|
||||||
|
return;
|
||||||
old = svga->crtc[svga->crtcreg];
|
old = svga->crtc[svga->crtcreg];
|
||||||
svga->crtc[svga->crtcreg] = val;
|
svga->crtc[svga->crtcreg] = val;
|
||||||
|
|
||||||
|
|
@ -281,6 +287,8 @@ uint8_t mach64_in(uint16_t addr, void *p)
|
||||||
case 0x3D4:
|
case 0x3D4:
|
||||||
return svga->crtcreg;
|
return svga->crtcreg;
|
||||||
case 0x3D5:
|
case 0x3D5:
|
||||||
|
if (svga->crtcreg > 0x18)
|
||||||
|
return 0xff;
|
||||||
return svga->crtc[svga->crtcreg];
|
return svga->crtc[svga->crtcreg];
|
||||||
}
|
}
|
||||||
return svga_in(addr, svga);
|
return svga_in(addr, svga);
|
||||||
|
|
@ -306,34 +314,35 @@ void mach64_recalctimings(svga_t *svga)
|
||||||
// svga_htotal <<= 1;
|
// svga_htotal <<= 1;
|
||||||
// svga_hdisp <<= 1;
|
// svga_hdisp <<= 1;
|
||||||
svga->rowoffset <<= 1;
|
svga->rowoffset <<= 1;
|
||||||
|
svga->render = mach64->ramdac.render;
|
||||||
switch ((mach64->crtc_gen_cntl >> 8) & 7)
|
switch ((mach64->crtc_gen_cntl >> 8) & 7)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
svga->render = svga_render_4bpp_highres;
|
// svga->render = svga_render_4bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
svga->render = svga_render_8bpp_highres;
|
// svga->render = svga_render_8bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
svga->rowoffset /= 2;
|
svga->rowoffset /= 2;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
svga->render = svga_render_15bpp_highres;
|
// svga->render = svga_render_15bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
//svga_rowoffset *= 2;
|
//svga_rowoffset *= 2;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
svga->render = svga_render_16bpp_highres;
|
// svga->render = svga_render_16bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
//svga_rowoffset *= 2;
|
//svga_rowoffset *= 2;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
svga->render = svga_render_24bpp_highres;
|
// svga->render = svga_render_24bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
svga->rowoffset = (svga->rowoffset * 3) / 2;
|
svga->rowoffset = (svga->rowoffset * 3) / 2;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
svga->render = svga_render_32bpp_highres;
|
// svga->render = svga_render_32bpp_highres;
|
||||||
svga->hdisp *= 8;
|
svga->hdisp *= 8;
|
||||||
svga->rowoffset *= 2;
|
svga->rowoffset *= 2;
|
||||||
break;
|
break;
|
||||||
|
|
@ -706,8 +715,16 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
switch (mach64->accel.source_mix)
|
switch (mach64->accel.source_mix)
|
||||||
{
|
{
|
||||||
case MONO_SRC_HOST:
|
case MONO_SRC_HOST:
|
||||||
mix = cpu_dat >> 31;
|
if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER)
|
||||||
cpu_dat <<= 1;
|
{
|
||||||
|
mix = cpu_dat & 1;
|
||||||
|
cpu_dat >>= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mix = cpu_dat >> 31;
|
||||||
|
cpu_dat <<= 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MONO_SRC_PAT:
|
case MONO_SRC_PAT:
|
||||||
mix = mach64->accel.pattern[dst_y & 7][dst_x & 7];
|
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 0x210: case 0x214: case 0x218: case 0x21c:
|
||||||
case 0x220: case 0x224: case 0x228: case 0x22c:
|
case 0x220: case 0x224: case 0x228: case 0x22c:
|
||||||
case 0x230: case 0x234: case 0x238: case 0x23c:
|
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);
|
mach64_blit(val, 32, mach64);
|
||||||
else
|
else
|
||||||
mach64_blit(((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24), 32, mach64);
|
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);
|
ati_eeprom_load(&mach64->eeprom, "mach64.nvr", 1);
|
||||||
|
|
||||||
|
ati68860_ramdac_init(&mach64->ramdac);
|
||||||
|
|
||||||
mach64->dac_cntl = 5 << 16; /*ATI 68860 RAMDAC*/
|
mach64->dac_cntl = 5 << 16; /*ATI 68860 RAMDAC*/
|
||||||
|
|
||||||
mach64->dst_cntl = 3;
|
mach64->dst_cntl = 3;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,5 +27,6 @@ void svga_render_24bpp_lowres(svga_t *svga);
|
||||||
void svga_render_24bpp_highres(svga_t *svga);
|
void svga_render_24bpp_highres(svga_t *svga);
|
||||||
void svga_render_32bpp_lowres(svga_t *svga);
|
void svga_render_32bpp_lowres(svga_t *svga);
|
||||||
void svga_render_32bpp_highres(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);
|
extern void (*svga_render)(svga_t *svga);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue