void SetImmediate(int size, char register) { Modes currmode, newmode; if (size == 2) { newmode = Modes.Immediate; currmode = newmode | Modes.Absolute; } else { currmode = Modes.Immediate; newmode = currmode | Modes.Absolute; } var immediates = ActiveInstructions.Where(kvp => { if (kvp.Key.Mode == currmode) { if (kvp.Key.Mnem[2] == register) { return(true); } if (register == 'a' && (kvp.Value.CPU.Equals("6502") || kvp.Value.CPU.Equals("65C02"))) { return(kvp.Key.Mnem[2] != 'x' && kvp.Key.Mnem[2] != 'y'); } } return(false); }); var nonImmediates = ActiveInstructions.Except(immediates); ActiveInstructions = nonImmediates.Concat(immediates.ToDictionary(kvp => (kvp.Key.Mnem, newmode), kvp => new CpuInstruction(kvp.Value.CPU, kvp.Value.Opcode, size))) .ToDictionary(k => k.Key, k => k.Value); }
protected override void OnSetCpu() { switch (CPU) { case "65816": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02) .Concat(s_opcodesW65C02) .Concat(s_opcodes65816) .ToDictionary(k => k.Key, k => k.Value); break; case "HuC6280": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02.Where(o => (o.Value.Opcode & 0x0f) != 0x02)) .Concat(s_opcodesR65C02) .Concat(s_opcodesW65C02) .Concat(s_opcodesHuC6280) .ToDictionary(k => k.Key, k => k.Value); break; case "45GS02": case "m65": case "65CE02": ActiveInstructions = s_opcodes6502.Where(o => (o.Value.Opcode & 0x1f) != 0x10) // exclude 6502 branch instructions .Concat(s_opcodes65C02.Where(o => o.Value.Opcode != 0x80 && (o.Value.Opcode & 0x0f) != 0x02)) .Concat(s_opcodesR65C02) .Concat(s_opcodes65CE02) .ToDictionary(k => k.Key, k => k.Value); if (CPU[0] == '4') { ActiveInstructions = ActiveInstructions.Concat(s_opcodes45GS02).ToDictionary(k => k.Key, k => k.Value); } else if (CPU[0] != '6') { ActiveInstructions = ActiveInstructions.Where(o => !o.Key.Mnem.Equals("nop")) .Concat(s_opcodes45GS02) .Concat(s_opcodesm65) .ToDictionary(k => k.Key, k => k.Value); } break; case "R65C02": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02) .Concat(s_opcodesR65C02) .ToDictionary(k => k.Key, k => k.Value); break; case "65CS02": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02) .Concat(s_opcodesW65C02) .ToDictionary(k => k.Key, k => k.Value); break; case "W65C02": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02) .Concat(s_opcodesR65C02) .Concat(s_opcodesW65C02) .ToDictionary(k => k.Key, k => k.Value); break; case "65C02": ActiveInstructions = s_opcodes6502.Concat(s_opcodes65C02) .ToDictionary(k => k.Key, k => k.Value); break; case "6502i": ActiveInstructions = s_opcodes6502.Concat(s_opcodes6502i) .ToDictionary(k => k.Key, k => k.Value); break; default: ActiveInstructions = new Dictionary <(string Mnem, Modes mode), CpuInstruction>(s_opcodes6502); break; } }