summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-01-20 22:10:51 +1100
committer Vas Crabb <vas@vastheman.com>2017-01-20 22:13:25 +1100
commit59ed49f7097a3c64391561c7340ddac0b23710e1 (patch)
tree977d8fc2644aa9602648a36e3fa44f1e3f5d5d71
parent19a91227487d1f059796137e1c78920b29f553b3 (diff)
Help me template compiler! You are my only hope!
6805 cleanup: * Reduce massive amounts of redundancy by templating opcode handlers * Replace the epic switch statement with a dispatch table * Fix timings for a few instructions
-rw-r--r--src/devices/cpu/m6805/6805ops.hxx1528
-rw-r--r--src/devices/cpu/m6805/m6805.cpp394
-rw-r--r--src/devices/cpu/m6805/m6805.h232
-rw-r--r--src/devices/cpu/m6805/m6805defs.h49
-rw-r--r--src/emu/logmacro.h2
5 files changed, 484 insertions, 1721 deletions
diff --git a/src/devices/cpu/m6805/6805ops.hxx b/src/devices/cpu/m6805/6805ops.hxx
index 88e3ae5da8c..e8c0a5b0fc0 100644
--- a/src/devices/cpu/m6805/6805ops.hxx
+++ b/src/devices/cpu/m6805/6805ops.hxx
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
/*
HNZC
@@ -14,10 +14,13 @@ HNZC
*/
-#define OP_HANDLER(_name) void m6805_base_device::_name()
-#define DERIVED_OP_HANDLER(_arch,_name) void _arch##_device::_name()
+#define OP_HANDLER(name) void m6805_base_device::name()
+#define OP_HANDLER_BIT(name) template <unsigned B> void m6805_base_device::name()
+#define OP_HANDLER_BRA(name) template <bool C> void m6805_base_device::name()
+#define OP_HANDLER_MODE(name) template <m6805_base_device::addr_mode M> void m6805_base_device::name()
+
+#define DERIVED_OP_HANDLER(arch, name) void arch##_device::name()
-#define OP_HANDLER_BIT(_name) void m6805_base_device::_name(uint8_t bit)
OP_HANDLER( illegal )
{
@@ -27,291 +30,262 @@ OP_HANDLER( illegal )
/* $00/$02/$04/$06/$08/$0A/$0C/$0E BRSET direct,relative ---- */
OP_HANDLER_BIT( brset )
{
- uint8_t t,r;
+ u8 t, r;
DIRBYTE(r);
IMMBYTE(t);
CLC;
-
- if (r&bit) {
- SEC;
- PC+=SIGNED(t);
- }
+ if (BIT(r, B)) { SEC; PC += SIGNED(t); }
}
/* $01/$03/$05/$07/$09/$0B/$0D/$0F BRCLR direct,relative ---- */
OP_HANDLER_BIT( brclr )
{
- uint8_t t,r;
+ u8 t, r;
DIRBYTE(r);
IMMBYTE(t);
SEC;
-
- if (!(r&bit)) {
- CLC;
- PC+=SIGNED(t);
- }
+ if (!BIT(r, B)) { CLC; PC += SIGNED(t); }
}
/* $10/$12/$14/$16/$18/$1A/$1C/$1E BSET direct ---- */
OP_HANDLER_BIT( bset )
{
- uint8_t t,r;
- DIRBYTE(t); r=t|bit;
- WM(EAD,r);
+ u8 t;
+ DIRBYTE(t);
+ WM(EAD, t | (u8(1) << B));
}
/* $11/$13/$15/$17/$19/$1B/$1D/$1F BCLR direct ---- */
-OP_HANDLER_BIT( bclr)
+OP_HANDLER_BIT( bclr )
{
- uint8_t t,r;
- DIRBYTE(t); r=t&(~bit);
- WM(EAD,r);
+ u8 t;
+ DIRBYTE(t);
+ WM(EAD, t & ~(u8(1) << B));
}
/* $20 BRA relative ---- */
-OP_HANDLER( bra )
-{
- uint8_t t;
- IMMBYTE(t);
- PC+=SIGNED(t);
-}
-
/* $21 BRN relative ---- */
-OP_HANDLER( brn )
-{
- SKIPBYTE();
-}
+OP_HANDLER_BRA( bra ) { BRANCH( true ); }
/* $22 BHI relative ---- */
-OP_HANDLER( bhi )
-{
- BRANCH( !(CC&(CFLAG|ZFLAG)) );
-}
-
/* $23 BLS relative ---- */
-OP_HANDLER( bls )
-{
- BRANCH( CC&(CFLAG|ZFLAG) );
-}
+OP_HANDLER_BRA( bhi ) { BRANCH( !(CC & (CFLAG | ZFLAG)) ); }
/* $24 BCC relative ---- */
-OP_HANDLER( bcc )
-{
- BRANCH( !(CC&CFLAG) );
-}
-
/* $25 BCS relative ---- */
-OP_HANDLER( bcs )
-{
- BRANCH( CC&CFLAG );
-}
+OP_HANDLER_BRA( bcc ) { BRANCH( !(CC & CFLAG) ); }
/* $26 BNE relative ---- */
-OP_HANDLER( bne )
-{
- BRANCH( !(CC&ZFLAG) );
-}
-
/* $27 BEQ relative ---- */
-OP_HANDLER( beq )
-{
- BRANCH( CC&ZFLAG );
-}
+OP_HANDLER_BRA( bne ) { BRANCH( !(CC & ZFLAG) ); }
/* $28 BHCC relative ---- */
-OP_HANDLER( bhcc )
-{
- BRANCH( !(CC&HFLAG) );
-}
-
/* $29 BHCS relative ---- */
-OP_HANDLER( bhcs )
-{
- BRANCH( CC&HFLAG );
-}
+OP_HANDLER_BRA( bhcc ) { BRANCH( !(CC & HFLAG) ); }
/* $2a BPL relative ---- */
-OP_HANDLER( bpl )
-{
- BRANCH( !(CC&NFLAG) );
-}
-
/* $2b BMI relative ---- */
-OP_HANDLER( bmi )
-{
- BRANCH( CC&NFLAG );
-}
+OP_HANDLER_BRA( bpl ) { BRANCH( !(CC & NFLAG) ); }
/* $2c BMC relative ---- */
-OP_HANDLER( bmc )
-{
- BRANCH( !(CC&IFLAG) );
-}
-
/* $2d BMS relative ---- */
-OP_HANDLER( bms )
-{
- BRANCH( CC&IFLAG );
-}
+OP_HANDLER_BRA( bmc ) { BRANCH( !(CC & IFLAG) ); }
/* $2e BIL relative ---- */
OP_HANDLER( bil )
{
- BRANCH(m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE);
+ bool const C = true;
+ BRANCH( m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE );
}
-DERIVED_OP_HANDLER( hd63705, bil )
+/* $2f BIH relative ---- */
+OP_HANDLER( bih )
{
- BRANCH(m_nmi_state != CLEAR_LINE);
+ bool const C = false;
+ BRANCH( m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE );
}
-/* $2f BIH relative ---- */
-OP_HANDLER( bih )
+DERIVED_OP_HANDLER( hd63705, bil )
{
- BRANCH(m_irq_state[M6805_IRQ_LINE] == CLEAR_LINE);
+ bool const C = true;
+ BRANCH( m_nmi_state != CLEAR_LINE );
}
DERIVED_OP_HANDLER( hd63705, bih )
{
- BRANCH(m_nmi_state == CLEAR_LINE);
+ bool const C = false;
+ BRANCH( m_nmi_state != CLEAR_LINE );
}
/* $30 NEG direct -*** */
-OP_HANDLER( neg_di )
+/* $60 NEG indexed, 1 byte offset -*** */
+/* $70 NEG indexed -*** */
+OP_HANDLER_MODE( neg )
{
- uint8_t t;
- uint16_t r;
- DIRBYTE(t);
- r=-t;
+ u8 t;
+ ARGBYTE(t);
+ u16 const r = -t;
CLR_NZC;
- SET_FLAGS8(0,t,r);
- WM(EAD,r);
+ SET_FLAGS8(0, t, r);
+ WM(EAD, r);
}
/* $31 ILLEGAL */
+/* $61 ILLEGAL */
+/* $71 ILLEGAL */
/* $32 ILLEGAL */
+/* $62 ILLEGAL */
+/* $72 ILLEGAL */
/* $33 COM direct -**1 */
-OP_HANDLER( com_di )
+/* $63 COM indexed, 1 byte offset -**1 */
+/* $73 COM indexed -**1 */
+OP_HANDLER_MODE( com )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
t = ~t;
CLR_NZ;
SET_NZ8(t);
SEC;
- WM(EAD,t);
+ WM(EAD, t);
}
/* $34 LSR direct -0** */
-OP_HANDLER( lsr_di )
+/* $64 LSR indexed, 1 byte offset -0** */
+/* $74 LSR indexed -0** */
+OP_HANDLER_MODE( lsr )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
CLR_NZC;
- CC |= (t&0x01);
+ CC |= BIT(t, 0);
t >>= 1;
SET_Z8(t);
- WM(EAD,t);
+ WM(EAD, t);
}
/* $35 ILLEGAL */
+/* $65 ILLEGAL */
+/* $75 ILLEGAL */
/* $36 ROR direct -*** */
-OP_HANDLER( ror_di )
+/* $66 ROR indexed, 1 byte offset -*** */
+/* $76 ROR indexed -*** */
+OP_HANDLER_MODE( ror )
{
- uint8_t t,r;
- DIRBYTE(t);
- r = (CC & 0x01) << 7;
+ u8 t;
+ ARGBYTE(t);
+ u8 r = BIT(CC, 0) << 7;
CLR_NZC;
- CC |= (t & 0x01);
- r |= t>>1;
+ CC |= BIT(t, 0);
+ r |= t >> 1;
SET_NZ8(r);
- WM(EAD,r);
+ WM(EAD, r);
}
/* $37 ASR direct ?*** */
-OP_HANDLER( asr_di )
+/* $67 ASR indexed, 1 byte offset ?*** */
+/* $77 ASR indexed ?*** */
+OP_HANDLER_MODE( asr )
{
- uint8_t t;
- DIRBYTE(t);
- CLR_NZC; CC|=(t&0x01);
- t>>=1; t|=((t&0x40)<<1);
+ u8 t;
+ ARGBYTE(t);
+ CLR_NZC;
+ CC |= BIT(t, 0);
+ t = (t >> 1) | (t & 0x80);
SET_NZ8(t);
- WM(EAD,t);
+ WM(EAD, t);
}
/* $38 LSL direct ?*** */
-OP_HANDLER( lsl_di )
+/* $68 LSL indexed, 1 byte offset ?*** */
+/* $78 LSL indexed ?*** */
+OP_HANDLER_MODE( lsl )
{
- uint8_t t;
- uint16_t r;
- DIRBYTE(t);
- r = t << 1;
+ u8 t;
+ ARGBYTE(t);
+ u16 const r = t << 1;
CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
+ SET_FLAGS8(t, t, r);
+ WM(EAD, r);
}
/* $39 ROL direct -*** */
-OP_HANDLER( rol_di )
+/* $69 ROL indexed, 1 byte offset -*** */
+/* $79 ROL indexed -*** */
+OP_HANDLER_MODE( rol )
{
- uint16_t t,r;
- DIRBYTE(t);
- r = CC & 0x01;
- r |= t << 1;
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = BIT(CC, 0) | (t << 1);
CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
+ SET_FLAGS8(t, t, r);
+ WM(EAD, r);
}
/* $3a DEC direct -**- */
-OP_HANDLER( dec_di )
+/* $6a DEC indexed, 1 byte offset -**- */
+OP_HANDLER_MODE( dec )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
--t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
+ CLR_NZ;
+ SET_FLAGS8D(t);
+ WM(EAD, t);
}
/* $3b ILLEGAL */
+/* $6b ILLEGAL */
+/* $7b ILLEGAL */
/* $3c INC direct -**- */
-OP_HANDLER( inc_di )
+/* $6c INC indexed, 1 byte offset -**- */
+/* $7c INC indexed -**- */
+OP_HANDLER_MODE( inc )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
+ CLR_NZ;
+ SET_FLAGS8I(t);
+ WM(EAD, t);
}
/* $3d TST direct -**- */
-OP_HANDLER( tst_di )
+/* $6d TST indexed, 1 byte offset -**- */
+/* $7d TST indexed -**- */
+OP_HANDLER_MODE( tst )
{
- uint8_t t;
- DIRBYTE(t);
- CLR_NZ; SET_NZ8(t);
+ u8 t;
+ ARGBYTE(t);
+ CLR_NZ;
+ SET_NZ8(t);
}
/* $3e ILLEGAL */
+/* $6e ILLEGAL */
+/* $7e ILLEGAL */
/* $3f CLR direct -0100 */
-OP_HANDLER( clr_di )
+/* $6f CLR indexed, 1 byte offset -0100 */
+/* $7f CLR indexed -0100 */
+OP_HANDLER_MODE( clr )
{
- DIRECT;
- CLR_NZ; SEZ;
- WM(EAD,0);
+ ARGADDR;
+ CLR_NZ;
+ SEZ;
+ WM(EAD, 0);
}
/* $40 NEGA inherent ?*** */
OP_HANDLER( nega )
{
- uint16_t r;
+ u16 r;
r = -A;
CLR_NZC; SET_FLAGS8(0,A,r);
A = r;
@@ -344,7 +318,7 @@ OP_HANDLER( lsra )
/* $46 RORA inherent -*** */
OP_HANDLER( rora )
{
- uint8_t r;
+ u8 r;
r = (CC & 0x01) << 7;
CLR_NZC;
CC |= (A & 0x01);
@@ -365,7 +339,7 @@ OP_HANDLER( asra )
/* $48 LSLA inherent ?*** */
OP_HANDLER( lsla )
{
- uint16_t r;
+ u16 r;
r = A << 1;
CLR_NZC;
SET_FLAGS8(A,A,r);
@@ -375,7 +349,7 @@ OP_HANDLER( lsla )
/* $49 ROLA inherent -*** */
OP_HANDLER( rola )
{
- uint16_t t,r;
+ u16 t,r;
t = A;
r = CC & 0x01;
r |= t << 1;
@@ -422,7 +396,7 @@ OP_HANDLER( clra )
/* $50 NEGX inherent ?*** */
OP_HANDLER( negx )
{
- uint16_t r;
+ u16 r;
r = -X;
CLR_NZC;
SET_FLAGS8(0,X,r);
@@ -456,7 +430,7 @@ OP_HANDLER( lsrx )
/* $56 RORX inherent -*** */
OP_HANDLER( rorx )
{
- uint8_t r;
+ u8 r;
r = (CC & 0x01) << 7;
CLR_NZC;
CC |= (X & 0x01);
@@ -474,10 +448,10 @@ OP_HANDLER( asrx )
SET_NZ8(X);
}
-/* $58 ASLX inherent ?*** */
-OP_HANDLER( aslx )
+/* $58 LSLX inherent ?*** */
+OP_HANDLER( lslx )
{
- uint16_t r;
+ u16 r;
r = X << 1;
CLR_NZC;
SET_FLAGS8(X,X,r);
@@ -487,7 +461,7 @@ OP_HANDLER( aslx )
/* $59 ROLX inherent -*** */
OP_HANDLER( rolx )
{
- uint16_t t,r;
+ u16 t,r;
t = X;
r = CC & 0x01;
r |= t<<1;
@@ -531,255 +505,6 @@ OP_HANDLER( clrx )
SEZ;
}
-/* $60 NEG indexed, 1 byte offset -*** */
-OP_HANDLER( neg_ix1 )
-{
- uint8_t t;
- uint16_t r;
- IDX1BYTE(t); r=-t;
- CLR_NZC; SET_FLAGS8(0,t,r);
- WM(EAD,r);
-}
-
-/* $61 ILLEGAL */
-
-/* $62 ILLEGAL */
-
-/* $63 COM indexed, 1 byte offset -**1 */
-OP_HANDLER( com_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t); t = ~t;
- CLR_NZ; SET_NZ8(t); SEC;
- WM(EAD,t);
-}
-
-/* $64 LSR indexed, 1 byte offset -0** */
-OP_HANDLER( lsr_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t >>= 1;
- SET_Z8(t);
- WM(EAD,t);
-}
-
-/* $65 ILLEGAL */
-
-/* $66 ROR indexed, 1 byte offset -*** */
-OP_HANDLER( ror_ix1 )
-{
- uint8_t t,r;
- IDX1BYTE(t);
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (t & 0x01);
- r |= t>>1;
- SET_NZ8(r);
- WM(EAD,r);
-}
-
-/* $67 ASR indexed, 1 byte offset ?*** */
-OP_HANDLER( asr_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZC; CC|=(t&0x01);
- t>>=1; t|=((t&0x40)<<1);
- SET_NZ8(t);
- WM(EAD,t);
-}
-
-/* $68 LSL indexed, 1 byte offset ?*** */
-OP_HANDLER( lsl_ix1 )
-{
- uint8_t t;
- uint16_t r;
- IDX1BYTE(t);
- r = t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $69 ROL indexed, 1 byte offset -*** */
-OP_HANDLER( rol_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $6a DEC indexed, 1 byte offset -**- */
-OP_HANDLER( dec_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- --t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
-}
-
-/* $6b ILLEGAL */
-
-/* $6c INC indexed, 1 byte offset -**- */
-OP_HANDLER( inc_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- ++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
-}
-
-/* $6d TST indexed, 1 byte offset -**- */
-OP_HANDLER( tst_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZ; SET_NZ8(t);
-}
-
-/* $6e ILLEGAL */
-
-/* $6f CLR indexed, 1 byte offset -0100 */
-OP_HANDLER( clr_ix1 )
-{
- INDEXED1;
- CLR_NZC; SEZ;
- WM(EAD,0);
-}
-
-/* $70 NEG indexed -*** */
-OP_HANDLER( neg_ix )
-{
- uint8_t t;
- uint16_t r;
- IDXBYTE(t); r=-t;
- CLR_NZC; SET_FLAGS8(0,t,r);
- WM(EAD,r);
-}
-
-/* $71 ILLEGAL */
-
-/* $72 ILLEGAL */
-
-/* $73 COM indexed -**1 */
-OP_HANDLER( com_ix )
-{
- uint8_t t;
- IDXBYTE(t); t = ~t;
- CLR_NZ; SET_NZ8(t); SEC;
- WM(EAD,t);
-}
-
-/* $74 LSR indexed -0** */
-OP_HANDLER( lsr_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t >>= 1;
- SET_Z8(t);
- WM(EAD,t);
-}
-
-/* $75 ILLEGAL */
-
-/* $76 ROR indexed -*** */
-OP_HANDLER( ror_ix )
-{
- uint8_t t,r;
- IDXBYTE(t);
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (t & 0x01);
- r |= t >> 1;
- SET_NZ8(r);
- WM(EAD,r);
-}
-
-/* $77 ASR indexed ?*** */
-OP_HANDLER( asr_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t = (t & 0x80) | (t >> 1);
- SET_NZ8(t);
- WM(EAD,t);
-}
-
-/* $78 LSL indexed ?*** */
-OP_HANDLER( lsl_ix )
-{
- uint8_t t;
- uint16_t r;
- IDXBYTE(t); r=t<<1;
- CLR_NZC; SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $79 ROL indexed -*** */
-OP_HANDLER( rol_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $7a DEC indexed -**- */
-OP_HANDLER( dec_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- --t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
-}
-
-/* $7b ILLEGAL */
-
-/* $7c INC indexed -**- */
-OP_HANDLER( inc_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- ++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
-}
-
-/* $7d TST indexed -**- */
-OP_HANDLER( tst_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZ; SET_NZ8(t);
-}
-
-/* $7e ILLEGAL */
-
-/* $7f CLR indexed -0100 */
-OP_HANDLER( clr_ix )
-{
- INDEXED;
- CLR_NZC; SEZ;
- WM(EAD,0);
-}
-
/* $80 RTI inherent #### */
OP_HANDLER( rti )
{
@@ -823,6 +548,7 @@ DERIVED_OP_HANDLER( hd63705, swi )
SEI;
RM16(0x1ffa, &m_pc);
}
+
/* $84 ILLEGAL */
/* $85 ILLEGAL */
@@ -862,29 +588,32 @@ DERIVED_OP_HANDLER( hd63705, swi )
/* $96 ILLEGAL */
/* $97 TAX inherent ---- */
-OP_HANDLER( tax )
-{
- X = A;
-}
+OP_HANDLER( tax ) { X = A; }
/* $98 CLC */
+OP_HANDLER( clc ) { CLC; }
/* $99 SEC */
+OP_HANDLER( sec ) { SEC; }
/* $9A CLI */
+OP_HANDLER( cli )
+{
+#if IRQ_LEVEL_DETECT
+ if (m_irq_state != CLEAR_LINE) m_pending_interrupts |= 1 << M6805_IRQ_LINE;
+#else
+ CLI;
+#endif
+}
/* $9B SEI */
+OP_HANDLER( sei ) { SEI; }
/* $9C RSP inherent ---- */
-OP_HANDLER( rsp )
-{
- S = SP_MASK;
-}
+OP_HANDLER( rsp ) { S = SP_MASK; }
/* $9D NOP inherent ---- */
-OP_HANDLER( nop )
-{
-}
+OP_HANDLER( nop ) { }
/* $9E ILLEGAL */
@@ -895,913 +624,244 @@ OP_HANDLER( txa )
}
/* $a0 SUBA immediate ?*** */
-OP_HANDLER( suba_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $a1 CMPA immediate ?*** */
-OP_HANDLER( cmpa_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $a2 SBCA immediate ?*** */
-OP_HANDLER( sbca_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $a3 CPX immediate -*** */
-OP_HANDLER( cpx_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $a4 ANDA immediate -**- */
-OP_HANDLER( anda_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $a5 BITA immediate -**- */
-OP_HANDLER( bita_im )
-{
- uint8_t t,r;
- IMMBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $a6 LDA immediate -**- */
-OP_HANDLER( lda_im )
-{
- IMMBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $a7 ILLEGAL */
-
-/* $a8 EORA immediate -**- */
-OP_HANDLER( eora_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $a9 ADCA immediate **** */
-OP_HANDLER( adca_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $aa ORA immediate -**- */
-OP_HANDLER( ora_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $ab ADDA immediate **** */
-OP_HANDLER( adda_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $ac ILLEGAL */
-
-/* $ad BSR ---- */
-OP_HANDLER( bsr )
-{
- uint8_t t;
- IMMBYTE(t);
- PUSHWORD(m_pc);
- PC += SIGNED(t);
-}
-
-/* $ae LDX immediate -**- */
-OP_HANDLER( ldx_im )
-{
- IMMBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $af ILLEGAL */
-
/* $b0 SUBA direct ?*** */
-OP_HANDLER( suba_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $b1 CMPA direct ?*** */
-OP_HANDLER( cmpa_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $b2 SBCA direct ?*** */
-OP_HANDLER( sbca_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $b3 CPX direct -*** */
-OP_HANDLER( cpx_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $b4 ANDA direct -**- */
-OP_HANDLER( anda_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $b5 BITA direct -**- */
-OP_HANDLER( bita_di )
-{
- uint8_t t,r;
- DIRBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $b6 LDA direct -**- */
-OP_HANDLER( lda_di )
-{
- DIRBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $b7 STA direct -**- */
-OP_HANDLER( sta_di )
-{
- CLR_NZ;
- SET_NZ8(A);
- DIRECT;
- WM(EAD,A);
-}
-
-/* $b8 EORA direct -**- */
-OP_HANDLER( eora_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $b9 ADCA direct **** */
-OP_HANDLER( adca_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $ba ORA direct -**- */
-OP_HANDLER( ora_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $bb ADDA direct **** */
-OP_HANDLER( adda_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $bc JMP direct -*** */
-OP_HANDLER( jmp_di )
-{
- DIRECT;
- PC = EA;
-}
-
-/* $bd JSR direct ---- */
-OP_HANDLER( jsr_di )
-{
- DIRECT;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $be LDX direct -**- */
-OP_HANDLER( ldx_di )
-{
- DIRBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $bf STX direct -**- */
-OP_HANDLER( stx_di )
-{
- CLR_NZ;
- SET_NZ8(X);
- DIRECT;
- WM(EAD,X);
-}
-
/* $c0 SUBA extended ?*** */
-OP_HANDLER( suba_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $c1 CMPA extended ?*** */
-OP_HANDLER( cmpa_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $c2 SBCA extended ?*** */
-OP_HANDLER( sbca_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $c3 CPX extended -*** */
-OP_HANDLER( cpx_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $c4 ANDA extended -**- */
-OP_HANDLER( anda_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c5 BITA extended -**- */
-OP_HANDLER( bita_ex )
-{
- uint8_t t,r;
- EXTBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $c6 LDA extended -**- */
-OP_HANDLER( lda_ex )
-{
- EXTBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c7 STA extended -**- */
-OP_HANDLER( sta_ex )
-{
- CLR_NZ;
- SET_NZ8(A);
- EXTENDED;
- WM(EAD,A);
-}
-
-/* $c8 EORA extended -**- */
-OP_HANDLER( eora_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c9 ADCA extended **** */
-OP_HANDLER( adca_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $ca ORA extended -**- */
-OP_HANDLER( ora_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $cb ADDA extended **** */
-OP_HANDLER( adda_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $cc JMP extended -*** */
-OP_HANDLER( jmp_ex )
-{
- EXTENDED;
- PC = EA;
-}
-
-/* $cd JSR extended ---- */
-OP_HANDLER( jsr_ex )
-{
- EXTENDED;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $ce LDX extended -**- */
-OP_HANDLER( ldx_ex )
-{
- EXTBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $cf STX extended -**- */
-OP_HANDLER( stx_ex )
-{
- CLR_NZ;
- SET_NZ8(X);
- EXTENDED;
- WM(EAD,X);
-}
-
/* $d0 SUBA indexed, 2 byte offset ?*** */
-OP_HANDLER( suba_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $d1 CMPA indexed, 2 byte offset ?*** */
-OP_HANDLER( cmpa_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $d2 SBCA indexed, 2 byte offset ?*** */
-OP_HANDLER( sbca_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $d3 CPX indexed, 2 byte offset -*** */
-OP_HANDLER( cpx_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $d4 ANDA indexed, 2 byte offset -**- */
-OP_HANDLER( anda_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d5 BITA indexed, 2 byte offset -**- */
-OP_HANDLER( bita_ix2 )
-{
- uint8_t t,r;
- IDX2BYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $d6 LDA indexed, 2 byte offset -**- */
-OP_HANDLER( lda_ix2 )
-{
- IDX2BYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d7 STA indexed, 2 byte offset -**- */
-OP_HANDLER( sta_ix2 )
-{
- CLR_NZ;
- SET_NZ8(A);
- INDEXED2;
- WM(EAD,A);
-}
-
-/* $d8 EORA indexed, 2 byte offset -**- */
-OP_HANDLER( eora_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d9 ADCA indexed, 2 byte offset **** */
-OP_HANDLER( adca_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $da ORA indexed, 2 byte offset -**- */
-OP_HANDLER( ora_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $db ADDA indexed, 2 byte offset **** */
-OP_HANDLER( adda_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $dc JMP indexed, 2 byte offset -*** */
-OP_HANDLER( jmp_ix2 )
-{
- INDEXED2;
- PC = EA;
-}
-
-/* $dd JSR indexed, 2 byte offset ---- */
-OP_HANDLER( jsr_ix2 )
-{
- INDEXED2;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $de LDX indexed, 2 byte offset -**- */
-OP_HANDLER( ldx_ix2 )
-{
- IDX2BYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $df STX indexed, 2 byte offset -**- */
-OP_HANDLER( stx_ix2 )
-{
- CLR_NZ;
- SET_NZ8(X);
- INDEXED2;
- WM(EAD,X);
-}
-
/* $e0 SUBA indexed, 1 byte offset ?*** */
-OP_HANDLER( suba_ix1 )
+/* $f0 SUBA indexed ?*** */
+OP_HANDLER_MODE( suba )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t;
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t;
CLR_NZC;
- SET_FLAGS8(A,t,r);
+ SET_FLAGS8(A, t, r);
A = r;
}
+/* $a1 CMPA immediate ?*** */
+/* $b1 CMPA direct ?*** */
+/* $c1 CMPA extended ?*** */
+/* $d1 CMPA indexed, 2 byte offset ?*** */
/* $e1 CMPA indexed, 1 byte offset ?*** */
-OP_HANDLER( cmpa_ix1 )
+/* $f1 CMPA indexed ?*** */
+OP_HANDLER_MODE( cmpa )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t;
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t;
CLR_NZC;
- SET_FLAGS8(A,t,r);
+ SET_FLAGS8(A, t, r);
}
+/* $a2 SBCA immediate ?*** */
+/* $b2 SBCA direct ?*** */
+/* $c2 SBCA extended ?*** */
+/* $d2 SBCA indexed, 2 byte offset ?*** */
/* $e2 SBCA indexed, 1 byte offset ?*** */
-OP_HANDLER( sbca_ix1 )
+/* $f2 SBCA indexed ?*** */
+OP_HANDLER_MODE( sbca )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t - (CC & 0x01);
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t - BIT(CC, 0);
CLR_NZC;
- SET_FLAGS8(A,t,r);
+ SET_FLAGS8(A, t, r);
A = r;
}
+/* $a3 CPX immediate -*** */
+/* $b3 CPX direct -*** */
+/* $c3 CPX extended -*** */
+/* $d3 CPX indexed, 2 byte offset -*** */
/* $e3 CPX indexed, 1 byte offset -*** */
-OP_HANDLER( cpx_ix1 )
+/* $f3 CPX indexed -*** */
+OP_HANDLER_MODE( cpx )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = X - t;
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = X - t;
CLR_NZC;
- SET_FLAGS8(X,t,r);
+ SET_FLAGS8(X, t, r);
}
+/* $a4 ANDA immediate -**- */
+/* $b4 ANDA direct -**- */
+/* $c4 ANDA extended -**- */
+/* $d4 ANDA indexed, 2 byte offset -**- */
/* $e4 ANDA indexed, 1 byte offset -**- */
-OP_HANDLER( anda_ix1 )
+/* $f4 ANDA indexed -**- */
+OP_HANDLER_MODE( anda )
{
- uint8_t t;
- IDX1BYTE(t);
+ u8 t;
+ ARGBYTE(t);
A &= t;
CLR_NZ;
SET_NZ8(A);
}
+/* $a5 BITA immediate -**- */
+/* $b5 BITA direct -**- */
+/* $c5 BITA extended -**- */
+/* $d5 BITA indexed, 2 byte offset -**- */
/* $e5 BITA indexed, 1 byte offset -**- */
-OP_HANDLER( bita_ix1 )
+/* $f5 BITA indexed -**- */
+OP_HANDLER_MODE( bita )
{
- uint8_t t,r;
- IDX1BYTE(t);
- r = A & t;
+ u8 t;
+ ARGBYTE(t);
+ u8 const r = A & t;
CLR_NZ;
SET_NZ8(r);
}
+/* $a6 LDA immediate -**- */
+/* $b6 LDA direct -**- */
+/* $c6 LDA extended -**- */
+/* $d6 LDA indexed, 2 byte offset -**- */
/* $e6 LDA indexed, 1 byte offset -**- */
-OP_HANDLER( lda_ix1 )
+/* $f6 LDA indexed -**- */
+OP_HANDLER_MODE( lda )
{
- IDX1BYTE(A);
+ ARGBYTE(A);
CLR_NZ;
SET_NZ8(A);
}
+/* $a7 ILLEGAL */
+/* $b7 STA direct -**- */
+/* $c7 STA extended -**- */
+/* $d7 STA indexed, 2 byte offset -**- */
/* $e7 STA indexed, 1 byte offset -**- */
-OP_HANDLER( sta_ix1 )
+/* $f7 STA indexed -**- */
+OP_HANDLER_MODE( sta )
{
CLR_NZ;
SET_NZ8(A);
- INDEXED1;
- WM(EAD,A);
+ ARGADDR;
+ WM(EAD, A);
}
+/* $a8 EORA immediate -**- */
+/* $b8 EORA direct -**- */
+/* $c8 EORA extended -**- */
+/* $d8 EORA indexed, 2 byte offset -**- */
/* $e8 EORA indexed, 1 byte offset -**- */
-OP_HANDLER( eora_ix1 )
+/* $f8 EORA indexed -**- */
+OP_HANDLER_MODE( eora )
{
- uint8_t t;
- IDX1BYTE(t);
+ u8 t;
+ ARGBYTE(t);
A ^= t;
CLR_NZ;
SET_NZ8(A);
}
+/* $a9 ADCA immediate **** */
+/* $b9 ADCA direct **** */
+/* $c9 ADCA extended **** */
+/* $d9 ADCA indexed, 2 byte offset **** */
/* $e9 ADCA indexed, 1 byte offset **** */
-OP_HANDLER( adca_ix1 )
+/* $f9 ADCA indexed **** */
+OP_HANDLER_MODE( adca )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A + t + (CC & 0x01);
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A + t + BIT(CC, 0);
CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
+ SET_FLAGS8(A, t, r);
+ SET_H(A, t, r);
A = r;
}
+/* $aa ORA immediate -**- */
+/* $ba ORA direct -**- */
+/* $ca ORA extended -**- */
+/* $da ORA indexed, 2 byte offset -**- */
/* $ea ORA indexed, 1 byte offset -**- */
-OP_HANDLER( ora_ix1 )
+/* $fa ORA indexed -**- */
+OP_HANDLER_MODE( ora )
{
- uint8_t t;
- IDX1BYTE(t);
+ u8 t;
+ ARGBYTE(t);
A |= t;
CLR_NZ;
SET_NZ8(A);
}
+/* $ab ADDA immediate **** */
+/* $bb ADDA direct **** */
+/* $cb ADDA extended **** */
+/* $db ADDA indexed, 2 byte offset **** */
/* $eb ADDA indexed, 1 byte offset **** */
-OP_HANDLER( adda_ix1 )
+/* $fb ADDA indexed **** */
+OP_HANDLER_MODE( adda )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A + t;
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A + t;
CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
+ SET_FLAGS8(A, t, r);
+ SET_H(A, t, r);
A = r;
}
+/* $ac ILLEGAL */
+/* $bc JMP direct -*** */
+/* $cc JMP extended -*** */
+/* $dc JMP indexed, 2 byte offset -*** */
/* $ec JMP indexed, 1 byte offset -*** */
-OP_HANDLER( jmp_ix1 )
+/* $fc JMP indexed -*** */
+OP_HANDLER_MODE( jmp )
{
- INDEXED1;
+ ARGADDR;
PC = EA;
}
-/* $ed JSR indexed, 1 byte offset ---- */
-OP_HANDLER( jsr_ix1 )
+/* $ad BSR ---- */
+OP_HANDLER( bsr )
{
- INDEXED1;
+ u8 t;
+ IMMBYTE(t);
PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $ee LDX indexed, 1 byte offset -**- */
-OP_HANDLER( ldx_ix1 )
-{
- IDX1BYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $ef STX indexed, 1 byte offset -**- */
-OP_HANDLER( stx_ix1 )
-{
- CLR_NZ;
- SET_NZ8(X);
- INDEXED1;
- WM(EAD,X);
-}
-
-/* $f0 SUBA indexed ?*** */
-OP_HANDLER( suba_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $f1 CMPA indexed ?*** */
-OP_HANDLER( cmpa_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $f2 SBCA indexed ?*** */
-OP_HANDLER( sbca_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $f3 CPX indexed -*** */
-OP_HANDLER( cpx_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $f4 ANDA indexed -**- */
-OP_HANDLER( anda_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f5 BITA indexed -**- */
-OP_HANDLER( bita_ix )
-{
- uint8_t t,r;
- IDXBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $f6 LDA indexed -**- */
-OP_HANDLER( lda_ix )
-{
- IDXBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f7 STA indexed -**- */
-OP_HANDLER( sta_ix )
-{
- CLR_NZ;
- SET_NZ8(A);
- INDEXED;
- WM(EAD,A);
-}
-
-/* $f8 EORA indexed -**- */
-OP_HANDLER( eora_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f9 ADCA indexed **** */
-OP_HANDLER( adca_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $fa ORA indexed -**- */
-OP_HANDLER( ora_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $fb ADDA indexed **** */
-OP_HANDLER( adda_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $fc JMP indexed -*** */
-OP_HANDLER( jmp_ix )
-{
- INDEXED;
- PC = EA;
+ PC += SIGNED(t);
}
+/* $bd JSR direct ---- */
+/* $cd JSR extended ---- */
+/* $dd JSR indexed, 2 byte offset ---- */
+/* $ed JSR indexed, 1 byte offset ---- */
/* $fd JSR indexed ---- */
-OP_HANDLER( jsr_ix )
+OP_HANDLER_MODE( jsr )
{
- INDEXED;
+ ARGADDR;
PUSHWORD(m_pc);
PC = EA;
}
+/* $ae LDX immediate -**- */
+/* $be LDX direct -**- */
+/* $ce LDX extended -**- */
+/* $de LDX indexed, 2 byte offset -**- */
+/* $ee LDX indexed, 1 byte offset -**- */
/* $fe LDX indexed -**- */
-OP_HANDLER( ldx_ix )
+OP_HANDLER_MODE( ldx )
{
- IDXBYTE(X);
+ ARGBYTE(X);
CLR_NZ;
SET_NZ8(X);
}
+/* $af ILLEGAL */
+/* $bf STX direct -**- */
+/* $cf STX extended -**- */
+/* $df STX indexed, 2 byte offset -**- */
+/* $ef STX indexed, 1 byte offset -**- */
/* $ff STX indexed -**- */
-OP_HANDLER( stx_ix )
+OP_HANDLER_MODE( stx )
{
CLR_NZ;
SET_NZ8(X);
- INDEXED;
- WM(EAD,X);
+ ARGADDR;
+ WM(EAD, X);
}
diff --git a/src/devices/cpu/m6805/m6805.cpp b/src/devices/cpu/m6805/m6805.cpp
index bc1844f5bbf..f07a1249244 100644
--- a/src/devices/cpu/m6805/m6805.cpp
+++ b/src/devices/cpu/m6805/m6805.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
/*** m6805: Portable 6805 emulator ******************************************
m6805.c (Also supports hd68705 and hd63705 variants)
@@ -42,44 +42,92 @@
#define IRQ_LEVEL_DETECT 0
-const uint8_t m6805_base_device::m_flags8i[256]= /* increment */
-{
- 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
+#define OP(name) (&m6805_base_device::name)
+#define OP_T(name) (&m6805_base_device::name<true>)
+#define OP_F(name) (&m6805_base_device::name<false>)
+#define OP_IM(name) (&m6805_base_device::name<addr_mode::IM>)
+#define OP_DI(name) (&m6805_base_device::name<addr_mode::DI>)
+#define OP_EX(name) (&m6805_base_device::name<addr_mode::EX>)
+#define OP_IX(name) (&m6805_base_device::name<addr_mode::IX>)
+#define OP_IX1(name) (&m6805_base_device::name<addr_mode::IX1>)
+#define OP_IX2(name) (&m6805_base_device::name<addr_mode::IX2>)
+const m6805_base_device::op_handler_func m6805_base_device::m_ophndlr[256] =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
+ OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
+ /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
+ OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP(bil), OP(bih),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(illegal), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
-const uint8_t m6805_base_device::m_flags8d[256]= /* decrement */
-{
- 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
+const uint8_t m6805_base_device::m_flags8i[256] = /* increment */
+{
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ /*0*/ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*1*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*2*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*4*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*5*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*6*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*7*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*8*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*9*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*A*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*B*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*C*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*D*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*E*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*F*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
+};
+
+const uint8_t m6805_base_device::m_flags8d[256] = /* decrement */
+{
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ /*0*/ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*1*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*2*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*4*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*5*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*6*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*7*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /*8*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*9*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*A*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*B*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*C*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*D*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*E*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
+ /*F*/ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
};
/* what they say it is ... */
@@ -88,8 +136,8 @@ const uint8_t m6805_base_device::m_cycles1[] =
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/*0*/ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
/*1*/ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- /*2*/ 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- /*3*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 6, 0, 6, 6, 0,
+ /*2*/ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ /*3*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6,
/*4*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4,
/*5*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4,
/*6*/ 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7,
@@ -487,8 +535,6 @@ uint32_t m6805_base_device::execute_input_lines() const
/* execute instructions on this CPU until icount expires */
void m6805_base_device::execute_run()
{
- uint8_t ireg;
-
S = SP_ADJUST( S ); /* Taken from CPU_SET_CONTEXT when pointer'afying */
do
@@ -500,271 +546,9 @@ void m6805_base_device::execute_run()
debugger_instruction_hook(this, PC);
- ireg = M_RDOP(PC++);
+ u8 const ireg = M_RDOP(PC++);
- switch (ireg)
- {
- case 0x00: brset(0x01); break;
- case 0x01: brclr(0x01); break;
- case 0x02: brset(0x02); break;
- case 0x03: brclr(0x02); break;
- case 0x04: brset(0x04); break;
- case 0x05: brclr(0x04); break;
- case 0x06: brset(0x08); break;
- case 0x07: brclr(0x08); break;
- case 0x08: brset(0x10); break;
- case 0x09: brclr(0x10); break;
- case 0x0A: brset(0x20); break;
- case 0x0B: brclr(0x20); break;
- case 0x0C: brset(0x40); break;
- case 0x0D: brclr(0x40); break;
- case 0x0E: brset(0x80); break;
- case 0x0F: brclr(0x80); break;
- case 0x10: bset(0x01); break;
- case 0x11: bclr(0x01); break;
- case 0x12: bset(0x02); break;
- case 0x13: bclr(0x02); break;
- case 0x14: bset(0x04); break;
- case 0x15: bclr(0x04); break;
- case 0x16: bset(0x08); break;
- case 0x17: bclr(0x08); break;
- case 0x18: bset(0x10); break;
- case 0x19: bclr(0x10); break;
- case 0x1a: bset(0x20); break;
- case 0x1b: bclr(0x20); break;
- case 0x1c: bset(0x40); break;
- case 0x1d: bclr(0x40); break;
- case 0x1e: bset(0x80); break;
- case 0x1f: bclr(0x80); break;
- case 0x20: bra(); break;
- case 0x21: brn(); break;
- case 0x22: bhi(); break;
- case 0x23: bls(); break;
- case 0x24: bcc(); break;
- case 0x25: bcs(); break;
- case 0x26: bne(); break;
- case 0x27: beq(); break;
- case 0x28: bhcc(); break;
- case 0x29: bhcs(); break;
- case 0x2a: bpl(); break;
- case 0x2b: bmi(); break;
- case 0x2c: bmc(); break;
- case 0x2d: bms(); break;
- case 0x2e: bil(); break;
- case 0x2f: bih(); break;
- case 0x30: neg_di(); break;
- case 0x31: illegal(); break;
- case 0x32: illegal(); break;
- case 0x33: com_di(); break;
- case 0x34: lsr_di(); break;
- case 0x35: illegal(); break;
- case 0x36: ror_di(); break;
- case 0x37: asr_di(); break;
- case 0x38: lsl_di(); break;
- case 0x39: rol_di(); break;
- case 0x3a: dec_di(); break;
- case 0x3b: illegal(); break;
- case 0x3c: inc_di(); break;
- case 0x3d: tst_di(); break;
- case 0x3e: illegal(); break;
- case 0x3f: clr_di(); break;
- case 0x40: nega(); break;
- case 0x41: illegal(); break;
- case 0x42: illegal(); break;
- case 0x43: coma(); break;
- case 0x44: lsra(); break;
- case 0x45: illegal(); break;
- case 0x46: rora(); break;
- case 0x47: asra(); break;
- case 0x48: lsla(); break;
- case 0x49: rola(); break;
- case 0x4a: deca(); break;
- case 0x4b: illegal(); break;
- case 0x4c: inca(); break;
- case 0x4d: tsta(); break;
- case 0x4e: illegal(); break;
- case 0x4f: clra(); break;
- case 0x50: negx(); break;
- case 0x51: illegal(); break;
- case 0x52: illegal(); break;
- case 0x53: comx(); break;
- case 0x54: lsrx(); break;
- case 0x55: illegal(); break;
- case 0x56: rorx(); break;
- case 0x57: asrx(); break;
- case 0x58: aslx(); break;
- case 0x59: rolx(); break;
- case 0x5a: decx(); break;
- case 0x5b: illegal(); break;
- case 0x5c: incx(); break;
- case 0x5d: tstx(); break;
- case 0x5e: illegal(); break;
- case 0x5f: clrx(); break;
- case 0x60: neg_ix1(); break;
- case 0x61: illegal(); break;
- case 0x62: illegal(); break;
- case 0x63: com_ix1(); break;
- case 0x64: lsr_ix1(); break;
- case 0x65: illegal(); break;
- case 0x66: ror_ix1(); break;
- case 0x67: asr_ix1(); break;
- case 0x68: lsl_ix1(); break;
- case 0x69: rol_ix1(); break;
- case 0x6a: dec_ix1(); break;
- case 0x6b: illegal(); break;
- case 0x6c: inc_ix1(); break;
- case 0x6d: tst_ix1(); break;
- case 0x6e: illegal(); break;
- case 0x6f: clr_ix1(); break;
- case 0x70: neg_ix(); break;
- case 0x71: illegal(); break;
- case 0x72: illegal(); break;
- case 0x73: com_ix(); break;
- case 0x74: lsr_ix(); break;
- case 0x75: illegal(); break;
- case 0x76: ror_ix(); break;
- case 0x77: asr_ix(); break;
- case 0x78: lsl_ix(); break;
- case 0x79: rol_ix(); break;
- case 0x7a: dec_ix(); break;
- case 0x7b: illegal(); break;
- case 0x7c: inc_ix(); break;
- case 0x7d: tst_ix(); break;
- case 0x7e: illegal(); break;
- case 0x7f: clr_ix(); break;
- case 0x80: rti(); break;
- case 0x81: rts(); break;
- case 0x82: illegal(); break;
- case 0x83: swi(); break;
- case 0x84: illegal(); break;
- case 0x85: illegal(); break;
- case 0x86: illegal(); break;
- case 0x87: illegal(); break;
- case 0x88: illegal(); break;
- case 0x89: illegal(); break;
- case 0x8a: illegal(); break;
- case 0x8b: illegal(); break;
- case 0x8c: illegal(); break;
- case 0x8d: illegal(); break;
- case 0x8e: illegal(); break;
- case 0x8f: illegal(); break;
- case 0x90: illegal(); break;
- case 0x91: illegal(); break;
- case 0x92: illegal(); break;
- case 0x93: illegal(); break;
- case 0x94: illegal(); break;
- case 0x95: illegal(); break;
- case 0x96: illegal(); break;
- case 0x97: tax(); break;
- case 0x98: CLC; break;
- case 0x99: SEC; break;
-#if IRQ_LEVEL_DETECT
- case 0x9a: CLI; if (m_irq_state != CLEAR_LINE) m_pending_interrupts |= 1 << M6805_IRQ_LINE; break;
-#else
- case 0x9a: CLI; break;
-#endif
- case 0x9b: SEI; break;
- case 0x9c: rsp(); break;
- case 0x9d: nop(); break;
- case 0x9e: illegal(); break;
- case 0x9f: txa(); break;
- case 0xa0: suba_im(); break;
- case 0xa1: cmpa_im(); break;
- case 0xa2: sbca_im(); break;
- case 0xa3: cpx_im(); break;
- case 0xa4: anda_im(); break;
- case 0xa5: bita_im(); break;
- case 0xa6: lda_im(); break;
- case 0xa7: illegal(); break;
- case 0xa8: eora_im(); break;
- case 0xa9: adca_im(); break;
- case 0xaa: ora_im(); break;
- case 0xab: adda_im(); break;
- case 0xac: illegal(); break;
- case 0xad: bsr(); break;
- case 0xae: ldx_im(); break;
- case 0xaf: illegal(); break;
- case 0xb0: suba_di(); break;
- case 0xb1: cmpa_di(); break;
- case 0xb2: sbca_di(); break;
- case 0xb3: cpx_di(); break;
- case 0xb4: anda_di(); break;
- case 0xb5: bita_di(); break;
- case 0xb6: lda_di(); break;
- case 0xb7: sta_di(); break;
- case 0xb8: eora_di(); break;
- case 0xb9: adca_di(); break;
- case 0xba: ora_di(); break;
- case 0xbb: adda_di(); break;
- case 0xbc: jmp_di(); break;
- case 0xbd: jsr_di(); break;
- case 0xbe: ldx_di(); break;
- case 0xbf: stx_di(); break;
- case 0xc0: suba_ex(); break;
- case 0xc1: cmpa_ex(); break;
- case 0xc2: sbca_ex(); break;
- case 0xc3: cpx_ex(); break;
- case 0xc4: anda_ex(); break;
- case 0xc5: bita_ex(); break;
- case 0xc6: lda_ex(); break;
- case 0xc7: sta_ex(); break;
- case 0xc8: eora_ex(); break;
- case 0xc9: adca_ex(); break;
- case 0xca: ora_ex(); break;
- case 0xcb: adda_ex(); break;
- case 0xcc: jmp_ex(); break;
- case 0xcd: jsr_ex(); break;
- case 0xce: ldx_ex(); break;
- case 0xcf: stx_ex(); break;
- case 0xd0: suba_ix2(); break;
- case 0xd1: cmpa_ix2(); break;
- case 0xd2: sbca_ix2(); break;
- case 0xd3: cpx_ix2(); break;
- case 0xd4: anda_ix2(); break;
- case 0xd5: bita_ix2(); break;
- case 0xd6: lda_ix2(); break;
- case 0xd7: sta_ix2(); break;
- case 0xd8: eora_ix2(); break;
- case 0xd9: adca_ix2(); break;
- case 0xda: ora_ix2(); break;
- case 0xdb: adda_ix2(); break;
- case 0xdc: jmp_ix2(); break;
- case 0xdd: jsr_ix2(); break;
- case 0xde: ldx_ix2(); break;
- case 0xdf: stx_ix2(); break;
- case 0xe0: suba_ix1(); break;
- case 0xe1: cmpa_ix1(); break;
- case 0xe2: sbca_ix1(); break;
- case 0xe3: cpx_ix1(); break;
- case 0xe4: anda_ix1(); break;
- case 0xe5: bita_ix1(); break;
- case 0xe6: lda_ix1(); break;
- case 0xe7: sta_ix1(); break;
- case 0xe8: eora_ix1(); break;
- case 0xe9: adca_ix1(); break;
- case 0xea: ora_ix1(); break;
- case 0xeb: adda_ix1(); break;
- case 0xec: jmp_ix1(); break;
- case 0xed: jsr_ix1(); break;
- case 0xee: ldx_ix1(); break;
- case 0xef: stx_ix1(); break;
- case 0xf0: suba_ix(); break;
- case 0xf1: cmpa_ix(); break;
- case 0xf2: sbca_ix(); break;
- case 0xf3: cpx_ix(); break;
- case 0xf4: anda_ix(); break;
- case 0xf5: bita_ix(); break;
- case 0xf6: lda_ix(); break;
- case 0xf7: sta_ix(); break;
- case 0xf8: eora_ix(); break;
- case 0xf9: adca_ix(); break;
- case 0xfa: ora_ix(); break;
- case 0xfb: adda_ix(); break;
- case 0xfc: jmp_ix(); break;
- case 0xfd: jsr_ix(); break;
- case 0xfe: ldx_ix(); break;
- case 0xff: stx_ix(); break;
- }
+ (this->*m_ophndlr[ireg])();
m_icount -= m_cycles1[ireg];
burn_cycles(m_cycles1[ireg]);
}
diff --git a/src/devices/cpu/m6805/m6805.h b/src/devices/cpu/m6805/m6805.h
index 5d0dfede083..d60bc5bcec2 100644
--- a/src/devices/cpu/m6805/m6805.h
+++ b/src/devices/cpu/m6805/m6805.h
@@ -26,6 +26,18 @@ public:
m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, const char *shortname, const char *source);
protected:
+ enum class addr_mode { IM, DI, EX, IX, IX1, IX2 };
+
+ enum
+ {
+ M6805_PC = 1,
+ M6805_S,
+ M6805_CC,
+ M6805_A,
+ M6805_X,
+ M6805_IRQ_STATE
+ };
+
m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source);
// device-level overrides
@@ -55,63 +67,39 @@ protected:
// for devices with timing-sensitive peripherals
virtual void burn_cycles(unsigned count) { }
-private:
- // opcode/condition tables
- static const uint8_t m_flags8i[256];
- static const uint8_t m_flags8d[256];
- static const uint8_t m_cycles1[256];
-
-protected:
- enum
- {
- M6805_PC = 1,
- M6805_S,
- M6805_CC,
- M6805_A,
- M6805_X,
- M6805_IRQ_STATE
- };
-
void rd_s_handler_b(uint8_t *b);
void rd_s_handler_w(PAIR *p);
void wr_s_handler_b(uint8_t *b);
void wr_s_handler_w(PAIR *p);
void RM16(uint32_t addr, PAIR *p);
- void brset(uint8_t bit);
- void brclr(uint8_t bit);
- void bset(uint8_t bit);
- void bclr(uint8_t bit);
-
- void bra();
- void brn();
- void bhi();
- void bls();
- void bcc();
- void bcs();
- void bne();
- void beq();
- void bhcc();
- void bhcs();
- void bpl();
- void bmi();
- void bmc();
- void bms();
+ template <unsigned B> void brset();
+ template <unsigned B> void brclr();
+ template <unsigned B> void bset();
+ template <unsigned B> void bclr();
+
+ template <bool C> void bra();
+ template <bool C> void bhi();
+ template <bool C> void bcc();
+ template <bool C> void bne();
+ template <bool C> void bhcc();
+ template <bool C> void bpl();
+ template <bool C> void bmc();
virtual void bil();
virtual void bih();
void bsr();
- void neg_di();
- void com_di();
- void lsr_di();
- void ror_di();
- void asr_di();
- void lsl_di();
- void rol_di();
- void dec_di();
- void inc_di();
- void tst_di();
- void clr_di();
+ template <addr_mode M> void neg();
+ template <addr_mode M> void com();
+ template <addr_mode M> void lsr();
+ template <addr_mode M> void ror();
+ template <addr_mode M> void asr();
+ template <addr_mode M> void lsl();
+ template <addr_mode M> void rol();
+ template <addr_mode M> void dec();
+ template <addr_mode M> void inc();
+ template <addr_mode M> void tst();
+ template <addr_mode M> void clr();
void nega();
void coma();
@@ -130,38 +118,13 @@ protected:
void lsrx();
void rorx();
void asrx();
- void aslx();
-// void lslx();
+ void lslx();
void rolx();
void decx();
void incx();
void tstx();
void clrx();
- void neg_ix1();
- void com_ix1();
- void lsr_ix1();
- void ror_ix1();
- void asr_ix1();
- void lsl_ix1();
- void rol_ix1();
- void dec_ix1();
- void inc_ix1();
- void tst_ix1();
- void clr_ix1();
-
- void neg_ix();
- void com_ix();
- void lsr_ix();
- void ror_ix();
- void asr_ix();
- void lsl_ix();
- void rol_ix();
- void dec_ix();
- void inc_ix();
- void tst_ix();
- void clr_ix();
-
void rti();
void rts();
virtual void swi();
@@ -169,102 +132,30 @@ protected:
void tax();
void txa();
+ void clc();
+ void sec();
+ void cli();
+ void sei();
+
void rsp();
void nop();
- void suba_im();
- void cmpa_im();
- void sbca_im();
- void cpx_im();
- void anda_im();
- void bita_im();
- void lda_im();
- void eora_im();
- void adca_im();
- void ora_im();
- void adda_im();
-
- void ldx_im();
- void suba_di();
- void cmpa_di();
- void sbca_di();
- void cpx_di();
- void anda_di();
- void bita_di();
- void lda_di();
- void sta_di();
- void eora_di();
- void adca_di();
- void ora_di();
- void adda_di();
- void jmp_di();
- void jsr_di();
- void ldx_di();
- void stx_di();
- void suba_ex();
- void cmpa_ex();
- void sbca_ex();
- void cpx_ex();
- void anda_ex();
- void bita_ex();
- void lda_ex();
- void sta_ex();
- void eora_ex();
- void adca_ex();
- void ora_ex();
- void adda_ex();
- void jmp_ex();
- void jsr_ex();
- void ldx_ex();
- void stx_ex();
- void suba_ix2();
- void cmpa_ix2();
- void sbca_ix2();
- void cpx_ix2();
- void anda_ix2();
- void bita_ix2();
- void lda_ix2();
- void sta_ix2();
- void eora_ix2();
- void adca_ix2();
- void ora_ix2();
- void adda_ix2();
- void jmp_ix2();
- void jsr_ix2();
- void ldx_ix2();
- void stx_ix2();
- void suba_ix1();
- void cmpa_ix1();
- void sbca_ix1();
- void cpx_ix1();
- void anda_ix1();
- void bita_ix1();
- void lda_ix1();
- void sta_ix1();
- void eora_ix1();
- void adca_ix1();
- void ora_ix1();
- void adda_ix1();
- void jmp_ix1();
- void jsr_ix1();
- void ldx_ix1();
- void stx_ix1();
- void suba_ix();
- void cmpa_ix();
- void sbca_ix();
- void cpx_ix();
- void anda_ix();
- void bita_ix();
- void lda_ix();
- void sta_ix();
- void eora_ix();
- void adca_ix();
- void ora_ix();
- void adda_ix();
- void jmp_ix();
- void jsr_ix();
- void ldx_ix();
- void stx_ix();
+ template <addr_mode M> void suba();
+ template <addr_mode M> void cmpa();
+ template <addr_mode M> void sbca();
+ template <addr_mode M> void cpx();
+ template <addr_mode M> void anda();
+ template <addr_mode M> void bita();
+ template <addr_mode M> void lda();
+ template <addr_mode M> void sta();
+ template <addr_mode M> void eora();
+ template <addr_mode M> void adca();
+ template <addr_mode M> void ora();
+ template <addr_mode M> void adda();
+ template <addr_mode M> void jmp();
+ template <addr_mode M> void jsr();
+ template <addr_mode M> void ldx();
+ template <addr_mode M> void stx();
void illegal();
@@ -298,6 +189,15 @@ protected:
// address spaces
address_space *m_program;
direct_read_data *m_direct;
+
+private:
+ typedef void (m6805_base_device::*op_handler_func)();
+
+ // opcode/condition tables
+ static const op_handler_func m_ophndlr[256];
+ static const uint8_t m_flags8i[256];
+ static const uint8_t m_flags8d[256];
+ static const uint8_t m_cycles1[256];
};
diff --git a/src/devices/cpu/m6805/m6805defs.h b/src/devices/cpu/m6805/m6805defs.h
index 2fc83194500..d6452d33185 100644
--- a/src/devices/cpu/m6805/m6805defs.h
+++ b/src/devices/cpu/m6805/m6805defs.h
@@ -53,9 +53,9 @@
#define SP_ADJUST(s) ( ( (s) & SP_MASK ) | SP_LOW )
/* macros to access memory */
-#define IMMBYTE(b) {b = M_RDOP_ARG(PC++);}
-#define IMMWORD(w) {w.d = 0; w.b.h = M_RDOP_ARG(PC); w.b.l = M_RDOP_ARG(PC+1); PC+=2;}
-#define SKIPBYTE() {M_RDOP_ARG(PC++);}
+#define IMMBYTE(b) do { b = M_RDOP_ARG(PC++); } while (false)
+#define IMMWORD(w) do { w.d = 0; w.b.h = M_RDOP_ARG(PC); w.b.l = M_RDOP_ARG(PC+1); PC+=2; } while (false)
+#define SKIPBYTE() do { M_RDOP_ARG(PC++); } while (false)
#define PUSHBYTE(b) wr_s_handler_b(&b)
#define PUSHWORD(w) wr_s_handler_w(&w)
@@ -91,15 +91,15 @@
#define SET_FLAGS8(a,b,r) {SET_N8(r); SET_Z8(r); SET_C8(r);}
/* for treating an unsigned uint8_t as a signed int16_t */
-#define SIGNED(b) ((int16_t)(b & 0x80 ? b | 0xff00 : b))
+#define SIGNED(b) (int16_t(b & 0x80 ? b | 0xff00 : b))
/* Macros for addressing modes */
-#define DIRECT EAD=0; IMMBYTE(m_ea.b.l)
-#define IMM8 EA = PC++
+#define DIRECT do { EAD=0; IMMBYTE(m_ea.b.l); } while (false)
+#define IMM8 do { EA = PC++; } while (false)
#define EXTENDED IMMWORD(m_ea)
-#define INDEXED EA = X
-#define INDEXED1 {EAD = 0; IMMBYTE(m_ea.b.l); EA += X;}
-#define INDEXED2 {IMMWORD(m_ea); EA += X;}
+#define INDEXED do { EA = X; } while (false)
+#define INDEXED1 do { EAD = 0; IMMBYTE(m_ea.b.l); EA += X; } while (false)
+#define INDEXED2 do { IMMWORD(m_ea); EA += X;} while (false)
/* macros to set status flags */
#if defined(SEC)
@@ -117,13 +117,32 @@
#define CLI CC &=~ IFLAG
/* macros for convenience */
-#define DIRBYTE(b) {DIRECT; b = RM(EAD);}
-#define EXTBYTE(b) {EXTENDED; b = RM(EAD);}
-#define IDXBYTE(b) {INDEXED; b = RM(EAD);}
-#define IDX1BYTE(b) {INDEXED1; b = RM(EAD);}
-#define IDX2BYTE(b) {INDEXED2; b = RM(EAD);}
+#define ARGADDR \
+ do { switch (M) { \
+ case addr_mode::IM: static_assert(addr_mode::IM != M, "invalid mode for this instruction"); break; \
+ case addr_mode::DI: DIRECT; break; \
+ case addr_mode::EX: EXTENDED; break; \
+ case addr_mode::IX: INDEXED; break; \
+ case addr_mode::IX1: INDEXED1; break; \
+ case addr_mode::IX2: INDEXED2; break; \
+ } } while (false)
+#define DIRBYTE(b) do { DIRECT; b = RM(EAD); } while (false)
+#define EXTBYTE(b) do { EXTENDED; b = RM(EAD); } while (false)
+#define IDXBYTE(b) do { INDEXED; b = RM(EAD); } while (false)
+#define IDX1BYTE(b) do { INDEXED1; b = RM(EAD); } while (false)
+#define IDX2BYTE(b) do { INDEXED2; b = RM(EAD); } while (false)
+#define ARGBYTE(b) \
+ do { switch (M) { \
+ case addr_mode::IM: IMMBYTE(b); break; \
+ case addr_mode::DI: DIRBYTE(b); break; \
+ case addr_mode::EX: EXTBYTE(b); break; \
+ case addr_mode::IX: IDXBYTE(b); break; \
+ case addr_mode::IX1: IDX1BYTE(b); break; \
+ case addr_mode::IX2: IDX2BYTE(b); break; \
+ } } while (false)
+
/* Macros for branch instructions */
-#define BRANCH(f) { uint8_t t; IMMBYTE(t); if(f) { PC += SIGNED(t); } }
+#define BRANCH(f) do { uint8_t t; IMMBYTE(t); if (bool(f) == bool(C)) PC += SIGNED(t); } while (false)
/* pre-clear a PAIR union; clearing h2 and h3 only might be faster? */
#define CLEAR_PAIR(p) p->d = 0
diff --git a/src/emu/logmacro.h b/src/emu/logmacro.h
index 23328afa36d..14f80772461 100644
--- a/src/emu/logmacro.h
+++ b/src/emu/logmacro.h
@@ -15,6 +15,6 @@
#define LOG_GENERAL (1U << 0)
-#define LOGMASKED(mask, ...) do {if (VERBOSE & (mask)) (LOG_OUTPUT_FUNC)(__VA_ARGS__); } while (0)
+#define LOGMASKED(mask, ...) do { if (VERBOSE & (mask)) (LOG_OUTPUT_FUNC)(__VA_ARGS__); } while (false)
#define LOG(...) LOGMASKED(LOG_GENERAL, __VA_ARGS__)