diff options
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 |
commit | 59ed49f7097a3c64391561c7340ddac0b23710e1 (patch) | |
tree | 977d8fc2644aa9602648a36e3fa44f1e3f5d5d71 | |
parent | 19a91227487d1f059796137e1c78920b29f553b3 (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.hxx | 1528 | ||||
-rw-r--r-- | src/devices/cpu/m6805/m6805.cpp | 394 | ||||
-rw-r--r-- | src/devices/cpu/m6805/m6805.h | 232 | ||||
-rw-r--r-- | src/devices/cpu/m6805/m6805defs.h | 49 | ||||
-rw-r--r-- | src/emu/logmacro.h | 2 |
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__) |