Implemented T1000/T1200 non-volatile RAM. Patch from JohnElliott.
This commit is contained in:
parent
f4db376aab
commit
9309c2aefb
3 changed files with 58 additions and 7 deletions
|
|
@ -298,6 +298,7 @@ void loadnvr()
|
||||||
t1000_emsboard_loadnvr();
|
t1000_emsboard_loadnvr();
|
||||||
return;
|
return;
|
||||||
case ROM_T1200: tc8521_loadnvr();
|
case ROM_T1200: tc8521_loadnvr();
|
||||||
|
t1200_state_loadnvr();
|
||||||
t1000_emsboard_loadnvr();
|
t1000_emsboard_loadnvr();
|
||||||
return;
|
return;
|
||||||
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "rb"); nvrmask = 127; break;
|
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "rb"); nvrmask = 127; break;
|
||||||
|
|
@ -387,6 +388,7 @@ void savenvr()
|
||||||
t1000_emsboard_savenvr();
|
t1000_emsboard_savenvr();
|
||||||
return;
|
return;
|
||||||
case ROM_T1200: tc8521_savenvr();
|
case ROM_T1200: tc8521_savenvr();
|
||||||
|
t1200_state_savenvr();
|
||||||
t1000_emsboard_savenvr();
|
t1000_emsboard_savenvr();
|
||||||
return;
|
return;
|
||||||
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "wb"); break;
|
case ROM_ELX_PC425X: f = nvrfopen("elx_pc425.nvr", "wb"); break;
|
||||||
|
|
|
||||||
61
src/t1000.c
61
src/t1000.c
|
|
@ -50,7 +50,8 @@
|
||||||
|
|
||||||
void common_init();
|
void common_init();
|
||||||
|
|
||||||
uint8_t config_sys[160];
|
uint8_t t1000_nvram[160];
|
||||||
|
uint8_t t1200_nvram[2048];
|
||||||
|
|
||||||
static struct t1000_system
|
static struct t1000_system
|
||||||
{
|
{
|
||||||
|
|
@ -70,6 +71,7 @@ static struct t1000_system
|
||||||
uint8_t nvr_tick;
|
uint8_t nvr_tick;
|
||||||
int nvr_addr;
|
int nvr_addr;
|
||||||
uint8_t nvr_active;
|
uint8_t nvr_active;
|
||||||
|
mem_mapping_t nvr_mapping; /* T1200 NVRAM mapping */
|
||||||
|
|
||||||
/* EMS data */
|
/* EMS data */
|
||||||
uint8_t ems_reg[4];
|
uint8_t ems_reg[4];
|
||||||
|
|
@ -91,15 +93,29 @@ void t1000_configsys_loadnvr()
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
memset(config_sys, 0x1A, sizeof(config_sys));
|
memset(t1000_nvram, 0x1A, sizeof(t1000_nvram));
|
||||||
f = nvrfopen("t1000_config.nvr", "rb");
|
f = nvrfopen("t1000_config.nvr", "rb");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
fread(config_sys, sizeof(config_sys), 1, f);
|
fread(t1000_nvram, sizeof(t1000_nvram), 1, f);
|
||||||
fclose(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 */
|
/* All RAM beyond 512k is non-volatile */
|
||||||
void t1000_emsboard_loadnvr()
|
void t1000_emsboard_loadnvr()
|
||||||
{
|
{
|
||||||
|
|
@ -124,11 +140,25 @@ void t1000_configsys_savenvr()
|
||||||
f = nvrfopen("t1000_config.nvr", "wb");
|
f = nvrfopen("t1000_config.nvr", "wb");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
fwrite(config_sys, sizeof(config_sys), 1, f);
|
fwrite(t1000_nvram, sizeof(t1000_nvram), 1, f);
|
||||||
fclose(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()
|
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 */
|
case 0xC2: /* Read next byte from NVRAM */
|
||||||
tmp = 0xFF;
|
tmp = 0xFF;
|
||||||
if (sys->nvr_addr >= 0 && sys->nvr_addr < 160)
|
if (sys->nvr_addr >= 0 && sys->nvr_addr < 160)
|
||||||
tmp = config_sys[sys->nvr_addr];
|
tmp = t1000_nvram[sys->nvr_addr];
|
||||||
++sys->nvr_addr;
|
++sys->nvr_addr;
|
||||||
return tmp;
|
return tmp;
|
||||||
|
|
||||||
|
|
@ -481,9 +511,9 @@ static void write_t1000_nvram(uint16_t addr, uint8_t val, void *priv)
|
||||||
/* Write next byte to NVRAM */
|
/* Write next byte to NVRAM */
|
||||||
case 0xC1: if (sys->nvr_addr >= 0 && sys->nvr_addr < 160)
|
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;
|
nvr_dosave = 1;
|
||||||
config_sys[sys->nvr_addr] = val;
|
t1000_nvram[sys->nvr_addr] = val;
|
||||||
}
|
}
|
||||||
++sys->nvr_addr;
|
++sys->nvr_addr;
|
||||||
break;
|
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)]);
|
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()
|
void xt_t1000_init()
|
||||||
{
|
{
|
||||||
|
|
@ -644,6 +687,10 @@ void xt_t1200_init()
|
||||||
|
|
||||||
common_init();
|
common_init();
|
||||||
mem_add_bios();
|
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);
|
pit_set_out_func(&pit, 1, pit_refresh_timer_xt);
|
||||||
keyboard_xt_init();
|
keyboard_xt_init();
|
||||||
nmi_init();
|
nmi_init();
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ void t1000_syskey(uint8_t andmask, uint8_t ormask, uint8_t xormask);
|
||||||
|
|
||||||
void t1000_configsys_loadnvr();
|
void t1000_configsys_loadnvr();
|
||||||
void t1000_emsboard_loadnvr();
|
void t1000_emsboard_loadnvr();
|
||||||
|
void t1200_state_loadnvr();
|
||||||
|
|
||||||
void t1000_configsys_savenvr();
|
void t1000_configsys_savenvr();
|
||||||
void t1000_emsboard_savenvr();
|
void t1000_emsboard_savenvr();
|
||||||
|
void t1200_state_savenvr();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue