void FixBitInstructions() { foreach (Statement st in statements) { if (st is ExecutableStatement) { ExecutableStatement ex = st as ExecutableStatement; if (ex.OpCode == "BIT" || ex.OpCode == "RES" || ex.OpCode == "SET") { byte b = ex.LeftOperand.GetHexText().ToByte(); /* * b = (byte)(b << 3); * * if (ex.OpCode == "BIT") * {//and | 01000110 * b = (byte)(b | 01000110); * } * else if (ex.OpCode == "RES") * {//left shit b 3 and | 10000110 * b = (byte)(b | 10000110); * } * else if (ex.OpCode == "SET") * {//left shit b 3 and | 11000110 * b = (byte)(b | 11000110); * } */ if (ex.GetModeText() == "IMMEDIATE,IX_INDEXED_PLUS_OFFSET" || ex.GetModeText() == "IMMEDIATE,IY_INDEXED_PLUS_OFFSET") {//left shit b 3 or byte //now flip the operands because they //get written out in reverse order ex.LeftOperand.Value = ex.RightOperand.Value; ex.RightOperand.Value = string.Format("{0:2X}", b); } } } } }
/// <summary> /// makes sure the operands are supported /// </summary> void ValidateOperands() { for (int i = 0; i < statements.Count; i++) { Statement s = statements[i]; if (s is ExecutableStatement) { ExecutableStatement ex = s as ExecutableStatement; string mode = ex.GetModeText(); if (!LangDef.LangDef.SupportsMode(ex.OpCode, mode)) {// throw new Exception( String.Format( "Error on line {0}:{3} {1} does not support mode {2}", i, ex.OpCode, mode, ex.Text) ); } } } }