diff options
Diffstat (limited to 'src/devices/cpu/mc68hc11/hc11ops.hxx')
-rw-r--r-- | src/devices/cpu/mc68hc11/hc11ops.hxx | 881 |
1 files changed, 751 insertions, 130 deletions
diff --git a/src/devices/cpu/mc68hc11/hc11ops.hxx b/src/devices/cpu/mc68hc11/hc11ops.hxx index 8aaac54c641..640bd54342f 100644 --- a/src/devices/cpu/mc68hc11/hc11ops.hxx +++ b/src/devices/cpu/mc68hc11/hc11ops.hxx @@ -10,6 +10,7 @@ #define SET_V_ADD16(r,s,d) (m_ccr |= (((r) ^ (s)) & ((r) ^ (d)) & 0x8000) ? CC_V : 0) #define SET_V_SUB16(r,s,d) (m_ccr |= (((d) ^ (s)) & ((d) ^ (r)) & 0x8000) ? CC_V : 0) #define SET_H(r,s,d) (m_ccr |= (((r) ^ (s) ^ (d)) & 0x10) ? CC_H : 0) +#define SET_C1(x) (m_ccr |= ((x) & 0x01) ? CC_C : 0) #define SET_C8(x) (m_ccr |= ((x) & 0x100) ? CC_C : 0) #define SET_C16(x) (m_ccr |= ((x) & 0x10000) ? CC_C : 0) #define CLEAR_Z() (m_ccr &= ~(CC_Z)) @@ -147,7 +148,8 @@ void HC11OP(adca_ext)() void HC11OP(adca_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A + i + ((m_ccr & CC_C) ? 1 : 0); CLEAR_HNZVC(); SET_H(r, i, REG_A); @@ -163,7 +165,8 @@ void HC11OP(adca_indx)() void HC11OP(adca_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A + i + ((m_ccr & CC_C) ? 1 : 0); CLEAR_HNZVC(); SET_H(r, i, REG_A); @@ -227,7 +230,8 @@ void HC11OP(adcb_ext)() void HC11OP(adcb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B + i + ((m_ccr & CC_C) ? 1 : 0); CLEAR_HNZVC(); SET_H(r, i, REG_B); @@ -243,7 +247,8 @@ void HC11OP(adcb_indx)() void HC11OP(adcb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B + i + ((m_ccr & CC_C) ? 1 : 0); CLEAR_HNZVC(); SET_H(r, i, REG_B); @@ -307,7 +312,8 @@ void HC11OP(adda_ext)() void HC11OP(adda_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A + i; CLEAR_HNZVC(); SET_H(r, i, REG_A); @@ -323,7 +329,8 @@ void HC11OP(adda_indx)() void HC11OP(adda_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A + i; CLEAR_HNZVC(); SET_H(r, i, REG_A); @@ -387,7 +394,8 @@ void HC11OP(addb_ext)() void HC11OP(addb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B + i; CLEAR_HNZVC(); SET_H(r, i, REG_B); @@ -403,7 +411,8 @@ void HC11OP(addb_indx)() void HC11OP(addb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B + i; CLEAR_HNZVC(); SET_H(r, i, REG_B); @@ -464,7 +473,8 @@ void HC11OP(addd_ext)() void HC11OP(addd_indx)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint32_t r = REG_D + i; CLEAR_NZVC(); SET_N16(r); @@ -479,7 +489,8 @@ void HC11OP(addd_indx)() void HC11OP(addd_indy)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint32_t r = REG_D + i; CLEAR_NZVC(); SET_N16(r); @@ -530,7 +541,8 @@ void HC11OP(anda_ext)() void HC11OP(anda_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A &= i; SET_N8(REG_A); @@ -542,7 +554,8 @@ void HC11OP(anda_indx)() void HC11OP(anda_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A &= i; SET_N8(REG_A); @@ -590,7 +603,8 @@ void HC11OP(andb_ext)() void HC11OP(andb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B &= i; SET_N8(REG_B); @@ -602,7 +616,8 @@ void HC11OP(andb_indx)() void HC11OP(andb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B &= i; SET_N8(REG_B); @@ -656,7 +671,28 @@ void HC11OP(asl_ext)() uint16_t r = i << 1; CLEAR_NZVC(); SET_C8(r); + SET_N8(r); + SET_Z8(r); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } WRITE8(adr, r); + + CYCLES(6); +} + +/* ASL IND, X 0x68 */ +void HC11OP(asl_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); + uint16_t r = i << 1; + CLEAR_NZVC(); + SET_C8(r); SET_N8(r); SET_Z8(r); @@ -665,10 +701,143 @@ void HC11OP(asl_ext)() { m_ccr |= CC_V; } + WRITE8(adr, r); CYCLES(6); } +/* ASL IND, Y 0x18, 0x68 */ +void HC11OP(asl_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + uint16_t r = i << 1; + CLEAR_NZVC(); + SET_C8(r); + SET_N8(r); + SET_Z8(r); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + + CYCLES(7); +} + + +/* ASRA 0x47 */ +void HC11OP(asra)() +{ + uint16_t r = REG_A >> 1; + CLEAR_NZVC(); + SET_C1(REG_A); + r |= (r & 0x40) << 1; + REG_A = (uint16_t)(r); + SET_N8(REG_A); + SET_Z8(REG_A); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + + CYCLES(2); +} + +/* ASRB 0x57 */ +void HC11OP(asrb)() +{ + uint16_t r = REG_B >> 1; + CLEAR_NZVC(); + SET_C1(REG_B); + r |= (r & 0x40) << 1; + REG_B = (uint16_t)(r); + SET_N8(REG_B); + SET_Z8(REG_B); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + + CYCLES(2); +} + +/* ASR EXT 0x77 */ +void HC11OP(asr_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + SET_C1(i); + r |= (r & 0x40) << 1; + SET_N8(r); + SET_Z8(r); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + + CYCLES(6); +} + +/* ASR IND, X 0x67 */ +void HC11OP(asr_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + SET_C1(i); + r |= (r & 0x40) << 1; + SET_N8(r); + SET_Z8(r); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + + CYCLES(6); +} + +/* ASR IND, Y 0x18, 0x67 */ +void HC11OP(asr_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + SET_C1(i); + r |= (r & 0x40) << 1; + SET_N8(r); + SET_Z8(r); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + + CYCLES(7); +} + + /* BITA IMM 0x85 */ void HC11OP(bita_imm)() { @@ -708,7 +877,8 @@ void HC11OP(bita_ext)() void HC11OP(bita_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint8_t r = REG_A & i; CLEAR_NZV(); SET_N8(r); @@ -720,7 +890,8 @@ void HC11OP(bita_indx)() void HC11OP(bita_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint8_t r = REG_A & i; CLEAR_NZV(); SET_N8(r); @@ -768,7 +939,8 @@ void HC11OP(bitb_ext)() void HC11OP(bitb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint8_t r = REG_B & i; CLEAR_NZV(); SET_N8(r); @@ -780,7 +952,8 @@ void HC11OP(bitb_indx)() void HC11OP(bitb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint8_t r = REG_B & i; CLEAR_NZV(); SET_N8(r); @@ -805,10 +978,10 @@ void HC11OP(bclr_dir)() uint8_t d = FETCH(); uint8_t mask = FETCH(); uint8_t r = READ8(d) & ~mask; - WRITE8(d, r); CLEAR_NZV(); SET_N8(r); SET_Z8(r); + WRITE8(d, r); CYCLES(6); } @@ -817,15 +990,29 @@ void HC11OP(bclr_indx)() { uint8_t offset = FETCH(); uint8_t mask = FETCH(); - uint8_t r = READ8(m_ix + offset) & ~mask; - WRITE8(m_ix + offset, r); + uint16_t adr = m_ix + offset; + uint8_t r = READ8(adr) & ~mask; CLEAR_NZV(); SET_N8(r); SET_Z8(r); - + WRITE8(adr, r); CYCLES(7); } +/* BCLR INDY 0x18, 0x1d */ +void HC11OP(bclr_indy)() +{ + uint8_t offset = FETCH(); + uint8_t mask = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t r = READ8(adr) & ~mask; + CLEAR_NZV(); + SET_N8(r); + SET_Z8(r); + WRITE8(adr, r); + CYCLES(8); +} + /* BCS 0x25 */ void HC11OP(bcs)() { @@ -850,6 +1037,34 @@ void HC11OP(beq)() } +/* BGE 0x2C */ +void HC11OP(bge)() +{ + uint8_t n = (m_ccr & CC_N) ? 1 : 0; + uint8_t v = (m_ccr & CC_V) ? 1 : 0; + int8_t rel = FETCH(); + if (!(n ^ v)) /* Branch if (N ^ V) = 0 */ + { + SET_PC(m_ppc + rel + 2); + } + CYCLES(3); +} + + +/* BGT 0x2E */ +void HC11OP(bgt)() +{ + uint8_t n = (m_ccr & CC_N) ? 1 : 0; + uint8_t v = (m_ccr & CC_V) ? 1 : 0; + int8_t rel = FETCH(); + if (!((m_ccr & CC_Z) || (n ^ v))) /* Branch if Z flag set or (N ^ V) = 0 */ + { + SET_PC(m_ppc + rel + 2); + } + CYCLES(3); +} + + /* BHI 0x22 */ void HC11OP(bhi)() { @@ -898,6 +1113,19 @@ void HC11OP(bls)() CYCLES(3); } +/* BLT 0x2D */ +void HC11OP(blt)() +{ + uint8_t n = (m_ccr & CC_N) ? 1 : 0; + uint8_t v = (m_ccr & CC_V) ? 1 : 0; + int8_t rel = FETCH(); + if (n ^ v) /* Branch if (N ^ V) = 1 */ + { + SET_PC(m_ppc + rel + 2); + } + CYCLES(3); +} + /* BMI 0x2B */ void HC11OP(bmi)() { @@ -952,7 +1180,8 @@ void HC11OP(brclr_indx)() uint8_t offset = FETCH(); uint8_t mask = FETCH(); int8_t rel = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); if ((i & mask) == 0) { @@ -962,6 +1191,23 @@ void HC11OP(brclr_indx)() CYCLES(7); } +/* BRCLR INDX 0x18, 0x1F */ +void HC11OP(brclr_indy)() +{ + uint8_t offset = FETCH(); + uint8_t mask = FETCH(); + int8_t rel = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + + if ((i & mask) == 0) + { + SET_PC(m_ppc + rel + 4); + } + + CYCLES(8); +} + /* BRSET DIR 0x12 */ void HC11OP(brset_dir)() { @@ -985,7 +1231,8 @@ void HC11OP(brset_indx)() uint8_t offset = FETCH(); uint8_t mask = FETCH(); int8_t rel = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); if ((~i & mask) == 0) { @@ -995,6 +1242,23 @@ void HC11OP(brset_indx)() CYCLES(7); } +/* BRSET INDY 0x18, 0x1E */ +void HC11OP(brset_indy)() +{ + uint8_t offset = FETCH(); + uint8_t mask = FETCH(); + int8_t rel = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + + if ((~i & mask) == 0) + { + SET_PC(m_ppc + rel + 4); + } + + CYCLES(8); +} + /* BRN 0x21 */ void HC11OP(brn)() @@ -1010,10 +1274,10 @@ void HC11OP(bset_dir)() uint8_t d = FETCH(); uint8_t mask = FETCH(); uint8_t r = READ8(d) | mask; - WRITE8(d, r); CLEAR_NZV(); SET_N8(r); SET_Z8(r); + WRITE8(d, r); CYCLES(6); } @@ -1022,15 +1286,29 @@ void HC11OP(bset_indx)() { uint8_t offset = FETCH(); uint8_t mask = FETCH(); - uint8_t r = READ8(m_ix + offset) | mask; - WRITE8(m_ix + offset, r); + uint16_t adr = m_ix + offset; + uint8_t r = READ8(adr) | mask; CLEAR_NZV(); SET_N8(r); SET_Z8(r); - + WRITE8(adr, r); CYCLES(7); } +/* BSET INDY 0x18, 0x1c */ +void HC11OP(bset_indy)() +{ + uint8_t offset = FETCH(); + uint8_t mask = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t r = READ8(adr) | mask; + CLEAR_NZV(); + SET_N8(r); + SET_Z8(r); + WRITE8(adr, r); + CYCLES(8); +} + /* BSR 0x8D */ void HC11OP(bsr)() { @@ -1113,9 +1391,9 @@ void HC11OP(clrb)() void HC11OP(clr_ext)() { uint16_t adr = FETCH16(); - WRITE8(adr, 0); CLEAR_NZVC(); SET_ZFLAG(); + WRITE8(adr, 0); CYCLES(6); } @@ -1123,9 +1401,10 @@ void HC11OP(clr_ext)() void HC11OP(clr_indx)() { uint8_t offset = FETCH(); - WRITE8(m_ix + offset, 0); + uint16_t adr = m_ix + offset; CLEAR_NZVC(); SET_ZFLAG(); + WRITE8(adr, 0); CYCLES(6); } @@ -1133,9 +1412,10 @@ void HC11OP(clr_indx)() void HC11OP(clr_indy)() { uint8_t offset = FETCH(); - WRITE8(m_iy + offset, 0); + uint16_t adr = m_iy + offset; CLEAR_NZVC(); SET_ZFLAG(); + WRITE8(adr, 0); CYCLES(7); } @@ -1193,7 +1473,8 @@ void HC11OP(cmpa_ext)() void HC11OP(cmpa_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A - i; CLEAR_NZVC(); SET_N8(r); @@ -1207,7 +1488,8 @@ void HC11OP(cmpa_indx)() void HC11OP(cmpa_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A - i; CLEAR_NZVC(); SET_N8(r); @@ -1263,7 +1545,8 @@ void HC11OP(cmpb_ext)() void HC11OP(cmpb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B - i; CLEAR_NZVC(); SET_N8(r); @@ -1277,7 +1560,8 @@ void HC11OP(cmpb_indx)() void HC11OP(cmpb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B - i; CLEAR_NZVC(); SET_N8(r); @@ -1288,6 +1572,51 @@ void HC11OP(cmpb_indy)() } +/* COM EXT 0x73 */ +void HC11OP(com_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = 0xff - i; + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + m_ccr |= CC_C; //always set for M6800 compatibility + WRITE8(adr, r); + CYCLES(6); +} + +/* COM IND, X 0x63 */ +void HC11OP(com_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); + uint16_t r = 0xff - i; + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + m_ccr |= CC_C; //always set for M6800 compatibility + WRITE8(adr, r); + CYCLES(6); +} + +/* COM IND, Y 0x18, 0x63 */ +void HC11OP(com_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + uint16_t r = 0xff - i; + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + m_ccr |= CC_C; //always set for M6800 compatibility + WRITE8(adr, r); + CYCLES(7); +} + + /* COMA , 0x43 */ void HC11OP(coma)() { @@ -1300,7 +1629,6 @@ void HC11OP(coma)() CYCLES(2); } - /* COMB , 0x53 */ void HC11OP(comb)() { @@ -1359,7 +1687,8 @@ void HC11OP(cpd_ext)() void HC11OP(cpd_indx)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_ix + offset); + uint16_t adr = m_ix + offset; + uint16_t i = READ16(adr); uint32_t r = REG_D - i; CLEAR_NZVC(); SET_N16(r); @@ -1373,7 +1702,8 @@ void HC11OP(cpd_indx)() void HC11OP(cpd_indy)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_iy + offset); + uint16_t adr = m_iy + offset; + uint16_t i = READ16(adr); uint32_t r = REG_D - i; CLEAR_NZVC(); SET_N16(r); @@ -1429,7 +1759,8 @@ void HC11OP(cpx_ext)() void HC11OP(cpx_indx)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_ix + offset); + uint16_t adr = m_ix + offset; + uint16_t i = READ16(adr); uint32_t r = m_ix - i; CLEAR_NZVC(); SET_N16(r); @@ -1443,7 +1774,8 @@ void HC11OP(cpx_indx)() void HC11OP(cpx_indy)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_iy + offset); + uint16_t adr = m_iy + offset; + uint16_t i = READ16(adr); uint32_t r = m_ix - i; CLEAR_NZVC(); SET_N16(r); @@ -1498,7 +1830,8 @@ void HC11OP(cpy_ext)() void HC11OP(cpy_indx)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_ix + offset); + uint16_t adr = m_ix + offset; + uint16_t i = READ16(adr); uint32_t r = m_iy - i; CLEAR_NZVC(); SET_N16(r); @@ -1512,7 +1845,8 @@ void HC11OP(cpy_indx)() void HC11OP(cpy_indy)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_iy + offset); + uint16_t adr = m_iy + offset; + uint16_t i = READ16(adr); uint32_t r = m_iy - i; CLEAR_NZVC(); SET_N16(r); @@ -1522,6 +1856,24 @@ void HC11OP(cpy_indy)() CYCLES(7); } +/* DAA 0x19 */ +void HC11OP(daa)() +{ + uint8_t msn = REG_A & 0xf0; + uint8_t lsn = REG_A & 0x0f; + uint16_t t, cf = 0; + if (lsn > 0x09 || m_ccr & CC_H) cf |= 0x06; + if (msn > 0x80 && lsn > 0x09) cf |= 0x60; + if (msn > 0x90 || m_ccr & CC_C) cf |= 0x60; + t = REG_A + cf; + CLEAR_NZV(); + SET_N8((uint8_t)t); + SET_Z8((uint8_t)t); + SET_C8(t); + REG_A = t; + CYCLES(2); +} + /* DECA 0x4A */ void HC11OP(deca)() { @@ -1566,7 +1918,8 @@ void HC11OP(dec_ext)() void HC11OP(dec_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); if (i == 0x80) @@ -1574,7 +1927,7 @@ void HC11OP(dec_indx)() i--; SET_N8(i); SET_Z8(i); - WRITE8(m_ix + offset, i); + WRITE8(adr, i); CYCLES(6); } @@ -1582,7 +1935,8 @@ void HC11OP(dec_indx)() void HC11OP(dec_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); if (i == 0x80) @@ -1590,10 +1944,18 @@ void HC11OP(dec_indy)() i--; SET_N8(i); SET_Z8(i); - WRITE8(m_iy + offset, i); + WRITE8(adr, i); CYCLES(7); } + +/* DES 0x34 */ +void HC11OP(des)() +{ + m_ix--; + CYCLES(3); +} + /* DEX 0x09 */ void HC11OP(dex)() { @@ -1653,7 +2015,8 @@ void HC11OP(eora_ext)() void HC11OP(eora_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A ^= i; SET_N8(REG_A); @@ -1665,7 +2028,8 @@ void HC11OP(eora_indx)() void HC11OP(eora_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A ^= i; SET_N8(REG_A); @@ -1713,7 +2077,8 @@ void HC11OP(eorb_ext)() void HC11OP(eorb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B ^= i; SET_N8(REG_B); @@ -1725,7 +2090,8 @@ void HC11OP(eorb_indx)() void HC11OP(eorb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B ^= i; SET_N8(REG_B); @@ -1805,7 +2171,8 @@ void HC11OP(inc_ext)() void HC11OP(inc_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); if (i == 0x7f) @@ -1813,7 +2180,7 @@ void HC11OP(inc_indx)() i++; SET_N8(i); SET_Z8(i); - WRITE8(m_ix + offset, i); + WRITE8(adr, i); CYCLES(6); } @@ -1822,7 +2189,8 @@ void HC11OP(inc_indx)() void HC11OP(inc_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); if (i == 0x7f) @@ -1830,11 +2198,19 @@ void HC11OP(inc_indy)() i++; SET_N8(i); SET_Z8(i); - WRITE8(m_iy + offset, i); + WRITE8(adr, i); CYCLES(7); } +/* INS 0x31 */ +void HC11OP(ins)() +{ + m_sp++; + CYCLES(3); +} + + /* INX 0x08 */ void HC11OP(inx)() { @@ -1856,16 +2232,18 @@ void HC11OP(iny)() /* JMP IND X 0x6E */ void HC11OP(jmp_indx)() { - uint16_t adr = FETCH(); - SET_PC(m_ix + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + SET_PC(adr); CYCLES(3); } /* JMP IND Y 0x18 0x6E */ void HC11OP(jmp_indy)() { - uint16_t adr = FETCH(); - SET_PC(m_iy + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + SET_PC(adr); CYCLES(4); } @@ -1903,8 +2281,9 @@ void HC11OP(jsr_indx)() { uint8_t offset = FETCH(); uint16_t rt_adr = m_pc; + uint16_t adr = m_ix + offset; PUSH16(rt_adr); - SET_PC(m_ix + offset); + SET_PC(adr); CYCLES(6); } @@ -1913,8 +2292,9 @@ void HC11OP(jsr_indy)() { uint8_t offset = FETCH(); uint16_t rt_adr = m_pc; + uint16_t adr = m_iy + offset; PUSH16(rt_adr); - SET_PC(m_iy + offset); + SET_PC(adr); CYCLES(6); } @@ -1955,8 +2335,9 @@ void HC11OP(ldaa_ext)() void HC11OP(ldaa_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - REG_A = READ8(m_ix + offset); + REG_A = READ8(adr); SET_N8(REG_A); SET_Z8(REG_A); CYCLES(4); @@ -1966,8 +2347,9 @@ void HC11OP(ldaa_indx)() void HC11OP(ldaa_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - REG_A = READ8(m_iy + offset); + REG_A = READ8(adr); SET_N8(REG_A); SET_Z8(REG_A); CYCLES(5); @@ -2009,8 +2391,9 @@ void HC11OP(ldab_ext)() void HC11OP(ldab_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - REG_B = READ8(m_ix + offset); + REG_B = READ8(adr); SET_N8(REG_B); SET_Z8(REG_B); CYCLES(4); @@ -2020,8 +2403,9 @@ void HC11OP(ldab_indx)() void HC11OP(ldab_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - REG_B = READ8(m_iy + offset); + REG_B = READ8(adr); SET_N8(REG_B); SET_Z8(REG_B); CYCLES(5); @@ -2064,8 +2448,9 @@ void HC11OP(ldd_ext)() void HC11OP(ldd_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - REG_D = READ16(m_ix + offset); + REG_D = READ16(adr); SET_N16(REG_D); SET_Z16(REG_D); CYCLES(5); @@ -2075,8 +2460,9 @@ void HC11OP(ldd_indx)() void HC11OP(ldd_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - REG_D = READ16(m_iy + offset); + REG_D = READ16(adr); SET_N16(REG_D); SET_Z16(REG_D); CYCLES(6); @@ -2119,8 +2505,9 @@ void HC11OP(lds_ext)() void HC11OP(lds_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - m_sp = READ16(m_ix + offset); + m_sp = READ16(adr); SET_N16(m_sp); SET_Z16(m_sp); CYCLES(5); @@ -2130,8 +2517,9 @@ void HC11OP(lds_indx)() void HC11OP(lds_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - m_sp = READ16(m_iy + offset); + m_sp = READ16(adr); SET_N16(m_sp); SET_Z16(m_sp); CYCLES(6); @@ -2174,8 +2562,9 @@ void HC11OP(ldx_ext)() void HC11OP(ldx_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - m_ix = READ16(m_ix + offset); + m_ix = READ16(adr); SET_N16(m_ix); SET_Z16(m_ix); CYCLES(5); @@ -2185,8 +2574,9 @@ void HC11OP(ldx_indx)() void HC11OP(ldx_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - m_ix = READ16(m_iy + offset); + m_ix = READ16(adr); SET_N16(m_ix); SET_Z16(m_ix); CYCLES(6); @@ -2229,8 +2619,9 @@ void HC11OP(ldy_ext)() void HC11OP(ldy_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - m_iy = READ16(m_ix + offset); + m_iy = READ16(adr); SET_N16(m_iy); SET_Z16(m_iy); CYCLES(6); @@ -2240,8 +2631,9 @@ void HC11OP(ldy_indx)() void HC11OP(ldy_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - m_iy = READ16(m_iy + offset); + m_iy = READ16(adr); SET_N16(m_iy); SET_Z16(m_iy); CYCLES(6); @@ -2292,6 +2684,50 @@ void HC11OP(lsrb)() CYCLES(2); } +/* LSR EXT 0x74 */ +void HC11OP(lsr_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + m_ccr |= ((m_ccr & CC_C)) ? CC_V : 0; + SET_Z8(REG_B); + WRITE8(adr, r); + CYCLES(6); +} + +/* LSR INDX 0x64 */ +void HC11OP(lsr_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + m_ccr |= ((m_ccr & CC_C)) ? CC_V : 0; + SET_Z8(REG_B); + WRITE8(adr, r); + CYCLES(6); +} + +/* LSR INDY 0x18, 0x64 */ +void HC11OP(lsr_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + uint16_t r = i >> 1; + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + m_ccr |= ((m_ccr & CC_C)) ? CC_V : 0; + SET_Z8(REG_B); + WRITE8(adr, r); + CYCLES(7); +} + /* LSRD 0x04 */ void HC11OP(lsrd)() { @@ -2360,13 +2796,14 @@ void HC11OP(neg_ext)() void HC11OP(neg_indx)() { uint16_t offset = FETCH(); - uint8_t i = 0x00 - READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = 0x00 - READ8(adr); CLEAR_NZVC(); SET_N8(i); SET_Z8(i); m_ccr |= (i == 0x80) ? CC_V : 0; m_ccr |= (i != 0x00) ? CC_C : 0; - WRITE8(m_ix + offset, i); + WRITE8(adr, i); CYCLES(6); } @@ -2375,13 +2812,14 @@ void HC11OP(neg_indx)() void HC11OP(neg_indy)() { uint16_t offset = FETCH(); - uint8_t i = 0x00 - READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = 0x00 - READ8(adr); CLEAR_NZVC(); SET_N8(i); SET_Z8(i); m_ccr |= (i == 0x80) ? CC_V : 0; m_ccr |= (i != 0x00) ? CC_C : 0; - WRITE8(m_iy + offset, i); + WRITE8(adr, i); CYCLES(7); } @@ -2438,7 +2876,8 @@ void HC11OP(oraa_ext)() void HC11OP(oraa_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A |= i; SET_N8(REG_A); @@ -2450,7 +2889,8 @@ void HC11OP(oraa_indx)() void HC11OP(oraa_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_A |= i; SET_N8(REG_A); @@ -2498,7 +2938,8 @@ void HC11OP(orab_ext)() void HC11OP(orab_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B |= i; SET_N8(REG_B); @@ -2510,7 +2951,8 @@ void HC11OP(orab_indx)() void HC11OP(orab_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZV(); REG_B |= i; SET_N8(REG_B); @@ -2623,14 +3065,12 @@ void HC11OP(rol_ext)() m_ccr |= (c & 0x80) ? CC_C : 0; SET_N8(r); SET_Z8(r); - WRITE8(adr, r); - if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) { m_ccr |= CC_V; } - + WRITE8(adr, r); CYCLES(6); } @@ -2638,21 +3078,20 @@ void HC11OP(rol_ext)() void HC11OP(rol_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint8_t c = (i & 0x80); i = ((i & 0x7f) << 1) | ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); m_ccr |= (c & 0x80) ? CC_C : 0; SET_N8(i); SET_Z8(i); - WRITE8(m_ix + offset, i); - if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) { m_ccr |= CC_V; } - + WRITE8(adr, i); CYCLES(6); } @@ -2660,21 +3099,20 @@ void HC11OP(rol_indx)() void HC11OP(rol_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint8_t c = (i & 0x80); i = ((i & 0x7f) << 1) | ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); m_ccr |= (c & 0x80) ? CC_C : 0; SET_N8(i); SET_Z8(i); - WRITE8(m_iy + offset, i); - if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) { m_ccr |= CC_V; } - + WRITE8(adr, i); CYCLES(6); } @@ -2717,6 +3155,66 @@ void HC11OP(rorb)() CYCLES(2); } +/* ROR EXT 0x76 */ +void HC11OP(ror_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = ((i & 0xfe) >> 1) | ((m_ccr & CC_C) ? 0x80 : 0); + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + SET_N8(REG_B); + SET_Z8(REG_B); + + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + CYCLES(6); +} + +/* ROR INDX 0x66 */ +void HC11OP(ror_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); + uint16_t r = ((i & 0xfe) >> 1) | ((m_ccr & CC_C) ? 0x80 : 0); + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + SET_N8(REG_B); + SET_Z8(REG_B); + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + CYCLES(6); +} + +/* ROR INDY 0x18, 0x66 */ +void HC11OP(ror_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); + uint16_t r = ((i & 0xfe) >> 1) | ((m_ccr & CC_C) ? 0x80 : 0); + CLEAR_NZVC(); + m_ccr |= (i & 1) ? CC_C : 0; + SET_N8(REG_B); + SET_Z8(REG_B); + if (((m_ccr & CC_N) && (m_ccr & CC_C) == 0) || + ((m_ccr & CC_N) == 0 && (m_ccr & CC_C))) + { + m_ccr |= CC_V; + } + WRITE8(adr, r); + CYCLES(6); +} + /* RTI 0x3B */ void HC11OP(rti)() { @@ -2771,11 +3269,42 @@ void HC11OP(sbca_imm)() CYCLES(2); } +/* SBCA DIR 0x92 */ +void HC11OP(sbca_dir)() +{ + uint8_t d = FETCH(); + uint8_t i = READ8(d); + uint16_t r = (REG_A - i) - ((m_ccr & CC_C) ? 1 : 0); + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + SET_V_SUB8(r, i, REG_A); + SET_C8(r); + REG_A = (uint8_t)r; + CYCLES(3); +} + +/* SBCA EXT 0xB2 */ +void HC11OP(sbca_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = (REG_A - i) - ((m_ccr & CC_C) ? 1 : 0); + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + SET_V_SUB8(r, i, REG_A); + SET_C8(r); + REG_A = (uint8_t)r; + CYCLES(4); +} + /* SBCA IND, X 0xA2 */ void HC11OP(sbca_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = (REG_A - i) - ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); SET_N8(r); @@ -2790,7 +3319,8 @@ void HC11OP(sbca_indx)() void HC11OP(sbca_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = (REG_A - i) - ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); SET_N8(r); @@ -2815,11 +3345,42 @@ void HC11OP(sbcb_imm)() CYCLES(2); } +/* SBCB DIR 0xD2 */ +void HC11OP(sbcb_dir)() +{ + uint8_t d = FETCH(); + uint8_t i = READ8(d); + uint16_t r = (REG_B - i) - ((m_ccr & CC_C) ? 1 : 0); + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + SET_V_SUB8(r, i, REG_B); + SET_C8(r); + REG_B = (uint8_t)r; + CYCLES(3); +} + +/* SBCB EXT 0xF2 */ +void HC11OP(sbcb_ext)() +{ + uint16_t adr = FETCH16(); + uint8_t i = READ8(adr); + uint16_t r = (REG_B - i) - ((m_ccr & CC_C) ? 1 : 0); + CLEAR_NZVC(); + SET_N8(r); + SET_Z8(r); + SET_V_SUB8(r, i, REG_B); + SET_C8(r); + REG_B = (uint8_t)r; + CYCLES(4); +} + /* SBCB IND, X 0xE2 */ void HC11OP(sbcb_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = (REG_B - i) - ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); SET_N8(r); @@ -2834,7 +3395,8 @@ void HC11OP(sbcb_indx)() void HC11OP(sbcb_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = (REG_B - i) - ((m_ccr & CC_C) ? 1 : 0); CLEAR_NZVC(); SET_N8(r); @@ -2892,10 +3454,11 @@ void HC11OP(staa_ext)() void HC11OP(staa_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); SET_N8(REG_A); SET_Z8(REG_A); - WRITE8(m_ix + offset, REG_A); + WRITE8(adr, REG_A); CYCLES(4); } @@ -2903,10 +3466,11 @@ void HC11OP(staa_indx)() void HC11OP(staa_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); SET_N8(REG_A); SET_Z8(REG_A); - WRITE8(m_iy + offset, REG_A); + WRITE8(adr, REG_A); CYCLES(5); } @@ -2936,10 +3500,11 @@ void HC11OP(stab_ext)() void HC11OP(stab_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); SET_N8(REG_B); SET_Z8(REG_B); - WRITE8(m_ix + offset, REG_B); + WRITE8(adr, REG_B); CYCLES(4); } @@ -2947,10 +3512,11 @@ void HC11OP(stab_indx)() void HC11OP(stab_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); SET_N8(REG_B); SET_Z8(REG_B); - WRITE8(m_iy + offset, REG_B); + WRITE8(adr, REG_B); CYCLES(5); } @@ -2960,9 +3526,9 @@ void HC11OP(std_dir)() { uint8_t d = FETCH(); CLEAR_NZV(); - WRITE16(d, REG_D); SET_N16(REG_D); SET_Z16(REG_D); + WRITE16(d, REG_D); CYCLES(4); } @@ -2971,9 +3537,9 @@ void HC11OP(std_ext)() { uint16_t adr = FETCH16(); CLEAR_NZV(); - WRITE16(adr, REG_D); SET_N16(REG_D); SET_Z16(REG_D); + WRITE16(adr, REG_D); CYCLES(5); } @@ -2981,10 +3547,11 @@ void HC11OP(std_ext)() void HC11OP(std_indx)() { uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; CLEAR_NZV(); - WRITE16(m_ix + offset, REG_D); SET_N16(REG_D); SET_Z16(REG_D); + WRITE16(adr, REG_D); CYCLES(5); } @@ -2992,10 +3559,11 @@ void HC11OP(std_indx)() void HC11OP(std_indy)() { uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; CLEAR_NZV(); - WRITE16(m_iy + offset, REG_D); SET_N16(REG_D); SET_Z16(REG_D); + WRITE16(adr, REG_D); CYCLES(6); } @@ -3005,11 +3573,52 @@ void HC11OP(sts_dir)() uint8_t d = FETCH(); uint16_t r = m_sp; CLEAR_NZV(); + SET_N16(r); + SET_Z16(r); WRITE8(d, (r & 0xff00) >> 8); WRITE8(d + 1, (r & 0xff)); + CYCLES(4); +} +/* STS EXT 0xBF */ +void HC11OP(sts_ext)() +{ + uint16_t adr = FETCH16(); + uint16_t r = m_sp; + CLEAR_NZV(); SET_N16(r); SET_Z16(r); - CYCLES(4); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); + CYCLES(5); +} + +/* STS INDX 0xAF */ +void HC11OP(sts_indx)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint16_t r = m_sp; + CLEAR_NZV(); + SET_N16(r); + SET_Z16(r); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); + CYCLES(5); +} + + +/* STS INDY 0x18 0xAF */ +void HC11OP(sts_indy)() +{ + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint16_t r = m_sp; + CLEAR_NZV(); + SET_N16(r); + SET_Z16(r); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); + CYCLES(6); } @@ -3043,11 +3652,12 @@ void HC11OP(stx_ext)() /* STX INDX 0xEF */ void HC11OP(stx_indx)() { - uint16_t adr = FETCH(); + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; uint16_t r = m_ix; CLEAR_NZV(); - WRITE8(m_ix + adr, (r & 0xff00) >> 8); - WRITE8(m_ix + adr + 1, (r & 0xff)); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); SET_N16(r); SET_Z16(r); CYCLES(5); @@ -3057,11 +3667,12 @@ void HC11OP(stx_indx)() /* STX INDY 0xCD 0xEF */ void HC11OP(stx_indy)() { - uint16_t adr = FETCH(); + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; uint16_t r = m_ix; CLEAR_NZV(); - WRITE8(m_iy + adr, (r & 0xff00) >> 8); - WRITE8(m_iy + adr + 1, (r & 0xff)); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); SET_N16(r); SET_Z16(r); CYCLES(6); @@ -3097,11 +3708,12 @@ void HC11OP(sty_ext)() /* STY INDX 0x1A 0xEF */ void HC11OP(sty_indx)() { - uint16_t adr = FETCH(); + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; uint16_t r = m_iy; CLEAR_NZV(); - WRITE8(m_ix + adr, (r & 0xff00) >> 8); - WRITE8(m_ix + adr + 1, (r & 0xff)); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); SET_N16(r); SET_Z16(r); CYCLES(6); @@ -3110,11 +3722,12 @@ void HC11OP(sty_indx)() /* STY INDY 0x18 0xEF */ void HC11OP(sty_indy)() { - uint16_t adr = FETCH(); + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; uint16_t r = m_iy; CLEAR_NZV(); - WRITE8(m_iy + adr, (r & 0xff00) >> 8); - WRITE8(m_iy + adr + 1, (r & 0xff)); + WRITE8(adr, (r & 0xff00) >> 8); + WRITE8(adr + 1, (r & 0xff)); SET_N16(r); SET_Z16(r); CYCLES(6); @@ -3192,8 +3805,9 @@ void HC11OP(suba_ext)() /* SUBA INDX 0xA0 */ void HC11OP(suba_indx)() { - uint16_t adr = FETCH(); - uint8_t i = READ8(m_ix + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A - i; CLEAR_NZVC(); SET_N8(r); @@ -3208,8 +3822,9 @@ void HC11OP(suba_indx)() /* SUBA INDY 0x18 0xA0 */ void HC11OP(suba_indy)() { - uint16_t adr = FETCH(); - uint8_t i = READ8(m_iy + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_A - i; CLEAR_NZVC(); SET_N8(r); @@ -3271,8 +3886,9 @@ void HC11OP(subb_ext)() /* SUBB INDX 0xE0 */ void HC11OP(subb_indx)() { - uint16_t adr = FETCH(); - uint8_t i = READ8(m_ix + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B - i; CLEAR_NZVC(); SET_N8(r); @@ -3286,8 +3902,9 @@ void HC11OP(subb_indx)() /* SUBB INDY 0x18 0xE0 */ void HC11OP(subb_indy)() { - uint16_t adr = FETCH(); - uint8_t i = READ8(m_iy + adr); + uint8_t offset = FETCH(); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); uint16_t r = REG_B - i; CLEAR_NZVC(); SET_N8(r); @@ -3330,8 +3947,8 @@ void HC11OP(subd_dir)() /* SUBD EXT 0xB3 */ void HC11OP(subd_ext)() { - uint16_t addr = FETCH16(); - uint16_t i = READ16(addr); + uint16_t adr = FETCH16(); + uint16_t i = READ16(adr); uint32_t r = REG_D - i; CLEAR_NZVC(); SET_N16(r); @@ -3346,7 +3963,8 @@ void HC11OP(subd_ext)() void HC11OP(subd_indx)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_ix + offset); + uint16_t adr = m_ix + offset; + uint16_t i = READ16(adr); uint32_t r = REG_D - i; CLEAR_NZVC(); SET_N16(r); @@ -3361,7 +3979,8 @@ void HC11OP(subd_indx)() void HC11OP(subd_indy)() { uint8_t offset = FETCH(); - uint16_t i = READ16(m_iy + offset); + uint16_t adr = m_iy + offset; + uint16_t i = READ16(adr); uint32_t r = REG_D - i; CLEAR_NZVC(); SET_N16(r); @@ -3474,7 +4093,8 @@ void HC11OP(tst_ext)() void HC11OP(tst_indx)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_ix + offset); + uint16_t adr = m_ix + offset; + uint8_t i = READ8(adr); CLEAR_NZVC(); SET_N8(i); SET_Z8(i); @@ -3485,7 +4105,8 @@ void HC11OP(tst_indx)() void HC11OP(tst_indy)() { uint8_t offset = FETCH(); - uint8_t i = READ8(m_iy + offset); + uint16_t adr = m_iy + offset; + uint8_t i = READ8(adr); CLEAR_NZVC(); SET_N8(i); SET_Z8(i); |