improved MAIN-SUB memory map mirroring in SCD mode (verified on real hardware by Charles McDonald)

This commit is contained in:
EkeEke 2012-10-22 16:01:03 +02:00
parent 7073e57546
commit 4a41ee1525
2 changed files with 26 additions and 30 deletions

View File

@ -1045,7 +1045,7 @@ void scd_init(void)
{ {
if (i & 2) if (i & 2)
{ {
/* PRG-RAM (first 128KB bank, mirrored ?) */ /* PRG-RAM (first 128KB bank, mirrored) */
m68k.memory_map[i].base = scd.prg_ram + ((i & 1) << 16); m68k.memory_map[i].base = scd.prg_ram + ((i & 1) << 16);
m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].read16 = NULL;
@ -1068,7 +1068,7 @@ void scd_init(void)
} }
} }
/* $200000-$23FFFF (resp. $600000-$63FFFF): Word-RAM in 2M mode (256KB) */ /* $200000-$3FFFFF (resp. $600000-$7FFFFF): Word-RAM in 2M mode (256KB mirrored) */
for (i=base+0x20; i<base+0x24; i++) for (i=base+0x20; i<base+0x24; i++)
{ {
m68k.memory_map[i].base = scd.word_ram_2M + ((i & 3) << 16); m68k.memory_map[i].base = scd.word_ram_2M + ((i & 3) << 16);
@ -1079,18 +1079,6 @@ void scd_init(void)
zbank_memory_map[i].read = NULL; zbank_memory_map[i].read = NULL;
zbank_memory_map[i].write = NULL; zbank_memory_map[i].write = NULL;
} }
/* $240000-$3FFFFF (resp. $400000-$7FFFFF): unused area (Word-RAM mirrored ?) */
for (i=base+0x24; i<base+0x40; i++)
{
m68k.memory_map[i].base = scd.word_ram_2M + ((i & 3) << 16);
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = zbank_unused_r;
zbank_memory_map[i].write = zbank_unused_w;
}
/****************************************************************/ /****************************************************************/
/* SUB-CPU memory map ($000000-$FFFFFF) */ /* SUB-CPU memory map ($000000-$FFFFFF) */

View File

@ -322,37 +322,40 @@ unsigned int ctrl_io_read_byte(unsigned int address)
#endif #endif
if (system_hw == SYSTEM_MCD) if (system_hw == SYSTEM_MCD)
{ {
/* register index ($A12000-A1203F mirrored up to $A120FF) */
uint8 index = address & 0x3f;
/* Memory Mode */ /* Memory Mode */
if (address == 0xa12003) if (index == 0x03)
{ {
m68k_poll_detect(0x03); m68k_poll_detect(0x03);
return scd.regs[0x03>>1].byte.l; return scd.regs[0x03>>1].byte.l;
} }
/* SUB-CPU communication flags */ /* SUB-CPU communication flags */
if (address == 0xa1200f) if (index == 0x0f)
{ {
m68k_poll_detect(0x0f); m68k_poll_detect(0x0f);
return scd.regs[0x0f>>1].byte.l; return scd.regs[0x0f>>1].byte.l;
} }
/* default registers */ /* default registers */
if (address < 0xa12030) if (index < 0x30)
{ {
/* SUB-CPU communication words */ /* SUB-CPU communication words */
if (address >= 0xa12020) if (index >= 0x20)
{ {
m68k_poll_detect((address - 0x10) & 0x1f); m68k_poll_detect(index - 0x10);
} }
/* register LSB */ /* register LSB */
if (address & 1) if (address & 1)
{ {
return scd.regs[(address >> 1) & 0xff].byte.l; return scd.regs[index >> 1].byte.l;
} }
/* register MSB */ /* register MSB */
return scd.regs[(address >> 1) & 0xff].byte.h; return scd.regs[index >> 1].byte.h;
} }
} }
@ -441,35 +444,38 @@ unsigned int ctrl_io_read_word(unsigned int address)
#endif #endif
if (system_hw == SYSTEM_MCD) if (system_hw == SYSTEM_MCD)
{ {
/* register index ($A12000-A1203F mirrored up to $A120FF) */
uint8 index = address & 0x3f;
/* Memory Mode */ /* Memory Mode */
if (address == 0xa12002) if (index == 0x02)
{ {
m68k_poll_detect(0x03); m68k_poll_detect(0x03);
return scd.regs[0x03>>1].w; return scd.regs[0x03>>1].w;
} }
/* CDC host data (word access only ?) */ /* CDC host data (word access only ?) */
if (address == 0xa12008) if (index == 0x08)
{ {
return cdc_host_r(); return cdc_host_r();
} }
/* H-INT vector (word access only ?) */ /* H-INT vector (word access only ?) */
if (address == 0xa12006) if (index == 0x06)
{ {
return *(uint16 *)(m68k.memory_map[0].base + 0x72); return *(uint16 *)(m68k.memory_map[0].base + 0x72);
} }
/* default registers */ /* default registers */
if (address < 0xa12030) if (index < 0x30)
{ {
/* SUB-CPU communication words */ /* SUB-CPU communication words */
if (address >= 0xa12020) if (index >= 0x20)
{ {
m68k_poll_detect((address - 0x10) & 0x1e); m68k_poll_detect(index - 0x10);
} }
return scd.regs[(address >> 1) & 0xff].w; return scd.regs[index >> 1].w;
} }
} }
@ -565,7 +571,8 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data)
#endif #endif
if (system_hw == SYSTEM_MCD) if (system_hw == SYSTEM_MCD)
{ {
switch (address & 0xff) /* register index ($A12000-A1203F mirrored up to $A120FF) */
switch (address & 0x3f)
{ {
case 0x00: /* SUB-CPU interrupt */ case 0x00: /* SUB-CPU interrupt */
{ {
@ -795,7 +802,8 @@ void ctrl_io_write_word(unsigned int address, unsigned int data)
#endif #endif
if (system_hw == SYSTEM_MCD) if (system_hw == SYSTEM_MCD)
{ {
switch (address & 0xfe) /* register index ($A12000-A1203F mirrored up to $A120FF) */
switch (address & 0x3e)
{ {
case 0x00: /* SUB-CPU interrupt & control */ case 0x00: /* SUB-CPU interrupt & control */
{ {