summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms32051
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/tms32051')
-rw-r--r--src/devices/cpu/tms32051/32051ops.hxx2
-rw-r--r--src/devices/cpu/tms32051/dis32051.cpp29
-rw-r--r--src/devices/cpu/tms32051/dis32051.h2
-rw-r--r--src/devices/cpu/tms32051/tms32051.cpp124
-rw-r--r--src/devices/cpu/tms32051/tms32051.h31
5 files changed, 144 insertions, 44 deletions
diff --git a/src/devices/cpu/tms32051/32051ops.hxx b/src/devices/cpu/tms32051/32051ops.hxx
index e74fa06f1be..38d125a9de5 100644
--- a/src/devices/cpu/tms32051/32051ops.hxx
+++ b/src/devices/cpu/tms32051/32051ops.hxx
@@ -1378,7 +1378,7 @@ void tms32051_device::op_out()
uint16_t ea = GET_ADDRESS();
uint16_t data = DM_READ16(ea);
- m_io->write_word(port << 1, data);
+ m_io.write_word(port << 1, data);
// TODO: handle repeat
CYCLES(3);
diff --git a/src/devices/cpu/tms32051/dis32051.cpp b/src/devices/cpu/tms32051/dis32051.cpp
index d634ebd37c4..16872495e5d 100644
--- a/src/devices/cpu/tms32051/dis32051.cpp
+++ b/src/devices/cpu/tms32051/dis32051.cpp
@@ -128,9 +128,10 @@ void tms32051_disassembler::print_condition_codes(bool pp, int zl, int cv, int t
}
}
-void tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const data_buffer &opcodes)
+uint32_t tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const data_buffer &opcodes)
{
int subop = opcode & 0xff;
+ uint32_t flags = 0;
switch (subop)
{
@@ -186,8 +187,8 @@ void tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const da
case 0x4d: util::stream_format(*output, "setc xf"); break;
case 0x4e: util::stream_format(*output, "clrc carry"); break;
case 0x4f: util::stream_format(*output, "setc carry"); break;
- case 0x51: util::stream_format(*output, "trap"); break;
- case 0x52: util::stream_format(*output, "nmi"); break;
+ case 0x51: util::stream_format(*output, "trap"); flags = STEP_OVER; break;
+ case 0x52: util::stream_format(*output, "nmi"); flags = STEP_OVER; break;
case 0x58: util::stream_format(*output, "zpr"); break;
case 0x59: util::stream_format(*output, "zap"); break;
case 0x5a: util::stream_format(*output, "sath"); break;
@@ -200,7 +201,7 @@ void tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const da
case 0x74: case 0x75: case 0x76: case 0x77:
case 0x78: case 0x79: case 0x7a: case 0x7b:
case 0x7c: case 0x7d: case 0x7e: case 0x7f:
- util::stream_format(*output, "intr %d", opcode & 0x1f); break;
+ util::stream_format(*output, "intr %d", opcode & 0x1f); flags = STEP_OVER; break;
case 0x80: util::stream_format(*output, "mpy #%04X", FETCH(npc, opcodes)); break;
case 0x81: util::stream_format(*output, "and #%04X", FETCH(npc, opcodes) << 16); break;
@@ -212,6 +213,7 @@ void tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const da
default: util::stream_format(*output, "??? (group be)"); break;
}
+ return flags;
}
void tms32051_disassembler::dasm_group_bf(uint16_t opcode, offs_t &npc, const data_buffer &opcodes)
@@ -376,11 +378,11 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
case 0x78: util::stream_format(*output, "adrk #%02X", opcode & 0xff); break;
case 0x79: util::stream_format(*output, "b %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
case 0x7a: util::stream_format(*output, "call %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_OVER; break;
- case 0x7b: util::stream_format(*output, "banz %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
+ case 0x7b: util::stream_format(*output, "banz %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_COND; break;
case 0x7c: util::stream_format(*output, "sbrk #%02X", opcode & 0xff); break;
case 0x7d: util::stream_format(*output, "bd %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
- case 0x7e: util::stream_format(*output, "calld %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_OVER; break;
- case 0x7f: util::stream_format(*output, "banzd %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
+ case 0x7e: util::stream_format(*output, "calld %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_OVER | step_over_extra(1); break;
+ case 0x7f: util::stream_format(*output, "banzd %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_COND | step_over_extra(1); break;
case 0x80: case 0x81: case 0x82: case 0x83:
case 0x84: case 0x85: case 0x86: case 0x87:
@@ -454,7 +456,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "ldp #%03X", opcode & 0x1ff);
break;
}
- case 0xbe: dasm_group_be(opcode, npc, opcodes); break;
+ case 0xbe: flags = dasm_group_be(opcode, npc, opcodes); break;
case 0xbf: dasm_group_bf(opcode, npc, opcodes); break;
case 0xe0: case 0xe1: case 0xe2: case 0xe3:
@@ -467,6 +469,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "bcnd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
+ flags = STEP_COND;
break;
}
@@ -482,6 +485,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "xc %d", n);
print_condition_codes(true, zl, cv, tp);
+ flags = STEP_COND;
break;
}
@@ -495,6 +499,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "cc %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
+ flags = STEP_OVER | STEP_COND;
break;
}
@@ -509,13 +514,14 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
if (opcode == 0xef00)
{
util::stream_format(*output, "ret");
+ flags = STEP_OUT;
}
else
{
util::stream_format(*output, "retc ");
print_condition_codes(false, zl, cv, tp);
+ flags = STEP_OUT | STEP_COND;
}
- flags = STEP_OUT;
break;
}
@@ -529,6 +535,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "bcndd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
+ flags = STEP_COND | step_over_extra(1);
break;
}
@@ -542,6 +549,7 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(*output, "ccd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
+ flags = STEP_OVER | STEP_COND | step_over_extra(1);
break;
}
@@ -556,13 +564,14 @@ offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const
if (opcode == 0xff00)
{
util::stream_format(*output, "retd");
+ flags = STEP_OUT | step_over_extra(1);
}
else
{
util::stream_format(*output, "retcd ");
print_condition_codes(false, zl, cv, tp);
+ flags = STEP_OUT | STEP_COND | step_over_extra(1);
}
- flags = STEP_OUT;
break;
}
diff --git a/src/devices/cpu/tms32051/dis32051.h b/src/devices/cpu/tms32051/dis32051.h
index dd170859bf3..50292afa90e 100644
--- a/src/devices/cpu/tms32051/dis32051.h
+++ b/src/devices/cpu/tms32051/dis32051.h
@@ -23,7 +23,7 @@ private:
std::string GET_ADDRESS(int addr_mode, int address);
std::string GET_SHIFT(int shift);
void print_condition_codes(bool pp, int zl, int cv, int tp);
- void dasm_group_be(uint16_t opcode, offs_t &npc, const data_buffer &opcodes);
+ uint32_t dasm_group_be(uint16_t opcode, offs_t &npc, const data_buffer &opcodes);
void dasm_group_bf(uint16_t opcode, offs_t &npc, const data_buffer &opcodes);
std::ostream *output;
diff --git a/src/devices/cpu/tms32051/tms32051.cpp b/src/devices/cpu/tms32051/tms32051.cpp
index d1a1c566f83..d03493df60f 100644
--- a/src/devices/cpu/tms32051/tms32051.cpp
+++ b/src/devices/cpu/tms32051/tms32051.cpp
@@ -9,7 +9,6 @@
#include "emu.h"
#include "tms32051.h"
#include "dis32051.h"
-#include "debugger.h"
enum
{
@@ -57,7 +56,7 @@ DEFINE_DEVICE_TYPE(TMS32053, tms32053_device, "tms32053", "Texas Instruments TMS
void tms32051_device::tms32051_internal_pgm(address_map &map)
{
-// AM_RANGE(0x0000, 0x1fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0
+// map(0x0000, 0x1fff).rom(); // ROM TODO: is off-chip if MP/_MC = 0
map(0x2000, 0x23ff).ram().share("saram"); // SARAM TODO: is off-chip if RAM bit = 0
map(0xfe00, 0xffff).ram().share("daram_b0"); // DARAM B0 TODO: is off-chip if CNF = 0
}
@@ -101,7 +100,7 @@ device_memory_interface::space_config_vector tms32051_device::memory_space_confi
void tms32053_device::tms32053_internal_pgm(address_map &map)
{
-// AM_RANGE(0x0000, 0x3fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0
+// map(0x0000, 0x3fff).rom(); // ROM TODO: is off-chip if MP/_MC = 0
map(0x4000, 0x4bff).ram().share("saram"); // SARAM TODO: is off-chip if RAM bit = 0
map(0xfe00, 0xffff).ram().share("daram_b0"); // DARAM B0 TODO: is off-chip if CNF = 0
}
@@ -130,7 +129,7 @@ std::unique_ptr<util::disasm_interface> tms32051_device::create_disassembler()
#define CYCLES(x) (m_icount -= x)
-#define ROPCODE() m_cache->read_word(m_pc++)
+#define ROPCODE() m_cache.read_word(m_pc++)
void tms32051_device::CHANGE_PC(uint16_t new_pc)
{
@@ -139,22 +138,22 @@ void tms32051_device::CHANGE_PC(uint16_t new_pc)
uint16_t tms32051_device::PM_READ16(uint16_t address)
{
- return m_program->read_word(address);
+ return m_program.read_word(address);
}
void tms32051_device::PM_WRITE16(uint16_t address, uint16_t data)
{
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
}
uint16_t tms32051_device::DM_READ16(uint16_t address)
{
- return m_data->read_word(address);
+ return m_data.read_word(address);
}
void tms32051_device::DM_WRITE16(uint16_t address, uint16_t data)
{
- m_data->write_word(address, data);
+ m_data.write_word(address, data);
}
#include "32051ops.hxx"
@@ -186,10 +185,10 @@ void tms32051_device::delay_slot(uint16_t startpc)
void tms32051_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
m_pcstack_ptr = 0;
m_op = 0;
@@ -219,6 +218,99 @@ void tms32051_device::device_start()
memset(&m_timer, 0, sizeof(m_timer));
memset(&m_serial, 0, sizeof(m_serial));
+ save_item(NAME(m_pc));
+ save_item(NAME(m_op));
+ save_item(NAME(m_acc));
+ save_item(NAME(m_accb));
+ save_item(NAME(m_preg));
+ save_item(NAME(m_treg0));
+ save_item(NAME(m_treg1));
+ save_item(NAME(m_treg2));
+ save_pointer(NAME(&m_ar[0]), std::size(m_ar));
+ save_item(NAME(m_rptc));
+ save_item(NAME(m_bmar));
+ save_item(NAME(m_brcr));
+ save_item(NAME(m_paer));
+ save_item(NAME(m_pasr));
+ save_item(NAME(m_indx));
+ save_item(NAME(m_dbmr));
+ save_item(NAME(m_arcr));
+
+ save_item(STRUCT_MEMBER(m_st0, dp));
+ save_item(STRUCT_MEMBER(m_st0, intm));
+ save_item(STRUCT_MEMBER(m_st0, ovm));
+ save_item(STRUCT_MEMBER(m_st0, ov));
+ save_item(STRUCT_MEMBER(m_st0, arp));
+
+ save_item(STRUCT_MEMBER(m_st1, arb));
+ save_item(STRUCT_MEMBER(m_st1, cnf));
+ save_item(STRUCT_MEMBER(m_st1, tc));
+ save_item(STRUCT_MEMBER(m_st1, sxm));
+ save_item(STRUCT_MEMBER(m_st1, c));
+ save_item(STRUCT_MEMBER(m_st1, hm));
+ save_item(STRUCT_MEMBER(m_st1, xf));
+ save_item(STRUCT_MEMBER(m_st1, pm));
+
+ save_item(STRUCT_MEMBER(m_pmst, iptr));
+ save_item(STRUCT_MEMBER(m_pmst, avis));
+ save_item(STRUCT_MEMBER(m_pmst, ovly));
+ save_item(STRUCT_MEMBER(m_pmst, ram));
+ save_item(STRUCT_MEMBER(m_pmst, mpmc));
+ save_item(STRUCT_MEMBER(m_pmst, ndx));
+ save_item(STRUCT_MEMBER(m_pmst, trm));
+ save_item(STRUCT_MEMBER(m_pmst, braf));
+
+ save_item(NAME(m_ifr));
+ save_item(NAME(m_imr));
+ save_pointer(NAME(&m_pcstack[0]), std::size(m_pcstack));
+ save_item(NAME(m_pcstack_ptr));
+ save_item(NAME(m_rpt_start));
+ save_item(NAME(m_rpt_end));
+ save_item(NAME(m_cbcr));
+ save_item(NAME(m_cbsr1));
+ save_item(NAME(m_cber1));
+ save_item(NAME(m_cbsr2));
+ save_item(NAME(m_cber2));
+
+ save_item(STRUCT_MEMBER(m_timer, tddr));
+ save_item(STRUCT_MEMBER(m_timer, psc));
+ save_item(STRUCT_MEMBER(m_timer, tim));
+ save_item(STRUCT_MEMBER(m_timer, prd));
+
+ save_item(STRUCT_MEMBER(m_serial, drr));
+ save_item(STRUCT_MEMBER(m_serial, dxr));
+ save_item(STRUCT_MEMBER(m_serial, spc));
+
+ save_item(STRUCT_MEMBER(m_shadow, acc));
+ save_item(STRUCT_MEMBER(m_shadow, accb));
+ save_item(STRUCT_MEMBER(m_shadow, arcr));
+ save_item(STRUCT_MEMBER(m_shadow, indx));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, iptr));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, avis));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, ovly));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, ram));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, mpmc));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, ndx));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, trm));
+ save_item(STRUCT_MEMBER(m_shadow.pmst, braf));
+ save_item(STRUCT_MEMBER(m_shadow.st0, dp));
+ save_item(STRUCT_MEMBER(m_shadow.st0, intm));
+ save_item(STRUCT_MEMBER(m_shadow.st0, ovm));
+ save_item(STRUCT_MEMBER(m_shadow.st0, ov));
+ save_item(STRUCT_MEMBER(m_shadow.st0, arp));
+ save_item(STRUCT_MEMBER(m_shadow.st1, arb));
+ save_item(STRUCT_MEMBER(m_shadow.st1, cnf));
+ save_item(STRUCT_MEMBER(m_shadow.st1, tc));
+ save_item(STRUCT_MEMBER(m_shadow.st1, sxm));
+ save_item(STRUCT_MEMBER(m_shadow.st1, c));
+ save_item(STRUCT_MEMBER(m_shadow.st1, hm));
+ save_item(STRUCT_MEMBER(m_shadow.st1, xf));
+ save_item(STRUCT_MEMBER(m_shadow.st1, pm));
+ save_item(STRUCT_MEMBER(m_shadow, preg));
+ save_item(STRUCT_MEMBER(m_shadow, treg0));
+ save_item(STRUCT_MEMBER(m_shadow, treg1));
+ save_item(STRUCT_MEMBER(m_shadow, treg2));
+
state_add( TMS32051_PC, "PC", m_pc).formatstr("%04X");
state_add( TMS32051_ACC, "ACC", m_acc).formatstr("%08X");
state_add( TMS32051_ACCB, "ACCB", m_accb).formatstr("%08X");
@@ -444,7 +536,7 @@ void tms32051_device::execute_run()
/*****************************************************************************/
-READ16_MEMBER( tms32051_device::cpuregs_r )
+uint16_t tms32051_device::cpuregs_r(offs_t offset)
{
switch (offset)
{
@@ -519,7 +611,7 @@ READ16_MEMBER( tms32051_device::cpuregs_r )
case 0x5d:
case 0x5e:
case 0x5f:
- return m_io->read_word(offset);
+ return m_io.read_word(offset);
default:
if (!machine().side_effects_disabled())
@@ -529,7 +621,7 @@ READ16_MEMBER( tms32051_device::cpuregs_r )
return 0;
}
-WRITE16_MEMBER( tms32051_device::cpuregs_w )
+void tms32051_device::cpuregs_w(offs_t offset, uint16_t data)
{
switch (offset)
{
@@ -630,7 +722,7 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w )
case 0x5d:
case 0x5e:
case 0x5f:
- m_io->write_word(offset, data);
+ m_io.write_word(offset, data);
break;
default:
diff --git a/src/devices/cpu/tms32051/tms32051.h b/src/devices/cpu/tms32051/tms32051.h
index 49f1f041a55..f3df84fa4d3 100644
--- a/src/devices/cpu/tms32051/tms32051.h
+++ b/src/devices/cpu/tms32051/tms32051.h
@@ -59,22 +59,21 @@ public:
// construction/destruction
tms32051_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ16_MEMBER( cpuregs_r );
- DECLARE_WRITE16_MEMBER( cpuregs_w );
+ uint16_t cpuregs_r(offs_t offset);
+ void cpuregs_w(offs_t offset, uint16_t data);
- void tms32051_internal_data(address_map &map);
- void tms32051_internal_pgm(address_map &map);
+ void tms32051_internal_data(address_map &map) ATTR_COLD;
+ void tms32051_internal_pgm(address_map &map) ATTR_COLD;
protected:
tms32051_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_pgm, address_map_constructor internal_data);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ 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 { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 5; }
- virtual uint32_t execute_input_lines() const override { return 6; }
+ virtual uint32_t execute_min_cycles() const noexcept override { return 1; }
+ virtual uint32_t execute_max_cycles() const noexcept override { return 5; }
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
@@ -160,10 +159,10 @@ protected:
int32_t treg2;
} m_shadow;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_io;
int m_icount;
bool m_idle;
@@ -375,10 +374,10 @@ public:
// construction/destruction
tms32053_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void tms32053_internal_data(address_map &map);
- void tms32053_internal_pgm(address_map &map);
+ void tms32053_internal_data(address_map &map) ATTR_COLD;
+ void tms32053_internal_pgm(address_map &map) ATTR_COLD;
protected:
- virtual void device_reset() override;
+ virtual void device_reset() override ATTR_COLD;
};