1313
1318
write32 = m68k_write32_delegate(FUNC(address_space::write_dword), &space);
1321
/* todo: is it possible to calculate the address map based on CS when they change
1322
and install handlers? Going through this logic for every memory access is
1325
int m68307_calc_cs(m68ki_cpu_core *m68k, offs_t address)
1327
m68307_sim* sim = m68k->m68307SIM;
1329
for (int i=0;i<4;i++)
1332
br = sim->m_br[i] & 1;
1333
amask = ((sim->m_or[i]&0x1ffc)<<11);
1334
bra = ((sim->m_br[i] & 0x1ffc)<<11);
1335
if ((br) && ((address & amask) == bra)) return i+1;
1340
/* see note above */
1342
int m68340_calc_cs(m68ki_cpu_core *m68k, offs_t address)
1344
m68340_sim* sim = m68k->m68340SIM;
1346
if ( !(sim->m_ba[0] & 1) ) return 1;
1348
for (int i=0;i<4;i++)
1350
if (sim->m_ba[i] & 1)
1352
int mask = ((sim->m_am[i]&0xffffff00) | 0xff);
1353
int base = sim->m_ba[i] & 0xffffff00;
1354
int fcmask = (sim->m_am[i] & 0xf0);
1355
int fcbase = (sim->m_ba[i] & 0xf0) & ~(sim->m_am[i] & 0xf0);
1356
int fc = m68k->mmu_tmp_fc;
1358
if ((address & ~mask) == base && ((fc << 4) & ~fcmask ) == fcbase ) return i+1;
1368
UINT16 m68k_memory_interface::simple_read_immediate_16_m68307(offs_t address)
1370
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1371
return m_direct->read_decrypted_word(address);
1374
UINT8 m68k_memory_interface::read_byte_m68307(offs_t address)
1376
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1377
return m_space->read_byte(address);
1380
UINT16 m68k_memory_interface::read_word_m68307(offs_t address)
1382
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1383
return m_space->read_word(address);
1386
UINT32 m68k_memory_interface::read_dword_m68307(offs_t address)
1388
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1389
return m_space->read_dword(address);
1392
void m68k_memory_interface::write_byte_m68307(offs_t address, UINT8 data)
1394
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1395
m_space->write_byte(address, data);
1398
void m68k_memory_interface::write_word_m68307(offs_t address, UINT16 data)
1400
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1401
m_space->write_word(address, data);
1404
void m68k_memory_interface::write_dword_m68307(offs_t address, UINT32 data)
1406
// m_cpustate->m68307_currentcs = m68307_calc_cs(m_cpustate, address);
1407
m_space->write_dword(address, data);
1413
void m68k_memory_interface::init16_m68307(address_space &space)
1416
m_direct = &space.direct();
1417
m_cpustate = m68k_get_safe_token(&space.device());
1420
readimm16 = m68k_readimm16_delegate(FUNC(m68k_memory_interface::simple_read_immediate_16_m68307), this);
1421
read8 = m68k_read8_delegate(FUNC(m68k_memory_interface::read_byte_m68307), this);
1422
read16 = m68k_read16_delegate(FUNC(m68k_memory_interface::read_word_m68307), this);
1423
read32 = m68k_read32_delegate(FUNC(m68k_memory_interface::read_dword_m68307), this);
1424
write8 = m68k_write8_delegate(FUNC(m68k_memory_interface::write_byte_m68307), this);
1425
write16 = m68k_write16_delegate(FUNC(m68k_memory_interface::write_word_m68307), this);
1426
write32 = m68k_write32_delegate(FUNC(m68k_memory_interface::write_dword_m68307), this);
1316
1429
/****************************************************************************
1317
1430
* 32-bit data memory interface
1318
1431
****************************************************************************/
1682
1795
void m68k_set_reset_callback(device_t *device, m68k_reset_func callback)
1684
m68ki_cpu_core *m68k = get_safe_token(device);
1797
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1685
1798
m68k->reset_instr_callback = callback;
1688
1801
void m68k_set_cmpild_callback(device_t *device, m68k_cmpild_func callback)
1690
m68ki_cpu_core *m68k = get_safe_token(device);
1803
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1691
1804
m68k->cmpild_instr_callback = callback;
1694
1807
void m68k_set_rte_callback(device_t *device, m68k_rte_func callback)
1696
m68ki_cpu_core *m68k = get_safe_token(device);
1809
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1697
1810
m68k->rte_instr_callback = callback;
1700
1813
void m68k_set_tas_callback(device_t *device, m68k_tas_func callback)
1702
m68ki_cpu_core *m68k = get_safe_token(device);
1815
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1703
1816
m68k->tas_instr_callback = callback;
1706
1819
UINT16 m68k_get_fc(device_t *device)
1708
m68ki_cpu_core *m68k = get_safe_token(device);
1821
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1709
1822
return m68k->mmu_tmp_fc;
1825
void m68307_set_port_callbacks(device_t *device, m68307_porta_read_callback porta_r, m68307_porta_write_callback porta_w, m68307_portb_read_callback portb_r, m68307_portb_write_callback portb_w)
1827
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1828
m68k->m_m68307_porta_r = porta_r;
1829
m68k->m_m68307_porta_w = porta_w;
1830
m68k->m_m68307_portb_r = portb_r;
1831
m68k->m_m68307_portb_w = portb_w;
1834
void m68307_set_duart68681(device_t* cpudev, device_t* duart68681)
1836
m68ki_cpu_core *m68k = m68k_get_safe_token(cpudev);
1837
if (m68k->m68307SERIAL)
1838
m68k->m68307SERIAL->m68307ser_set_duart68681(duart68681);
1844
UINT16 m68307_get_cs(device_t *device, offs_t address)
1846
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1848
m68k->m68307_currentcs = m68307_calc_cs(m68k, address);
1850
return m68k->m68307_currentcs;
1853
UINT16 m68340_get_cs(device_t *device, offs_t address)
1855
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1857
m68k->m68307_currentcs = m68340_calc_cs(m68k, address);
1859
return m68k->m68307_currentcs;
1713
1862
/****************************************************************************
1714
1863
* State definition
1968
static CPU_INIT( m68301 )
1970
// m68ki_cpu_core *m68k = m68k_get_safe_token(device);
1972
CPU_INIT_CALL(m68000);
1974
/* there is a basic implementation of this in emu/machine/tmp68301.c but it should be moved here */
1978
CPU_GET_INFO( m68301 )
1982
/* --- the following bits of info are returned as pointers to data or functions --- */
1983
case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(m68301); break;
1985
/* --- the following bits of info are returned as NULL-terminated strings --- */
1986
case DEVINFO_STR_NAME: strcpy(info->s, "68301"); break;
1988
default: CPU_GET_INFO_CALL(m68k); break;
1995
void m68307_set_interrupt(device_t *device, int level, int vector)
1997
device_set_input_line_and_vector(device, level, HOLD_LINE, vector);
2000
void m68307_timer0_interrupt(legacy_cpu_device *cpudev)
2002
m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
2003
int prioritylevel = (m68k->m68307SIM->m_picr & 0x7000)>>12;
2004
int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xa;
2005
m68307_set_interrupt(cpudev, prioritylevel, vector);
2008
void m68307_timer1_interrupt(legacy_cpu_device *cpudev)
2010
m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
2011
int prioritylevel = (m68k->m68307SIM->m_picr & 0x0700)>>8;
2012
int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xb;
2013
m68307_set_interrupt(cpudev, prioritylevel, vector);
2016
void m68307_serial_interrupt(legacy_cpu_device *cpudev, int vector)
2018
m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
2019
int prioritylevel = (m68k->m68307SIM->m_picr & 0x0070)>>4;
2020
m68307_set_interrupt(cpudev, prioritylevel, vector);
2023
void m68307_mbus_interrupt(legacy_cpu_device *cpudev)
2025
m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
2026
int prioritylevel = (m68k->m68307SIM->m_picr & 0x0007)>>0;
2027
int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xd;
2028
m68307_set_interrupt(cpudev, prioritylevel, vector);
2031
void m68307_licr2_interrupt(legacy_cpu_device *cpudev)
2033
m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
2034
int prioritylevel = (m68k->m68307SIM->m_licr2 & 0x0007)>>0;
2035
int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0x9;
2036
m68k->m68307SIM->m_licr2 |= 0x8;
2039
m68307_set_interrupt(cpudev, prioritylevel, vector);
2044
static CPU_INIT( m68307 )
2046
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
2048
CPU_INIT_CALL(m68000);
2050
/* basic CS logic, timers, mbus, serial logic
2051
set via remappable register
2053
new(&m68k->memory) m68k_memory_interface;
2054
m68k->memory.init16_m68307(*m68k->program);
2056
m68k->m68307SIM = new m68307_sim();
2057
m68k->m68307MBUS = new m68307_mbus();
2058
m68k->m68307SERIAL = new m68307_serial();
2059
m68k->m68307TIMER = new m68307_timer();
2061
m68k->m68307TIMER->init(device);
2063
m68k->m68307SIM->reset();
2064
m68k->m68307MBUS->reset();
2065
m68k->m68307SERIAL->reset();
2066
m68k->m68307TIMER->reset();
2068
m68k->internal = device->space(AS_PROGRAM);
2069
m68k->m68307_base = 0xbfff;
2070
m68k->m68307_scrhigh = 0x0007;
2071
m68k->m68307_scrlow = 0xf010;
2073
m68307_set_port_callbacks(device, 0,0,0,0);
2076
static READ16_HANDLER( m68307_internal_base_r )
2078
m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
2080
int pc = cpu_get_pc(&space->device());
2081
logerror("%08x m68307_internal_base_r %08x, (%04x)\n", pc, offset*2,mem_mask);
2085
case 0x2: return m68k->m68307_base;
2086
case 0x4: return m68k->m68307_scrhigh;
2087
case 0x6: return m68k->m68307_scrlow;
2090
logerror("(read was illegal?)\n");
2095
static WRITE16_HANDLER( m68307_internal_base_w )
2097
m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
2099
int pc = cpu_get_pc(&space->device());
2100
logerror("%08x m68307_internal_base_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask);
2107
/* remove old internal handler */
2108
base = (m68k->m68307_base & 0x0fff) << 12;
2109
//mask = (m68k->m68307_base & 0xe000) >> 13;
2110
//if ( m68k->m68307_base & 0x1000 ) mask |= 7;
2111
m68k->internal->unmap_readwrite(base+0x000, base+0x04f);
2112
m68k->internal->unmap_readwrite(base+0x100, base+0x11f);
2113
m68k->internal->unmap_readwrite(base+0x120, base+0x13f);
2114
m68k->internal->unmap_readwrite(base+0x140, base+0x149);
2116
/* store new base address */
2117
COMBINE_DATA(&m68k->m68307_base);
2119
/* install new internal handler */
2120
base = (m68k->m68307_base & 0x0fff) << 12;
2121
//mask = (m68k->m68307_base & 0xe000) >> 13;
2122
//if ( m68k->m68307_base & 0x1000 ) mask |= 7;
2123
m68k->internal->install_legacy_readwrite_handler(base + 0x000, base + 0x04f, FUNC(m68307_internal_sim_r), FUNC(m68307_internal_sim_w));
2124
m68k->internal->install_legacy_readwrite_handler(base + 0x100, base + 0x11f, FUNC(m68307_internal_serial_r), FUNC(m68307_internal_serial_w), 0xffff);
2125
m68k->internal->install_legacy_readwrite_handler(base + 0x120, base + 0x13f, FUNC(m68307_internal_timer_r), FUNC(m68307_internal_timer_w));
2126
m68k->internal->install_legacy_readwrite_handler(base + 0x140, base + 0x149, FUNC(m68307_internal_mbus_r), FUNC(m68307_internal_mbus_w), 0xffff);
2131
COMBINE_DATA(&m68k->m68307_scrhigh);
2135
COMBINE_DATA(&m68k->m68307_scrlow);
2139
logerror("(write was illegal?)\n");
2144
static ADDRESS_MAP_START( m68307_internal_map, AS_PROGRAM, 16, legacy_cpu_device )
2145
AM_RANGE(0x000000f0, 0x000000ff) AM_READWRITE_LEGACY(m68307_internal_base_r, m68307_internal_base_w)
2148
CPU_GET_INFO( m68307 )
2152
case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 24; break;
2154
/* --- the following bits of info are returned as pointers to data or functions --- */
2155
case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(m68307); break;
2157
/* --- the following bits of info are returned as NULL-terminated strings --- */
2158
case DEVINFO_STR_NAME: strcpy(info->s, "68307"); break;
2160
case DEVINFO_PTR_INTERNAL_MEMORY_MAP + AS_PROGRAM: info->internal_map16 = ADDRESS_MAP_NAME(m68307_internal_map); break;
2163
default: CPU_GET_INFO_CALL(m68k); break;
1820
2168
/****************************************************************************
1821
2169
* M68008 section
2413
2761
* Freescale M68340 section
2414
2762
****************************************************************************/
2764
static READ32_HANDLER( m68340_internal_base_r )
2766
m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
2767
int pc = cpu_get_pc(&space->device());
2768
logerror("%08x m68340_internal_base_r %08x, (%08x)\n", pc, offset*4,mem_mask);
2769
return m68k->m68340_base;
2772
static WRITE32_HANDLER( m68340_internal_base_w )
2774
m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
2776
int pc = cpu_get_pc(&space->device());
2777
logerror("%08x m68340_internal_base_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask);
2779
// other conditions?
2782
// unmap old modules
2783
if (m68k->m68340_base&1)
2785
int base = m68k->m68340_base & 0xfffff000;
2787
m68k->internal->unmap_readwrite(base + 0x000, base + 0x05f);
2788
m68k->internal->unmap_readwrite(base + 0x600, base + 0x67f);
2789
m68k->internal->unmap_readwrite(base + 0x700, base + 0x723);
2790
m68k->internal->unmap_readwrite(base + 0x780, base + 0x7bf);
2794
COMBINE_DATA(&m68k->m68340_base);
2795
logerror("%08x m68340_internal_base_w %08x, %08x (%08x) (m68340_base write)\n", pc, offset*4,data,mem_mask);
2798
if (m68k->m68340_base&1)
2800
int base = m68k->m68340_base & 0xfffff000;
2802
m68k->internal->install_legacy_readwrite_handler(base + 0x000, base + 0x03f, FUNC(m68340_internal_sim_r), FUNC(m68340_internal_sim_w),0xffffffff);
2803
m68k->internal->install_legacy_readwrite_handler(base + 0x010, base + 0x01f, FUNC(m68340_internal_sim_ports_r), FUNC(m68340_internal_sim_ports_w),0xffffffff);
2804
m68k->internal->install_legacy_readwrite_handler(base + 0x040, base + 0x05f, FUNC(m68340_internal_sim_cs_r), FUNC(m68340_internal_sim_cs_w));
2805
m68k->internal->install_legacy_readwrite_handler(base + 0x600, base + 0x67f, FUNC(m68340_internal_timer_r), FUNC(m68340_internal_timer_w));
2806
m68k->internal->install_legacy_readwrite_handler(base + 0x700, base + 0x723, FUNC(m68340_internal_serial_r), FUNC(m68340_internal_serial_w));
2807
m68k->internal->install_legacy_readwrite_handler(base + 0x780, base + 0x7bf, FUNC(m68340_internal_dma_r), FUNC(m68340_internal_dma_w));
2814
logerror("%08x m68340_internal_base_w %08x, %04x (%04x) (should fall through?)\n", pc, offset*4,data,mem_mask);
2822
static ADDRESS_MAP_START( m68340_internal_map, AS_PROGRAM, 32, legacy_cpu_device )
2823
AM_RANGE(0x0003ff00, 0x0003ff03) AM_READWRITE_LEGACY( m68340_internal_base_r, m68340_internal_base_w)
2417
2826
static CPU_INIT( m68340 )
2419
m68ki_cpu_core *m68k = get_safe_token(device);
2828
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
2421
2830
CPU_INIT_CALL(m68k);