示例#1
0
        /// <summary>
        /// The engine life cycle.
        /// </summary>
        private static async void EngineCycle()
        {
            // Invoke the start event.
            OnStart?.Invoke();

            while (AsciiRenderer.IsWindowOpen())
            {
                // Calculate the delta time.
                float deltaTime = SystemAPI.ElapsedSeconds - time;

                // Update the time.
                time = SystemAPI.ElapsedSeconds;

                // Invoke the update event.
                OnUpdate?.Invoke(deltaTime);

                // Invoke the render event.
                OnRender?.Invoke();

                // Render the buffer.
                AsciiRenderer.Render();

                // Wait for the frame to end.
                await Task.Delay(1000 / frameRate);
            }

            // Invoke the close event.
            OnClose?.Invoke();
        }
示例#2
0
        /// <summary>
        /// Update the memory in the console.
        /// </summary>
        public static void UpdateMemory(ushort programCounter, byte stackPointer, int currentPage, Mem memory)
        {
            int baseX = 1, baseY = 16;

            // Zero page:
            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    byte b = memory.Get(y * 16 + x);
                    AsciiRenderer.SetString(baseX + 1 + 2 * x, baseY + 2 + y, BM.ByteToHex(b),
                                            b == 0x00 ? very_dark_gray : white);
                }
            }

            int s_baseX = 40, s_baseY = 16;

            // Stack page:
            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    int  n = y * 16 + x;
                    byte b = memory.Get(256 + n);
                    AsciiRenderer.SetString(s_baseX + 1 + 2 * x, s_baseY + 2 + y, BM.ByteToHex(b),
                                            b == 0x00 ? very_dark_gray : white, n == stackPointer ? blue : black);
                }
            }

            int sc_baseX = 1, sc_baseY = 36;
            int pc = -1;

            if (programCounter >= currentPage * 256 && programCounter < currentPage * 256 + 256)
            {
                pc = programCounter - currentPage * 256;
            }

            AsciiRenderer.SetString(sc_baseX, sc_baseY, $"{PageNumberToName(currentPage)} (${BM.UShortToHex((ushort)(currentPage * 256))}-${BM.UShortToHex((ushort)(currentPage * 256 + 255))}):       ", gray);

            // Current page:
            for (int y = 0; y < 8; y++)
            {
                for (int x = 0; x < 32; x++)
                {
                    int  n = y * 32 + x;
                    byte b = memory.Get(currentPage * 256 + n);
                    AsciiRenderer.SetString(sc_baseX + 1 + 2 * x, sc_baseY + 2 + y, BM.ByteToHex(b),
                                            b == 0x00 ? very_dark_gray : white, pc == n ? blue : black);
                }
            }

            int pa_baseX = 40, pa_baseY = 10;

            // Programmed Addresses:
            for (int x = 0; x < 6; x++)
            {
                byte b = memory.Get((int)Mem.MAX_MEM - 6 + x);
                AsciiRenderer.SetString(pa_baseX + 1 + 3 * x, pa_baseY + 2, BM.ByteToHex(b), b == 0x00 ? dark_gray : white);
            }
        }
示例#3
0
        private static void DrawAsciiText()
        {
            var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt");

            var asciiRednerer = new AsciiRenderer(asciiProvider.GetAscii());

            asciiRednerer.Draw();
        }
示例#4
0
        /// <summary>
        /// Update the register values in the console.
        /// </summary>
        public static void UpdateRegisters(byte[] registers)
        {
            int baseX = 40, baseY = 6;

            AsciiRenderer.SetString(baseX + 3, baseY, BM.ByteToHex(registers[0]), (registers[0] == 0x00 ? dark_gray : white));
            AsciiRenderer.SetString(baseX + 9, baseY, BM.ByteToHex(registers[1]), (registers[1] == 0x00 ? dark_gray : white));
            AsciiRenderer.SetString(baseX + 15, baseY, BM.ByteToHex(registers[2]), (registers[2] == 0x00 ? dark_gray : white));
        }
示例#5
0
        /// <summary>
        /// Update the main processor values in the console.
        /// </summary>
        public static void UpdateMain(ushort programCounter, byte stackPointer, int cycles)
        {
            int baseX = 1, baseY = 4;

            AsciiRenderer.SetString(baseX + 4, baseY + 2, BM.UShortToHex(programCounter), (programCounter == 0xFFFC ? blue : white));
            AsciiRenderer.SetString(baseX + 13, baseY + 2, BM.ByteToHex(stackPointer), (stackPointer == 0x00 ? dark_gray : white));
            AsciiRenderer.SetString(baseX + 20, baseY + 2, cycles.ToString() + "   ", (cycles == 0 ? dark_gray : red));
        }
示例#6
0
        private static void DrawAsciiTextWithSlowMotion()
        {
            var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt");

            var asciiRenderer       = new AsciiRenderer(asciiProvider.GetAscii());
            var slowMotionDecorator = new AsciiSlowMotionDecorator(asciiRenderer);

            slowMotionDecorator.Draw();
        }
示例#7
0
        private static void DrawAsciiTextWithFrame()
        {
            var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt");

            var asciiRenderer  = new AsciiRenderer(asciiProvider.GetAscii());
            var frameDecorator = new AsciiFrameDecorator(asciiRenderer);

            frameDecorator.Draw();
        }
示例#8
0
        /// <summary>
        /// Setup the const parts of the console.
        /// </summary>
        public static void SetupConst()
        {
            AsciiRenderer.SetBackground(black);

            // Header:
            AsciiRenderer.SetString(1, 1, "MOS 6502", light_gray);

            // Main Info:
            int p_baseX = 1, p_baseY = 4;

            AsciiRenderer.SetString(p_baseX, p_baseY, "Processor:", gray);
            AsciiRenderer.SetString(p_baseX + 1, p_baseY + 2, "PC ----", light_gray);
            AsciiRenderer.SetString(p_baseX + 10, p_baseY + 2, "SP --", light_gray);
            AsciiRenderer.SetString(p_baseX + 17, p_baseY + 2, "CC 0", light_gray);

            // Registers:
            int r_baseX = 40, r_baseY = 4;

            AsciiRenderer.SetString(r_baseX, r_baseY, "Registers:", gray);
            AsciiRenderer.SetString(r_baseX + 1, r_baseY + 2, "A --", light_gray);
            AsciiRenderer.SetString(r_baseX + 7, r_baseY + 2, "X --", light_gray);
            AsciiRenderer.SetString(r_baseX + 13, r_baseY + 2, "Y --", light_gray);

            // Status Flags:
            int s_baseX = 1, s_baseY = 10;

            AsciiRenderer.SetString(s_baseX, s_baseY, "Processor Status:", gray);
            string flags = "CZIDBVN";

            for (int i = 0; i < flags.Length; i++)
            {
                AsciiRenderer.SetString(s_baseX + 1 + 5 * i, s_baseY + 2, $"{flags[i]} -", light_gray);
            }

            // Memory:
            int pa_baseX = 40, pa_baseY = 10;

            AsciiRenderer.SetString(pa_baseX, pa_baseY, "End Page ($FFFA-$FFFF):", gray);
            for (int x = 0; x < 6; x++)
            {
                AsciiRenderer.SetString(pa_baseX + 1 + 3 * x, pa_baseY + 2, "--", light_gray);
            }

            int zp_baseX = 1, zp_baseY = 16;

            AsciiRenderer.SetString(zp_baseX, zp_baseY, "Zero Page ($0000-$00FF):", gray);

            int st_baseX = 40, st_baseY = 16;

            AsciiRenderer.SetString(st_baseX, st_baseY, "Stack Page ($0100-$01FF):", gray);

            int sc_baseX = 1, sc_baseY = 36;

            AsciiRenderer.SetString(sc_baseX, sc_baseY, "Second Page ($0200-$02FF):", gray);
        }
示例#9
0
        /// <summary>
        /// Update the status flags in the console.
        /// </summary>
        public static void UpdateStatusFlags(bool[] statusFlags)
        {
            int baseX = 1, baseY = 10;

            for (int i = 0; i < statusFlags.Length; i++)
            {
                AsciiRenderer.SetChar(baseX + 3 + 5 * i, baseY + 2,
                                      (statusFlags[i] == true ? '1' : '0'),
                                      (statusFlags[i] == true ? green : red));
            }
        }
示例#10
0
        /// <summary>
        /// The input cycle.
        /// </summary>
        private static void InputCycle()
        {
            while (AsciiRenderer.IsWindowOpen())
            {
                // Wait until key is pressed.
                KeyPress press = Keyboard.WaitForKeyPress(true);

                // Convert byte to keycode.
                AsciiInput input = UserInput.FormatInput(press);

                // Invoke the key pressed event.
                OnKeyPressed?.Invoke(input);
            }
        }
示例#11
0
        static void Main(string[] args)
        {
            AsciiRenderer.Initialize(80, 50, "Processor");

            // Ascii engine events :
            SimManager gameManager = new SimManager();

            AsciiEngine.OnStart      += gameManager.Start;
            AsciiEngine.OnUpdate     += gameManager.Update;
            AsciiEngine.OnKeyPressed += gameManager.KeyPressed;
            AsciiEngine.OnRender     += gameManager.Render;

            //AsciiEngine.OnStart += () =>
            //{
            //    Random rand = new Random();

            //    AsciiRenderer.SetBackground(AsciiColor.FromRGB(24, 20, 37));

            //    for (int y = 0; y < 50; y++)
            //    {
            //        for (int x = 0; x < 80; x++)
            //        {
            //            int r = rand.Next(0, 16);
            //            char c = ' ';

            //            c = r switch
            //            {
            //                10 => 'A',
            //                11 => 'B',
            //                12 => 'C',
            //                13 => 'D',
            //                14 => 'E',
            //                15 => 'F',
            //                _ => ("" + r)[0],
            //            };

            //            int r2 = rand.Next(-15, 5);
            //            AsciiRenderer.SetChar(x, y, c, AsciiColor.FromRGB((byte)(38 + r2), (byte)(43 + r2), (byte)(68 + r2)));
            //        }
            //    }
            //};

            AsciiEngine.Initialize(60);
        }
示例#12
0
        public static void Main(string[] args)
        {
            var bitManipulator = new BitManipulator();
            var myBits         = bitManipulator.StringToBits(Resources.BigLebowskiQuote);

            Console.WriteLine($"Length of string in bits: {myBits.Count}");

            var audioStream = new MemoryStream();

            var binaryFskAnalyzerSettings = new Bell103BinaryFskAnalyzerSettings();

            var audioGenerator    = new AudioGenerator(audioStream);
            var fskAudioGenerator = new FskAudioGenerator(audioGenerator);

            fskAudioGenerator.GenerateAudio(binaryFskAnalyzerSettings.BaudRate,
                                            binaryFskAnalyzerSettings.SpaceFrequency, binaryFskAnalyzerSettings.MarkFrequency, myBits);

            var audioLengthInMicroseconds = (int)(myBits.Count * Math.Pow(10, 6) / binaryFskAnalyzerSettings.BaudRate);

            Console.WriteLine($"Length of audio in seconds: {audioLengthInMicroseconds / Math.Pow(10, 6):N1}");
            Console.WriteLine();

            Console.WriteLine(Resources.BigLebowskiQuote);
            Console.WriteLine();

            AudioAnalyzer.Play(audioStream, audioLengthInMicroseconds / 1000);

            audioGenerator    = new AudioGenerator(audioStream);
            fskAudioGenerator = new FskAudioGenerator(audioGenerator);
            fskAudioGenerator.GenerateAudio(binaryFskAnalyzerSettings.BaudRate,
                                            binaryFskAnalyzerSettings.SpaceFrequency, binaryFskAnalyzerSettings.MarkFrequency, myBits);

            var binaryFskAnalyzer = new BinaryFskAnalyzer(new AudioAnalyzer(audioStream, audioGenerator), new ZeroCrossingsFrequencyDetector(), binaryFskAnalyzerSettings);

            Console.WriteLine($"Window position start {binaryFskAnalyzerSettings.WindowPositionStartMicroseconds:N3} us, window position end {binaryFskAnalyzerSettings.WindowPositionEndMicroseconds:N3} us, window position increment {binaryFskAnalyzerSettings.WindowPositionIncrementMicroseconds:N3} us");
            Console.WriteLine($"Window length start {binaryFskAnalyzerSettings.WindowLengthStartMicroseconds:N3} us, window length end {binaryFskAnalyzerSettings.WindowLengthEndMicroseconds:N3} us, window length increment {binaryFskAnalyzerSettings.WindowLengthIncrementMicroseconds:N3} us");
            Console.WriteLine();

            var result = binaryFskAnalyzer.AnalyzeSignal();
            var bits   = new List <bool>();

            foreach (var frame in result.AnalysisFrames)
            {
                if (frame.Bit.HasValue == true)
                {
                    bits.Add(frame.Bit.Value);
                }
            }

            Console.WriteLine("Rendering bytes");
            Console.WriteLine();
            var renderer = (IRenderer) new RowRenderer();

            renderer.Render(BitManipulator.BitsToBytes(bits));
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Rendering ASCII");
            Console.WriteLine();
            renderer = new AsciiRenderer();
            renderer.Render(BitManipulator.BitsToBytes(bits));
            Console.WriteLine();

            Console.WriteLine("Done");
            Console.ReadLine();
        }