mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00
added the rest of straightforward opcodes
This commit is contained in:
parent
7ef831ab26
commit
2dfeced11b
@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
Hitachi HMCS40 MCU family cores
|
Hitachi HMCS40 MCU family cores
|
||||||
|
|
||||||
|
References:
|
||||||
|
- 1985 #AP1 Hitachi 4-bit Single-Chip Microcomputer Data Book
|
||||||
|
- 1988 HMCS400 Series Handbook (note: *400 is a newer MCU series, with similarities)
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hmcs40.h"
|
#include "hmcs40.h"
|
||||||
|
@ -242,97 +242,121 @@ void hmcs40_cpu_device::op_lbi()
|
|||||||
void hmcs40_cpu_device::op_ai()
|
void hmcs40_cpu_device::op_ai()
|
||||||
{
|
{
|
||||||
// AI i: Add Immediate to A
|
// AI i: Add Immediate to A
|
||||||
op_illegal();
|
m_a += (m_op & 0xf);
|
||||||
|
m_s = m_a >> 4 & 1;
|
||||||
|
m_a &= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_ib()
|
void hmcs40_cpu_device::op_ib()
|
||||||
{
|
{
|
||||||
// IB: Increment B
|
// IB: Increment B
|
||||||
op_illegal();
|
m_b = (m_b + 1) & 0xf;
|
||||||
|
m_s = (m_b != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_db()
|
void hmcs40_cpu_device::op_db()
|
||||||
{
|
{
|
||||||
// DB: Decrement B
|
// DB: Decrement B
|
||||||
op_illegal();
|
m_b = (m_b - 1) & 0xf;
|
||||||
|
m_s = (m_b != 0xf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_amc()
|
void hmcs40_cpu_device::op_amc()
|
||||||
{
|
{
|
||||||
// AMC: Add A to Memory with Carry
|
// AMC: Add A to Memory with Carry
|
||||||
op_illegal();
|
m_a += ram_r() + m_c;
|
||||||
|
m_c = m_a >> 4 & 1;
|
||||||
|
m_s = m_c;
|
||||||
|
m_a &= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_smc()
|
void hmcs40_cpu_device::op_smc()
|
||||||
{
|
{
|
||||||
// SMC: Subtract A from Memory with Carry
|
// SMC: Subtract A from Memory with Carry
|
||||||
op_illegal();
|
m_a = ram_r() - m_a - (m_c ^ 1);
|
||||||
|
m_c = ~m_a >> 4 & 1;
|
||||||
|
m_s = m_c;
|
||||||
|
m_a &= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_am()
|
void hmcs40_cpu_device::op_am()
|
||||||
{
|
{
|
||||||
// AM: Add A to Memory
|
// AM: Add A to Memory
|
||||||
op_illegal();
|
m_a += ram_r();
|
||||||
|
m_s = m_a >> 4 & 1;
|
||||||
|
m_a &= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_daa()
|
void hmcs40_cpu_device::op_daa()
|
||||||
{
|
{
|
||||||
// DAA: Decimal Adjust for Addition
|
// DAA: Decimal Adjust for Addition
|
||||||
op_illegal();
|
if (m_c || m_a > 9)
|
||||||
|
{
|
||||||
|
m_a = (m_a + 6) & 0xf;
|
||||||
|
m_c = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_das()
|
void hmcs40_cpu_device::op_das()
|
||||||
{
|
{
|
||||||
// DAS: Decimal Adjust for Subtraction
|
// DAS: Decimal Adjust for Subtraction
|
||||||
op_illegal();
|
if (!m_c || m_a > 9)
|
||||||
|
{
|
||||||
|
m_a = (m_a + 10) & 0xf;
|
||||||
|
m_c = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_nega()
|
void hmcs40_cpu_device::op_nega()
|
||||||
{
|
{
|
||||||
// NEGA: Negate A
|
// NEGA: Negate A
|
||||||
op_illegal();
|
m_a = (0 - m_a) & 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_comb()
|
void hmcs40_cpu_device::op_comb()
|
||||||
{
|
{
|
||||||
// COMB: Complement B
|
// COMB: Complement B
|
||||||
op_illegal();
|
m_b ^= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_sec()
|
void hmcs40_cpu_device::op_sec()
|
||||||
{
|
{
|
||||||
// SEC: Set Carry
|
// SEC: Set Carry
|
||||||
op_illegal();
|
m_c = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_rec()
|
void hmcs40_cpu_device::op_rec()
|
||||||
{
|
{
|
||||||
// REC: Reset Carry
|
// REC: Reset Carry
|
||||||
op_illegal();
|
m_c = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_tc()
|
void hmcs40_cpu_device::op_tc()
|
||||||
{
|
{
|
||||||
// TC: Test Carry
|
// TC: Test Carry
|
||||||
op_illegal();
|
m_s = m_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_rotl()
|
void hmcs40_cpu_device::op_rotl()
|
||||||
{
|
{
|
||||||
// ROTL: Rotate Left A with Carry
|
// ROTL: Rotate Left A with Carry
|
||||||
op_illegal();
|
m_a = m_a << 1 | m_c;
|
||||||
|
m_c = m_a >> 4 & 1;
|
||||||
|
m_a &= 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_rotr()
|
void hmcs40_cpu_device::op_rotr()
|
||||||
{
|
{
|
||||||
// ROTR: Rotate Right A with Carry
|
// ROTR: Rotate Right A with Carry
|
||||||
op_illegal();
|
UINT8 c = m_a & 1;
|
||||||
|
m_a = m_a >> 1 | m_c << 3;
|
||||||
|
m_c = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_or()
|
void hmcs40_cpu_device::op_or()
|
||||||
{
|
{
|
||||||
// OR: OR A and B
|
// OR: OR A and B
|
||||||
op_illegal();
|
m_a |= m_b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -341,43 +365,43 @@ void hmcs40_cpu_device::op_or()
|
|||||||
void hmcs40_cpu_device::op_mnei()
|
void hmcs40_cpu_device::op_mnei()
|
||||||
{
|
{
|
||||||
// MNEI i: Memory Not Equal to Immediate
|
// MNEI i: Memory Not Equal to Immediate
|
||||||
op_illegal();
|
m_s = (ram_r() != (m_op & 0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_ynei()
|
void hmcs40_cpu_device::op_ynei()
|
||||||
{
|
{
|
||||||
// YNEI i: Y Not Equal to Immediate
|
// YNEI i: Y Not Equal to Immediate
|
||||||
op_illegal();
|
m_s = (m_y != (m_op & 0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_anem()
|
void hmcs40_cpu_device::op_anem()
|
||||||
{
|
{
|
||||||
// ANEM: A Not Equal to Memory
|
// ANEM: A Not Equal to Memory
|
||||||
op_illegal();
|
m_s = (m_a != ram_r());
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_bnem()
|
void hmcs40_cpu_device::op_bnem()
|
||||||
{
|
{
|
||||||
// BNEM: B Not Equal to Memory
|
// BNEM: B Not Equal to Memory
|
||||||
op_illegal();
|
m_s = (m_b != ram_r());
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_alei()
|
void hmcs40_cpu_device::op_alei()
|
||||||
{
|
{
|
||||||
// ALEI i: A Less or Equal to Immediate
|
// ALEI i: A Less or Equal to Immediate
|
||||||
op_illegal();
|
m_s = (m_a <= (m_op & 0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_alem()
|
void hmcs40_cpu_device::op_alem()
|
||||||
{
|
{
|
||||||
// ALEM: A Less or Equal to Memory
|
// ALEM: A Less or Equal to Memory
|
||||||
op_illegal();
|
m_s = (m_a <= ram_r());
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_blem()
|
void hmcs40_cpu_device::op_blem()
|
||||||
{
|
{
|
||||||
// BLEM: B Less or Equal to Memory
|
// BLEM: B Less or Equal to Memory
|
||||||
op_illegal();
|
m_s = (m_b <= ram_r());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -386,19 +410,19 @@ void hmcs40_cpu_device::op_blem()
|
|||||||
void hmcs40_cpu_device::op_sem()
|
void hmcs40_cpu_device::op_sem()
|
||||||
{
|
{
|
||||||
// SEM n: Set Memory Bit
|
// SEM n: Set Memory Bit
|
||||||
op_illegal();
|
ram_w(ram_r() | (1 << (m_op & 3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_rem()
|
void hmcs40_cpu_device::op_rem()
|
||||||
{
|
{
|
||||||
// REM n: Reset Memory Bit
|
// REM n: Reset Memory Bit
|
||||||
op_illegal();
|
ram_w(ram_r() & ~(1 << (m_op & 3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmcs40_cpu_device::op_tm()
|
void hmcs40_cpu_device::op_tm()
|
||||||
{
|
{
|
||||||
// TM n: Test Memory Bit
|
// TM n: Test Memory Bit
|
||||||
op_illegal();
|
m_s = ((ram_r() & (1 << (m_op & 3))) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user