mirror of
https://github.com/holub/mame
synced 2025-07-05 01:48:29 +03:00
m6809: Partially qualify the dummy cycles
This commit is contained in:
parent
3126350d35
commit
ac0c0344f5
@ -51,7 +51,10 @@ INTERRUPT_VECTOR:
|
|||||||
NEG8:
|
NEG8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags(CC_NZVC, (uint8_t)0, m_temp.b.l, -m_temp.b.l);
|
m_temp.b.l = set_flags(CC_NZVC, (uint8_t)0, m_temp.b.l, -m_temp.b.l);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -60,7 +63,10 @@ COM8:
|
|||||||
m_cc &= ~CC_V;
|
m_cc &= ~CC_V;
|
||||||
m_cc |= CC_C;
|
m_cc |= CC_C;
|
||||||
m_temp.b.l = set_flags(CC_NZ, (uint8_t) ~m_temp.b.l);
|
m_temp.b.l = set_flags(CC_NZ, (uint8_t) ~m_temp.b.l);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -69,14 +75,20 @@ LSR8:
|
|||||||
m_cc &= ~CC_C;
|
m_cc &= ~CC_C;
|
||||||
m_cc |= (m_temp.b.l & 1) ? CC_C : 0;
|
m_cc |= (m_temp.b.l & 1) ? CC_C : 0;
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZ, m_temp.b.l >> 1);
|
m_temp.b.l = set_flags<uint8_t>(CC_NZ, m_temp.b.l >> 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ROR8:
|
ROR8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZ, rotate_right(m_temp.b.l));
|
m_temp.b.l = set_flags<uint8_t>(CC_NZ, rotate_right(m_temp.b.l));
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -85,43 +97,64 @@ ASR8:
|
|||||||
m_cc &= ~CC_C;
|
m_cc &= ~CC_C;
|
||||||
m_cc |= (m_temp.b.l & 1) ? CC_C : 0;
|
m_cc |= (m_temp.b.l & 1) ? CC_C : 0;
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZ, ((int8_t) m_temp.b.l) >> 1);
|
m_temp.b.l = set_flags<uint8_t>(CC_NZ, ((int8_t) m_temp.b.l) >> 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ASL8:
|
ASL8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZVC, m_temp.b.l, m_temp.b.l, m_temp.b.l << 1);
|
m_temp.b.l = set_flags<uint8_t>(CC_NZVC, m_temp.b.l, m_temp.b.l, m_temp.b.l << 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ROL8:
|
ROL8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, m_temp.b.l, rotate_left(m_temp.b.l));
|
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, m_temp.b.l, rotate_left(m_temp.b.l));
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DEC8:
|
DEC8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, 1, m_temp.b.l - 1);
|
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, 1, m_temp.b.l - 1);
|
||||||
@eat(hd6309_native_mode() && is_register_addressing_mode() ? 0 : 1);
|
if(!hd6309_native_mode() || !is_register_addressing_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
INC8:
|
INC8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, 1, m_temp.b.l + 1);
|
m_temp.b.l = set_flags<uint8_t>(CC_NZV, m_temp.b.l, 1, m_temp.b.l + 1);
|
||||||
@eat(hd6309_native_mode() && is_register_addressing_mode() ? 0 : 1);
|
if(!hd6309_native_mode() || !is_register_addressing_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(m_temp.b.l);
|
@write_operand(m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TST8:
|
TST8:
|
||||||
@m_temp.b.l = read_operand();
|
@m_temp.b.l = read_operand();
|
||||||
set_flags(CC_NZV, m_temp.b.l);
|
set_flags(CC_NZV, m_temp.b.l);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
eat(is_register_addressing_mode() ? 0 : 1);
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
|
if(!is_register_addressing_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
JMP:
|
JMP:
|
||||||
@ -132,7 +165,10 @@ CLR8:
|
|||||||
@read_operand();
|
@read_operand();
|
||||||
m_cc &= ~CC_NZVC;
|
m_cc &= ~CC_NZVC;
|
||||||
m_cc |= CC_Z;
|
m_cc |= CC_Z;
|
||||||
@eat(hd6309_native_mode() && is_register_addressing_mode() ? 0 : 1);
|
if(!hd6309_native_mode() || !is_register_addressing_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0);
|
@write_operand(0);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -140,7 +176,10 @@ NEG16:
|
|||||||
m_temp.b.h = read_operand(0);
|
m_temp.b.h = read_operand(0);
|
||||||
m_temp.b.l = read_operand(1);
|
m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags(CC_NZVC, (uint16_t)0, m_temp.w, -m_temp.w);
|
m_temp.w = set_flags(CC_NZVC, (uint16_t)0, m_temp.w, -m_temp.w);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
write_operand(0, m_temp.b.h);
|
write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -151,7 +190,10 @@ LSR16:
|
|||||||
m_cc &= ~CC_C;
|
m_cc &= ~CC_C;
|
||||||
m_cc |= (m_temp.w & 1) ? CC_C : 0;
|
m_cc |= (m_temp.w & 1) ? CC_C : 0;
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZ, m_temp.w >> 1);
|
m_temp.w = set_flags<uint16_t>(CC_NZ, m_temp.w >> 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0, m_temp.b.h);
|
@write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -160,7 +202,10 @@ ROR16:
|
|||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZ, rotate_right(m_temp.w));
|
m_temp.w = set_flags<uint16_t>(CC_NZ, rotate_right(m_temp.w));
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0, m_temp.b.h);
|
@write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -171,7 +216,10 @@ ASR16:
|
|||||||
m_cc &= ~CC_C;
|
m_cc &= ~CC_C;
|
||||||
m_cc |= (m_temp.w & 1) ? CC_C : 0;
|
m_cc |= (m_temp.w & 1) ? CC_C : 0;
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZ, ((int16_t) m_temp.w) >> 1);
|
m_temp.w = set_flags<uint16_t>(CC_NZ, ((int16_t) m_temp.w) >> 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0, m_temp.b.h);
|
@write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -180,7 +228,10 @@ ASL16:
|
|||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, m_temp.w, m_temp.w << 1);
|
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, m_temp.w, m_temp.w << 1);
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0, m_temp.b.h);
|
@write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -189,7 +240,10 @@ ROL16:
|
|||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZV, rotate_left(m_temp.w));
|
m_temp.w = set_flags<uint16_t>(CC_NZV, rotate_left(m_temp.w));
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
@write_operand(0, m_temp.b.h);
|
@write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -198,7 +252,10 @@ DEC16:
|
|||||||
m_temp.b.h = read_operand(0);
|
m_temp.b.h = read_operand(0);
|
||||||
m_temp.b.l = read_operand(1);
|
m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, 1, m_temp.w - 1);
|
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, 1, m_temp.w - 1);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
write_operand(0, m_temp.b.h);
|
write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -207,7 +264,10 @@ INC16:
|
|||||||
m_temp.b.h = read_operand(0);
|
m_temp.b.h = read_operand(0);
|
||||||
m_temp.b.l = read_operand(1);
|
m_temp.b.l = read_operand(1);
|
||||||
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, 1, m_temp.w + 1);
|
m_temp.w = set_flags<uint16_t>(CC_NZVC, m_temp.w, 1, m_temp.w + 1);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
write_operand(0, m_temp.b.h);
|
write_operand(0, m_temp.b.h);
|
||||||
write_operand(1, m_temp.b.l);
|
write_operand(1, m_temp.b.l);
|
||||||
return;
|
return;
|
||||||
@ -216,12 +276,21 @@ TST16:
|
|||||||
m_temp.b.h = read_operand(0);
|
m_temp.b.h = read_operand(0);
|
||||||
m_temp.b.l = read_operand(1);
|
m_temp.b.l = read_operand(1);
|
||||||
set_flags(CC_NZV, m_temp.w);
|
set_flags(CC_NZV, m_temp.w);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
eat(is_register_addressing_mode() ? 0 : 1);
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
|
if(!is_register_addressing_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CLR16:
|
CLR16:
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
m_cc &= ~CC_NZVC;
|
m_cc &= ~CC_NZVC;
|
||||||
m_cc |= CC_Z;
|
m_cc |= CC_Z;
|
||||||
write_operand(0, 0x00);
|
write_operand(0, 0x00);
|
||||||
@ -277,21 +346,30 @@ ADD16:
|
|||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
regop16().w = set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w + m_temp.w);
|
regop16().w = set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w + m_temp.w);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SUB16:
|
SUB16:
|
||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
regop16().w = set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w - m_temp.w);
|
regop16().w = set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w - m_temp.w);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CMP16:
|
CMP16:
|
||||||
@m_temp.b.h = read_operand(0);
|
@m_temp.b.h = read_operand(0);
|
||||||
@m_temp.b.l = read_operand(1);
|
@m_temp.b.l = read_operand(1);
|
||||||
set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w - m_temp.w);
|
set_flags(CC_NZVC, regop16().w, m_temp.w, regop16().w - m_temp.w);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LD8:
|
LD8:
|
||||||
@ -318,7 +396,10 @@ ST16:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
NOP:
|
NOP:
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SYNC:
|
SYNC:
|
||||||
@ -342,12 +423,18 @@ SYNC:
|
|||||||
|
|
||||||
DAA:
|
DAA:
|
||||||
daa();
|
daa();
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ORCC:
|
ORCC:
|
||||||
m_cc |= read_operand();
|
m_cc |= read_operand();
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ANDCC:
|
ANDCC:
|
||||||
@ -357,12 +444,18 @@ ANDCC:
|
|||||||
|
|
||||||
SEX:
|
SEX:
|
||||||
m_q.r.d = set_flags<uint16_t>(CC_NZ, (int8_t) m_q.r.b);
|
m_q.r.d = set_flags<uint16_t>(CC_NZ, (int8_t) m_q.r.b);
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BRANCH:
|
BRANCH:
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
eat(1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
if (branch_taken())
|
if (branch_taken())
|
||||||
{
|
{
|
||||||
m_pc.w += (int8_t) m_temp.b.l;
|
m_pc.w += (int8_t) m_temp.b.l;
|
||||||
@ -372,29 +465,36 @@ BRANCH:
|
|||||||
LBRANCH:
|
LBRANCH:
|
||||||
@m_temp.b.h = read_opcode_arg();
|
@m_temp.b.h = read_opcode_arg();
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
eat(1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
if (branch_taken())
|
if (branch_taken())
|
||||||
{
|
{
|
||||||
m_pc.w += m_temp.w;
|
m_pc.w += m_temp.w;
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BSR:
|
BSR:
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
m_ea.w = m_pc.w + (int8_t) m_temp.b.l;
|
m_ea.w = m_pc.w + (int8_t) m_temp.b.l;
|
||||||
@eat(hd6309_native_mode() ? 2 : 3);
|
@dummy_vma(hd6309_native_mode() ? 2 : 3);
|
||||||
goto GOTO_SUBROUTINE;
|
goto GOTO_SUBROUTINE;
|
||||||
|
|
||||||
LBSR:
|
LBSR:
|
||||||
@m_temp.b.h = read_opcode_arg();
|
@m_temp.b.h = read_opcode_arg();
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
m_ea.w = m_pc.w + (int16_t) m_temp.w;
|
m_ea.w = m_pc.w + (int16_t) m_temp.w;
|
||||||
@eat(hd6309_native_mode() ? 2 : 4);
|
@dummy_vma(hd6309_native_mode() ? 2 : 4);
|
||||||
goto GOTO_SUBROUTINE;
|
goto GOTO_SUBROUTINE;
|
||||||
|
|
||||||
JSR:
|
JSR:
|
||||||
@eat(2);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
goto GOTO_SUBROUTINE;
|
goto GOTO_SUBROUTINE;
|
||||||
|
|
||||||
GOTO_SUBROUTINE:
|
GOTO_SUBROUTINE:
|
||||||
@ -405,18 +505,26 @@ GOTO_SUBROUTINE:
|
|||||||
|
|
||||||
RTS:
|
RTS:
|
||||||
m_temp.w = 0x80; // RTS is equivalent to "PULS PC"
|
m_temp.w = 0x80; // RTS is equivalent to "PULS PC"
|
||||||
eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
set_regop16(m_s);
|
set_regop16(m_s);
|
||||||
goto PULL_REGISTERS;
|
goto PULL_REGISTERS;
|
||||||
|
|
||||||
ABX:
|
ABX:
|
||||||
m_x.w += m_q.r.b;
|
m_x.w += m_q.r.b;
|
||||||
eat(hd6309_native_mode() ? 0 : 2);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MUL:
|
MUL:
|
||||||
mul();
|
mul();
|
||||||
eat(hd6309_native_mode() ? 9 : 10);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(hd6309_native_mode() ? 8 : 9);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RTI:
|
RTI:
|
||||||
@ -428,7 +536,8 @@ RTI:
|
|||||||
|
|
||||||
CWAI:
|
CWAI:
|
||||||
@m_cc &= read_opcode_arg();
|
@m_cc &= read_opcode_arg();
|
||||||
@eat(2);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
|
|
||||||
m_cc |= CC_E;
|
m_cc |= CC_E;
|
||||||
set_regop16(m_s);
|
set_regop16(m_s);
|
||||||
@ -466,14 +575,14 @@ CWAI:
|
|||||||
|
|
||||||
LEA_xy:
|
LEA_xy:
|
||||||
regop16().w = set_flags(CC_Z, m_ea.w);
|
regop16().w = set_flags(CC_Z, m_ea.w);
|
||||||
eat(1);
|
@dummy_vma(1);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LEA_us:
|
LEA_us:
|
||||||
if (®op16() == &m_s)
|
if (®op16() == &m_s)
|
||||||
m_lds_encountered = true;
|
m_lds_encountered = true;
|
||||||
regop16().w = m_ea.w;
|
regop16().w = m_ea.w;
|
||||||
eat(1);
|
@dummy_vma(1);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PSHS:
|
PSHS:
|
||||||
@ -532,7 +641,10 @@ SOFTWARE_INTERRUPT:
|
|||||||
|
|
||||||
DIRECT:
|
DIRECT:
|
||||||
@set_ea(((uint16_t)m_dp << 8) | read_opcode_arg());
|
@set_ea(((uint16_t)m_dp << 8) | read_opcode_arg());
|
||||||
@eat(hd6309_native_mode() ? 0 : 1);
|
if(!hd6309_native_mode()) {
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
EXTENDED:
|
EXTENDED:
|
||||||
|
@ -207,10 +207,12 @@ protected:
|
|||||||
// read_opcode() and bump the program counter
|
// read_opcode() and bump the program counter
|
||||||
inline uint8_t read_opcode() { return read_opcode(m_pc.w++); }
|
inline uint8_t read_opcode() { return read_opcode(m_pc.w++); }
|
||||||
inline uint8_t read_opcode_arg() { return read_opcode_arg(m_pc.w++); }
|
inline uint8_t read_opcode_arg() { return read_opcode_arg(m_pc.w++); }
|
||||||
|
inline void dummy_read_opcode_arg(uint16_t delta) { read_opcode_arg(m_pc.w + delta); }
|
||||||
|
inline void dummy_vma(int count) { for(int i=0; i != count; i++) { read_opcode_arg(0xffff); } }
|
||||||
|
|
||||||
// state stack - implemented as a uint32_t
|
// state stack - implemented as a uint32_t
|
||||||
void push_state(uint8_t state) { m_state = (m_state << 8) | state; }
|
void push_state(uint16_t state) { m_state = (m_state << 9) | state; }
|
||||||
uint8_t pop_state() { uint8_t result = (uint8_t) m_state; m_state >>= 8; return result; }
|
uint16_t pop_state() { uint16_t result = m_state & 0x1ff; m_state >>= 9; return result; }
|
||||||
void reset_state() { m_state = 0; }
|
void reset_state() { m_state = 0; }
|
||||||
|
|
||||||
// effective address reading/writing
|
// effective address reading/writing
|
||||||
|
@ -447,52 +447,58 @@ INDEXED:
|
|||||||
case 0x10: case 0x30: case 0x50: case 0x70:
|
case 0x10: case 0x30: case 0x50: case 0x70:
|
||||||
m_temp.w = ireg();
|
m_temp.w = ireg();
|
||||||
ireg()++;
|
ireg()++;
|
||||||
eat(3);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01: case 0x21: case 0x41: case 0x61:
|
case 0x01: case 0x21: case 0x41: case 0x61:
|
||||||
case 0x11: case 0x31: case 0x51: case 0x71:
|
case 0x11: case 0x31: case 0x51: case 0x71:
|
||||||
m_temp.w = ireg();
|
m_temp.w = ireg();
|
||||||
ireg() += 2;
|
ireg() += 2;
|
||||||
eat(4);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x02: case 0x22: case 0x42: case 0x62:
|
case 0x02: case 0x22: case 0x42: case 0x62:
|
||||||
case 0x12: case 0x32: case 0x52: case 0x72:
|
case 0x12: case 0x32: case 0x52: case 0x72:
|
||||||
ireg()--;
|
ireg()--;
|
||||||
m_temp.w = ireg();
|
m_temp.w = ireg();
|
||||||
eat(3);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x03: case 0x23: case 0x43: case 0x63:
|
case 0x03: case 0x23: case 0x43: case 0x63:
|
||||||
case 0x13: case 0x33: case 0x53: case 0x73:
|
case 0x13: case 0x33: case 0x53: case 0x73:
|
||||||
ireg() -= 2;
|
ireg() -= 2;
|
||||||
m_temp.w = ireg();
|
m_temp.w = ireg();
|
||||||
eat(4);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x04: case 0x24: case 0x44: case 0x64:
|
case 0x04: case 0x24: case 0x44: case 0x64:
|
||||||
case 0x14: case 0x34: case 0x54: case 0x74:
|
case 0x14: case 0x34: case 0x54: case 0x74:
|
||||||
m_temp.w = ireg();
|
m_temp.w = ireg();
|
||||||
eat(1);
|
@dummy_read_opcode_arg(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x05: case 0x25: case 0x45: case 0x65:
|
case 0x05: case 0x25: case 0x45: case 0x65:
|
||||||
case 0x15: case 0x35: case 0x55: case 0x75:
|
case 0x15: case 0x35: case 0x55: case 0x75:
|
||||||
m_temp.w = ireg() + (int8_t) m_q.r.b;
|
m_temp.w = ireg() + (int8_t) m_q.r.b;
|
||||||
eat(2);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x06: case 0x26: case 0x46: case 0x66:
|
case 0x06: case 0x26: case 0x46: case 0x66:
|
||||||
case 0x16: case 0x36: case 0x56: case 0x76:
|
case 0x16: case 0x36: case 0x56: case 0x76:
|
||||||
m_temp.w = ireg() + (int8_t) m_q.r.a;
|
m_temp.w = ireg() + (int8_t) m_q.r.a;
|
||||||
eat(2);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x08: case 0x28: case 0x48: case 0x68:
|
case 0x08: case 0x28: case 0x48: case 0x68:
|
||||||
case 0x18: case 0x38: case 0x58: case 0x78:
|
case 0x18: case 0x38: case 0x58: case 0x78:
|
||||||
@m_temp.w = ireg() + (int8_t) read_opcode_arg();
|
@m_temp.w = ireg() + (int8_t) read_opcode_arg();
|
||||||
eat(1);
|
@dummy_read_opcode_arg(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x09: case 0x29: case 0x49: case 0x69:
|
case 0x09: case 0x29: case 0x49: case 0x69:
|
||||||
@ -500,20 +506,22 @@ INDEXED:
|
|||||||
@m_temp.b.h = read_opcode_arg();
|
@m_temp.b.h = read_opcode_arg();
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
m_temp.w = ireg() + m_temp.w;
|
m_temp.w = ireg() + m_temp.w;
|
||||||
eat(3);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0B: case 0x2B: case 0x4B: case 0x6B:
|
case 0x0B: case 0x2B: case 0x4B: case 0x6B:
|
||||||
case 0x1B: case 0x3B: case 0x5B: case 0x7B:
|
case 0x1B: case 0x3B: case 0x5B: case 0x7B:
|
||||||
m_temp.w = ireg() + m_q.r.d;
|
m_temp.w = ireg() + m_q.r.d;
|
||||||
eat(5);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0C: case 0x2C: case 0x4C: case 0x6C:
|
case 0x0C: case 0x2C: case 0x4C: case 0x6C:
|
||||||
case 0x1C: case 0x3C: case 0x5C: case 0x7C:
|
case 0x1C: case 0x3C: case 0x5C: case 0x7C:
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
m_temp.w = m_pc.w + (int8_t) m_temp.b.l;
|
m_temp.w = m_pc.w + (int8_t) m_temp.b.l;
|
||||||
eat(1);
|
@dummy_read_opcode_arg(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0D: case 0x2D: case 0x4D: case 0x6D:
|
case 0x0D: case 0x2D: case 0x4D: case 0x6D:
|
||||||
@ -521,14 +529,15 @@ INDEXED:
|
|||||||
@m_temp.b.h = read_opcode_arg();
|
@m_temp.b.h = read_opcode_arg();
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
m_temp.w = m_pc.w + (int16_t) m_temp.w;
|
m_temp.w = m_pc.w + (int16_t) m_temp.w;
|
||||||
eat(4);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0F: case 0x2F: case 0x4F: case 0x6F:
|
case 0x0F: case 0x2F: case 0x4F: case 0x6F:
|
||||||
case 0x1F: case 0x3F: case 0x5F: case 0x7F:
|
case 0x1F: case 0x3F: case 0x5F: case 0x7F:
|
||||||
@m_temp.b.h = read_opcode_arg();
|
@m_temp.b.h = read_opcode_arg();
|
||||||
@m_temp.b.l = read_opcode_arg();
|
@m_temp.b.l = read_opcode_arg();
|
||||||
eat(1);
|
@dummy_read_opcode_arg(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -549,7 +558,9 @@ INDEXED:
|
|||||||
{
|
{
|
||||||
// 5-bit offset
|
// 5-bit offset
|
||||||
m_temp.w = ireg() + (int8_t) ((m_opcode & 0x0F) | (m_opcode & 0x10 ? 0xF0 : 0x00));
|
m_temp.w = ireg() + (int8_t) ((m_opcode & 0x0F) | (m_opcode & 0x10 ? 0xF0 : 0x00));
|
||||||
eat(2);
|
@dummy_read_opcode_arg(0);
|
||||||
|
@dummy_vma(1);
|
||||||
|
;
|
||||||
}
|
}
|
||||||
@set_ea(m_temp.w);
|
@set_ea(m_temp.w);
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user