using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Collections; public class Chip8 { // Bitmask constants private static readonly byte NibbleMask = 0b1111; // Font sprites (constants) private static readonly byte[] FontSprites = { 0xF0, 0X90, 0x90, 0x90, 0xF0, // 0 0x20, 0x60, 0x20, 0x20, 0x70, // 1 0xF0, 0x10, 0xF0, 0x10, 0xF0, // 2 0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3 0x90, 0x90, 0xF0, 0x10, 0x10, // 4 0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5 0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6 0xF0, 0x10, 0x20, 0x40, 0x40, // 7 0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8 0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9 0xF0, 0x90, 0xF0, 0x90, 0x90, // A 0xE0, 0x90, 0xE0, 0x90, 0xE0, // B 0xF0, 0x80, 0x80, 0x80, 0xF0, // C 0xE0, 0x90, 0x90, 0x90, 0xE0, // D 0xF0, 0x80, 0xF0, 0x80, 0xF0, // E 0xF0, 0x80, 0xF0, 0x80, 0x80 // F }; // Hardware specification constants private static readonly int MemorySize = 4096; private static readonly byte NoRegisters = 16; private static readonly byte DisplayWidth = 64; private static readonly byte DisplayHeight = 32; // Memory & registers private byte[] memory = new byte[MemorySize]; private byte[] V = new byte[NoRegisters]; private ushort PC = 0; private ushort I = 0; private Stack stack = new Stack(); private BitArray[] display; public Chip8() { // Initialise display grid display = new BitArray[DisplayHeight]; for (int i=0; i<DisplayHeight; i++) { display[i] = new BitArray(DisplayWidth,false); } } public static void Main(string[] args) { Chip8 sys = new Chip8(); sys.Display(); } private void Iterate() { // Fetch ushort instruct = (ushort) ((memory[PC] << 8) & memory[PC + 1]); PC += 2; // Decode byte opcode = (byte) ((instruct) >> 12); byte X = (byte) ((instruct >> 8) & NibbleMask); byte Y = (byte) ((instruct >> 4) & NibbleMask); byte N = (byte) (instruct & NibbleMask); byte NN = (byte) ((instruct >> 4) & 0b11111111); ushort NNN = (byte) (instruct & 0b111111111111); // Execute switch (opcode) { case 0x0: // Clear display ClearDisplay(); break; case 0x1: // Jump to NNN PC = NNN; break; case 0x6: // Set value to NN in register X V[X] = NN; break; case 0x7: // Add NN to value in register X V[X] += NN; break; case 0xA: // Set value of index register to NNN I = NNN; break; case 0xD: // Retrieve screen co-ordinates from registers byte displayX = (byte) (V[X] % DisplayWidth); byte displayY = (byte) (V[Y] % DisplayHeight); I = 0; // Reset index register break; default: Console.WriteLine("Warning! - opcode not recognised\n{" + opcode + "}"); break; } } public void Display() { for (int y=0; y<DisplayHeight; y++) { for (int x=0; x<DisplayWidth; x++) { Console.Write(display[y].Get(x) ? "#" : "0"); } Console.WriteLine(); } } private void ClearDisplay() { for (int i=0; i<DisplayHeight; i++) { display[i].SetAll(false); } } }
Write, Run & Share C# code online using OneCompiler's C# online compiler for free. It's one of the robust, feature-rich online compilers for C# language, running on the latest version 8.0. Getting started with the OneCompiler's C# compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C#
and start coding.
OneCompiler's C# online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
using System;
namespace Sample
{
class Test
{
public static void Main(string[] args)
{
string name;
name = Console.ReadLine();
Console.WriteLine("Hello {0} ", name);
}
}
}
C# is a general purpose object-oriented programming language by Microsoft. Though initially it was developed as part of .net but later it was approved by ECMA and ISO standards.
You can use C# to create variety of applications, like web, windows, mobile, console applications and much more using Visual studio.
Data Type | Description | Range | size |
---|---|---|---|
int | To store integers | -2,147,483,648 to 2,147,483,647 | 4 bytes |
double | to store large floating point numbers with decimals | can store 15 decimal digits | 8 bytes |
float | to store floating point numbers with decimals | can store upto 7 decimal digits | 4 bytes |
char | to store single characters | - | 2 bytes |
string | to stores text | - | 2 bytes per character |
bool | to stores either true or false | - | 1 bit |
datatype variable-name = value;
When ever you want to perform a set of operations based on a condition or set of few conditions IF-ELSE is used.
if(conditional-expression) {
// code
}
else {
// code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression) {
case value1:
// code
break; // optional
case value2:
// code
break; // optional
...
default:
// code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement) {
// code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.
data-type[] array-name;
Method is a set of statements which gets executed only when they are called. Call the method name in the main function to execute the method.
static void method-name()
{
// code to be executed
}