Added the ICS SB486PV.
This commit is contained in:
@@ -1656,7 +1656,12 @@ i4x0_init(const device_t *info)
|
||||
regs[0x57] = 0x31;
|
||||
regs[0x59] = 0x0f;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = 0x02;
|
||||
dev->max_drb = 3;
|
||||
/* At the very least the 420ZX seems to read to 0x64, per the SB486PV. */
|
||||
if (dev->type == INTEL_420ZX) {
|
||||
regs[0x64] = 0x02;
|
||||
dev->max_drb = 4;
|
||||
} else
|
||||
dev->max_drb = 3;
|
||||
dev->drb_unit = 1;
|
||||
dev->drb_default = 0x02;
|
||||
break;
|
||||
|
||||
10
src/device.c
10
src/device.c
@@ -897,8 +897,14 @@ device_is_valid(const device_t *device, int mch)
|
||||
{
|
||||
int ret = 1;
|
||||
|
||||
if ((device != NULL) && ((device->flags & DEVICE_BUS) != 0))
|
||||
ret = machine_has_bus(mch, device->flags & DEVICE_BUS);
|
||||
if ((device != NULL) && ((device->flags & DEVICE_BUS) != 0)) {
|
||||
/* Hide PCI devices on machines with only an internal PCI bus. */
|
||||
if ((device->flags & DEVICE_PCI) &&
|
||||
machine_has_flags(mch, MACHINE_PCI_INTERNAL))
|
||||
ret = 0;
|
||||
else
|
||||
ret = machine_has_bus(mch, device->flags & DEVICE_BUS);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1336,7 +1336,10 @@ write64_ami(void *priv, uint8_t val)
|
||||
kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) low\n");
|
||||
if (!(dev->flags & DEVICE_PCI))
|
||||
write_p2(dev, dev->p2 & ~(4 << (val & 0x01)));
|
||||
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
|
||||
if (strstr(machine_get_internal_name(), "sb486pv") != NULL)
|
||||
kbc_delay_to_ob(dev, 0x03, 0, 0x00);
|
||||
else
|
||||
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
|
||||
dev->pending++;
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
/* Feature flags for advanced devices. */
|
||||
#define MACHINE_APM 0x00080000 /* sys has APM */
|
||||
#define MACHINE_ACPI 0x00100000 /* sys has ACPI */
|
||||
#define MACHINE_HWM 0x00200000 /* sys has hw monitor */
|
||||
#define MACHINE_PCI_INTERNAL 0x00200000 /* sys has only internal PCI */
|
||||
#define MACHINE_CARTRIDGE 0x00400000 /* sys has cartridge bays */
|
||||
/* Feature flags for internal storage controllers. */
|
||||
#define MACHINE_MFM 0x00800000 /* sys has int MFM/RLL */
|
||||
@@ -588,6 +588,7 @@ extern int machine_at_sb486p_init(const machine_t *);
|
||||
extern int machine_at_486sp3_init(const machine_t *);
|
||||
extern int machine_at_486sp3c_init(const machine_t *);
|
||||
extern int machine_at_486sp3g_init(const machine_t *);
|
||||
extern int machine_at_sb486pv_init(const machine_t *);
|
||||
extern int machine_at_486ap4_init(const machine_t *);
|
||||
extern int machine_at_g486vpa_init(const machine_t *);
|
||||
extern int machine_at_486vipio2_init(const machine_t *);
|
||||
|
||||
@@ -71,7 +71,10 @@ extern const device_t fdc37m60x_370_device;
|
||||
/* ITE */
|
||||
extern const device_t it8661f_device;
|
||||
extern const device_t it8671f_device;
|
||||
|
||||
/* Intel */
|
||||
extern const device_t i82091aa_device;
|
||||
extern const device_t i82091aa_26e_device;
|
||||
extern const device_t i82091aa_398_device;
|
||||
extern const device_t i82091aa_ide_pri_device;
|
||||
extern const device_t i82091aa_ide_device;
|
||||
|
||||
@@ -756,7 +756,6 @@ machine_at_403tg_d_mr_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const device_config_t pb450_config[] = {
|
||||
// clang-format off
|
||||
{
|
||||
@@ -1640,6 +1639,91 @@ machine_at_486sp3g_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const device_config_t sb486pv_config[] = {
|
||||
// clang-format off
|
||||
{
|
||||
.name = "bios",
|
||||
.description = "BIOS Version",
|
||||
.type = CONFIG_BIOS,
|
||||
.default_string = "sb486pv",
|
||||
.default_int = 0,
|
||||
.file_filter = "",
|
||||
.spinner = { 0 },
|
||||
.bios = {
|
||||
{ .name = "AMI 062594 (0108)", .internal_name = "sb486pv", .bios_type = BIOS_NORMAL,
|
||||
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/sb486pv/41-0108-062594-SATURN2.rom", "" } },
|
||||
{ .name = "AMI 062594 (0301)", .internal_name = "sb486pv_94", .bios_type = BIOS_NORMAL,
|
||||
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/sb486pv/0301-062594-SATURN2.rom", "" } },
|
||||
{ .name = "AMI 071595 (1301)", .internal_name = "sb486pv_95", .bios_type = BIOS_NORMAL,
|
||||
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/sb486pv/amiboot.rom", "" } },
|
||||
{ .files_no = 0 }
|
||||
},
|
||||
},
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
const device_t sb486pv_device = {
|
||||
.name = "ICS SB486PV",
|
||||
.internal_name = "sb486pv_device",
|
||||
.flags = 0,
|
||||
.local = 0,
|
||||
.init = NULL,
|
||||
.close = NULL,
|
||||
.reset = NULL,
|
||||
.available = NULL,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = sb486pv_config
|
||||
};
|
||||
|
||||
int
|
||||
machine_at_sb486pv_init(const machine_t *model)
|
||||
{
|
||||
int ret = 0;
|
||||
const char* fn;
|
||||
|
||||
/* No ROMs available */
|
||||
if (!device_available(model->device))
|
||||
return ret;
|
||||
|
||||
device_context(model->device);
|
||||
fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0);
|
||||
if (!strcmp(fn, "roms/machines/sb486pv/amiboot.rom"))
|
||||
ret = bios_load_linear(fn, 0x000e0000, 131072, 0);
|
||||
else
|
||||
ret = bios_load_linear_inverted(fn, 0x000e0000, 131072, 0);
|
||||
device_context_restore();
|
||||
|
||||
machine_at_common_init(model);
|
||||
// machine_at_common_init_ex(model, 2);
|
||||
|
||||
// device_add(&amstrad_megapc_nvr_device);
|
||||
device_add(&ide_pci_device);
|
||||
|
||||
pci_init(PCI_CONFIG_TYPE_2);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x0e, PCI_CARD_IDE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x0f, PCI_CARD_VIDEO, 1, 2, 3, 4);
|
||||
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
device_add(machine_get_vid_device(machine));
|
||||
|
||||
device_add(&keyboard_ps2_ami_pci_device);
|
||||
device_add(&sio_zb_device);
|
||||
device_add(&ide_rz1000_pci_single_channel_device);
|
||||
device_add(&i82091aa_26e_device);
|
||||
if (!strcmp(fn, "roms/machines/sb486pv/amiboot.rom"))
|
||||
device_add(&intel_flash_bxt_device);
|
||||
else
|
||||
device_add(&intel_flash_bxt_ami_device);
|
||||
|
||||
device_add(&i420zx_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_486ap4_init(const machine_t *model)
|
||||
{
|
||||
@@ -1833,12 +1917,11 @@ machine_at_sbc490_init(const machine_t *model)
|
||||
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||
pci_register_slot(0x01, PCI_CARD_VIDEO, 4, 1, 2, 3);
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
device_add(machine_get_vid_device(machine));
|
||||
|
||||
device_add(&ali1489_device);
|
||||
device_add(&fdc37c665_device);
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
device_add(&tgui9440_onboard_pci_device);
|
||||
|
||||
device_add(&keyboard_ps2_ami_device);
|
||||
device_add(&sst_flash_29ee010_device);
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ extern const device_t pb450_device;
|
||||
extern const device_t jukopc_device;
|
||||
extern const device_t vendex_device;
|
||||
extern const device_t c5sbm2_device;
|
||||
extern const device_t sb486pv_device;
|
||||
|
||||
const machine_filter_t machine_types[] = {
|
||||
{ "None", MACHINE_TYPE_NONE },
|
||||
@@ -8515,6 +8516,47 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* This has an AMI MEGAKey 'P' or 'R' keyboard controller. */
|
||||
{
|
||||
.name = "[i420ZX] ICS SB486PV",
|
||||
.internal_name = "sb486pv",
|
||||
.type = MACHINE_TYPE_486_S3_PCI,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_420ZX,
|
||||
.init = machine_at_sb486pv_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
/* Has PCI but no user-facing slots. */
|
||||
.bus_flags = MACHINE_PCI,
|
||||
.flags = MACHINE_PS2_KBC | MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM | MACHINE_PCI_INTERNAL,
|
||||
.ram = {
|
||||
.min = 2048,
|
||||
.max = 65536,
|
||||
.step = 2048
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = &sb486pv_device,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = &gd5436_onboard_pci_device,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* This most likely has a standalone AMI Megakey 1993, which is type 'P', like the below Tekram board. */
|
||||
{
|
||||
.name = "[IMS 8848] J-Bond PCI400C-B",
|
||||
|
||||
@@ -295,6 +295,20 @@ const device_t i82091aa_device = {
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const device_t i82091aa_26e_device = {
|
||||
.name = "Intel 82091AA Super I/O (Port 26Eh)",
|
||||
.internal_name = "i82091aa_26e",
|
||||
.flags = 0,
|
||||
.local = 0x140,
|
||||
.init = i82091aa_init,
|
||||
.close = i82091aa_close,
|
||||
.reset = NULL,
|
||||
.available = NULL,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const device_t i82091aa_398_device = {
|
||||
.name = "Intel 82091AA Super I/O (Port 398h)",
|
||||
.internal_name = "i82091aa_398",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <86box/pci.h>
|
||||
#include <86box/rom.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/video.h>
|
||||
#include <86box/i2c.h>
|
||||
@@ -4316,7 +4317,8 @@ gd54xx_init(const device_t *info)
|
||||
break;
|
||||
|
||||
case CIRRUS_ID_CLGD5436:
|
||||
if (info->local & 0x200) {
|
||||
if ((info->local & 0x200) &&
|
||||
!strstr(machine_get_internal_name(), "sb486pv")) {
|
||||
romfn = NULL;
|
||||
gd54xx->has_bios = 0;
|
||||
} else
|
||||
@@ -4461,8 +4463,8 @@ gd54xx_init(const device_t *info)
|
||||
}
|
||||
io_sethandler(0x03c0, 0x0020, gd54xx_in, NULL, NULL, gd54xx_out, NULL, NULL, gd54xx);
|
||||
|
||||
if (gd54xx->pci && id >= CIRRUS_ID_CLGD5430) {
|
||||
if (romfn == NULL)
|
||||
if (gd54xx->pci && (id >= CIRRUS_ID_CLGD5430)) {
|
||||
if (info->local & 0x200)
|
||||
pci_add_card(PCI_ADD_VIDEO, cl_pci_read, cl_pci_write, gd54xx, &gd54xx->pci_slot);
|
||||
else
|
||||
pci_add_card(PCI_ADD_NORMAL, cl_pci_read, cl_pci_write, gd54xx, &gd54xx->pci_slot);
|
||||
|
||||
Reference in New Issue
Block a user