summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mb86235/mb86235drc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mb86235/mb86235drc.cpp')
-rw-r--r--src/devices/cpu/mb86235/mb86235drc.cpp192
1 files changed, 83 insertions, 109 deletions
diff --git a/src/devices/cpu/mb86235/mb86235drc.cpp b/src/devices/cpu/mb86235/mb86235drc.cpp
index d1682d0e024..12e0ab60650 100644
--- a/src/devices/cpu/mb86235/mb86235drc.cpp
+++ b/src/devices/cpu/mb86235/mb86235drc.cpp
@@ -78,17 +78,6 @@
#define MU_CALC_REQUIRED ((desc->regreq[1] & 0x1000) || desc->flags & OPFLAG_IN_DELAY_SLOT)
#define MD_CALC_REQUIRED ((desc->regreq[1] & 0x2000) || desc->flags & OPFLAG_IN_DELAY_SLOT)
-#define FIFOIN_RPOS uml::mem(&m_core->fifoin.rpos)
-#define FIFOIN_WPOS uml::mem(&m_core->fifoin.wpos)
-#define FIFOIN_NUM uml::mem(&m_core->fifoin.num)
-#define FIFOOUT0_RPOS uml::mem(&m_core->fifoout0.rpos)
-#define FIFOOUT0_WPOS uml::mem(&m_core->fifoout0.wpos)
-#define FIFOOUT0_NUM uml::mem(&m_core->fifoout0.num)
-#define FIFOOUT1_RPOS uml::mem(&m_core->fifoout1.rpos)
-#define FIFOOUT1_WPOS uml::mem(&m_core->fifoout1.wpos)
-#define FIFOOUT1_NUM uml::mem(&m_core->fifoout1.num)
-
-
inline void mb86235_device::alloc_handle(uml::code_handle *&handleptr, const char *name)
{
if (!handleptr)
@@ -390,89 +379,58 @@ void mb86235_device::static_generate_out_of_cycles()
block.end();
}
-void mb86235_device::static_generate_fifo()
+void mb86235_device::clear_fifoin(void *param)
{
- {
- // clear fifo in
- drcuml_block &block(m_drcuml->begin_block(20));
-
- alloc_handle(m_clear_fifo_in, "clear_fifo_in");
- UML_HANDLE(block, *m_clear_fifo_in);
- UML_MOV(block, FIFOIN_NUM, 0);
- UML_MOV(block, FIFOIN_RPOS, 0);
- UML_MOV(block, FIFOIN_WPOS, 0);
- UML_RET(block);
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_fifoin->clear();
+}
- block.end();
- }
- {
- // clear fifo out0
- drcuml_block &block(m_drcuml->begin_block(20));
-
- alloc_handle(m_clear_fifo_out0, "clear_fifo_out0");
- UML_HANDLE(block, *m_clear_fifo_out0);
- UML_MOV(block, FIFOOUT0_NUM, 0);
- UML_MOV(block, FIFOOUT0_RPOS, 0);
- UML_MOV(block, FIFOOUT0_WPOS, 0);
- UML_RET(block);
+void mb86235_device::clear_fifoout0(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_fifoout0->clear();
+}
- block.end();
- }
- {
- // clear fifo out1
- drcuml_block &block(m_drcuml->begin_block(20));
-
- alloc_handle(m_clear_fifo_out1, "clear_fifo_out1");
- UML_HANDLE(block, *m_clear_fifo_out1);
- UML_MOV(block, FIFOOUT1_NUM, 0);
- UML_MOV(block, FIFOOUT1_RPOS, 0);
- UML_MOV(block, FIFOOUT1_WPOS, 0);
- UML_RET(block);
+void mb86235_device::clear_fifoout1(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_fifoout1->clear();
+}
- block.end();
- }
- {
- // read fifo in
- // I0 = return value
- drcuml_block &block(m_drcuml->begin_block(32));
- alloc_handle(m_read_fifo_in, "read_fifo_in");
- UML_HANDLE(block, *m_read_fifo_in);
- UML_MOV(block, I1, FIFOIN_RPOS);
- UML_LOAD(block, I0, m_core->fifoin.data, I1, SIZE_QWORD, SCALE_x8);
- UML_ADD(block, I1, I1, 1);
- UML_AND(block, I1, I1, FIFOIN_SIZE-1);
- UML_MOV(block, FIFOIN_RPOS, I1);
- UML_SUB(block, FIFOIN_NUM, FIFOIN_NUM, 1);
- UML_RET(block);
+void mb86235_device::read_fifoin(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_cur_value = cpu->m_fifoin->pop();
+}
- block.end();
- }
- {
- // write fifo out0
- // I0 = input value
- drcuml_block &block(m_drcuml->begin_block(32));
- alloc_handle(m_write_fifo_out0, "write_fifo_out0");
- UML_HANDLE(block, *m_write_fifo_out0);
- UML_MOV(block, I1, FIFOOUT0_WPOS);
- UML_STORE(block, m_core->fifoout0.data, I1, I0, SIZE_QWORD, SCALE_x8);
- UML_ADD(block, I1, I1, 1);
- UML_AND(block, I1, I1, FIFOOUT0_SIZE - 1);
- UML_MOV(block, FIFOOUT0_WPOS, I1);
- UML_ADD(block, FIFOOUT0_NUM, FIFOOUT0_NUM, 1);
- UML_RET(block);
+void mb86235_device::write_fifoout0(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_fifoout0->push(u32(cpu->m_cur_value));
+}
- block.end();
- }
- {
- // write fifo out1
- drcuml_block &block(m_drcuml->begin_block(32));
- alloc_handle(m_write_fifo_out1, "write_fifo_out1");
- UML_HANDLE(block, *m_write_fifo_out1);
- // TODO
- UML_RET(block);
+void mb86235_device::write_fifoout1(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_fifoout1->push(u32(cpu->m_cur_value));
+}
- block.end();
- }
+void mb86235_device::empty_fifoin(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_cur_value = cpu->m_fifoin->is_empty();
+}
+
+void mb86235_device::full_fifoout0(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_cur_value = cpu->m_fifoout0->is_full();
+}
+
+void mb86235_device::full_fifoout1(void *param)
+{
+ mb86235_device *cpu = (mb86235_device *)param;
+ cpu->m_cur_value = cpu->m_fifoout1->is_full();
}
void mb86235_device::static_generate_memory_accessors()
@@ -542,9 +500,6 @@ void mb86235_device::flush_cache()
static_generate_nocode_handler();
static_generate_out_of_cycles();
- // generate utility functions
- static_generate_fifo();
-
// generate exception handlers
// generate memory accessors
@@ -690,8 +645,13 @@ void mb86235_device::generate_reg_read(drcuml_block &block, compiler_state &comp
break;
case 0x31: // FI
- UML_CALLH(block, *m_read_fifo_in);
- UML_MOV(block, dst, I0);
+ if (m_fifoin)
+ {
+ UML_CALLC(block, read_fifoin, this);
+ UML_MOV(block, dst, mem(&m_cur_value));
+ }
+ else
+ UML_MOV(block, dst, 0);
break;
default:
@@ -747,8 +707,11 @@ void mb86235_device::generate_reg_write(drcuml_block &block, compiler_state &com
break;
case 0x32: // FO0
- UML_MOV(block, I0, src);
- UML_CALLH(block, *m_write_fifo_out0);
+ if (m_fifoout0)
+ {
+ UML_MOV(block, mem(&m_cur_value), src);
+ UML_CALLC(block, write_fifoout0, this);
+ }
break;
case 0x34: // PDR
@@ -850,11 +813,12 @@ bool mb86235_device::generate_opcode(drcuml_block &block, compiler_state &compil
}
// insert FIFO IN check if needed
- if (fifoin_check)
+ if (fifoin_check && m_fifoin)
{
uml::code_label const not_empty = compiler.labelnum++;
- UML_CMP(block, FIFOIN_NUM, 0);
- UML_JMPc(block, COND_G, not_empty);
+ UML_CALLC(block, empty_fifoin, this);
+ UML_CMP(block, mem(&m_cur_value), 1);
+ UML_JMPc(block, COND_NE, not_empty);
UML_MOV(block, mem(&m_core->icount), 0);
UML_EXH(block, *m_out_of_cycles, desc->pc);
@@ -863,11 +827,12 @@ bool mb86235_device::generate_opcode(drcuml_block &block, compiler_state &compil
}
// insert FIFO OUT0 check if needed
- if (fifoout0_check)
+ if (fifoout0_check && m_fifoout0)
{
uml::code_label const not_full = compiler.labelnum++;
- UML_CMP(block, FIFOOUT0_NUM, FIFOOUT0_SIZE - 1);
- UML_JMPc(block, COND_L, not_full);
+ UML_CALLC(block, full_fifoout0, this);
+ UML_CMP(block, mem(&m_cur_value), 1);
+ UML_JMPc(block, COND_NE, not_full);
UML_MOV(block, mem(&m_core->icount), 0);
UML_EXH(block, *m_out_of_cycles, desc->pc);
@@ -876,11 +841,12 @@ bool mb86235_device::generate_opcode(drcuml_block &block, compiler_state &compil
}
// insert FIFO OUT1 check if needed
- if (fifoout1_check)
+ if (fifoout1_check && m_fifoout1)
{
uml::code_label const not_full = compiler.labelnum++;
- UML_CMP(block, FIFOOUT1_NUM, FIFOOUT1_SIZE - 1);
- UML_JMPc(block, COND_L, not_full);
+ UML_CALLC(block, full_fifoout1, this);
+ UML_CMP(block, mem(&m_cur_value), 1);
+ UML_JMPc(block, COND_NE, not_full);
UML_MOV(block, mem(&m_core->icount), 0);
UML_EXH(block, *m_out_of_cycles, desc->pc);
@@ -1573,17 +1539,25 @@ void mb86235_device::generate_control(drcuml_block &block, compiler_state &compi
case 0x03: //
if (ef1 == 1) // CLRFI
- UML_CALLH(block, *m_clear_fifo_in);
+ {
+ if (m_fifoin)
+ UML_CALLC(block, clear_fifoin, this);
+ }
else if (ef1 == 2) // CLRFO
{
- UML_CALLH(block, *m_clear_fifo_out0);
- UML_CALLH(block, *m_clear_fifo_out1);
+ if (m_fifoout0)
+ UML_CALLC(block, clear_fifoout0, this);
+ if (m_fifoout1)
+ UML_CALLC(block, clear_fifoout1, this);
}
else if (ef1 == 3) // CLRF
{
- UML_CALLH(block, *m_clear_fifo_in);
- UML_CALLH(block, *m_clear_fifo_out0);
- UML_CALLH(block, *m_clear_fifo_out1);
+ if (m_fifoin)
+ UML_CALLC(block, clear_fifoin, this);
+ if (m_fifoout0)
+ UML_CALLC(block, clear_fifoout0, this);
+ if (m_fifoout1)
+ UML_CALLC(block, clear_fifoout1, this);
}
break;