private static Emulator Boot() { var ppuRegs = new PPURegisters(); var memoryBus = new MemoryBus(ppuRegs) { IsBootRomMapped = useBootRom }; //memoryBus.Attach(new GameLinkConsole()); var ppu = new PPU(ppuRegs, memoryBus); ppu.Boot(); var cpu = new CPU(new Registers(), memoryBus); if (!useBootRom) { cpu.BootWithoutBootRom(); } var rom = Cartridge.LoadFrom(romPath); memoryBus.Load(rom); var joypad = new Joypad(memoryBus.JoypadRegister); return(new Emulator(cpu, ppu, joypad)); }
public void When_there_are_multiple_buses() { var oneFirst = 0; var oneSecond = 0; var twoFirst = 0; var twoSecond = 0; var bus1 = new MemoryBus(); bus1.Add("first", x => oneFirst++); bus1.Add("second", x => oneSecond++); var bus2 = new MemoryBus(); bus2.Add("first", x => twoFirst++); bus2.Add("second", x => twoSecond++); var exchange = new MemoryExchange(); exchange.Add(bus1); exchange.Add(bus2); bus1.Publish("first", new MemoryProps { RoutingKey = "first" }); oneFirst.ShouldBe(1); twoFirst.ShouldBe(1); oneSecond.ShouldBe(0); twoSecond.ShouldBe(0); }
static void Main(string[] args) { Console.Title = string.Format("M68K, {0} opcodes", Enum.GetNames(typeof(Opcode)).Length); Processor = new CPU(); MemoryBus Bus = new MemoryBus(); Bus.SetDefaultDevice(new RAM(64000)); Bus.Attach(0, ROM.FromFile("program.bin")); Processor.Memory = Bus; Processor.DA[CPU.SP] = 0xF00F; // setup stack pointer while (true) { Console.ForegroundColor = ConsoleColor.White; Console.Write("(M68K)>> "); Console.ResetColor(); string In = Console.ReadLine(); string RawIn = In; if (!string.IsNullOrWhiteSpace(In)) { while (In.Contains(" ")) { In = In.Replace(" ", " "); } Exec(RawIn, In.ToLower().Split(' ')); } } }
public AltoSystem() { _scheduler = new Scheduler(); _memBus = new MemoryBus(); _mem = new Memory.Memory(); _keyboard = new Keyboard(); _diskController = new DiskController(this); _displayController = new DisplayController(this); _mouseAndKeyset = new MouseAndKeyset(); _ethernetController = new EthernetController(this); _orbitController = new OrbitController(this); _audioDAC = new AudioDAC(this); _organKeyboard = new OrganKeyboard(this); _tridentController = new TridentController(this); _cpu = new AltoCPU(this); // Attach memory-mapped devices to the bus _memBus.AddDevice(_mem); _memBus.AddDevice(_keyboard); _memBus.AddDevice(_mouseAndKeyset); _memBus.AddDevice(_audioDAC); _memBus.AddDevice(_organKeyboard); Reset(); }
public static RegisterFile Out(RegisterFile registerFile, byte A, byte r, MemoryBus memoryBus) { // I/O Addresses are offset 0x20 on the memory bus. memoryBus.Store((ushort)(A + 0x20), registerFile[r]); return(registerFile); }
protected Node(NodeInfo identity, NodeConfiguration config) { Logger = config.LoggerDelegate; SeedNode = config.SeedNode; SuccessorCount = config.SuccessorCount; Serializer = config.Serializer; Marshaller = new NodeMarshaller(Serializer, config.HashingService); MessageBus = new MemoryBus(); // We can change the publishing strategy factory so we can log everything... InitHandlers(); Identity = identity; Successor = identity; Predecessor = null; SocketFactory = config.NodeSocketFactory; HashingService = config.HashingService; CorrelationFactory = config.CorrelationFactory; Clock = config.Clock; Janitor = new DisposableStack(); Poller = Janitor.Push(new NetMQPoller()); InitTimer = CreateInitTimer(); ListeningSocket = Janitor.Push(SocketFactory.CreateBindingSocket(Identity.HostAndPort)); InitListeningSocket(); ForwardingSockets = Janitor.Push(new SocketCache(SocketFactory, Clock)); Actor = Janitor.Push(CreateActor()); InitTimer.Elapsed += (sender, args) => { Publish(new NodeReady(Identity.RoutingHash)); }; FingerTable = new FingerTable(Identity, Identity.RoutingHash.BitCount); SuccessorTable = new SuccessorTable(Identity, config.SuccessorCount); }
public void GivenBus_SubscribedPublishers_ShouldNotGetNotificationAfterUnsubscribe() { var mockHandler1 = new Mock <IBusHandler>(); var mockHandler2 = new Mock <IBusHandler>(); var providerMock = new Mock <IBusHandlerProvider>(); providerMock.Setup(p => p.GetHandlers()).Returns(new[] { mockHandler1.Object, mockHandler2.Object }); mockHandler1.Setup(h => h.CanHandleMessage(It.IsAny <BusMessage>())).Returns(true); mockHandler2.Setup(h => h.CanHandleMessage(It.IsAny <BusMessage>())).Returns(true); var bus = new MemoryBus(providerMock.Object); var subscription = bus.Subscribe("TestNotification", (context, message) => mockHandler1.Object.HandleMessage(context, message)); bus.Unsubscribe(subscription); var busMessage = new BusEvent { Payload = new { prop1 = "test prop 1" } }; bus.Publish("TestNotification", busMessage); mockHandler1.Verify(h => h.HandleMessage(It.Is <BusContext>(bc => bc != null), It.Is <BusMessage>(bm => bm.Payload != null)), Times.Never()); mockHandler2.Verify(h => h.HandleMessage(It.Is <BusContext>(bc => bc != null), It.Is <BusMessage>(bm => bm.Payload != null)), Times.Never()); }
public static RegisterFile Std(RegisterFile registerFile, byte r, byte q, MemoryBus memoryBus, object[] arguments) { var register = (byte)arguments[0]; memoryBus.Store((ushort)(registerFile.GetWide(register) + q), registerFile[r]); return(registerFile); }
/// <summary> /// Constructor /// </summary> public RAM(ThreadFlagWrapper flag, Clock clk, MemoryBus memoryBus) { threadFlagWrapper = flag; clock = clk; memBus = memoryBus; InitializeRam(); InitialaizeThreads(); }
public Cpu Build() { MemoryBus bus = new MemoryBus(m_Peripherals.Concat(m_ApiDevs)); Cpu cpu = new Cpu(bus, m_ResetAddr, m_InterruptAddr); m_ApiDevs.ForEach(x => x.SetCpu(cpu)); return(cpu); }
public CacheController(string coreId, int coreNum, CCAction ccAct, CCInterconection ccInt, ThreadFlagWrapper flag, Clock clk, MemoryBus bus) { CORENAME = coreId; CORENUMBER = coreNum; ccAction = ccAct; ccInter = ccInt; threadFlag = flag; clock = clk; memBus = bus; InitializeThreads(); }
private static void Start(string romPath) { var ppuRegs = new PPURegisters(); var memoryBus = new MemoryBus(ppuRegs); ppu = new PPU(ppuRegs, memoryBus); cpu = new CPU(new Registers(), memoryBus); cpu.BootWithoutBootRom(); var rom = Cartridge.LoadFrom(romPath); memoryBus.Load(rom); }
public void Expose_Rom_Bank_One_From_0x4000_To_0x7FFF() { var romData = Enumerable.Repeat(marker, Cartridge.RomBankSize * 2); var rom = new Cartridge(romData.ToArray()); var memoryBus = new MemoryBus(ppuRegisters: null); memoryBus.Load(rom); for (int i = Cartridge.RomBankSize; i < Cartridge.RomBankSize * 2; i++) { Assert.AreEqual(marker, memoryBus[i]); } }
public void Expose_Read_Writable_Work_Ram_From_0xC000_To_0xDFFF() { var memoryBus = new MemoryBus(ppuRegisters: null); for (int i = 0xC000; i <= 0xDFFF; i++) { memoryBus[i] = marker; } for (int i = 0xC000; i <= 0xDFFF; i++) { Assert.AreEqual(marker, memoryBus[i]); } }
public void Expose_Read_Writable_Zero_Page_From_0xFF80_To_0xFFFE() { var memoryBus = new MemoryBus(ppuRegisters: null); for (int i = 0xFF80; i < 0xFFFF; i++) { memoryBus[i] = marker; } for (int i = 0xFF80; i < 0xFFFF; i++) { Assert.AreEqual(marker, memoryBus[i]); } }
public void Expose_Echo_Ram_From_0xE000_To_0xFDFF() { var memoryBus = new MemoryBus(ppuRegisters: null); //values written to work RAM at $C000 - $DFFF are repeated in the "echo RAM" range for (int i = 0xC000; i <= 0xDFFF; i++) { memoryBus[i] = marker; } for (int i = 0xE000; i <= 0xFDFF; i++) { Assert.AreEqual(marker, memoryBus[i]); } }
public void Expose_Rom_Bank_Zero_From_0x0000_To_0x3FFF() { var romData = Enumerable.Repeat(marker, Cartridge.RomBankSize); var rom = new Cartridge(romData.ToArray()); var memoryBus = new MemoryBus(ppuRegisters: null) { IsBootRomMapped = false }; memoryBus.Load(rom); for (int i = 0; i < Cartridge.RomBankSize; i++) { Assert.AreEqual(marker, memoryBus[i]); } }
protected Node(NodeInfo identity, NodeConfiguration config) { Config = config; Identity = identity; Predecessor = Identity; Clock = Config.Clock; CorrelationFactory = Config.CorrelationFactory; Janitor = new DisposableStack(); MessageBus = new MemoryBus(); Poller = Janitor.Push(new NetMQPoller()); Logger = Config.LoggerDelegate; Marshaller = Config.MarshallerFactory.Create(); ExpiryCalculator = Config.ExpiryCalculator; Log($"Binding to {Config.NodeSocketFactory.BindingConnectionString(Identity.HostAndPort)}"); ListeningSocket = Janitor.Push(Config.NodeSocketFactory.CreateBindingSocket(Identity.HostAndPort)); ForwardingSockets = Janitor.Push(new SocketCache(Config.NodeSocketFactory, Clock)); // Chicken and egg scenario where we require an actor! CommunicationManager = config.CommunicationManagerFactory.Create(Identity, Marshaller, ForwardingSockets, MessageBus, Log); Actor = Janitor.Push(CreateActor()); ForwardingSockets.AddActor(Identity.HostAndPort, Actor); Janitor.Push(new DisposableAction(() => { Poller.Remove(ListeningSocket); })); Janitor.Push(new DisposableAction( () => { ListeningSocket.ReceiveReady += ListeningSocketReceiveReady; }, () => { ListeningSocket.ReceiveReady -= ListeningSocketReceiveReady; })); ActionScheduler = Janitor.Push(new NodeActionScheduler(Clock, Config.ActionTimerFactory.Create(), Marshaller, Actor)); MessageBus.Subscribe(new NodeHandler(this, ActionScheduler)); var awaitHandler = Janitor.Push(new AwaitAckHandler(ActionScheduler, ExpiryCalculator, Marshaller, Actor, Log, Config.AwaitSettings)); MessageBus.Subscribe(awaitHandler); MessageBus.Subscribe(new JoinNetworkHandler(this, CommunicationManager)); MessageBus.Subscribe(new StabilizeHandler(this, CommunicationManager)); MessageBus.Subscribe(new RectifyHandler(this, CommunicationManager)); MessageBus.Subscribe(new NotifyHandler(this, CommunicationManager)); FingerTable = new FingerTable(Identity, Identity.RoutingHash.BitCount); SuccessorTable = new SuccessorTable(Identity, Config.SuccessorCount); // Let everything know we're ready to go. CommunicationManager.SendInternal(new NodeInitialised()); }
public void Generate_Blank_Window_Pixels_When_Window_Drawing_Is_Disabled() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "links_awakening_you_are_on_koholint_island.vram.dump")); var regs = new PPURegisters(lcdc: 0xD7); //LCDC bit 5 = 0 => window is disabled var memBus = new MemoryBus(regs) { VideoMemory = vram }; var ppu = new PPU(regs, memBus); Assert.IsFalse(ppu.Registers.LCDControl.WindowDisplayEnabled); var actualPixels = ppu.RenderWindow(); var expectedPixels = new byte[TileMap.WidthInPixels * TileMap.HeightInPixels]; AssertPixelsMatch(expectedPixels, actualPixels, width: 256); }
public void Generate_Expected_Window_Pixels_From_Known_VRAM_Dump_Using_Signed_Tile_Numbers() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "links_awakening_you_are_on_koholint_island.vram.dump")); var regs = new PPURegisters(lcdc: 0xE7, bgPalette: 0xE4); var memBus = new MemoryBus(regs) { VideoMemory = vram }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); var actualPixels = ppu.RenderWindow(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "links_awakening_you_are_on_koholint_island_expected_window.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: 256); }
public void Generate_Expected_Tileset_Pixels_From_Known_VRAM_Dump() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "tetris.tileset.dump")); var regs = new PPURegisters(); var memBus = new MemoryBus(regs) { VideoMemory = vram }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); var actualPixels = ppu.RenderTileSet(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "tetris.tileset.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: TileSet.WidthInPixels); }
public void Generate_Expected_Background_Map_Pixels_From_Known_VRAM_Dump_Using_Unsigned_Tile_Numbers() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "tetris_title_screen.vram.dump")); var regs = new PPURegisters(lcdc: 0xD3, bgPalette: 0xE4); var memBus = new MemoryBus(regs) { VideoMemory = vram }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); var actualPixels = ppu.RenderBackgroundMap(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "tetris_title_screen_expected_bgmap.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: 256); }
public void Generate_Blank_Background_Map_Pixels_When_Background_Map_Drawing_Is_Disabled() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "pokemon_reds_room.vram.dump")); var regs = new PPURegisters(lcdc: 0xE0); //LCDC bit 0 = 0 => background is disabled var memBus = new MemoryBus(regs) { VideoMemory = vram }; var ppu = new PPU(regs, memBus); Assert.IsFalse(ppu.Registers.LCDControl.BackgroundDisplayEnabled); var actualPixels = ppu.RenderBackgroundMap(); var expectedPixels = new byte[TileMap.WidthInPixels * TileMap.HeightInPixels]; AssertPixelsMatch(expectedPixels, actualPixels, width: 256); }
public void Generate_Blank_Sprite_Pixels_When_Sprite_Drawing_Is_Disabled() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "pokemon_reds_room.vram.dump")); var oam = Memory.FromFile(Path.Combine("PPU", "Input", "pokemon_reds_room.oam.dump")); var regs = new PPURegisters(lcdc: 0xE3, spritePalette0: 0xE4, spritePalette1: 0xE4); var memBus = new MemoryBus(regs) { VideoMemory = vram, ObjectAttributeMemory = oam }; var ppu = new PPU(regs, memBus); ppu.Registers.LCDControl.SpriteDisplayEnabled = false; var actualPixels = ppu.RenderSprites(); var expectedPixels = new byte[PPU.ScreenWidthInPixels * PPU.ScreenHeightInPixels]; AssertPixelsMatch(expectedPixels, actualPixels, width: PPU.ScreenWidthInPixels); }
public void Generate_Expected_Sprite_Pixels_From_Known_VRAM_And_OAM_Dumps() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "tetris_title_screen.vram.dump")); var oam = Memory.FromFile(Path.Combine("PPU", "Input", "tetris_title_screen.oam.dump")); var regs = new PPURegisters(lcdc: 0xD3, spritePalette0: 0xFF, spritePalette1: 0xFF); var memBus = new MemoryBus(regs) { VideoMemory = vram, ObjectAttributeMemory = oam }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); ppu.Sprites.UpdateFrom(oam); var actualPixels = ppu.RenderSprites(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "tetris_title_screen_expected_sprites.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: PPU.ScreenWidthInPixels); }
public static Cpu Create( IEnumerable <string> args, CpuSettings cpuSettings = null, RunnerSettings settings = null, HlCompilerSettings hls = null, MemorySettings ms = null, MemoryBusSettings mbs = null) { Logger.LogMessage(LoggerSystems.Console, "Creating CPU..."); cpuSettings = cpuSettings ?? SettingsManager.GetSettings <CpuSettings>(); settings = settings ?? new RunnerSettings(); hls = hls ?? SettingsManager.GetSettings <HlCompilerSettings>(); ms = ms ?? SettingsManager.GetSettings <MemorySettings>(); mbs = mbs ?? SettingsManager.GetSettings <MemoryBusSettings>(); ArgumentSyntaxParser.Parse( args.ToArray(), settings, hls, ms, mbs, cpuSettings ); SettingsManager.SaveSettings(hls); SettingsManager.SaveSettings(ms); SettingsManager.SaveSettings(mbs); SettingsManager.SaveSettings(cpuSettings); if (settings.InputFiles == null) { Logger.LogMessage(LoggerSystems.Console, "No Files Specified"); return(null); } MemoryBus bus = CreateBus(mbs); Cpu cpu = new Cpu(bus, cpuSettings.CpuResetAddr, cpuSettings.CpuIntAddr); return(cpu); }
public void Generate_Expected_Screen_Pixels_From_Known_Memory_Dump_When_Sprite_Drawing_Is_Disabled_But_Background_Drawing_Is_Enabled() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "pokemon_reds_room.vram.dump")); var oam = Memory.FromFile(Path.Combine("PPU", "Input", "pokemon_reds_room.oam.dump")); //magic numbers in PPU registers collected from bgb at the point the above memory dumps were captured var regs = new PPURegisters(lcdc: 0xE3, scrollY: 0xD0, windowX: 0x07, windowY: 0x90, bgPalette: 0xE4, spritePalette0: 0xD0, spritePalette1: 0xE0); var memBus = new MemoryBus(regs) { VideoMemory = vram, ObjectAttributeMemory = oam }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); ppu.Registers.LCDControl.SpriteDisplayEnabled = false; var actualPixels = ppu.ForceRenderScreen(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "pokemon_reds_room_expected_screen_wo_sprites.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: PPU.ScreenWidthInPixels); }
public void Generate_Expected_Screen_Pixels_From_Known_VRAM_And_OAM_Dumps_With_Background_And_8_x_16_Sprites_And_Window() { var vram = Memory.FromFile(Path.Combine("PPU", "Input", "links_awakening_you_are_on_koholint_island.vram.dump")); var oam = Memory.FromFile(Path.Combine("PPU", "Input", "links_awakening_you_are_on_koholint_island.oam.dump")); //magic numbers in PPU registers collected from bgb at the point the above memory dumps were captured var regs = new PPURegisters(lcdc: 0xE7, windowX: 0x06, windowY: 0x80, bgPalette: 0xE4, spritePalette0: 0x1C, spritePalette1: 0xE4); var memBus = new MemoryBus(regs) { VideoMemory = vram, ObjectAttributeMemory = oam }; var ppu = new PPU(regs, memBus); ppu.TileSet.UpdateFrom(vram); ppu.Sprites.UpdateFrom(oam); var actualPixels = ppu.ForceRenderScreen(); var expectedPixels = ImageHelper.LoadImageAsPaletteIndexedByteArray(Path.Combine("PPU", "Expected", "links_awakening_you_are_on_koholint_island_expected_screen.png")); AssertPixelsMatch(expectedPixels, actualPixels, width: PPU.ScreenWidthInPixels); }
protected static void RunTestRom(string romPath) { var outputStream = new MemoryStream(); var gameLinkConsole = new GameLinkConsole(outputStream); var memoryBus = new MemoryBus(new PPURegisters()) { IsBootRomMapped = false }; memoryBus.Attach(gameLinkConsole); memoryBus.Load(Cartridge.LoadFrom(romPath)); var cpu = new CPU(new Registers(), memoryBus); cpu.BootWithoutBootRom(); //no PPU => can't run boot ROM (it will hang waiting for blank) while (cpu.TotalElapsedCycles <= maxCycles) { cpu.Tick(); if (gameLinkConsole.HasFreshUpdate) { string output = Encoding.ASCII.GetString(outputStream.ToArray()); if (output.Contains("Failed")) { Console.WriteLine(output); Assert.Fail($"Test ROM {Path.GetFileName(romPath)} failed, see output for more details."); } else if (output.Contains("Passed")) { Console.WriteLine(output); return; } gameLinkConsole.HasFreshUpdate = false; } } Assert.Inconclusive($"Test ROM {Path.GetFileName(romPath)} did not pass, but did not report failure. (Does it need to run longer?)"); }
public static RegisterFile St(RegisterFile registerFile, byte r, MemoryBus memoryBus, object[] arguments) { var register = (byte)arguments[0]; var change = (int)arguments[1]; var preDecrement = change == -1; var postIncrement = change == 1; if (preDecrement) { registerFile = registerFile.WithWide(register, v => (ushort)(v - 1)); } memoryBus.Store(registerFile.GetWide(register), r); if (postIncrement) { registerFile = registerFile.WithWide(register, v => (ushort)(v + 1)); } return(registerFile); }
public BusDispatcher(MemoryBus bus) { _bus = bus; }