Merge pull request #4496 from 86Box/tc1995

Video changes part 3 (minor though)
This commit is contained in:
Miran Grča
2024-05-30 00:14:26 +02:00
committed by GitHub
4 changed files with 52 additions and 21 deletions

View File

@@ -528,6 +528,7 @@ extern const device_t s3_diamond_stealth_2000_pci_device;
extern const device_t s3_diamond_stealth_3000_pci_device; extern const device_t s3_diamond_stealth_3000_pci_device;
extern const device_t s3_stb_velocity_3d_pci_device; extern const device_t s3_stb_velocity_3d_pci_device;
extern const device_t s3_virge_375_pci_device; extern const device_t s3_virge_375_pci_device;
extern const device_t s3_virge_375_onboard_pci_device;
extern const device_t s3_diamond_stealth_2000pro_pci_device; extern const device_t s3_diamond_stealth_2000pro_pci_device;
extern const device_t s3_virge_385_pci_device; extern const device_t s3_virge_385_pci_device;
extern const device_t s3_virge_357_pci_device; extern const device_t s3_virge_357_pci_device;

View File

@@ -33,6 +33,7 @@
#include <86box/timer.h> #include <86box/timer.h>
#include <86box/nvr.h> #include <86box/nvr.h>
#include <86box/sio.h> #include <86box/sio.h>
#include <86box/sound.h>
#include <86box/hwm.h> #include <86box/hwm.h>
#include <86box/spd.h> #include <86box/spd.h>
#include <86box/video.h> #include <86box/video.h>
@@ -322,6 +323,12 @@ machine_at_ap440fx_init(const machine_t *model)
device_add(&pc87307_device); device_add(&pc87307_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
if (sound_card_current[0] == SOUND_INTERNAL)
device_add(&cs4236b_device);
if (gfxcard[0] == VID_INTERNAL)
device_add(&s3_virge_375_onboard_pci_device);
return ret; return ret;
} }

View File

@@ -5182,7 +5182,7 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
/* The board has a "ASII KB-100" which I was not able to find any information about, /* The board has a "ASII KB-100" which I was not able to find any information about,
but the BIOS sends commands C9 without a parameter and D5, both of which are but the BIOS sends commands C9 without a parameter and D5, both of which are
Phoenix MultiKey commands. */ Phoenix MultiKey commands. */
{ {
@@ -10606,7 +10606,7 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
/* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO. /* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO.
A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */ A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */
{ {
.name = "[i430HX] Supermicro P55T2S", .name = "[i430HX] Supermicro P55T2S",
@@ -12658,7 +12658,7 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
/* ALi ALADDiN IV+ */ /* ALi ALADDiN IV+ */
/* Has the ALi M1543 southbridge with on-chip KBC. */ /* Has the ALi M1543 southbridge with on-chip KBC. */
{ {
@@ -13051,7 +13051,7 @@ const machine_t machines[] = {
.max_multi = 5.5 .max_multi = 5.5
}, },
.bus_flags = MACHINE_PS2_A97 | MACHINE_BUS_USB, .bus_flags = MACHINE_PS2_A97 | MACHINE_BUS_USB,
.flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_GAMEPORT | MACHINE_USB, .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_GAMEPORT | MACHINE_USB,
.ram = { .ram = {
.min = 8192, .min = 8192,
.max = 786432, .max = 786432,
@@ -13462,7 +13462,7 @@ const machine_t machines[] = {
.max_multi = 3.5 .max_multi = 3.5
}, },
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal video: S3 ViRGE/DX and sound: Crystal CS4236B */ .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_SOUND | MACHINE_VIDEO | MACHINE_USB, /* Machine has internal video: S3 ViRGE/DX and sound: Crystal CS4236B */
.ram = { .ram = {
.min = 8192, .min = 8192,
.max = 131072, .max = 131072,
@@ -13476,8 +13476,8 @@ const machine_t machines[] = {
.device = NULL, .device = NULL,
.fdc_device = NULL, .fdc_device = NULL,
.sio_device = NULL, .sio_device = NULL,
.vid_device = NULL, .vid_device = &s3_virge_375_onboard_pci_device,
.snd_device = NULL, .snd_device = &cs4236b_device,
.net_device = NULL .net_device = NULL
}, },
/* According to tests from real hardware: This has AMI MegaKey KBC firmware on the /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the

View File

@@ -295,6 +295,8 @@ typedef struct virge_t {
void *i2c, *ddc; void *i2c, *ddc;
int waiting; int waiting;
int has_bios;
} virge_t; } virge_t;
static video_timings_t timing_diamond_stealth3d_2000_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; static video_timings_t timing_diamond_stealth3d_2000_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 };
@@ -1070,14 +1072,13 @@ s3_virge_updatemapping(virge_t *virge)
virge->linear_base &= ~(virge->linear_size - 1); virge->linear_base &= ~(virge->linear_size - 1);
s3_virge_log("Linear framebuffer at %08X size %08X, mask = %08x, CRTC58 sel = %02x\n", virge->linear_base, virge->linear_size, virge->vram_mask, svga->crtc[0x58] & 7); s3_virge_log("Linear framebuffer at %08X size %08X, mask = %08x, CRTC58 sel = %02x\n", virge->linear_base, virge->linear_size, virge->vram_mask, svga->crtc[0x58] & 7);
if (virge->linear_base == 0xa0000) { if (virge->linear_base == 0xa0000) {
mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000, 0);
mem_mapping_disable(&virge->linear_mapping); mem_mapping_disable(&virge->linear_mapping);
} else { } else {
if (virge->chip == S3_VIRGEVX || virge->chip == S3_TRIO3D2X) { if (virge->chip == S3_VIRGEVX || virge->chip == S3_TRIO3D2X)
virge->linear_base &= 0xfe000000; virge->linear_base &= 0xfe000000;
} else { else
virge->linear_base &= 0xfc000000; virge->linear_base &= 0xfc000000;
}
mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size);
} }
@@ -4069,16 +4070,16 @@ s3_virge_pci_read(UNUSED(int func), int addr, void *priv)
break; break;
case 0x30: case 0x30:
ret = virge->pci_regs[0x30] & 0x01; ret = virge->has_bios ? (virge->pci_regs[0x30] & 0x01) : 0x00;
break; /*BIOS ROM address*/ break; /*BIOS ROM address*/
case 0x31: case 0x31:
ret = 0x00; ret = 0x00;
break; break;
case 0x32: case 0x32:
ret = virge->pci_regs[0x32]; ret = virge->has_bios ? virge->pci_regs[0x32] : 0x00;
break; break;
case 0x33: case 0x33:
ret = virge->pci_regs[0x33]; ret = virge->has_bios ? virge->pci_regs[0x33] : 0x00;
break; break;
case 0x34: case 0x34:
@@ -4202,6 +4203,8 @@ s3_virge_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
case 0x30: case 0x30:
case 0x32: case 0x32:
case 0x33: case 0x33:
if (!virge->has_bios)
return;
virge->pci_regs[addr] = val; virge->pci_regs[addr] = val;
if (virge->pci_regs[0x30] & 0x01) { if (virge->pci_regs[0x30] & 0x01) {
uint32_t biosaddr = (virge->pci_regs[0x32] << 16) | (virge->pci_regs[0x33] << 24); uint32_t biosaddr = (virge->pci_regs[0x32] << 16) | (virge->pci_regs[0x33] << 24);
@@ -4337,7 +4340,8 @@ s3_virge_reset(void *priv)
virge->svga.crtc[0x37] = 1 | (7 << 5); virge->svga.crtc[0x37] = 1 | (7 << 5);
virge->svga.crtc[0x53] = 8; virge->svga.crtc[0x53] = 8;
mem_mapping_disable(&virge->bios_rom.mapping); if (virge->has_bios)
mem_mapping_disable(&virge->bios_rom.mapping);
s3_virge_updatemapping(virge); s3_virge_updatemapping(virge);
@@ -4360,6 +4364,8 @@ s3_virge_init(const device_t *info)
else else
virge->memory_size = device_get_config_int("memory"); virge->memory_size = device_get_config_int("memory");
virge->has_bios = !!(info->local & 0x100);
switch (info->local) { switch (info->local) {
case S3_VIRGE_325: case S3_VIRGE_325:
bios_fn = ROM_VIRGE_325; bios_fn = ROM_VIRGE_325;
@@ -4374,7 +4380,7 @@ s3_virge_init(const device_t *info)
bios_fn = ROM_STB_VELOCITY_3D; bios_fn = ROM_STB_VELOCITY_3D;
break; break;
case S3_VIRGE_DX: case S3_VIRGE_DX:
bios_fn = ROM_VIRGE_DX; bios_fn = virge->has_bios ? ROM_VIRGE_DX : NULL;
break; break;
case S3_DIAMOND_STEALTH3D_2000PRO: case S3_DIAMOND_STEALTH3D_2000PRO:
bios_fn = ROM_DIAMOND_STEALTH3D_2000PRO; bios_fn = ROM_DIAMOND_STEALTH3D_2000PRO;
@@ -4408,11 +4414,12 @@ s3_virge_init(const device_t *info)
rom_init(&virge->bios_rom, bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); rom_init(&virge->bios_rom, bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL);
else else
rom_init(&virge->bios_rom, bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); rom_init(&virge->bios_rom, bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
mem_mapping_disable(&virge->bios_rom.mapping);
} }
mem_mapping_disable(&virge->bios_rom.mapping); mem_mapping_add(&virge->linear_mapping, 0, 0,
svga_read_linear,
mem_mapping_add(&virge->linear_mapping, 0, 0, svga_read_linear,
svga_readw_linear, svga_readw_linear,
svga_readl_linear, svga_readl_linear,
svga_write_linear, svga_write_linear,
@@ -4421,7 +4428,8 @@ s3_virge_init(const device_t *info)
NULL, NULL,
MEM_MAPPING_EXTERNAL, MEM_MAPPING_EXTERNAL,
&virge->svga); &virge->svga);
mem_mapping_add(&virge->mmio_mapping, 0, 0, s3_virge_mmio_read, mem_mapping_add(&virge->mmio_mapping, 0, 0,
s3_virge_mmio_read,
s3_virge_mmio_read_w, s3_virge_mmio_read_w,
s3_virge_mmio_read_l, s3_virge_mmio_read_l,
s3_virge_mmio_write, s3_virge_mmio_write,
@@ -4430,7 +4438,8 @@ s3_virge_init(const device_t *info)
NULL, NULL,
MEM_MAPPING_EXTERNAL, MEM_MAPPING_EXTERNAL,
virge); virge);
mem_mapping_add(&virge->new_mmio_mapping, 0, 0, s3_virge_mmio_read, mem_mapping_add(&virge->new_mmio_mapping, 0, 0,
s3_virge_mmio_read,
s3_virge_mmio_read_w, s3_virge_mmio_read_w,
s3_virge_mmio_read_l, s3_virge_mmio_read_l,
s3_virge_mmio_write, s3_virge_mmio_write,
@@ -4896,6 +4905,20 @@ const device_t s3_virge_375_pci_device = {
.config = s3_virge_config .config = s3_virge_config
}; };
const device_t s3_virge_375_onboard_pci_device = {
.name = "S3 ViRGE/DX (375) On-Board PCI",
.internal_name = "virge375_onboard_pci",
.flags = DEVICE_PCI,
.local = S3_VIRGE_DX | 0x100,
.init = s3_virge_init,
.close = s3_virge_close,
.reset = s3_virge_reset,
{ .available = NULL },
.speed_changed = s3_virge_speed_changed,
.force_redraw = s3_virge_force_redraw,
.config = s3_virge_config
};
const device_t s3_diamond_stealth_2000pro_pci_device = { const device_t s3_diamond_stealth_2000pro_pci_device = {
.name = "S3 ViRGE/DX (Diamond Stealth 3D 2000 Pro) PCI", .name = "S3 ViRGE/DX (Diamond Stealth 3D 2000 Pro) PCI",
.internal_name = "stealth3d_2000pro_pci", .internal_name = "stealth3d_2000pro_pci",