Implemented T1000/T1200 non-volatile RAM. Patch from JohnElliott.

This commit is contained in:
SarahW 2018-03-20 17:55:04 +00:00
commit 9309c2aefb
3 changed files with 58 additions and 7 deletions

View file

@ -298,6 +298,7 @@ void loadnvr()
t1000_emsboard_loadnvr();
return;
case ROM_T1200: tc8521_loadnvr();
t1200_state_loadnvr();
t1000_emsboard_loadnvr();
return;
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "rb"); nvrmask = 127; break;
@ -387,6 +388,7 @@ void savenvr()
t1000_emsboard_savenvr();
return;
case ROM_T1200: tc8521_savenvr();
t1200_state_savenvr();
t1000_emsboard_savenvr();
return;
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "wb"); break;

View file

@ -50,7 +50,8 @@
void common_init();
uint8_t config_sys[160];
uint8_t t1000_nvram[160];
uint8_t t1200_nvram[2048];
static struct t1000_system
{
@ -70,6 +71,7 @@ static struct t1000_system
uint8_t nvr_tick;
int nvr_addr;
uint8_t nvr_active;
mem_mapping_t nvr_mapping; /* T1200 NVRAM mapping */
/* EMS data */
uint8_t ems_reg[4];
@ -91,15 +93,29 @@ void t1000_configsys_loadnvr()
{
FILE *f;
memset(config_sys, 0x1A, sizeof(config_sys));
memset(t1000_nvram, 0x1A, sizeof(t1000_nvram));
f = nvrfopen("t1000_config.nvr", "rb");
if (f)
{
fread(config_sys, sizeof(config_sys), 1, f);
fread(t1000_nvram, sizeof(t1000_nvram), 1, f);
fclose(f);
}
}
void t1200_state_loadnvr()
{
FILE *f;
memset(t1200_nvram, 0, sizeof(t1200_nvram));
f = nvrfopen("t1200_state.nvr", "rb");
if (f)
{
fread(t1200_nvram, sizeof(t1200_nvram), 1, f);
fclose(f);
}
}
/* All RAM beyond 512k is non-volatile */
void t1000_emsboard_loadnvr()
{
@ -124,11 +140,25 @@ void t1000_configsys_savenvr()
f = nvrfopen("t1000_config.nvr", "wb");
if (f)
{
fwrite(config_sys, sizeof(config_sys), 1, f);
fwrite(t1000_nvram, sizeof(t1000_nvram), 1, f);
fclose(f);
}
}
void t1200_state_savenvr()
{
FILE *f;
f = nvrfopen("t1200_state.nvr", "wb");
if (f)
{
fwrite(t1200_nvram, sizeof(t1200_nvram), 1, f);
fclose(f);
}
}
void t1000_emsboard_savenvr()
{
@ -452,7 +482,7 @@ static uint8_t read_t1000_nvram(uint16_t addr, void *priv)
case 0xC2: /* Read next byte from NVRAM */
tmp = 0xFF;
if (sys->nvr_addr >= 0 && sys->nvr_addr < 160)
tmp = config_sys[sys->nvr_addr];
tmp = t1000_nvram[sys->nvr_addr];
++sys->nvr_addr;
return tmp;
@ -481,9 +511,9 @@ static void write_t1000_nvram(uint16_t addr, uint8_t val, void *priv)
/* Write next byte to NVRAM */
case 0xC1: if (sys->nvr_addr >= 0 && sys->nvr_addr < 160)
{
if (config_sys[sys->nvr_addr] != val)
if (t1000_nvram[sys->nvr_addr] != val)
nvr_dosave = 1;
config_sys[sys->nvr_addr] = val;
t1000_nvram[sys->nvr_addr] = val;
}
++sys->nvr_addr;
break;
@ -552,6 +582,19 @@ static uint32_t t1000_read_roml(uint32_t addr, void *priv)
return *(uint32_t *)(&sys->romdrive[sys->rom_offset + (addr & 0xFFFF)]);
}
static uint8_t read_t1200_nvram(uint32_t addr, void *priv)
{
return t1200_nvram[addr & 0x7FF];
}
static void write_t1200_nvram(uint32_t addr, uint8_t value, void *priv)
{
if (t1200_nvram[addr & 0x7FF] != value)
{
nvr_dosave = 1;
}
t1200_nvram[addr & 0x7FF] = value;
}
void xt_t1000_init()
{
@ -644,6 +687,10 @@ void xt_t1200_init()
common_init();
mem_add_bios();
mem_mapping_add(&t1000.nvr_mapping,
0xF0000, 2048, read_t1200_nvram, NULL, NULL,
write_t1200_nvram, NULL, NULL,
NULL, 0, &t1000);
pit_set_out_func(&pit, 1, pit_refresh_timer_xt);
keyboard_xt_init();
nmi_init();

View file

@ -2,6 +2,8 @@ void t1000_syskey(uint8_t andmask, uint8_t ormask, uint8_t xormask);
void t1000_configsys_loadnvr();
void t1000_emsboard_loadnvr();
void t1200_state_loadnvr();
void t1000_configsys_savenvr();
void t1000_emsboard_savenvr();
void t1200_state_savenvr();