1 // license:BSD-3-Clause
2 // copyright-holders:Andrew Gardner
3 #include "emu.h"
4 #include <cstdio>
5 
6 #include "opcode.h"
7 
8 namespace DSP_56156
9 {
Opcode(uint16_t w0,uint16_t w1)10 Opcode::Opcode(uint16_t w0, uint16_t w1) : m_word0(w0)/*, m_word1(w1)*/
11 {
12 	m_instruction = Instruction::decodeInstruction(this, w0, w1);
13 	m_parallelMove = ParallelMove::decodeParallelMove(this, w0, w1);
14 }
15 
16 
~Opcode()17 Opcode::~Opcode()
18 {
19 }
20 
21 
disassemble() const22 std::string Opcode::disassemble() const
23 {
24 	// Duck out early if there isn't a valid op
25 	if (!m_instruction)
26 		return dcString();
27 
28 	// Duck out if either has had an explicit error.
29 	if (m_instruction && !m_instruction->valid())
30 		return dcString();
31 	if (m_parallelMove && !m_parallelMove->valid())
32 		return dcString();
33 
34 	// Disassemble what you can.
35 	std::string opString = "";
36 	std::string pmString = "";
37 	if (m_instruction) m_instruction->disassemble(opString);
38 	if (m_parallelMove) m_parallelMove->disassemble(pmString);
39 
40 	return opString + " " + pmString;
41 }
42 
43 
evaluate(dsp56156_core * cpustate) const44 void Opcode::evaluate(dsp56156_core* cpustate) const
45 {
46 	if (m_instruction) m_instruction->evaluate(cpustate);
47 	if (m_parallelMove) m_parallelMove->evaluate();
48 }
49 
50 
size() const51 size_t Opcode::size() const
52 {
53 	if (m_instruction && m_instruction->valid())
54 		return m_instruction->size() + m_instruction->sizeIncrement();
55 
56 	// Opcode failed to decode, so push it past dc
57 	return 1;
58 }
59 
evalSize() const60 size_t Opcode::evalSize() const
61 {
62 	if (m_instruction && m_instruction->valid())
63 		return m_instruction->evalSize(); // Probably doesn't matter : + m_instruction->sizeIncrement();
64 
65 	// Opcode failed to decode, so push it past dc
66 	return 1;
67 }
68 
69 
instSource() const70 const reg_id& Opcode::instSource() const { return m_instruction->source(); }
instDestination() const71 const reg_id& Opcode::instDestination() const { return m_instruction->destination(); }
instAccumulatorBitsModified() const72 size_t Opcode::instAccumulatorBitsModified() const { return m_instruction->accumulatorBitsModified(); }
73 
dcString() const74 std::string Opcode::dcString() const
75 {
76 	char tempStr[1024];
77 	sprintf(tempStr, "dc $%x", m_word0);
78 	return std::string(tempStr);
79 }
80 
81 }
82