From f09190e7f33285e2c3a52585c43456d293d5b7b7 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 25 Feb 2015 01:21:57 +0100 Subject: added support for defining a 7seg decoder table for AMI S2000 --- src/emu/cpu/amis2000/amis2000.h | 8 ++++++++ src/emu/cpu/amis2000/amis2000op.inc | 3 ++- src/emu/cpu/tms0980/tms0980.c | 2 +- src/emu/cpu/tms0980/tms0980.h | 6 +++--- src/mess/drivers/tispeak.c | 3 ++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/emu/cpu/amis2000/amis2000.h b/src/emu/cpu/amis2000/amis2000.h index dc5bce68d68..250ee6dcb8b 100644 --- a/src/emu/cpu/amis2000/amis2000.h +++ b/src/emu/cpu/amis2000/amis2000.h @@ -34,6 +34,11 @@ #define MCFG_AMI_S2152_FOUT_CB(_devcb) \ amis2000_base_device::set_write_f_callback(*device, DEVCB_##_devcb); +// S2000 has a hardcoded 7seg table, that (unlike S2200) is officially +// uncustomizable, but wildfire proves to be an exception to that rule. +#define MCFG_AMI_S2000_7SEG_DECODER(_pla) \ + amis2000_base_device::set_7seg_table(*device, _ptr); + class amis2000_base_device : public cpu_device { @@ -46,6 +51,7 @@ public: , m_bu_bits(bu_bits) , m_callstack_bits(callstack_bits) , m_callstack_depth(callstack_depth) + , m_7seg_table(NULL) , m_read_k(*this) , m_read_i(*this) , m_read_d(*this) @@ -61,6 +67,7 @@ public: template static devcb_base &set_write_d_callback(device_t &device, _Object object) { return downcast(device).m_write_d.set_callback(object); } template static devcb_base &set_write_a_callback(device_t &device, _Object object) { return downcast(device).m_write_a.set_callback(object); } template static devcb_base &set_write_f_callback(device_t &device, _Object object) { return downcast(device).m_write_f.set_callback(object); } + static void set_7seg_table(device_t &device, const UINT8 *ptr) { downcast(device).m_7seg_table = ptr; } protected: // device-level overrides @@ -115,6 +122,7 @@ protected: UINT16 m_a; // 13-bit a-pins latch (master strobe latch) // i/o handlers + const UINT8 *m_7seg_table; devcb_read8 m_read_k; devcb_read8 m_read_i; devcb_read8 m_read_d; diff --git a/src/emu/cpu/amis2000/amis2000op.inc b/src/emu/cpu/amis2000/amis2000op.inc index 694ff86d172..85f285e66bc 100644 --- a/src/emu/cpu/amis2000/amis2000op.inc +++ b/src/emu/cpu/amis2000/amis2000op.inc @@ -216,7 +216,8 @@ void amis2000_base_device::op_disn() // 0-F digits in bit order [DP]abcdefg 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x4f, 0x47 }; - m_d = lut_segment_decoder[m_acc] | (m_carry ? 0x80 : 0x00); + const UINT8 *ptr = (m_7seg_table != NULL) ? m_7seg_table : lut_segment_decoder; + m_d = ptr[m_acc] | (m_carry ? 0x80 : 0x00); d_latch_out(true); } diff --git a/src/emu/cpu/tms0980/tms0980.c b/src/emu/cpu/tms0980/tms0980.c index a010d26c9ab..a81bbf6a886 100644 --- a/src/emu/cpu/tms0980/tms0980.c +++ b/src/emu/cpu/tms0980/tms0980.c @@ -821,7 +821,7 @@ void tms0270_cpu_device::read_opcode() void tms1xxx_cpu_device::write_o_output(UINT8 index) { // a hardcoded table is supported if the output pla is unknown - m_o = (c_output_pla == NULL) ? m_opla->read(index) : c_output_pla[index]; + m_o = (m_output_pla_table == NULL) ? m_opla->read(index) : m_output_pla_table[index]; m_write_o(0, m_o & m_o_mask, 0xffff); } diff --git a/src/emu/cpu/tms0980/tms0980.h b/src/emu/cpu/tms0980/tms0980.h index b429b5b7720..2a44449ba1d 100644 --- a/src/emu/cpu/tms0980/tms0980.h +++ b/src/emu/cpu/tms0980/tms0980.h @@ -64,7 +64,7 @@ public: , m_pc_bits(pc_bits) , m_byte_bits(byte_bits) , m_x_bits(x_bits) - , c_output_pla(NULL) + , m_output_pla_table(NULL) , m_read_k(*this) , m_write_o(*this) , m_write_r(*this) @@ -76,7 +76,7 @@ public: template static devcb_base &set_write_o_callback(device_t &device, _Object object) { return downcast(device).m_write_o.set_callback(object); } template static devcb_base &set_write_r_callback(device_t &device, _Object object) { return downcast(device).m_write_r.set_callback(object); } template static devcb_base &set_power_off_callback(device_t &device, _Object object) { return downcast(device).m_power_off.set_callback(object); } - static void set_output_pla(device_t &device, const UINT16 *output_pla) { downcast(device).c_output_pla = output_pla; } + static void set_output_pla(device_t &device, const UINT16 *output_pla) { downcast(device).m_output_pla_table = output_pla; } protected: // device-level overrides @@ -185,7 +185,7 @@ protected: address_space *m_program; address_space *m_data; - const UINT16 *c_output_pla; + const UINT16 *m_output_pla_table; devcb_read8 m_read_k; devcb_write16 m_write_o; devcb_write16 m_write_r; diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 8a74f1dd71d..c9868a754e3 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -171,7 +171,8 @@ Touch & Tell: Touch & Tell (US), 1981 - MCU: CD8012* - TMS51xx: 4KB CD2610 - - notes: MCU is TMS1100 instead of TMS0270 + - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices + too, maybe an earlier version? Touch & Tell (UK), 1981 - MCU: ?* (assume same as US version) -- cgit v1.2.3