215 lines
7.6 KiB
Java
215 lines
7.6 KiB
Java
|
package b2c;
|
||
|
|
||
|
import java.nio.file.Files;
|
||
|
import java.nio.file.StandardCopyOption;
|
||
|
import java.io.File;
|
||
|
import java.io.IOException;
|
||
|
import java.util.Scanner;
|
||
|
|
||
|
/* TODO 's:
|
||
|
*
|
||
|
* put each program in a separate file <program>.c
|
||
|
* generate .g1w
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
public class B2C {
|
||
|
|
||
|
final static boolean debugMode = true;
|
||
|
|
||
|
static String path = "C:\\Users\\Catherine\\Documents\\CASIO\\fx-9860G SDK\\TestB2C\\";
|
||
|
static String pathToG1M = "C:\\Users\\Catherine\\Desktop\\test.g1m";
|
||
|
static String mainProgramName = "TEST";
|
||
|
static boolean isRealTimeGame = true;
|
||
|
static boolean assureOS1Compatibility = true;
|
||
|
static boolean usesAcOnTimer = true;
|
||
|
static String main_c;
|
||
|
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
if (!debugMode) {
|
||
|
Scanner sc = new Scanner(System.in);
|
||
|
System.out.println("Enter the path to the .g1m file:");
|
||
|
while (true) {
|
||
|
pathToG1M = ""+sc.nextLine().charAt(0);
|
||
|
if (new File(pathToG1M).isFile()) {
|
||
|
break;
|
||
|
} else {
|
||
|
System.out.println("File not found.");
|
||
|
}
|
||
|
}
|
||
|
pathToG1M = pathToG1M.replaceAll("\\\\", "/");
|
||
|
System.out.println("Enter the name of the main program.\nReplace 'r' with \"radius\", 'θ' by \"theta\" and non-ASCII characters by '_'.");
|
||
|
mainProgramName = Parser.parseProgName(sc.nextLine());
|
||
|
String programName = pathToG1M.substring(pathToG1M.lastIndexOf('/')+1, pathToG1M.lastIndexOf('.'));
|
||
|
path = System.getProperty("user.home") + "\\Documents\\CASIO\\fx-9860G SDK\\"
|
||
|
+ programName + System.getProperty("file.separator");
|
||
|
System.out.println("Enter the destination path. Write \"default\" to set to:\n" + path);
|
||
|
String destinationPath = sc.nextLine();
|
||
|
if (!destinationPath.equals("default")) {
|
||
|
path = destinationPath;
|
||
|
}
|
||
|
new File(path).mkdir();
|
||
|
|
||
|
//TODO create custom image
|
||
|
try {
|
||
|
Files.copy(new File(B2C.class.getClassLoader().getResource("MainIcon.bmp").getPath().substring(1)).toPath(),
|
||
|
new File(path + "/MainIcon.bmp").toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
IO.writeToFile(new File(path + File.separator + programName + ".g1w"),
|
||
|
IO.readFromRelativeFile("Default.g1w").replaceAll("%PROG_NAME%", programName), true);
|
||
|
IO.writeToFile(new File(path + File.separator + "AddinInfo.txt"),
|
||
|
IO.readFromRelativeFile("AddinInfo.txt").replaceAll("%PROG_NAME%", programName), true);
|
||
|
|
||
|
}
|
||
|
long startTime = System.currentTimeMillis();
|
||
|
|
||
|
//Add some constants for functions
|
||
|
Constants.add("0");
|
||
|
Constants.add("1");
|
||
|
Constants.add("-1");
|
||
|
/*Constants.add("53123523");
|
||
|
Constants.add("0.3");
|
||
|
Constants.add("2.304");
|
||
|
Constants.add("-1");
|
||
|
Constants.add("0.0456");
|
||
|
Constants.add("-0.00786");*/
|
||
|
|
||
|
main_c =
|
||
|
"#include <stdlib.h>\n" +
|
||
|
"#include <stdarg.h>\n" +
|
||
|
"#include <math.h>\n" +
|
||
|
"#include <limits.h>\n" +
|
||
|
"#include <string.h>\n" +
|
||
|
"#include \"fxlib.h\"\n" +
|
||
|
"#include \"main.h\"\n\n" +
|
||
|
"unsigned int key;\n" +
|
||
|
"int i;\n"+
|
||
|
"BCDvar var[28] = {0}; //A-Z, r, theta\n"+
|
||
|
"BCDvar Ans;\n" +
|
||
|
"Str strings[20];\n" +
|
||
|
"Mat mat[26]; //Important thing: matrixes are (height, width) not (width, height)\n" +
|
||
|
"char dummyOpCode[2] = {5, 8};\n" +
|
||
|
"//These are buffers for syscalls that do not return a value.\n" +
|
||
|
"BCDvar alphaVarBuffer;\n" +
|
||
|
"BCDvar expressionBuffer;\n" +
|
||
|
"BCDvar getkeyBuffer;\n" +
|
||
|
"unsigned char stringBuffer[256] = {0};\n";
|
||
|
/*"const BCDvar ZERO = {0};\n";
|
||
|
for (int i = 1; i <= 9; i++) {
|
||
|
main_c += "const BCDvar " + Parser.consts.get(i) + " = {0x10, 0x0" + i + "};\n";
|
||
|
}*/
|
||
|
main_c+="\nint AddIn_main(int isAppli, unsigned short OptionNum) {\n" +
|
||
|
"\t//Initialize strings\n" +
|
||
|
"\tfor (i = 0; i < 20; i++) {\n" +
|
||
|
"\t\tstrings[i].length = 0;\n" +
|
||
|
"\t}\n" +
|
||
|
"\t#ifdef USES_INTERRUPTION_TIMER\n" +
|
||
|
"\t//Timer allowing AC/ON to be pressed at any moment\n" +
|
||
|
"\tSetTimer(INTERRUPTION_TIMER, 50, exitTimerHandler);\n" +
|
||
|
"\t#endif\n" +
|
||
|
"\tprog_"+mainProgramName+"();\n\n" +
|
||
|
"\tdo {\n" +
|
||
|
"\t\tGetKey(&key);\n" +
|
||
|
"\t} while (key != KEY_CTRL_EXE && key != KEY_CTRL_AC);\n" +
|
||
|
"\treturn 1;\n" +
|
||
|
"}\n\n";
|
||
|
|
||
|
main_c += IO.readFromFile(pathToG1M);
|
||
|
|
||
|
System.out.println("Result:\n-------------\n"+main_c);
|
||
|
|
||
|
//pragma stuff
|
||
|
main_c += "\n\n#pragma section _BR_Size\nunsigned long BR_Size;\n#pragma section\n\n"
|
||
|
+ "#pragma section _TOP\n"
|
||
|
+ "int InitializeSystem(int isAppli, unsigned short OptionNum) {"
|
||
|
+ "\n\treturn INIT_ADDIN_APPLICATION(isAppli, OptionNum);\n}\n"
|
||
|
+ "#pragma section\n";
|
||
|
|
||
|
//GetKey handling
|
||
|
/*if (isRealTimeGame) {
|
||
|
main_c = main_c.replaceAll(
|
||
|
"(do \\{\\n+([\\t ]+)?([\\w\\[\\]])+? \\= )Getkey_Temp(\\(\\);\n([\\t ]+)?} while \\()",
|
||
|
"$1Getkey_Block$4"
|
||
|
);
|
||
|
main_c = main_c.replaceAll("Getkey_Temp\\(\\);", "Getkey_NoBlock();");
|
||
|
} else {
|
||
|
main_c = main_c.replaceAll("Getkey_Temp\\(\\);", "Getkey_Block();");
|
||
|
}*/
|
||
|
|
||
|
|
||
|
main_c += Functions.getFunctions();
|
||
|
|
||
|
IO.writeToFile(new File(path + "/main.c"), main_c, true);
|
||
|
|
||
|
//Syscalls asm file
|
||
|
|
||
|
/*writeToFile(new File(path + "syscalls.src"),
|
||
|
"\t.SECTION P,CODE,ALIGN=4\n\n"
|
||
|
+ "\t.MACRO SYSCALL FUNO, SYSCALLNAME, TAIL=nop\n\n"
|
||
|
+ "\t.export \\SYSCALLNAME'\n"
|
||
|
+ "\\SYSCALLNAME'\n"
|
||
|
+ "\tmov.l #h'\\FUNO, r0\n"
|
||
|
+ "\tmov.l #H'80010070, r2\n"
|
||
|
+ "\tjmp @r2\n"
|
||
|
+ "\t\\TAIL'\n"
|
||
|
+ "\t.ENDM\n\n"
|
||
|
+ "\tSYSCALL "
|
||
|
, true);*/
|
||
|
Syscalls.addSyscall("bcdToStr", "4F0");
|
||
|
Syscalls.addSyscall("intToBCD", "5A6");
|
||
|
Syscalls.addSyscall("calcExp", "645");
|
||
|
Syscalls.addSyscall("getAlphaVar", "4DF");
|
||
|
Syscalls.addSyscall("setAlphaVar", "4E0");
|
||
|
Syscalls.addSyscall("prgmGetkey", "6C4");
|
||
|
Syscalls.addSyscall("putMatrixCode", "24F");
|
||
|
//Syscalls.addSyscall("installTimer", "118");
|
||
|
//Syscalls.addSyscall("startTimer", "11A");
|
||
|
//Syscalls.addSyscall("uninstallTimer", "119");
|
||
|
Syscalls.addSyscall("putInternalItem", "82A");
|
||
|
Syscalls.addSyscall("deleteInternalItem", "835");
|
||
|
Syscalls.addSyscall("openItem", "83B");
|
||
|
Syscalls.addSyscall("getItemData", "372");
|
||
|
Syscalls.addSyscall("getItemSize", "840");
|
||
|
Syscalls.addSyscall("overwriteItemData", "830");
|
||
|
Syscalls.addSyscall("setSetupEntry", "4DD");
|
||
|
Syscalls.addSyscall("getSetupEntry", "4DC");
|
||
|
Syscalls.createSyscallFile();
|
||
|
|
||
|
String[] externalLibs = {"MonochromeLib.c", "MonochromeLib.h", "memory.c", "memory.h"};
|
||
|
for (int i = 0; i <= 1; i++) {
|
||
|
IO.writeToFile(new File(path+externalLibs[i]), IO.readFromRelativeFile(externalLibs[i]), true);
|
||
|
}
|
||
|
Header.addDefine("FALSE 0");
|
||
|
Header.addDefine("TRUE 1");
|
||
|
Header.addDefine("NO_ERROR 0");
|
||
|
Header.addDefine("MEMORY_ERROR 1");
|
||
|
Header.addDefine("INTERRUPTION_TIMER 2");
|
||
|
if (usesAcOnTimer) {
|
||
|
Header.addDefine("USES_INTERRUPTION_TIMER");
|
||
|
}
|
||
|
Header.addDefine("DIR_PROG 0x01");
|
||
|
Header.addDefine("DIR_LIST 0x05");
|
||
|
Header.addDefine("DIR_MAT 0x06");
|
||
|
Header.addDefine("DIR_PICT 0x07");
|
||
|
Header.addDefine("DIR_CAPT 0x0A");
|
||
|
|
||
|
Header.addDefine("LIST_START 0x10");
|
||
|
Header.addDefine("MAT_START 0x10");
|
||
|
|
||
|
Header.addDefine("SETUP_LISTFILE 0x2E");
|
||
|
|
||
|
Header.addDefine("free_str(x) if(!isString){free(x->data); free(x);}");
|
||
|
Header.addDefine("getDigit(BCDvar, i) (((i)%2) ? (*(BCDvar))[((i)+1)/2+1]>>4 : (*(BCDvar))[((i)+1)/2+1]&0x0F)");
|
||
|
Header.create();
|
||
|
|
||
|
System.out.println("Parsing done in " + (System.currentTimeMillis()-startTime) + " ms.");
|
||
|
if (!assureOS1Compatibility) {
|
||
|
System.out.println("WARNING: This program uses OS 2 functions. It won't run properly on the SDK emulator!");
|
||
|
}
|
||
|
}
|
||
|
}
|