Added the Lucky Star LS-486E (SiS 496/497 board with AMI WinBIOS).
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of 386DX and 486 machines.
|
* Implementation of 386DX and 486 machines.
|
||||||
*
|
*
|
||||||
* Version: @(#)m_at_386dx_486.c 1.0.1 2020/01/19
|
* Version: @(#)m_at_386dx_486.c 1.0.2 2020/01/20
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "../chipset/chipset.h"
|
#include "../chipset/chipset.h"
|
||||||
#include "../keyboard.h"
|
#include "../keyboard.h"
|
||||||
#include "../mem.h"
|
#include "../mem.h"
|
||||||
|
#include "../nvr.h"
|
||||||
#include "../pci.h"
|
#include "../pci.h"
|
||||||
#include "../floppy/fdd.h"
|
#include "../floppy/fdd.h"
|
||||||
#include "../floppy/fdc.h"
|
#include "../floppy/fdc.h"
|
||||||
@@ -269,8 +270,6 @@ machine_at_win471_init(const machine_t *model)
|
|||||||
static void
|
static void
|
||||||
machine_at_sis_85c496_common_init(const machine_t *model)
|
machine_at_sis_85c496_common_init(const machine_t *model)
|
||||||
{
|
{
|
||||||
machine_at_common_init(model);
|
|
||||||
|
|
||||||
device_add(&ide_pci_device);
|
device_add(&ide_pci_device);
|
||||||
|
|
||||||
pci_init(PCI_CONFIG_TYPE_1);
|
pci_init(PCI_CONFIG_TYPE_1);
|
||||||
@@ -278,8 +277,6 @@ machine_at_sis_85c496_common_init(const machine_t *model)
|
|||||||
pci_register_slot(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
pci_register_slot(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||||
pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||||
pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||||
pci_register_slot(0x07, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
|
||||||
device_add(&keyboard_ps2_pci_device);
|
|
||||||
|
|
||||||
pci_set_irq_routing(PCI_INTA, PCI_IRQ_DISABLED);
|
pci_set_irq_routing(PCI_INTA, PCI_IRQ_DISABLED);
|
||||||
pci_set_irq_routing(PCI_INTB, PCI_IRQ_DISABLED);
|
pci_set_irq_routing(PCI_INTB, PCI_IRQ_DISABLED);
|
||||||
@@ -301,9 +298,37 @@ machine_at_r418_init(const machine_t *model)
|
|||||||
if (bios_only || !ret)
|
if (bios_only || !ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
machine_at_common_init(model);
|
||||||
|
|
||||||
machine_at_sis_85c496_common_init(model);
|
machine_at_sis_85c496_common_init(model);
|
||||||
|
pci_register_slot(0x07, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||||
|
|
||||||
device_add(&fdc37c665_device);
|
device_add(&fdc37c665_device);
|
||||||
|
device_add(&keyboard_ps2_pci_device);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
machine_at_ls486e_init(const machine_t *model)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = bios_load_linear(L"roms/machines/ls486e/LS486E RevC.BIN",
|
||||||
|
0x000e0000, 131072, 0);
|
||||||
|
|
||||||
|
if (bios_only || !ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
machine_at_common_init_ex(model, 2);
|
||||||
|
device_add(&ls486e_nvr_device);
|
||||||
|
|
||||||
|
machine_at_sis_85c496_common_init(model);
|
||||||
|
pci_register_slot(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||||
|
|
||||||
|
device_add(&fdc37c665_device);
|
||||||
|
device_add(&keyboard_ps2_ami_pci_device);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Handling of the emulated machines.
|
* Handling of the emulated machines.
|
||||||
*
|
*
|
||||||
* Version: @(#)machine.h 1.0.35 2020/01/13
|
* Version: @(#)machine.h 1.0.36 2020/01/20
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -225,6 +225,7 @@ extern int machine_at_px471_init(const machine_t *);
|
|||||||
extern int machine_at_win471_init(const machine_t *);
|
extern int machine_at_win471_init(const machine_t *);
|
||||||
|
|
||||||
extern int machine_at_r418_init(const machine_t *);
|
extern int machine_at_r418_init(const machine_t *);
|
||||||
|
extern int machine_at_ls486e_init(const machine_t *);
|
||||||
extern int machine_at_alfredo_init(const machine_t *);
|
extern int machine_at_alfredo_init(const machine_t *);
|
||||||
|
|
||||||
/* m_at_commodore.c */
|
/* m_at_commodore.c */
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
* NOTES: OpenAT wip for 286-class machine with open BIOS.
|
* NOTES: OpenAT wip for 286-class machine with open BIOS.
|
||||||
* PS2_M80-486 wip, pending receipt of TRM's for machine.
|
* PS2_M80-486 wip, pending receipt of TRM's for machine.
|
||||||
*
|
*
|
||||||
* Version: @(#)machine_table.c 1.0.52 2020/01/19
|
* Version: @(#)machine_table.c 1.0.53 2020/01/20
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -170,6 +170,7 @@ const machine_t machines[] = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
{ "[486 PCI] Intel Classic/PCI", "alfredo", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_alfredo_init, NULL },
|
{ "[486 PCI] Intel Classic/PCI", "alfredo", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_alfredo_init, NULL },
|
||||||
|
{ "[486 PCI] Lucky Star LS-486E", "ls486e", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_ls486e_init, NULL },
|
||||||
{ "[486 PCI] Rise Computer R418", "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL },
|
{ "[486 PCI] Rise Computer R418", "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL },
|
||||||
|
|
||||||
{ "[Socket 4 LX] Intel Premiere/PCI", "revenge", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_batman_init, NULL },
|
{ "[Socket 4 LX] Intel Premiere/PCI", "revenge", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_batman_init, NULL },
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
* NOTES: OpenAT wip for 286-class machine with open BIOS.
|
* NOTES: OpenAT wip for 286-class machine with open BIOS.
|
||||||
* PS2_M80-486 wip, pending receipt of TRM's for machine.
|
* PS2_M80-486 wip, pending receipt of TRM's for machine.
|
||||||
*
|
*
|
||||||
* Version: @(#)machine_table.c 1.0.52 2020/01/19
|
* Version: @(#)machine_table.c 1.0.53 2020/01/20
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -155,6 +155,7 @@ const machine_t machines[] = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
{ "[486 PCI] Intel Classic/PCI", "alfredo", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_alfredo_init, NULL },
|
{ "[486 PCI] Intel Classic/PCI", "alfredo", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_alfredo_init, NULL },
|
||||||
|
{ "[486 PCI] Lucky Star LS-486E", "ls486e", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_ls486e_init, NULL },
|
||||||
{ "[486 PCI] Rise Computer R418", "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL },
|
{ "[486 PCI] Rise Computer R418", "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL },
|
||||||
|
|
||||||
{ "[Socket 4 LX] Intel Premiere/PCI", "revenge", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_batman_init, NULL },
|
{ "[Socket 4 LX] Intel Premiere/PCI", "revenge", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_batman_init, NULL },
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the generic NVRAM/CMOS driver.
|
* Definitions for the generic NVRAM/CMOS driver.
|
||||||
*
|
*
|
||||||
* Version: @(#)nvr.h 1.0.12 2020/01/13
|
* Version: @(#)nvr.h 1.0.13 2020/01/20
|
||||||
*
|
*
|
||||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>,
|
* Author: Fred N. van Kempen, <decwiz@yahoo.com>,
|
||||||
* David Hrdlička, <hrdlickadavid@outlook.com>
|
* David Hrdlička, <hrdlickadavid@outlook.com>
|
||||||
@@ -91,6 +91,7 @@ extern const device_t at_nvr_device;
|
|||||||
extern const device_t ps_nvr_device;
|
extern const device_t ps_nvr_device;
|
||||||
extern const device_t amstrad_nvr_device;
|
extern const device_t amstrad_nvr_device;
|
||||||
extern const device_t ibmat_nvr_device;
|
extern const device_t ibmat_nvr_device;
|
||||||
|
extern const device_t ls486e_nvr_device;
|
||||||
extern const device_t via_nvr_device;
|
extern const device_t via_nvr_device;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
62
src/nvr_at.c
62
src/nvr_at.c
@@ -189,7 +189,7 @@
|
|||||||
* including the later update (DS12887A) which implemented a
|
* including the later update (DS12887A) which implemented a
|
||||||
* "century" register to be compatible with Y2K.
|
* "century" register to be compatible with Y2K.
|
||||||
*
|
*
|
||||||
* Version: @(#)nvr_at.c 1.0.17 2020/01/13
|
* Version: @(#)nvr_at.c 1.0.18 2020/01/20
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -291,7 +291,7 @@ typedef struct {
|
|||||||
int8_t stat;
|
int8_t stat;
|
||||||
|
|
||||||
uint8_t cent;
|
uint8_t cent;
|
||||||
uint8_t def;
|
uint8_t def, ls_hack;
|
||||||
|
|
||||||
uint8_t addr[8];
|
uint8_t addr[8];
|
||||||
|
|
||||||
@@ -553,8 +553,9 @@ nvr_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
nvr_t *nvr = (nvr_t *)priv;
|
nvr_t *nvr = (nvr_t *)priv;
|
||||||
local_t *local = (local_t *)nvr->data;
|
local_t *local = (local_t *)nvr->data;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
uint8_t old;
|
uint8_t old, i;
|
||||||
uint8_t addr_id = (addr & 0x0e) >> 1;
|
uint8_t addr_id = (addr & 0x0e) >> 1;
|
||||||
|
uint16_t checksum = 0x0000;
|
||||||
|
|
||||||
sub_cycles(ISA_CYCLES(8));
|
sub_cycles(ISA_CYCLES(8));
|
||||||
|
|
||||||
@@ -579,6 +580,18 @@ nvr_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
case RTC_REGD: /* R/O */
|
case RTC_REGD: /* R/O */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x2e:
|
||||||
|
case 0x2f:
|
||||||
|
if (local->ls_hack) {
|
||||||
|
/* 2E and 2F are a simple sum of the values of 0E to 2D. */
|
||||||
|
for (i = 0x0e; i < 0x2e; i++)
|
||||||
|
checksum += (uint16_t) nvr->regs[i];
|
||||||
|
nvr->regs[0x2e] = checksum >> 8;
|
||||||
|
nvr->regs[0x2f] = checksum & 0xff;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
|
||||||
default: /* non-RTC registers are just NVRAM */
|
default: /* non-RTC registers are just NVRAM */
|
||||||
if (nvr->regs[local->addr[addr_id]] != val) {
|
if (nvr->regs[local->addr[addr_id]] != val) {
|
||||||
nvr->regs[local->addr[addr_id]] = val;
|
nvr->regs[local->addr[addr_id]] = val;
|
||||||
@@ -617,6 +630,7 @@ nvr_read(uint16_t addr, void *priv)
|
|||||||
local_t *local = (local_t *)nvr->data;
|
local_t *local = (local_t *)nvr->data;
|
||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
uint8_t addr_id = (addr & 0x0e) >> 1;
|
uint8_t addr_id = (addr & 0x0e) >> 1;
|
||||||
|
uint16_t checksum;
|
||||||
|
|
||||||
sub_cycles(ISA_CYCLES(8));
|
sub_cycles(ISA_CYCLES(8));
|
||||||
|
|
||||||
@@ -636,6 +650,27 @@ nvr_read(uint16_t addr, void *priv)
|
|||||||
ret = nvr->regs[RTC_REGD];
|
ret = nvr->regs[RTC_REGD];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x2c:
|
||||||
|
if (local->ls_hack)
|
||||||
|
ret = nvr->regs[local->addr[addr_id]] & 0x7f;
|
||||||
|
else
|
||||||
|
ret = nvr->regs[local->addr[addr_id]];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x2e:
|
||||||
|
case 0x2f:
|
||||||
|
if (local->ls_hack) {
|
||||||
|
checksum = (nvr->regs[0x2e] << 8) | nvr->regs[0x2f];
|
||||||
|
if (nvr->regs[0x2c] & 0x80)
|
||||||
|
checksum -= 0x80;
|
||||||
|
if (local->addr[addr_id] == 0x2e)
|
||||||
|
ret = checksum >> 8;
|
||||||
|
else
|
||||||
|
ret = checksum & 0xff;
|
||||||
|
} else
|
||||||
|
ret = nvr->regs[local->addr[addr_id]];
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ret = nvr->regs[local->addr[addr_id]];
|
ret = nvr->regs[local->addr[addr_id]];
|
||||||
break;
|
break;
|
||||||
@@ -742,12 +777,17 @@ nvr_at_init(const device_t *info)
|
|||||||
/* This is machine specific. */
|
/* This is machine specific. */
|
||||||
nvr->size = machines[machine].nvrmask + 1;
|
nvr->size = machines[machine].nvrmask + 1;
|
||||||
local->def = 0x00;
|
local->def = 0x00;
|
||||||
|
local->ls_hack = 0;
|
||||||
switch(info->local & 7) {
|
switch(info->local & 7) {
|
||||||
case 0: /* standard AT, no century register */
|
case 0: /* standard AT, no century register */
|
||||||
nvr->irq = 8;
|
nvr->irq = 8;
|
||||||
local->cent = 0xff;
|
local->cent = 0xff;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5: /* Lucky Star LS-486E */
|
||||||
|
local->ls_hack = 1;
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
|
||||||
case 1: /* standard AT */
|
case 1: /* standard AT */
|
||||||
nvr->irq = 8;
|
nvr->irq = 8;
|
||||||
local->cent = RTC_CENTURY_AT;
|
local->cent = RTC_CENTURY_AT;
|
||||||
@@ -770,7 +810,7 @@ nvr_at_init(const device_t *info)
|
|||||||
local->def = 0xff;
|
local->def = 0xff;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: /* VIA VT82C586B */
|
case 6: /* VIA VT82C586B */
|
||||||
nvr->irq = 8;
|
nvr->irq = 8;
|
||||||
local->cent = RTC_CENTURY_VIA;
|
local->cent = RTC_CENTURY_VIA;
|
||||||
break;
|
break;
|
||||||
@@ -870,12 +910,20 @@ const device_t ibmat_nvr_device = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const device_t via_nvr_device = {
|
const device_t ls486e_nvr_device = {
|
||||||
"VIA PC/AT NVRAM",
|
"Lucky Star LS-486E PC/AT NVRAM",
|
||||||
DEVICE_ISA | DEVICE_AT,
|
DEVICE_ISA | DEVICE_AT,
|
||||||
9,
|
13,
|
||||||
nvr_at_init, nvr_at_close, NULL,
|
nvr_at_init, nvr_at_close, NULL,
|
||||||
NULL, nvr_at_speed_changed,
|
NULL, nvr_at_speed_changed,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const device_t via_nvr_device = {
|
||||||
|
"VIA PC/AT NVRAM",
|
||||||
|
DEVICE_ISA | DEVICE_AT,
|
||||||
|
14,
|
||||||
|
nvr_at_init, nvr_at_close, NULL,
|
||||||
|
NULL, nvr_at_speed_changed,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
Reference in New Issue
Block a user