summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mb86235/mb86235.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mb86235/mb86235.h')
-rw-r--r--src/devices/cpu/mb86235/mb86235.h61
1 files changed, 32 insertions, 29 deletions
diff --git a/src/devices/cpu/mb86235/mb86235.h b/src/devices/cpu/mb86235/mb86235.h
index 73ee7fcb07f..dc583dd9b84 100644
--- a/src/devices/cpu/mb86235/mb86235.h
+++ b/src/devices/cpu/mb86235/mb86235.h
@@ -13,10 +13,21 @@
#include "cpu/drcfe.h"
#include "cpu/drcuml.h"
+#include "machine/gen_fifo.h"
+
+#define MCFG_MB86235_FIFOIN(tag) \
+ downcast<mb86235_device &>(*device).set_fifoin_tag(tag);
+
+#define MCFG_MB86235_FIFOOUT0(tag) \
+ downcast<mb86235_device &>(*device).set_fifoout0_tag(tag);
+
+#define MCFG_MB86235_FIFOOUT1(tag) \
+ downcast<mb86235_device &>(*device).set_fifoout1_tag(tag);
class mb86235_frontend;
+
class mb86235_device : public cpu_device
{
friend class mb86235_frontend;
@@ -25,6 +36,10 @@ public:
// construction/destruction
mb86235_device(const machine_config &mconfig, const char *_tag, device_t *_owner, uint32_t clock);
+ void set_fifoin_tag(const char *tag) { m_fifoin.set_tag(tag); }
+ void set_fifoout0_tag(const char *tag) { m_fifoout0.set_tag(tag); }
+ void set_fifoout1_tag(const char *tag) { m_fifoout1.set_tag(tag); }
+
void unimplemented_op();
void unimplemented_alu();
void unimplemented_control();
@@ -33,13 +48,6 @@ public:
void pcs_overflow();
void pcs_underflow();
- void fifoin_w(uint32_t data);
- bool is_fifoin_full();
- bool is_fifoin_empty();
- uint32_t fifoout0_r();
- bool is_fifoout0_empty();
- bool is_fifoout0_full();
-
enum
{
MB86235_PC = 1,
@@ -53,10 +61,6 @@ public:
MB86235_ST
};
- static constexpr int FIFOIN_SIZE = 16;
- static constexpr int FIFOOUT0_SIZE = 16;
- static constexpr int FIFOOUT1_SIZE = 16;
-
void internal_abus(address_map &map);
void internal_bbus(address_map &map);
protected:
@@ -102,14 +106,6 @@ private:
uint32_t md;
};
- struct fifo
- {
- int rpos;
- int wpos;
- int num;
- uint32_t data[16];
- };
-
struct fifo_state
{
uint32_t pc;
@@ -164,9 +160,6 @@ private:
float fp0;
bool delay_slot;
- fifo fifoin;
- fifo fifoout0;
- fifo fifoout1;
fifo_state cur_fifo_state;
};
@@ -177,18 +170,16 @@ private:
uml::code_handle *m_entry; /* entry point */
uml::code_handle *m_nocode; /* nocode exception handler */
uml::code_handle *m_out_of_cycles; /* out of cycles exception handler */
- uml::code_handle *m_clear_fifo_in;
- uml::code_handle *m_clear_fifo_out0;
- uml::code_handle *m_clear_fifo_out1;
- uml::code_handle *m_read_fifo_in;
- uml::code_handle *m_write_fifo_out0;
- uml::code_handle *m_write_fifo_out1;
uml::code_handle *m_read_abus;
uml::code_handle *m_write_abus;
address_space_config m_program_config;
address_space_config m_dataa_config;
address_space_config m_datab_config;
+ optional_device<generic_fifo_u32_device> m_fifoin;
+ optional_device<generic_fifo_u32_device> m_fifoout0;
+ optional_device<generic_fifo_u32_device> m_fifoout1;
+
drc_cache m_cache;
std::unique_ptr<drcuml_state> m_drcuml;
std::unique_ptr<mb86235_frontend> m_drcfe;
@@ -216,7 +207,6 @@ private:
void static_generate_entry_point();
void static_generate_nocode_handler();
void static_generate_out_of_cycles();
- void static_generate_fifo();
void static_generate_memory_accessors();
void generate_sequence_instruction(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
void generate_update_cycles(drcuml_block &block, compiler_state &compiler, uml::parameter param, bool allow_exception);
@@ -244,6 +234,19 @@ private:
bool aluop_has_result(int aluop);
bool check_previous_op_stall();
+ // UML is sad...
+ u32 m_cur_value;
+
+ static void clear_fifoin(void *param);
+ static void clear_fifoout0(void *param);
+ static void clear_fifoout1(void *param);
+ static void read_fifoin(void *param);
+ static void write_fifoout0(void *param);
+ static void write_fifoout1(void *param);
+ static void empty_fifoin(void *param);
+ static void full_fifoout0(void *param);
+ static void full_fifoout1(void *param);
+
// interpreter
void execute_op(uint32_t h, uint32_t l);
void do_alu1(uint32_t h, uint32_t l);