/// <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(); }
/// <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); } }
private static void DrawAsciiText() { var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt"); var asciiRednerer = new AsciiRenderer(asciiProvider.GetAscii()); asciiRednerer.Draw(); }
/// <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)); }
/// <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)); }
private static void DrawAsciiTextWithSlowMotion() { var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt"); var asciiRenderer = new AsciiRenderer(asciiProvider.GetAscii()); var slowMotionDecorator = new AsciiSlowMotionDecorator(asciiRenderer); slowMotionDecorator.Draw(); }
private static void DrawAsciiTextWithFrame() { var asciiProvider = new FileAsciiProvider("AsciiIcons/Text.txt"); var asciiRenderer = new AsciiRenderer(asciiProvider.GetAscii()); var frameDecorator = new AsciiFrameDecorator(asciiRenderer); frameDecorator.Draw(); }
/// <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); }
/// <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)); } }
/// <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); } }
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); }
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(); }