📄 6809ops.c
字号:
/*
HNZVC
? = undefined
* = affected
- = unaffected
0 = cleared
1 = set
# = ccr directly affected by instruction
@ = special - carry set if bit 7 is set
*/
#if macintosh
#pragma mark ____0x____
#endif
/* $00 NEG direct ?**** */
INLINE void neg_di( void )
{
word r,t;
DIRBYTE(t); r=-t;
CLR_NZVC; SET_FLAGS8(0,t,r);
M_WRMEM(eaddr,r);
}
/* $01 ILLEGAL */
/* $02 ILLEGAL */
/* $03 COM direct -**01 */
INLINE void com_di( void )
{
byte t;
DIRBYTE(t); t = ~t;
CLR_NZV; SET_NZ8(t); SEC;
M_WRMEM(eaddr,t);
}
/* $04 LSR direct -0*-* */
INLINE void lsr_di( void )
{
byte t;
DIRBYTE(t); CLR_NZC; cc|=(t&0x01);
t>>=1; SET_Z8(t);
M_WRMEM(eaddr,t);
}
/* $05 ILLEGAL */
/* $06 ROR direct -**-* */
INLINE void ror_di( void )
{
byte t,r;
DIRBYTE(t); r=(cc&0x01)<<7;
CLR_NZC; cc|=(t&0x01);
r |= t>>1; SET_NZ8(r);
M_WRMEM(eaddr,r);
}
/* $07 ASR direct ?**-* */
INLINE void asr_di( void )
{
byte t;
DIRBYTE(t); CLR_NZC; cc|=(t&0x01);
t>>=1; t|=((t&0x40)<<1);
SET_NZ8(t);
M_WRMEM(eaddr,t);
}
/* $08 ASL direct ?**** */
INLINE void asl_di( void )
{
word t,r;
DIRBYTE(t); r=t<<1;
CLR_NZVC; SET_FLAGS8(t,t,r);
M_WRMEM(eaddr,r);
}
/* $09 ROL direct -**** */
INLINE void rol_di( void )
{
word t,r;
DIRBYTE(t); r = cc&0x01; r |= t<<1;
CLR_NZVC; SET_FLAGS8(t,t,r);
M_WRMEM(eaddr,r);
}
/* $0A DEC direct -***- */
INLINE void dec_di( void )
{
byte t;
DIRBYTE(t); --t;
CLR_NZV; SET_FLAGS8D(t);
M_WRMEM(eaddr,t);
}
/* $0B ILLEGAL */
/* $OC INC direct -***- */
INLINE void inc_di( void )
{
byte t;
DIRBYTE(t); ++t;
CLR_NZV; SET_FLAGS8I(t);
M_WRMEM(eaddr,t);
}
/* $OD TST direct -**0- */
INLINE void tst_di( void )
{
byte t;
DIRBYTE(t); CLR_NZV; SET_NZ8(t);
}
/* $0E JMP direct ----- */
INLINE void jmp_di( void )
{
DIRECT; pcreg=eaddr;change_pc(pcreg);/* ASG 971005 */
}
/* $0E JMP direct ----- */
INLINE void jmp_di_slap( void )
{
DIRECT; pcreg=eaddr;cpu_setOPbase16(pcreg); /* LBO 092898 */
}
/* $0F CLR direct -0100 */
INLINE void clr_di( void )
{
DIRECT; M_WRMEM(eaddr,0);
CLR_NZVC; SEZ;
}
#if macintosh
#pragma mark ____1x____
#endif
/* $10 FLAG */
/* $11 FLAG */
/* $12 NOP inherent ----- */
INLINE void nop( void )
{
;
}
/* $13 SYNC inherent ----- */
INLINE void sync6809( void )
{
/* SYNC should stop processing instructions until an interrupt occurs.
A decent fake is probably to force an immediate IRQ. */
m6809_ICount = 0;
pending_interrupts |= M6809_SYNC; /* NS 980101 */
}
/* $14 ILLEGAL */
/* $15 ILLEGAL */
/* $16 LBRA relative ----- */
INLINE void lbra( void )
{
IMMWORD(eaddr);
pcreg+=eaddr;change_pc(pcreg);/* ASG 971005 */
if ( eaddr == 0xfffd ) /* EHC 980508 speed up busy loop */
m6809_ICount = 0;
}
/* $17 LBSR relative ----- */
INLINE void lbsr( void )
{
IMMWORD(eaddr); PUSHWORD(pcreg); pcreg+=eaddr;change_pc(pcreg);/* ASG 971005 */
}
/* $18 ILLEGAL */
#if 1
/* $19 DAA inherent (areg) -**0* */
INLINE void daa( void )
{
byte msn, lsn;
word t, cf = 0;
msn=areg & 0xf0; lsn=areg & 0x0f;
if( lsn>0x09 || cc&0x20 ) cf |= 0x06;
if( msn>0x80 && lsn>0x09 ) cf |= 0x60;
if( msn>0x90 || cc&0x01 ) cf |= 0x60;
t = cf + areg;
CLR_NZV; /* keep carry from previous operation */
SET_NZ8((byte)t); SET_C8(t);
areg = t;
}
#else
/* $19 DAA inherent (areg) -**0* */
INLINE void daa( void )
{
word t;
t=areg;
if (cc&0x20) t+=0x06;
if ((t&0x0f)>9) t+=0x06; /* ASG -- this code is broken! $66+$99=$FF -> DAA should = $65, we get $05! */
if (cc&0x01) t+=0x60;
if ((t&0xf0)>0x90) t+=0x60;
if (t&0x100) SEC;
areg=t;
}
#endif
/* $1A ORCC immediate ##### */
INLINE void orcc( void )
{
byte t;
IMMBYTE(t); cc|=t;
}
/* $1B ILLEGAL */
/* $1C ANDCC immediate ##### */
INLINE void andcc( void )
{
byte t;
IMMBYTE(t); cc&=t;
}
/* $1D SEX inherent -**0- */
INLINE void sex( void )
{
word t;
t = SIGNED(breg); SETDREG(t);
CLR_NZV; SET_NZ16(t);
}
/* $1E EXG inherent ----- */
INLINE void exg( void )
{
word t1=0,t2=0;
byte tb;
IMMBYTE(tb); GETREG(t1,tb>>4); GETREG(t2,tb&15);
SETREG(t2,tb>>4); SETREG(t1,tb&15);
}
/* $1F TFR inherent ----- */
INLINE void tfr( void )
{
byte tb;
word t=0;
IMMBYTE(tb); GETREG(t,tb>>4); SETREG(t,tb&15);
}
#if macintosh
#pragma mark ____2x____
#endif
/* $20 BRA relative ----- */
INLINE void bra( void )
{
byte t;
IMMBYTE(t);pcreg+=SIGNED(t);change_pc(pcreg); /* TS 971002 */
/* JB 970823 - speed up busy loops */
if (t==0xfe) m6809_ICount = 0;
}
/* $21 BRN relative ----- */
INLINE void brn( void )
{
byte t;
IMMBYTE(t);
}
/* $1021 LBRN relative ----- */
INLINE void lbrn( void )
{
word t;
IMMWORD(t);
}
/* $22 BHI relative ----- */
INLINE void bhi( void )
{
byte t;
BRANCH(!(cc&0x05));
}
/* $1022 LBHI relative ----- */
INLINE void lbhi( void )
{
word t;
LBRANCH(!(cc&0x05));
}
/* $23 BLS relative ----- */
INLINE void bls( void )
{
byte t;
BRANCH(cc&0x05);
}
/* $1023 LBLS relative ----- */
INLINE void lbls( void )
{
word t;
LBRANCH(cc&0x05);
}
/* $24 BCC relative ----- */
INLINE void bcc( void )
{
byte t;
BRANCH(!(cc&0x01));
}
/* $1024 LBCC relative ----- */
INLINE void lbcc( void )
{
word t;
LBRANCH(!(cc&0x01));
}
/* $25 BCS relative ----- */
INLINE void bcs( void )
{
byte t;
BRANCH(cc&0x01);
}
/* $1025 LBCS relative ----- */
INLINE void lbcs( void )
{
word t;
LBRANCH(cc&0x01);
}
/* $26 BNE relative ----- */
INLINE void bne( void )
{
byte t;
BRANCH(!(cc&0x04));
}
/* $1026 LBNE relative ----- */
INLINE void lbne( void )
{
word t;
LBRANCH(!(cc&0x04));
}
/* $27 BEQ relative ----- */
INLINE void beq( void )
{
byte t;
BRANCH(cc&0x04);
}
/* $1027 LBEQ relative ----- */
INLINE void lbeq( void )
{
word t;
LBRANCH(cc&0x04);
}
/* $28 BVC relative ----- */
INLINE void bvc( void )
{
byte t;
BRANCH(!(cc&0x02));
}
/* $1028 LBVC relative ----- */
INLINE void lbvc( void )
{
word t;
LBRANCH(!(cc&0x02));
}
/* $29 BVS relative ----- */
INLINE void bvs( void )
{
byte t;
BRANCH(cc&0x02);
}
/* $1029 LBVS relative ----- */
INLINE void lbvs( void )
{
word t;
LBRANCH(cc&0x02);
}
/* $2A BPL relative ----- */
INLINE void bpl( void )
{
byte t;
BRANCH(!(cc&0x08));
}
/* $102A LBPL relative ----- */
INLINE void lbpl( void )
{
word t;
LBRANCH(!(cc&0x08));
}
/* $2B BMI relative ----- */
INLINE void bmi( void )
{
byte t;
BRANCH(cc&0x08);
}
/* $102B LBMI relative ----- */
INLINE void lbmi( void )
{
word t;
LBRANCH(cc&0x08);
}
/* $2C BGE relative ----- */
INLINE void bge( void )
{
byte t;
BRANCH(!NXORV);
}
/* $102C LBGE relative ----- */
INLINE void lbge( void )
{
word t;
LBRANCH(!NXORV);
}
/* $2D BLT relative ----- */
INLINE void blt( void )
{
byte t;
BRANCH(NXORV);
}
/* $102D LBLT relative ----- */
INLINE void lblt( void )
{
word t;
LBRANCH(NXORV);
}
/* $2E BGT relative ----- */
INLINE void bgt( void )
{
byte t;
BRANCH(!(NXORV||cc&0x04));
}
/* $102E LBGT relative ----- */
INLINE void lbgt( void )
{
word t;
LBRANCH(!(NXORV||cc&0x04));
}
/* $2F BLE relative ----- */
INLINE void ble( void )
{
byte t;
BRANCH(NXORV||cc&0x04);
}
/* $102F LBLE relative ----- */
INLINE void lble( void )
{
word t;
LBRANCH(NXORV||cc&0x04);
}
#if macintosh
#pragma mark ____3x____
#endif
/* $30 LEAX indexed --*-- */
INLINE void leax( void )
{
xreg=eaddr; CLR_Z; SET_Z(xreg);
}
/* $31 LEAY indexed --*-- */
INLINE void leay( void )
{
yreg=eaddr; CLR_Z; SET_Z(yreg);
}
/* $32 LEAS indexed ----- */
INLINE void leas( void )
{
sreg=eaddr;
}
/* $33 LEAU indexed ----- */
INLINE void leau( void )
{
ureg=eaddr;
}
/* $34 PSHS inherent ----- */
INLINE void pshs( void )
{
byte t;
IMMBYTE(t);
if(t&0x80) PUSHWORD(pcreg);
if(t&0x40) PUSHWORD(ureg);
if(t&0x20) PUSHWORD(yreg);
if(t&0x10) PUSHWORD(xreg);
if(t&0x08) PUSHBYTE(dpreg);
if(t&0x04) PUSHBYTE(breg);
if(t&0x02) PUSHBYTE(areg);
if(t&0x01) PUSHBYTE(cc);
}
/* 35 PULS inherent ----- */
INLINE void puls( void )
{
byte t;
IMMBYTE(t);
if(t&0x01) PULLBYTE(cc);
if(t&0x02) PULLBYTE(areg);
if(t&0x04) PULLBYTE(breg);
if(t&0x08) PULLBYTE(dpreg);
if(t&0x10) PULLWORD(xreg);
if(t&0x20) PULLWORD(yreg);
if(t&0x40) PULLWORD(ureg);
if(t&0x80){ PULLWORD(pcreg);change_pc(pcreg); } /* TS 971002 */
}
/* $36 PSHU inherent ----- */
INLINE void pshu( void )
{
byte t;
IMMBYTE(t);
if(t&0x80) PSHUWORD(pcreg);
if(t&0x40) PSHUWORD(sreg);
if(t&0x20) PSHUWORD(yreg);
if(t&0x10) PSHUWORD(xreg);
if(t&0x08) PSHUBYTE(dpreg);
if(t&0x04) PSHUBYTE(breg);
if(t&0x02) PSHUBYTE(areg);
if(t&0x01) PSHUBYTE(cc);
}
/* 37 PULU inherent ----- */
INLINE void pulu( void )
{
byte t;
IMMBYTE(t);
if(t&0x01) PULUBYTE(cc);
if(t&0x02) PULUBYTE(areg);
if(t&0x04) PULUBYTE(breg);
if(t&0x08) PULUBYTE(dpreg);
if(t&0x10) PULUWORD(xreg);
if(t&0x20) PULUWORD(yreg);
if(t&0x40) PULUWORD(sreg);
if(t&0x80) { PULUWORD(pcreg);change_pc(pcreg); } /* TS 971002 */
}
/* $38 ILLEGAL */
/* $39 RTS inherent ----- */
INLINE void rts( void )
{
PULLWORD(pcreg);change_pc(pcreg); /* TS 971002 */
}
/* $3A ABX inherent ----- */
INLINE void abx( void )
{
xreg += breg;
}
/* $3B RTI inherent ##### */
INLINE void rti( void )
{
byte t;
/* ASG 971016 t=cc&0x80; */
PULLBYTE(cc);
t=cc&0x80; /* ASG 971016 */
if(t)
{
m6809_ICount -= 9;
PULLBYTE(areg);
PULLBYTE(breg);
PULLBYTE(dpreg);
PULLWORD(xreg);
PULLWORD(yreg);
PULLWORD(ureg);
}
PULLWORD(pcreg);change_pc(pcreg); /* TS 971002 */
}
/* $3C CWAI inherent ----1 */
INLINE void cwai( void )
{
byte t;
IMMBYTE(t); cc&=t;
/* CWAI should stack the entire machine state on the hardware stack,
then wait for an interrupt. We just wait for an interrupt. */
if ((pending_interrupts & M6809_INT_IRQ) != 0 && (cc & 0x10) == 0)
return;
else if ((pending_interrupts & M6809_INT_FIRQ) != 0 && (cc & 0x40) == 0)
return;
m6809_ICount = 0;
pending_interrupts |= M6809_CWAI; /* NS 980101 */
}
/* $3D MUL inherent --*-@ */
INLINE void mul( void )
{
word t;
t=areg*breg;
CLR_ZC; SET_Z16(t); if(t&0x80) SEC;
SETDREG(t);
}
/* $3E ILLEGAL */
/* $3F SWI (SWI2 SWI3) absolute indirect ----- */
INLINE void swi( void )
{
cc|=0x80;
PUSHWORD(pcreg);
PUSHWORD(ureg);
PUSHWORD(yreg);
PUSHWORD(xreg);
PUSHBYTE(dpreg);
PUSHBYTE(breg);
PUSHBYTE(areg);
PUSHBYTE(cc);
cc|=0x50;
pcreg = M_RDMEM_WORD(0xfffa);change_pc(pcreg); /* TS 971002 */
}
/* $103F SWI2 absolute indirect ----- */
INLINE void swi2( void )
{
cc|=0x80;
PUSHWORD(pcreg);
PUSHWORD(ureg);
PUSHWORD(yreg);
PUSHWORD(xreg);
PUSHBYTE(dpreg);
PUSHBYTE(breg);
PUSHBYTE(areg);
PUSHBYTE(cc);
pcreg = M_RDMEM_WORD(0xfff4);change_pc(pcreg); /* TS 971002 */
}
/* $113F SWI3 absolute indirect ----- */
INLINE void swi3( void )
{
cc|=0x80;
PUSHWORD(pcreg);
PUSHWORD(ureg);
PUSHWORD(yreg);
PUSHWORD(xreg);
PUSHBYTE(dpreg);
PUSHBYTE(breg);
PUSHBYTE(areg);
PUSHBYTE(cc);
pcreg = M_RDMEM_WORD(0xfff2);change_pc(pcreg); /* TS 971002 */
}
#if macintosh
#pragma mark ____4x____
#endif
/* $40 NEGA inherent ?**** */
INLINE void nega( void )
{
word r;
r=-areg;
CLR_NZVC; SET_FLAGS8(0,areg,r);
areg=r;
}
/* $41 ILLEGAL */
/* $42 ILLEGAL */
/* $43 COMA inherent -**01 */
INLINE void coma( void )
{
areg = ~areg;
CLR_NZV; SET_NZ8(areg); SEC;
}
/* $44 LSRA inherent -0*-* */
INLINE void lsra( void )
{
CLR_NZC; cc|=(areg&0x01);
areg>>=1; SET_Z8(areg);
}
/* $45 ILLEGAL */
/* $46 RORA inherent -**-* */
INLINE void rora( void )
{
byte r;
r=(cc&0x01)<<7;
CLR_NZC; cc|=(areg&0x01);
r |= areg>>1; SET_NZ8(r);
areg=r;
}
/* $47 ASRA inherent ?**-* */
INLINE void asra( void )
{
CLR_NZC; cc|=(areg&0x01);
areg>>=1; areg|=((areg&0x40)<<1);
SET_NZ8(areg);
}
/* $48 ASLA inherent ?**** */
INLINE void asla( void )
{
word r;
r=areg<<1;
CLR_NZVC; SET_FLAGS8(areg,areg,r);
areg=r;
}
/* $49 ROLA inherent -**** */
INLINE void rola( void )
{
word t,r;
t = areg; r = cc&0x01; r |= t<<1;
CLR_NZVC; SET_FLAGS8(t,t,r);
areg=r;
}
/* $4A DECA inherent -***- */
INLINE void deca( void )
{
--areg;
CLR_NZV; SET_FLAGS8D(areg);
}
/* $4B ILLEGAL */
/* $4C INCA inherent -***- */
INLINE void inca( void )
{
++areg;
CLR_NZV; SET_FLAGS8I(areg);
}
/* $4D TSTA inherent -**0- */
INLINE void tsta( void )
{
CLR_NZV; SET_NZ8(areg);
}
/* $4E ILLEGAL */
/* $4F CLRA inherent -0100 */
INLINE void clra( void )
{
areg=0;
CLR_NZVC; SEZ;
}
#if macintosh
#pragma mark ____5x____
#endif
/* $50 NEGB inherent ?**** */
INLINE void negb( void )
{
word r;
r=-breg;
CLR_NZVC; SET_FLAGS8(0,breg,r);
breg=r;
}
/* $51 ILLEGAL */
/* $52 ILLEGAL */
/* $53 COMB inherent -**01 */
INLINE void comb( void )
{
breg = ~breg;
CLR_NZV; SET_NZ8(breg); SEC;
}
/* $54 LSRB inherent -0*-* */
INLINE void lsrb( void )
{
CLR_NZC; cc|=(breg&0x01);
breg>>=1; SET_Z8(breg);
}
/* $55 ILLEGAL */
/* $56 RORB inherent -**-* */
INLINE void rorb( void )
{
byte r;
r=(cc&0x01)<<7;
CLR_NZC; cc|=(breg&0x01);
r |= breg>>1; SET_NZ8(r);
breg=r;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -