private void LoadButton_Click(object sender, EventArgs e) { OpenFileDialog openDlg = new OpenFileDialog() { Title = "Pick a Foenix Game File to Open", Filter = "FGM (*.fgm)|*.fgm" }; if (openDlg.ShowDialog() == DialogResult.OK) { CodeTextBox.Text = File.ReadAllText(openDlg.FileName); // Check which checkboxes to check FoenixLexer fl = new FoenixLexer(CodeTextBox.Text); cbSOF.Checked = fl.GetSub("SOF_IRQ_HANDLER") != null; cbSOL.Checked = fl.GetSub("SOL_IRQ_HANDLER") != null; cbTimer0.Checked = fl.GetSub("TIMER0_IRQ_HANDLER") != null; cbTimer1.Checked = fl.GetSub("TIMER1_IRQ_HANDLER") != null; cbTimer2.Checked = fl.GetSub("TIMER2_IRQ_HANDLER") != null; cbMouse.Checked = fl.GetSub("MOUSE_IRQ_HANDLER") != null; cbKeyboard.Checked = fl.GetSub("KEYBOARD_IRQ_HANDLER") != null;; cbCollision0.Checked = fl.GetSub("STS_COL_IRQ_HANDLER") != null; cbCollision1.Checked = fl.GetSub("STT_COL_IRQ_HANDLER") != null; } }
private void WriteInterruptHandler(string filename, FoenixLexer fl, IrqType irq) { List <TokenMatch> sub = fl.GetSub(irq.ToString() + "_IRQ_HANDLER"); List <string> lines = new List <string>(); if (sub != null) { foreach (TokenMatch tm in sub) { lines.AddRange(GetTemplate(tm)); } } File.WriteAllLines(filename, lines); }
private void cbIRQ_CheckedChanged(object sender, EventArgs e) { // if the IRQ subroutine doesn't exist, add it. CheckBox cb = (CheckBox)sender; if (cb.Checked) { string irq = cb.Text.Replace("IRQ", "").Trim().ToUpper(); FoenixLexer fl = new FoenixLexer(CodeTextBox.Text); if (fl.GetSub(irq + "_IRQ_HANDLER") == null) { CodeTextBox.Text += "\r\n" + irq + "_IRQ_HANDLER\r\n" + "{\r\n" + "}\r\n"; } } }
// Call the lexer and print the errors to the user private void GG_Validate(FoenixLexer fl) { // Get errors // Display errors }
private void GenerateASMButton_Click(object sender, EventArgs e) { // parse the code and generate .asm file(s) FoenixLexer fl = new FoenixLexer(CodeTextBox.Text); GG_Validate(fl); FolderBrowserDialog saveDlg = new FolderBrowserDialog() { Description = "Select Destination Folder", ShowNewFolderButton = true, SelectedPath = Application.StartupPath }; if (saveDlg.ShowDialog() == DialogResult.OK) { ReloadTemplates(); // copy the standard asm files - includes and definitions string folder = saveDlg.SelectedPath; Directory.CreateDirectory(folder + Path.DirectorySeparatorChar + "includes"); DirectoryInfo dir = new DirectoryInfo(@"Resources\\base_asm"); foreach (FileInfo fi in dir.GetFiles("*.asm")) { fi.CopyTo(folder + Path.DirectorySeparatorChar + "includes" + Path.DirectorySeparatorChar + fi.Name, true); // Read the assignments from the file if (".asm".Equals(fi.Extension)) { string definition = File.ReadAllText(fi.FullName); // parser definition into VARs/ADDRs } } foreach (FileInfo fi in dir.GetFiles("*.bat")) { fi.CopyTo(folder + Path.DirectorySeparatorChar + fi.Name, true); } // Generate the header for the main file List <string> lines = new List <string>() { "; *************************************************************************", "; * Assembly generated by Foenix IDE Game Generator", "; *************************************************************************", ".cpu \"65816\"", ".include \"includes/macros_inc.asm\"", ".include \"includes/bank_00_inc.asm\"", ".include \"includes/timer_def.asm\"", ".include \"includes/VKYII_CFP9553_GENERAL_def.asm\"", ".include \"includes/VKYII_CFP9553_BITMAP_def.asm\"", ".include \"includes/VKYII_CFP9553_SPRITE_def.asm\"", ".include \"includes/VKYII_CFP9553_TILEMAP_def.asm\"", ".include \"includes/VKYII_CFP9553_SDMA_def.asm\"", ".include \"includes/VKYII_CFP9553_VDMA_def.asm\"", ".include \"includes/VKYII_CFP9553_COLLISION_def.asm\"", ".include \"includes/interrupt_def.asm\"", ".include \"includes/io_def.asm\"", ".include \"includes/kernel_inc.asm\"", ".include \"includes/math_def.asm\"", ".include \"includes/gabe_control_registers_def.asm\"", ".include \"includes/base.asm\"", ".include \"includes/EXP_C200_EVID_def.asm\"", "", "* = $000500", ".include \"includes/keyboard_def.asm\"", "* = $000710", ".include \"vars.asm\"", "* = $10000", ".include \"includes/interrupt_handler.asm\"", ".include \"includes/helper_functions.asm\"", ".include \"includes/vgm_player.asm\"", "", "GAME_START", " setas", " setxl", " sei", "" }; List <string> variables = new List <string>(); if (cbEVID.Checked) { // Add code to push the address of start_debug_text to stack // Add code to JSL to Display_EVID_Log // Add variable to start_debug_text } List <TokenMatch> codeMatches = fl.GetCode(); foreach (TokenMatch tm in codeMatches) { switch (tm.TokenType) { case TokenType.LABEL: lines.Add(tm.Value); break; case TokenType.ENABLE_INTERRUPTS: tm.groups.Clear(); tm.groups.Add(BuildIrqReg0String(cbSOF.Checked, cbSOL.Checked, cbTimer0.Checked, cbTimer1.Checked, cbTimer2.Checked, false, false, cbMouse.Checked)); tm.groups.Add(BuildIrqReg1String(cbKeyboard.Checked, cbCollision0.Checked, cbCollision1.Checked, false, false, false, false, false)); tm.groups.Add("$0"); tm.groups.Add("$0"); lines.AddRange(GetTemplate(tm)); break; case TokenType.VAR: variables.AddRange(GetTemplate(tm)); break; default: lines.AddRange(GetTemplate(tm)); break; } } foreach (Asset asset in fl.GetAssets()) { lines.AddRange(GetTemplate(asset)); } // Write the code File.WriteAllLines(folder + Path.DirectorySeparatorChar + "game_main.asm", lines); File.WriteAllLines(folder + Path.DirectorySeparatorChar + "vars.asm", variables); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_sof_handler.asm", fl, IrqType.SOF); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_sol_handler.asm", fl, IrqType.SOL); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_timer0_handler.asm", fl, IrqType.TIMER0); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_timer1_handler.asm", fl, IrqType.TIMER1); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_timer2_handler.asm", fl, IrqType.TIMER2); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_mouse_handler.asm", fl, IrqType.MOUSE); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_keyboard_handler.asm", fl, IrqType.KEYBOARD); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_collision0_handler.asm", fl, IrqType.KEYBOARD); WriteInterruptHandler(folder + Path.DirectorySeparatorChar + "_collision1_handler.asm", fl, IrqType.KEYBOARD); } }