163 lines
4.8 KiB
C#
163 lines
4.8 KiB
C#
using System;
|
|
|
|
namespace BizHawk.Emulation.CPUs.M68000
|
|
{
|
|
partial class MC68000
|
|
{
|
|
void MOVEtSR()
|
|
{
|
|
if (S == false)
|
|
throw new Exception("Write to SR when not in supervisor mode. supposed to trap or something...");
|
|
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
SR = ReadValueW(mode, reg);
|
|
PendingCycles -= 12 + EACyclesBW[mode, reg];
|
|
}
|
|
|
|
void MOVEtSR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
info.Mnemonic = "move";
|
|
info.Args = DisassembleValue(mode, reg, 2, ref pc) + ", SR";
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void MOVEfSR()
|
|
{
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
WriteValueW(mode, reg, (short) SR);
|
|
PendingCycles -= (mode == 0) ? 6 : 8 + EACyclesBW[mode, reg];
|
|
}
|
|
|
|
void MOVEfSR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
info.Mnemonic = "move";
|
|
info.Args = "SR, " + DisassembleValue(mode, reg, 2, ref pc);
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void MOVEUSP()
|
|
{
|
|
if (S == false)
|
|
throw new Exception("MOVE to USP when not supervisor. needs to trap");
|
|
|
|
int dir = (op >> 3) & 1;
|
|
int reg = op & 7;
|
|
|
|
if (dir == 0) usp = A[reg].s32;
|
|
else A[reg].s32 = usp;
|
|
|
|
PendingCycles -= 4;
|
|
}
|
|
|
|
void MOVEUSP_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
int dir = (op >> 3) & 1;
|
|
int reg = op & 7;
|
|
info.Mnemonic = "move";
|
|
info.Args = (dir == 0) ? ("A" + reg + ", USP") : ("USP, A" + reg);
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void ANDI_SR()
|
|
{
|
|
if (S == false)
|
|
throw new Exception("trap!");
|
|
SR &= ReadWord(PC); PC += 2;
|
|
PendingCycles -= 20;
|
|
}
|
|
|
|
void ANDI_SR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
info.Mnemonic = "andi";
|
|
info.Args = DisassembleImmediate(2, ref pc) + ", SR";
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void EORI_SR()
|
|
{
|
|
if (S == false)
|
|
throw new Exception("trap!");
|
|
SR ^= ReadWord(PC); PC += 2;
|
|
PendingCycles -= 20;
|
|
}
|
|
|
|
void EORI_SR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
info.Mnemonic = "eori";
|
|
info.Args = DisassembleImmediate(2, ref pc) + ", SR";
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void ORI_SR()
|
|
{
|
|
if (S == false)
|
|
throw new Exception("trap!");
|
|
SR |= ReadWord(PC); PC += 2;
|
|
PendingCycles -= 20;
|
|
}
|
|
|
|
void ORI_SR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
info.Mnemonic = "ori";
|
|
info.Args = DisassembleImmediate(2, ref pc) + ", SR";
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void MOVECCR()
|
|
{
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
|
|
ushort sr = (ushort) (SR & 0xFF00);
|
|
sr |= (byte)ReadValueB(mode, reg);
|
|
SR = (short)sr;
|
|
PendingCycles -= 12 + EACyclesBW[mode, reg];
|
|
}
|
|
|
|
void MOVECCR_Disasm(DisassemblyInfo info)
|
|
{
|
|
int pc = info.PC + 2;
|
|
int mode = (op >> 3) & 7;
|
|
int reg = (op >> 0) & 7;
|
|
info.Mnemonic = "move";
|
|
info.Args = DisassembleValue(mode, reg, 2, ref pc) + ", CCR";
|
|
info.Length = pc - info.PC;
|
|
}
|
|
|
|
void TRAP()
|
|
{
|
|
int vector = 32 + (op & 0x0F);
|
|
TrapVector(vector);
|
|
PendingCycles -= 26;
|
|
}
|
|
|
|
void TRAP_Disasm(DisassemblyInfo info)
|
|
{
|
|
info.Mnemonic = "trap";
|
|
info.Args = string.Format("${0:X}", op & 0xF);
|
|
}
|
|
|
|
void TrapVector(int vector)
|
|
{
|
|
short sr = (short)SR; // capture current SR.
|
|
S = true; // switch to supervisor mode, if not already in it.
|
|
A[7].s32 -= 4; // Push PC on stack
|
|
WriteLong(A[7].s32, PC);
|
|
A[7].s32 -= 2; // Push SR on stack
|
|
WriteWord(A[7].s32, sr);
|
|
PC = ReadLong(vector * 4); // Jump to vector
|
|
}
|
|
}
|
|
} |