From 74793aaf9985816c330819759af4f7f0c6bbcd61 Mon Sep 17 00:00:00 2001 From: TomW Date: Sun, 15 Dec 2013 14:29:52 +0000 Subject: [PATCH] Mach64 now disables VGA data processing on LFB writes. Windows 9x DOS boxes now rendered correctly. --- src/vid_ati_mach64.c | 6 +++++- src/vid_svga.c | 8 ++++---- src/vid_svga.h | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/vid_ati_mach64.c b/src/vid_ati_mach64.c index e06a1cd..b65b2be 100644 --- a/src/vid_ati_mach64.c +++ b/src/vid_ati_mach64.c @@ -630,7 +630,7 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) int mix; int dst_x = mach64->accel.dst_x + mach64->accel.dst_x_start; int dst_y = mach64->accel.dst_y + mach64->accel.dst_y_start; - + if (mach64->accel.source_host) { host_dat = cpu_dat; @@ -1291,6 +1291,10 @@ void mach64_ext_writeb(uint32_t addr, uint8_t val, void *p) case 0x1c: case 0x1d: case 0x1e: case 0x1f: WRITE8(addr, mach64->crtc_gen_cntl, val); + if (((mach64->crtc_gen_cntl >> 24) & 3) == 3) + svga->fb_only = 1; + else + svga->fb_only = 0; svga_recalctimings(&mach64->svga); break; diff --git a/src/vid_svga.c b/src/vid_svga.c index d27d635..0a9f2b7 100644 --- a/src/vid_svga.c +++ b/src/vid_svga.c @@ -660,7 +660,7 @@ void svga_write(uint32_t addr, uint8_t val, void *p) addr += svga->write_bank; if (!(svga->gdcreg[6] & 1)) svga->fullchange=2; - if (svga->chain4) + if (svga->chain4 || svga->fb_only) { writemask2=1<<(addr&3); addr&=~3; @@ -836,7 +836,7 @@ uint8_t svga_read(uint32_t addr, void *p) // pclog("%05X %i %04X:%04X %02X %02X %i\n",addr,svga->chain4,CS,pc, vram[addr & 0x7fffff], vram[(addr << 2) & 0x7fffff], svga->readmode); // pclog("%i\n", svga->readmode); - if (svga->chain4) + if (svga->chain4 || svga->fb_only) { addr &= 0x7fffff; if (addr >= svga->vram_limit) @@ -888,7 +888,7 @@ void svga_write_linear(uint32_t addr, uint8_t val, void *p) if (svga_output) pclog("Write LFB %08X %02X ", addr, val); if (!(svga->gdcreg[6] & 1)) svga->fullchange = 2; - if (svga->chain4) + if (svga->chain4 || svga->fb_only) { writemask2=1<<(addr&3); addr&=~3; @@ -1057,7 +1057,7 @@ uint8_t svga_read_linear(uint32_t addr, void *p) egareads++; - if (svga->chain4) + if (svga->chain4 || svga->fb_only) { addr &= 0x7fffff; if (addr >= svga->vram_limit) diff --git a/src/vid_svga.h b/src/vid_svga.h index f969abd..405a187 100644 --- a/src/vid_svga.h +++ b/src/vid_svga.h @@ -25,6 +25,8 @@ typedef struct svga_t uint8_t plane_mask; + int fb_only; + int fast; uint8_t colourcompare, colournocare; int readmode, writemode, readplane;