diff --git a/src/vid_voodoo.c b/src/vid_voodoo.c index 6245106..19c5467 100644 --- a/src/vid_voodoo.c +++ b/src/vid_voodoo.c @@ -603,7 +603,10 @@ static void voodoo_writel(uint32_t addr, uint32_t val, void *p) break; case SST_fbiInit7: if (voodoo->initEnable & 0x01) + { voodoo->fbiInit7 = val; + voodoo->cmdfifo_enabled = val & 0x100; + } break; case SST_cmdFifoBaseAddr: diff --git a/src/vid_voodoo_banshee.c b/src/vid_voodoo_banshee.c index fb0ca99..0e95ccc 100644 --- a/src/vid_voodoo_banshee.c +++ b/src/vid_voodoo_banshee.c @@ -1098,6 +1098,7 @@ static void banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) case cmdBaseSize0: voodoo->cmdfifo_size = val; voodoo->cmdfifo_end = voodoo->cmdfifo_base + (((voodoo->cmdfifo_size & 0xff) + 1) << 12); + voodoo->cmdfifo_enabled = val & 0x100; // pclog("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); break; @@ -1437,7 +1438,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) svga->changedvram[addr >> 12] = changeframecount; *(uint32_t *)&svga->vram[addr & svga->vram_mask] = val; - if (addr >= voodoo->cmdfifo_base && addr < voodoo->cmdfifo_end) + if (voodoo->cmdfifo_enabled && addr >= voodoo->cmdfifo_base && addr < voodoo->cmdfifo_end) { // pclog("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); if (addr == voodoo->cmdfifo_base && !voodoo->cmdfifo_holecount) diff --git a/src/vid_voodoo_common.h b/src/vid_voodoo_common.h index c72d079..637ccca 100644 --- a/src/vid_voodoo_common.h +++ b/src/vid_voodoo_common.h @@ -299,6 +299,7 @@ typedef struct voodoo_t uint32_t cmdfifo_base, cmdfifo_end, cmdfifo_size; int cmdfifo_rp; volatile int cmdfifo_depth_rd, cmdfifo_depth_wr; + volatile int cmdfifo_enabled; uint32_t cmdfifo_amin, cmdfifo_amax; int cmdfifo_holecount; diff --git a/src/vid_voodoo_fifo.c b/src/vid_voodoo_fifo.c index 35f63bf..0d35b3a 100644 --- a/src/vid_voodoo_fifo.c +++ b/src/vid_voodoo_fifo.c @@ -237,7 +237,7 @@ void voodoo_fifo_thread(void *param) voodoo->time += end_time - start_time; } - while (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) + while (voodoo->cmdfifo_enabled && voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) { uint64_t start_time = timer_read(); uint64_t end_time;