# HG changeset patch # User TomW # Date 1406233817 -3600 # Node ID abd5259486c3666e447fca5a5fa2bc7cd5767866 # Parent ffe477b4639fd82995e4021f4a1406ce619d9715 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. diff -r ffe477b4639f -r abd5259486c3 src/vid_ati68860_ramdac.c --- a/src/vid_ati68860_ramdac.c Wed Jul 23 08:15:35 2014 +0100 +++ b/src/vid_ati68860_ramdac.c Thu Jul 24 21:30:17 2014 +0100 @@ -23,6 +23,7 @@ #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 @@ 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 @@ // 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; +} diff -r ffe477b4639f -r abd5259486c3 src/vid_ati68860_ramdac.h --- a/src/vid_ati68860_ramdac.h Wed Jul 23 08:15:35 2014 +0100 +++ b/src/vid_ati68860_ramdac.h Thu Jul 24 21:30:17 2014 +0100 @@ -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); diff -r ffe477b4639f -r abd5259486c3 src/vid_ati_mach64.c --- a/src/vid_ati_mach64.c Wed Jul 23 08:15:35 2014 +0100 +++ b/src/vid_ati_mach64.c Thu Jul 24 21:30:17 2014 +0100 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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; diff -r ffe477b4639f -r abd5259486c3 src/vid_svga_render.c --- a/src/vid_svga_render.c Wed Jul 23 08:15:35 2014 +0100 +++ b/src/vid_svga_render.c Thu Jul 24 21:30:17 2014 +0100 @@ -638,3 +638,24 @@ } } +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; + } +} diff -r ffe477b4639f -r abd5259486c3 src/vid_svga_render.h --- a/src/vid_svga_render.h Wed Jul 23 08:15:35 2014 +0100 +++ b/src/vid_svga_render.h Thu Jul 24 21:30:17 2014 +0100 @@ -27,5 +27,6 @@ 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);