added S2152

This commit is contained in:
hap 2015-02-16 16:34:54 +01:00
parent fe5ebce6a3
commit 409b0c9f6d
3 changed files with 183 additions and 168 deletions

View File

@ -6,7 +6,7 @@
Overall functionality is similar to (and probably derived from) NEC uCOM-4.
References:
- AMI MOS Products Catalog Winter 1979
- AMI MOS Products Catalog 1979/1980
- AMI S2000 Programming Manual (rev. 2)
TODO:
@ -27,71 +27,52 @@
// S2000 is the most basic one, 64 nibbles internal RAM and 1KB internal ROM
// S2150 increased RAM to 80 nibbles and ROM to 1.5KB
// high-voltage output versions of these chips (S2000A and S2150A) are identical overall
const device_type AMI_S2000 = &device_creator<amis2000_device>;
const device_type AMI_S2150 = &device_creator<amis2150_device>;
const device_type AMI_S2000 = &device_creator<amis2000_cpu_device>;
const device_type AMI_S2150 = &device_creator<amis2150_cpu_device>;
// S2152 is an extension to S2150, removing the K pins and adding a better timer
const device_type AMI_S2152 = &device_creator<amis2152_cpu_device>;
// internal memory maps
static ADDRESS_MAP_START(program_1k, AS_PROGRAM, 8, amis2000_device)
static ADDRESS_MAP_START(program_1k, AS_PROGRAM, 8, amis2000_base_device)
AM_RANGE(0x0000, 0x03ff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(program_1_5k, AS_PROGRAM, 8, amis2000_device)
static ADDRESS_MAP_START(program_1_5k, AS_PROGRAM, 8, amis2000_base_device)
AM_RANGE(0x0000, 0x03ff) AM_ROM
AM_RANGE(0x0400, 0x05ff) AM_NOP // 0x00
AM_RANGE(0x0600, 0x07ff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(data_64x4, AS_DATA, 8, amis2000_device)
static ADDRESS_MAP_START(data_64x4, AS_DATA, 8, amis2000_base_device)
AM_RANGE(0x00, 0x3f) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START(data_80x4, AS_DATA, 8, amis2000_device)
static ADDRESS_MAP_START(data_80x4, AS_DATA, 8, amis2000_base_device)
AM_RANGE(0x00, 0x3f) AM_RAM
AM_RANGE(0x40, 0x4f) AM_RAM
ADDRESS_MAP_END
// device definitions
amis2000_device::amis2000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: cpu_device(mconfig, AMI_S2000, "AMI S2000", tag, owner, clock, "amis2000", __FILE__),
m_program_config("program", ENDIANNESS_BIG, 8, 13, 0, ADDRESS_MAP_NAME(program_1k)),
m_data_config("data", ENDIANNESS_BIG, 8, 6, 0, ADDRESS_MAP_NAME(data_64x4)),
m_bu_bits(2),
m_callstack_bits(10),
m_callstack_depth(3),
m_read_k(*this),
m_read_i(*this),
m_read_d(*this),
m_write_d(*this),
m_write_a(*this)
{
}
amis2000_cpu_device::amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: amis2000_base_device(mconfig, AMI_S2000, "AMI S2000", tag, owner, clock, 2, 10, 3, 13, ADDRESS_MAP_NAME(program_1k), 6, ADDRESS_MAP_NAME(data_64x4), "amis2000", __FILE__)
{ }
amis2000_device::amis2000_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 bu_bits, UINT8 callstack_bits, UINT8 callstack_depth, 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, 8, prgwidth, 0, program),
m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data),
m_bu_bits(bu_bits),
m_callstack_bits(callstack_bits),
m_callstack_depth(callstack_depth),
m_read_k(*this),
m_read_i(*this),
m_read_d(*this),
m_write_d(*this),
m_write_a(*this)
{
}
amis2150_cpu_device::amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: amis2000_base_device(mconfig, AMI_S2150, "AMI S2150", tag, owner, clock, 3, 11, 3, 13, ADDRESS_MAP_NAME(program_1_5k), 7, ADDRESS_MAP_NAME(data_80x4), "amis2150", __FILE__)
{ }
amis2152_cpu_device::amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: amis2000_base_device(mconfig, AMI_S2152, "AMI S2152", tag, owner, clock, 3, 11, 3, 13, ADDRESS_MAP_NAME(program_1_5k), 7, ADDRESS_MAP_NAME(data_80x4), "amis2152", __FILE__)
{ }
amis2150_device::amis2150_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: amis2000_device(mconfig, AMI_S2150, "AMI S2150", tag, owner, clock, 3, 11, 3, 13, ADDRESS_MAP_NAME(program_1_5k), 7, ADDRESS_MAP_NAME(data_80x4), "amis2150", __FILE__)
{
}
// disasm
void amis2000_device::state_string_export(const device_state_entry &entry, astring &string)
void amis2000_base_device::state_string_export(const device_state_entry &entry, astring &string)
{
switch (entry.index())
{
@ -110,7 +91,7 @@ void amis2000_device::state_string_export(const device_state_entry &entry, astri
}
}
offs_t amis2000_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
offs_t amis2000_base_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
{
extern CPU_DISASSEMBLE(amis2000);
return CPU_DISASSEMBLE_NAME(amis2000)(this, buffer, pc, oprom, opram, options);
@ -128,7 +109,7 @@ enum
S2000_ACC, S2000_E, S2000_CY
};
void amis2000_device::device_start()
void amis2000_base_device::device_start()
{
m_program = &space(AS_PROGRAM);
m_data = &space(AS_DATA);
@ -138,6 +119,7 @@ void amis2000_device::device_start()
m_read_d.resolve_safe(0);
m_write_d.resolve_safe();
m_write_a.resolve_safe();
m_write_f.resolve_safe();
m_bu_mask = (1 << m_bu_bits) - 1;
m_callstack_mask = (1 << m_callstack_bits) - 1;
@ -202,7 +184,7 @@ void amis2000_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
void amis2000_device::device_reset()
void amis2000_base_device::device_reset()
{
m_pc = 0;
m_op = 0;
@ -220,7 +202,7 @@ void amis2000_device::device_reset()
// execute
//-------------------------------------------------
void amis2000_device::execute_run()
void amis2000_base_device::execute_run()
{
while (m_icount > 0)
{

View File

@ -14,36 +14,53 @@
// generic input pins (4 bits each)
#define MCFG_AMI_S2000_READ_K_CB(_devcb) \
amis2000_device::set_read_k_callback(*device, DEVCB_##_devcb);
amis2000_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
#define MCFG_AMI_S2000_READ_I_CB(_devcb) \
amis2000_device::set_read_i_callback(*device, DEVCB_##_devcb);
amis2000_base_device::set_read_i_callback(*device, DEVCB_##_devcb);
// 8-bit external databus coupled as input/output pins
#define MCFG_AMI_S2000_READ_D_CB(_devcb) \
amis2000_device::set_read_d_callback(*device, DEVCB_##_devcb);
amis2000_base_device::set_read_d_callback(*device, DEVCB_##_devcb);
#define MCFG_AMI_S2000_WRITE_D_CB(_devcb) \
amis2000_device::set_write_d_callback(*device, DEVCB_##_devcb);
amis2000_base_device::set_write_d_callback(*device, DEVCB_##_devcb);
// 13-bit external addressbus coupled as output pins
#define MCFG_AMI_S2000_WRITE_A_CB(_devcb) \
amis2000_device::set_write_a_callback(*device, DEVCB_##_devcb);
amis2000_base_device::set_write_a_callback(*device, DEVCB_##_devcb);
// F_out pin (only for S2152)
#define MCFG_AMI_S2152_FOUT_CB(_devcb) \
amis2000_base_device::set_write_f_callback(*device, DEVCB_##_devcb);
class amis2000_device : public cpu_device
class amis2000_base_device : public cpu_device
{
public:
// construction/destruction
amis2000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
amis2000_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 bu_bits, UINT8 callstack_bits, UINT8 callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
amis2000_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 bu_bits, UINT8 callstack_bits, UINT8 callstack_depth, 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, 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data)
, m_bu_bits(bu_bits)
, m_callstack_bits(callstack_bits)
, m_callstack_depth(callstack_depth)
, m_read_k(*this)
, m_read_i(*this)
, m_read_d(*this)
, m_write_d(*this)
, m_write_a(*this)
, m_write_f(*this)
{ }
// static configuration helpers
template<class _Object> static devcb_base &set_read_k_callback(device_t &device, _Object object) { return downcast<amis2000_device &>(device).m_read_k.set_callback(object); }
template<class _Object> static devcb_base &set_read_i_callback(device_t &device, _Object object) { return downcast<amis2000_device &>(device).m_read_i.set_callback(object); }
template<class _Object> static devcb_base &set_read_d_callback(device_t &device, _Object object) { return downcast<amis2000_device &>(device).m_read_d.set_callback(object); }
template<class _Object> static devcb_base &set_write_d_callback(device_t &device, _Object object) { return downcast<amis2000_device &>(device).m_write_d.set_callback(object); }
template<class _Object> static devcb_base &set_write_a_callback(device_t &device, _Object object) { return downcast<amis2000_device &>(device).m_write_a.set_callback(object); }
template<class _Object> static devcb_base &set_read_k_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_read_k.set_callback(object); }
template<class _Object> static devcb_base &set_read_i_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_read_i.set_callback(object); }
template<class _Object> static devcb_base &set_read_d_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_read_d.set_callback(object); }
template<class _Object> static devcb_base &set_write_d_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_d.set_callback(object); }
template<class _Object> static devcb_base &set_write_a_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_a.set_callback(object); }
template<class _Object> static devcb_base &set_write_f_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_f.set_callback(object); }
protected:
// device-level overrides
@ -103,6 +120,7 @@ protected:
devcb_read8 m_read_d;
devcb_write8 m_write_d;
devcb_write16 m_write_a;
devcb_write_line m_write_f;
// misc internal helpers
UINT8 ram_r();
@ -112,76 +130,91 @@ protected:
void d_latch_out(bool active);
// opcode handlers
void op_lai();
void op_lab();
void op_lae();
void op_xab();
void op_xabu();
void op_xae();
void op_lbe();
void op_lbep();
void op_lbz();
void op_lbf();
virtual void op_lai();
virtual void op_lab();
virtual void op_lae();
virtual void op_xab();
virtual void op_xabu();
virtual void op_xae();
virtual void op_lbe();
virtual void op_lbep();
virtual void op_lbz();
virtual void op_lbf();
void op_lam();
void op_xc();
void op_xci();
void op_xcd();
void op_stm();
void op_rsm();
virtual void op_lam();
virtual void op_xc();
virtual void op_xci();
virtual void op_xcd();
virtual void op_stm();
virtual void op_rsm();
void op_inp();
void op_out();
void op_disb();
void op_disn();
void op_mvs();
void op_psh();
void op_psl();
void op_eur();
virtual void op_inp();
virtual void op_out();
virtual void op_disb();
virtual void op_disn();
virtual void op_mvs();
virtual void op_psh();
virtual void op_psl();
virtual void op_eur();
void op_pp();
void op_jmp();
void op_jms();
void op_rt();
void op_rts();
void op_nop();
void op_halt();
virtual void op_pp();
virtual void op_jmp();
virtual void op_jms();
virtual void op_rt();
virtual void op_rts();
virtual void op_nop();
virtual void op_halt();
void op_szc();
void op_szm();
void op_szi();
void op_szk();
void op_sbe();
void op_sam();
void op_sos();
void op_tf1();
void op_tf2();
virtual void op_szc();
virtual void op_szm();
virtual void op_szi();
virtual void op_szk();
virtual void op_sbe();
virtual void op_sam();
virtual void op_sos();
virtual void op_tf1();
virtual void op_tf2();
void op_adcs();
void op_adis();
void op_add();
void op_and();
void op_xor();
void op_stc();
void op_rsc();
void op_cma();
void op_sf1();
void op_rf1();
void op_sf2();
void op_rf2();
virtual void op_adcs();
virtual void op_adis();
virtual void op_add();
virtual void op_and();
virtual void op_xor();
virtual void op_stc();
virtual void op_rsc();
virtual void op_cma();
virtual void op_sf1();
virtual void op_rf1();
virtual void op_sf2();
virtual void op_rf2();
};
class amis2150_device : public amis2000_device
class amis2000_cpu_device : public amis2000_base_device
{
public:
amis2150_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
class amis2150_cpu_device : public amis2000_base_device
{
public:
amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
class amis2152_cpu_device : public amis2000_base_device
{
public:
amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
extern const device_type AMI_S2000;
extern const device_type AMI_S2150;
extern const device_type AMI_S2152;
#endif /* _AMIS2000_H_ */

View File

@ -2,33 +2,33 @@
// internal helpers
inline UINT8 amis2000_device::ram_r()
inline UINT8 amis2000_base_device::ram_r()
{
UINT16 address = m_bu << 4 | m_bl;
return m_data->read_byte(address) & 0xf;
}
inline void amis2000_device::ram_w(UINT8 data)
inline void amis2000_base_device::ram_w(UINT8 data)
{
UINT16 address = m_bu << 4 | m_bl;
m_data->write_byte(address, data & 0xf);
}
void amis2000_device::pop_callstack()
void amis2000_base_device::pop_callstack()
{
m_pc = (m_pc & ~m_callstack_mask) | (m_callstack[0] & m_callstack_mask);
for (int i = 0; i < m_callstack_depth-1; i++)
m_callstack[i] = m_callstack[i+1];
}
void amis2000_device::push_callstack()
void amis2000_base_device::push_callstack()
{
for (int i = m_callstack_depth-1; i >= 1; i--)
m_callstack[i] = m_callstack[i-1];
m_callstack[0] = m_pc & m_callstack_mask;
}
void amis2000_device::d_latch_out(bool active)
void amis2000_base_device::d_latch_out(bool active)
{
m_write_d(0, active ? (m_d ^ m_d_polarity) : 0, 0xff);
m_d_active = active;
@ -37,7 +37,7 @@ void amis2000_device::d_latch_out(bool active)
// Register Instructions
void amis2000_device::op_lai()
void amis2000_base_device::op_lai()
{
// LAI X: load ACC with X, select I and K inputs
// note: only execute the first one in a sequence of LAI
@ -49,19 +49,19 @@ void amis2000_device::op_lai()
}
}
void amis2000_device::op_lab()
void amis2000_base_device::op_lab()
{
// LAB: load ACC with BL
m_acc = m_bl;
}
void amis2000_device::op_lae()
void amis2000_base_device::op_lae()
{
// LAE: load ACC with E
m_acc = m_e;
}
void amis2000_device::op_xab()
void amis2000_base_device::op_xab()
{
// XAB: exchange ACC with BL
UINT8 old_acc = m_acc;
@ -69,7 +69,7 @@ void amis2000_device::op_xab()
m_bl = old_acc;
}
void amis2000_device::op_xabu()
void amis2000_base_device::op_xabu()
{
// XABU: exchange ACC with BU
UINT8 old_acc = m_acc;
@ -77,7 +77,7 @@ void amis2000_device::op_xabu()
m_bu = old_acc & m_bu_mask;
}
void amis2000_device::op_xae()
void amis2000_base_device::op_xae()
{
// XAE: exchange ACC with E
UINT8 old_acc = m_acc;
@ -85,7 +85,7 @@ void amis2000_device::op_xae()
m_e = old_acc;
}
void amis2000_device::op_lbe()
void amis2000_base_device::op_lbe()
{
// LBE Y: load BU with Y, load BL with E
// note: only execute the first one in a sequence of LB*
@ -97,7 +97,7 @@ void amis2000_device::op_lbe()
}
}
void amis2000_device::op_lbep()
void amis2000_base_device::op_lbep()
{
// LBEP Y: load BU with Y, load BL with E+1
// note: only execute the first one in a sequence of LB*
@ -109,7 +109,7 @@ void amis2000_device::op_lbep()
}
}
void amis2000_device::op_lbz()
void amis2000_base_device::op_lbz()
{
// LBZ Y: load BU with Y, load BL with 0
// note: only execute the first one in a sequence of LB*
@ -121,7 +121,7 @@ void amis2000_device::op_lbz()
}
}
void amis2000_device::op_lbf()
void amis2000_base_device::op_lbf()
{
// LBF Y: load BU with Y, load BL with 15
// note: only execute the first one in a sequence of LB*
@ -136,7 +136,7 @@ void amis2000_device::op_lbf()
// RAM Instructions
void amis2000_device::op_lam()
void amis2000_base_device::op_lam()
{
// LAM _Y: load ACC with RAM, xor BU with _Y
m_acc = ram_r();
@ -144,7 +144,7 @@ void amis2000_device::op_lam()
m_bu ^= (param & m_bu_mask);
}
void amis2000_device::op_xc()
void amis2000_base_device::op_xc()
{
// XC _Y: exchange ACC with RAM, xor BU with _Y
UINT8 old_acc = m_acc;
@ -154,7 +154,7 @@ void amis2000_device::op_xc()
m_bu ^= (param & m_bu_mask);
}
void amis2000_device::op_xci()
void amis2000_base_device::op_xci()
{
// XCI _Y: exchange ACC with RAM, increment BL(skip next on carry), xor BU with _Y
op_xc();
@ -162,7 +162,7 @@ void amis2000_device::op_xci()
m_skip = (m_bl == 0);
}
void amis2000_device::op_xcd()
void amis2000_base_device::op_xcd()
{
// XCD _Y: exchange ACC with RAM, decrement BL(skip next on carry), xor BU with _Y
op_xc();
@ -170,14 +170,14 @@ void amis2000_device::op_xcd()
m_skip = (m_bl == 0xf);
}
void amis2000_device::op_stm()
void amis2000_base_device::op_stm()
{
// STM Z: set RAM bit Z
UINT8 param = 1 << (m_op & 0x03);
ram_w(ram_r() | param);
}
void amis2000_device::op_rsm()
void amis2000_base_device::op_rsm()
{
// RSM Z: reset RAM bit Z
UINT8 param = 1 << (m_op & 0x03);
@ -187,7 +187,7 @@ void amis2000_device::op_rsm()
// Input/Output Instructions
void amis2000_device::op_inp()
void amis2000_base_device::op_inp()
{
// INP: input D-pins to ACC and RAM
UINT8 in = m_d_active ? m_d : m_read_d(0, 0xff);
@ -195,20 +195,20 @@ void amis2000_device::op_inp()
ram_w(in >> 4 & 0xf);
}
void amis2000_device::op_out()
void amis2000_base_device::op_out()
{
// OUT: pulse output ACC and RAM to D-pins
logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_pc);
}
void amis2000_device::op_disb()
void amis2000_base_device::op_disb()
{
// DISB: set D-latch to ACC and RAM directly
m_d = m_acc | ram_r() << 4;
d_latch_out(true);
}
void amis2000_device::op_disn()
void amis2000_base_device::op_disn()
{
// DISN: set D-latch to ACC+carry via on-die segment decoder
static const UINT8 lut_segment_decoder[0x10] =
@ -220,14 +220,14 @@ void amis2000_device::op_disn()
d_latch_out(true);
}
void amis2000_device::op_mvs()
void amis2000_base_device::op_mvs()
{
// MVS: output master strobe latch to A-pins
d_latch_out(false);
m_write_a(0, m_a, 0xffff);
}
void amis2000_device::op_psh()
void amis2000_base_device::op_psh()
{
// PSH: preset high(BL) master strobe latch
switch (m_bl)
@ -254,7 +254,7 @@ void amis2000_device::op_psh()
}
}
void amis2000_device::op_psl()
void amis2000_base_device::op_psl()
{
// PSL: preset low(BL) master strobe latch
switch (m_bl)
@ -281,7 +281,7 @@ void amis2000_device::op_psl()
}
}
void amis2000_device::op_eur()
void amis2000_base_device::op_eur()
{
// EUR: set timer frequency(European) and D-latch polarity, via ACC
m_d_polarity = (m_acc & 1) ? 0x00 : 0xff;
@ -291,7 +291,7 @@ void amis2000_device::op_eur()
// Program Control Instructions
void amis2000_device::op_pp()
void amis2000_base_device::op_pp()
{
// PP _X: prepare page/bank with _X
UINT8 param = ~m_op & 0x0f;
@ -301,7 +301,7 @@ void amis2000_device::op_pp()
m_pbr = param & 7;
}
void amis2000_device::op_jmp()
void amis2000_base_device::op_jmp()
{
// JMP X: jump to X(+PP)
UINT16 mask = 0x3f;
@ -316,7 +316,7 @@ void amis2000_device::op_jmp()
m_pc = (m_pc & ~mask) | param;
}
void amis2000_device::op_jms()
void amis2000_base_device::op_jms()
{
// JMS X: call to X(+PP)
m_icount--;
@ -328,25 +328,25 @@ void amis2000_device::op_jms()
m_pc |= 0x3c0;
}
void amis2000_device::op_rt()
void amis2000_base_device::op_rt()
{
// RT: return from subroutine
pop_callstack();
}
void amis2000_device::op_rts()
void amis2000_base_device::op_rts()
{
// RTS: return from subroutine and skip next
op_rt();
m_skip = true;
}
void amis2000_device::op_nop()
void amis2000_base_device::op_nop()
{
// NOP: no operation
}
void amis2000_device::op_halt()
void amis2000_base_device::op_halt()
{
// HALT: debugger breakpoint for devkit-use
logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_pc);
@ -355,56 +355,56 @@ void amis2000_device::op_halt()
// Skip Instructions
void amis2000_device::op_szc()
void amis2000_base_device::op_szc()
{
// SZC: skip next on zero(no) carry
m_skip = !m_carry;
}
void amis2000_device::op_szm()
void amis2000_base_device::op_szm()
{
// SZM Z: skip next on zero RAM bit Z
UINT8 param = 1 << (m_op & 0x03);
m_skip = !(ram_r() & param);
}
void amis2000_device::op_szi()
void amis2000_base_device::op_szi()
{
// SZI: skip next on I pin(s)
m_skip = ((~m_read_i(0, 0xff) & m_ki_mask) != 0);
}
void amis2000_device::op_szk()
void amis2000_base_device::op_szk()
{
// SZK: skip next on K pin(s)
m_skip = ((~m_read_k(0, 0xff) & m_ki_mask) != 0);
}
void amis2000_device::op_sbe()
void amis2000_base_device::op_sbe()
{
// SBE: skip next on BL equals E
m_skip = (m_bl == m_e);
}
void amis2000_device::op_sam()
void amis2000_base_device::op_sam()
{
// SAM: skip next on ACC equals RAM
m_skip = (m_acc == ram_r());
}
void amis2000_device::op_sos()
void amis2000_base_device::op_sos()
{
// SOS: skip next on SF(timer output), clear SF
logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_pc);
}
void amis2000_device::op_tf1()
void amis2000_base_device::op_tf1()
{
// TF1: skip next on flag 1
m_skip = ((m_f & 0x01) != 0);
}
void amis2000_device::op_tf2()
void amis2000_base_device::op_tf2()
{
// TF2: skip next on flag 2
m_skip = ((m_f & 0x02) != 0);
@ -413,7 +413,7 @@ void amis2000_device::op_tf2()
// Arithmetic and Logical Instructions
void amis2000_device::op_adcs()
void amis2000_base_device::op_adcs()
{
// ADCS: add RAM to ACC+carry, skip next on not carry
m_acc += ram_r() + m_carry;
@ -422,7 +422,7 @@ void amis2000_device::op_adcs()
m_acc &= 0xf;
}
void amis2000_device::op_adis()
void amis2000_base_device::op_adis()
{
// ADIS X: add X to ACC, skip next on not carry
UINT8 param = m_op & 0x0f;
@ -431,61 +431,61 @@ void amis2000_device::op_adis()
m_acc &= 0xf;
}
void amis2000_device::op_add()
void amis2000_base_device::op_add()
{
// ADD: add RAM to ACC
m_acc = (m_acc + ram_r()) & 0xf;
}
void amis2000_device::op_and()
void amis2000_base_device::op_and()
{
// AND: and ACC with RAM
m_acc &= ram_r();
}
void amis2000_device::op_xor()
void amis2000_base_device::op_xor()
{
// XOR: xor ACC with RAM
m_acc ^= ram_r();
}
void amis2000_device::op_stc()
void amis2000_base_device::op_stc()
{
// STC: set carry
m_carry = 1;
}
void amis2000_device::op_rsc()
void amis2000_base_device::op_rsc()
{
// RSC: reset carry
m_carry = 0;
}
void amis2000_device::op_cma()
void amis2000_base_device::op_cma()
{
// CMA: complement ACC
m_acc ^= 0xf;
}
void amis2000_device::op_sf1()
void amis2000_base_device::op_sf1()
{
// SF1: set flag 1
m_f |= 0x01;
}
void amis2000_device::op_rf1()
void amis2000_base_device::op_rf1()
{
// RF1: reset flag 1
m_f &= ~0x01;
}
void amis2000_device::op_sf2()
void amis2000_base_device::op_sf2()
{
// SF2: set flag 2
m_f |= 0x02;
}
void amis2000_device::op_rf2()
void amis2000_base_device::op_rf2()
{
// RF2: reset flag 2
m_f &= ~0x02;