#477 script config moved to TIC module
This commit is contained in:
parent
b26eb6bd1c
commit
1280a1291a
94
src/code.c
94
src/code.c
|
@ -194,79 +194,7 @@ static inline bool islineend(char c) {return c == '\n' || c == '\0';}
|
||||||
static inline bool isalpha_(char c) {return isalpha(c) || c == '_';}
|
static inline bool isalpha_(char c) {return isalpha(c) || c == '_';}
|
||||||
static inline bool isalnum_(char c) {return isalnum(c) || c == '_';}
|
static inline bool isalnum_(char c) {return isalnum(c) || c == '_';}
|
||||||
|
|
||||||
typedef struct
|
static void parse(const char* start, u8* color, const tic_script_config* config)
|
||||||
{
|
|
||||||
const char* blockCommentStart;
|
|
||||||
const char* blockCommentEnd;
|
|
||||||
const char* blockStringStart;
|
|
||||||
const char* blockStringEnd;
|
|
||||||
const char* singleCommentStart;
|
|
||||||
|
|
||||||
const char* const * keywords;
|
|
||||||
s32 keywordsCount;
|
|
||||||
} SyntaxConfig;
|
|
||||||
|
|
||||||
static const char* const LuaKeywords [] =
|
|
||||||
{
|
|
||||||
"and", "break", "do", "else", "elseif",
|
|
||||||
"end", "false", "for", "function", "goto", "if",
|
|
||||||
"in", "local", "nil", "not", "or", "repeat",
|
|
||||||
"return", "then", "true", "until", "while"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const SyntaxConfig LuaSyntaxConfig =
|
|
||||||
{
|
|
||||||
.blockCommentStart = "--[[",
|
|
||||||
.blockCommentEnd = "]]",
|
|
||||||
.singleCommentStart = "--",
|
|
||||||
.blockStringStart = "[[",
|
|
||||||
.blockStringEnd = "]]",
|
|
||||||
.keywords = LuaKeywords,
|
|
||||||
.keywordsCount = COUNT_OF(LuaKeywords),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* const MoonKeywords [] =
|
|
||||||
{
|
|
||||||
"false", "true", "nil", "return",
|
|
||||||
"break", "continue", "for", "while",
|
|
||||||
"if", "else", "elseif", "unless", "switch",
|
|
||||||
"when", "and", "or", "in", "do",
|
|
||||||
"not", "super", "try", "catch",
|
|
||||||
"with", "export", "import", "then",
|
|
||||||
"from", "class", "extends", "new"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const SyntaxConfig MoonSyntaxConfig =
|
|
||||||
{
|
|
||||||
.blockCommentStart = NULL,
|
|
||||||
.blockCommentEnd = NULL,
|
|
||||||
.blockStringStart = NULL,
|
|
||||||
.blockStringEnd = NULL,
|
|
||||||
.singleCommentStart = "--",
|
|
||||||
.keywords = MoonKeywords,
|
|
||||||
.keywordsCount = COUNT_OF(MoonKeywords),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* const JsKeywords [] =
|
|
||||||
{
|
|
||||||
"break", "do", "instanceof", "typeof", "case", "else", "new",
|
|
||||||
"var", "catch", "finally", "return", "void", "continue", "for",
|
|
||||||
"switch", "while", "debugger", "function", "this", "with",
|
|
||||||
"default", "if", "throw", "delete", "in", "try", "const"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const SyntaxConfig JsSyntaxConfig =
|
|
||||||
{
|
|
||||||
.blockCommentStart = "/*",
|
|
||||||
.blockCommentEnd = "*/",
|
|
||||||
.blockStringStart = NULL,
|
|
||||||
.blockStringEnd = NULL,
|
|
||||||
.singleCommentStart = "//",
|
|
||||||
.keywords = JsKeywords,
|
|
||||||
.keywordsCount = COUNT_OF(JsKeywords),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void parse(const char* start, u8* color, const SyntaxConfig* config)
|
|
||||||
{
|
{
|
||||||
const char* ptr = start;
|
const char* ptr = start;
|
||||||
|
|
||||||
|
@ -412,10 +340,10 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config)
|
||||||
ptr++;
|
ptr++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if(config->singleCommentStart && memcmp(ptr, config->singleCommentStart, strlen(config->singleCommentStart)) == 0)
|
else if(config->singleComment && memcmp(ptr, config->singleComment, strlen(config->singleComment)) == 0)
|
||||||
{
|
{
|
||||||
singleCommentStart = ptr;
|
singleCommentStart = ptr;
|
||||||
ptr += strlen(config->singleCommentStart);
|
ptr += strlen(config->singleComment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if(isalpha_(c))
|
else if(isalpha_(c))
|
||||||
|
@ -444,12 +372,9 @@ static void parseSyntaxColor(Code* code)
|
||||||
{
|
{
|
||||||
memset(code->colorBuffer, getConfig()->theme.code.var, sizeof(code->colorBuffer));
|
memset(code->colorBuffer, getConfig()->theme.code.var, sizeof(code->colorBuffer));
|
||||||
|
|
||||||
switch(code->tic->api.get_script(code->tic))
|
tic_mem* tic = code->tic;
|
||||||
{
|
|
||||||
case tic_script_moon: parse(code->src, code->colorBuffer, &MoonSyntaxConfig); break;
|
parse(code->src, code->colorBuffer, tic->api.get_script_config(tic));
|
||||||
case tic_script_lua: parse(code->src, code->colorBuffer, &LuaSyntaxConfig); break;
|
|
||||||
case tic_script_js: parse(code->src, code->colorBuffer, &JsSyntaxConfig); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* getLineByPos(Code* code, char* pos)
|
static char* getLineByPos(Code* code, char* pos)
|
||||||
|
@ -1124,7 +1049,7 @@ static void setOutlineMode(Code* code)
|
||||||
code->outline.index = 0;
|
code->outline.index = 0;
|
||||||
memset(code->outline.items, 0, OUTLINE_ITEMS_SIZE);
|
memset(code->outline.items, 0, OUTLINE_ITEMS_SIZE);
|
||||||
|
|
||||||
code->tic->api.get_script(code->tic) == tic_script_moon
|
code->tic->api.get_script_config(code->tic)->lang == tic_script_moon
|
||||||
? setMoonscriptOutlineMode(code)
|
? setMoonscriptOutlineMode(code)
|
||||||
: setLuaOutlineMode(code);
|
: setLuaOutlineMode(code);
|
||||||
|
|
||||||
|
@ -1158,7 +1083,10 @@ static void commentLine(Code* code)
|
||||||
static char Comment[] = "-- ";
|
static char Comment[] = "-- ";
|
||||||
enum {Size = sizeof Comment-1};
|
enum {Size = sizeof Comment-1};
|
||||||
|
|
||||||
strcpy(Comment, code->tic->api.get_script(code->tic) == tic_script_js ? "// " : "-- ");
|
tic_mem* tic = code->tic;
|
||||||
|
|
||||||
|
memcpy(Comment, tic->api.get_script_config(tic)->singleComment,
|
||||||
|
strlen(tic->api.get_script_config(tic)->singleComment));
|
||||||
|
|
||||||
char* line = getLine(code);
|
char* line = getLine(code);
|
||||||
|
|
||||||
|
|
52
src/jsapi.c
52
src/jsapi.c
|
@ -27,8 +27,10 @@
|
||||||
|
|
||||||
static const char TicMachine[] = "_TIC80";
|
static const char TicMachine[] = "_TIC80";
|
||||||
|
|
||||||
void closeJavascript(tic_machine* machine)
|
static void closeJavascript(tic_mem* tic)
|
||||||
{
|
{
|
||||||
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
if(machine->js)
|
if(machine->js)
|
||||||
{
|
{
|
||||||
duk_destroy_heap(machine->js);
|
duk_destroy_heap(machine->js);
|
||||||
|
@ -775,7 +777,7 @@ s32 duk_timeout_check(void* udata)
|
||||||
|
|
||||||
static void initDuktape(tic_machine* machine)
|
static void initDuktape(tic_machine* machine)
|
||||||
{
|
{
|
||||||
closeJavascript(machine);
|
closeJavascript((tic_mem*)machine);
|
||||||
|
|
||||||
duk_context* duk = machine->js = duk_create_heap(NULL, NULL, NULL, machine, NULL);
|
duk_context* duk = machine->js = duk_create_heap(NULL, NULL, NULL, machine, NULL);
|
||||||
|
|
||||||
|
@ -794,8 +796,10 @@ static void initDuktape(tic_machine* machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool initJavascript(tic_machine* machine, const char* code)
|
static bool initJavascript(tic_mem* tic, const char* code)
|
||||||
{
|
{
|
||||||
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
initDuktape(machine);
|
initDuktape(machine);
|
||||||
duk_context* duktape = machine->js;
|
duk_context* duktape = machine->js;
|
||||||
|
|
||||||
|
@ -809,8 +813,10 @@ bool initJavascript(tic_machine* machine, const char* code)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void callJavascriptTick(tic_machine* machine)
|
static void callJavascriptTick(tic_mem* tic)
|
||||||
{
|
{
|
||||||
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
const char* TicFunc = ApiKeywords[0];
|
const char* TicFunc = ApiKeywords[0];
|
||||||
|
|
||||||
duk_context* duk = machine->js;
|
duk_context* duk = machine->js;
|
||||||
|
@ -832,7 +838,7 @@ void callJavascriptTick(tic_machine* machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
|
static void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
|
||||||
{
|
{
|
||||||
tic_machine* machine = (tic_machine*)memory;
|
tic_machine* machine = (tic_machine*)memory;
|
||||||
duk_context* duk = machine->js;
|
duk_context* duk = machine->js;
|
||||||
|
@ -853,7 +859,7 @@ void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
|
||||||
else duk_pop(duk);
|
else duk_pop(duk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void callJavascriptOverlap(tic_mem* memory, void* data)
|
static void callJavascriptOverlap(tic_mem* memory, void* data)
|
||||||
{
|
{
|
||||||
tic_machine* machine = (tic_machine*)memory;
|
tic_machine* machine = (tic_machine*)memory;
|
||||||
duk_context* duk = machine->js;
|
duk_context* duk = machine->js;
|
||||||
|
@ -870,4 +876,36 @@ void callJavascriptOverlap(tic_mem* memory, void* data)
|
||||||
else duk_pop(duk);
|
else duk_pop(duk);
|
||||||
}
|
}
|
||||||
else duk_pop(duk);
|
else duk_pop(duk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* const JsKeywords [] =
|
||||||
|
{
|
||||||
|
"break", "do", "instanceof", "typeof", "case", "else", "new",
|
||||||
|
"var", "catch", "finally", "return", "void", "continue", "for",
|
||||||
|
"switch", "while", "debugger", "function", "this", "with",
|
||||||
|
"default", "if", "throw", "delete", "in", "try", "const"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const tic_script_config JsSyntaxConfig =
|
||||||
|
{
|
||||||
|
.lang = tic_script_js,
|
||||||
|
|
||||||
|
.init = initJavascript,
|
||||||
|
.close = closeJavascript,
|
||||||
|
.tick = callJavascriptTick,
|
||||||
|
.scanline = callJavascriptScanline,
|
||||||
|
.overlap = callJavascriptOverlap,
|
||||||
|
|
||||||
|
.blockCommentStart = "/*",
|
||||||
|
.blockCommentEnd = "*/",
|
||||||
|
.blockStringStart = NULL,
|
||||||
|
.blockStringEnd = NULL,
|
||||||
|
.singleComment = "//",
|
||||||
|
.keywords = JsKeywords,
|
||||||
|
.keywordsCount = COUNT_OF(JsKeywords),
|
||||||
|
};
|
||||||
|
|
||||||
|
const tic_script_config* getJsScriptConfig()
|
||||||
|
{
|
||||||
|
return &JsSyntaxConfig;
|
||||||
|
}
|
||||||
|
|
98
src/luaapi.c
98
src/luaapi.c
|
@ -1114,8 +1114,10 @@ static void initAPI(tic_machine* machine)
|
||||||
lua_sethook(machine->lua, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK);
|
lua_sethook(machine->lua, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeLua(tic_machine* machine)
|
static void closeLua(tic_mem* tic)
|
||||||
{
|
{
|
||||||
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
if(machine->lua)
|
if(machine->lua)
|
||||||
{
|
{
|
||||||
lua_close(machine->lua);
|
lua_close(machine->lua);
|
||||||
|
@ -1123,27 +1125,21 @@ void closeLua(tic_machine* machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool initLua(tic_machine* machine, const char* code)
|
static bool initLua(tic_mem* tic, const char* code)
|
||||||
{
|
{
|
||||||
closeLua(machine);
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
|
closeLua(tic);
|
||||||
|
|
||||||
lua_State* lua = machine->lua = luaL_newstate();
|
lua_State* lua = machine->lua = luaL_newstate();
|
||||||
|
|
||||||
static const luaL_Reg loadedlibs[] =
|
static const luaL_Reg loadedlibs[] =
|
||||||
{
|
{
|
||||||
{ "_G", luaopen_base },
|
{ "_G", luaopen_base },
|
||||||
//{ LUA_LOADLIBNAME, luaopen_package },
|
|
||||||
{ LUA_COLIBNAME, luaopen_coroutine },
|
{ LUA_COLIBNAME, luaopen_coroutine },
|
||||||
{ LUA_TABLIBNAME, luaopen_table },
|
{ LUA_TABLIBNAME, luaopen_table },
|
||||||
// {LUA_IOLIBNAME, luaopen_io},
|
|
||||||
// {LUA_OSLIBNAME, luaopen_os},
|
|
||||||
{ LUA_STRLIBNAME, luaopen_string },
|
{ LUA_STRLIBNAME, luaopen_string },
|
||||||
{ LUA_MATHLIBNAME, luaopen_math },
|
{ LUA_MATHLIBNAME, luaopen_math },
|
||||||
// {LUA_UTF8LIBNAME, luaopen_utf8},
|
|
||||||
//{ LUA_DBLIBNAME, luaopen_debug },
|
|
||||||
// #if defined(LUA_COMPAT_BITLIB)
|
|
||||||
// {LUA_BITLIBNAME, luaopen_bit32},
|
|
||||||
// #endif
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1181,9 +1177,10 @@ static const char* execute_moonscript_src = MOON_CODE(
|
||||||
return fn()
|
return fn()
|
||||||
);
|
);
|
||||||
|
|
||||||
bool initMoonscript(tic_machine* machine, const char* code)
|
static bool initMoonscript(tic_mem* tic, const char* code)
|
||||||
{
|
{
|
||||||
closeLua(machine);
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
closeLua(tic);
|
||||||
|
|
||||||
lua_State* lua = machine->lua = luaL_newstate();
|
lua_State* lua = machine->lua = luaL_newstate();
|
||||||
|
|
||||||
|
@ -1245,8 +1242,10 @@ bool initMoonscript(tic_machine* machine, const char* code)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void callLuaTick(tic_machine* machine)
|
static void callLuaTick(tic_mem* tic)
|
||||||
{
|
{
|
||||||
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
const char* TicFunc = ApiKeywords[0];
|
const char* TicFunc = ApiKeywords[0];
|
||||||
|
|
||||||
lua_State* lua = machine->lua;
|
lua_State* lua = machine->lua;
|
||||||
|
@ -1267,7 +1266,7 @@ void callLuaTick(tic_machine* machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void callLuaScanline(tic_mem* memory, s32 row, void* data)
|
static void callLuaScanline(tic_mem* memory, s32 row, void* data)
|
||||||
{
|
{
|
||||||
tic_machine* machine = (tic_machine*)memory;
|
tic_machine* machine = (tic_machine*)memory;
|
||||||
lua_State* lua = machine->lua;
|
lua_State* lua = machine->lua;
|
||||||
|
@ -1287,7 +1286,7 @@ void callLuaScanline(tic_mem* memory, s32 row, void* data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void callLuaOverlap(tic_mem* memory, void* data)
|
static void callLuaOverlap(tic_mem* memory, void* data)
|
||||||
{
|
{
|
||||||
tic_machine* machine = (tic_machine*)memory;
|
tic_machine* machine = (tic_machine*)memory;
|
||||||
lua_State* lua = machine->lua;
|
lua_State* lua = machine->lua;
|
||||||
|
@ -1306,3 +1305,70 @@ void callLuaOverlap(tic_mem* memory, void* data)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* const LuaKeywords [] =
|
||||||
|
{
|
||||||
|
"and", "break", "do", "else", "elseif",
|
||||||
|
"end", "false", "for", "function", "goto", "if",
|
||||||
|
"in", "local", "nil", "not", "or", "repeat",
|
||||||
|
"return", "then", "true", "until", "while"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const tic_script_config LuaSyntaxConfig =
|
||||||
|
{
|
||||||
|
.lang = tic_script_lua,
|
||||||
|
|
||||||
|
.init = initLua,
|
||||||
|
.close = closeLua,
|
||||||
|
.tick = callLuaTick,
|
||||||
|
.scanline = callLuaScanline,
|
||||||
|
.overlap = callLuaOverlap,
|
||||||
|
|
||||||
|
.blockCommentStart = "--[[",
|
||||||
|
.blockCommentEnd = "]]",
|
||||||
|
.singleComment = "--",
|
||||||
|
.blockStringStart = "[[",
|
||||||
|
.blockStringEnd = "]]",
|
||||||
|
.keywords = LuaKeywords,
|
||||||
|
.keywordsCount = COUNT_OF(LuaKeywords),
|
||||||
|
};
|
||||||
|
|
||||||
|
const tic_script_config* getLuaScriptConfig()
|
||||||
|
{
|
||||||
|
return &LuaSyntaxConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* const MoonKeywords [] =
|
||||||
|
{
|
||||||
|
"false", "true", "nil", "return",
|
||||||
|
"break", "continue", "for", "while",
|
||||||
|
"if", "else", "elseif", "unless", "switch",
|
||||||
|
"when", "and", "or", "in", "do",
|
||||||
|
"not", "super", "try", "catch",
|
||||||
|
"with", "export", "import", "then",
|
||||||
|
"from", "class", "extends", "new"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const tic_script_config MoonSyntaxConfig =
|
||||||
|
{
|
||||||
|
.lang = tic_script_moon,
|
||||||
|
|
||||||
|
.init = initMoonscript,
|
||||||
|
.close = closeLua,
|
||||||
|
.tick = callLuaTick,
|
||||||
|
.scanline = callLuaScanline,
|
||||||
|
.overlap = callLuaOverlap,
|
||||||
|
|
||||||
|
.blockCommentStart = NULL,
|
||||||
|
.blockCommentEnd = NULL,
|
||||||
|
.blockStringStart = NULL,
|
||||||
|
.blockStringEnd = NULL,
|
||||||
|
.singleComment = "--",
|
||||||
|
.keywords = MoonKeywords,
|
||||||
|
.keywordsCount = COUNT_OF(MoonKeywords),
|
||||||
|
};
|
||||||
|
|
||||||
|
const tic_script_config* getMoonScriptConfig()
|
||||||
|
{
|
||||||
|
return &MoonSyntaxConfig;
|
||||||
|
}
|
|
@ -82,6 +82,7 @@ typedef struct
|
||||||
Channel channels[TIC_SOUND_CHANNELS];
|
Channel channels[TIC_SOUND_CHANNELS];
|
||||||
} music;
|
} music;
|
||||||
|
|
||||||
|
tic_tick tick;
|
||||||
tic_scanline scanline;
|
tic_scanline scanline;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
@ -142,18 +143,6 @@ s32 drawText(tic_mem* memory, const char* text, s32 x, s32 y, s32 width, s32 hei
|
||||||
s32 drawSpriteFont(tic_mem* memory, u8 symbol, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
|
s32 drawSpriteFont(tic_mem* memory, u8 symbol, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
|
||||||
s32 drawFixedSpriteFont(tic_mem* memory, u8 index, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
|
s32 drawFixedSpriteFont(tic_mem* memory, u8 index, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
|
||||||
|
|
||||||
void closeLua(tic_machine* machine);
|
const tic_script_config* getLuaScriptConfig();
|
||||||
void closeJavascript(tic_machine* machine);
|
const tic_script_config* getMoonScriptConfig();
|
||||||
|
const tic_script_config* getJsScriptConfig();
|
||||||
bool initMoonscript(tic_machine* machine, const char* code);
|
|
||||||
bool initLua(tic_machine* machine, const char* code);
|
|
||||||
bool initJavascript(tic_machine* machine, const char* code);
|
|
||||||
|
|
||||||
void callLuaTick(tic_machine* machine);
|
|
||||||
void callJavascriptTick(tic_machine* machine);
|
|
||||||
|
|
||||||
void callLuaScanline(tic_mem* memory, s32 row, void* data);
|
|
||||||
void callJavascriptScanline(tic_mem* memory, s32 row, void* data);
|
|
||||||
|
|
||||||
void callLuaOverlap(tic_mem* memory, void* data);
|
|
||||||
void callJavascriptOverlap(tic_mem* memory, void* data);
|
|
||||||
|
|
70
src/tic.c
70
src/tic.c
|
@ -559,8 +559,10 @@ void tic_close(tic_mem* memory)
|
||||||
|
|
||||||
machine->state.initialized = false;
|
machine->state.initialized = false;
|
||||||
|
|
||||||
closeJavascript(machine);
|
getLuaScriptConfig()->close(memory);
|
||||||
closeLua(machine);
|
getMoonScriptConfig()->close(memory);
|
||||||
|
getJsScriptConfig()->close(memory);
|
||||||
|
|
||||||
blip_delete(machine->blip);
|
blip_delete(machine->blip);
|
||||||
|
|
||||||
free(memory->samples.buffer);
|
free(memory->samples.buffer);
|
||||||
|
@ -1500,13 +1502,19 @@ static bool isJavascript(const char* code)
|
||||||
return compareMetatag(code, "script", "js") || compareMetatag(code, "script", "javascript");
|
return compareMetatag(code, "script", "js") || compareMetatag(code, "script", "javascript");
|
||||||
}
|
}
|
||||||
|
|
||||||
static tic_script_lang api_get_script(tic_mem* memory)
|
static const tic_script_config* getScriptConfig(const char* code)
|
||||||
{
|
{
|
||||||
if(isMoonscript(memory->cart.bank0.code.data)) return tic_script_moon;
|
if(isMoonscript(code)) return getMoonScriptConfig();
|
||||||
if(isJavascript(memory->cart.bank0.code.data)) return tic_script_js;
|
if(isJavascript(code)) return getJsScriptConfig();
|
||||||
return tic_script_lua;
|
return getLuaScriptConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const tic_script_config* api_get_script_config(tic_mem* memory)
|
||||||
|
{
|
||||||
|
return getScriptConfig(memory->cart.bank0.code.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void updateSaveid(tic_mem* memory)
|
static void updateSaveid(tic_mem* memory)
|
||||||
{
|
{
|
||||||
memset(memory->saveid, 0, sizeof memory->saveid);
|
memset(memory->saveid, 0, sizeof memory->saveid);
|
||||||
|
@ -1527,9 +1535,9 @@ static void updateSaveid(tic_mem* memory)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void api_tick(tic_mem* memory, tic_tick_data* data)
|
static void api_tick(tic_mem* tic, tic_tick_data* data)
|
||||||
{
|
{
|
||||||
tic_machine* machine = (tic_machine*)memory;
|
tic_machine* machine = (tic_machine*)tic;
|
||||||
|
|
||||||
machine->data = data;
|
machine->data = data;
|
||||||
|
|
||||||
|
@ -1544,7 +1552,7 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
|
||||||
|
|
||||||
for(s32 i = TIC_BANKS - 1; i >= 0; i--)
|
for(s32 i = TIC_BANKS - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
const char* bankCode = memory->cart.banks[i].code.data;
|
const char* bankCode = tic->cart.banks[i].code.data;
|
||||||
|
|
||||||
if(strlen(bankCode))
|
if(strlen(bankCode))
|
||||||
strcat(code, bankCode);
|
strcat(code, bankCode);
|
||||||
|
@ -1554,35 +1562,18 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
|
||||||
data->preprocessor(data->data, code);
|
data->preprocessor(data->data, code);
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
const tic_script_config* config = NULL;
|
||||||
|
|
||||||
if(strlen(code))
|
if(strlen(code))
|
||||||
{
|
{
|
||||||
cart2ram(memory);
|
cart2ram(tic);
|
||||||
memory->input = compareMetatag(code, "input", "mouse") ? tic_mouse_input : tic_gamepad_input;
|
tic->input = compareMetatag(code, "input", "mouse") ? tic_mouse_input : tic_gamepad_input;
|
||||||
|
|
||||||
if(memory->input == tic_mouse_input)
|
if(tic->input == tic_mouse_input)
|
||||||
memory->ram.vram.vars.mask.data = 0;
|
tic->ram.vram.vars.mask.data = 0;
|
||||||
|
|
||||||
memory->script = tic_script_lua;
|
config = getScriptConfig(code);
|
||||||
|
done = config->init(tic, code);
|
||||||
if (isMoonscript(code))
|
|
||||||
{
|
|
||||||
if(initMoonscript(machine, code))
|
|
||||||
{
|
|
||||||
memory->script = tic_script_moon;
|
|
||||||
done = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(isJavascript(code))
|
|
||||||
{
|
|
||||||
if(initJavascript(machine, code))
|
|
||||||
{
|
|
||||||
memory->script = tic_script_js;
|
|
||||||
done = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(initLua(machine, code))
|
|
||||||
done = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1595,17 +1586,17 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
|
||||||
{
|
{
|
||||||
data->start = data->counter();
|
data->start = data->counter();
|
||||||
|
|
||||||
machine->state.scanline = memory->script == tic_script_js ? callJavascriptScanline : callLuaScanline;
|
machine->state.tick = config->tick;
|
||||||
machine->state.ovr.callback = memory->script == tic_script_js ? callJavascriptOverlap : callLuaOverlap;
|
machine->state.scanline = config->scanline;
|
||||||
|
machine->state.ovr.callback = config->overlap;
|
||||||
|
|
||||||
machine->state.initialized = true;
|
machine->state.initialized = true;
|
||||||
}
|
}
|
||||||
else return;
|
else return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memory->script == tic_script_js
|
machine->state.tick(tic);
|
||||||
? callJavascriptTick(machine)
|
|
||||||
: callLuaTick(machine);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void api_scanline(tic_mem* memory, s32 row, void* data)
|
static void api_scanline(tic_mem* memory, s32 row, void* data)
|
||||||
|
@ -1877,7 +1868,6 @@ static void initApi(tic_api* api)
|
||||||
INIT_API(reset);
|
INIT_API(reset);
|
||||||
INIT_API(pause);
|
INIT_API(pause);
|
||||||
INIT_API(resume);
|
INIT_API(resume);
|
||||||
INIT_API(get_script);
|
|
||||||
INIT_API(sync);
|
INIT_API(sync);
|
||||||
INIT_API(btnp);
|
INIT_API(btnp);
|
||||||
INIT_API(load);
|
INIT_API(load);
|
||||||
|
@ -1886,6 +1876,8 @@ static void initApi(tic_api* api)
|
||||||
INIT_API(tick_end);
|
INIT_API(tick_end);
|
||||||
INIT_API(blit);
|
INIT_API(blit);
|
||||||
|
|
||||||
|
INIT_API(get_script_config);
|
||||||
|
|
||||||
#undef INIT_API
|
#undef INIT_API
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
src/ticapi.h
28
src/ticapi.h
|
@ -64,9 +64,34 @@ typedef struct
|
||||||
} tic_tick_data;
|
} tic_tick_data;
|
||||||
|
|
||||||
typedef struct tic_mem tic_mem;
|
typedef struct tic_mem tic_mem;
|
||||||
|
typedef void(*tic_tick)(tic_mem* memory);
|
||||||
typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data);
|
typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data);
|
||||||
typedef void(*tic_overlap)(tic_mem* memory, void* data);
|
typedef void(*tic_overlap)(tic_mem* memory, void* data);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
tic_script_lang lang;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
bool(*init)(tic_mem* memory, const char* code);
|
||||||
|
void(*close)(tic_mem* memory);
|
||||||
|
|
||||||
|
tic_tick tick;
|
||||||
|
tic_scanline scanline;
|
||||||
|
tic_overlap overlap;
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* blockCommentStart;
|
||||||
|
const char* blockCommentEnd;
|
||||||
|
const char* blockStringStart;
|
||||||
|
const char* blockStringEnd;
|
||||||
|
const char* singleComment;
|
||||||
|
|
||||||
|
const char* const * keywords;
|
||||||
|
s32 keywordsCount;
|
||||||
|
} tic_script_config;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
s32 (*draw_char) (tic_mem* memory, u8 symbol, s32 x, s32 y, u8 color);
|
s32 (*draw_char) (tic_mem* memory, u8 symbol, s32 x, s32 y, u8 color);
|
||||||
|
@ -113,7 +138,7 @@ typedef struct
|
||||||
void (*tick_end) (tic_mem* memory);
|
void (*tick_end) (tic_mem* memory);
|
||||||
void (*blit) (tic_mem* tic, tic_scanline scanline, tic_overlap overlap, void* data);
|
void (*blit) (tic_mem* tic, tic_scanline scanline, tic_overlap overlap, void* data);
|
||||||
|
|
||||||
tic_script_lang (*get_script)(tic_mem* memory);
|
const tic_script_config* (*get_script_config)(tic_mem* memory);
|
||||||
} tic_api;
|
} tic_api;
|
||||||
|
|
||||||
struct tic_mem
|
struct tic_mem
|
||||||
|
@ -122,7 +147,6 @@ struct tic_mem
|
||||||
tic_cartridge cart;
|
tic_cartridge cart;
|
||||||
tic_cartridge config;
|
tic_cartridge config;
|
||||||
tic_input_method input;
|
tic_input_method input;
|
||||||
tic_script_lang script;
|
|
||||||
tic_font font;
|
tic_font font;
|
||||||
tic_api api;
|
tic_api api;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue