Improvements to SCAT chipset (Award 286 clone). Patch from Greatpsycho.
This commit is contained in:
parent
8c7959b3d5
commit
345f83cb2a
3 changed files with 41 additions and 46 deletions
|
|
@ -45,7 +45,7 @@ static mem_mapping_t romext_mapping;
|
||||||
|
|
||||||
int shadowbios,shadowbios_write;
|
int shadowbios,shadowbios_write;
|
||||||
|
|
||||||
static unsigned char isram[0x10000];
|
unsigned char isram[0x10000];
|
||||||
|
|
||||||
static uint8_t ff_array[0x1000];
|
static uint8_t ff_array[0x1000];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -183,4 +183,5 @@ void mmu_invalidate(uint32_t addr);
|
||||||
|
|
||||||
int loadbios();
|
int loadbios();
|
||||||
|
|
||||||
|
extern unsigned char isram[0x10000];
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
84
src/scat.c
84
src/scat.c
|
|
@ -16,6 +16,7 @@ static scat_t scat_stat[32];
|
||||||
static uint32_t scat_xms_bound;
|
static uint32_t scat_xms_bound;
|
||||||
static mem_mapping_t scat_shadowram_mapping;
|
static mem_mapping_t scat_shadowram_mapping;
|
||||||
static mem_mapping_t scat_512k_clip_mapping;
|
static mem_mapping_t scat_512k_clip_mapping;
|
||||||
|
static mem_mapping_t scat_4000_9FFF_mapping[24];
|
||||||
|
|
||||||
void scat_shadow_state_update()
|
void scat_shadow_state_update()
|
||||||
{
|
{
|
||||||
|
|
@ -221,6 +222,11 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
||||||
pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
||||||
index = scat_ems_reg_2xA & 0x1F;
|
index = scat_ems_reg_2xA & 0x1F;
|
||||||
scat_stat[index].regs_2x8 = val;
|
scat_stat[index].regs_2x8 = val;
|
||||||
|
|
||||||
|
if(scat_stat[index].regs_2x9 & 0x80)
|
||||||
|
{
|
||||||
|
flushmmucache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x209:
|
case 0x209:
|
||||||
|
|
@ -235,16 +241,20 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
||||||
|
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
{
|
{
|
||||||
virt_addr = (((scat_stat[index].regs_2x9 & 3) << 8) | scat_stat[index].regs_2x8) << 14;
|
virt_addr = get_scat_addr(base_addr, &scat_stat[index]);
|
||||||
|
if(index < 24) mem_mapping_disable(&scat_4000_9FFF_mapping[index]);
|
||||||
|
mem_mapping_set_exec(&scat_mapping[index], ram + virt_addr);
|
||||||
mem_mapping_enable(&scat_mapping[index]);
|
mem_mapping_enable(&scat_mapping[index]);
|
||||||
mem_mapping_set_exec(&scat_mapping[index], ram + get_scat_addr(virt_addr, &scat_stat[index]));
|
|
||||||
pclog("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
pclog("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
mem_mapping_set_exec(&scat_mapping[index], ram + base_addr);
|
||||||
mem_mapping_disable(&scat_mapping[index]);
|
mem_mapping_disable(&scat_mapping[index]);
|
||||||
|
if(index < 24) mem_mapping_enable(&scat_4000_9FFF_mapping[index]);
|
||||||
pclog("Unmap page %d(address %06X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
pclog("Unmap page %d(address %06X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
||||||
}
|
}
|
||||||
|
flushmmucache();
|
||||||
|
|
||||||
if (scat_ems_reg_2xA & 0x80)
|
if (scat_ems_reg_2xA & 0x80)
|
||||||
{
|
{
|
||||||
|
|
@ -266,6 +276,11 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
||||||
pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
||||||
index = scat_ems_reg_2xA & 0x1F;
|
index = scat_ems_reg_2xA & 0x1F;
|
||||||
scat_stat[index].regs_2x8 = val;
|
scat_stat[index].regs_2x8 = val;
|
||||||
|
|
||||||
|
if(scat_stat[index].regs_2x9 & 0x80)
|
||||||
|
{
|
||||||
|
flushmmucache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x219:
|
case 0x219:
|
||||||
|
|
@ -280,16 +295,20 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
||||||
|
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
{
|
{
|
||||||
virt_addr = (((scat_stat[index].regs_2x9 & 3) << 8) | scat_stat[index].regs_2x8) << 14;
|
virt_addr = get_scat_addr(base_addr, &scat_stat[index]);
|
||||||
|
if(index < 24) mem_mapping_disable(&scat_4000_9FFF_mapping[index]);
|
||||||
|
mem_mapping_set_exec(&scat_mapping[index], ram + virt_addr);
|
||||||
mem_mapping_enable(&scat_mapping[index]);
|
mem_mapping_enable(&scat_mapping[index]);
|
||||||
mem_mapping_set_exec(&scat_mapping[index], ram + get_scat_addr(virt_addr, &scat_stat[index]));
|
|
||||||
pclog("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
pclog("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
mem_mapping_set_exec(&scat_mapping[index], ram + base_addr);
|
||||||
mem_mapping_disable(&scat_mapping[index]);
|
mem_mapping_disable(&scat_mapping[index]);
|
||||||
|
if(index < 24) mem_mapping_enable(&scat_4000_9FFF_mapping[index]);
|
||||||
pclog("Unmap page %d(address %05X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
pclog("Unmap page %d(address %05X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
||||||
}
|
}
|
||||||
|
flushmmucache();
|
||||||
|
|
||||||
if (scat_ems_reg_2xA & 0x80)
|
if (scat_ems_reg_2xA & 0x80)
|
||||||
{
|
{
|
||||||
|
|
@ -391,28 +410,6 @@ uint8_t mem_read_scatems(uint32_t addr, void *priv)
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
uint16_t mem_read_scatemsw(uint32_t addr, void *priv)
|
|
||||||
{
|
|
||||||
uint16_t val = 0xffff;
|
|
||||||
scat_t *stat = (scat_t *)priv;
|
|
||||||
|
|
||||||
addr = get_scat_addr(addr, stat);
|
|
||||||
if (addr < (mem_size << 10))
|
|
||||||
val = mem_read_ramw(addr, priv);
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
uint32_t mem_read_scatemsl(uint32_t addr, void *priv)
|
|
||||||
{
|
|
||||||
uint32_t val = 0xffffffff;
|
|
||||||
scat_t *stat = (scat_t *)priv;
|
|
||||||
|
|
||||||
addr = get_scat_addr(addr, stat);
|
|
||||||
if (addr < (mem_size << 10))
|
|
||||||
val = mem_read_raml(addr, priv);
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mem_write_scatems(uint32_t addr, uint8_t val, void *priv)
|
void mem_write_scatems(uint32_t addr, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
|
|
@ -422,22 +419,6 @@ void mem_write_scatems(uint32_t addr, uint8_t val, void *priv)
|
||||||
if (addr < (mem_size << 10))
|
if (addr < (mem_size << 10))
|
||||||
mem_write_ram(addr, val, priv);
|
mem_write_ram(addr, val, priv);
|
||||||
}
|
}
|
||||||
void mem_write_scatemsw(uint32_t addr, uint16_t val, void *priv)
|
|
||||||
{
|
|
||||||
scat_t *stat = (scat_t *)priv;
|
|
||||||
|
|
||||||
addr = get_scat_addr(addr, stat);
|
|
||||||
if (addr < (mem_size << 10))
|
|
||||||
mem_write_ramw(addr, val, priv);
|
|
||||||
}
|
|
||||||
void mem_write_scatemsl(uint32_t addr, uint32_t val, void *priv)
|
|
||||||
{
|
|
||||||
scat_t *stat = (scat_t *)priv;
|
|
||||||
|
|
||||||
addr = get_scat_addr(addr, stat);
|
|
||||||
if (addr < (mem_size << 10))
|
|
||||||
mem_write_raml(addr, val, priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void scat_init()
|
void scat_init()
|
||||||
{
|
{
|
||||||
|
|
@ -468,14 +449,27 @@ void scat_init()
|
||||||
scat_regs[SCAT_EXTENDED_BOUNDARY] = 0;
|
scat_regs[SCAT_EXTENDED_BOUNDARY] = 0;
|
||||||
scat_regs[SCAT_EMS_CONTROL] = 0;
|
scat_regs[SCAT_EMS_CONTROL] = 0;
|
||||||
|
|
||||||
|
mem_mapping_set_addr(&ram_low_mapping, 0, 0x40000);
|
||||||
|
|
||||||
|
for (i = 0; i < 24; i++)
|
||||||
|
{
|
||||||
|
if(mem_size > 256 + (i << 4))
|
||||||
|
{
|
||||||
|
mem_mapping_add(&scat_4000_9FFF_mapping[i], 0x40000 + (i << 14), 0x4000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0x40000 + (i << 14), MEM_MAPPING_INTERNAL, NULL);
|
||||||
|
mem_mapping_enable(&scat_4000_9FFF_mapping[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
scat_stat[i].regs_2x8 = 0xff;
|
scat_stat[i].regs_2x8 = 0xff;
|
||||||
scat_stat[i].regs_2x9 = 0x03;
|
scat_stat[i].regs_2x9 = 0x03;
|
||||||
mem_mapping_add(&scat_mapping[i], (i + (i >= 24 ? 28 : 16)) << 14, 0x04000, mem_read_scatems, mem_read_scatemsw, mem_read_scatemsl, mem_write_scatems, mem_write_scatemsw, mem_write_scatemsl, ram + ((i + (i >= 24 ? 28 : 16)) << 14), 0, &scat_stat[i]);
|
mem_mapping_add(&scat_mapping[i], (i + (i >= 24 ? 28 : 16)) << 14, 0x04000, mem_read_scatems, NULL, NULL, mem_write_scatems, NULL, NULL, ram + ((i + (i >= 24 ? 28 : 16)) << 14), 0, &scat_stat[i]);
|
||||||
mem_mapping_disable(&scat_mapping[i]);
|
mem_mapping_disable(&scat_mapping[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(i=4;i<10;i++) isram[i] = 0;
|
||||||
|
|
||||||
// TODO - Only normal CPU accessing address FF0000 to FFFFFF mapped to ROM. Normal CPU accessing address FC0000 to FEFFFF map to ROM should be implemented later.
|
// TODO - Only normal CPU accessing address FF0000 to FFFFFF mapped to ROM. Normal CPU accessing address FC0000 to FEFFFF map to ROM should be implemented later.
|
||||||
for (i = 12; i < 16; i++)
|
for (i = 12; i < 16; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -484,12 +478,12 @@ void scat_init()
|
||||||
|
|
||||||
if (mem_size == 1024)
|
if (mem_size == 1024)
|
||||||
{
|
{
|
||||||
mem_mapping_add(&scat_shadowram_mapping, 0x100000, 0x60000, mem_read_scatems, mem_read_scatemsw, mem_read_scatemsl, mem_write_scatems, mem_write_scatemsw, mem_write_scatemsl, ram + 0xA0000, MEM_MAPPING_INTERNAL, NULL);
|
mem_mapping_add(&scat_shadowram_mapping, 0x100000, 0x60000, mem_read_scatems, NULL, NULL, mem_write_scatems, NULL, NULL, ram + 0xA0000, MEM_MAPPING_INTERNAL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to RAM 512kb clipping emulation if only 256KB or 64KB modules installed in memory bank.
|
// Need to RAM 512kb clipping emulation if only 256KB or 64KB modules installed in memory bank.
|
||||||
// TODO - 512KB clipping should be applied all RAM refer.
|
// TODO - 512KB clipping should be applied all RAM refer.
|
||||||
mem_mapping_add(&scat_512k_clip_mapping, 0x80000, 0x20000, mem_read_scatems, mem_read_scatemsw, mem_read_scatemsl, mem_write_scatems, mem_write_scatemsw, mem_write_scatemsl, ram, MEM_MAPPING_INTERNAL, NULL);
|
mem_mapping_add(&scat_512k_clip_mapping, 0x80000, 0x20000, mem_read_scatems, NULL, NULL, mem_write_scatems, NULL, NULL, ram, MEM_MAPPING_INTERNAL, NULL);
|
||||||
mem_mapping_disable(&scat_512k_clip_mapping);
|
mem_mapping_disable(&scat_512k_clip_mapping);
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue