Example #1
0
        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));
        }
Example #2
0
        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);
        }
Example #3
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(' '));
                }
            }
        }
Example #4
0
        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();
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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());
        }
Example #8
0
        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);
        }
Example #9
0
 /// <summary>
 /// Constructor
 /// </summary>
 public RAM(ThreadFlagWrapper flag, Clock clk, MemoryBus memoryBus)
 {
     threadFlagWrapper = flag;
     clock             = clk;
     memBus            = memoryBus;
     InitializeRam();
     InitialaizeThreads();
 }
Example #10
0
        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();
 }
Example #12
0
        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);
        }
Example #13
0
        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]);
            }
        }
Example #14
0
        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]);
            }
        }
Example #15
0
        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]);
            }
        }
Example #16
0
        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]);
            }
        }
Example #17
0
        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]);
            }
        }
Example #18
0
        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());
        }
Example #19
0
        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);
        }
Example #20
0
        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);
        }
Example #21
0
        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);
        }
Example #22
0
        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);
        }
Example #23
0
        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);
        }
Example #24
0
        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);
        }
Example #25
0
        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);
        }
Example #26
0
        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);
        }
Example #27
0
        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);
        }
Example #28
0
        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);
        }
Example #29
0
        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?)");
        }
Example #30
0
        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;
 }