406 lines
11 KiB
C#
406 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace MC68000
|
|
{
|
|
public partial class MC68K
|
|
{
|
|
#region AND Helpers
|
|
private sbyte And(sbyte a, sbyte b)
|
|
{
|
|
sbyte result = (sbyte)(a & b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private short And(short a, short b)
|
|
{
|
|
short result = (short)(a & b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private int And(int a, int b)
|
|
{
|
|
int result = (int)(a & b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
#endregion AND Helpers
|
|
|
|
private void AND_Dest()
|
|
{
|
|
int src_register = (this.m_IR >> 9) & 0x7;
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int dest_mode = (this.m_IR >> 3) & 0x7;
|
|
int dest_register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = And((sbyte)this.m_D[src_register], PeekOperandB(dest_mode, dest_register));
|
|
SetOperandB(dest_mode, dest_register, result);
|
|
this.m_Cycles += 4 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = And((short)this.m_D[src_register], PeekOperandW(dest_mode, dest_register));
|
|
SetOperandW(dest_mode, dest_register, result);
|
|
this.m_Cycles += 4 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = And(this.m_D[src_register], PeekOperandL(dest_mode, dest_register));
|
|
SetOperandL(dest_mode, dest_register, result);
|
|
this.m_Cycles += 6 + Helpers.EACalcTimeL(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AND_Source()
|
|
{
|
|
int dest_register = (this.m_IR >> 9) & 0x7;
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int src_mode = (this.m_IR >> 3) & 0x7;
|
|
int src_register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = And((sbyte)this.m_D[dest_register], FetchOperandB(src_mode, src_register));
|
|
Helpers.Inject(ref this.m_D[dest_register], result);
|
|
this.m_Cycles += 8 + Helpers.EACalcTimeBW(src_mode, src_register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = And((short)this.m_D[dest_register], FetchOperandW(src_mode, src_register));
|
|
Helpers.Inject(ref this.m_D[dest_register], result);
|
|
this.m_Cycles += 8 + Helpers.EACalcTimeBW(src_mode, src_register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = And(this.m_D[dest_register], FetchOperandL(src_mode, src_register));
|
|
this.m_D[dest_register] = result;
|
|
this.m_Cycles += 12 + Helpers.EACalcTimeL(src_mode, src_register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ANDI()
|
|
{
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int mode = (this.m_IR >> 3) & 0x7;
|
|
int register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = And((sbyte)FetchW(), PeekOperandB(mode, register));
|
|
SetOperandB(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = And(FetchW(), PeekOperandW(mode, register));
|
|
SetOperandW(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = And(FetchL(), PeekOperandL(mode, register));
|
|
SetOperandL(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 14 : 20 + Helpers.EACalcTimeL(mode, register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
#region EOR Helpers
|
|
private sbyte Eor(sbyte a, sbyte b)
|
|
{
|
|
sbyte result = (sbyte)(a ^ b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private short Eor(short a, short b)
|
|
{
|
|
short result = (short)(a ^ b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private int Eor(int a, int b)
|
|
{
|
|
int result = (int)(a ^ b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
#endregion EOR Helpers
|
|
|
|
private void EOR()
|
|
{
|
|
int src_register = (this.m_IR >> 9) & 0x7;
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int dest_mode = (this.m_IR >> 3) & 0x7;
|
|
int dest_register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = Eor((sbyte)this.m_D[src_register], PeekOperandB(dest_mode, dest_register));
|
|
SetOperandB(dest_mode, dest_register, result);
|
|
this.m_Cycles += (dest_mode == 0) ? 4 : 8 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = Eor((short)this.m_D[src_register], PeekOperandW(dest_mode, dest_register));
|
|
SetOperandW(dest_mode, dest_register, result);
|
|
this.m_Cycles += (dest_mode == 0) ? 4 : 8 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = Eor(this.m_D[src_register], PeekOperandL(dest_mode, dest_register));
|
|
SetOperandL(dest_mode, dest_register, result);
|
|
this.m_Cycles += (dest_mode == 0) ? 8 : 12 + Helpers.EACalcTimeL(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void EORI()
|
|
{
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int mode = (this.m_IR >> 3) & 0x7;
|
|
int register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = Eor((sbyte)FetchW(), PeekOperandB(mode, register));
|
|
SetOperandB(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = Eor(FetchW(), PeekOperandW(mode, register));
|
|
SetOperandW(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = Eor(FetchL(), PeekOperandL(mode, register));
|
|
SetOperandL(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 16 : 20 + Helpers.EACalcTimeL(mode, register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
#region OR Helpers
|
|
private sbyte Or(sbyte a, sbyte b)
|
|
{
|
|
sbyte result = (sbyte)(a | b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private short Or(short a, short b)
|
|
{
|
|
short result = (short)(a | b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
private int Or(int a, int b)
|
|
{
|
|
int result = (int)(a | b);
|
|
|
|
this.V = this.C = false;
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
|
|
return result;
|
|
}
|
|
#endregion OR Helpers
|
|
|
|
private void OR_Dest()
|
|
{
|
|
int src_register = (this.m_IR >> 9) & 0x7;
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int dest_mode = (this.m_IR >> 3) & 0x7;
|
|
int dest_register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = Or((sbyte)this.m_D[src_register], PeekOperandB(dest_mode, dest_register));
|
|
SetOperandB(dest_mode, dest_register, result);
|
|
this.m_Cycles += 8 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = Or((short)this.m_D[src_register], PeekOperandW(dest_mode, dest_register));
|
|
SetOperandW(dest_mode, dest_register, result);
|
|
this.m_Cycles += 8 + Helpers.EACalcTimeBW(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = Or(this.m_D[src_register], PeekOperandL(dest_mode, dest_register));
|
|
SetOperandL(dest_mode, dest_register, result);
|
|
this.m_Cycles += 12 + Helpers.EACalcTimeL(dest_mode, dest_register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OR_Source()
|
|
{
|
|
int dest_register = (this.m_IR >> 9) & 0x7;
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int src_mode = (this.m_IR >> 3) & 0x7;
|
|
int src_register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = Or((sbyte)this.m_D[dest_register], FetchOperandB(src_mode, src_register));
|
|
Helpers.Inject(ref this.m_D[dest_register], result);
|
|
this.m_Cycles += 4 + Helpers.EACalcTimeBW(src_mode, src_register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = Or((short)this.m_D[dest_register], FetchOperandW(src_mode, src_register));
|
|
Helpers.Inject(ref this.m_D[dest_register], result);
|
|
this.m_Cycles += 4 + Helpers.EACalcTimeBW(src_mode, src_register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = Or(this.m_D[dest_register], FetchOperandL(src_mode, src_register));
|
|
this.m_D[dest_register] = result;
|
|
this.m_Cycles += 6 + Helpers.EACalcTimeL(src_mode, src_register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ORI()
|
|
{
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int mode = (this.m_IR >> 3) & 0x7;
|
|
int register = this.m_IR & 0x7;
|
|
|
|
switch (size)
|
|
{
|
|
case 0: // B
|
|
{
|
|
sbyte result = Or((sbyte)FetchW(), PeekOperandB(mode, register));
|
|
SetOperandB(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 1: // W
|
|
{
|
|
short result = Or(FetchW(), PeekOperandW(mode, register));
|
|
SetOperandW(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 8 : 12 + Helpers.EACalcTimeBW(mode, register);
|
|
return;
|
|
}
|
|
case 2: // L
|
|
{
|
|
int result = Or(FetchL(), PeekOperandL(mode, register));
|
|
SetOperandL(mode, register, result);
|
|
this.m_Cycles += (mode == 0) ? 16 : 20 + Helpers.EACalcTimeL(mode, register);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void NOT()
|
|
{
|
|
int size = (this.m_IR >> 6) & 0x3;
|
|
int mode = (this.m_IR >> 3) & 0x7;
|
|
int register = this.m_IR & 0x7;
|
|
|
|
long result = 0;
|
|
this.V = this.C = false;
|
|
switch (size)
|
|
{
|
|
case 0:
|
|
result = ~PeekOperandB(mode, register);
|
|
SetOperandB(mode, register, (sbyte)result);
|
|
this.m_Cycles += (mode == 0) ? 4 : 8 + Helpers.EACalcTimeBW(mode, register);
|
|
break;
|
|
case 1:
|
|
result = ~PeekOperandW(mode, register);
|
|
SetOperandW(mode, register, (short)result);
|
|
this.m_Cycles += (mode == 0) ? 4 : 8 + Helpers.EACalcTimeBW(mode, register);
|
|
break;
|
|
case 2:
|
|
result = ~PeekOperandL(mode, register);
|
|
SetOperandL(mode, register, (int)result);
|
|
this.m_Cycles += (mode == 0) ? 6 : 12 + Helpers.EACalcTimeL(mode, register);
|
|
break;
|
|
}
|
|
this.N = result < 0;
|
|
this.Z = result == 0;
|
|
}
|
|
}
|
|
}
|