diff options
Diffstat (limited to 'src/devices/cpu/tms32051')
-rw-r--r-- | src/devices/cpu/tms32051/32051ops.hxx | 2 | ||||
-rw-r--r-- | src/devices/cpu/tms32051/dis32051.cpp | 29 | ||||
-rw-r--r-- | src/devices/cpu/tms32051/dis32051.h | 2 | ||||
-rw-r--r-- | src/devices/cpu/tms32051/tms32051.cpp | 124 | ||||
-rw-r--r-- | src/devices/cpu/tms32051/tms32051.h | 31 |
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; }; |