2016-09-22 19:11:56 +01:00
|
|
|
/**
|
2016-09-22 19:30:56 +01:00
|
|
|
* Copyright (c) 2016 rxi
|
2014-06-13 21:01:19 +01:00
|
|
|
*
|
|
|
|
|
* This library is free software; you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the MIT license. See LICENSE for details.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
#include <dos.h>
|
|
|
|
|
|
|
|
|
|
#include "lib/dmt/dmt.h"
|
|
|
|
|
#include "vga.h"
|
|
|
|
|
#include "luaobj.h"
|
|
|
|
|
#include "keyboard.h"
|
2016-09-29 19:22:29 +01:00
|
|
|
#include "filesystem.h"
|
2016-09-24 10:41:12 +01:00
|
|
|
#include "mouse.h"
|
2014-06-13 21:01:19 +01:00
|
|
|
#include "image.h"
|
2016-09-22 19:11:56 +01:00
|
|
|
#include "palette.h"
|
2014-06-13 21:01:19 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
static lua_State *L;
|
|
|
|
|
|
|
|
|
|
static void deinit(void) {
|
|
|
|
|
/* Deinit and clear up everything. Called at exit */
|
|
|
|
|
vga_deinit();
|
|
|
|
|
keyboard_deinit();
|
|
|
|
|
lua_close(L);
|
2016-09-29 19:22:29 +01:00
|
|
|
filesystem_deinit();
|
2014-06-13 21:01:19 +01:00
|
|
|
dmt_dump(stdout);
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-29 19:22:29 +01:00
|
|
|
|
2014-06-14 16:27:42 +01:00
|
|
|
static int onLuaPanic(lua_State *L) {
|
|
|
|
|
vga_deinit();
|
|
|
|
|
const char *err = lua_tostring(L, -1);
|
|
|
|
|
printf("lua panic: %s\n", err);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-13 21:01:19 +01:00
|
|
|
|
|
|
|
|
int luaopen_love(lua_State *L);
|
|
|
|
|
|
2016-09-29 20:36:16 +01:00
|
|
|
int main(int argc, char **argv) {
|
2014-06-13 21:01:19 +01:00
|
|
|
|
|
|
|
|
/* Init everything */
|
|
|
|
|
atexit(deinit);
|
2016-09-29 19:22:29 +01:00
|
|
|
filesystem_mount("."); /* Mount cwd: temporary */
|
2014-06-13 21:01:19 +01:00
|
|
|
vga_init();
|
2016-09-22 19:11:56 +01:00
|
|
|
palette_init();
|
2014-06-13 21:01:19 +01:00
|
|
|
keyboard_init();
|
2016-09-24 10:41:12 +01:00
|
|
|
mouse_init();
|
2014-06-13 21:01:19 +01:00
|
|
|
|
|
|
|
|
/* Init lua */
|
|
|
|
|
L = luaL_newstate();
|
2014-06-14 16:27:42 +01:00
|
|
|
lua_atpanic(L, onLuaPanic);
|
2014-06-13 21:01:19 +01:00
|
|
|
luaL_openlibs(L);
|
|
|
|
|
luaL_requiref(L, "love", luaopen_love, 1);
|
|
|
|
|
|
2016-09-29 20:36:16 +01:00
|
|
|
/* Create `love.argv` and fill with arguments */
|
|
|
|
|
lua_getglobal(L, "love");
|
|
|
|
|
if (!lua_isnil(L, -1)) {
|
|
|
|
|
lua_newtable(L);
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < argc; i++) {
|
|
|
|
|
lua_pushstring(L, argv[i]);
|
|
|
|
|
lua_rawseti(L, -2, i + 1);
|
|
|
|
|
}
|
|
|
|
|
lua_setfield(L, -2, "argv");
|
|
|
|
|
}
|
|
|
|
|
lua_pop(L, 1);
|
|
|
|
|
|
|
|
|
|
/* Init embedded scripts */
|
2016-09-29 20:06:43 +01:00
|
|
|
#include "boot_lua.h"
|
|
|
|
|
int err = luaL_loadbuffer(L, boot_lua, sizeof(boot_lua) - 1, "boot.lua");
|
2016-09-23 20:56:55 +01:00
|
|
|
|
|
|
|
|
if (err || lua_pcall(L, 0, 0, 0)) {
|
2014-06-13 21:01:19 +01:00
|
|
|
vga_deinit();
|
|
|
|
|
const char *err = lua_tostring(L, -1);
|
2016-09-23 20:56:55 +01:00
|
|
|
printf("Error\n%s\n", err);
|
2014-06-13 21:01:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
2016-09-22 19:11:56 +01:00
|
|
|
}
|