private static void CreateMethod(Expression opcodeResolver, ExpressionBuilder expressionBuilder, MethodBuilder methodBuilder)
 {
     var methodBody = new List<Expression>();
     methodBody.Add(expressionBuilder.InitializeParameters());
     methodBody.Add(opcodeResolver);
     methodBody.Add(expressionBuilder.FinalizeParameters());
     var block = Expression.Block(expressionBuilder.GetLocals(), methodBody);
     var methodLambda = Expression.Lambda(block, expressionBuilder.GetParameterList());
     methodLambda.CompileToMethod(methodBuilder);
 }
Example #2
0
        private static List<Expression> BuildLoopMethod(Expression opcodeResolver, ExpressionBuilder expressionBuilder, IExpressionLibraryRegistry libRegistry)
        {
            LabelTarget beginMainLoop = Expression.Label("beginMainLoop");
            LabelTarget endMainLoop = Expression.Label("endMainLoop");

            IProgramControlExpressionLibrary pcel = libRegistry.GetLibrary<IProgramControlExpressionLibrary>();
            IInteruptExpressionLibrary iel = libRegistry.GetLibrary<IInteruptExpressionLibrary>();
            IDataAccessExpressionLibrary dael = libRegistry.GetLibrary<IDataAccessExpressionLibrary>();

            var methodBody = new List<Expression>();
            methodBody.Add(expressionBuilder.InitializeParameters());
            //methodBody.Add(Expression.Assign(pcel.CycleCounter, Expression.Constant(347)));

            methodBody.Add(Expression.Block(
                    // Handle IRQs if neccessary.
                    Expression.IfThen(Expression.Equal(iel.IFF1, Expression.Constant(true)),
                        Expression.IfThen(Expression.Equal(iel.InteruptRequested, Expression.Constant(true)),
                            Expression.Block(
                                Expression.Assign(iel.InteruptRequested, Expression.Constant(false)),
                                Expression.Assign(iel.IFF1, Expression.Constant(false)),
                                dael.Push(pcel.ProgramCounterRegister),
                                Expression.Assign(pcel.ProgramCounterRegister, Expression.Constant(0x0038)),
                                Expression.SubtractAssign(pcel.CycleCounter, Expression.Constant(13))
                            )
                        )
                    ),

                    Expression.Label(beginMainLoop),

                    Expression.IfThen(Expression.LessThanOrEqual(pcel.CycleCounter, Expression.Constant(0)),
                        Expression.Goto(endMainLoop)
                    ),

                    //Expression.SubtractAssign(pcel.CycleCounter, Expression.Constant(4)),

                    Expression.PostIncrementAssign(iel.RefreshRegister),
                    opcodeResolver,

                    Expression.Goto(beginMainLoop),
                    Expression.Label(endMainLoop)
                )
            );

            methodBody.Add(expressionBuilder.FinalizeParameters());
            return methodBody;
        }