Added Hex Conversions to allow for loading programs into memory from Hex Files.

This commit is contained in:
2026-06-03 15:51:30 -04:00
parent eae5314e3b
commit c474907d72
13 changed files with 163 additions and 7 deletions
+19 -4
View File
@@ -4,21 +4,36 @@ namespace CPUSimulation
{
public class CPU
{
static string _program = "D8;58;A0;7F;8C;12;D0;A9;A7;8D;11;D0;8D;13;D0;C9;DF;F0;13;C9;9B;F0;03;C8;10;0F;A9;DC;20;EF;FF;A9;8D;20;EF;FF;A0;01;88;30;F6;AD;11;D0;10;FB;AD;10;D0;99;00;02;20;EF;FF;C9;8D;D0;D4;A0;FF;A9;00;AA;0A;85;2B;C8;B9;00;02;C9;8D;F0;D4;C9;AE;90;F4;F0;F0;C9;BA;F0;EB;C9;D2;F0;3B;86;28;86;29;84;2A;B9;00;02;49;B0;C9;0A;90;06;69;88;C9;FA;90;11;0A;0A;0A;0A;A2;04;0A;26;28;26;29;CA;D0;F8;C8;D0;E0;C4;2A;F0;97;24;2B;50;10;A5;28;81;26;E6;26;D0;B5;E6;27;4C;44;FF;6C;24;00;30;2B;A2;02;B5;27;95;25;95;23;CA;D0;F7;D0;14;A9;8D;20;EF;FF;A5;25;20;DC;FF;A5;24;20;DC;FF;A9;BA;20;EF;FF;A9;A0;20;EF;FF;A1;24;20;DC;FF;86;2B;A5;24;C5;28;A5;25;E5;29;B0;C1;E6;24;D0;02;E6;25;A5;24;29;07;10;C8;48;4A;4A;4A;4A;20;E5;FF;68;29;0F;09;B0;C9;BA;90;02;69;06;2C;12;D0;30;FB;8D;12;D0;60;00;00;00;0F;00;FF;00;00";
public static int numberOfMemoryBanks = 2;
static int memoryBankSize = 1024;
static int memoryBankSize = 65536;
static MC _memoryController;
public static void Main(string[] args)
{
InitilizeMemoryController();
string[] strings = _program.Split(';');
Int16 startAddress = Utils.HexStringToInt16("7F00");
for (int i = 0; i < strings.Length; i++)
{
Int16 currentAddress = (Int16)(startAddress + i);
string byteString = strings[i];
if (byteString.Length != 2)
{
throw new ArgumentException($"Byte string length must be 2. Invalid byte string: {byteString}");
}
Byte byteToWrite = new Byte(Utils.HexStringToBinaryString(byteString));
Word wordToWrite = new Word(new Byte[2] { new Byte("00000000"), byteToWrite });
_memoryController.Write(currentAddress, wordToWrite);
}
_memoryController.Write("0000000000000001","0000000011110000");
_memoryController.Write("0000000000000010","1111000000001111");
for (int i = 0; i < 16; i++)
{
string dataRead = _memoryController.Read((Int16)i);
Console.WriteLine($"Data read from address {new Address((Int16)i).ToString()}: {dataRead}");
Int16 currentAddress = (Int16)(startAddress + i);
string dataRead = Utils.BinaryStringToHexString(_memoryController.Read(currentAddress));
Console.WriteLine($"Data read from address {Utils.BinaryStringToHexString(new Address(currentAddress).ToString())}: {dataRead}");
}
}
+1 -1
View File
@@ -113,7 +113,7 @@ namespace CPUSimulation
{
if (address < 0 || address >= _memoryBankSize)
{
throw new ArgumentOutOfRangeException(nameof(address), $"Address must be between 0 and {_memoryBankSize - 1}.");
throw new ArgumentOutOfRangeException(nameof(address), $"Received {address}. Address must be between 0 and {_memoryBankSize - 1}.");
}
}
+141
View File
@@ -48,5 +48,146 @@ namespace CPUSimulation
{
return Convert.ToString(value & 0xFFFF, 2).PadLeft(16, '0');
}
public static string BinaryStringToHexString(string binaryString)
{
if (binaryString.Length % 4 != 0)
{
throw new ArgumentException("Binary string length must be a multiple of 4.");
}
string hexString = "";
for (int i = 0; i < binaryString.Length; i += 4)
{
string fourBits = binaryString.Substring(i, 4);
switch (fourBits)
{
case "0000":
hexString += "0";
break;
case "0001":
hexString += "1";
break;
case "0010":
hexString += "2";
break;
case "0011":
hexString += "3";
break;
case "0100":
hexString += "4";
break;
case "0101":
hexString += "5";
break;
case "0110":
hexString += "6";
break;
case "0111":
hexString += "7";
break;
case "1000":
hexString += "8";
break;
case "1001":
hexString += "9";
break;
case "1010":
hexString += "A";
break;
case "1011":
hexString += "B";
break;
case "1100":
hexString += "C";
break;
case "1101":
hexString += "D";
break;
case "1110":
hexString += "E";
break;
case "1111":
hexString += "F";
break;
}
}
return hexString;
}
public static string HexStringToBinaryString(string hexString)
{
string binaryString = "";
foreach (char hexChar in hexString)
{
switch (hexChar)
{
case '0':
binaryString += "0000";
break;
case '1':
binaryString += "0001";
break;
case '2':
binaryString += "0010";
break;
case '3':
binaryString += "0011";
break;
case '4':
binaryString += "0100";
break;
case '5':
binaryString += "0101";
break;
case '6':
binaryString += "0110";
break;
case '7':
binaryString += "0111";
break;
case '8':
binaryString += "1000";
break;
case '9':
binaryString += "1001";
break;
case 'A':
case 'a':
binaryString += "1010";
break;
case 'B':
case 'b':
binaryString += "1011";
break;
case 'C':
case 'c':
binaryString += "1100";
break;
case 'D':
case 'd':
binaryString += "1101";
break;
case 'E':
case 'e':
binaryString += "1110";
break;
case 'F':
case 'f':
binaryString += "1111";
break;
}
}
return binaryString;
}
public static Int16 HexStringToInt16(string hexString)
{
if (hexString.Length > 4)
{
throw new ArgumentException("Hex string length must be 4 or less.");
}
return Convert.ToInt16(hexString, 16);
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("CPUSimulation")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+faa7801376d988a2b7b81332c9df3db882f08224")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+eae5314e3b7572a343c4caa2d16fb0b1c62c28a0")]
[assembly: System.Reflection.AssemblyProductAttribute("CPUSimulation")]
[assembly: System.Reflection.AssemblyTitleAttribute("CPUSimulation")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
0093ec249d1fba7433aea9a209b4614dc995df5d3b8e509911d9d959d0697898
798170df39efaf27b92d72c4185cce11e4e39a47cca7daccb922366ffee2735d
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.