summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/upd7725
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/upd7725')
-rw-r--r--src/devices/cpu/upd7725/dasm7725.cpp76
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp120
-rw-r--r--src/devices/cpu/upd7725/upd7725.h50
3 files changed, 115 insertions, 131 deletions
diff --git a/src/devices/cpu/upd7725/dasm7725.cpp b/src/devices/cpu/upd7725/dasm7725.cpp
index 4298b5d3930..12d6b0e36e8 100644
--- a/src/devices/cpu/upd7725/dasm7725.cpp
+++ b/src/devices/cpu/upd7725/dasm7725.cpp
@@ -21,6 +21,7 @@ offs_t necdsp_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
{
uint32_t opcode = opcodes.r32(pc) >> 8;
uint32_t type = (opcode >> 22);
+ offs_t flags = 0;
// printf("dasm: PC %x opcode %08x\n", pc, opcode);
@@ -145,6 +146,7 @@ offs_t necdsp_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
if(type == 1) {
stream << " | ret";
+ flags = STEP_OUT;
}
}
@@ -154,44 +156,44 @@ offs_t necdsp_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
switch(brch) {
case 0x000: stream << "jmpso "; break;
- case 0x080: stream << "jnca "; break;
- case 0x082: stream << "jca "; break;
- case 0x084: stream << "jncb "; break;
- case 0x086: stream << "jcb "; break;
- case 0x088: stream << "jnza "; break;
- case 0x08a: stream << "jza "; break;
- case 0x08c: stream << "jnzb "; break;
- case 0x08e: stream << "jzb "; break;
- case 0x090: stream << "jnova0 "; break;
- case 0x092: stream << "jova0 "; break;
- case 0x094: stream << "jnovb0 "; break;
- case 0x096: stream << "jovb0 "; break;
- case 0x098: stream << "jnova1 "; break;
- case 0x09a: stream << "jova1 "; break;
- case 0x09c: stream << "jnovb1 "; break;
- case 0x09e: stream << "jovb1 "; break;
- case 0x0a0: stream << "jnsa0 "; break;
- case 0x0a2: stream << "jsa0 "; break;
- case 0x0a4: stream << "jnsb0 "; break;
- case 0x0a6: stream << "jsb0 "; break;
- case 0x0a8: stream << "jnsa1 "; break;
- case 0x0aa: stream << "jsa1 "; break;
- case 0x0ac: stream << "jnsb1 "; break;
- case 0x0ae: stream << "jsb1 "; break;
- case 0x0b0: stream << "jdpl0 "; break;
- case 0x0b1: stream << "jdpln0 "; break;
- case 0x0b2: stream << "jdplf "; break;
- case 0x0b3: stream << "jdplnf "; break;
- case 0x0b4: stream << "jnsiak "; break;
- case 0x0b6: stream << "jsiak "; break;
- case 0x0b8: stream << "jnsoak "; break;
- case 0x0ba: stream << "jsoak "; break;
- case 0x0bc: stream << "jnrqm "; break;
- case 0x0be: stream << "jrqm "; break;
+ case 0x080: stream << "jnca "; flags = STEP_COND; break;
+ case 0x082: stream << "jca "; flags = STEP_COND; break;
+ case 0x084: stream << "jncb "; flags = STEP_COND; break;
+ case 0x086: stream << "jcb "; flags = STEP_COND; break;
+ case 0x088: stream << "jnza "; flags = STEP_COND; break;
+ case 0x08a: stream << "jza "; flags = STEP_COND; break;
+ case 0x08c: stream << "jnzb "; flags = STEP_COND; break;
+ case 0x08e: stream << "jzb "; flags = STEP_COND; break;
+ case 0x090: stream << "jnova0 "; flags = STEP_COND; break;
+ case 0x092: stream << "jova0 "; flags = STEP_COND; break;
+ case 0x094: stream << "jnovb0 "; flags = STEP_COND; break;
+ case 0x096: stream << "jovb0 "; flags = STEP_COND; break;
+ case 0x098: stream << "jnova1 "; flags = STEP_COND; break;
+ case 0x09a: stream << "jova1 "; flags = STEP_COND; break;
+ case 0x09c: stream << "jnovb1 "; flags = STEP_COND; break;
+ case 0x09e: stream << "jovb1 "; flags = STEP_COND; break;
+ case 0x0a0: stream << "jnsa0 "; flags = STEP_COND; break;
+ case 0x0a2: stream << "jsa0 "; flags = STEP_COND; break;
+ case 0x0a4: stream << "jnsb0 "; flags = STEP_COND; break;
+ case 0x0a6: stream << "jsb0 "; flags = STEP_COND; break;
+ case 0x0a8: stream << "jnsa1 "; flags = STEP_COND; break;
+ case 0x0aa: stream << "jsa1 "; flags = STEP_COND; break;
+ case 0x0ac: stream << "jnsb1 "; flags = STEP_COND; break;
+ case 0x0ae: stream << "jsb1 "; flags = STEP_COND; break;
+ case 0x0b0: stream << "jdpl0 "; flags = STEP_COND; break;
+ case 0x0b1: stream << "jdpln0 "; flags = STEP_COND; break;
+ case 0x0b2: stream << "jdplf "; flags = STEP_COND; break;
+ case 0x0b3: stream << "jdplnf "; flags = STEP_COND; break;
+ case 0x0b4: stream << "jnsiak "; flags = STEP_COND; break;
+ case 0x0b6: stream << "jsiak "; flags = STEP_COND; break;
+ case 0x0b8: stream << "jnsoak "; flags = STEP_COND; break;
+ case 0x0ba: stream << "jsoak "; flags = STEP_COND; break;
+ case 0x0bc: stream << "jnrqm "; flags = STEP_COND; break;
+ case 0x0be: stream << "jrqm "; flags = STEP_COND; break;
case 0x100: stream << "ljmp "; break;
case 0x101: stream << "hjmp "; break;
- case 0x140: stream << "lcall "; break;
- case 0x141: stream << "hcall "; break;
+ case 0x140: stream << "lcall "; flags = STEP_OVER; break;
+ case 0x141: stream << "hcall "; flags = STEP_OVER; break;
default: stream << "?????? "; break;
}
@@ -225,5 +227,5 @@ offs_t necdsp_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
}
}
- return 1 | SUPPORTED;
+ return 1 | flags | SUPPORTED;
}
diff --git a/src/devices/cpu/upd7725/upd7725.cpp b/src/devices/cpu/upd7725/upd7725.cpp
index c0e00ab1341..a7d43f50e68 100644
--- a/src/devices/cpu/upd7725/upd7725.cpp
+++ b/src/devices/cpu/upd7725/upd7725.cpp
@@ -12,7 +12,6 @@
****************************************************************************/
#include "emu.h"
-#include "debugger.h"
#include "upd7725.h"
#include "dasm7725.h"
@@ -25,26 +24,23 @@
DEFINE_DEVICE_TYPE(UPD7725, upd7725_device, "upd7725", "NEC uPD7725")
DEFINE_DEVICE_TYPE(UPD96050, upd96050_device, "upd96050", "NEC uPD96050")
-necdsp_device::necdsp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t abits, uint32_t dbits)
- : cpu_device(mconfig, type, tag, owner, clock),
- m_program_config("program", ENDIANNESS_BIG, 32, abits, -2), // data bus width, address bus width, -2 means DWORD-addressable
- m_data_config("data", ENDIANNESS_BIG, 16, dbits, -1), m_icount(0), // -1 for WORD-addressable
- m_irq(0),
- m_irq_firing(0),
- m_program(nullptr),
- m_data(nullptr),
- m_cache(nullptr),
- m_in_int_cb(*this),
- //m_in_si_cb(*this),
- //m_in_sck_cb(*this),
- //m_in_sien_cb(*this),
- //m_in_soen_cb(*this),
- //m_in_dack_cb(*this),
- m_out_p0_cb(*this),
- m_out_p1_cb(*this)
- //m_out_so_cb(*this),
- //m_out_sorq_cb(*this),
- //m_out_drq_cb(*this)
+necdsp_device::necdsp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t abits, uint32_t dbits) :
+ cpu_device(mconfig, type, tag, owner, clock),
+ m_program_config("program", ENDIANNESS_BIG, 32, abits, -2), // data bus width, address bus width, -2 means DWORD-addressable
+ m_data_config("data", ENDIANNESS_BIG, 16, dbits, -1), m_icount(0), // -1 for WORD-addressable
+ m_irq(0),
+ m_irq_firing(0),
+ m_in_int_cb(*this, 0),
+ //m_in_si_cb(*this, 0),
+ //m_in_sck_cb(*this, 0),
+ //m_in_sien_cb(*this, 0),
+ //m_in_soen_cb(*this, 0),
+ //m_in_dack_cb(*this, 0),
+ m_out_p0_cb(*this),
+ m_out_p1_cb(*this)
+ //m_out_so_cb(*this),
+ //m_out_sorq_cb(*this),
+ //m_out_drq_cb(*this)
{
}
@@ -66,9 +62,9 @@ upd96050_device::upd96050_device(const machine_config &mconfig, const char *tag,
void necdsp_device::device_start()
{
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_data = &space(AS_DATA);
- m_cache = m_program->cache<2, -2, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_DATA).specific(m_data);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", regs.pc).noshow();
@@ -90,19 +86,6 @@ void necdsp_device::device_start()
state_add(UPD7725_SO, "SO", regs.so);
state_add(UPD7725_IDB, "IDB", regs.idb);
- // resolve callbacks
- m_in_int_cb.resolve_safe(0);
- //m_in_si_cb.resolve_safe(0);
- //m_in_sck_cb.resolve_safe(0);
- //m_in_sien_cb.resolve_safe(0);
- //m_in_soen_cb.resolve_safe(0);
- //m_in_dack_cb.resolve_safe(0);
- m_out_p0_cb.resolve_safe();
- m_out_p1_cb.resolve_safe();
- //m_out_so_cb.resolve_safe();
- //m_out_sorq_cb.resolve_safe();
- //m_out_drq_cb.resolve_safe();
-
// save state registrations
save_item(NAME(regs.pc));
save_item(NAME(regs.rp));
@@ -268,7 +251,7 @@ void necdsp_device::state_string_export(const device_state_entry &entry, std::st
// cycles it takes for one instruction to execute
//-------------------------------------------------
-uint32_t necdsp_device::execute_min_cycles() const
+uint32_t necdsp_device::execute_min_cycles() const noexcept
{
return 4;
}
@@ -279,24 +262,13 @@ uint32_t necdsp_device::execute_min_cycles() const
// cycles it takes for one instruction to execute
//-------------------------------------------------
-uint32_t necdsp_device::execute_max_cycles() const
+uint32_t necdsp_device::execute_max_cycles() const noexcept
{
return 4;
}
//-------------------------------------------------
-// execute_input_lines - return the number of
-// input/interrupt lines
-//-------------------------------------------------
-
-uint32_t necdsp_device::execute_input_lines() const
-{
- return 3; // TODO: there should be 11: INT, SCK, /SIEN, /SOEN, SI, and /DACK, plus SO, /SORQ and DRQ; for now, just INT, P0, and P1 are enough.
-}
-
-
-//-------------------------------------------------
// execute_set_input -
//-------------------------------------------------
@@ -333,14 +305,14 @@ void necdsp_device::execute_run()
do
{
// call debugger hook if necessary
- if (device_t::machine().debug_flags & DEBUG_FLAG_ENABLED)
+ if (debugger_enabled())
{
debugger_instruction_hook(regs.pc);
}
if (m_irq_firing == 0) // normal opcode
{
- opcode = m_cache->read_dword(regs.pc) >> 8;
+ opcode = m_cache.read_dword(regs.pc) >> 8;
regs.pc++;
}
else if (m_irq_firing == 1) // if we're in an interrupt cycle, execute a op 'nop' first...
@@ -392,7 +364,7 @@ void necdsp_device::exec_op(uint32_t opcode) {
case 3: regs.idb = regs.tr; break;
case 4: regs.idb = regs.dp; break;
case 5: regs.idb = regs.rp; break;
- case 6: regs.idb = m_data->read_word(regs.rp); break;
+ case 6: regs.idb = m_data.read_word(regs.rp); break;
case 7: regs.idb = 0x8000 - regs.flaga.s1; break; //SGN
case 8: regs.idb = regs.dr; regs.sr.rqm = 1; break;
case 9: regs.idb = regs.dr; break;
@@ -401,7 +373,7 @@ void necdsp_device::exec_op(uint32_t opcode) {
case 12: regs.idb = bitswap<16>(regs.si, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); break; //LSB = first bit in from serial, 'reversed' SI register order
case 13: regs.idb = regs.k; break;
case 14: regs.idb = regs.l; break;
- case 15: regs.idb = dataRAM[regs.dp]; break;
+ case 15: regs.idb = dataRAM[regs.dp & 0x07ff]; break;
}
if(alu) {
@@ -415,7 +387,7 @@ void necdsp_device::exec_op(uint32_t opcode) {
flag.ov1 = 0;
switch(pselect) {
- case 0: p = dataRAM[regs.dp]; break;
+ case 0: p = dataRAM[regs.dp & 0x07ff]; break;
case 1: p = regs.idb; break;
case 2: p = regs.m; break;
case 3: p = regs.n; break;
@@ -441,7 +413,7 @@ void necdsp_device::exec_op(uint32_t opcode) {
case 12: r = (q << 1) | (c ? 1 : 0); break; //SHL1 (ROL)
case 13: r = (q << 2) | 3; break; //SHL2
case 14: r = (q << 4) | 15; break; //SHL4
- case 15: r = (q << 8) | (q >> 8); break; //XCHG
+ case 15: r = swapendian_int16(q); break; //XCHG
}
flag.s0 = (r & 0x8000);
@@ -589,46 +561,52 @@ void necdsp_device::exec_ld(uint32_t opcode) {
case 8: regs.so = bitswap<16>(id, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); break; //LSB first output, output tapped at bit 15 shifting left
case 9: regs.so = id; break; //MSB first output, output tapped at bit 15 shifting left
case 10: regs.k = id; break;
- case 11: regs.k = id; regs.l = m_data->read_word(regs.rp); break;
- case 12: regs.l = id; regs.k = dataRAM[regs.dp | 0x40]; break;
+ case 11: regs.k = id; regs.l = m_data.read_word(regs.rp); break;
+ case 12: regs.l = id; regs.k = dataRAM[(regs.dp & 0x7ff) | 0x40]; break;
case 13: regs.l = id; break;
case 14: regs.trb = id; break;
- case 15: dataRAM[regs.dp] = id; break;
+ case 15: dataRAM[regs.dp & 0x7ff] = id; break;
}
}
-uint8_t necdsp_device::snesdsp_read(bool mode) {
- if (!mode)
- {
- return regs.sr >> 8;
- }
+uint8_t necdsp_device::status_r()
+{
+ return regs.sr >> 8;
+}
+
+uint8_t necdsp_device::data_r()
+{
if (regs.sr.drc == 0)
{
//16-bit
if(regs.sr.drs == 0)
{
- regs.sr.drs = 1;
+ if (!machine().side_effects_disabled())
+ regs.sr.drs = 1;
return regs.dr >> 0;
}
else
{
- regs.sr.rqm = 0;
- regs.sr.drs = 0;
+ if (!machine().side_effects_disabled())
+ {
+ regs.sr.rqm = 0;
+ regs.sr.drs = 0;
+ }
return regs.dr >> 8;
}
}
else
{
//8-bit
- regs.sr.rqm = 0;
+ if (!machine().side_effects_disabled())
+ regs.sr.rqm = 0;
return regs.dr >> 0;
}
}
-void necdsp_device::snesdsp_write(bool mode, uint8_t data) {
- if (!mode) return;
-
+void necdsp_device::data_w(uint8_t data)
+{
if (regs.sr.drc == 0)
{
//16-bit
diff --git a/src/devices/cpu/upd7725/upd7725.h b/src/devices/cpu/upd7725/upd7725.h
index 0ebb4338f8d..d77e3620dcf 100644
--- a/src/devices/cpu/upd7725/upd7725.h
+++ b/src/devices/cpu/upd7725/upd7725.h
@@ -36,25 +36,25 @@ public:
auto p0() { return m_out_p0_cb.bind(); }
auto p1() { return m_out_p1_cb.bind(); }
- uint8_t snesdsp_read(bool mode);
- void snesdsp_write(bool mode, uint8_t data);
+ uint8_t status_r();
+ uint8_t data_r();
+ void data_w(uint8_t data);
protected:
// construction/destruction
necdsp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t abits, uint32_t dbits);
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ // device_t implementation
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
- // device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override;
- virtual uint32_t execute_max_cycles() const override;
- virtual uint32_t execute_input_lines() const override;
+ // device_execute_interface implementation
+ virtual uint32_t execute_min_cycles() const noexcept override;
+ virtual uint32_t execute_max_cycles() const noexcept override;
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
- // device_memory_interface overrides
+ // device_memory_interface implementation
virtual space_config_vector memory_space_config() const override;
// device_state_interface overrides
@@ -62,7 +62,7 @@ protected:
virtual void state_export(const device_state_entry &entry) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
- // device_disasm_interface overrides
+ // device_disasm_interface implementation
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
// inline data
@@ -75,12 +75,12 @@ private:
{
bool s1, s0, c, z, ov1, ov0;
- inline operator unsigned() const
+ operator unsigned() const
{
- return (s1 << 5) + (s0 << 4) + (c << 3) + (z << 2) + (ov1 << 1) + (ov0 << 0);
+ return (s1 << 5) | (s0 << 4) | (c << 3) | (z << 2) | (ov1 << 1) | (ov0 << 0);
}
- inline unsigned operator=(unsigned d)
+ unsigned operator=(unsigned d)
{
s1 = d & 0x20; s0 = d & 0x10; c = d & 0x08; z = d & 0x04; ov1 = d & 0x02; ov0 = d & 0x01;
return d;
@@ -91,14 +91,14 @@ private:
{
bool rqm, usf1, usf0, drs, dma, drc, soc, sic, ei, p1, p0;
- inline operator unsigned() const
+ operator unsigned() const
{
- return (rqm << 15) + (usf1 << 14) + (usf0 << 13) + (drs << 12)
- + (dma << 11) + (drc << 10) + (soc << 9) + (sic << 8)
- + (ei << 7) + (p1 << 1) + (p0 << 0);
+ return (rqm << 15) | (usf1 << 14) | (usf0 << 13) | (drs << 12)
+ | (dma << 11) | (drc << 10) | (soc << 9) | (sic << 8)
+ | (ei << 7) | (p1 << 1) | (p0 << 0);
}
- inline unsigned operator=(unsigned d)
+ unsigned operator=(unsigned d)
{
rqm = d & 0x8000; usf1 = d & 0x4000; usf0 = d & 0x2000; drs = d & 0x1000;
dma = d & 0x0800; drc = d & 0x0400; soc = d & 0x0200; sic = d & 0x0100;
@@ -144,8 +144,9 @@ private:
// 1 = next opcode is the first half of int firing 'NOP'
// 2 = next opcode is the second half of int firing 'CALL 0100'
int m_irq_firing;
- address_space *m_program, *m_data;
- memory_access_cache<2, -2, ENDIANNESS_BIG> *m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_BIG>::specific m_program;
+ memory_access<12, 1, -1, ENDIANNESS_BIG>::specific m_data;
protected:
devcb_read_line m_in_int_cb;
@@ -174,8 +175,11 @@ public:
// construction/destruction
upd96050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- uint16_t dataram_r(uint16_t addr) { return dataRAM[addr]; }
- void dataram_w(uint16_t addr, uint16_t data) { dataRAM[addr] = data; }
+ uint16_t dataram_r(uint16_t addr) { return dataRAM[addr & 0x07ff]; }
+ void dataram_w(uint16_t addr, uint16_t data, uint16_t mem_mask = uint16_t(~0))
+ {
+ COMBINE_DATA(&dataRAM[addr & 0x07ff]);
+ }
};
// device type definition