Example #1
0
        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);
        }
Example #2
0
        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;
            }
        }