MC6809; finish instruction decoding

This commit is contained in:
alyosha-tas 2019-04-06 15:16:53 -05:00
parent 8995e2e977
commit 87214c252d
6 changed files with 186 additions and 376 deletions

View File

@ -4,11 +4,10 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
public partial class MC6809
{
private ulong totalExecutedCycles;
public ulong TotalExecutedCycles { get { return totalExecutedCycles; } set { totalExecutedCycles = value; } }
public ulong TotalExecutedCycles;
private int EI_pending;
private bool interrupts_enabled;
public int EI_pending;
public bool interrupts_enabled;
// variables for executing instructions
public int instr_pntr = 0;
@ -17,7 +16,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public bool halted;
public bool stopped;
public bool jammed;
public int LY;
public void FetchInstruction(byte opcode)
{
@ -163,7 +161,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case 0x89: REG_OP_IMD(ADC8, A); break; // ADCA (Immediate)
case 0x8A: REG_OP_IMD(OR8, A); break; // ORA (Immediate)
case 0x8B: REG_OP_IMD(ADD8, A); break; // ADDA (Immediate)
case 0x8C: REG_OP_IMD(ADC8, A); break; // CMPX (Immediate)
case 0x8C: IMD_CMP_16(CMP16, X); break; // CMPX (Immediate)
case 0x8D: BSR_(); break; // BSR (Relative)
case 0x8E: REG_OP_LD_16(X); break; // LDX (Immediate)
case 0x8F: ILLEGAL(); break; // ILLEGAL
@ -286,44 +284,44 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
switch (opcode)
{
case 0x21: REG_OP(XOR8, B); break; // LBRN (Relative)
case 0x22: REG_OP(XOR8, B); break; // LBHI (Relative)
case 0x23: REG_OP(XOR8, B); break; // LBLS (Relative)
case 0x24: REG_OP(XOR8, B); break; // LBHS , LBCC (Relative)
case 0x25: REG_OP(XOR8, B); break; // LBCS , LBLO (Relative)
case 0x26: REG_OP(XOR8, B); break; // LBNE (Relative)
case 0x27: REG_OP(XOR8, B); break; // LBEQ (Relative)
case 0x28: REG_OP(XOR8, B); break; // LBVC (Relative)
case 0x29: REG_OP(XOR8, B); break; // LBVS (Relative)
case 0x2A: REG_OP(XOR8, B); break; // LBPL (Relative)
case 0x2B: REG_OP(XOR8, B); break; // LBMI (Relative)
case 0x2C: REG_OP(XOR8, B); break; // LBGE (Relative)
case 0x2D: REG_OP(XOR8, B); break; // LBLT (Relative)
case 0x2E: REG_OP(XOR8, B); break; // LBGT (Relative)
case 0x2F: REG_OP(XOR8, B); break; // LBLE (Relative)
case 0x3F: REG_OP(XOR8, B); break; // SWI2 (Inherent)
case 0x83: REG_OP(XOR8, B); break; // CMPD (Immediate)
case 0x8C: REG_OP(XOR8, B); break; // CMPY (Immediate)
case 0x8E: REG_OP(XOR8, B); break; // LDY (Immediate)
case 0x93: REG_OP(XOR8, B); break; // CMPD (Direct)
case 0x9C: REG_OP(XOR8, B); break; // CMPY (Direct)
case 0x9E: REG_OP(XOR8, B); break; // LDY (Direct)
case 0x9F: REG_OP(XOR8, B); break; // STY (Direct)
case 0xA3: REG_OP(XOR8, B); break; // CMPD (Indexed)
case 0xAC: REG_OP(XOR8, B); break; // CMPY (Indexed)
case 0xAE: REG_OP(XOR8, B); break; // LDY (Indexed)
case 0xAF: REG_OP(XOR8, B); break; // STY (Indexed)
case 0xB3: REG_OP(XOR8, B); break; // CMPD (Extended)
case 0xBC: REG_OP(XOR8, B); break; // CMPY (Extended)
case 0xBE: REG_OP(XOR8, B); break; // LDY (Extended)
case 0xBF: REG_OP(XOR8, B); break; // STY (Extended)
case 0xCE: REG_OP(XOR8, B); break; // LDS (Immediate)
case 0xDE: REG_OP(XOR8, B); break; // LDS (Direct)
case 0xDF: REG_OP(XOR8, B); break; // STS (Direct)
case 0xEE: REG_OP(XOR8, B); break; // LDS (Indexed)
case 0xEF: REG_OP(XOR8, B); break; // STS (Indexed)
case 0xFE: REG_OP(XOR8, B); break; // LDS (Extended)
case 0xFF: REG_OP(XOR8, B); break; // STS (Extended)
case 0x21: LBR_(false); break; // BRN (Relative)
case 0x22: LBR_(!(FlagC | FlagZ)); break; // BHI (Relative)
case 0x23: LBR_(FlagC | FlagZ); break; // BLS (Relative)
case 0x24: LBR_(!FlagC); break; // BHS , BCC (Relative)
case 0x25: LBR_(FlagC); break; // BLO , BCS (Relative)
case 0x26: LBR_(!FlagZ); break; // BNE (Relative)
case 0x27: LBR_(FlagZ); break; // BEQ (Relative)
case 0x28: LBR_(!FlagV); break; // BVC (Relative)
case 0x29: LBR_(FlagV); break; // BVS (Relative)
case 0x2A: LBR_(!FlagN); break; // BPL (Relative)
case 0x2B: LBR_(FlagN); break; // BMI (Relative)
case 0x2C: LBR_(FlagN == FlagV); break; // BGE (Relative)
case 0x2D: LBR_(FlagN ^ FlagV); break; // BLT (Relative)
case 0x2E: LBR_((!FlagZ) & (FlagN == FlagV)); break; // BGT (Relative)
case 0x2F: LBR_(FlagZ | (FlagN ^ FlagV)); break; // BLE (Relative)
case 0x3F: SWI2_3(2); break; // SWI2 (Inherent)
case 0x83: IMD_OP_D(CMP16D, D); break; // CMPD (Immediate)
case 0x8C: IMD_CMP_16(CMP16, Y); break; // CMPY (Immediate)
case 0x8E: REG_OP_LD_16(Y); break; // LDY (Immediate)
case 0x93: DIR_OP_D(CMP16D, D); break; // CMPD (Direct)
case 0x9C: DIR_CMP_16(CMP16, Y); break; // CMPY (Direct)
case 0x9E: DIR_OP_LD_16(Y); break; // LDY (Direct)
case 0x9F: DIR_OP_ST_16(Y); break; // STY (Direct)
case 0xA3: INDEX_OP_REG(I_CMP16D, D); break; // CMPD (Indexed)
case 0xAC: INDEX_OP_REG(I_CMP16, Y); break; // CMPY (Indexed)
case 0xAE: INDEX_OP_REG(I_LD16, Y); break; // LDY (Indexed)
case 0xAF: INDEX_OP_REG(I_ST16, Y); break; // STY (Indexed)
case 0xB3: EXT_OP_D(CMP16D, D); break; // CMPD (Extended)
case 0xBC: EXT_CMP_16(CMP16, Y); break; // CMPY (Extended)
case 0xBE: EXT_OP_LD_16(Y); break; // LDY (Extended)
case 0xBF: EXT_OP_ST_16(Y); break; // STY (Extended)
case 0xCE: REG_OP_LD_16(SP); break; // LDS (Immediate)
case 0xDE: DIR_OP_LD_16(SP); break; // LDS (Direct)
case 0xDF: DIR_OP_ST_16(SP); break; // STS (Direct)
case 0xEE: INDEX_OP_REG(I_LD16, SP); break; // LDS (Indexed)
case 0xEF: INDEX_OP_REG(I_ST16, SP); break; // STS (Indexed)
case 0xFE: EXT_OP_LD_16(SP); break; // LDS (Extended)
case 0xFF: EXT_OP_ST_16(SP); break; // STS (Extended)
default: ILLEGAL(); break;
}
@ -333,15 +331,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
switch (opcode)
{
case 0x3F: REG_OP(XOR8, B); break; // SWI3 (Inherent)
case 0x83: REG_OP(XOR8, B); break; // CMPU (Immediate)
case 0x8C: REG_OP(XOR8, B); break; // CMPS (Immediate)
case 0x93: REG_OP(XOR8, B); break; // CMPU (Direct)
case 0x9C: REG_OP(XOR8, B); break; // CMPS (Direct)
case 0xA3: REG_OP(XOR8, B); break; // CMPU (Indexed)
case 0xAC: REG_OP(XOR8, B); break; // CMPS (Indexed)
case 0xB3: REG_OP(XOR8, B); break; // CMPU (Extended)
case 0xBC: REG_OP(XOR8, B); break; // CMPS (Extended)
case 0x3F: SWI2_3(3); break; // SWI3 (Inherent)
case 0x83: IMD_CMP_16(CMP16, US); break; // CMPU (Immediate)
case 0x8C: IMD_CMP_16(CMP16, SP); break; // CMPS (Immediate)
case 0x93: DIR_CMP_16(CMP16, US); break; // CMPU (Direct)
case 0x9C: DIR_CMP_16(CMP16, SP); break; // CMPS (Direct)
case 0xA3: INDEX_OP_REG(I_CMP16, US); break; // CMPU (Indexed)
case 0xAC: INDEX_OP_REG(I_CMP16, SP); break; // CMPS (Indexed)
case 0xB3: EXT_CMP_16(CMP16, US); break; // CMPU (Extended)
case 0xBC: EXT_CMP_16(CMP16, SP); break; // CMPS (Extended)
default: ILLEGAL(); break;
}

View File

@ -39,6 +39,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public const ushort I_ST16 = 32;
public const ushort I_LD16D = 33;
public const ushort I_ST16D = 34;
public const ushort I_CMP16D = 35;
public ushort indexed_op;
public ushort indexed_reg;
@ -424,6 +425,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case I_ST16: INDEX_OP_ST(); break; // ST X, Y, SP, US
case I_LD16D: INDEX_OP_LDD(); break; // LD D
case I_ST16D: INDEX_OP_STD(); break; // ST D
case I_CMP16D: INDEX_OP_EX6D(CMP16D); break; // CMP D
}
}
}

View File

@ -1,10 +1,6 @@
using System;
using System.Globalization;
using System.IO;
using BizHawk.Common;
using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions;
// Motorola Corp 6809
namespace BizHawk.Emulation.Common.Components.MC6809
@ -26,72 +22,58 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public const ushort INC8 = 11;
public const ushort DEC16 = 12;
public const ushort DEC8 = 13;
public const ushort RLC = 14;
public const ushort ROL = 15;
public const ushort RRC = 16;
public const ushort ROR = 17;
public const ushort COM = 18;
public const ushort DA = 19;
public const ushort SCF = 20;
public const ushort CCF = 21;
public const ushort AND8 = 22;
public const ushort XOR8 = 23;
public const ushort OR8 = 24;
public const ushort CP8 = 25;
public const ushort ASL = 26;
public const ushort ASR = 27;
public const ushort LSR = 28;
public const ushort SWAP = 29;
public const ushort BIT = 30;
public const ushort RES = 31;
public const ushort SET = 32;
public const ushort EI = 33;
public const ushort DI = 34;
public const ushort CWAI = 35;
public const ushort STOP = 36;
public const ushort ASGN = 38;
public const ushort ADDS = 39; // signed 16 bit operation used in 2 instructions
public const ushort OP_G = 40; // glitchy opcode read performed by halt when interrupts disabled
public const ushort JAM = 41; // all undocumented opcodes jam the machine
public const ushort RD_F = 42; // special read case to pop value into F
public const ushort EI_RETI = 43; // reti has no delay in interrupt enable
public const ushort INT_GET = 44;
public const ushort HALT_CHK = 45; // when in halt mode, actually check I Flag here
public const ushort RD_INC = 46;
public const ushort SET_ADDR = 47;
public const ushort NEG = 48;
public const ushort TST = 49;
public const ushort CLR = 50;
public const ushort OP_PG_2 = 51;
public const ushort OP_PG_3 = 52;
public const ushort SEX = 53;
public const ushort RD_INC_OP = 54;
public const ushort EXG = 55;
public const ushort TFR = 56;
public const ushort WR_DEC_LO = 57;
public const ushort WR_DEC_HI = 58;
public const ushort WR_HI = 59;
public const ushort ADD8BR = 60;
public const ushort ABX = 61;
public const ushort MUL = 62;
public const ushort JPE = 63;
public const ushort IDX_DCDE = 64;
public const ushort IDX_OP_BLD = 65;
public const ushort EA_8 = 66;
public const ushort EA_16 = 67;
public const ushort PSH_n = 68;
public const ushort PUL_n = 69;
public const ushort WR_DEC_LO_OP = 70;
public const ushort WR_DEC_HI_OP = 71;
public const ushort SET_ADDR_PUL = 72;
public const ushort SET_F_I = 73;
public const ushort SET_E = 74;
public const ushort ANDCC = 75;
public const ushort CMP8 = 76;
public const ushort SUB16 = 77;
public const ushort ADD16 = 78;
public const ushort CMP16 = 79;
public const ushort WR_HI_INC = 80;
public const ushort ROL = 14;
public const ushort ROR = 15;
public const ushort COM = 16;
public const ushort DA = 17;
public const ushort AND8 = 18;
public const ushort XOR8 = 19;
public const ushort OR8 = 20;
public const ushort CP8 = 21;
public const ushort ASL = 22;
public const ushort ASR = 23;
public const ushort LSR = 24;
public const ushort BIT = 25;
public const ushort CWAI = 26;
public const ushort SYNC = 27;
public const ushort INT_GET = 28;
public const ushort HALT_CHK = 29; // when in halt mode, actually check I Flag here
public const ushort RD_INC = 30;
public const ushort SET_ADDR = 31;
public const ushort NEG = 32;
public const ushort TST = 33;
public const ushort CLR = 34;
public const ushort OP_PG_2 = 35;
public const ushort OP_PG_3 = 36;
public const ushort SEX = 37;
public const ushort RD_INC_OP = 38;
public const ushort EXG = 39;
public const ushort TFR = 40;
public const ushort WR_DEC_LO = 41;
public const ushort WR_DEC_HI = 42;
public const ushort WR_HI = 43;
public const ushort ADD8BR = 44;
public const ushort ABX = 45;
public const ushort MUL = 46;
public const ushort JPE = 47;
public const ushort IDX_DCDE = 48;
public const ushort IDX_OP_BLD = 49;
public const ushort EA_8 = 50;
public const ushort EA_16 = 51;
public const ushort PSH_n = 52;
public const ushort PUL_n = 53;
public const ushort WR_DEC_LO_OP = 54;
public const ushort WR_DEC_HI_OP = 55;
public const ushort SET_ADDR_PUL = 56;
public const ushort SET_F_I = 57;
public const ushort SET_E = 58;
public const ushort ANDCC = 59;
public const ushort CMP8 = 60;
public const ushort SUB16 = 61;
public const ushort ADD16 = 62;
public const ushort CMP16 = 63;
public const ushort CMP16D = 64;
public const ushort WR_HI_INC = 65;
public MC6809()
{
@ -156,7 +138,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
};
// Execute instructions
public void ExecuteOne(ref byte interrupt_src, byte interrupt_enable)
public void ExecuteOne()
{
switch (cur_instr[instr_pntr++])
{
@ -248,9 +230,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case DEC16:
DEC16_Func(cur_instr[instr_pntr++]);
break;
case TR:
TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case SET_ADDR:
Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[cur_instr[instr_pntr++]] << 8) | Regs[cur_instr[instr_pntr++]]);
break;
@ -383,7 +362,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
CMP8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case INC16:
INC16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
INC16_Func(cur_instr[instr_pntr++]);
break;
case INC8:
INC8_Func(cur_instr[instr_pntr++]);
@ -400,18 +379,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case CMP16:
CMP16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case CMP16D:
CMP16D_Func(cur_instr[instr_pntr++]);
break;
case DEC8:
DEC8_Func(cur_instr[instr_pntr++]);
break;
case RLC:
RLC_Func(cur_instr[instr_pntr++]);
break;
case ROL:
ROL_Func(cur_instr[instr_pntr++]);
break;
case RRC:
RRC_Func(cur_instr[instr_pntr++]);
break;
case ROR:
ROR_Func(cur_instr[instr_pntr++]);
break;
@ -421,12 +397,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case DA:
DA_Func(cur_instr[instr_pntr++]);
break;
case SCF:
SCF_Func(cur_instr[instr_pntr++]);
break;
case CCF:
CCF_Func(cur_instr[instr_pntr++]);
break;
case AND8:
AND8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
@ -448,55 +418,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case LSR:
LSR_Func(cur_instr[instr_pntr++]);
break;
case SWAP:
SWAP_Func(cur_instr[instr_pntr++]);
break;
case BIT:
BIT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case RES:
RES_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case SET:
SET_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case EI:
if (EI_pending == 0) { EI_pending = 2; }
break;
case DI:
interrupts_enabled = false;
EI_pending = 0;
break;
case CWAI:
break;
case STOP:
case SYNC:
break;
case ASGN:
ASGN_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case ADDS:
ADDS_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case OP_G:
if (OnExecFetch != null) OnExecFetch(PC);
if (TraceCallback != null) TraceCallback(State());
if (CDLCallback != null) CDLCallback(PC, eCDLogMemFlags.FetchFirst);
FetchInstruction(ReadMemory(PC)); // note no increment
instr_pntr = 0;
break;
case JAM:
jammed = true;
instr_pntr--;
break;
case RD_F:
Read_Func_F(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break;
case EI_RETI:
EI_pending = 1;
break;
case INT_GET:
@ -505,7 +434,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
break;
}
totalExecutedCycles++;
TotalExecutedCycles++;
}
// tracer stuff
@ -514,7 +443,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public string TraceHeader
{
get { return "MC6809: PC, machine code, mnemonic, operands, registers (A, F, B, C, D, E, H, L, SP), Cy, flags (ZNHCI)"; }
get { return "MC6809: PC, machine code, mnemonic, operands, registers (A, B, X, Y, US, SP, DP, CC), Cy, flags (EFHINZVC)"; }
}
public TraceInfo State(bool disassemble = true)
@ -527,16 +456,25 @@ namespace BizHawk.Emulation.Common.Components.MC6809
"{0} ",
disassemble ? Disassemble(PC, ReadMemory, out notused) : "---").PadRight(40),
RegisterInfo = string.Format(
"A:{0:X2} F:{1:X2} B:{2:X2} C:{3:X2} D:{4:X2} E:{5:X2} H:{6:X2} L:{7:X2}",
"A:{0:X2} B:{1:X2} X:{2:X4} Y:{3:X4} US:{4:X4} SP:{5:X4} DP:{6:X2} CC:{7:X2} Cy:{8} {9}{10}{11}{12}{13}{14}{15}{16}",
Regs[A],
Regs[B],
Regs[X],
Regs[Y],
Regs[US],
Regs[SP],
Regs[DP],
Regs[CC],
TotalExecutedCycles,
LY,
FlagZ ? "Z" : "z",
FlagN ? "N" : "n",
FlagE ? "E" : "e",
FlagF ? "F" : "f",
FlagH ? "H" : "h",
FlagC ? "C" : "c",
FlagI ? "I" : "i",
interrupts_enabled ? "E" : "e")
FlagN ? "N" : "n",
FlagZ ? "Z" : "z",
FlagV ? "V" : "v",
FlagC ? "C" : "c"
)
};
}
@ -582,7 +520,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
ser.Sync("Halt_bug_2", ref Halt_bug_2);
ser.Sync("Halt_bug_3", ref Halt_bug_3);
ser.Sync("Halted", ref halted);
ser.Sync("ExecutedCycles", ref totalExecutedCycles);
ser.Sync("TotalExecutedCycles", ref TotalExecutedCycles);
ser.Sync("EI_pending", ref EI_pending);
ser.Sync("int_src", ref int_src);
ser.Sync("stop_time", ref stop_time);
@ -594,7 +532,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
ser.Sync("Stopped", ref stopped);
ser.Sync("opcode", ref opcode);
ser.Sync("jammped", ref jammed);
ser.Sync("LY", ref LY);
ser.EndSection();
}

View File

@ -1,5 +1,5 @@
using BizHawk.Common.NumberExtensions;
using System;
using System;
using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Common.Components.MC6809
{
@ -52,12 +52,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
Regs[src] = ans;
}
// speical read for POP AF that always clears the lower 4 bits of F
public void Read_Func_F(ushort dest, ushort src_l, ushort src_h)
{
Regs[dest] = (ushort)(ReadMemory((ushort)(Regs[src_l] | (Regs[src_h]) << 8)) & 0xF0);
}
public void Write_Dec_Lo_Func(ushort dest, ushort src)
{
if (CDLCallback != null) CDLCallback(Regs[dest], eCDLogMemFlags.Write | eCDLogMemFlags.Data);
@ -199,32 +193,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
FlagN = ans > 127;
}
public void SET_Func(ushort bit, ushort src)
{
Regs[src] |= (ushort)(1 << bit);
}
public void RES_Func(ushort bit, ushort src)
{
Regs[src] &= (ushort)(0xFF - (1 << bit));
}
public void ASGN_Func(ushort src, ushort val)
{
Regs[src] = val;
}
public void SWAP_Func(ushort src)
{
ushort temp = (ushort)((Regs[src] << 4) & 0xF0);
Regs[src] = (ushort)(temp | (Regs[src] >> 4));
FlagZ = Regs[src] == 0;
FlagH = false;
FlagN = false;
FlagC = false;
}
public void ASL_Func(ushort src)
{
FlagC = Regs[src].Bit(7);
@ -286,20 +254,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
FlagN = Regs[A] > 127;
}
public void CCF_Func(ushort src)
{
FlagC = !FlagC;
FlagH = false;
FlagN = false;
}
public void SCF_Func(ushort src)
{
FlagC = true;
FlagH = false;
FlagN = false;
}
public void AND8_Func(ushort dest, ushort src)
{
Regs[dest] = (ushort)(Regs[dest] & Regs[src]);
@ -344,17 +298,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
FlagN = true;
}
public void RRC_Func(ushort src)
{
FlagC = Regs[src].Bit(0);
Regs[src] = (ushort)((FlagC ? 0x80 : 0) | (Regs[src] >> 1));
FlagZ = (Regs[src] == 0);
FlagH = false;
FlagN = false;
}
public void ROR_Func(ushort src)
{
ushort c = (ushort)(FlagC ? 0x80 : 0);
@ -367,21 +310,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809
FlagN = (Regs[src] & 0xFF) > 127;
}
public void RLC_Func(ushort src)
{
bool imm = false;
if (imm) { src = A; }
ushort c = (ushort)(Regs[src].Bit(7) ? 1 : 0);
FlagC = Regs[src].Bit(7);
Regs[src] = (ushort)(((Regs[src] << 1) & 0xFF) | c);
FlagZ = imm ? false : (Regs[src] == 0);
FlagH = false;
FlagN = false;
}
public void ROL_Func(ushort src)
{
ushort c = (ushort)(FlagC ? 1 : 0);
@ -415,14 +343,9 @@ namespace BizHawk.Emulation.Common.Components.MC6809
FlagN = (Regs[src] & 0xFF) > 127;
}
public void INC16_Func(ushort src_l, ushort src_h)
public void INC16_Func(ushort src)
{
int Reg16_d = Regs[src_l] | (Regs[src_h] << 8);
Reg16_d += 1;
Regs[src_l] = (ushort)(Reg16_d & 0xFF);
Regs[src_h] = (ushort)((Reg16_d & 0xFF00) >> 8);
Regs[src] += 1;
}
public void DEC16_Func(ushort src)
@ -587,6 +510,23 @@ namespace BizHawk.Emulation.Common.Components.MC6809
D = ans;
}
// D register implied
public void CMP16D_Func(ushort src)
{
int Reg16_d = D;
int Reg16_s = Regs[src];
Reg16_d += Reg16_s;
FlagC = Reg16_d.Bit(16);
FlagZ = (Reg16_d & 0xFFFF) == 0;
ushort ans = (ushort)(Reg16_d & 0xFFFF);
FlagN = ans > 0x7FFF;
FlagV = (D.Bit(15) != Regs[src].Bit(15)) && (D.Bit(15) != ans.Bit(15));
}
public void CMP16_Func(ushort dest, ushort src)
{
int Reg16_d = Regs[dest];

View File

@ -1,4 +1,3 @@
using System.Runtime.InteropServices;
using System;
namespace BizHawk.Emulation.Common.Components.MC6809

View File

@ -1,5 +1,5 @@
using BizHawk.Common.NumberExtensions;
using System;
using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Common.Components.MC6809
{
@ -15,12 +15,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void ILLEGAL()
{
throw new Exception("Encountered illegal instruction");
}
private void SYNC_()
{
PopulateCURINSTR(IDLE,
IDLE,
SYNC);
}
private void REG_OP(ushort oper, ushort src)
@ -146,6 +148,13 @@ namespace BizHawk.Emulation.Common.Components.MC6809
oper, dest, ADDR);
}
private void IMD_CMP_16(ushort oper, ushort dest)
{
PopulateCURINSTR(RD_INC, ALU, PC,
RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
oper, dest, ADDR);
}
private void REG_OP_LD_16(ushort dest)
{
PopulateCURINSTR(RD_INC, ALU, PC,
@ -323,13 +332,11 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void PAGE_2()
{
PopulateCURINSTR(OP_PG_2);
}
private void PAGE_3()
{
PopulateCURINSTR(OP_PG_3);
}
@ -553,6 +560,29 @@ namespace BizHawk.Emulation.Common.Components.MC6809
SET_ADDR, ADDR, ALU, ALU2);
}
private void SWI2_3(ushort pick)
{
Regs[ADDR] = (ushort)((pick == 3) ? 0xFFF2 : 0xFFF4);
PopulateCURINSTR(SET_E,
DEC16, SP,
WR_DEC_LO, SP, PC,
WR_DEC_HI, SP, PC,
WR_DEC_LO, SP, US,
WR_DEC_HI, SP, US,
WR_DEC_LO, SP, Y,
WR_DEC_HI, SP, Y,
WR_DEC_LO, SP, X,
WR_DEC_HI, SP, X,
WR_DEC_LO, SP, DP,
WR_DEC_LO, SP, B,
WR_DEC_LO, SP, A,
WR, SP, CC,
IDLE,
RD_INC, ALU, ADDR,
RD_INC, ALU2, ADDR,
SET_ADDR, ADDR, ALU, ALU2);
}
private void CWAI_()
{
PopulateCURINSTR(RD_INC_OP, ALU, PC, ANDCC, ALU,
@ -572,101 +602,5 @@ namespace BizHawk.Emulation.Common.Components.MC6809
WR, SP, CC,
CWAI);
}
private void DEC_16(ushort src_l, ushort src_h)
{
}
private void ADD_16(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h)
{
}
private void STOP_()
{
}
private void JR_COND(bool cond)
{
}
private void JP_COND(bool cond)
{
}
private void RET_()
{
}
private void RETI_()
{
}
private void RET_COND(bool cond)
{
}
private void CALL_COND(bool cond)
{
}
private void INT_OP(ushort operation, ushort src)
{
}
private void BIT_OP(ushort operation, ushort bit, ushort src)
{
}
private void RST_(ushort n)
{
}
private void DI_()
{
}
private void EI_()
{
}
private void JP_HL()
{
}
private void ADD_SP()
{
}
private void LD_SP_HL()
{
}
private void LD_HL_SPn()
{
}
private void JAM_()
{
}
}
}