예제 #1
0
        static void Main(string[] args)
        {
            MEM memory = new MEM();
            CPU cpu    = new CPU(memory);

            memory.setMem(0xFFFC, 0x00);             //reset vector
            memory.setMem(0xFFFD, 0x00);

            memory.setMem(0x0000, 0xA9);            // LDA 0x05
            memory.setMem(0x0001, 0x05);
            memory.setMem(0x0002, 0xEA);            //NOP
            memory.setMem(0x0003, 0x85);            // STA 0x00FF
            memory.setMem(0x0004, 0x00);
            memory.setMem(0x0005, 0xFF);
            memory.setMem(0x0006, 0xE6);            // INC 0x00FF
            memory.setMem(0x0007, 0x00);
            memory.setMem(0x0008, 0xFF);

            memory.setMem(0x0009, 0x00);             // BRK

            cpu.reset();
            while (!cpu.B)
            {
                cpu.tick();
                cycles++;
            }
            printFirstChunk(memory);
            Console.WriteLine("\nPC is at " + cpu.PC);
            Console.WriteLine("Was runnig for " + cycles + " cycles");
            Console.WriteLine("Result is " + memory.getMem(0x00FF));
        }
예제 #2
0
        public static void execute(CPU cpu, MEM memory)
        {
            switch (memory.getMem(cpu.PC))
            {
            case 0xA9:
            case 0xA5:
            case 0xB5:
            case 0xAD:
            case 0xBD:
            case 0xB9:
            case 0xA1:
            case 0xB1:
                LS_Operations.LDA.execute(cpu, memory);
                return;

            case 0x85:
            case 0x95:
            case 0x8D:
            case 0x9D:
            case 0x99:
            case 0x81:
            case 0x91:
                LS_Operations.STA.execute(cpu, memory);
                return;

            case 0xE6:
            case 0xEE:
            case 0xF6:
            case 0xFE:
                Inc_Dec.INC.execute(cpu, memory);
                break;

            case 0x4C:
            case 0x6C:
                Jmp_Calls.JMP.execute(cpu, memory);
                break;

            case 0xEA:
                System_Functions.NOP.execute(cpu, memory);
                return;

            case 0x00:
                System_Functions.BRK.execute(cpu, memory);
                return;

            default:
                Console.WriteLine("Unkown Instruction on {0:X4}, Opcode {1:X2}", cpu.PC, memory.getMem(cpu.PC));
                System_Functions.NOP.execute(cpu, memory);
                return;
            }
        }
예제 #3
0
        private static void printFirstChunk(MEM memory)
        {
            Console.WriteLine("First 256 bytes of memory\n");
            int limit = 0x00FF + 1;

            Console.WriteLine("      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
            Console.WriteLine("      -----------------------------------------------");
            for (int i = 0; i < limit / 16; i++)               //pocet riadkov
            {
                Console.Write("{0:X4}: ", i * 16);
                for (int j = 0; j < 16; j++)                   //riadok
                {
                    Console.Write("{0:X2} ", memory.getMem((ushort)((i * 16) + j)));
                }
                Console.Write("\n");
            }
        }