/// Обрабатывает команды для работы с памятью private void ProcessRamCommand(string highBin, string highHex) { //WR if (highHex[1] == 'A') { _y44(); _y49(); _y4(); return; } if (highBin[3] == '1') { // Константы _y61(); } else { //прямая _y44(); _y1(); } //NOT if (highHex[1] == '0') { _flags.SetPreviousState(_rdb); _y52(); _flags.UpdateFlags(_rdb, "not"); _y4(); return; } //ADD if (highHex[1] == '1') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Add(_rdb); _flags.UpdateFlags(_acc, "add", overflow, _rdb); return; } //SUB if (highHex[1] == '2') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Sub(_rdb); _flags.UpdateFlags(_acc, "sub", overflow, _rdb); return; } //MUL if (highHex[1] == '3') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); _perform_mul(); var overflow = false; _flags.UpdateFlags(_acc, "mul", overflow); return; } //DIV if (highHex[1] == '4') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); _acc.Div(_rdb); _flags.UpdateFlags(_acc, "div"); return; } //AND if (highHex[1] == '5') { _flags.SetPreviousState(_acc); _acc.And(_rdb); _flags.UpdateFlags(_acc, "and"); return; } //OR if (highHex[1] == '6') { _flags.SetPreviousState(_acc); _acc.Or(_rdb); _flags.UpdateFlags(_acc, "or"); return; } //XOR if (highHex[1] == '7') { _flags.SetPreviousState(_acc); _acc.Xor(_rdb); _flags.UpdateFlags(_acc, "xor"); return; } //CMP if (highHex[1] == '8') { var temp = new ExtendedBitArray(_rdb); _flags.SetArgument(_rdb); _flags.SetPreviousState(_rdb); bool overflow = temp.Sub(_acc); _flags.UpdateFlags(temp, "cmp", overflow, _rdb); return; } //RD if (highHex[1] == '9') { _acc = new ExtendedBitArray(_rdb); return; } //INC if (highHex[1] == 'B') { _flags.SetPreviousState(_rdb); var overflow = _y50(); _y4(); _flags.UpdateFlags(_rdb, "inc", overflow); return; } //DEC A if (highHex[1] == 'C') { _flags.SetPreviousState(_rdb); var overflow = _y51(); _y4(); _flags.UpdateFlags(_rdb, "dec", overflow); return; } //ADC A if (highHex[1] == 'D') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Add(_rdb); if (_flags.C) { overflow |= _acc.Inc(); } _flags.UpdateFlags(_acc, "adc", overflow, _rdb); return; } //SUBB A if (highHex[1] == 'D') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Add(_rdb); if (_flags.C) { overflow |= _acc.Inc(); } _flags.UpdateFlags(_acc, "subb", overflow, _rdb); return; } //XCH if (highHex[1] == 'F') { var temp = new ExtendedBitArray(_acc); _acc = new ExtendedBitArray(_rdb); _rdb = temp; _y4(); } }
private void ProcessRegisterCommand(string highHex, string lowBin) { //MOV if (highHex[1] == 'F') { _y46(); _y2(); _y47(); _y5(); return; } //POP if (highHex[1] == 'D') { _y45(); _y1(); _y34(); _y47(); _y5(); return; } //WR if (highHex[1] == 'A') { if (lowBin[1] != '0' || lowBin[2] != '0' || lowBin[3] != '0') { LoadRegister(lowBin); _y49(); _y4(); ModifyRegister(lowBin); } else { // Прямая адресация _y49(); _y47(); _y5(); } return; } LoadRegister(lowBin); //NOT if (highHex[1] == '0') { _flags.SetPreviousState(_rdb); _y52(); _flags.UpdateFlags(_rdb, "not"); UnloadRegister(lowBin); ModifyRegister(lowBin); return; } //ADD if (highHex[1] == '1') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); bool overflow = _acc.Add(_rdb); _flags.UpdateFlags(_acc, "add", overflow, _rdb); ModifyRegister(lowBin); return; } //SUB if (highHex[1] == '2') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); bool overflow = _acc.Sub(_rdb); _flags.UpdateFlags(_acc, "sub", overflow, _rdb); ModifyRegister(lowBin); return; } //MUL if (highHex[1] == '3') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); _perform_mul(); bool overflow = false; _flags.UpdateFlags(_acc, "mul", overflow); ModifyRegister(lowBin); return; } //DIV if (highHex[1] == '4') { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); _acc.Div(_rdb); _flags.UpdateFlags(_acc, "div"); ModifyRegister(lowBin); return; } //AND if (highHex[1] == '5') { _flags.SetPreviousState(_acc); _acc.And(_rdb); _flags.UpdateFlags(_acc, "and"); ModifyRegister(lowBin); return; } //OR if (highHex[1] == '6') { _flags.SetPreviousState(_acc); _acc.Or(_rdb); _flags.UpdateFlags(_acc, "or"); ModifyRegister(lowBin); return; } //XOR if (highHex[1] == '7') { _flags.SetPreviousState(_acc); _acc.Xor(_rdb); _flags.UpdateFlags(_acc, "xor"); ModifyRegister(lowBin); return; } //CMP if (highHex[1] == '8') { var temp = new ExtendedBitArray(_rdb); _flags.SetPreviousState(temp); _flags.SetArgument(_rdb); bool overflow = temp.Sub(_acc); _flags.UpdateFlags(temp, "cmp", overflow, _rdb); UnloadRegister(lowBin); ModifyRegister(lowBin); return; } //RD if (highHex[1] == '9') { _acc = new ExtendedBitArray(_rdb); ModifyRegister(lowBin); return; } //INC if (highHex[1] == 'B') { _flags.SetPreviousState(_rdb); var overflow = _rdb.Inc(); _flags.UpdateFlags(_rdb, "inc", overflow); UnloadRegister(lowBin); ModifyRegister(lowBin); return; } //DEC if (highHex[1] == 'C') { _flags.SetPreviousState(_rdb); var overflow = _rdb.Dec(); _flags.UpdateFlags(_rdb, "dec", overflow); UnloadRegister(lowBin); ModifyRegister(lowBin); return; } //PUSH if (highHex[1] == 'E') { _y35(); _y45(); _y4(); ModifyRegister(lowBin); return; } //ADC if (highHex == "F0") { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Add(_rdb); if (_flags.C) { overflow |= _acc.Inc(); } _flags.UpdateFlags(_acc, "adc", overflow, _rdb); ModifyRegister(lowBin); return; } //SUBB if (highHex == "F1") { _flags.SetPreviousState(_acc); _flags.SetArgument(_rdb); var overflow = _acc.Sub(_rdb); if (_flags.C) { overflow |= _acc.Dec(); } _flags.UpdateFlags(_acc, "subb", overflow, _rdb); ModifyRegister(lowBin); } }