mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
(MESS)preliminary emulation of Speak & Spell hardware. [hap, Lord Nightmare]
This commit is contained in:
parent
6574570b26
commit
06c8f41bc1
@ -146,7 +146,7 @@ const device_type TMS1300 = &device_creator<tms1300_cpu_device>; // 40-pin DIP,
|
||||
// - main instructions PLA at the top half, to the right of the midline
|
||||
// - 64-term microinstructions PLA between the RAM and ROM, supporting 20 microinstructions
|
||||
// - 16-term output PLA and segment PLA above the RAM (rotate opla 90 degrees)
|
||||
const device_type TMS0980 = &device_creator<tms0980_cpu_device>; // 28-pin DIP, 9 R pins, 5 K pins
|
||||
const device_type TMS0980 = &device_creator<tms0980_cpu_device>; // 28-pin DIP, 9 R pins
|
||||
|
||||
// TMS0970 is a stripped-down version of the TMS0980, itself acting more like a TMS1000
|
||||
// - RAM and ROM is exactly the same as TMS1000
|
||||
@ -161,7 +161,7 @@ const device_type TMS0970 = &device_creator<tms0970_cpu_device>; // 28-pin DIP,
|
||||
// - 64-term microinstructions PLA between the RAM and ROM, supporting 20 microinstructions plus optional separate lines for custom opcode handling
|
||||
// - 48-term output PLA above the RAM (rotate opla 90 degrees)
|
||||
const device_type TMS0270 = &device_creator<tms0270_cpu_device>; // 40-pin DIP, 16 O pins, 8+ R pins (some R pins are internally hooked up to support more I/O)
|
||||
// TMS0260 is same? except opla is 32 instead of 48 terms
|
||||
// TMS0260 is similar? except opla is 32 instead of 48 terms
|
||||
|
||||
|
||||
static ADDRESS_MAP_START(program_11bit_9, AS_PROGRAM, 16, tms1xxx_cpu_device)
|
||||
@ -192,68 +192,59 @@ ADDRESS_MAP_END
|
||||
|
||||
|
||||
tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1xxx_cpu_device(mconfig, TMS1000, "TMS1000", tag, owner, clock, 8, 11, 4, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1000", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1xxx_cpu_device(mconfig, TMS1000, "TMS1000", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1000", __FILE__)
|
||||
{ }
|
||||
|
||||
tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1xxx_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, k_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{
|
||||
}
|
||||
tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1xxx_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{ }
|
||||
|
||||
tms1070_cpu_device::tms1070_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1000_cpu_device(mconfig, TMS1070, "TMS1070", tag, owner, clock, 8, 11, 4, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1070", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1000_cpu_device(mconfig, TMS1070, "TMS1070", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1070", __FILE__)
|
||||
{ }
|
||||
|
||||
tms1200_cpu_device::tms1200_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1000_cpu_device(mconfig, TMS1200, "TMS1200", tag, owner, clock, 8, 13, 4, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1200", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1000_cpu_device(mconfig, TMS1200, "TMS1200", tag, owner, clock, 8, 13, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1200", __FILE__)
|
||||
{ }
|
||||
|
||||
|
||||
tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1000_cpu_device(mconfig, TMS1100, "TMS1100", tag, owner, clock, 8, 11, 4, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1100", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1000_cpu_device(mconfig, TMS1100, "TMS1100", tag, owner, clock, 8, 11, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1100", __FILE__)
|
||||
{ }
|
||||
|
||||
tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, k_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{
|
||||
}
|
||||
tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{ }
|
||||
|
||||
tms1300_cpu_device::tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1100_cpu_device(mconfig, TMS1300, "TMS1200", tag, owner, clock, 8, 16, 4, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1300", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1100_cpu_device(mconfig, TMS1300, "TMS1200", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1300", __FILE__)
|
||||
{ }
|
||||
|
||||
|
||||
tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms1000_cpu_device(mconfig, TMS0970, "TMS0970", tag, owner, clock, 8, 11, 4, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms0970", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms1000_cpu_device(mconfig, TMS0970, "TMS0970", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms0970", __FILE__)
|
||||
{ }
|
||||
|
||||
tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, k_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{
|
||||
}
|
||||
tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{ }
|
||||
|
||||
|
||||
tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms0970_cpu_device(mconfig, TMS0980, "TMS0980", tag, owner, clock, 8, 9, 5, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms0980", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms0970_cpu_device(mconfig, TMS0980, "TMS0980", tag, owner, clock, 8, 9, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms0980", __FILE__)
|
||||
{ }
|
||||
|
||||
tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms0970_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, k_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{
|
||||
}
|
||||
tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: tms0970_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
|
||||
{ }
|
||||
|
||||
|
||||
tms0270_cpu_device::tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: tms0980_cpu_device(mconfig, TMS0270, "TMS0270", tag, owner, clock, 16, 16, 4, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms0270", __FILE__)
|
||||
{
|
||||
}
|
||||
: tms0980_cpu_device(mconfig, TMS0270, "TMS0270", tag, owner, clock, 16, 16, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms0270", __FILE__)
|
||||
, m_read_ctl(*this)
|
||||
, m_write_ctl(*this)
|
||||
, m_write_pdc(*this)
|
||||
{ }
|
||||
|
||||
|
||||
|
||||
@ -380,7 +371,6 @@ void tms1xxx_cpu_device::device_start()
|
||||
|
||||
m_o_mask = (1 << m_o_pins) - 1;
|
||||
m_r_mask = (1 << m_r_pins) - 1;
|
||||
m_k_mask = (1 << m_k_pins) - 1;
|
||||
m_pc_mask = (1 << m_pc_bits) - 1;
|
||||
m_x_mask = (1 << m_x_bits) - 1;
|
||||
|
||||
@ -479,17 +469,27 @@ void tms0270_cpu_device::device_start()
|
||||
// common init
|
||||
tms1xxx_cpu_device::device_start();
|
||||
|
||||
m_read_ctl.resolve_safe(0);
|
||||
m_write_ctl.resolve_safe();
|
||||
m_write_pdc.resolve_safe();
|
||||
|
||||
// zerofill
|
||||
m_a_prev = 0;
|
||||
m_r_prev = 0;
|
||||
m_chipsel = 0;
|
||||
m_ctl_dir = 0;
|
||||
m_ctl_out = 0;
|
||||
m_pdc = -1; // !
|
||||
|
||||
m_o_latch_low = 0;
|
||||
m_o_latch = 0;
|
||||
m_o_latch_prev = 0;
|
||||
|
||||
// register for savestates
|
||||
save_item(NAME(m_a_prev));
|
||||
save_item(NAME(m_r_prev));
|
||||
save_item(NAME(m_chipsel));
|
||||
save_item(NAME(m_ctl_dir));
|
||||
save_item(NAME(m_ctl_out));
|
||||
save_item(NAME(m_pdc));
|
||||
|
||||
save_item(NAME(m_o_latch_low));
|
||||
save_item(NAME(m_o_latch));
|
||||
@ -687,9 +687,6 @@ void tms0270_cpu_device::device_reset()
|
||||
// common reset
|
||||
tms0980_cpu_device::device_reset();
|
||||
|
||||
m_a_prev = m_a;
|
||||
m_r_prev = m_r;
|
||||
|
||||
m_o_latch_low = 0;
|
||||
m_o_latch = 0;
|
||||
m_o_latch_prev = 0;
|
||||
@ -777,27 +774,75 @@ void tms0970_cpu_device::write_o_output(UINT8 index)
|
||||
|
||||
void tms0270_cpu_device::dynamic_output()
|
||||
{
|
||||
// TODO..
|
||||
// R15: filament on (handled in the driver)
|
||||
// R14: N/C by default
|
||||
// R13: power off, trigger on falling edge
|
||||
if ((m_r_prev >> 13 & 1) && !(m_r >> 13 & 1))
|
||||
m_power_off(1);
|
||||
|
||||
m_a_prev = m_a;
|
||||
m_r_prev = m_r;
|
||||
m_o_latch_prev = m_o_latch;
|
||||
// R11: TMS5100 CTL port direction (0=read from TMS5100, 1=write to TMS5100)
|
||||
m_ctl_dir = m_r >> 11 & 1;
|
||||
|
||||
// R12: chip select (off=display via OPLA, on=TMS5100 via ACC/CKB)
|
||||
m_chipsel = m_r >> 12 & 1;
|
||||
|
||||
if (m_chipsel)
|
||||
{
|
||||
// ACC via SEG B,C,D,G: TMS5100 CTL pins
|
||||
if (m_ctl_dir && m_a != m_ctl_out)
|
||||
{
|
||||
m_ctl_out = m_a;
|
||||
m_write_ctl(0, m_ctl_out, 0xff);
|
||||
}
|
||||
|
||||
// R10 via SEG E: TMS5100 PDC pin
|
||||
if (m_pdc != (m_r >> 10 & 1))
|
||||
{
|
||||
m_pdc = m_r >> 10 & 1;
|
||||
m_write_pdc(m_pdc);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// standard O-output
|
||||
if (m_o_latch != m_o_latch_prev)
|
||||
{
|
||||
write_o_output(m_o_latch);
|
||||
m_o_latch_prev = m_o_latch;
|
||||
}
|
||||
}
|
||||
|
||||
// standard R-output
|
||||
if (m_r != m_r_prev)
|
||||
{
|
||||
m_write_r(0, m_r & m_r_mask, 0xffff);
|
||||
m_r_prev = m_r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UINT8 tms1xxx_cpu_device::read_k_input()
|
||||
{
|
||||
// K1,2,4,8,3 (KC test pin is not emulated)
|
||||
UINT8 k = m_read_k(0, 0xff) & m_k_mask;
|
||||
UINT8 k3 = (k & 0x10) ? 3: 0; // the K3 line that is on some chips, is simply K1|K2
|
||||
// K1,2,4,8 (KC test pin is not emulated)
|
||||
return m_read_k(0, 0xff) & 0xf;
|
||||
}
|
||||
|
||||
UINT8 tms0980_cpu_device::read_k_input()
|
||||
{
|
||||
UINT8 k = m_read_k(0, 0xff) & 0x1f;
|
||||
UINT8 k3 = (k & 0x10) ? 3: 0; // the TMS0980 K3 line is simply K1|K2
|
||||
return (k & 0xf) | k3;
|
||||
}
|
||||
|
||||
UINT8 tms0270_cpu_device::read_k_input()
|
||||
{
|
||||
// TODO..
|
||||
|
||||
return tms1xxx_cpu_device::read_k_input();
|
||||
// external: TMS5100 CTL port via SEG B,C,D,G
|
||||
if (m_chipsel)
|
||||
return (m_ctl_dir) ? m_ctl_out : m_read_ctl(0, 0xff) & 0xf;
|
||||
|
||||
// standard K-input otherwise
|
||||
UINT8 k = m_read_k(0, 0xff) & 0x1f;
|
||||
return (k & 0x10) ? 0xf : k; // the TMS0270 KF line asserts all K-inputs
|
||||
}
|
||||
|
||||
|
||||
@ -1015,6 +1060,18 @@ void tms1xxx_cpu_device::op_sbl()
|
||||
|
||||
|
||||
// TMS0270-specific
|
||||
void tms0270_cpu_device::op_setr()
|
||||
{
|
||||
// same as default, but handle write to output in dynamic_output
|
||||
m_r = m_r | (1 << m_y);
|
||||
}
|
||||
|
||||
void tms0270_cpu_device::op_rstr()
|
||||
{
|
||||
// same as default, but handle write to output in dynamic_output
|
||||
m_r = m_r & ~(1 << m_y);
|
||||
}
|
||||
|
||||
void tms0270_cpu_device::op_tdo()
|
||||
{
|
||||
// TDO: transfer data out
|
||||
@ -1026,16 +1083,9 @@ void tms0270_cpu_device::op_tdo()
|
||||
// write to output is done in dynamic_output
|
||||
}
|
||||
|
||||
void tms0270_cpu_device::op_setr()
|
||||
void tms0270_cpu_device::op_off()
|
||||
{
|
||||
// same as default, but handle write to output in dynamic_output
|
||||
m_r = m_r | (1 << m_y);
|
||||
}
|
||||
|
||||
void tms0270_cpu_device::op_rstr()
|
||||
{
|
||||
// same as default, but handle write to output in dynamic_output
|
||||
m_r = m_r & ~(1 << m_y);
|
||||
// OFF was moved to R13, handled in dynamic_output
|
||||
}
|
||||
|
||||
|
||||
|
@ -21,28 +21,37 @@
|
||||
#define MCFG_TMS1XXX_WRITE_O_CB(_devcb) \
|
||||
tms1xxx_cpu_device::set_write_o_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
// R output pins (also called D on some chips)
|
||||
#define MCFG_TMS1XXX_WRITE_R_CB(_devcb) \
|
||||
tms1xxx_cpu_device::set_write_r_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
// OFF opcode on TMS0980 and up
|
||||
#define MCFG_TMS1XXX_POWER_OFF_CB(_devcb) \
|
||||
tms1xxx_cpu_device::set_power_off_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
// Use this if the output PLA is unknown:
|
||||
// If the microinstructions (or other) PLA is unknown, try using one from another romset.
|
||||
#define MCFG_TMS1XXX_OUTPUT_PLA(_pla) \
|
||||
tms1xxx_cpu_device::set_output_pla(*device, _pla);
|
||||
|
||||
// R output pins (also called D on some chips)
|
||||
#define MCFG_TMS1XXX_WRITE_R_CB(_devcb) \
|
||||
tms1xxx_cpu_device::set_write_r_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
// OFF request on TMS0980 and up
|
||||
#define MCFG_TMS1XXX_POWER_OFF_CB(_devcb) \
|
||||
tms1xxx_cpu_device::set_power_off_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
|
||||
// TMS0270 was designed to interface with TMS5100, set it up at driver level
|
||||
#define MCFG_TMS0270_READ_CTL_CB(_devcb) \
|
||||
tms0270_cpu_device::set_read_ctl_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
#define MCFG_TMS0270_WRITE_CTL_CB(_devcb) \
|
||||
tms0270_cpu_device::set_write_ctl_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
#define MCFG_TMS0270_WRITE_PDC_CB(_devcb) \
|
||||
tms0270_cpu_device::set_write_pdc_callback(*device, DEVCB_##_devcb);
|
||||
|
||||
|
||||
|
||||
class tms1xxx_cpu_device : public cpu_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tms1xxx_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock
|
||||
, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits
|
||||
, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
tms1xxx_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
|
||||
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
|
||||
, m_program_config("program", ENDIANNESS_BIG, byte_bits > 8 ? 16 : 8, prgwidth, 0, program)
|
||||
, m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data)
|
||||
@ -52,7 +61,6 @@ public:
|
||||
, m_spla(*this, "spla")
|
||||
, m_o_pins(o_pins)
|
||||
, m_r_pins(r_pins)
|
||||
, m_k_pins(k_pins)
|
||||
, m_pc_bits(pc_bits)
|
||||
, m_byte_bits(byte_bits)
|
||||
, m_x_bits(x_bits)
|
||||
@ -164,7 +172,6 @@ protected:
|
||||
|
||||
UINT8 m_o_pins; // how many O pins
|
||||
UINT8 m_r_pins; // how many R pins
|
||||
UINT8 m_k_pins; // how many K pins
|
||||
UINT8 m_pc_bits; // how many program counter bits
|
||||
UINT8 m_byte_bits; // how many bits per 'byte'
|
||||
UINT8 m_x_bits; // how many X register bits
|
||||
@ -196,7 +203,7 @@ class tms1000_cpu_device : public tms1xxx_cpu_device
|
||||
{
|
||||
public:
|
||||
tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
|
||||
protected:
|
||||
// overrides
|
||||
@ -225,7 +232,7 @@ class tms1100_cpu_device : public tms1000_cpu_device
|
||||
{
|
||||
public:
|
||||
tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
|
||||
protected:
|
||||
// overrides
|
||||
@ -248,7 +255,7 @@ class tms0970_cpu_device : public tms1000_cpu_device
|
||||
{
|
||||
public:
|
||||
tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
|
||||
protected:
|
||||
// overrides
|
||||
@ -266,7 +273,7 @@ class tms0980_cpu_device : public tms0970_cpu_device
|
||||
{
|
||||
public:
|
||||
tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 k_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 o_pins, UINT8 r_pins, UINT8 pc_bits, UINT8 byte_bits, UINT8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
|
||||
|
||||
protected:
|
||||
// overrides
|
||||
@ -278,6 +285,7 @@ protected:
|
||||
virtual UINT32 disasm_max_opcode_bytes() const { return 2; }
|
||||
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
|
||||
|
||||
virtual UINT8 read_k_input();
|
||||
virtual void set_cki_bus();
|
||||
virtual void read_opcode();
|
||||
|
||||
@ -291,6 +299,11 @@ class tms0270_cpu_device : public tms0980_cpu_device
|
||||
{
|
||||
public:
|
||||
tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
// static configuration helpers
|
||||
template<class _Object> static devcb_base &set_read_ctl_callback(device_t &device, _Object object) { return downcast<tms0270_cpu_device &>(device).m_read_ctl.set_callback(object); }
|
||||
template<class _Object> static devcb_base &set_write_ctl_callback(device_t &device, _Object object) { return downcast<tms0270_cpu_device &>(device).m_write_ctl.set_callback(object); }
|
||||
template<class _Object> static devcb_base &set_write_pdc_callback(device_t &device, _Object object) { return downcast<tms0270_cpu_device &>(device).m_write_pdc.set_callback(object); }
|
||||
|
||||
protected:
|
||||
// overrides
|
||||
@ -307,14 +320,23 @@ protected:
|
||||
virtual void op_setr();
|
||||
virtual void op_rstr();
|
||||
virtual void op_tdo();
|
||||
virtual void op_off();
|
||||
|
||||
private:
|
||||
UINT8 m_a_prev;
|
||||
// state specific to interface with TMS5100
|
||||
UINT16 m_r_prev;
|
||||
UINT8 m_chipsel;
|
||||
UINT8 m_ctl_out;
|
||||
UINT8 m_ctl_dir;
|
||||
int m_pdc;
|
||||
|
||||
UINT8 m_o_latch_low;
|
||||
UINT8 m_o_latch;
|
||||
UINT8 m_o_latch_prev;
|
||||
|
||||
devcb_read8 m_read_ctl;
|
||||
devcb_write8 m_write_ctl;
|
||||
devcb_write_line m_write_pdc;
|
||||
};
|
||||
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/tms0980/tms0980.h"
|
||||
#include "sound/tms5110.h"
|
||||
|
||||
#include "tispeak.lh"
|
||||
|
||||
@ -20,17 +21,23 @@ class tispeak_state : public driver_device
|
||||
public:
|
||||
tispeak_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu")
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_button_matrix(*this, "IN")
|
||||
{ }
|
||||
|
||||
required_device<tms0270_cpu_device> m_maincpu;
|
||||
required_ioport_array<9> m_button_matrix;
|
||||
|
||||
UINT16 m_r;
|
||||
UINT16 m_o;
|
||||
|
||||
UINT16 m_leds_state[8];
|
||||
void leds_update();
|
||||
|
||||
DECLARE_READ8_MEMBER(read_k);
|
||||
DECLARE_WRITE16_MEMBER(write_o);
|
||||
DECLARE_WRITE16_MEMBER(write_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(auto_power_off);
|
||||
|
||||
virtual void machine_start();
|
||||
};
|
||||
@ -43,19 +50,48 @@ public:
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void tispeak_state::leds_update()
|
||||
{
|
||||
// update leds state
|
||||
for (int i = 0; i < 8; i++)
|
||||
if (m_r >> i & 1)
|
||||
m_leds_state[i] = m_o & 0x3fff;
|
||||
|
||||
// if filament (R15) is on, send to output
|
||||
// if (m_r & 0x8000) // blank..
|
||||
for (int i = 0; i < 8; i++)
|
||||
output_set_digit_value(i, m_leds_state[i]);
|
||||
}
|
||||
|
||||
|
||||
READ8_MEMBER(tispeak_state::read_k)
|
||||
{
|
||||
return 0;
|
||||
// the Vss row is always on
|
||||
UINT8 k = m_button_matrix[8]->read();
|
||||
|
||||
// read selected button rows
|
||||
for (int i = 0; i < 8; i++)
|
||||
if (m_r >> i & 1)
|
||||
k |= m_button_matrix[i]->read();
|
||||
|
||||
return k;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(tispeak_state::write_r)
|
||||
{
|
||||
m_r = data;
|
||||
leds_update();
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(tispeak_state::write_o)
|
||||
{
|
||||
m_o = data;
|
||||
leds_update();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(tispeak_state::auto_power_off)
|
||||
{
|
||||
//if (state) printf("X");
|
||||
}
|
||||
|
||||
|
||||
@ -66,7 +102,135 @@ WRITE16_MEMBER(tispeak_state::write_o)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static INPUT_PORTS_START( tispeak )
|
||||
static INPUT_PORTS_START( snspell )
|
||||
PORT_START("IN.0") // R0
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
|
||||
|
||||
PORT_START("IN.1") // R1
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J')
|
||||
|
||||
PORT_START("IN.2") // R2
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O')
|
||||
|
||||
PORT_START("IN.3") // R3
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
|
||||
|
||||
PORT_START("IN.4") // R4
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
|
||||
|
||||
PORT_START("IN.5") // R5
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter")
|
||||
|
||||
PORT_START("IN.6") // R6
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) // unused
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) // unused
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) // unused
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) // unused
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) // unused
|
||||
|
||||
PORT_START("IN.7") // R7
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Go")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue")
|
||||
|
||||
PORT_START("IN.8") // Vss!
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mystery Word")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( snmath )
|
||||
PORT_START("IN.0") // R0
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) // 0
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) // 3
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) // 6
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) // 9
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) // .
|
||||
|
||||
PORT_START("IN.1") // R1
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) // 1
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) // 4
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) // 7
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD)
|
||||
|
||||
PORT_START("IN.2") // R2
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) // 2
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) // 5
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) // 8
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD)
|
||||
|
||||
PORT_START("IN.3") // R3
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) // ent
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) // go
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) // off
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD)
|
||||
|
||||
PORT_START("IN.4") // R4
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) // clr
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) // <
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) // >
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) // rpt
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD)
|
||||
|
||||
PORT_START("IN.5") // R5
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) // +
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) // -
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) // x
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) // /
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) // mix
|
||||
|
||||
PORT_START("IN.6") // R6
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) // num stum
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) // write it
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) // g/l
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) // word prob
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) // solve it/on
|
||||
|
||||
PORT_START("IN.7") // R7
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD)
|
||||
|
||||
PORT_START("IN.8") // Vss!
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -79,9 +243,11 @@ INPUT_PORTS_END
|
||||
|
||||
void tispeak_state::machine_start()
|
||||
{
|
||||
memset(m_leds_state, 0, sizeof(m_leds_state));
|
||||
m_r = 0;
|
||||
m_o = 0;
|
||||
|
||||
save_item(NAME(m_leds_state));
|
||||
save_item(NAME(m_r));
|
||||
save_item(NAME(m_o));
|
||||
}
|
||||
@ -94,13 +260,20 @@ static MACHINE_CONFIG_START( tispeak, tispeak_state )
|
||||
MCFG_TMS1XXX_READ_K_CB(READ8(tispeak_state, read_k))
|
||||
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tispeak_state, write_o))
|
||||
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tispeak_state, write_r))
|
||||
|
||||
MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(tispeak_state, auto_power_off))
|
||||
|
||||
MCFG_TMS0270_READ_CTL_CB(DEVREAD8("tms5100", tms5100_device, ctl_r))
|
||||
MCFG_TMS0270_WRITE_CTL_CB(DEVWRITE8("tms5100", tms5100_device, ctl_w))
|
||||
MCFG_TMS0270_WRITE_PDC_CB(DEVWRITELINE("tms5100", tms5100_device, pdc_w))
|
||||
|
||||
MCFG_DEFAULT_LAYOUT(layout_tispeak)
|
||||
|
||||
/* no video! */
|
||||
|
||||
/* sound hardware */
|
||||
// MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("tms5100", TMS5100, XTAL_640kHz)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -111,6 +284,22 @@ MACHINE_CONFIG_END
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
ROM_START( snspell )
|
||||
ROM_REGION( 0x1000, "maincpu", 0 )
|
||||
ROM_LOAD( "us4189779_tmc0271", 0x0000, 0x1000, BAD_DUMP CRC(d3f5a37d) SHA1(f75ab617a6067d4d3a954a9f86126d2089554df8) ) // from patent 4189779, may have errors
|
||||
|
||||
ROM_REGION( 1246, "maincpu:ipla", 0 )
|
||||
ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
|
||||
ROM_REGION( 2127, "maincpu:mpla", 0 )
|
||||
ROM_LOAD( "tms0270_cd2708_mpla.pla", 0, 2127, BAD_DUMP CRC(94333005) SHA1(1583444c73637d859632dd5186cd7e1a2588c78a) ) // taken from cd2708, need to verify if it's same as tmc0271
|
||||
ROM_REGION( 1246, "maincpu:opla", 0 )
|
||||
ROM_LOAD( "tms0270_cd2708_opla.pla", 0, 1246, BAD_DUMP CRC(e70836e2) SHA1(70e7dcdf81ae2052874fb21c504fcc06b2649f9a) ) // "
|
||||
|
||||
ROM_REGION( 0x8000, "tms5100", 0 )
|
||||
ROM_LOAD( "tmc0351.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) )
|
||||
ROM_LOAD( "tmc0352.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( snmath )
|
||||
ROM_REGION( 0x1000, "maincpu", 0 )
|
||||
ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) // from patent 4946391, verified with source code
|
||||
@ -118,10 +307,15 @@ ROM_START( snmath )
|
||||
ROM_REGION( 1246, "maincpu:ipla", 0 )
|
||||
ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
|
||||
ROM_REGION( 2127, "maincpu:mpla", 0 )
|
||||
ROM_LOAD( "tmc0270_cd2708_mpla.pla", 0, 2127, BAD_DUMP CRC(94333005) SHA1(1583444c73637d859632dd5186cd7e1a2588c78a) ) // taken from cd2708, need to verify if it's same as cd2704
|
||||
ROM_LOAD( "tms0270_cd2708_mpla.pla", 0, 2127, BAD_DUMP CRC(94333005) SHA1(1583444c73637d859632dd5186cd7e1a2588c78a) ) // taken from cd2708, need to verify if it's same as cd2704
|
||||
ROM_REGION( 1246, "maincpu:opla", 0 )
|
||||
ROM_LOAD( "tmc0270_cd2708_opla.pla", 0, 1246, BAD_DUMP CRC(e70836e2) SHA1(70e7dcdf81ae2052874fb21c504fcc06b2649f9a) ) // "
|
||||
ROM_LOAD( "tms0270_cd2708_opla.pla", 0, 1246, BAD_DUMP CRC(e70836e2) SHA1(70e7dcdf81ae2052874fb21c504fcc06b2649f9a) ) // "
|
||||
|
||||
ROM_REGION( 0x8000, "tms5100", 0 )
|
||||
ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) )
|
||||
ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) )
|
||||
ROM_END
|
||||
|
||||
|
||||
COMP( 1980, snmath, 0, 0, tispeak, tispeak, driver_device, 0, "Texas Instruments", "Speak & Math (US, prototype)", GAME_NO_SOUND | GAME_NOT_WORKING )
|
||||
COMP( 1978, snspell, 0, 0, tispeak, snspell, driver_device, 0, "Texas Instruments", "Speak & Spell (US, prototype)", GAME_NOT_WORKING )
|
||||
COMP( 1980, snmath, 0, 0, tispeak, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, prototype)", GAME_NOT_WORKING )
|
||||
|
@ -3,11 +3,40 @@
|
||||
|
||||
<!-- define elements -->
|
||||
|
||||
<element name="digit" defstate="0">
|
||||
<led14seg><color red="0.3" green="1.0" blue="0.7" /></led14seg>
|
||||
</element>
|
||||
|
||||
|
||||
<!-- build screen -->
|
||||
|
||||
<view name="Internal Layout">
|
||||
<bounds left="0" right="100" top="0" bottom="100" />
|
||||
|
||||
<bezel name="digit0" element="digit">
|
||||
<bounds x="0" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit1" element="digit">
|
||||
<bounds x="10" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit2" element="digit">
|
||||
<bounds x="20" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit3" element="digit">
|
||||
<bounds x="30" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit4" element="digit">
|
||||
<bounds x="40" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit5" element="digit">
|
||||
<bounds x="50" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit6" element="digit">
|
||||
<bounds x="60" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit7" element="digit">
|
||||
<bounds x="70" y="0" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
</view>
|
||||
</mamelayout>
|
||||
|
@ -1063,6 +1063,7 @@ avigo_es // 1997 Avigo (Spanish)
|
||||
avigo_it // 1997 Avigo (Italian)
|
||||
|
||||
// TI Speak & Spell
|
||||
snspell
|
||||
snmath
|
||||
|
||||
// Texas Instruments Calculators
|
||||
|
Loading…
Reference in New Issue
Block a user