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)); }
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; } }
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"); } }