コード例 #1
0
ファイル: ADD.cs プロジェクト: dxc31202/ZXStudio
        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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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}");
        }
コード例 #4
0
        /// <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);
            }
        }