private void OpenROM(object sender, EventArgs e) { // Show the dialog and get result. DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) // Test result. { string path = openFileDialog1.FileName; rom ROM = new rom(); cpu CPU = new cpu(); ram RAM = new ram(); byte[] ROMByte = File.ReadAllBytes(path); int num1 = 0x8000; int num2 = 0xc000; ROM.Init(ROMByte, RAM); RAM.Init(); Buffer.BlockCopy(ROM.ROMBytes, 0x10, RAM.Memory, num1, 0x4000); if (ROM.NumOfPRGBlocks == 1) { Buffer.BlockCopy(ROM.ROMBytes, 0x10, RAM.Memory, num2, 0x4000); } Debug.WriteLine(RAM.Memory[0x8000]); Debug.WriteLine(RAM.Memory[0xC5F5]); CPU.PowerUp(); CPU.RunROM(ROM, RAM); } Console.WriteLine(result); // <-- For debugging use. }
public void Init(byte[] ROMData, ram RAMvar) { RAM = RAMvar; NumOfPRGBlocks = ROMData[4]; NumOfCHRBlocks = ROMData[5]; ROMBytes = ROMData; PRGBytes = ROMData.Skip(16).Take(KBSize * NumOfPRGBlocks).ToArray(); }
public MainForm() { Debug.WriteLine("hello world"); // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // //TODO: Unhardcode path. //string path = @"C:\Users\510628\Desktop\SharpDevelop\Projects\NesCom\ROms\Earthbound_Zero_(P)_(H).nes"; //string path = @"C:\Users\510628\Desktop\SharpDevelop\Projects\NesCom\ROms\Super Mario Bros (E).nes"; //string path = @"C:\Users\510628\Desktop\SharpDevelop\Projects\NesCom\ROms\sample.nes"; string path = @"C:\Users\510628\Desktop\SharpDevelop\Projects\NesCom\ROms\nestest.nes"; rom ROM = new rom(); cpu CPU = new cpu(); ram RAM = new ram(); byte[] ROMByte = File.ReadAllBytes(path); int num1 = 0x8000; int num2 = 0xc000; ROM.Init(ROMByte, RAM); RAM.Init(); Buffer.BlockCopy(ROM.ROMBytes, 0x10, RAM.Memory, num1, 0x4000); if (ROM.NumOfPRGBlocks == 1) { Buffer.BlockCopy(ROM.ROMBytes, 0x10, RAM.Memory, num2, 0x4000); } Debug.WriteLine(RAM.Memory[0x8000]); Debug.WriteLine(RAM.Memory[0xC5F5]); CPU.PowerUp(); CPU.RunROM(ROM, RAM); }
public void RunROM(rom SelfROM, ram SelfRAM) { //Load ROM ROM = SelfROM; RAM = SelfRAM; PC_Register = 0x8000; //Run ROM IsRunning = true; byte CurrentByte; while (IsRunning) { //Get byte at Program Counter CurrentByte = ROM.GetByte(PC_Register); //Turn Byte into Instruction switch (CurrentByte) { case 0x0: BRKInstruction(CurrentByte); break; case 0x10: BPLInstruction(CurrentByte); break; case 0x18: CLCInstruction(CurrentByte); break; case 0x20: JSRInstruction(CurrentByte); break; case 0x24: BITZePgInstruction(CurrentByte); break; case 0x30: BMIInstruction(CurrentByte); break; case 0x38: SECInstruction(CurrentByte); break; case 0x45: EORZePgInstruction(CurrentByte); break; case 0x4C: JMPAbsInstruction(CurrentByte); break; case 0x50: BVCInstruction(CurrentByte); break; case 0x58: CLIInstruction(CurrentByte); break; case 0x60: RTSInstruction(CurrentByte); break; case 0x69: ADCImmInstruction(CurrentByte); break; case 0x70: BVSInstruction(CurrentByte); break; case 0x78: SEIInstruction(CurrentByte); break; case 0x85: StaZePgInstruction(CurrentByte); break; case 0x86: StxZePgInstruction(CurrentByte); break; case 0x8D: StaAbsInstruction(CurrentByte); break; case 0x8E: StxAbsInstruction(CurrentByte); break; case 0x90: BCCInstruction(CurrentByte); break; case 0x9A: TXSInstruction(CurrentByte); break; case 0xA0: LDYImmInstruction(CurrentByte); break; case 0xA2: LDXImmInstruction(CurrentByte); break; case 0xA5: LdaZePgInstruction(CurrentByte); break; case 0xA9: LDAImmInstruction(CurrentByte); break; case 0xAA: TAXInstruction(CurrentByte); break; case 0xAD: LdaAbsInstruction(CurrentByte); break; case 0xB0: BCSInstruction(CurrentByte); break; case 0xB8: CLVInstruction(CurrentByte); break; case 0xBD: LdaAbsXInstruction(CurrentByte); break; case 0xC0: CPYImmInstruction(CurrentByte); break; case 0xC9: CMPImmInstruction(CurrentByte); break; case 0xCA: DEXInstruction(CurrentByte); break; case 0xE0: CPXImmInstruction(CurrentByte); break; case 0xEA: NOPInstruction(CurrentByte); break; case 0xED: INXInstruction(CurrentByte); break; case 0xD0: BNEInstruction(CurrentByte); break; case 0xD8: CLDInstruction(CurrentByte); break; case 0xF0: BEQInstruction(CurrentByte); break; case 0xF8: SEDInstruction(CurrentByte); break; default: Debug.WriteLine("OpCode not implemented!!!"); throw new NotImplementedException("OpCode not implemented!!!"); } PC_Register += InstructionLength; Debug.WriteLine("PC Register: " + PC_Register.ToString("X")); } }