private RetroDevStudio.Parser.BasicFileParser CreateParser(string BASICDialectName) { var parser = new RetroDevStudio.Parser.BasicFileParser(new RetroDevStudio.Parser.BasicFileParser.ParserSettings()); parser.Settings.StripSpaces = false; parser.Settings.StripREM = false; if (BASICDialectName == "BASIC V2") { parser.SetBasicDialect(Dialect.BASICV2); } else { string error; var dialect = Dialect.ReadBASICDialectForUnitTest("BASIC Dialects/" + BASICDialectName + ".txt", out error); if (dialect == null) { Assert.Fail(error); } parser.SetBasicDialect(dialect); } return(parser); }
public override bool HandleImport(CharsetScreenProject CharScreen, CharsetScreenEditor Editor) { var settings = new RetroDevStudio.Parser.BasicFileParser.ParserSettings(); settings.StripREM = true; settings.StripSpaces = true; settings.BASICDialect = C64Models.BASIC.Dialect.BASICV2; var parser = new RetroDevStudio.Parser.BasicFileParser(settings); string[] lines = editInput.Text.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); int lastLineNumber = -1; int cursorX = 0; int cursorY = 0; byte curColor = 14; bool reverseMode = false; foreach (var line in lines) { var cleanLine = line.Trim(); var lineInfo = parser.TokenizeLine(cleanLine, 1, ref lastLineNumber); for (int i = 0; i < lineInfo.Tokens.Count; ++i) { var token = lineInfo.Tokens[i]; if ((token.TokenType == Parser.BasicFileParser.Token.Type.BASIC_TOKEN) && (token.ByteValue == 0x99)) { // a PRINT statement bool hasSemicolonAtEnd = false; while ((i + 1 < lineInfo.Tokens.Count) && (lineInfo.Tokens[i + 1].Content != ":")) { ++i; var nextToken = lineInfo.Tokens[i]; if (nextToken.TokenType == Parser.BasicFileParser.Token.Type.STRING_LITERAL) { // handle incoming PETSCII plus control codes! bool hadError = false; var actualString = Parser.BasicFileParser.ReplaceAllMacrosBySymbols(nextToken.Content.Substring(1, nextToken.Content.Length - 2), out hadError); foreach (var singleChar in actualString) { var key = ConstantData.AllPhysicalKeyInfos.Find(x => x.CharValue == singleChar); if (key != null) { if ((key.Type == KeyType.GRAPHIC_SYMBOL) || (key.Type == KeyType.NORMAL)) { if (reverseMode) { Editor.SetCharacter(cursorX, cursorY, (ushort)(key.ScreenCodeValue + 128), curColor); } else { Editor.SetCharacter(cursorX, cursorY, key.ScreenCodeValue, curColor); } ++cursorX; if (cursorX >= CharScreen.ScreenWidth) { cursorX = 0; ++cursorY; } } else if (key.Type == KeyType.CONTROL_CODE) { switch (key.PetSCIIValue) { case 5: curColor = 1; break; case 17: ++cursorY; break; case 18: reverseMode = true; break; case 28: curColor = 2; break; case 29: ++cursorX; break; case 30: curColor = 5; break; case 31: curColor = 6; break; case 129: curColor = 8; break; case 144: curColor = 0; break; case 145: --cursorY; break; case 146: reverseMode = false; break; case 149: curColor = 9; break; case 150: curColor = 10; break; case 151: curColor = 11; break; case 152: curColor = 12; break; case 153: curColor = 13; break; case 154: curColor = 14; break; case 155: curColor = 15; break; case 156: curColor = 4; break; case 157: --cursorX; if (cursorX < 0) { cursorX += CharScreen.ScreenWidth; --cursorY; } break; case 158: curColor = 7; break; case 159: curColor = 3; break; } } } } continue; } else if (nextToken.Content == ";") { hasSemicolonAtEnd = true; } else { hasSemicolonAtEnd = false; reverseMode = false; } } if (!hasSemicolonAtEnd) { cursorX = 0; ++cursorY; // TODO - Scroll up } } } } return(true); }