Ported the most important patches from PCem.
This commit is contained in:
@@ -1170,6 +1170,8 @@ enter_smm(int in_hlt)
|
|||||||
flushmmucache();
|
flushmmucache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oldcpl = 0;
|
||||||
|
|
||||||
cpu_cur_status &= ~(CPU_STATUS_PMODE | CPU_STATUS_V86);
|
cpu_cur_status &= ~(CPU_STATUS_PMODE | CPU_STATUS_V86);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
}
|
}
|
||||||
@@ -1265,6 +1267,8 @@ leave_smm(void)
|
|||||||
|
|
||||||
nmi_mask = 1;
|
nmi_mask = 1;
|
||||||
|
|
||||||
|
oldcpl = CPL;
|
||||||
|
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
x386_common_log("CS : seg = %04X, base = %08X, limit = %08X, limit_low = %08X, limit_high = %08X, access = %02X, ar_high = %02X\n",
|
x386_common_log("CS : seg = %04X, base = %08X, limit = %08X, limit_low = %08X, limit_high = %08X, access = %02X, ar_high = %02X\n",
|
||||||
|
@@ -2357,11 +2357,11 @@ static uint8_t banshee_pci_read(int func, int addr, void *p)
|
|||||||
case 0x1a: ret = 0x00; break;
|
case 0x1a: ret = 0x00; break;
|
||||||
case 0x1b: ret = 0x00; break;
|
case 0x1b: ret = 0x00; break;
|
||||||
|
|
||||||
/*Undocumented, but Voodoo 3 BIOS checks this*/
|
/*Subsystem vendor ID*/
|
||||||
case 0x2c: ret = 0x1a; break;
|
case 0x2c: ret = banshee->pci_regs[0x2c]; break;
|
||||||
case 0x2d: ret = 0x12; break;
|
case 0x2d: ret = banshee->pci_regs[0x2d]; break;
|
||||||
case 0x2e: ret = (banshee->type == TYPE_V3_3000) ? 0x3a : 0x30; break;
|
case 0x2e: ret = banshee->pci_regs[0x2e]; break;
|
||||||
case 0x2f: ret = 0x00; break;
|
case 0x2f: ret = banshee->pci_regs[0x2f]; break;
|
||||||
|
|
||||||
case 0x30: ret = banshee->pci_regs[0x30] & 0x01; break; /*BIOS ROM address*/
|
case 0x30: ret = banshee->pci_regs[0x30] & 0x01; break; /*BIOS ROM address*/
|
||||||
case 0x31: ret = 0x00; break;
|
case 0x31: ret = 0x00; break;
|
||||||
@@ -2667,6 +2667,37 @@ static void *banshee_init_common(const device_t *info, wchar_t *fn, int has_sgra
|
|||||||
banshee->i2c_ddc = i2c_gpio_init("ddc_voodoo_banshee");
|
banshee->i2c_ddc = i2c_gpio_init("ddc_voodoo_banshee");
|
||||||
banshee->ddc = ddc_init(i2c_gpio_get_bus(banshee->i2c_ddc));
|
banshee->ddc = ddc_init(i2c_gpio_get_bus(banshee->i2c_ddc));
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case TYPE_BANSHEE:
|
||||||
|
if (has_sgram) {
|
||||||
|
banshee->pci_regs[0x2c] = 0x1a;
|
||||||
|
banshee->pci_regs[0x2d] = 0x12;
|
||||||
|
banshee->pci_regs[0x2e] = 0x04;
|
||||||
|
banshee->pci_regs[0x2f] = 0x00;
|
||||||
|
} else {
|
||||||
|
banshee->pci_regs[0x2c] = 0x02;
|
||||||
|
banshee->pci_regs[0x2d] = 0x11;
|
||||||
|
banshee->pci_regs[0x2e] = 0x17;
|
||||||
|
banshee->pci_regs[0x2f] = 0x10;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TYPE_V3_2000:
|
||||||
|
banshee->pci_regs[0x2c] = 0x1a;
|
||||||
|
banshee->pci_regs[0x2d] = 0x12;
|
||||||
|
banshee->pci_regs[0x2e] = 0x30;
|
||||||
|
banshee->pci_regs[0x2f] = 0x00;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TYPE_V3_3000:
|
||||||
|
banshee->pci_regs[0x2c] = 0x1a;
|
||||||
|
banshee->pci_regs[0x2d] = 0x12;
|
||||||
|
banshee->pci_regs[0x2e] = 0x3a;
|
||||||
|
banshee->pci_regs[0x2f] = 0x00;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_banshee);
|
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_banshee);
|
||||||
|
|
||||||
return banshee;
|
return banshee;
|
||||||
|
@@ -918,7 +918,7 @@ static void step_line(voodoo_t *voodoo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void banshee_do_line(voodoo_t *voodoo)
|
static void banshee_do_line(voodoo_t *voodoo, int draw_last_pixel)
|
||||||
{
|
{
|
||||||
clip_t *clip = &voodoo->banshee_blt.clip[(voodoo->banshee_blt.command & COMMAND_CLIP_SEL) ? 1 : 0];
|
clip_t *clip = &voodoo->banshee_blt.clip[(voodoo->banshee_blt.command & COMMAND_CLIP_SEL) ? 1 : 0];
|
||||||
uint8_t rop = voodoo->banshee_blt.command >> 24;
|
uint8_t rop = voodoo->banshee_blt.command >> 24;
|
||||||
@@ -975,6 +975,15 @@ static void banshee_do_line(voodoo_t *voodoo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (draw_last_pixel)
|
||||||
|
{
|
||||||
|
int mask = stipple & (1 << voodoo->banshee_blt.line_bit_pos);
|
||||||
|
int pattern_trans = (voodoo->banshee_blt.command & COMMAND_TRANS_MONO) ? mask : 1;
|
||||||
|
|
||||||
|
if (y >= clip->y_min && y < clip->y_max && x >= clip->x_min && x < clip->x_max && pattern_trans)
|
||||||
|
PLOT_LINE(voodoo, x, y, rop, mask ? voodoo->banshee_blt.colorFore : voodoo->banshee_blt.colorBack, COLORKEY_32);
|
||||||
|
}
|
||||||
|
|
||||||
voodoo->banshee_blt.srcXY = (x & 0xffff) | (y << 16);
|
voodoo->banshee_blt.srcXY = (x & 0xffff) | (y << 16);
|
||||||
voodoo->banshee_blt.srcX = x;
|
voodoo->banshee_blt.srcX = x;
|
||||||
voodoo->banshee_blt.srcY = y;
|
voodoo->banshee_blt.srcY = y;
|
||||||
@@ -1112,8 +1121,12 @@ static void banshee_do_2d_blit(voodoo_t *voodoo, int count, uint32_t data)
|
|||||||
banshee_do_rectfill(voodoo);
|
banshee_do_rectfill(voodoo);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case COMMAND_CMD_LINE:
|
||||||
|
banshee_do_line(voodoo, 1);
|
||||||
|
break;
|
||||||
|
|
||||||
case COMMAND_CMD_POLYLINE:
|
case COMMAND_CMD_POLYLINE:
|
||||||
banshee_do_line(voodoo);
|
banshee_do_line(voodoo, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1386,18 +1399,18 @@ void voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val)
|
|||||||
banshee_do_rectfill(voodoo);
|
banshee_do_rectfill(voodoo);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* case COMMAND_CMD_LINE:
|
case COMMAND_CMD_LINE:
|
||||||
voodoo->banshee_blt.dstXY = val;
|
voodoo->banshee_blt.dstXY = val;
|
||||||
voodoo->banshee_blt.dstX = ((int32_t)(val << 19)) >> 19;
|
voodoo->banshee_blt.dstX = ((int32_t)(val << 19)) >> 19;
|
||||||
voodoo->banshee_blt.dstY = ((int32_t)(val << 3)) >> 19;
|
voodoo->banshee_blt.dstY = ((int32_t)(val << 3)) >> 19;
|
||||||
banshee_do_line(voodoo);
|
banshee_do_line(voodoo, 1);
|
||||||
break;*/
|
break;
|
||||||
|
|
||||||
case COMMAND_CMD_POLYLINE:
|
case COMMAND_CMD_POLYLINE:
|
||||||
voodoo->banshee_blt.dstXY = val;
|
voodoo->banshee_blt.dstXY = val;
|
||||||
voodoo->banshee_blt.dstX = ((int32_t)(val << 19)) >> 19;
|
voodoo->banshee_blt.dstX = ((int32_t)(val << 19)) >> 19;
|
||||||
voodoo->banshee_blt.dstY = ((int32_t)(val << 3)) >> 19;
|
voodoo->banshee_blt.dstY = ((int32_t)(val << 3)) >> 19;
|
||||||
banshee_do_line(voodoo);
|
banshee_do_line(voodoo, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_CMD_POLYFILL:
|
case COMMAND_CMD_POLYFILL:
|
||||||
|
Reference in New Issue
Block a user