Пример #1
0
 static Cpu()
 {
     TIME = PC = SF = 0;
     AX = new Word(0);
     CX = new Word(0);
     MODE = WorkMode.SUPERVISOR;
 }
Пример #2
0
 public void ExecuteCommand(Word word)
 {
     string command = word.Value.Substring(0, 2);
     string operand = "";
     if (word.Value.Length != 3)
     {
         operand = word.Value.Substring(2, word.Value.Length - 2);
     }
     switch (command)
     {
         case "AD":
             {
                 Cpu.TIME--;
                 Cpu.AX = Cpu.AX + Cpu.CX;
                 break;
             }
         case "SU":
             {
                 Cpu.TIME--;
                 Cpu.AX = Cpu.AX - Cpu.CX;
                 break;
             }
         case "CM":
             {
                 Cpu.TIME--;
                 if (Cpu.AX > Cpu.CX)
                     Cpu.SF = 0;
                 if (Cpu.AX < Cpu.CX)
                     Cpu.SF = 2;
                 if (Word.HexToInt(Cpu.AX.Value) == Word.HexToInt(Cpu.CX.Value))
                     Cpu.SF = 1;
                 break;
             }
         case "SA":
             {
                 Cpu.TIME--;
                 this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value = Cpu.AX.Value;
                 break;
             }
         case "LA":
             {
                 Cpu.TIME--;
                 Cpu.AX.Value = this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value;
                 break;
             }
         case "SC":
             {
                 Cpu.TIME--;
                 this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value = Cpu.CX.Value;
                 break;
             }
         case "LC":
             {
                 Cpu.TIME--;
                 Cpu.CX.Value = this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value;
                 break;
             }
         case "JM":
             {
                 Cpu.TIME--;
                 Cpu.PC = Convert.ToInt16(operand, 16);
                 break;
             }
         case "JE":
             {
                 Cpu.TIME--;
                 if (Cpu.SF == 1)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "JN":
             {
                 Cpu.TIME--;
                 if (Cpu.SF != 1)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "JA":
             {
                 Cpu.TIME--;
                 if (Cpu.SF == 0)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "JB":
             {
                 Cpu.TIME--;
                 if (Cpu.SF == 2)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "JG":
             {
                 Cpu.TIME--;
                 if (Cpu.SF == 0 || Cpu.SF == 1)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "JL":
             {
                 Cpu.TIME--;
                 if (Cpu.SF == 1 || Cpu.SF == 2)
                     Cpu.PC = Convert.ToInt16(operand, 16);
                 else Cpu.PC++;
                 break;
             }
         case "GD": //TO DO: everything
             {
                 Cpu.TIME--;
                 //memory.Write(operand);
                 memory.Write(operand, vm.Io.Buffer);
                 vm.Io.Flush();
                 break;
             }
         case "PD":
             {
                 Cpu.TIME--;
                 string buf = string.Empty;
                 int block = Word.HexToInt(operand[0].ToString());
                 for (int i = 0; i < memory.WordCount; i++)
                 {
                     if (memory[block, i].Value != "----")
                         buf += memory[block, i].Value;
                 }
                 vm.Io.Buffer = buf;
                 vm.Io.WriteBuffer();
                 vm.Io.Flush();
                 break;
             }
         case "--":
             {
                 break;
             }
         case "$E":
             {
                 vm.FinishedWork = true;
                 break;
             }
         default:
             {
                 throw new ArgumentException("Unknown command: " + word.Value);
             }
     }
 }