mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
added branch opcodes
This commit is contained in:
parent
b53dab53b0
commit
151bd510c9
@ -140,8 +140,10 @@ void hmcs40_cpu_device::device_start()
|
||||
// zerofill
|
||||
memset(m_stack, 0, sizeof(m_stack));
|
||||
m_op = 0;
|
||||
m_prev_op = 0;
|
||||
m_arg = 0;
|
||||
m_pc = 0;
|
||||
m_page = 0;
|
||||
m_a = 0;
|
||||
m_b = 0;
|
||||
m_x = 0;
|
||||
@ -154,8 +156,10 @@ void hmcs40_cpu_device::device_start()
|
||||
// register for savestates
|
||||
save_item(NAME(m_stack));
|
||||
save_item(NAME(m_op));
|
||||
save_item(NAME(m_prev_op));
|
||||
save_item(NAME(m_arg));
|
||||
save_item(NAME(m_pc));
|
||||
save_item(NAME(m_page));
|
||||
save_item(NAME(m_a));
|
||||
save_item(NAME(m_b));
|
||||
save_item(NAME(m_x));
|
||||
@ -216,7 +220,7 @@ inline void hmcs40_cpu_device::increment_pc()
|
||||
inline void hmcs40_cpu_device::fetch_arg()
|
||||
{
|
||||
// P is the only 2-byte opcode
|
||||
if (m_op == 0x3ff)
|
||||
if ((m_op & 0x3f8) == 0x368)
|
||||
{
|
||||
m_icount--;
|
||||
m_arg = m_program->read_word(m_pc << 1);
|
||||
@ -230,6 +234,14 @@ void hmcs40_cpu_device::execute_run()
|
||||
{
|
||||
m_icount--;
|
||||
|
||||
// LPU is handled 1 cycle later
|
||||
if ((m_prev_op & 0x3e0) == 0x340)
|
||||
m_pc = ((m_page << 6) | (m_pc & 0x3f)) & m_prgmask;
|
||||
|
||||
// remember previous opcode
|
||||
m_prev_op = m_op;
|
||||
|
||||
// fetch next opcode
|
||||
debugger_instruction_hook(this, m_pc << 1);
|
||||
m_op = m_program->read_word(m_pc << 1);
|
||||
increment_pc();
|
||||
|
@ -72,10 +72,12 @@ protected:
|
||||
int m_stack_levels; // number of callstack levels
|
||||
UINT16 m_stack[4]; // max 4
|
||||
UINT16 m_op;
|
||||
UINT16 m_prev_op;
|
||||
UINT16 m_arg;
|
||||
int m_icount;
|
||||
|
||||
UINT16 m_pc; // Program Counter
|
||||
UINT8 m_page; // LPU prepared page
|
||||
UINT8 m_a; // 4-bit Accumulator
|
||||
UINT8 m_b; // 4-bit B register
|
||||
UINT8 m_x; // 1/3/4-bit X register
|
||||
|
@ -431,31 +431,43 @@ void hmcs40_cpu_device::op_tm()
|
||||
void hmcs40_cpu_device::op_br()
|
||||
{
|
||||
// BR a: Branch on Status 1
|
||||
op_illegal();
|
||||
if (m_s)
|
||||
m_pc = (m_pc & ~0x3f) | (m_op & 0x3f);
|
||||
else
|
||||
m_s = 1;
|
||||
}
|
||||
|
||||
void hmcs40_cpu_device::op_cal()
|
||||
{
|
||||
// CAL a: Subroutine Jump on Status 1
|
||||
op_illegal();
|
||||
if (m_s)
|
||||
{
|
||||
push_stack();
|
||||
m_pc = m_op & 0x3f; // short calls default to page 0
|
||||
}
|
||||
else
|
||||
m_s = 1;
|
||||
}
|
||||
|
||||
void hmcs40_cpu_device::op_lpu()
|
||||
{
|
||||
// LPU u: Load Program Counter Upper on Status 1
|
||||
op_illegal();
|
||||
if (m_s)
|
||||
m_page = m_op & 0x1f;
|
||||
else
|
||||
m_op = 0;
|
||||
}
|
||||
|
||||
void hmcs40_cpu_device::op_tbr()
|
||||
{
|
||||
// TBR p: Table Branch
|
||||
op_illegal();
|
||||
m_pc = (m_a | m_b << 4 | m_c << 8 | ((m_op & 7) << 9)) & m_prgmask;
|
||||
}
|
||||
|
||||
void hmcs40_cpu_device::op_rtn()
|
||||
{
|
||||
// RTN: Return from Subroutine
|
||||
op_illegal();
|
||||
pop_stack();
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user