diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 1b0de661b..1090f22a1 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -283,7 +283,7 @@ reset_common(int hard) cr0 = 1 << 30; else cr0 = 0; - if (is386 && !is486 && (fpu_type == FPU_387)) + if (is386 && !is486 && ((fpu_type == FPU_387) || (fpu_type == FPU_NONE))) cr0 |= 0x10; cpu_cache_int_enabled = 0; cpu_update_waitstates(); diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index 10d1fa471..31bfc09d6 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -135,6 +135,7 @@ extern const device_t opti481_device; extern const device_t opti493_device; extern const device_t opti495slc_device; extern const device_t opti495sx_device; +extern const device_t opti496_device; extern const device_t opti498_device; extern const device_t opti499_device; extern const device_t opti601_device; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 0afa881e2..06fdd00b8 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -263,6 +263,7 @@ enum { MACHINE_CHIPSET_OPTI_493, MACHINE_CHIPSET_OPTI_495SLC, MACHINE_CHIPSET_OPTI_495SX, + MACHINE_CHIPSET_OPTI_496, MACHINE_CHIPSET_OPTI_498, MACHINE_CHIPSET_OPTI_499, MACHINE_CHIPSET_OPTI_895_802G, @@ -566,6 +567,9 @@ extern int machine_at_neat_init(const machine_t *); /* NEATsx */ extern int machine_at_if386sx_init(const machine_t *); +/* OPTi 283 */ +extern int machine_at_svc386sxp1_init(const machine_t *); + /* OPTi 291 */ extern int machine_at_awardsx_init(const machine_t *); @@ -648,6 +652,9 @@ extern int machine_at_cs4031_init(const machine_t *); /* OPTi 381 */ extern int machine_at_ga486l_init(const machine_t *); +/* OPTi 493 */ +extern int machine_at_svc486wb_init(const machine_t *); + /* OPTi 498 */ extern int machine_at_mvi486_init(const machine_t *); diff --git a/src/machine/m_at_386sx.c b/src/machine/m_at_386sx.c index d52cd6611..82ae3b79d 100644 --- a/src/machine/m_at_386sx.c +++ b/src/machine/m_at_386sx.c @@ -447,6 +447,29 @@ machine_at_if386sx_init(const machine_t *model) return ret; } +/* OPTi 283 */ +int +machine_at_svc386sxp1_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/svc386sxp1/svc-386sx-am27c512dip28-6468c04f09d89320349795.bin", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&opti283_device); + device_add(&kbc_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + /* OPTi 291 */ int machine_at_awardsx_init(const machine_t *model) diff --git a/src/machine/m_at_socket1.c b/src/machine/m_at_socket1.c index c854792ad..960bbce07 100644 --- a/src/machine/m_at_socket1.c +++ b/src/machine/m_at_socket1.c @@ -92,6 +92,28 @@ machine_at_ga486l_init(const machine_t *model) return ret; } +/* OPTi 493 */ +int +machine_at_svc486wb_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/svc486wb/svc486wb-AM27C512DIP28.BIN", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&opti493_device); + + device_add(&kbc_at_ami_device); + device_add(&ide_isa_device); + + return ret; +} + /* OPTi 498 */ int machine_at_mvi486_init(const machine_t *model) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 4930910d5..39bced303 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -121,6 +121,7 @@ const machine_filter_t machine_chipsets[] = { { "OPTi 493", MACHINE_CHIPSET_OPTI_493 }, { "OPTi 495SLC", MACHINE_CHIPSET_OPTI_495SLC }, { "OPTi 495SX", MACHINE_CHIPSET_OPTI_495SX }, + { "OPTi 496", MACHINE_CHIPSET_OPTI_496 }, { "OPTi 498", MACHINE_CHIPSET_OPTI_498 }, { "OPTi 499", MACHINE_CHIPSET_OPTI_499 }, { "OPTi 895/802G", MACHINE_CHIPSET_OPTI_895_802G }, @@ -5312,6 +5313,49 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has AMI KBC firmware of uknown revision, maybe '8'. */ + { + .name = "[OPTi 283] Silicon Valley SVC386SX/P1", + .internal_name = "svc386sxp1", + .type = MACHINE_TYPE_386SX, + .chipset = MACHINE_CHIPSET_OPTI_283, + .init = machine_at_svc386sxp1_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_386SX, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_APM, + .ram = { + .min = 1024, + .max = 16384, + .step = 1024 + }, + .nvrmask = 127, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Has IBM AT KBC firmware. */ { .name = "[OPTi 291] DTK PPM-3333P", @@ -6923,6 +6967,49 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Uses the AMIKey 'F' keyboard controller firmware. */ + { + .name = "[OPTi 493] Silicon Valley Computer 486WB", + .internal_name = "svc486wb", + .type = MACHINE_TYPE_486, + .chipset = MACHINE_CHIPSET_OPTI_493, + .init = machine_at_svc486wb_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET1, + .block = CPU_BLOCK_NONE, + .min_bus = 20000000, + .max_bus = 33333333, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 2.0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_IDE | MACHINE_APM, + .ram = { + .min = 1024, + .max = 32768, + .step = 1024 + }, + .nvrmask = 127, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Uses some variant of Phoenix MultiKey/42 as the Intel 8242 chip has a Phoenix copyright. */ {