mirror of
https://github.com/holub/mame
synced 2025-04-19 07:00:31 +03:00
cpu/adsp2100/*.*: Add partially support for PMOVLAY register (#9164)
* Allow PMOVLAY, DMOVLAY register reading on opcodes and debugger states * Add device_post_load for restore external space overlay state
This commit is contained in:
parent
3ee2758bb2
commit
70295eff16
@ -337,6 +337,12 @@ inline void adsp21xx_device::update_l(int which)
|
||||
m_base[which] = m_i[which] & m_lmask[which];
|
||||
}
|
||||
|
||||
inline void adsp21xx_device::update_dmovlay()
|
||||
{
|
||||
if (!m_dmovlay_cb.isnull())
|
||||
m_dmovlay_cb(m_dmovlay);
|
||||
}
|
||||
|
||||
void adsp21xx_device::write_reg0(int regnum, int32_t val)
|
||||
{
|
||||
switch (regnum)
|
||||
@ -380,9 +386,23 @@ void adsp21xx_device::write_reg1(int regnum, int32_t val)
|
||||
break;
|
||||
|
||||
case 3:
|
||||
// Check for DMOVLAY instruction callback
|
||||
if (regnum == 0xf && !m_dmovlay_cb.isnull())
|
||||
m_dmovlay_cb(val & 0x3fff);
|
||||
if (m_chip_type == CHIP_TYPE_ADSP2181) // ADSP2181 Overlay register
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
case 2:
|
||||
m_pmovlay = val & 0x3fff;
|
||||
//update_pmovlay();
|
||||
break;
|
||||
case 3:
|
||||
m_dmovlay = val & 0x3fff;
|
||||
update_dmovlay();
|
||||
break;
|
||||
default:
|
||||
logerror("ADSP %04x: Writing to an invalid register! RGP=01 RegCode=%1X Val=%04X\n", m_ppc, regnum, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
logerror("ADSP %04x: Writing to an invalid register! RGP=01 RegCode=%1X Val=%04X\n", m_ppc, regnum, val);
|
||||
break;
|
||||
@ -486,7 +506,19 @@ int32_t adsp21xx_device::read_reg0(int regnum)
|
||||
|
||||
int32_t adsp21xx_device::read_reg1(int regnum)
|
||||
{
|
||||
return *m_read1_ptr[regnum];
|
||||
int32_t ret = *m_read1_ptr[regnum];
|
||||
// ADSP2181 Overlay register
|
||||
if ((m_chip_type == CHIP_TYPE_ADSP2181) && (regnum >= 0xe))
|
||||
{
|
||||
switch (regnum)
|
||||
{
|
||||
case 0xe: ret = m_pmovlay; break;
|
||||
case 0xf: ret = m_dmovlay; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int32_t adsp21xx_device::read_reg2(int regnum)
|
||||
|
@ -2,7 +2,7 @@
|
||||
// copyright-holders:Aaron Giles
|
||||
/***************************************************************************
|
||||
|
||||
ADSP2100.c
|
||||
adsp2100.cpp
|
||||
|
||||
ADSP-21xx series emulator.
|
||||
|
||||
@ -61,8 +61,8 @@
|
||||
|
||||
Program Space: Program Space:
|
||||
0000-01ff = 512 Internal RAM (booted) 0000-37ff = 14k External access
|
||||
0400-07ff = 1k Reserved 3800-3bff = 1k Internal RAM
|
||||
0800-3fff = 14k External access 3c00-3fff = 1k Reserved
|
||||
0200-07ff = 1.5k Reserved 3800-39ff = 512 Internal RAM
|
||||
0800-3fff = 14k External access 3a00-3fff = 1.5k Reserved
|
||||
|
||||
Data Space: Data Space:
|
||||
0000-03ff = 1k External DWAIT0 0000-03ff = 1k External DWAIT0
|
||||
@ -71,7 +71,7 @@
|
||||
3000-33ff = 1k External DWAIT3 3000-33ff = 1k External DWAIT3
|
||||
3400-37ff = 1k External DWAIT4 3400-37ff = 1k External DWAIT4
|
||||
3800-38ff = 256 Internal RAM 3800-38ff = 256 Internal RAM
|
||||
3a00-3bff = 512 Reserved 3a00-3bff = 512 Reserved
|
||||
3900-3bff = 768 Reserved 3900-3bff = 768 Reserved
|
||||
3c00-3fff = 1k Internal Control regs 3c00-3fff = 1k Internal Control regs
|
||||
|
||||
|
||||
@ -80,12 +80,16 @@
|
||||
|
||||
MMAP = 0 MMAP = 1
|
||||
|
||||
Auto boot loading via BDMA or IDMA No auto boot loading
|
||||
|
||||
Program Space: Program Space:
|
||||
0000-1fff = 8k Internal RAM 0000-1fff = 8k External access
|
||||
2000-3fff = 8k Internal RAM or Overlay 2000-3fff = 8k Internal
|
||||
2000-3fff = 8k Internal RAM (PMOVLAY = 0) 2000-3fff = 8k Internal (PMOVLAY = 0)
|
||||
2000-3fff = 8k External (PMOVLAY = 1,2)
|
||||
|
||||
Data Space: Data Space:
|
||||
0000-1fff = 8k Internal RAM or Overlay 0000-1fff = 8k Internal RAM or Overlay
|
||||
0000-1fff = 8k Internal RAM (DMOVLAY = 0) 0000-1fff = 8k Internal RAM (DMOVLAY = 0)
|
||||
0000-1fff = 8k External (DMOVLAY = 1,2) 0000-1fff = 8k External (DMOVLAY = 1,2)
|
||||
2000-3fdf = 8k-32 Internal RAM 2000-3fdf = 8k-32 Internal RAM
|
||||
3fe0-3fff = 32 Internal Control regs 3fe0-3fff = 32 Internal Control regs
|
||||
|
||||
@ -95,6 +99,10 @@
|
||||
0400-05ff = 512 External IOWAIT2 0400-05ff = 512 External IOWAIT2
|
||||
0600-07ff = 512 External IOWAIT3 0600-07ff = 512 External IOWAIT3
|
||||
|
||||
TODO:
|
||||
- Move internal stuffs into CPU core file (on-chip RAM, control registers, etc)
|
||||
- Support variable internal memory mappings
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
@ -137,6 +145,8 @@ adsp21xx_device::adsp21xx_device(const machine_config &mconfig, device_type type
|
||||
m_astat_clear(0),
|
||||
m_idle(0),
|
||||
m_px(0),
|
||||
m_pmovlay(0),
|
||||
m_dmovlay(0),
|
||||
m_pc_sp(0),
|
||||
m_cntr_sp(0),
|
||||
m_stat_sp(0),
|
||||
@ -467,6 +477,8 @@ void adsp21xx_device::device_start()
|
||||
save_item(NAME(m_lmask));
|
||||
save_item(NAME(m_base));
|
||||
save_item(NAME(m_px));
|
||||
save_item(NAME(m_pmovlay));
|
||||
save_item(NAME(m_dmovlay));
|
||||
|
||||
save_item(NAME(m_pc));
|
||||
save_item(NAME(m_ppc));
|
||||
@ -587,6 +599,12 @@ void adsp21xx_device::device_start()
|
||||
state_add(ADSP2100_FL1, "FL1", m_fl1).mask(1);
|
||||
state_add(ADSP2100_FL2, "FL2", m_fl2).mask(1);
|
||||
|
||||
if (m_chip_type == CHIP_TYPE_ADSP2181)
|
||||
{
|
||||
state_add(ADSP2100_PMOVLAY, "PMOVLAY", m_pmovlay);
|
||||
state_add(ADSP2100_DMOVLAY, "DMOVLAY", m_dmovlay);
|
||||
}
|
||||
|
||||
// set our instruction counter
|
||||
set_icountptr(m_icount);
|
||||
}
|
||||
@ -611,6 +629,14 @@ void adsp21xx_device::device_reset()
|
||||
write_reg2(0x0a, m_l[6]); write_reg2(0x02, m_i[6]);
|
||||
write_reg2(0x0b, m_l[7]); write_reg2(0x03, m_i[7]);
|
||||
|
||||
// reset overlays
|
||||
if (m_chip_type == CHIP_TYPE_ADSP2181)
|
||||
{
|
||||
m_pmovlay = m_dmovlay = 0;
|
||||
// PMOVLAY
|
||||
update_dmovlay();
|
||||
}
|
||||
|
||||
// reset PC and loops
|
||||
m_pc = (m_chip_type >= CHIP_TYPE_ADSP2101) ? 0 : 4;
|
||||
m_ppc = m_pc;
|
||||
@ -644,6 +670,21 @@ void adsp21xx_device::device_reset()
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_post_load - called after loading a saved state
|
||||
//-------------------------------------------------
|
||||
|
||||
void adsp21xx_device::device_post_load()
|
||||
{
|
||||
// update overlays
|
||||
if (m_chip_type == CHIP_TYPE_ADSP2181)
|
||||
{
|
||||
// PMOVLAY
|
||||
update_dmovlay();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// memory_space_config - return the configuration
|
||||
// of the specified address space, or nullptr if
|
||||
@ -728,6 +769,11 @@ void adsp21xx_device::state_import(const device_state_entry &entry)
|
||||
update_l(entry.index() - ADSP2100_L0);
|
||||
break;
|
||||
|
||||
// PMOVLAY
|
||||
case ADSP2100_DMOVLAY:
|
||||
update_dmovlay();
|
||||
break;
|
||||
|
||||
default:
|
||||
fatalerror("CPU_IMPORT_STATE(adsp21xx) called for unexpected value\n");
|
||||
}
|
||||
@ -1048,7 +1094,7 @@ void adsp21xx_device::create_tables()
|
||||
// initialize the mask table
|
||||
for (int i = 0; i < 0x4000; i++)
|
||||
{
|
||||
if (i > 0x2000) m_mask_table[i] = 0x0000;
|
||||
if (i > 0x2000) m_mask_table[i] = 0x0000;
|
||||
else if (i > 0x1000) m_mask_table[i] = 0x2000;
|
||||
else if (i > 0x0800) m_mask_table[i] = 0x3000;
|
||||
else if (i > 0x0400) m_mask_table[i] = 0x3800;
|
||||
|
@ -153,6 +153,8 @@ enum
|
||||
ADSP2100_FL0,
|
||||
ADSP2100_FL1,
|
||||
ADSP2100_FL2,
|
||||
ADSP2100_PMOVLAY,
|
||||
ADSP2100_DMOVLAY,
|
||||
ADSP2100_AX0_SEC,
|
||||
ADSP2100_AX1_SEC,
|
||||
ADSP2100_AY0_SEC,
|
||||
@ -213,6 +215,7 @@ protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
virtual void device_post_load() override;
|
||||
|
||||
// device_execute_interface overrides
|
||||
virtual uint32_t execute_min_cycles() const noexcept override;
|
||||
@ -277,6 +280,7 @@ protected:
|
||||
// register read/write
|
||||
inline void update_i(int which);
|
||||
inline void update_l(int which);
|
||||
inline void update_dmovlay();
|
||||
inline void write_reg0(int regnum, int32_t val);
|
||||
inline void write_reg1(int regnum, int32_t val);
|
||||
inline void write_reg2(int regnum, int32_t val);
|
||||
@ -382,6 +386,8 @@ protected:
|
||||
uint32_t m_lmask[8];
|
||||
uint32_t m_base[8];
|
||||
uint8_t m_px;
|
||||
uint32_t m_pmovlay; // External Program Space overlay
|
||||
uint32_t m_dmovlay; // External Data Space overlay
|
||||
|
||||
// stacks
|
||||
uint32_t m_loop_stack[LOOP_STACK_DEPTH];
|
||||
@ -441,8 +447,8 @@ protected:
|
||||
|
||||
devcb_read32 m_sport_rx_cb; // callback for serial receive
|
||||
devcb_write32 m_sport_tx_cb; // callback for serial transmit
|
||||
devcb_write_line m_timer_fired_cb; // callback for timer fired
|
||||
devcb_write_line m_dmovlay_cb; // callback for DMOVLAY instruction
|
||||
devcb_write_line m_timer_fired_cb; // callback for timer fired
|
||||
devcb_write32 m_dmovlay_cb; // callback for DMOVLAY instruction
|
||||
|
||||
// debugging
|
||||
#if ADSP_TRACK_HOTSPOTS
|
||||
|
Loading…
Reference in New Issue
Block a user