Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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";
                }
            }
        }
Пример #4
0
 // Call the lexer and print the errors to the user
 private void GG_Validate(FoenixLexer fl)
 {
     // Get errors
     // Display errors
 }
Пример #5
0
        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);
            }
        }