Introduced the NVR hacks to the remaining boards with cache errors.

This commit is contained in:
OBattler
2021-11-30 00:25:03 +01:00
parent f7177cc27a
commit c0a66022d4
7 changed files with 71 additions and 46 deletions

View File

@@ -608,7 +608,7 @@ static void
ide_sec_disable();
if (info->local)
dev->nvr = device_add(&ls486e_nvr_device);
dev->nvr = device_add(&ami_1994_nvr_device);
else
dev->nvr = device_add(&at_nvr_device);

View File

@@ -1155,12 +1155,12 @@ load_storage_controllers(void)
if (strlen(p) > 511)
fatal("load_storage_controllers(): strlen(p) > 511\n");
else
strncpy(cassette_fname, p, MIN(511, strlen(p) + 1));
strncpy(cassette_fname, p, MIN(512, strlen(p) + 1));
p = config_get_string(cat, "cassette_mode", "");
if (strlen(p) > 511)
fatal("load_storage_controllers(): strlen(p) > 511\n");
else
strncpy(cassette_mode, p, MIN(511, strlen(p) + 1));
strncpy(cassette_mode, p, MIN(512, strlen(p) + 1));
cassette_pos = config_get_int(cat, "cassette_position", 0);
cassette_srate = config_get_int(cat, "cassette_srate", 44100);
cassette_append = !!config_get_int(cat, "cassette_append", 0);

View File

@@ -92,8 +92,9 @@ extern const device_t ps_nvr_device;
extern const device_t amstrad_nvr_device;
extern const device_t ibmat_nvr_device;
extern const device_t piix4_nvr_device;
extern const device_t ls486e_nvr_device;
extern const device_t ami_apollo_nvr_device;
extern const device_t ami_1992_nvr_device;
extern const device_t ami_1994_nvr_device;
extern const device_t ami_1995_nvr_device;
extern const device_t via_nvr_device;
extern const device_t p6rp4_nvr_device;
#endif

View File

@@ -609,7 +609,7 @@ machine_at_403tg_common_init(const machine_t *model, int nvr_hack)
{
if (nvr_hack) {
machine_at_common_init_ex(model, 2);
device_add(&ls486e_nvr_device);
device_add(&ami_1994_nvr_device);
} else
machine_at_common_init(model);
@@ -1158,7 +1158,8 @@ machine_at_pci400cb_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
device_add(&ami_1994_nvr_device);
device_add(&ide_isa_device);
pci_init(PCI_CONFIG_TYPE_1);
@@ -1190,7 +1191,8 @@ machine_at_g486ip_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
device_add(&ami_1992_nvr_device);
device_add(&ide_isa_device);
pci_init(PCI_CONFIG_TYPE_1);

View File

@@ -433,7 +433,8 @@ machine_at_excaliburpci2_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
device_add(&ami_1994_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);

View File

@@ -145,7 +145,7 @@ machine_at_apollo_init(const machine_t *model)
return ret;
machine_at_common_init_ex(model, 2);
device_add(&ami_apollo_nvr_device);
device_add(&ami_1995_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -293,7 +293,8 @@ machine_at_hawk_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
device_add(&ami_1994_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);

View File

@@ -290,10 +290,11 @@
#define RTC_REGS 14 /* number of registers */
#define FLAG_LS_HACK 0x01
#define FLAG_APOLLO_HACK 0x02
#define FLAG_P6RP4_HACK 0x04
#define FLAG_PIIX4 0x08
#define FLAG_AMI_1992_HACK 0x01
#define FLAG_AMI_1994_HACK 0x02
#define FLAG_AMI_1995_HACK 0x04
#define FLAG_P6RP4_HACK 0x08
#define FLAG_PIIX4 0x10
typedef struct {
@@ -563,9 +564,11 @@ timer_tick(nvr_t *nvr)
static void
nvr_reg_common_write(uint16_t reg, uint8_t val, nvr_t *nvr, local_t *local)
{
if ((reg == 0x2c) && (local->flags & FLAG_LS_HACK))
if ((reg == 0x2c) && (local->flags & FLAG_AMI_1994_HACK))
nvr->new = 0;
if ((reg == 0x52) && (local->flags & FLAG_APOLLO_HACK))
if ((reg == 0x2d) && (local->flags & FLAG_AMI_1992_HACK))
nvr->new = 0;
if ((reg == 0x52) && (local->flags & FLAG_AMI_1995_HACK))
nvr->new = 0;
if ((reg >= 0x38) && (reg <= 0x3f) && local->wp[0])
return;
@@ -587,8 +590,7 @@ nvr_reg_write(uint16_t reg, uint8_t val, void *priv)
nvr_t *nvr = (nvr_t *)priv;
local_t *local = (local_t *)nvr->data;
struct tm tm;
uint8_t old, i;
uint16_t checksum = 0x0000;
uint8_t old;
old = nvr->regs[reg];
switch(reg) {
@@ -615,19 +617,6 @@ nvr_reg_write(uint16_t reg, uint8_t val, void *priv)
nvr->regs[RTC_REGD] = val & 0x80;
break;
case 0x2e:
case 0x2f:
if (local->flags & FLAG_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;
}
nvr_reg_common_write(reg, val, nvr, local);
break;
case 0x32:
if ((reg == 0x32) && (local->cent == RTC_CENTURY_VIA) && local->wp_32)
break;
@@ -717,15 +706,33 @@ nvr_read(uint16_t addr, void *priv)
break;
case 0x2c:
if (!nvr->new && (local->flags & FLAG_LS_HACK))
if (!nvr->new && (local->flags & FLAG_AMI_1994_HACK))
ret = nvr->regs[local->addr[addr_id]] & 0x7f;
else
ret = nvr->regs[local->addr[addr_id]];
break;
case 0x2d:
if (!nvr->new && (local->flags & FLAG_AMI_1992_HACK))
ret = nvr->regs[local->addr[addr_id]] & 0xf7;
else
ret = nvr->regs[local->addr[addr_id]];
break;
case 0x2e:
case 0x2f:
if (!nvr->new && (local->flags & FLAG_LS_HACK)) {
if (!nvr->new && (local->flags & FLAG_AMI_1992_HACK)) {
for (i = 0x10; i <= 0x2d; i++) {
if (i == 0x2d)
checksum += (nvr->regs[i] & 0xf7);
else
checksum += nvr->regs[i];
}
if (local->addr[addr_id] == 0x2e)
ret = checksum >> 8;
else
ret = checksum & 0xff;
} else if (!nvr->new && (local->flags & FLAG_AMI_1994_HACK)) {
for (i = 0x10; i <= 0x2d; i++) {
if (i == 0x2c)
checksum += (nvr->regs[i] & 0x7f);
@@ -742,7 +749,7 @@ nvr_read(uint16_t addr, void *priv)
case 0x3e:
case 0x3f:
if (!nvr->new && (local->flags & FLAG_APOLLO_HACK)) {
if (!nvr->new && (local->flags & FLAG_AMI_1995_HACK)) {
/* The checksum at 3E-3F is for 37-3D and 40-7F. */
for (i = 0x37; i <= 0x3d; i++)
checksum += nvr->regs[i];
@@ -782,7 +789,7 @@ nvr_read(uint16_t addr, void *priv)
break;
case 0x52:
if (!nvr->new && (local->flags & FLAG_APOLLO_HACK))
if (!nvr->new && (local->flags & FLAG_AMI_1995_HACK))
ret = nvr->regs[local->addr[addr_id]] & 0xf3;
else
ret = nvr->regs[local->addr[addr_id]];
@@ -1005,16 +1012,16 @@ nvr_at_init(const device_t *info)
break;
case 1: /* standard AT */
case 5: /* Lucky Star LS-486E */
case 6: /* AMI Apollo */
case 5: /* AMI WinBIOS 1994 */
case 6: /* AMI BIOS 1995 */
if (info->local == 9)
local->flags |= FLAG_PIIX4;
else {
local->def = 0x00;
if ((info->local & 7) == 5)
local->flags |= FLAG_LS_HACK;
local->flags |= FLAG_AMI_1994_HACK;
else if ((info->local & 7) == 6)
local->flags |= FLAG_APOLLO_HACK;
local->flags |= FLAG_AMI_1995_HACK;
else
local->def = 0xff;
}
@@ -1035,9 +1042,13 @@ nvr_at_init(const device_t *info)
break;
case 4: /* IBM AT */
if (info->local == 12) {
local->def = 0x00;
local->flags |= FLAG_AMI_1992_HACK;
} else
local->def = 0xff;
nvr->irq = 8;
local->cent = RTC_CENTURY_AT;
local->def = 0xff;
break;
case 7: /* VIA VT82C586B */
@@ -1164,8 +1175,17 @@ const device_t piix4_nvr_device = {
NULL
};
const device_t ls486e_nvr_device = {
"Lucky Star LS-486E PC/AT NVRAM",
const device_t ami_1992_nvr_device = {
"AMI Color 1992 PC/AT NVRAM",
DEVICE_ISA | DEVICE_AT,
12,
nvr_at_init, nvr_at_close, nvr_at_reset,
{ NULL }, nvr_at_speed_changed,
NULL
};
const device_t ami_1994_nvr_device = {
"AMI WinBIOS 1994 PC/AT NVRAM",
DEVICE_ISA | DEVICE_AT,
13,
nvr_at_init, nvr_at_close, nvr_at_reset,
@@ -1173,8 +1193,8 @@ const device_t ls486e_nvr_device = {
NULL
};
const device_t ami_apollo_nvr_device = {
"AMI Apollo PC/AT NVRAM",
const device_t ami_1995_nvr_device = {
"AMI WinBIOS 1995 PC/AT NVRAM",
DEVICE_ISA | DEVICE_AT,
14,
nvr_at_init, nvr_at_close, nvr_at_reset,