/*
* @(#)Z80.java 1.1 27/04/97 Adam Davidson & Andrew Pollard
*/
/**
*
The Z80 class emulates the Zilog Z80 microprocessor.
*
* @version 1.1 27 Apr 1997
* @author Adam Davidson & Andrew Pollard
*
* @see Jasper
* @see Spectrum
*/
public class Z80 extends Object {
public Z80( double clockFrequencyInMHz ) {
tstatesPerInterrupt = (int) ((clockFrequencyInMHz * 1e6) / 50);
}
protected int tstatesPerInterrupt = 0;
public static final int IM0 = 0;
public static final int IM1 = 1;
public static final int IM2 = 2;
private static final int F_C = 0x01;
private static final int F_N = 0x02;
private static final int F_PV = 0x04;
private static final int F_3 = 0x08;
private static final int F_H = 0x10;
private static final int F_5 = 0x20;
private static final int F_Z = 0x40;
private static final int F_S = 0x80;
private static final int PF = F_PV;
private static final int p_ = 0;
private static final boolean parity[] = new boolean[256];
static {
for ( int i = 0; i < 256; i++ ) {
boolean p = true;
for ( int j = 0; j < 8; j++ ) {
if ( (i & (1<> 8 );
F( word & 0xff );
}
public final int BC() { return (B() << 8) | C(); }
public final void BC( int word ) {
B( word >> 8 );
C( word & 0xff );
}
public final int DE() { return _DE; }
public final void DE( int word ) {
_DE = word;
}
public final int HL() { return _HL; }
public final void HL( int word ) {
_HL = word;
}
public final int PC() { return _PC; }
public final void PC( int word ) {
_PC = word;
}
public final int SP() { return _SP; }
public final void SP( int word ) {
_SP = word;
}
public final int ID() { return _ID; }
public final void ID( int word ) {
_ID = word;
}
public final int IX() { return _IX; }
public final void IX( int word ) {
_IX = word;
}
public final int IY() { return _IY; }
public final void IY( int word ) {
_IY = word;
}
/** 8 bit register access */
public final int A() { return _A; }
public final void A( int bite ) {
_A = bite;
}
public final int F() {
return (Sset() ? F_S : 0) |
(Zset() ? F_Z : 0) |
(f5 ? F_5 : 0) |
(Hset() ? F_H : 0) |
(f3 ? F_3 : 0) |
(PVset() ? F_PV : 0) |
(Nset() ? F_N : 0) |
(Cset() ? F_C : 0);
}
public final void F( int bite ) {
fS = (bite & F_S) != 0;
fZ = (bite & F_Z) != 0;
f5 = (bite & F_5) != 0;
fH = (bite & F_H) != 0;
f3 = (bite & F_3) != 0;
fPV = (bite & F_PV) != 0;
fN = (bite & F_N) != 0;
fC = (bite & F_C) != 0;
}
public final int B() { return _B; }
public final void B( int bite ) {
_B = bite;
}
public final int C() { return _C; }
public final void C( int bite ) {
_C = bite;
}
public final int D() { return (_DE >> 8); }
public final void D( int bite ) {
_DE = (bite << 8) | (_DE & 0x00ff);
}
public final int E() { return (_DE & 0xff); }
public final void E( int bite ) {
_DE = (_DE & 0xff00) | bite;
}
public final int H() { return (_HL >> 8); }
public final void H( int bite ) {
_HL = (bite << 8) | (_HL & 0x00ff);
}
public final int L() { return (_HL & 0xff); }
public final void L( int bite ) {
_HL = (_HL & 0xff00) | bite;
}
public final int IDH() { return (_ID >> 8); }
public final void IDH( int bite ) {
_ID = (bite << 8) | (_ID & 0x00ff);
}
public final int IDL() { return (_ID & 0xff); }
public final void IDL( int bite ) {
_ID = (_ID & 0xff00) | bite;
}
/** Memory refresh register */
public final int R7() { return _R7; }
public final int R() { return (_R & 0x7f) | _R7; }
public final void R( int bite ) {
_R = bite;
_R7 = bite & 0x80;
}
public final void REFRESH( int t ) {
_R += t;
}
/** Interrupt modes/register */
public final int I() { return _I; }
public final void I( int bite ) {
_I = bite;
}
public final boolean IFF1() { return _IFF1; }
public final void IFF1( boolean iff1 ) {
_IFF1 = iff1;
}
public final boolean IFF2() { return _IFF2; }
public final void IFF2( boolean iff2 ) {
_IFF2 = iff2;
}
public final int IM() { return _IM; }
public final void IM( int im ) {
_IM = im;
}
/** Flag access */
public final void setZ( boolean f ) { fZ = f; }
public final void setC( boolean f ) { fC = f; }
public final void setS( boolean f ) { fS = f; }
public final void setH( boolean f ) { fH = f; }
public final void setN( boolean f ) { fN = f; }
public final void setPV( boolean f ) {fPV = f;}
public final void set3( boolean f ) { f3 = f; }
public final void set5( boolean f ) { f5 = f; }
public final boolean Zset() { return fZ; }
public final boolean Cset() { return fC; }
public final boolean Sset() { return fS; }
public final boolean Hset() { return fH; }
public final boolean Nset() { return fN; }
public final boolean PVset() { return fPV; }
/** Byte access */
private final int peekb( int addr ) {
return mem[ addr ];
}
public void pokeb( int addr, int newByte ) {
mem[ addr ] = newByte;
}
/** Word access */
public void pokew( int addr, int word ) {
pokeb( addr, word & 0xff );
addr++;
pokeb( addr & 0xffff, word >> 8 );
}
private final int peekw( int addr ) {
int t = peekb( addr );
addr++;
return t | (peekb( addr & 0xffff ) << 8);
}
/** Index register access */
private final int ID_d() {
return ((ID()+(byte)nxtpcb()) & 0xffff);
}
/** Stack access */
public final void pushw( int word ) {
int sp = ((SP()-2) & 0xffff);
SP( sp );
pokew( sp, word );
}
public final int popw() {
int sp = SP();
int t = peekb( sp );
sp++;
t |= (peekb( sp & 0xffff) << 8);
SP( ++sp & 0xffff );
return t;
}
/** Call stack */
public final void pushpc() { pushw( PC() ); }
public final void poppc() { PC( popw() ); }
/** Program access */
private final int nxtpcb() {
int pc = PC();
int t = peekb( pc );
PC( ++pc & 0xffff );
return t;
}
private final int nxtpcw() {
int pc = PC();
int t = peekb( pc );
t |= ( peekb( ++pc & 0xffff ) << 8 );
PC( ++pc & 0xffff );
return t;
}
/** Reset all registers to power on state */
public void reset() {
PC( 0 );
SP( 0 );
A( 0 );
F( 0 );
BC( 0 );
DE( 0 );
HL( 0 );
exx();
ex_af_af();
A( 0 );
F( 0 );
BC( 0 );
DE( 0 );
HL( 0 );
IX( 0 );
IY( 0 );
R( 0 );
I( 0 );
IFF1( false );
IFF2( false );
IM( IM0 );
}
/** IO ports */
public void outb( int port, int bite, int tstates ) {
}
public int inb( int port ) {
return 0xff;
}
/** Interrupt handlers */
private static final boolean interruptTriggered( int tstates ) {
return (tstates >= 0);
}
public int interrupt() {
// If not a non-maskable interrupt
if ( !IFF1() ) {
return 0;
}
switch( IM() ) {
case IM0:
case IM1:
pushpc();
IFF1( false );
IFF2( false );
PC( 56 );
return 13;
case IM2:
pushpc();
IFF1( false );
IFF2( false );
int t = (I()<<8) | 0x00ff;
PC( peekw(t) );
return 19;
}
return 0;
}
/** Z80 fetch/execute loop */
public final void execute() {
int local_tstates = -tstatesPerInterrupt;
while ( true ) {
if ( interruptTriggered( local_tstates ) ) {
local_tstates -= tstatesPerInterrupt - interrupt();
}
REFRESH( 1 );
switch ( nxtpcb() ) {
case 0: /* NOP */
{
local_tstates += ( 4 );
break;
}
case 8: /* EX AF,AF' */
{
ex_af_af();
local_tstates += ( 4 );
break;
}
case 16: /* DJNZ dis */
{
int b;
B( b = qdec8( B() ) );
if (b != 0) {
byte d = (byte) nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 13 );
}
else {
PC( inc16( PC() ) );
local_tstates += ( 8 );
}
break;
}
case 24: /* JR dis */
{
byte d = (byte)nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 12 );
break;
}
/* JR cc,dis */
case 32: /* JR NZ,dis */
{
if (!Zset()) {
byte d = (byte)nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 12 );
}
else {
PC( inc16( PC() ) );
local_tstates += ( 7 );
}
break;
}
case 40: /* JR Z,dis */
{
if ( Zset()) {
byte d = (byte)nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 12 );
}
else {
PC( inc16( PC() ) );
local_tstates += ( 7 );
}
break;
}
case 48: /* JR NC,dis */
{
if (!Cset()) {
byte d = (byte)nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 12 );
}
else {
PC( inc16( PC() ) );
local_tstates += ( 7 );
}
break;
}
case 56: /* JR C,dis */
{
if ( Cset()) {
byte d = (byte)nxtpcb();
PC( (PC()+d)&0xffff );
local_tstates += ( 12 );
}
else {
PC( inc16( PC() ) );
local_tstates += ( 7 );
}
break;
}
/* LD rr,nn / ADD HL,rr */
case 1: /* LD BC(),nn */
{
BC( nxtpcw() );
local_tstates += ( 10 );
break;
}
case 9: /* ADD HL,BC */
{
HL( add16( HL(), BC() ) );
local_tstates += ( 11 );
break;
}
case 17: /* LD DE,nn */
{
DE( nxtpcw() );
local_tstates += ( 10 );
break;
}
case 25: /* ADD HL,DE */
{
HL( add16( HL(), DE() ) );
local_tstates += ( 11 );
break;
}
case 33: /* LD HL,nn */
{
HL( nxtpcw() );
local_tstates += ( 10 );
break;
}
case 41: /* ADD HL,HL */
{
int hl = HL();
HL( add16( hl, hl ) );
local_tstates += ( 11 );
break;
}
case 49: /* LD SP,nn */
{
SP( nxtpcw() );
local_tstates += ( 10 );
break;
}
case 57: /* ADD HL,SP */
{
HL( add16( HL(), SP() ) );
local_tstates += ( 11 );
break;
}
/* LD (**),A/A,(**) */
case 2: /* LD (BC),A */
{ pokeb( BC(), A() ); local_tstates += ( 7 ); break; }
case 10: /* LD A,(BC) */
{ A( peekb( BC() ) ); local_tstates += ( 7 ); break; }
case 18: /* LD (DE),A */
{ pokeb( DE(), A() ); local_tstates += ( 7 ); break; }
case 26: /* LD A,(DE) */
{ A( peekb( DE() ) ); local_tstates += ( 7 ); break; }
case 34: /* LD (nn),HL */
{ pokew( nxtpcw(), HL() ); local_tstates += ( 16 ); break; }
case 42: /* LD HL,(nn) */
{ HL( peekw( nxtpcw() ) ); local_tstates += ( 16 ); break; }
case 50: /* LD (nn),A */
{ pokeb( nxtpcw(), A() ); local_tstates += ( 13 ); break; }
case 58: /* LD A,(nn) */
{ A( peekb( nxtpcw() ) ); local_tstates += ( 13 ); break; }
/* INC/DEC * */
case 3: /* INC BC */
{ BC( inc16( BC() ) ); local_tstates += ( 6 ); break; }
case 11: /* DEC BC */
{ BC( dec16( BC() ) ); local_tstates += ( 6 ); break; }
case 19: /* INC DE */
{ DE( inc16( DE() ) ); local_tstates += ( 6 ); break; }
case 27: /* DEC DE */
{ DE( dec16( DE() ) ); local_tstates += ( 6 ); break; }
case 35: /* INC HL */
{ HL( inc16( HL() ) ); local_tstates += ( 6 ); break; }
case 43: /* DEC HL */
{ HL( dec16( HL() ) ); local_tstates += ( 6 ); break; }
case 51: /* INC SP */
{ SP( inc16( SP() ) ); local_tstates += ( 6 ); break; }
case 59: /* DEC SP */
{ SP( dec16( SP() ) ); local_tstates += ( 6 ); break; }
/* INC * */
case 4: /* INC B */
{ B( inc8( B() ) ); local_tstates += ( 4 ); break; }
case 12: /* INC C */
{ C( inc8( C() ) ); local_tstates += ( 4 ); break; }
case 20: /* INC D */
{ D( inc8( D() ) ); local_tstates += ( 4 ); break; }
case 28: /* INC E */
{ E( inc8( E() ) ); local_tstates += ( 4 ); break; }
case 36: /* INC H */
{ H( inc8( H() ) ); local_tstates += ( 4 ); break; }
case 44: /* INC L */
{ L( inc8( L() ) ); local_tstates += ( 4 ); break; }
case 52: /* INC (HL) */
{
int hl = HL();
pokeb( hl, inc8( peekb( hl ) ) );
local_tstates += ( 11 );
break;
}
case 60: /* INC A() */
{ A( inc8( A() ) ); local_tstates += ( 4 ); break; }
/* DEC * */
case 5: /* DEC B */
{ B( dec8( B() ) ); local_tstates += ( 4 ); break; }
case 13: /* DEC C */
{ C( dec8( C() ) ); local_tstates += ( 4 ); break; }
case 21: /* DEC D */
{ D( dec8( D() ) ); local_tstates += ( 4 ); break; }
case 29: /* DEC E */
{ E( dec8( E() ) ); local_tstates += ( 4 ); break; }
case 37: /* DEC H */
{ H( dec8( H() ) ); local_tstates += ( 4 ); break; }
case 45: /* DEC L */
{ L( dec8( L() ) ); local_tstates += ( 4 ); break; }
case 53: /* DEC (HL) */
{
int hl = HL();
pokeb( hl, dec8( peekb( hl ) ) );
local_tstates += ( 11 );
break;
}
case 61: /* DEC A() */
{ A( dec8( A() ) ); local_tstates += ( 4 ); break; }
/* LD *,N */
case 6: /* LD B,n */
{ B( nxtpcb() ); local_tstates += ( 7 ); break; }
case 14: /* LD C,n */
{ C( nxtpcb() ); local_tstates += ( 7 ); break; }
case 22: /* LD D,n */
{ D( nxtpcb() ); local_tstates += ( 7 ); break; }
case 30: /* LD E,n */
{ E( nxtpcb() ); local_tstates += ( 7 ); break; }
case 38: /* LD H,n */
{ H( nxtpcb() ); local_tstates += ( 7 ); break; }
case 46: /* LD L,n */
{ L( nxtpcb() ); local_tstates += ( 7 ); break; }
case 54: /* LD (HL),n */
{
pokeb( HL(), nxtpcb() );
local_tstates += ( 10 );
break;
}
case 62: /* LD A,n */
{ A( nxtpcb() ); local_tstates += ( 7 ); break; }
/* R**A */
case 7: /* RLCA */
{ rlc_a(); local_tstates += ( 4 ); break; }
case 15: /* RRCA */
{ rrc_a(); local_tstates += ( 4 ); break; }
case 23: /* RLA */
{ rl_a(); local_tstates += ( 4 ); break; }
case 31: /* RRA */
{ rr_a(); local_tstates += ( 4 ); break; }
case 39: /* DAA */
{ daa_a(); local_tstates += ( 4 ); break; }
case 47: /* CPL */
{ cpl_a(); local_tstates += ( 4 ); break; }
case 55: /* SCF */
{ scf(); local_tstates += ( 4 ); break; }
case 63: /* CCF */
{ ccf(); local_tstates += ( 4 ); break; }
/* LD B,* */
case 64: /* LD B,B */
{ local_tstates += ( 4 ); break; }
case 65: /* LD B,C */
{ B( C() ); local_tstates += ( 4 ); break; }
case 66: /* LD B,D */
{ B( D() ); local_tstates += ( 4 ); break; }
case 67: /* LD B,E */
{ B( E() ); local_tstates += ( 4 ); break; }
case 68: /* LD B,H */
{ B( H() ); local_tstates += ( 4 ); break; }
case 69: /* LD B,L */
{ B( L() ); local_tstates += ( 4 ); break; }
case 70: /* LD B,(HL) */
{ B( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 71: /* LD B,A */
{ B( A() ); local_tstates += ( 4 ); break; }
/* LD C,* */
case 72: /* LD C,B */
{ C( B() ); local_tstates += ( 4 ); break; }
case 73: /* LD C,C */
{ local_tstates += ( 4 ); break; }
case 74: /* LD C,D */
{ C( D() ); local_tstates += ( 4 ); break; }
case 75: /* LD C,E */
{ C( E() ); local_tstates += ( 4 ); break; }
case 76: /* LD C,H */
{ C( H() ); local_tstates += ( 4 ); break; }
case 77: /* LD C,L */
{ C( L() ); local_tstates += ( 4 ); break; }
case 78: /* LD C,(HL) */
{ C( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 79: /* LD C,A */
{ C( A() ); local_tstates += ( 4 ); break; }
/* LD D,* */
case 80: /* LD D,B */
{ D( B() ); local_tstates += ( 4 ); break; }
case 81: /* LD D,C */
{ D( C() ); local_tstates += ( 4 ); break; }
case 82: /* LD D,D */
{ local_tstates += ( 4 ); break; }
case 83: /* LD D,E */
{ D( E() ); local_tstates += ( 4 ); break; }
case 84: /* LD D,H */
{ D( H() ); local_tstates += ( 4 ); break; }
case 85: /* LD D,L */
{ D( L() ); local_tstates += ( 4 ); break; }
case 86: /* LD D,(HL) */
{ D( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 87: /* LD D,A */
{ D( A() ); local_tstates += ( 4 ); break; }
/* LD E,* */
case 88: /* LD E,B */
{ E( B() ); local_tstates += ( 4 ); break; }
case 89: /* LD E,C */
{ E( C() ); local_tstates += ( 4 ); break; }
case 90: /* LD E,D */
{ E( D() ); local_tstates += ( 4 ); break; }
case 91: /* LD E,E */
{ local_tstates += ( 4 ); break; }
case 92: /* LD E,H */
{ E( H() ); local_tstates += ( 4 ); break; }
case 93: /* LD E,L */
{ E( L() ); local_tstates += ( 4 ); break; }
case 94: /* LD E,(HL) */
{ E( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 95: /* LD E,A */
{ E( A() ); local_tstates += ( 4 ); break; }
/* LD H,* */
case 96: /* LD H,B */
{ H( B() ); local_tstates += ( 4 ); break; }
case 97: /* LD H,C */
{ H( C() ); local_tstates += ( 4 ); break; }
case 98: /* LD H,D */
{ H( D() ); local_tstates += ( 4 ); break; }
case 99: /* LD H,E */
{ H( E() ); local_tstates += ( 4 ); break; }
case 100: /* LD H,H */
{ local_tstates += ( 4 ); break; }
case 101: /* LD H,L */
{ H( L() ); local_tstates += ( 4 ); break; }
case 102: /* LD H,(HL) */
{ H( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 103: /* LD H,A */
{ H( A() ); local_tstates += ( 4 ); break; }
/* LD L,* */
case 104: /* LD L,B */
{ L( B() ); local_tstates += ( 4 ); break; }
case 105: /* LD L,C */
{ L( C() ); local_tstates += ( 4 ); break; }
case 106: /* LD L,D */
{ L( D() ); local_tstates += ( 4 ); break; }
case 107: /* LD L,E */
{ L( E() ); local_tstates += ( 4 ); break; }
case 108: /* LD L,H */
{ L( H() ); local_tstates += ( 4 ); break; }
case 109: /* LD L,L */
{ local_tstates += ( 4 ); break; }
case 110: /* LD L,(HL) */
{ L( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 111: /* LD L,A */
{ L( A() ); local_tstates += ( 4 ); break; }
/* LD (HL),* */
case 112: /* LD (HL),B */
{ pokeb( HL(), B() ); local_tstates += ( 7 ); break; }
case 113: /* LD (HL),C */
{ pokeb( HL(), C() ); local_tstates += ( 7 ); break; }
case 114: /* LD (HL),D */
{ pokeb( HL(), D() ); local_tstates += ( 7 ); break; }
case 115: /* LD (HL),E */
{ pokeb( HL(), E() ); local_tstates += ( 7 ); break; }
case 116: /* LD (HL),H */
{ pokeb( HL(), H() ); local_tstates += ( 7 ); break; }
case 117: /* LD (HL),L */
{ pokeb( HL(), L() ); local_tstates += ( 7 ); break; }
case 118: /* HALT */
{
int haltsToInterrupt = (((-local_tstates-1) / 4)+1);
local_tstates += (haltsToInterrupt*4);
REFRESH( haltsToInterrupt-1 );
break;
}
case 119: /* LD (HL),A */
{ pokeb( HL(), A() ); local_tstates += ( 7 ); break; }
/* LD A,* */
case 120: /* LD A,B */
{ A( B() ); local_tstates += ( 4 ); break; }
case 121: /* LD A,C */
{ A( C() ); local_tstates += ( 4 ); break; }
case 122: /* LD A,D */
{ A( D() ); local_tstates += ( 4 ); break; }
case 123: /* LD A,E */
{ A( E() ); local_tstates += ( 4 ); break; }
case 124: /* LD A,H */
{ A( H() ); local_tstates += ( 4 ); break; }
case 125: /* LD A,L */
{ A( L() ); local_tstates += ( 4 ); break; }
case 126: /* LD A,(HL) */
{ A( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 127: /* LD A,A */
{ local_tstates += ( 4 ); break; }
/* ADD A,* */
case 128: /* ADD A,B */
{ add_a( B() ); local_tstates += ( 4 ); break; }
case 129: /* ADD A,C */
{ add_a( C() ); local_tstates += ( 4 ); break; }
case 130: /* ADD A,D */
{ add_a( D() ); local_tstates += ( 4 ); break; }
case 131: /* ADD A,E */
{ add_a( E() ); local_tstates += ( 4 ); break; }
case 132: /* ADD A,H */
{ add_a( H() ); local_tstates += ( 4 ); break; }
case 133: /* ADD A,L */
{ add_a( L() ); local_tstates += ( 4 ); break; }
case 134: /* ADD A,(HL) */
{ add_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 135: /* ADD A,A */
{ add_a( A() ); local_tstates += ( 4 ); break; }
/* ADC A,* */
case 136: /* ADC A,B */
{ adc_a( B() ); local_tstates += ( 4 ); break; }
case 137: /* ADC A,C */
{ adc_a( C() ); local_tstates += ( 4 ); break; }
case 138: /* ADC A,D */
{ adc_a( D() ); local_tstates += ( 4 ); break; }
case 139: /* ADC A,E */
{ adc_a( E() ); local_tstates += ( 4 ); break; }
case 140: /* ADC A,H */
{ adc_a( H() ); local_tstates += ( 4 ); break; }
case 141: /* ADC A,L */
{ adc_a( L() ); local_tstates += ( 4 ); break; }
case 142: /* ADC A,(HL) */
{ adc_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 143: /* ADC A,A */
{ adc_a( A() ); local_tstates += ( 4 ); break; }
/* SUB * */
case 144: /* SUB B */
{ sub_a( B() ); local_tstates += ( 4 ); break; }
case 145: /* SUB C */
{ sub_a( C() ); local_tstates += ( 4 ); break; }
case 146: /* SUB D */
{ sub_a( D() ); local_tstates += ( 4 ); break; }
case 147: /* SUB E */
{ sub_a( E() ); local_tstates += ( 4 ); break; }
case 148: /* SUB H */
{ sub_a( H() ); local_tstates += ( 4 ); break; }
case 149: /* SUB L */
{ sub_a( L() ); local_tstates += ( 4 ); break; }
case 150: /* SUB (HL) */
{ sub_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 151: /* SUB A() */
{ sub_a( A() ); local_tstates += ( 4 ); break; }
/* SBC A,* */
case 152: /* SBC A,B */
{ sbc_a( B() ); local_tstates += ( 4 ); break; }
case 153: /* SBC A,C */
{ sbc_a( C() ); local_tstates += ( 4 ); break; }
case 154: /* SBC A,D */
{ sbc_a( D() ); local_tstates += ( 4 ); break; }
case 155: /* SBC A,E */
{ sbc_a( E() ); local_tstates += ( 4 ); break; }
case 156: /* SBC A,H */
{ sbc_a( H() ); local_tstates += ( 4 ); break; }
case 157: /* SBC A,L */
{ sbc_a( L() ); local_tstates += ( 4 ); break; }
case 158: /* SBC A,(HL) */
{ sbc_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 159: /* SBC A,A */
{ sbc_a( A() ); local_tstates += ( 4 ); break; }
/* AND * */
case 160: /* AND B */
{ and_a( B() ); local_tstates += ( 4 ); break; }
case 161: /* AND C */
{ and_a( C() ); local_tstates += ( 4 ); break; }
case 162: /* AND D */
{ and_a( D() ); local_tstates += ( 4 ); break; }
case 163: /* AND E */
{ and_a( E() ); local_tstates += ( 4 ); break; }
case 164: /* AND H */
{ and_a( H() ); local_tstates += ( 4 ); break; }
case 165: /* AND L */
{ and_a( L() ); local_tstates += ( 4 ); break; }
case 166: /* AND (HL) */
{ and_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 167: /* AND A() */
{ and_a( A() ); local_tstates += ( 4 ); break; }
/* XOR * */
case 168: /* XOR B */
{ xor_a( B() ); local_tstates += ( 4 ); break; }
case 169: /* XOR C */
{ xor_a( C() ); local_tstates += ( 4 ); break; }
case 170: /* XOR D */
{ xor_a( D() ); local_tstates += ( 4 ); break; }
case 171: /* XOR E */
{ xor_a( E() ); local_tstates += ( 4 ); break; }
case 172: /* XOR H */
{ xor_a( H() ); local_tstates += ( 4 ); break; }
case 173: /* XOR L */
{ xor_a( L() ); local_tstates += ( 4 ); break; }
case 174: /* XOR (HL) */
{ xor_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 175: /* XOR A() */
{ xor_a( A() ); local_tstates += ( 4 ); break; }
/* OR * */
case 176: /* OR B */
{ or_a( B() ); local_tstates += ( 4 ); break; }
case 177: /* OR C */
{ or_a( C() ); local_tstates += ( 4 ); break; }
case 178: /* OR D */
{ or_a( D() ); local_tstates += ( 4 ); break; }
case 179: /* OR E */
{ or_a( E() ); local_tstates += ( 4 ); break; }
case 180: /* OR H */
{ or_a( H() ); local_tstates += ( 4 ); break; }
case 181: /* OR L */
{ or_a( L() ); local_tstates += ( 4 ); break; }
case 182: /* OR (HL) */
{ or_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 183: /* OR A() */
{ or_a( A() ); local_tstates += ( 4 ); break; }
/* CP * */
case 184: /* CP B */
{ cp_a( B() ); local_tstates += ( 4 ); break; }
case 185: /* CP C */
{ cp_a( C() ); local_tstates += ( 4 ); break; }
case 186: /* CP D */
{ cp_a( D() ); local_tstates += ( 4 ); break; }
case 187: /* CP E */
{ cp_a( E() ); local_tstates += ( 4 ); break; }
case 188: /* CP H */
{ cp_a( H() ); local_tstates += ( 4 ); break; }
case 189: /* CP L */
{ cp_a( L() ); local_tstates += ( 4 ); break; }
case 190: /* CP (HL) */
{ cp_a( peekb( HL() ) ); local_tstates += ( 7 ); break; }
case 191: /* CP A() */
{ cp_a( A() ); local_tstates += ( 4 ); break; }
/* RET cc */
case 192: /* RET NZ */
{
if(!Zset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 200: /* RET Z */
{
if(Zset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 208: /* RET NC */
{
if(!Cset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 216: /* RET C */
{
if(Cset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 224: /* RET PO */
{
if(!PVset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 232: /* RET PE */
{
if(PVset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 240: /* RET P */
{
if(!Sset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
case 248: /* RET M */
{
if(Sset()) {
poppc();
local_tstates += ( 11 );
}
else {
local_tstates += ( 5 );
}
break;
}
/* POP,Various */
case 193: /* POP BC */
{ BC( popw() ); local_tstates += ( 10 ); break; }
case 201: /* RET */
{ poppc(); local_tstates += ( 10 ); break; }
case 209: /* POP DE */
{ DE( popw() ); local_tstates += ( 10 ); break; }
case 217: /* EXX */
{
exx();
local_tstates += ( 4 );
break;
}
case 225: /* POP HL */
{ HL( popw() ); local_tstates += ( 10 ); break; }
case 233: /* JP (HL) */
{ PC( HL() ); local_tstates += ( 4 ); break; }
case 241: /* POP AF */
{ AF( popw() ); local_tstates += ( 10 ); break; }
case 249: /* LD SP,HL */
{ SP( HL() ); local_tstates += ( 6 ); break; }
/* JP cc,nn */
case 194: /* JP NZ,nn */
{
if(!Zset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 202: /* JP Z,nn */
{
if( Zset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 210: /* JP NC,nn */
{
if(!Cset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 218: /* JP C,nn */
{
if( Cset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 226: /* JP PO,nn */
{
if(!PVset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 234: /* JP PE,nn */
{
if( PVset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 242: /* JP P,nn */
{
if(!Sset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
case 250: /* JP M,nn */
{
if( Sset()) {
PC( nxtpcw() );
}
else {
PC( (PC()+2)&0xffff );
}
local_tstates += ( 10 );
break;
}
/* Various */
case 195: /* JP nn */
{ PC( peekw( PC() ) ); local_tstates += ( 10 ); break; }
case 203: /* prefix CB */
{ local_tstates += execute_cb(); break; }
case 211: /* OUT (n),A */
{
outb( nxtpcb(), A(), local_tstates );
local_tstates += ( 11 );
break;
}
case 219: /* IN A,(n) */
{
A( inb((A() << 8) | nxtpcb()) );
local_tstates += ( 11 );
break;
}
case 227: /* EX (SP),HL */
{
int t = HL();
int sp = SP();
HL( peekw( sp ) );
pokew( sp, t );
local_tstates += ( 19 );
break;
}
case 235: /* EX DE,HL */
{
int t = HL();
HL( DE() );
DE( t );
local_tstates += ( 4 );
break;
}
case 243: /* DI */
{
IFF1( false );
IFF2( false );
local_tstates += ( 4 );
break;
}
case 251: /* EI */
{
IFF1( true );
IFF2( true );
local_tstates += ( 4 );
break;
}
/* CALL cc,nn */
case 196: /* CALL NZ,nn */
{
if( !Zset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 204: /* CALL Z,nn */
{
if( Zset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 212: /* CALL NC,nn */
{
if( !Cset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 220: /* CALL C,nn */
{
if( Cset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 228: /* CALL PO,nn */
{
if( !PVset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 236: /* CALL PE,nn */
{
if( PVset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 244: /* CALL P,nn */
{
if( !Sset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
case 252: /* CALL M,nn */
{
if( Sset() ) {
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
}
else {
PC( (PC() + 2)&0xffff );
local_tstates += ( 10 );
}
break;
}
/* PUSH,Various */
case 197: /* PUSH BC */
{ pushw( BC() ); local_tstates += ( 11 ); break; }
case 205: /* CALL nn */
{
int t = nxtpcw();
pushpc();
PC( t );
local_tstates += ( 17 );
break;
}
case 213: /* PUSH DE */
{ pushw( DE() ); local_tstates += ( 11 ); break; }
case 221: /* prefix IX */
{
ID( IX() );
local_tstates += execute_id();
IX( ID() );
break;
}
case 229: /* PUSH HL */
{ pushw( HL() ); local_tstates += ( 11 ); break; }
case 237: /* prefix ED */
{ local_tstates += execute_ed( local_tstates ); break; }
case 245: /* PUSH AF */
{ pushw( AF() ); local_tstates += ( 11 ); break; }
case 253: /* prefix IY */
{
ID( IY() );
local_tstates += execute_id();
IY( ID() );
break;
}
/* op A,N */
case 198: /* ADD A,N */
{ add_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 206: /* ADC A,N */
{ adc_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 214: /* SUB N */
{ sub_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 222: /* SBC A,N */
{ sbc_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 230: /* AND N */
{ and_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 238: /* XOR N */
{ xor_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 246: /* OR N */
{ or_a(nxtpcb()); local_tstates += ( 7 ); break; }
case 254: /* CP N */
{ cp_a(nxtpcb()); local_tstates += ( 7 ); break; }
/* RST n */
case 199: /* RST 0 */
{ pushpc(); PC( 0 ); local_tstates += ( 11 ); break; }
case 207: /* RST 8 */
{ pushpc(); PC( 8 ); local_tstates += ( 11 ); break; }
case 215: /* RST 16 */
{ pushpc(); PC( 16 ); local_tstates += ( 11 ); break; }
case 223: /* RST 24 */
{ pushpc(); PC( 24 ); local_tstates += ( 11 ); break; }
case 231: /* RST 32 */
{ pushpc(); PC( 32 ); local_tstates += ( 11 ); break; }
case 239: /* RST 40 */
{ pushpc(); PC( 40 ); local_tstates += ( 11 ); break; }
case 247: /* RST 48 */
{ pushpc(); PC( 48 ); local_tstates += ( 11 ); break; }
case 255: /* RST 56 */
{ pushpc(); PC( 56 ); local_tstates += ( 11 ); break; }
}
} // end while
}
private final int execute_ed( int local_tstates ) {
REFRESH( 1 );
switch ( nxtpcb() ) {
case 0: /* NOP */
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 127:
case 128:
case 129:
case 130:
case 131:
case 132:
case 133:
case 134:
case 135:
case 136:
case 137:
case 138:
case 139:
case 140:
case 141:
case 142:
case 143:
case 144:
case 145:
case 146:
case 147:
case 148:
case 149:
case 150:
case 151:
case 152:
case 153:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 164:
case 165:
case 166:
case 167:
case 172:
case 173:
case 174:
case 175:
case 180:
case 181:
case 182:
case 183:
{
return ( 8 );
}
/* IN r,(c) */
case 64: /* IN B,(c) */
{ B( in_bc() ); return ( 12 ); }
case 72: /* IN C,(c) */
{ C( in_bc() ); return ( 12 ); }
case 80: /* IN D,(c) */
{ D( in_bc() ); return ( 12 ); }
case 88: /* IN E,(c) */
{ E( in_bc() ); return ( 12 ); }
case 96: /* IN H,(c) */
{ H( in_bc() ); return ( 12 ); }
case 104: /* IN L,(c) */
{ L( in_bc() ); return ( 12 ); }
case 112: /* IN (c) */
{ in_bc(); return ( 12 ); }
case 120: /* IN A,(c) */
{ A( in_bc() ); return ( 12 ); }
/* OUT (c),r */
case 65: /* OUT (c),B */
{ outb( BC(), B(), local_tstates ); return ( 12 ); }
case 73: /* OUT (c),C */
{ outb( BC(), C(), local_tstates ); return ( 12 ); }
case 81: /* OUT (c),D */
{ outb( BC(), D(), local_tstates ); return ( 12 ); }
case 89: /* OUT (c),E */
{ outb( BC(), E(), local_tstates ); return ( 12 ); }
case 97: /* OUT (c),H */
{ outb( BC(), H(), local_tstates ); return ( 12 ); }
case 105: /* OUT (c),L */
{ outb( BC(), L(), local_tstates ); return ( 12 ); }
case 113: /* OUT (c),0 */
{ outb( BC(), 0, local_tstates ); return ( 12 ); }
case 121: /* OUT (c),A */
{ outb( BC(), A(), local_tstates ); return ( 12 ); }
/* SBC/ADC HL,ss */
case 66: /* SBC HL,BC */
{ HL( sbc16( HL(), BC() ) ); return ( 15 ); }
case 74: /* ADC HL,BC */
{ HL( adc16( HL(), BC() ) ); return ( 15 ); }
case 82: /* SBC HL,DE */
{ HL( sbc16( HL(), DE() ) ); return ( 15 ); }
case 90: /* ADC HL,DE */
{ HL( adc16( HL(), DE() ) ); return ( 15 ); }
case 98: /* SBC HL,HL */
{
int hl = HL();
HL( sbc16( hl, hl ) );
return ( 15 );
}
case 106: /* ADC HL,HL */
{
int hl = HL();
HL( adc16( hl, hl ) );
return ( 15 );
}
case 114: /* SBC HL,SP */
{ HL( sbc16( HL(), SP() ) ); return ( 15 ); }
case 122: /* ADC HL,SP */
{ HL( adc16( HL(), SP() ) ); return ( 15 ); }
/* LD (nn),ss, LD ss,(nn) */
case 67: /* LD (nn),BC */
{ pokew( nxtpcw(), BC() ); return ( 20 ); }
case 75: /* LD BC(),(nn) */
{ BC( peekw( nxtpcw() ) ); return ( 20 ); }
case 83: /* LD (nn),DE */
{ pokew( nxtpcw(), DE() ); return ( 20 ); }
case 91: /* LD DE,(nn) */
{ DE( peekw( nxtpcw() ) ); return ( 20 ); }
case 99: /* LD (nn),HL */
{ pokew( nxtpcw(), HL() ); return ( 20 ); }
case 107: /* LD HL,(nn) */
{ HL( peekw( nxtpcw() ) ); return ( 20 ); }
case 115: /* LD (nn),SP */
{ pokew( nxtpcw(), SP() ); return ( 20 ); }
case 123: /* LD SP,(nn) */
{ SP( peekw( nxtpcw() ) ); return ( 20 ); }
/* NEG */
case 68: /* NEG */
case 76: /* NEG */
case 84: /* NEG */
case 92: /* NEG */
case 100: /* NEG */
case 108: /* NEG */
case 116: /* NEG */
case 124: /* NEG */
{ neg_a(); return ( 8 ); }
/* RETn */
case 69: /* RETN */
case 85: /* RETN */
case 101: /* RETN */
case 117: /* RETN */
{
IFF1( IFF2() );
poppc();
return ( 14 );
}
case 77: /* RETI */
case 93: /* RETI */
case 109: /* RETI */
case 125: /* RETI */
{
poppc();
return ( 14 );
}
/* IM x */
case 70: /* IM 0 */
case 78: /* IM 0 */
case 102: /* IM 0 */
case 110: /* IM 0 */
{ IM( IM0 ); return ( 8 ); }
case 86: /* IM 1 */
case 118: /* IM 1 */
{ IM( IM1 ); return ( 8 ); }
case 94: /* IM 2 */
case 126: /* IM 2 */
{ IM( IM2 ); return ( 8 ); }
/* LD A,s / LD s,A / RxD */
case 71: /* LD I,A */
{ I( A() ); return ( 9 ); }
case 79: /* LD R,A */
{ R( A() ); return ( 9 ); }
case 87: /* LD A,I */
{ ld_a_i(); return ( 9 ); }
case 95: /* LD A,R */
{ ld_a_r(); return ( 9 ); }
case 103: /* RRD */
{ rrd_a(); return ( 18 ); }
case 111: /* RLD */
{ rld_a(); return ( 18 ); }
/* xxI */
case 160: /* LDI */
{
pokeb( DE(), peekb( HL() ) );
DE( inc16( DE() ) );
HL( inc16( HL() ) );
BC( dec16( BC() ) );
setPV( BC() != 0 );
setH( false );
setN( false );
return ( 16 );
}
case 161: /* CPI */
{
boolean c = Cset();
cp_a( peekb( HL() ) );
HL( inc16( HL() ) );
BC( dec16( BC() ) );
setPV( BC() != 0 );
setC( c );
return ( 16 );
}
case 162: /* INI */
{
int b;
pokeb( HL(), inb( BC() ) );
B( b = qdec8( B() ) );
HL( inc16( HL() ) );
setZ( b == 0 );
setN( true );
return ( 16 );
}
case 163: /* OUTI */
{
int b;
B( b = qdec8( B() ) );
outb( BC(), peekb( HL() ), local_tstates );
HL( inc16( HL() ) );
setZ( b == 0 );
setN( true );
return ( 16 );
}
/* xxD */
case 168: /* LDD */
{
pokeb( DE(), peekb( HL() ) );
DE( dec16( DE() ) );
HL( dec16( HL() ) );
BC( dec16( BC() ) );
setPV( BC() != 0 );
setH( false );
setN( false );
return ( 16 );
}
case 169: /* CPD */
{
boolean c = Cset();
cp_a( peekb( HL() ) );
HL( dec16( HL() ) );
BC( dec16( BC() ) );
setPV( BC() != 0 );
setC( c );
return ( 16 );
}
case 170: /* IND */
{
int b;
pokeb( HL(), inb( BC() ) );
B( b = qdec8( B() ) );
HL( dec16( HL() ) );
setZ( b == 0 );
setN( true );
return ( 16 );
}
case 171: /* OUTD */
{
int b;
B( b = qdec8( B() ) );
outb( BC(), peekb( HL() ), local_tstates );
HL( dec16( HL() ) );
setZ( b == 0 );
setN( true );
return ( 16 );
}
/* xxIR */
case 176: /* LDIR */
{
int _local_tstates = 0;
int count, dest, from;
count = BC();
dest = DE();
from = HL();
REFRESH( -2 );
do {
pokeb(dest, peekb(from) );
from = inc16( from );
dest = inc16( dest );
count = dec16( count );
_local_tstates += ( 21 );
REFRESH( 2 );
if ( interruptTriggered( _local_tstates ) ) {
break;
}
} while (count != 0);
if (count != 0) {
PC( (PC()-2)&0xffff );
setH( false );
setN( false );
setPV( true );
}
else {
_local_tstates += ( -5 );
setH( false );
setN( false );
setPV( false );
}
DE( dest );
HL( from );
BC( count );
return ( _local_tstates );
}
case 177: /* CPIR */
{
boolean c = Cset();
cp_a( peekb( HL() ) );
HL( inc16( HL() ) );
BC( dec16( BC() ) );
boolean pv = (BC() != 0);
setPV( pv );
setC( c );
if ( pv && !Zset() ) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
case 178: /* INIR */
{
int b;
pokeb( HL(), inb( BC() ) );
B( b = qdec8( B() ) );
HL( inc16( HL() ) );
setZ( true );
setN( true );
if (b != 0) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
case 179: /* OTIR */
{
int b;
B( b = qdec8( B() ) );
outb( BC(), peekb( HL() ), local_tstates );
HL( inc16( HL() ) );
setZ( true );
setN( true );
if (b != 0) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
/* xxDR */
case 184: /* LDDR */
{
int _local_tstates = 0;
int count, dest, from;
count = BC();
dest = DE();
from = HL();
REFRESH ( -2 );
do {
pokeb(dest, peekb(from));
from = dec16( from );
dest = dec16( dest );
count = dec16( count );
_local_tstates += ( 21 );
REFRESH( 2 );
if ( interruptTriggered( _local_tstates ) ) {
break;
}
} while (count != 0);
if (count != 0) {
PC( (PC()-2)&0xffff );
setH( false );
setN( false );
setPV( true );
}
else {
_local_tstates += ( -5 );
setH( false );
setN( false );
setPV( false );
}
DE( dest );
HL( from );
BC( count );
return ( _local_tstates );
}
case 185: /* CPDR */
{
boolean c = Cset();
cp_a( peekb( HL() ) );
HL( dec16( HL() ) );
BC( dec16( BC() ) );
boolean pv = (BC() != 0);
setPV( pv );
setC( c );
if ( pv && !Zset() ) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
case 186: /* INDR */
{
int b;
pokeb( HL(), inb( BC() ) );
B( b = qdec8( B() ) );
HL( dec16( HL() ) );
setZ( true );
setN( true );
if (b != 0) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
case 187: /* OTDR */
{
int b;
B( b = qdec8( B() ) );
outb( BC(), peekb( HL() ), local_tstates );
HL( dec16( HL() ) );
setZ( true );
setN( true );
if (b != 0) {
PC( (PC()-2)&0xffff );
return ( 21 );
}
return ( 16 );
}
} // end switch
// NOP
return ( 8 );
}
private final int execute_cb() {
REFRESH( 1 );
switch ( nxtpcb() ) {
case 0: /* RLC B */
{ B( rlc( B() ) ); return ( 8 ); }
case 1: /* RLC C */
{ C( rlc( C() ) ); return ( 8 ); }
case 2: /* RLC D */
{ D( rlc( D() ) ); return ( 8 ); }
case 3: /* RLC E */
{ E( rlc( E() ) ); return ( 8 ); }
case 4: /* RLC H */
{ H( rlc( H() ) ); return ( 8 ); }
case 5: /* RLC L */
{ L( rlc( L() ) ); return ( 8 ); }
case 6: /* RLC (HL) */
{
int hl = HL();
pokeb( hl, rlc( peekb( hl ) ) );
return ( 15 );
}
case 7: /* RLC A */
{ A( rlc( A() ) ); return ( 8 ); }
case 8: /* RRC B */
{ B( rrc( B() ) ); return ( 8 ); }
case 9: /* RRC C */
{ C( rrc( C() ) ); return ( 8 ); }
case 10: /* RRC D */
{ D( rrc( D() ) ); return ( 8 ); }
case 11: /* RRC E */
{ E( rrc( E() ) ); return ( 8 ); }
case 12: /* RRC H */
{ H( rrc( H() ) ); return ( 8 ); }
case 13: /* RRC L */
{ L( rrc( L() ) ); return ( 8 ); }
case 14: /* RRC (HL) */
{
int hl = HL();
pokeb( hl, rrc( peekb( hl ) ) );
return ( 15 );
}
case 15: /* RRC A */
{ A( rrc( A() ) ); return ( 8 ); }
case 16: /* RL B */
{ B( rl( B() ) ); return ( 8 ); }
case 17: /* RL C */
{ C( rl( C() ) ); return ( 8 ); }
case 18: /* RL D */
{ D( rl( D() ) ); return ( 8 ); }
case 19: /* RL E */
{ E( rl( E() ) ); return ( 8 ); }
case 20: /* RL H */
{ H( rl( H() ) ); return ( 8 ); }
case 21: /* RL L */
{ L( rl( L() ) ); return ( 8 ); }
case 22: /* RL (HL) */
{
int hl = HL();
pokeb( hl, rl( peekb( hl ) ) );
return ( 15 );
}
case 23: /* RL A */
{ A( rl( A() ) ); return ( 8 ); }
case 24: /* RR B */
{ B( rr( B() ) ); return ( 8 ); }
case 25: /* RR C */
{ C( rr( C() ) ); return ( 8 ); }
case 26: /* RR D */
{ D( rr( D() ) ); return ( 8 ); }
case 27: /* RR E */
{ E( rr( E() ) ); return ( 8 ); }
case 28: /* RR H */
{ H( rr( H() ) ); return ( 8 ); }
case 29: /* RR L */
{ L( rr( L() ) ); return ( 8 ); }
case 30: /* RR (HL) */
{
int hl = HL();
pokeb( hl, rr( peekb( hl ) ) );
return ( 15 );
}
case 31: /* RR A */
{ A( rr( A() ) ); return ( 8 ); }
case 32: /* SLA B */
{ B( sla( B() ) ); return ( 8 ); }
case 33: /* SLA C */
{ C( sla( C() ) ); return ( 8 ); }
case 34: /* SLA D */
{ D( sla( D() ) ); return ( 8 ); }
case 35: /* SLA E */
{ E( sla( E() ) ); return ( 8 ); }
case 36: /* SLA H */
{ H( sla( H() ) ); return ( 8 ); }
case 37: /* SLA L */
{ L( sla( L() ) ); return ( 8 ); }
case 38: /* SLA (HL) */
{
int hl = HL();
pokeb( hl, sla( peekb( hl ) ) );
return ( 15 );
}
case 39: /* SLA A */
{ A( sla( A() ) ); return ( 8 ); }
case 40: /* SRA B */
{ B( sra( B() ) ); return ( 8 ); }
case 41: /* SRA C */
{ C( sra( C() ) ); return ( 8 ); }
case 42: /* SRA D */
{ D( sra( D() ) ); return ( 8 ); }
case 43: /* SRA E */
{ E( sra( E() ) ); return ( 8 ); }
case 44: /* SRA H */
{ H( sra( H() ) ); return ( 8 ); }
case 45: /* SRA L */
{ L( sra( L() ) ); return ( 8 ); }
case 46: /* SRA (HL) */
{
int hl = HL();
pokeb( hl, sra( peekb( hl ) ) );
return ( 15 );
}
case 47: /* SRA A */
{ A( sra( A() ) ); return ( 8 ); }
case 48: /* SLS B */
{ B( sls( B() ) ); return ( 8 ); }
case 49: /* SLS C */
{ C( sls( C() ) ); return ( 8 ); }
case 50: /* SLS D */
{ D( sls( D() ) ); return ( 8 ); }
case 51: /* SLS E */
{ E( sls( E() ) ); return ( 8 ); }
case 52: /* SLS H */
{ H( sls( H() ) ); return ( 8 ); }
case 53: /* SLS L */
{ L( sls( L() ) ); return ( 8 ); }
case 54: /* SLS (HL) */
{
int hl = HL();
pokeb( hl, sls( peekb( hl ) ) );
return ( 15 );
}
case 55: /* SLS A */
{ A( sls( A() ) ); return ( 8 ); }
case 56: /* SRL B */
{ B( srl( B() ) ); return ( 8 ); }
case 57: /* SRL C */
{ C( srl( C() ) ); return ( 8 ); }
case 58: /* SRL D */
{ D( srl( D() ) ); return ( 8 ); }
case 59: /* SRL E */
{ E( srl( E() ) ); return ( 8 ); }
case 60: /* SRL H */
{ H( srl( H() ) ); return ( 8 ); }
case 61: /* SRL L */
{ L( srl( L() ) ); return ( 8 ); }
case 62: /* SRL (HL) */
{
int hl = HL();
pokeb( hl, srl( peekb( hl ) ) );
return ( 15 );
}
case 63: /* SRL A */
{ A( srl( A() ) ); return ( 8 ); }
case 64: /* BIT 0,B */
{ bit( 0x01, B() ); return ( 8 ); }
case 65: /* BIT 0,C */
{ bit( 0x01, C() ); return ( 8 ); }
case 66: /* BIT 0,D */
{ bit( 0x01, D() ); return ( 8 ); }
case 67: /* BIT 0,E */
{ bit( 0x01, E() ); return ( 8 ); }
case 68: /* BIT 0,H */
{ bit( 0x01, H() ); return ( 8 ); }
case 69: /* BIT 0,L */
{ bit( 0x01, L() ); return ( 8 ); }
case 70: /* BIT 0,(HL) */
{ bit( 0x01, peekb( HL() ) ); return ( 12 ); }
case 71: /* BIT 0,A */
{ bit( 0x01, A() ); return ( 8 ); }
case 72: /* BIT 1,B */
{ bit( 0x02, B() ); return ( 8 ); }
case 73: /* BIT 1,C */
{ bit( 0x02, C() ); return ( 8 ); }
case 74: /* BIT 1,D */
{ bit( 0x02, D() ); return ( 8 ); }
case 75: /* BIT 1,E */
{ bit( 0x02, E() ); return ( 8 ); }
case 76: /* BIT 1,H */
{ bit( 0x02, H() ); return ( 8 ); }
case 77: /* BIT 1,L */
{ bit( 0x02, L() ); return ( 8 ); }
case 78: /* BIT 1,(HL) */
{ bit( 0x02, peekb( HL() ) ); return ( 12 ); }
case 79: /* BIT 1,A */
{ bit( 0x02, A() ); return ( 8 ); }
case 80: /* BIT 2,B */
{ bit( 0x04, B() ); return ( 8 ); }
case 81: /* BIT 2,C */
{ bit( 0x04, C() ); return ( 8 ); }
case 82: /* BIT 2,D */
{ bit( 0x04, D() ); return ( 8 ); }
case 83: /* BIT 2,E */
{ bit( 0x04, E() ); return ( 8 ); }
case 84: /* BIT 2,H */
{ bit( 0x04, H() ); return ( 8 ); }
case 85: /* BIT 2,L */
{ bit( 0x04, L() ); return ( 8 ); }
case 86: /* BIT 2,(HL) */
{ bit( 0x04, peekb( HL() ) ); return ( 12 ); }
case 87: /* BIT 2,A */
{ bit( 0x04, A() ); return ( 8 ); }
case 88: /* BIT 3,B */
{ bit( 0x08, B() ); return ( 8 ); }
case 89: /* BIT 3,C */
{ bit( 0x08, C() ); return ( 8 ); }
case 90: /* BIT 3,D */
{ bit( 0x08, D() ); return ( 8 ); }
case 91: /* BIT 3,E */
{ bit( 0x08, E() ); return ( 8 ); }
case 92: /* BIT 3,H */
{ bit( 0x08, H() ); return ( 8 ); }
case 93: /* BIT 3,L */
{ bit( 0x08, L() ); return ( 8 ); }
case 94: /* BIT 3,(HL) */
{ bit( 0x08, peekb( HL() ) ); return ( 12 ); }
case 95: /* BIT 3,A */
{ bit( 0x08, A() ); return ( 8 ); }
case 96: /* BIT 4,B */
{ bit( 0x10, B() ); return ( 8 ); }
case 97: /* BIT 4,C */
{ bit( 0x10, C() ); return ( 8 ); }
case 98: /* BIT 4,D */
{ bit( 0x10, D() ); return ( 8 ); }
case 99: /* BIT 4,E */
{ bit( 0x10, E() ); return ( 8 ); }
case 100: /* BIT 4,H */
{ bit( 0x10, H() ); return ( 8 ); }
case 101: /* BIT 4,L */
{ bit( 0x10, L() ); return ( 8 ); }
case 102: /* BIT 4,(HL) */
{ bit( 0x10, peekb( HL() ) ); return ( 12 ); }
case 103: /* BIT 4,A */
{ bit( 0x10, A() ); return ( 8 ); }
case 104: /* BIT 5,B */
{ bit( 0x20, B() ); return ( 8 ); }
case 105: /* BIT 5,C */
{ bit( 0x20, C() ); return ( 8 ); }
case 106: /* BIT 5,D */
{ bit( 0x20, D() ); return ( 8 ); }
case 107: /* BIT 5,E */
{ bit( 0x20, E() ); return ( 8 ); }
case 108: /* BIT 5,H */
{ bit( 0x20, H() ); return ( 8 ); }
case 109: /* BIT 5,L */
{ bit( 0x20, L() ); return ( 8 ); }
case 110: /* BIT 5,(HL) */
{ bit( 0x20, peekb( HL() ) ); return ( 12 ); }
case 111: /* BIT 5,A */
{ bit( 0x20, A() ); return ( 8 ); }
case 112: /* BIT 6,B */
{ bit( 0x40, B() ); return ( 8 ); }
case 113: /* BIT 6,C */
{ bit( 0x40, C() ); return ( 8 ); }
case 114: /* BIT 6,D */
{ bit( 0x40, D() ); return ( 8 ); }
case 115: /* BIT 6,E */
{ bit( 0x40, E() ); return ( 8 ); }
case 116: /* BIT 6,H */
{ bit( 0x40, H() ); return ( 8 ); }
case 117: /* BIT 6,L */
{ bit( 0x40, L() ); return ( 8 ); }
case 118: /* BIT 6,(HL) */
{ bit( 0x40, peekb( HL() ) ); return ( 12 ); }
case 119: /* BIT 6,A */
{ bit( 0x40, A() ); return ( 8 ); }
case 120: /* BIT 7,B */
{ bit( 0x80, B() ); return ( 8 ); }
case 121: /* BIT 7,C */
{ bit( 0x80, C() ); return ( 8 ); }
case 122: /* BIT 7,D */
{ bit( 0x80, D() ); return ( 8 ); }
case 123: /* BIT 7,E */
{ bit( 0x80, E() ); return ( 8 ); }
case 124: /* BIT 7,H */
{ bit( 0x80, H() ); return ( 8 ); }
case 125: /* BIT 7,L */
{ bit( 0x80, L() ); return ( 8 ); }
case 126: /* BIT 7,(HL) */
{ bit( 0x80, peekb( HL() ) ); return ( 12 ); }
case 127: /* BIT 7,A */
{ bit( 0x80, A() ); return ( 8 ); }
case 128: /* RES 0,B */
{ B( res( 0x01, B() ) ); return ( 8 ); }
case 129: /* RES 0,C */
{ C( res( 0x01, C() ) ); return ( 8 ); }
case 130: /* RES 0,D */
{ D( res( 0x01, D() ) ); return ( 8 ); }
case 131: /* RES 0,E */
{ E( res( 0x01, E() ) ); return ( 8 ); }
case 132: /* RES 0,H */
{ H( res( 0x01, H() ) ); return ( 8 ); }
case 133: /* RES 0,L */
{ L( res( 0x01, L() ) ); return ( 8 ); }
case 134: /* RES 0,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x01, peekb( hl ) ) );
return ( 15 );
}
case 135: /* RES 0,A */
{ A( res( 0x01, A() ) ); return ( 8 ); }
case 136: /* RES 1,B */
{ B( res( 0x02, B() ) ); return ( 8 ); }
case 137: /* RES 1,C */
{ C( res( 0x02, C() ) ); return ( 8 ); }
case 138: /* RES 1,D */
{ D( res( 0x02, D() ) ); return ( 8 ); }
case 139: /* RES 1,E */
{ E( res( 0x02, E() ) ); return ( 8 ); }
case 140: /* RES 1,H */
{ H( res( 0x02, H() ) ); return ( 8 ); }
case 141: /* RES 1,L */
{ L( res( 0x02, L() ) ); return ( 8 ); }
case 142: /* RES 1,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x02, peekb( hl ) ) );
return ( 15 );
}
case 143: /* RES 1,A */
{ A( res( 0x02, A() ) ); return ( 8 ); }
case 144: /* RES 2,B */
{ B( res( 0x04, B() ) ); return ( 8 ); }
case 145: /* RES 2,C */
{ C( res( 0x04, C() ) ); return ( 8 ); }
case 146: /* RES 2,D */
{ D( res( 0x04, D() ) ); return ( 8 ); }
case 147: /* RES 2,E */
{ E( res( 0x04, E() ) ); return ( 8 ); }
case 148: /* RES 2,H */
{ H( res( 0x04, H() ) ); return ( 8 ); }
case 149: /* RES 2,L */
{ L( res( 0x04, L() ) ); return ( 8 ); }
case 150: /* RES 2,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x04, peekb( hl ) ) );
return ( 15 );
}
case 151: /* RES 2,A */
{ A( res( 0x04, A() ) ); return ( 8 ); }
case 152: /* RES 3,B */
{ B( res( 0x08, B() ) ); return ( 8 ); }
case 153: /* RES 3,C */
{ C( res( 0x08, C() ) ); return ( 8 ); }
case 154: /* RES 3,D */
{ D( res( 0x08, D() ) ); return ( 8 ); }
case 155: /* RES 3,E */
{ E( res( 0x08, E() ) ); return ( 8 ); }
case 156: /* RES 3,H */
{ H( res( 0x08, H() ) ); return ( 8 ); }
case 157: /* RES 3,L */
{ L( res( 0x08, L() ) ); return ( 8 ); }
case 158: /* RES 3,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x08, peekb( hl ) ) );
return ( 15 );
}
case 159: /* RES 3,A */
{ A( res( 0x08, A() ) ); return ( 8 ); }
case 160: /* RES 4,B */
{ B( res( 0x10, B() ) ); return ( 8 ); }
case 161: /* RES 4,C */
{ C( res( 0x10, C() ) ); return ( 8 ); }
case 162: /* RES 4,D */
{ D( res( 0x10, D() ) ); return ( 8 ); }
case 163: /* RES 4,E */
{ E( res( 0x10, E() ) ); return ( 8 ); }
case 164: /* RES 4,H */
{ H( res( 0x10, H() ) ); return ( 8 ); }
case 165: /* RES 4,L */
{ L( res( 0x10, L() ) ); return ( 8 ); }
case 166: /* RES 4,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x10, peekb( hl ) ) );
return ( 15 );
}
case 167: /* RES 4,A */
{ A( res( 0x10, A() ) ); return ( 8 ); }
case 168: /* RES 5,B */
{ B( res( 0x20, B() ) ); return ( 8 ); }
case 169: /* RES 5,C */
{ C( res( 0x20, C() ) ); return ( 8 ); }
case 170: /* RES 5,D */
{ D( res( 0x20, D() ) ); return ( 8 ); }
case 171: /* RES 5,E */
{ E( res( 0x20, E() ) ); return ( 8 ); }
case 172: /* RES 5,H */
{ H( res( 0x20, H() ) ); return ( 8 ); }
case 173: /* RES 5,L */
{ L( res( 0x20, L() ) ); return ( 8 ); }
case 174: /* RES 5,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x20, peekb( hl ) ) );
return ( 15 );
}
case 175: /* RES 5,A */
{ A( res( 0x20, A() ) ); return ( 8 ); }
case 176: /* RES 6,B */
{ B( res( 0x40, B() ) ); return ( 8 ); }
case 177: /* RES 6,C */
{ C( res( 0x40, C() ) ); return ( 8 ); }
case 178: /* RES 6,D */
{ D( res( 0x40, D() ) ); return ( 8 ); }
case 179: /* RES 6,E */
{ E( res( 0x40, E() ) ); return ( 8 ); }
case 180: /* RES 6,H */
{ H( res( 0x40, H() ) ); return ( 8 ); }
case 181: /* RES 6,L */
{ L( res( 0x40, L() ) ); return ( 8 ); }
case 182: /* RES 6,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x40, peekb( hl ) ) );
return ( 15 );
}
case 183: /* RES 6,A */
{ A( res( 0x40, A() ) ); return ( 8 ); }
case 184: /* RES 7,B */
{ B( res( 0x80, B() ) ); return ( 8 ); }
case 185: /* RES 7,C */
{ C( res( 0x80, C() ) ); return ( 8 ); }
case 186: /* RES 7,D */
{ D( res( 0x80, D() ) ); return ( 8 ); }
case 187: /* RES 7,E */
{ E( res( 0x80, E() ) ); return ( 8 ); }
case 188: /* RES 7,H */
{ H( res( 0x80, H() ) ); return ( 8 ); }
case 189: /* RES 7,L */
{ L( res( 0x80, L() ) ); return ( 8 ); }
case 190: /* RES 7,(HL) */
{
int hl = HL();
pokeb( hl, res( 0x80, peekb( hl ) ) );
return ( 15 );
}
case 191: /* RES 7,A */
{ A( res( 0x80, A() ) ); return ( 8 ); }
case 192: /* SET 0,B */
{ B( set( 0x01, B() ) ); return ( 8 ); }
case 193: /* SET 0,C */
{ C( set( 0x01, C() ) ); return ( 8 ); }
case 194: /* SET 0,D */
{ D( set( 0x01, D() ) ); return ( 8 ); }
case 195: /* SET 0,E */
{ E( set( 0x01, E() ) ); return ( 8 ); }
case 196: /* SET 0,H */
{ H( set( 0x01, H() ) ); return ( 8 ); }
case 197: /* SET 0,L */
{ L( set( 0x01, L() ) ); return ( 8 ); }
case 198: /* SET 0,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x01, peekb( hl ) ) );
return ( 15 );
}
case 199: /* SET 0,A */
{ A( set( 0x01, A() ) ); return ( 8 ); }
case 200: /* SET 1,B */
{ B( set( 0x02, B() ) ); return ( 8 ); }
case 201: /* SET 1,C */
{ C( set( 0x02, C() ) ); return ( 8 ); }
case 202: /* SET 1,D */
{ D( set( 0x02, D() ) ); return ( 8 ); }
case 203: /* SET 1,E */
{ E( set( 0x02, E() ) ); return ( 8 ); }
case 204: /* SET 1,H */
{ H( set( 0x02, H() ) ); return ( 8 ); }
case 205: /* SET 1,L */
{ L( set( 0x02, L() ) ); return ( 8 ); }
case 206: /* SET 1,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x02, peekb( hl ) ) );
return ( 15 );
}
case 207: /* SET 1,A */
{ A( set( 0x02, A() ) ); return ( 8 ); }
case 208: /* SET 2,B */
{ B( set( 0x04, B() ) ); return ( 8 ); }
case 209: /* SET 2,C */
{ C( set( 0x04, C() ) ); return ( 8 ); }
case 210: /* SET 2,D */
{ D( set( 0x04, D() ) ); return ( 8 ); }
case 211: /* SET 2,E */
{ E( set( 0x04, E() ) ); return ( 8 ); }
case 212: /* SET 2,H */
{ H( set( 0x04, H() ) ); return ( 8 ); }
case 213: /* SET 2,L */
{ L( set( 0x04, L() ) ); return ( 8 ); }
case 214: /* SET 2,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x04, peekb( hl ) ) );
return ( 15 );
}
case 215: /* SET 2,A */
{ A( set( 0x04, A() ) ); return ( 8 ); }
case 216: /* SET 3,B */
{ B( set( 0x08, B() ) ); return ( 8 ); }
case 217: /* SET 3,C */
{ C( set( 0x08, C() ) ); return ( 8 ); }
case 218: /* SET 3,D */
{ D( set( 0x08, D() ) ); return ( 8 ); }
case 219: /* SET 3,E */
{ E( set( 0x08, E() ) ); return ( 8 ); }
case 220: /* SET 3,H */
{ H( set( 0x08, H() ) ); return ( 8 ); }
case 221: /* SET 3,L */
{ L( set( 0x08, L() ) ); return ( 8 ); }
case 222: /* SET 3,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x08, peekb( hl ) ) );
return ( 15 );
}
case 223: /* SET 3,A */
{ A( set( 0x08, A() ) ); return ( 8 ); }
case 224: /* SET 4,B */
{ B( set( 0x10, B() ) ); return ( 8 ); }
case 225: /* SET 4,C */
{ C( set( 0x10, C() ) ); return ( 8 ); }
case 226: /* SET 4,D */
{ D( set( 0x10, D() ) ); return ( 8 ); }
case 227: /* SET 4,E */
{ E( set( 0x10, E() ) ); return ( 8 ); }
case 228: /* SET 4,H */
{ H( set( 0x10, H() ) ); return ( 8 ); }
case 229: /* SET 4,L */
{ L( set( 0x10, L() ) ); return ( 8 ); }
case 230: /* SET 4,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x10, peekb( hl ) ) );
return ( 15 );
}
case 231: /* SET 4,A */
{ A( set( 0x10, A() ) ); return ( 8 ); }
case 232: /* SET 5,B */
{ B( set( 0x20, B() ) ); return ( 8 ); }
case 233: /* SET 5,C */
{ C( set( 0x20, C() ) ); return ( 8 ); }
case 234: /* SET 5,D */
{ D( set( 0x20, D() ) ); return ( 8 ); }
case 235: /* SET 5,E */
{ E( set( 0x20, E() ) ); return ( 8 ); }
case 236: /* SET 5,H */
{ H( set( 0x20, H() ) ); return ( 8 ); }
case 237: /* SET 5,L */
{ L( set( 0x20, L() ) ); return ( 8 ); }
case 238: /* SET 5,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x20, peekb( hl ) ) );
return ( 15 );
}
case 239: /* SET 5,A */
{ A( set( 0x20, A() ) ); return ( 8 ); }
case 240: /* SET 6,B */
{ B( set( 0x40, B() ) ); return ( 8 ); }
case 241: /* SET 6,C */
{ C( set( 0x40, C() ) ); return ( 8 ); }
case 242: /* SET 6,D */
{ D( set( 0x40, D() ) ); return ( 8 ); }
case 243: /* SET 6,E */
{ E( set( 0x40, E() ) ); return ( 8 ); }
case 244: /* SET 6,H */
{ H( set( 0x40, H() ) ); return ( 8 ); }
case 245: /* SET 6,L */
{ L( set( 0x40, L() ) ); return ( 8 ); }
case 246: /* SET 6,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x40, peekb( hl ) ) );
return ( 15 );
}
case 247: /* SET 6,A */
{ A( set( 0x40, A() ) ); return ( 8 ); }
case 248: /* SET 7,B */
{ B( set( 0x80, B() ) ); return ( 8 ); }
case 249: /* SET 7,C */
{ C( set( 0x80, C() ) ); return ( 8 ); }
case 250: /* SET 7,D */
{ D( set( 0x80, D() ) ); return ( 8 ); }
case 251: /* SET 7,E */
{ E( set( 0x80, E() ) ); return ( 8 ); }
case 252: /* SET 7,H */
{ H( set( 0x80, H() ) ); return ( 8 ); }
case 253: /* SET 7,L */
{ L( set( 0x80, L() ) ); return ( 8 ); }
case 254: /* SET 7,(HL) */
{
int hl = HL();
pokeb( hl, set( 0x80, peekb( hl ) ) );
return ( 15 );
}
case 255: /* SET 7,A */
{ A( set( 0x80, A() ) ); return ( 8 ); }
} // end switch
return 0;
}
private final int execute_id() {
REFRESH( 1 );
switch ( nxtpcb() ) {
case 0: /* NOP */
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 39:
case 40:
case 47:
case 48:
case 49:
case 50:
case 51:
case 55:
case 56:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 64:
case 65:
case 66:
case 67:
case 71:
case 72:
case 73:
case 74:
case 75:
case 79:
case 80:
case 81:
case 82:
case 83:
case 87:
case 88:
case 89:
case 90:
case 91:
case 95:
case 120:
case 121:
case 122:
case 123:
case 127:
case 128:
case 129:
case 130:
case 131:
case 135:
case 136:
case 137:
case 138:
case 139:
case 143:
case 144:
case 145:
case 146:
case 147:
case 151:
case 152:
case 153:
case 154:
case 155:
case 159:
case 160:
case 161:
case 162:
case 163:
case 167:
case 168:
case 169:
case 170:
case 171:
case 175:
case 176:
case 177:
case 178:
case 179:
case 183:
case 184:
case 185:
case 186:
case 187:
case 191:
case 192:
case 193:
case 194:
case 195:
case 196:
case 197:
case 198:
case 199:
case 200:
case 201:
case 202:
case 204:
case 205:
case 206:
case 207:
case 208:
case 209:
case 210:
case 211:
case 212:
case 213:
case 214:
case 215:
case 216:
case 217:
case 218:
case 219:
case 220:
case 221:
case 222:
case 223:
case 224:
case 226:
case 228:
case 230:
case 231:
case 232:
case 234:
case 235:
case 236:
case 237:
case 238:
case 239:
case 240:
case 241:
case 242:
case 243:
case 244:
case 245:
case 246:
case 247:
case 248:
{
PC( dec16( PC() ) );
REFRESH( -1 );
return ( 4 );
}
case 9: /* ADD ID,BC */
{ ID( add16( ID(), BC() ) ); return ( 15 ); }
case 25: /* ADD ID,DE */
{ ID( add16( ID(), DE() ) ); return ( 15 ); }
case 41: /* ADD ID,ID */
{
int id = ID();
ID( add16( id, id ) );
return ( 15 );
}
case 57: /* ADD ID,SP */
{ ID( add16( ID(),SP() ) ); return ( 15 ); }
case 33: /* LD ID,nn */
{ ID( nxtpcw() ); return ( 14 ); }
case 34: /* LD (nn),ID */
{ pokew( nxtpcw(), ID() ); return ( 20 ); }
case 42: /* LD ID,(nn) */
{ ID( peekw( nxtpcw() ) ); return ( 20 ); }
case 35:/* INC ID */
{ ID( inc16( ID() ) ); return ( 10 ); }
case 43:/* DEC ID */
{ ID( dec16( ID() ) ); return ( 10 ); }
case 36:/* INC IDH */
{ IDH( inc8( IDH() ) ); return ( 8 ); }
case 44:/* INC IDL */
{ IDL( inc8( IDL() ) ); return ( 8 ); }
case 52:/* INC (ID+d) */
{
int z = ID_d();
pokeb( z, inc8( peekb(z) ) );
return ( 23 );
}
case 37:/* DEC IDH */
{ IDH( dec8( IDH() ) ); return ( 8 ); }
case 45:/* DEC IDL */
{ IDL( dec8( IDL() ) ); return ( 8 ); }
case 53:/* DEC (ID+d) */
{
int z = ID_d();
pokeb( z, dec8( peekb(z) ) );
return ( 23 );
}
case 38: /* LD IDH,n */
{ IDH( nxtpcb() ); return ( 11 ); }
case 46: /* LD IDL,n */
{ IDL( nxtpcb() ); return ( 11 ); }
case 54: /* LD (ID+d),n */
{ int z = ID_d(); pokeb(z,nxtpcb()); return ( 19 ); }
case 68: /* LD B,IDH */
{ B( IDH() ); return ( 8 ); }
case 69: /* LD B,IDL */
{ B( IDL() ); return ( 8 ); }
case 70: /* LD B,(ID+d) */
{ B( peekb( ID_d() ) ); return ( 19 ); }
case 76: /* LD C,IDH */
{ C( IDH() ); return ( 8 ); }
case 77: /* LD C,IDL */
{ C( IDL() ); return ( 8 ); }
case 78: /* LD C,(ID+d) */
{ C( peekb( ID_d() ) ); return ( 19 ); }
case 84: /* LD D,IDH */
{ D( IDH() ); return ( 8 ); }
case 85: /* LD D,IDL */
{ D( IDL() ); return ( 8 ); }
case 86: /* LD D,(ID+d) */
{ D( peekb( ID_d() ) ); return ( 19 ); }
case 92: /* LD E,IDH */
{ E( IDH() ); return ( 8 ); }
case 93: /* LD E,IDL */
{ E( IDL() ); return ( 8 ); }
case 94: /* LD E,(ID+d) */
{ E( peekb( ID_d() ) ); return ( 19 ); }
case 96: /* LD IDH,B */
{ IDH( B() ); return ( 8 ); }
case 97: /* LD IDH,C */
{ IDH( C() ); return ( 8 ); }
case 98: /* LD IDH,D */
{ IDH( D() ); return ( 8 ); }
case 99: /* LD IDH,E */
{ IDH( E() ); return ( 8 ); }
case 100: /* LD IDH,IDH */
{ return ( 8 ); }
case 101: /* LD IDH,IDL */
{ IDH( IDL() ); return ( 8 ); }
case 102: /* LD H,(ID+d) */
{ H( peekb( ID_d() ) ); return ( 19 ); }
case 103: /* LD IDH,A */
{ IDH( A() ); return ( 8 ); }
case 104: /* LD IDL,B */
{ IDL( B() ); return ( 8 ); }
case 105: /* LD IDL,C */
{ IDL( C() ); return ( 8 ); }
case 106: /* LD IDL,D */
{ IDL( D() ); return ( 8 ); }
case 107: /* LD IDL,E */
{ IDL( E() ); return ( 8 ); }
case 108: /* LD IDL,IDH */
{ IDL( IDH() ); return ( 8 ); }
case 109: /* LD IDL,IDL */
{ return ( 8 ); }
case 110: /* LD L,(ID+d) */
{ L( peekb( ID_d() ) ); return ( 19 ); }
case 111: /* LD IDL,A */
{ IDL( A() ); return ( 8 ); }
case 112: /* LD (ID+d),B */
{ pokeb( ID_d(), B() ); return ( 19 ); }
case 113: /* LD (ID+d),C */
{ pokeb( ID_d(), C() ); return ( 19 ); }
case 114: /* LD (ID+d),D */
{ pokeb( ID_d(), D() ); return ( 19 ); }
case 115: /* LD (ID+d),E */
{ pokeb( ID_d(), E() ); return ( 19 ); }
case 116: /* LD (ID+d),H */
{ pokeb( ID_d(), H() ); return ( 19 ); }
case 117: /* LD (ID+d),L */
{ pokeb( ID_d(), L() ); return ( 19 ); }
case 119: /* LD (ID+d),A */
{ pokeb( ID_d(), A() ); return ( 19 ); }
case 124: /* LD A,IDH */
{ A( IDH() ); return ( 8 ); }
case 125: /* LD A,IDL */
{ A( IDL() ); return ( 8 ); }
case 126: /* LD A,(ID+d) */
{ A( peekb( ID_d() ) ); return ( 19 ); }
case 132: /* ADD A,IDH */
{ add_a(IDH()); return ( 8 ); }
case 133: /* ADD A,IDL */
{ add_a(IDL()); return ( 8 ); }
case 134: /* ADD A,(ID+d) */
{ add_a(peekb( ID_d() )); return ( 19 ); }
case 140: /* ADC A,IDH */
{ adc_a(IDH()); return ( 8 ); }
case 141: /* ADC A,IDL */
{ adc_a(IDL()); return ( 8 ); }
case 142: /* ADC A,(ID+d) */
{ adc_a(peekb( ID_d() )); return ( 19 ); }
case 148: /* SUB IDH */
{ sub_a(IDH()); return ( 8 ); }
case 149: /* SUB IDL */
{ sub_a(IDL()); return ( 8 ); }
case 150: /* SUB (ID+d) */
{ sub_a(peekb( ID_d() )); return ( 19 ); }
case 156: /* SBC A,IDH */
{ sbc_a(IDH()); return ( 8 ); }
case 157: /* SBC A,IDL */
{ sbc_a(IDL()); return ( 8 ); }
case 158: /* SBC A,(ID+d) */
{ sbc_a(peekb( ID_d() )); return ( 19 ); }
case 164: /* AND IDH */
{ and_a(IDH()); return ( 8 ); }
case 165: /* AND IDL */
{ and_a(IDL()); return ( 8 ); }
case 166: /* AND (ID+d) */
{ and_a(peekb( ID_d() )); return ( 19 ); }
case 172: /* XOR IDH */
{ xor_a(IDH()); return ( 8 ); }
case 173: /* XOR IDL */
{ xor_a(IDL()); return ( 8 ); }
case 174: /* XOR (ID+d) */
{ xor_a(peekb( ID_d() )); return ( 19 ); }
case 180: /* OR IDH */
{ or_a(IDH()); return ( 8 ); }
case 181: /* OR IDL */
{ or_a(IDL()); return ( 8 ); }
case 182: /* OR (ID+d) */
{ or_a(peekb( ID_d() )); return ( 19 ); }
case 188: /* CP IDH */
{ cp_a(IDH()); return ( 8 ); }
case 189: /* CP IDL */
{ cp_a(IDL()); return ( 8 ); }
case 190: /* CP (ID+d) */
{ cp_a(peekb( ID_d() )); return ( 19 ); }
case 225: /* POP ID */
{ ID( popw() ); return ( 14 ); }
case 233: /* JP (ID) */
{ PC( ID() ); return ( 8 ); }
case 249: /* LD SP,ID */
{ SP( ID() ); return ( 10 ); }
case 203: /* prefix CB */
{
// Get index address (offset byte is first)
int z = ID_d();
// Opcode comes after offset byte
int op = nxtpcb();
execute_id_cb( op, z );
// Bit instructions take 20 T states, rest 23
return ( (( op & 0xc0 ) == 0x40) ? 20 : 23 );
}
case 227: /* EX (SP),ID */
{
int t = ID();
int sp = SP();
ID( peekw( sp ) );
pokew( sp, t );
return ( 23 );
}
case 229: /* PUSH ID */
{ pushw( ID() ); return ( 15 ); }
} // end switch
return 0;
}
private final void execute_id_cb(int op, int z) {
switch ( op ) {
case 0: /* RLC B */
{ B( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 1: /* RLC C */
{ C( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 2: /* RLC D */
{ D( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 3: /* RLC E */
{ E( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 4: /* RLC H */
{ H( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 5: /* RLC L */
{ L( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 6: /* RLC (HL) */
{ pokeb( z, rlc( peekb( z ) ) ); return; }
case 7: /* RLC A */
{ A( op = rlc( peekb( z ) ) ); pokeb( z, op ); return; }
case 8: /* RRC B */
{ B( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 9: /* RRC C */
{ C( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 10: /* RRC D */
{ D( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 11: /* RRC E */
{ E( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 12: /* RRC H */
{ H( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 13: /* RRC L */
{ L( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 14: /* RRC (HL) */
{ pokeb( z, rrc( peekb( z ) ) ); return; }
case 15: /* RRC A */
{ A( op = rrc( peekb( z ) ) ); pokeb( z, op ); return; }
case 16: /* RL B */
{ B( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 17: /* RL C */
{ C( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 18: /* RL D */
{ D( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 19: /* RL E */
{ E( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 20: /* RL H */
{ H( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 21: /* RL L */
{ L( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 22: /* RL (HL) */
{ pokeb( z, rl( peekb( z ) ) ); return; }
case 23: /* RL A */
{ A( op = rl( peekb( z ) ) ); pokeb( z, op ); return; }
case 24: /* RR B */
{ B( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 25: /* RR C */
{ C( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 26: /* RR D */
{ D( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 27: /* RR E */
{ E( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 28: /* RR H */
{ H( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 29: /* RR L */
{ L( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 30: /* RR (HL) */
{ pokeb( z, rr( peekb( z ) ) ); return; }
case 31: /* RR A */
{ A( op = rr( peekb( z ) ) ); pokeb( z, op ); return; }
case 32: /* SLA B */
{ B( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 33: /* SLA C */
{ C( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 34: /* SLA D */
{ D( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 35: /* SLA E */
{ E( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 36: /* SLA H */
{ H( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 37: /* SLA L */
{ L( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 38: /* SLA (HL) */
{ pokeb( z, sla( peekb( z ) ) ); return; }
case 39: /* SLA A */
{ A( op = sla( peekb( z ) ) ); pokeb( z, op ); return; }
case 40: /* SRA B */
{ B( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 41: /* SRA C */
{ C( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 42: /* SRA D */
{ D( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 43: /* SRA E */
{ E( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 44: /* SRA H */
{ H( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 45: /* SRA L */
{ L( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 46: /* SRA (HL) */
{ pokeb( z, sra( peekb( z ) ) ); return; }
case 47: /* SRA A */
{ A( op = sra( peekb( z ) ) ); pokeb( z, op ); return; }
case 48: /* SLS B */
{ B( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 49: /* SLS C */
{ C( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 50: /* SLS D */
{ D( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 51: /* SLS E */
{ E( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 52: /* SLS H */
{ H( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 53: /* SLS L */
{ L( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 54: /* SLS (HL) */
{ pokeb( z, sls( peekb( z ) ) ); return; }
case 55: /* SLS A */
{ A( op = sls( peekb( z ) ) ); pokeb( z, op ); return; }
case 56: /* SRL B */
{ B( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 57: /* SRL C */
{ C( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 58: /* SRL D */
{ D( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 59: /* SRL E */
{ E( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 60: /* SRL H */
{ H( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 61: /* SRL L */
{ L( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 62: /* SRL (HL) */
{ pokeb( z, srl( peekb( z ) ) ); return; }
case 63: /* SRL A */
{ A( op = srl( peekb( z ) ) ); pokeb( z, op ); return; }
case 64: /* BIT 0,B */
case 65: /* BIT 0,B */
case 66: /* BIT 0,B */
case 67: /* BIT 0,B */
case 68: /* BIT 0,B */
case 69: /* BIT 0,B */
case 70: /* BIT 0,B */
case 71: /* BIT 0,B */
{ bit( 0x01, peekb( z ) ); return; }
case 72: /* BIT 1,B */
case 73: /* BIT 1,B */
case 74: /* BIT 1,B */
case 75: /* BIT 1,B */
case 76: /* BIT 1,B */
case 77: /* BIT 1,B */
case 78: /* BIT 1,B */
case 79: /* BIT 1,B */
{ bit( 0x02, peekb( z ) ); return; }
case 80: /* BIT 2,B */
case 81: /* BIT 2,B */
case 82: /* BIT 2,B */
case 83: /* BIT 2,B */
case 84: /* BIT 2,B */
case 85: /* BIT 2,B */
case 86: /* BIT 2,B */
case 87: /* BIT 2,B */
{ bit( 0x04, peekb( z ) ); return; }
case 88: /* BIT 3,B */
case 89: /* BIT 3,B */
case 90: /* BIT 3,B */
case 91: /* BIT 3,B */
case 92: /* BIT 3,B */
case 93: /* BIT 3,B */
case 94: /* BIT 3,B */
case 95: /* BIT 3,B */
{ bit( 0x08, peekb( z ) ); return; }
case 96: /* BIT 4,B */
case 97: /* BIT 4,B */
case 98: /* BIT 4,B */
case 99: /* BIT 4,B */
case 100: /* BIT 4,B */
case 101: /* BIT 4,B */
case 102: /* BIT 4,B */
case 103: /* BIT 4,B */
{ bit( 0x10, peekb( z ) ); return; }
case 104: /* BIT 5,B */
case 105: /* BIT 5,B */
case 106: /* BIT 5,B */
case 107: /* BIT 5,B */
case 108: /* BIT 5,B */
case 109: /* BIT 5,B */
case 110: /* BIT 5,B */
case 111: /* BIT 5,B */
{ bit( 0x20, peekb( z ) ); return; }
case 112: /* BIT 6,B */
case 113: /* BIT 6,B */
case 114: /* BIT 6,B */
case 115: /* BIT 6,B */
case 116: /* BIT 6,B */
case 117: /* BIT 6,B */
case 118: /* BIT 6,B */
case 119: /* BIT 6,B */
{ bit( 0x40, peekb( z ) ); return; }
case 120: /* BIT 7,B */
case 121: /* BIT 7,B */
case 122: /* BIT 7,B */
case 123: /* BIT 7,B */
case 124: /* BIT 7,B */
case 125: /* BIT 7,B */
case 126: /* BIT 7,B */
case 127: /* BIT 7,B */
{ bit( 0x80, peekb( z ) ); return; }
case 128: /* RES 0,B */
{ B( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 129: /* RES 0,C */
{ C( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 130: /* RES 0,D */
{ D( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 131: /* RES 0,E */
{ E( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 132: /* RES 0,H */
{ H( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 133: /* RES 0,L */
{ L( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 134: /* RES 0,(HL) */
{ pokeb( z, res( 0x01, peekb( z ) ) ); return; }
case 135: /* RES 0,A */
{ A( op = res( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 136: /* RES 1,B */
{ B( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 137: /* RES 1,C */
{ C( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 138: /* RES 1,D */
{ D( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 139: /* RES 1,E */
{ E( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 140: /* RES 1,H */
{ H( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 141: /* RES 1,L */
{ L( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 142: /* RES 1,(HL) */
{ pokeb( z, res( 0x02, peekb( z ) ) ); return; }
case 143: /* RES 1,A */
{ A( op = res( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 144: /* RES 2,B */
{ B( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 145: /* RES 2,C */
{ C( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 146: /* RES 2,D */
{ D( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 147: /* RES 2,E */
{ E( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 148: /* RES 2,H */
{ H( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 149: /* RES 2,L */
{ L( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 150: /* RES 2,(HL) */
{ pokeb( z, res( 0x04, peekb( z ) ) ); return; }
case 151: /* RES 2,A */
{ A( op = res( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 152: /* RES 3,B */
{ B( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 153: /* RES 3,C */
{ C( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 154: /* RES 3,D */
{ D( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 155: /* RES 3,E */
{ E( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 156: /* RES 3,H */
{ H( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 157: /* RES 3,L */
{ L( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 158: /* RES 3,(HL) */
{ pokeb( z, res( 0x08, peekb( z ) ) ); return; }
case 159: /* RES 3,A */
{ A( op = res( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 160: /* RES 4,B */
{ B( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 161: /* RES 4,C */
{ C( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 162: /* RES 4,D */
{ D( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 163: /* RES 4,E */
{ E( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 164: /* RES 4,H */
{ H( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 165: /* RES 4,L */
{ L( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 166: /* RES 4,(HL) */
{ pokeb( z, res( 0x10, peekb( z ) ) ); return; }
case 167: /* RES 4,A */
{ A( op = res( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 168: /* RES 5,B */
{ B( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 169: /* RES 5,C */
{ C( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 170: /* RES 5,D */
{ D( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 171: /* RES 5,E */
{ E( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 172: /* RES 5,H */
{ H( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 173: /* RES 5,L */
{ L( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 174: /* RES 5,(HL) */
{ pokeb( z, res( 0x20, peekb( z ) ) ); return; }
case 175: /* RES 5,A */
{ A( op = res( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 176: /* RES 6,B */
{ B( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 177: /* RES 6,C */
{ C( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 178: /* RES 6,D */
{ D( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 179: /* RES 6,E */
{ E( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 180: /* RES 6,H */
{ H( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 181: /* RES 6,L */
{ L( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 182: /* RES 6,(HL) */
{ pokeb( z, res( 0x40, peekb( z ) ) ); return; }
case 183: /* RES 6,A */
{ A( op = res( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 184: /* RES 7,B */
{ B( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 185: /* RES 7,C */
{ C( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 186: /* RES 7,D */
{ D( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 187: /* RES 7,E */
{ E( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 188: /* RES 7,H */
{ H( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 189: /* RES 7,L */
{ L( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 190: /* RES 7,(HL) */
{ pokeb( z, res( 0x80, peekb( z ) ) ); return; }
case 191: /* RES 7,A */
{ A( op = res( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 192: /* SET 0,B */
{ B( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 193: /* SET 0,C */
{ C( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 194: /* SET 0,D */
{ D( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 195: /* SET 0,E */
{ E( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 196: /* SET 0,H */
{ H( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 197: /* SET 0,L */
{ L( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 198: /* SET 0,(HL) */
{ pokeb( z, set( 0x01, peekb( z ) ) ); return; }
case 199: /* SET 0,A */
{ A( op = set( 0x01, peekb( z ) ) ); pokeb( z, op ); return; }
case 200: /* SET 1,B */
{ B( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 201: /* SET 1,C */
{ C( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 202: /* SET 1,D */
{ D( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 203: /* SET 1,E */
{ E( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 204: /* SET 1,H */
{ H( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 205: /* SET 1,L */
{ L( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 206: /* SET 1,(HL) */
{ pokeb( z, set( 0x02, peekb( z ) ) ); return; }
case 207: /* SET 1,A */
{ A( op = set( 0x02, peekb( z ) ) ); pokeb( z, op ); return; }
case 208: /* SET 2,B */
{ B( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 209: /* SET 2,C */
{ C( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 210: /* SET 2,D */
{ D( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 211: /* SET 2,E */
{ E( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 212: /* SET 2,H */
{ H( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 213: /* SET 2,L */
{ L( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 214: /* SET 2,(HL) */
{ pokeb( z, set( 0x04, peekb( z ) ) ); return; }
case 215: /* SET 2,A */
{ A( op = set( 0x04, peekb( z ) ) ); pokeb( z, op ); return; }
case 216: /* SET 3,B */
{ B( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 217: /* SET 3,C */
{ C( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 218: /* SET 3,D */
{ D( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 219: /* SET 3,E */
{ E( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 220: /* SET 3,H */
{ H( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 221: /* SET 3,L */
{ L( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 222: /* SET 3,(HL) */
{ pokeb( z, set( 0x08, peekb( z ) ) ); return; }
case 223: /* SET 3,A */
{ A( op = set( 0x08, peekb( z ) ) ); pokeb( z, op ); return; }
case 224: /* SET 4,B */
{ B( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 225: /* SET 4,C */
{ C( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 226: /* SET 4,D */
{ D( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 227: /* SET 4,E */
{ E( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 228: /* SET 4,H */
{ H( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 229: /* SET 4,L */
{ L( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 230: /* SET 4,(HL) */
{ pokeb( z, set( 0x10, peekb( z ) ) ); return; }
case 231: /* SET 4,A */
{ A( op = set( 0x10, peekb( z ) ) ); pokeb( z, op ); return; }
case 232: /* SET 5,B */
{ B( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 233: /* SET 5,C */
{ C( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 234: /* SET 5,D */
{ D( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 235: /* SET 5,E */
{ E( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 236: /* SET 5,H */
{ H( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 237: /* SET 5,L */
{ L( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 238: /* SET 5,(HL) */
{ pokeb( z, set( 0x20, peekb( z ) ) ); return; }
case 239: /* SET 5,A */
{ A( op = set( 0x20, peekb( z ) ) ); pokeb( z, op ); return; }
case 240: /* SET 6,B */
{ B( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 241: /* SET 6,C */
{ C( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 242: /* SET 6,D */
{ D( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 243: /* SET 6,E */
{ E( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 244: /* SET 6,H */
{ H( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 245: /* SET 6,L */
{ L( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 246: /* SET 6,(HL) */
{ pokeb( z, set( 0x40, peekb( z ) ) ); return; }
case 247: /* SET 6,A */
{ A( op = set( 0x40, peekb( z ) ) ); pokeb( z, op ); return; }
case 248: /* SET 7,B */
{ B( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 249: /* SET 7,C */
{ C( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 250: /* SET 7,D */
{ D( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 251: /* SET 7,E */
{ E( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 252: /* SET 7,H */
{ H( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 253: /* SET 7,L */
{ L( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
case 254: /* SET 7,(HL) */
{ pokeb( z, set( 0x80, peekb( z ) ) ); return; }
case 255: /* SET 7,A */
{ A( op = set( 0x80, peekb( z ) ) ); pokeb( z, op ); return; }
} // end switch
}
private final int in_bc() {
int ans = inb( BC() );
setZ( ans == 0 );
setS( (ans & F_S)!=0 );
set3( (ans & F_3)!=0 );
set5( (ans & F_5)!=0 );
setPV( parity[ ans ] );
setN( false );
setH( false );
return ans;
}
/** Add with carry - alters all flags (CHECKED) */
private final void
adc_a( int b )
{
int a = A();
int c = Cset() ? 1 : 0;
int wans = a + b + c;
int ans = wans & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setC( (wans&0x100) != 0 );
setPV( ((a ^ ~b) & (a ^ ans) & 0x80) != 0 );
setH( (((a & 0x0f) + (b & 0x0f) + c) & F_H) != 0 );
setN( false );
A( ans );
}
/** Add - alters all flags (CHECKED) */
private final void
add_a( int b )
{
int a = A();
int wans = a + b;
int ans = wans & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setC( (wans&0x100) != 0 );
setPV( ((a ^ ~b) & (a ^ ans) & 0x80) != 0 );
setH( (((a & 0x0f) + (b & 0x0f)) & F_H) != 0 );
setN( false );
A( ans );
}
/** Subtract with carry - alters all flags (CHECKED) */
private final void
sbc_a( int b )
{
int a = A();
int c = Cset() ? 1 : 0;
int wans = a - b - c;
int ans = wans & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setC( (wans&0x100) != 0 );
setPV( ((a ^ b) & (a ^ ans) & 0x80) != 0 );
setH( (((a & 0x0f) - (b & 0x0f) - c) & F_H) != 0 );
setN( true );
A( ans );
}
/** Subtract - alters all flags (CHECKED) */
private final void
sub_a( int b )
{
int a = A();
int wans = a - b;
int ans = wans & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setC( (wans&0x100) != 0 );
setPV( ((a ^ b) & (a ^ ans) & 0x80) != 0 );
setH( (((a & 0x0f) - (b & 0x0f)) & F_H) != 0 );
setN( true );
A( ans );
}
/** Rotate Left - alters H N C 3 5 flags (CHECKED) */
private final void
rlc_a()
{
int ans = A();
boolean c = (ans & 0x80) != 0;
if ( c ) {
ans = (ans << 1)|0x01;
} else {
ans <<= 1;
}
ans &= 0xff;
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setH( false );
setC( c );
A( ans );
}
/** Rotate Right - alters H N C 3 5 flags (CHECKED) */
private final void
rrc_a()
{
int ans = A();
boolean c = (ans & 0x01) != 0;
if ( c ) {
ans = (ans >> 1)|0x80;
} else {
ans >>= 1;
}
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setH( false );
setC( c );
A( ans );
}
/** Rotate Left through Carry - alters H N C 3 5 flags (CHECKED) */
private final void
rl_a()
{
int ans = A();
boolean c = (ans & 0x80) != 0;
if ( Cset() ) {
ans = (ans << 1) | 0x01;
} else {
ans <<= 1;
}
ans &= 0xff;
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setH( false );
setC( c );
A( ans );
}
/** Rotate Right through Carry - alters H N C 3 5 flags (CHECKED) */
private final void
rr_a()
{
int ans = A();
boolean c = (ans & 0x01) != 0;
if ( Cset() ) {
ans = (ans >> 1) | 0x80;
} else {
ans >>= 1;
}
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setH( false );
setC( c );
A( ans );
}
/** Compare - alters all flags (CHECKED) */
private final void
cp_a( int b )
{
int a = A();
int wans = a - b;
int ans = wans & 0xff;
setS( (ans & F_S) != 0 );
set3( (b & F_3) != 0 );
set5( (b & F_5) != 0 );
setN( true );
setZ( ans == 0 );
setC( (wans & 0x100)!=0 );
setH( (((a & 0x0f) - (b & 0x0f)) & F_H) != 0 );
setPV( ((a ^ b) & (a ^ ans) & 0x80) != 0 );
}
/** Bitwise and - alters all flags (CHECKED) */
private final void
and_a( int b )
{
int ans = A() & b;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setH( true );
setPV( parity[ ans ] );
setZ( ans == 0 );
setN( false );
setC( false );
A( ans );
}
/** Bitwise or - alters all flags (CHECKED) */
private final void
or_a( int b )
{
int ans = A() | b;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setH( false );
setPV( parity[ ans ] );
setZ( ans == 0 );
setN( false );
setC( false );
A( ans );
}
/** Bitwise exclusive or - alters all flags (CHECKED) */
private final void
xor_a( int b )
{
int ans = (A() ^ b) & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setH( false );
setPV( parity[ ans ] );
setZ( ans == 0 );
setN( false );
setC( false );
A( ans );
}
/** Negate (Two's complement) - alters all flags (CHECKED) */
private final void
neg_a()
{
int t = A();
A( 0 );
sub_a(t);
}
/** One's complement - alters N H 3 5 flags (CHECKED) */
private final void
cpl_a()
{
int ans = A() ^ 0xff;
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setH( true );
setN( true );
A( ans );
}
/** Decimal Adjust Accumulator - alters all flags (CHECKED) */
private final void
daa_a()
{
int ans = A();
int incr = 0;
boolean carry = Cset();
if ((Hset()) || ((ans & 0x0f) > 0x09)) {
incr |= 0x06;
}
if (carry || (ans > 0x9f) || ((ans > 0x8f) && ((ans & 0x0f) > 0x09))) {
incr |= 0x60;
}
if (ans > 0x99) {
carry = true;
}
if (Nset()) {
sub_a(incr);
} else {
add_a(incr);
}
ans = A();
setC( carry );
setPV( parity[ ans ] );
}
/** Load a with i - (NOT CHECKED) */
private final void
ld_a_i()
{
int ans = I();
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( ans == 0 );
setPV( IFF2() );
setH( false );
setN( false );
A( ans );
}
/** Load a with r - (NOT CHECKED) */
private final void
ld_a_r()
{
int ans = R();
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( ans == 0 );
setPV( IFF2() );
setH( false );
setN( false );
A( ans );
}
/** Rotate right through a and (hl) - (NOT CHECKED) */
private final void
rrd_a()
{
int ans = A();
int t = peekb( HL() );
int q = t;
t = (t >> 4) | (ans << 4);
ans = (ans & 0xf0) | (q & 0x0f);
pokeb( HL(), t );
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( ans == 0 );
setPV( IFF2() );
setH( false );
setN( false );
A( ans );
}
/** Rotate left through a and (hl) - (NOT CHECKED) */
private final void
rld_a()
{
int ans = A();
int t = peekb( HL() );
int q = t;
t = (t << 4) | (ans & 0x0f);
ans = (ans & 0xf0) | (q >> 4);
pokeb( HL(), (t & 0xff) );
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( ans == 0 );
setPV( IFF2() );
setH( false );
setN( false );
A( ans );
}
/** Test bit - alters all but C flag (CHECKED) */
private final void
bit( int b, int r )
{
boolean bitSet = ((r & b) != 0);
setN( false );
setH( true );
set3( (r & F_3) != 0 );
set5( (r & F_5) != 0 );
setS( (b == F_S) ? bitSet : false );
setZ( !bitSet );
setPV( !bitSet );
}
/** Set carry flag - alters N H 3 5 C flags (CHECKED) */
private final void
scf()
{
int ans = A();
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setH( false );
setC( true );
}
/** Complement carry flag - alters N 3 5 C flags (CHECKED) */
private final void
ccf()
{
int ans = A();
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setN( false );
setC( Cset() ? false : true );
}
/** Rotate left - alters all flags (CHECKED) */
private final int
rlc( int ans )
{
boolean c = (ans & 0x80) != 0;
if ( c ) {
ans = (ans << 1)|0x01;
} else {
ans <<= 1;
}
ans &= 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Rotate right - alters all flags (CHECKED) */
private final int
rrc( int ans )
{
boolean c = (ans & 0x01) != 0;
if ( c ) {
ans = (ans >> 1)|0x80;
} else {
ans >>= 1;
}
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Rotate left through carry - alters all flags (CHECKED) */
private final int
rl( int ans )
{
boolean c = (ans & 0x80) != 0;
if ( Cset() ) {
ans = (ans << 1) | 0x01;
} else {
ans <<= 1;
}
ans &= 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Rotate right through carry - alters all flags (CHECKED) */
private final int
rr( int ans )
{
boolean c = (ans & 0x01) != 0;
if ( Cset() ) {
ans = (ans >> 1) | 0x80;
} else {
ans >>= 1;
}
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Shift Left Arithmetically - alters all flags (CHECKED) */
private final int
sla( int ans )
{
boolean c = (ans & 0x80) != 0;
ans = (ans << 1) & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Shift Left and Set - alters all flags (CHECKED) */
private final int
sls( int ans )
{
boolean c = (ans & 0x80) != 0;
ans = ((ans << 1) | 0x01) & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Shift Right Arithmetically - alters all flags (CHECKED) */
private final int
sra( int ans )
{
boolean c = (ans & 0x01) != 0;
ans = (ans >> 1) | (ans & 0x80);
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Shift Right Logically - alters all flags (CHECKED) */
private final int srl( int ans ) {
boolean c = (ans & 0x01) != 0;
ans = ans >> 1;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( parity[ ans ] );
setH( false );
setN( false );
setC( c );
return(ans);
}
/** Decrement - alters all but C flag (CHECKED) */
private final int dec8( int ans ) {
boolean pv = (ans == 0x80);
boolean h = (((ans & 0x0f) - 1) & F_H) != 0;
ans = (ans - 1) & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( pv );
setH( h );
setN( true );
return(ans);
}
/** Increment - alters all but C flag (CHECKED) */
private final int inc8( int ans ) {
boolean pv = (ans == 0x7f);
boolean h = (((ans & 0x0f) + 1) & F_H) != 0;
ans = (ans + 1) & 0xff;
setS( (ans & F_S) != 0 );
set3( (ans & F_3) != 0 );
set5( (ans & F_5) != 0 );
setZ( (ans) == 0 );
setPV( pv );
setH( h );
setN( false );
return(ans);
}
/** Add with carry - (NOT CHECKED) */
private final int adc16( int a, int b ) {
int c = Cset() ? 1 : 0;
int lans = a + b + c;
int ans = lans & 0xffff;
setS( (ans & (F_S<<8)) != 0 );
set3( (ans & (F_3<<8)) != 0 );
set5( (ans & (F_5<<8)) != 0 );
setZ( (ans) == 0 );
setC( (lans & 0x10000)!=0 );
setPV( ((a ^ ~b) & (a ^ ans) & 0x8000)!=0 );
setH( (((a & 0x0fff) + (b & 0x0fff) + c) & 0x1000)!=0 );
setN( false );
return(ans);
}
/** Add - (NOT CHECKED) */
private final int add16( int a, int b ) {
int lans = a + b;
int ans = lans & 0xffff;
set3( (ans & (F_3<<8)) != 0 );
set5( (ans & (F_5<<8)) != 0 );
setC( (lans & 0x10000)!=0 );
setH( (((a & 0x0fff) + (b & 0x0fff)) & 0x1000)!=0 );
setN( false );
return(ans);
}
/** Add with carry - (NOT CHECKED) */
private final int sbc16( int a, int b ) {
int c = Cset() ? 1 : 0;
int lans = a - b - c;
int ans = lans & 0xffff;
setS( (ans & (F_S<<8)) != 0 );
set3( (ans & (F_3<<8)) != 0 );
set5( (ans & (F_5<<8)) != 0 );
setZ( (ans) == 0 );
setC( (lans & 0x10000)!=0 );
setPV( ((a ^ b) & (a ^ ans) & 0x8000)!=0 );
setH( (((a & 0x0fff) - (b & 0x0fff) - c) & 0x1000)!=0 );
setN( true );
return(ans);
}
/** EXX */
public final void exx() {
int t;
t = HL();
HL( _HL_ );
_HL_ = t;
t = DE();
DE( _DE_ );
_DE_ = t;
t = BC();
BC( _BC_ );
_BC_ = t;
}
/** EX AF,AF' */
public final void ex_af_af() {
int t;
t = AF(); AF( _AF_ ); _AF_ = t;
}
/** Quick Increment : no flags */
private static final int inc16( int a ) { return (a + 1) & 0xffff; }
private static final int qinc8( int a ) { return (a + 1) & 0xff; }
/** Quick Decrement : no flags */
private static final int dec16( int a ) { return (a - 1) & 0xffff; }
private static final int qdec8( int a ) { return (a - 1) & 0xff; }
/** Bit toggling */
private static final int res( int bit, int val ) { return val & ~bit; }
private static final int set( int bit, int val ) { return val | bit; }
}