static void Main(string[] args) { Console.SetWindowSize(20, 20); Console.CursorTop = 13; string parancs; string[] darabok; /*Console.WriteLine(Eszkozok.Hex2Dec("200")); * Console.WriteLine(Eszkozok.Dec2Hex(512));*/ proc = new Processzor(); Task futtatas = null; do { Console.CursorTop = 11; Console.CursorLeft = 0; Console.WriteLine(new string(' ', 30)); Console.CursorTop = 11; parancs = Console.ReadLine().Trim(); switch (parancs[0]) { case 'L': darabok = parancs.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); proc.Betolt(darabok[1]); break; case 'R': /*futtatas = Task.Run(new Action(proc.Futtat)); * while(proc.fut) { * if (proc.kepFrissult) { * Console.CursorTop = Console.CursorLeft = 0; * StringBuilder sb = new StringBuilder(); * for (int i = 0; i < 10; i++) { * sb.Append(Encoding.ASCII.GetChars(proc.ram, i*10, 10)); * sb.AppendLine(); * } * Console.Clear(); * Console.Write(sb.ToString()); * proc.kepFrissult = false; * } * }*/ proc.Futtat(); break; case 'S': proc.Lep(); break; case 'M': TorolStatusz(); darabok = parancs.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); Console.WriteLine(Eszkozok.Dec2Hex(proc.ram[Eszkozok.Hex2Dec(darabok[1])])); break; } } while (parancs != "Q"); Console.ReadLine(); }
public void Betolt(string fajl) { for (int i = 0; i < programStart; i++) { ram[i] = (byte)Eszkozok.Hex2Dec("20"); //space ASCII-ben } string kod; using (StreamReader sr = new StreamReader(fajl)) { kod = sr.ReadToEnd(); } for (int i = 0; i < kod.Length; i += 2) { byte val = (byte)Eszkozok.Hex2Dec(kod[i] + "" + kod[i + 1]); ram[programStart + i / 2] = val; } pos = programStart; }
public void Lep() { Program.TorolStatusz(); Console.WriteLine("Cim: " + Eszkozok.Dec2Hex(pos)); Console.Write("Utasitas: " + Eszkozok.Dec2Hex(ram[pos])); if (ram[pos] <= 8) // a 9-nel kisebb utasitasoknal az elso parameter egy memoriacim: [ABC] { a = ram[pos + 1] * byteHelyiErtekSzorzo + ram[pos + 2]; Console.Write(" " + Eszkozok.Dec2Hex(a)); } if (ram[pos] <= 5) // van 3. parameter { if (ram[pos] % 2 == 0) // a 3. parameter memoriacim { b = ram[pos + 3] * byteHelyiErtekSzorzo + ram[pos + 4]; } else // a 3. parameter egy 1 byte-os konstans { b = ram[pos + 3]; } Console.Write(" " + Eszkozok.Dec2Hex(b)); } switch (ram[pos]) { case 0: // MOV [ABC] [DEF] ram[a] = ram[b]; break; case 1: // MOV [ABC] $XY ram[a] = (byte)b; break; case 2: // ADD [ABC] [DEF] c = ram[a] + ram[b]; if (c > byte.MaxValue) { kicsordult = true; c = c % (byte.MaxValue + 1); } else { kicsordult = false; } ram[a] = (byte)c; break; case 3: // ADD [ABC] $XY c = ram[a] + b; if (c > byte.MaxValue) { kicsordult = true; c = c % (byte.MaxValue + 1); } else { kicsordult = false; } ram[a] = (byte)c; break; case 4: // SUB [ABC] [DEF] c = ram[a] - ram[b]; if (c < 0) { kicsordult = true; c += byte.MaxValue + 1; } else { kicsordult = false; } ram[a] = (byte)c; break; case 5: // SUB [ABC] $XY c = ram[a] - b; if (c < 0) { kicsordult = true; c += byte.MaxValue + 1; } else { kicsordult = false; } ram[a] = (byte)c; break; case 6: // JMP ABC pos = a; return; // nehogy atlepje a kovetkezot, amugy sincs mar tobb dolgunk case 7: // JZ if (elozo0) { pos = a; } else { pos += 3; } return; // nehogy atlepje a kovetkezot, amugy sincs mar tobb dolgunk case 8: // JC if (kicsordult) { pos = a; } else { pos += 3; } return; // nehogy atlepje a kovetkezot, amugy sincs mar tobb dolgunk case 9: // WAIT Thread.Sleep(varakozasHossz); break; /*case 10: // END * * break;*/ } if (ram[pos] <= 5) // ram[a]-t modosito utasitasok: MOV, ADD, SUB { elozo0 = ram[a] == 0; if (a < programStart) // kepernyore irunk { kepFrissult = true; Program.Kepfrissit(); } } if (ram[pos] <= 5) { if (ram[pos] % 2 == 0) // 5 byte-os utasitasok { pos += 5; } else // 4 byte-os utasitasok { pos += 4; } } else if (ram[pos] == 9) //WAIT-nel { pos++; } }