Added the Gateway Tomahawk (430TX machine).

This commit is contained in:
OBattler
2024-01-21 01:55:05 +01:00
parent f59bb33733
commit 485e73d4da
9 changed files with 179 additions and 12 deletions

View File

@@ -1669,6 +1669,10 @@ acpi_reset(void *priv)
acpi_power_on = 0;
}
/* The Gateway Tomahawk requires the LID polarity bit to be set. */
if (!strcmp(machine_get_internal_name(), "tomahawk"))
dev->regs.glbctl |= 0x02000000;
acpi_rtc_status = 0;
acpi_update_irq(dev);

View File

@@ -1522,6 +1522,8 @@ i4x0_read(int func, int addr, void *priv)
with the addition of bits 3 and 0. */
if ((func == 0) && (addr == 0x93) && ((dev->type == INTEL_440FX) || (dev->type == INTEL_440LX) || (dev->type == INTEL_440EX)))
ret = (ret & 0xf9) | (pci_read(0x0cf9, NULL) & 0x06);
else if ((func == 0) && (addr == 0x52) && (dev->type == INTEL_430TX) && !strcmp(machine_get_internal_name(), "tomahawk"))
ret = 0xb2;
}
return ret;

View File

@@ -60,4 +60,6 @@ extern const device_t sst_flash_49lf080_device;
extern const device_t sst_flash_49lf016_device;
extern const device_t sst_flash_49lf160_device;
extern const device_t amd_flash_29f020a_device;
#endif /*EMU_FLASH_H*/

View File

@@ -680,6 +680,7 @@ extern int machine_at_mb540n_init(const machine_t *);
extern int machine_at_56a5_init(const machine_t *);
extern int machine_at_p5mms98_init(const machine_t *);
extern int machine_at_richmond_init(const machine_t *);
extern int machine_at_tomahawk_init(const machine_t *);
extern int machine_at_ficva502_init(const machine_t *);

View File

@@ -36,5 +36,6 @@ extern const device_t pcnet_am79c960_vlb_device;
extern const device_t pcnet_am79c961_device;
extern const device_t pcnet_am79c970a_device;
extern const device_t pcnet_am79c973_device;
extern const device_t pcnet_am79c973_onboard_device;
#endif /*NET_PCNET_H*/

View File

@@ -43,6 +43,8 @@
#include <86box/fdc.h>
#include <86box/nvr.h>
#include <86box/scsi_ncr53c8xx.h>
#include <86box/thread.h>
#include <86box/network.h>
int
machine_at_acerv35n_init(const machine_t *model)
@@ -1046,6 +1048,48 @@ machine_at_richmond_init(const machine_t *model)
return ret;
}
int
machine_at_tomahawk_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/tomahawk/0AAGT046.ROM",
0x000c0000, 262144, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */
pci_register_slot(0x0D, PCI_CARD_VIDEO, 3, 0, 0, 0);
pci_register_slot(0x0E, PCI_CARD_NETWORK, 4, 0, 0, 0);
pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4);
pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2);
device_add(&i430tx_device);
device_add(&piix4_device);
device_add(&keyboard_ps2_intel_ami_pci_device);
device_add(&fdc37c67x_device);
device_add(&amd_flash_29f020a_device);
spd_register(SPD_TYPE_SDRAM, 0x3, 128);
device_add(&lm78_device); /* fans: Thermal, CPU, Chassis; temperature: unused */
device_add(&lm75_1_4a_device); /* temperature: CPU */
if ((gfxcard[0] == VID_INTERNAL) && machine_get_vid_device(machine))
device_add(machine_get_vid_device(machine));
if ((sound_card_current[0] == SOUND_INTERNAL) && machine_get_snd_device(machine))
device_add(machine_get_snd_device(machine));
if ((net_cards_conf[0].device_num == NET_INTERNAL) && machine_get_net_device(machine))
device_add(machine_get_net_device(machine));
return ret;
}
int
machine_at_ficva502_init(const machine_t *model)
{

View File

@@ -33,6 +33,7 @@
#include <86box/sound.h>
#include <86box/video.h>
#include <86box/plat_unused.h>
#include <86box/net_pcnet.h>
// Temporarily here till we move everything out into the right files
extern const device_t pcjr_device;
@@ -10708,6 +10709,46 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
/* [TEST] Has AMI Megakey '5' KBC firmware on the SM(S)C FDC37C67x Super I/O chip. */
{
.name = "[i430TX] Gateway Tomahawk",
.internal_name = "tomahawk",
.type = MACHINE_TYPE_SOCKET7,
.chipset = MACHINE_CHIPSET_INTEL_430TX,
.init = machine_at_tomahawk_init,
.p1_handler = NULL,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_SOCKET5_7,
.block = CPU_BLOCK_NONE,
.min_bus = 50000000,
.max_bus = 66666667,
.min_voltage = 2100,
.max_voltage = 3520,
.min_multi = 1.5,
.max_multi = 3.0
},
.bus_flags = MACHINE_PS2_PCI,
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_VIDEO | MACHINE_SOUND | MACHINE_NIC,
.ram = {
.min = 8192,
.max = 262144,
.step = 8192
},
.nvrmask = 255,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = &s3_trio64v2_dx_onboard_pci_device,
.snd_device = &cs4236b_device,
.net_device = &pcnet_am79c973_onboard_device
},
#if defined(DEV_BRANCH) && defined(USE_AN430TX)
/* This has the Phoenix MultiKey KBC firmware. */
{

View File

@@ -131,6 +131,9 @@ static char flash_path[1024];
#define W29C020 0x4500
#define W29C040 0x4600
#define AMD 0x01 /* AMD Manufacturer's ID */
#define AMD29F020A 0xb000
#define SIZE_512K 0x010000
#define SIZE_1M 0x020000
#define SIZE_2M 0x040000
@@ -144,12 +147,32 @@ sst_sector_erase(sst_t *dev, uint32_t addr)
{
uint32_t base = addr & (dev->mask & ~0xfff);
if (dev->manufacturer == AMD) {
base = addr & biosmask;
if ((base >= 0x00000) && (base <= 0x0ffff))
memset(&dev->array[0x00000], 0xff, 65536);
else if ((base >= 0x10000) && (base <= 0x1ffff))
memset(&dev->array[0x10000], 0xff, 65536);
else if ((base >= 0x20000) && (base <= 0x2ffff))
memset(&dev->array[0x20000], 0xff, 65536);
else if ((base >= 0x30000) && (base <= 0x37fff))
memset(&dev->array[0x30000], 0xff, 32768);
else if ((base >= 0x38000) && (base <= 0x39fff))
memset(&dev->array[0x38000], 0xff, 8192);
else if ((base >= 0x3a000) && (base <= 0x3bfff))
memset(&dev->array[0x3a000], 0xff, 8192);
else if ((base >= 0x3c000) && (base <= 0x3ffff))
memset(&dev->array[0x3c000], 0xff, 16384);
} else {
if ((base < 0x2000) && (dev->bbp_first_8k & 0x01))
return;
else if ((base >= (dev->size - 0x2000)) && (dev->bbp_last_8k & 0x01))
return;
memset(&dev->array[base], 0xff, 4096);
}
dev->dirty = 1;
}
@@ -262,10 +285,14 @@ sst_read_id(uint32_t addr, void *priv)
{
const sst_t *dev = (sst_t *) priv;
uint8_t ret = 0x00;
uint32_t mask = 0xffff;
if ((addr & 0xffff) == 0)
if (dev->manufacturer == AMD)
mask >>= 8;
if ((addr & mask) == 0)
ret = dev->manufacturer;
else if ((addr & 0xffff) == 1)
else if ((addr & mask) == 1)
ret = dev->id;
#ifdef UNKNOWN_FLASH
else if ((addr & 0xffff) == 0x100)
@@ -278,6 +305,9 @@ sst_read_id(uint32_t addr, void *priv)
ret = dev->bbp_first_8k;
else if (addr == 0x3fff2)
ret = dev->bbp_last_8k;
} else if (dev->manufacturer == AMD) {
if ((addr & mask) == 2)
ret = 0x00;
}
return ret;
@@ -300,6 +330,15 @@ static void
sst_write(uint32_t addr, uint8_t val, void *priv)
{
sst_t *dev = (sst_t *) priv;
uint32_t mask = 0x7fff;
uint32_t addr0 = 0x5555;
uint32_t addr1 = 0x2aaa;
if (dev->manufacturer == AMD) {
mask >>= 4;
addr0 >>= 4;
addr1 >>= 4;
}
switch (dev->command_state) {
case 0:
@@ -309,7 +348,7 @@ sst_write(uint32_t addr, uint8_t val, void *priv)
if (dev->id_mode)
dev->id_mode = 0;
dev->command_state = 0;
} else if (((addr & 0x7fff) == 0x5555) && (val == 0xaa))
} else if (((addr & mask) == addr0) && (val == 0xaa))
dev->command_state++;
else {
if (!dev->is_39 && !dev->sdp && (dev->command_state == 0)) {
@@ -326,7 +365,7 @@ sst_write(uint32_t addr, uint8_t val, void *priv)
case 1:
case 4:
/* 2nd and 5th Bus Write Cycle */
if (((addr & 0x7fff) == 0x2aaa) && (val == 0x55))
if (((addr & mask) == addr1) && (val == 0x55))
dev->command_state++;
else
dev->command_state = 0;
@@ -337,7 +376,7 @@ sst_write(uint32_t addr, uint8_t val, void *priv)
if ((dev->command_state == 5) && (val == SST_SECTOR_ERASE)) {
/* Sector erase - can be on any address. */
sst_new_command(dev, addr, val);
} else if ((addr & 0x7fff) == 0x5555)
} else if ((addr & mask) == addr0)
sst_new_command(dev, addr, val);
else
dev->command_state = 0;
@@ -481,6 +520,8 @@ sst_init(const device_t *info)
dev->id = (info->local >> 8) & 0xff;
dev->has_bbp = (dev->manufacturer == WINBOND) && ((info->local & 0xff00) >= W29C020);
dev->is_39 = (dev->manufacturer == SST) && ((info->local & 0xff00) >= SST39SF512);
if (dev->manufacturer == AMD)
dev->is_39 = 1;
dev->size = info->local & 0xffff0000;
if ((dev->size == 0x20000) && (strstr(machine_get_internal_name_ex(machine), "xi8088")) && !xi8088_bios_128kb())
@@ -941,3 +982,17 @@ const device_t sst_flash_49lf160_device = {
.force_redraw = NULL,
.config = NULL
};
const device_t amd_flash_29f020a_device = {
.name = "AMD 29F020a Flash BIOS",
.internal_name = "amd_flash_29f020a",
.flags = 0,
.local = AMD | AMD29F020A | SIZE_2M,
.init = sst_init,
.close = sst_close,
.reset = NULL,
{ .available = NULL },
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};

View File

@@ -2896,7 +2896,7 @@ pcnet_init(const device_t *info)
dev = malloc(sizeof(nic_t));
memset(dev, 0x00, sizeof(nic_t));
dev->name = info->name;
dev->board = info->local;
dev->board = info->local & 0xff;
dev->is_pci = !!(info->flags & DEVICE_PCI);
dev->is_vlb = !!(info->flags & DEVICE_VLB);
@@ -2997,6 +2997,9 @@ pcnet_init(const device_t *info)
pcnet_pci_regs[0x04] = 3;
/* Add device to the PCI bus, keep its slot number. */
if (info->local & 0x0100)
pci_add_card(PCI_ADD_NETWORK, pcnet_pci_read, pcnet_pci_write, dev, &dev->pci_slot);
else
pci_add_card(PCI_ADD_NORMAL, pcnet_pci_read, pcnet_pci_write, dev, &dev->pci_slot);
} else if (dev->board == DEV_AM79C961) {
dev->dma_channel = -1;
@@ -3269,3 +3272,17 @@ const device_t pcnet_am79c973_device = {
.force_redraw = NULL,
.config = pcnet_pci_config
};
const device_t pcnet_am79c973_onboard_device = {
.name = "AMD PCnet-FAST III",
.internal_name = "pcnetfast_onboard",
.flags = DEVICE_PCI,
.local = DEV_AM79C973 | 0x0100,
.init = pcnet_init,
.close = pcnet_close,
.reset = NULL,
{ .available = NULL },
.speed_changed = NULL,
.force_redraw = NULL,
.config = pcnet_pci_config
};