static Token ADD(Token token) { if ((token = NextToken(token)) == null) { return(token); } RegisterType registerType = GetRegisterType(token); if (registerType < RegisterType.F || registerType == RegisterType.Unknown) { return(RegMemOrByte(token, registerType, (int)Codes.ADD_B)); } if (registerType != RegisterType.HL && registerType != RegisterType.IX && registerType != RegisterType.IY) { LogError(currentFileName, token, "Expecting HL, IX or IY"); return(token.Next); } if ((token = NextToken(token)) == null) { return(token); } if (CheckComma(token, false)) { if ((token = NextToken(token)) == null) { return(token); } } if (registerType == RegisterType.IX) { StoreOpcode(0xDD); } if (registerType == RegisterType.IY) { StoreOpcode(0xFD); } switch (token.Value.ToUpper()) { case "BC": StoreOpcode(Codes.ADD_HL_BC); return(token.Next); case "DE": StoreOpcode(Codes.ADD_HL_DE); return(token.Next); case "SP": StoreOpcode(Codes.ADD_HL_SP); return(token.Next); case "HL": StoreOpcode(Codes.ADD_HL_HL); return(token.Next); case "IX": StoreOpcode(Codes.ADD_HL_HL); return(token.Next); case "IY": StoreOpcode(Codes.ADD_HL_HL); return(token.Next); } LogError(currentFileName, token, "Expecting BC, DE, " + registerType.ToString() + " or SP"); return(token.Next); }
public void Write(RegisterType registerType, int value) { var writeEvent = new RegisterWriteEvent { RegisterType = registerType.ToString(), NewValue = value, OldValue = _registerDict[registerType] }; _diagnosticsService.AddEvent(writeEvent); _registerDict[registerType] = value; }
public override string GetParamRegisterName(int index) { var registerType = GetParamRegisterType(index); int registerNumber = GetParamRegisterNumber(index); string registerTypeName; switch (registerType) { case RegisterType.Addr: registerTypeName = "a"; break; case RegisterType.Const: registerTypeName = "c"; break; case RegisterType.Const2: registerTypeName = "c"; registerNumber += 2048; break; case RegisterType.Const3: registerTypeName = "c"; registerNumber += 4096; break; case RegisterType.Const4: registerTypeName = "c"; registerNumber += 6144; break; case RegisterType.ConstBool: registerTypeName = "b"; break; case RegisterType.ConstInt: registerTypeName = "i"; break; case RegisterType.Input: registerTypeName = "v"; break; case RegisterType.Output: registerTypeName = "o"; break; case RegisterType.RastOut: registerTypeName = "rast"; break; case RegisterType.Temp: registerTypeName = "r"; break; case RegisterType.Sampler: registerTypeName = "s"; break; case RegisterType.ColorOut: registerTypeName = "oC"; break; case RegisterType.DepthOut: registerTypeName = "oDepth"; break; case RegisterType.MiscType: if (registerNumber == 0) { return("vFace"); } else if (registerNumber == 1) { return("vPos"); } else { throw new NotImplementedException(); } case RegisterType.Loop: return("aL"); default: throw new NotImplementedException(); } string relativeAddressing = string.Empty; if (Params.HasRelativeAddressing(index)) { RegisterType relativeType = GetRelativeParamRegisterType(index); switch (relativeType) { case RegisterType.Loop: relativeAddressing = "[aL]"; break; default: throw new NotSupportedException(relativeType.ToString()); } } return($"{registerTypeName}{registerNumber}{relativeAddressing}"); }
/// <summary> /// Handle varions: /// /// </summary> /// <param name="token"></param> /// <param name="registerType"></param> /// <param name="baseopcode"></param> /// <returns></returns> static Token RegMemOrByte(Token token, RegisterType registerType, int baseopcode) { if (registerType != RegisterType.BRACKET && registerType != RegisterType.Unknown) { if (token.Next != null) { if ((token = NextToken(token)) == null) { return(token.Next); } } if (CheckComma(token, false)) { if ((token = NextToken(token)) == null) { return(token); } } //if (registerType != RegisterType.A) //{ // LogError(currentFileName, token, token.Previous.Value + " is not allowed here"); // return token.Next; //} //token = NextToken(token); registerType = GetRegisterType(token); } switch (registerType) { case RegisterType.Unknown: // Byte StoreOpcode(baseopcode + 70); int operand = GetValue(ref token); if (!StoreByte(operand)) { LogError(currentFileName, token, "Number too large"); } return(token.Next); case RegisterType.BRACKET: // (HL or (IX or (IY if ((token = NextToken(token)) == null) { return(token.Next); } int opcode = baseopcode + (int)registerType; switch (GetRegisterType(token)) { case RegisterType.IX: { int offset = 0; if ((token = NextToken(token)) == null) { return(token.Next); } if (token.IsEquation) { offset = (int)Parser.Evaluate(currentFileName, token.Value, currentLine, ProgramCounterOffset, token); if (currentPass == 2) { if (!Parser.IsValid) { LogError(currentFileName, token, "Invalid Offset"); return(token.Next); } } } else if (token.Value != ")") { LogError(currentFileName, token, "Expecting +/- or close bracket"); return(token.Next); } StoreIXOpcodeDisplacement(opcode, offset); if (token.Value != ")") { if ((token = NextToken(token)) == null) { return(token.Next); } } break; } case RegisterType.IY: { int offset = 0; if ((token = NextToken(token)) == null) { return(token.Next); } if (token.IsEquation) { offset = (int)Parser.Evaluate(currentFileName, token.Value, currentLine, ProgramCounterOffset, token); if (currentPass == 2) { if (!Parser.IsValid) { LogError(currentFileName, token, "Invalid Offset"); return(token.Next); } } } else if (token.Value != ")") { LogError(currentFileName, token, "Expecting +/- or close bracket"); return(token.Next); } StoreIYOpcodeDisplacement(opcode, offset); if (token.Value != ")") { if ((token = NextToken(token)) == null) { return(token.Next); } } break; } case RegisterType.HL: StoreOpcode(opcode); if ((token = NextToken(token)) == null) { return(token.Next); } break; default: LogError(currentFileName, token, token.Value + " is not allowed here"); return(token.Next); } CheckCloseBracket(token, true); return(token.Next); case RegisterType.XH: case RegisterType.XL: StoreIXOpcode(baseopcode + (int)registerType - 4); return(token.Next); case RegisterType.YH: StoreIYOpcode(baseopcode + (int)registerType - 4); return(token.Next); case RegisterType.YL: return(token.Next); default: if (registerType > RegisterType.A) { LogError(currentFileName, token, registerType.ToString() + " is not valid here"); return(token); } StoreOpcode(baseopcode + (int)registerType); return(token); } }