MC6809; finish instruction decoding
This commit is contained in:
parent
8995e2e977
commit
87214c252d
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
|
||||
namespace BizHawk.Emulation.Common.Components.MC6809
|
||||
|
|
|
@ -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_()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue