• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdlib.h>
2 #include <string.h>
3 
4 #include "lua.h"
5 #include "lauxlib.h"
6 #include "lualib.h"
7 #include "../../include/console.h"
8 #include "../../lib/sys/vesa/vesa.h"
9 #include "../../lib/sys/vesa/video.h"
10 
11 int vesacon_load_background(const char *filename);
12 
vesa_getmodes(lua_State * L)13 static int vesa_getmodes(lua_State *L)
14 {
15   com32sys_t rm;
16   uint16_t mode, *mode_ptr;
17   struct vesa_general_info *gi;
18   struct vesa_mode_info *mi;
19   int nmode = 1;
20   int rv = -1;
21 
22   gi = lmalloc(sizeof *gi);
23   if (!gi)
24       return -1;
25 
26   mi = lmalloc(sizeof *mi);
27   if (!mi)
28       goto out;
29 
30   memset(&rm, 0, sizeof(rm));
31   memset(gi, 0, sizeof *gi);
32 
33   gi->signature = VBE2_MAGIC;   /* Get VBE2 extended data */
34   rm.eax.w[0] = 0x4F00;         /* Get SVGA general information */
35   rm.edi.w[0] = OFFS(gi);
36   rm.es      = SEG(gi);
37   __intcall(0x10, &rm, &rm);
38 
39   if ( rm.eax.w[0] != 0x004F )
40     goto out;                   /* Function call failed */
41   if ( gi->signature != VESA_MAGIC ) {
42     rv = -2;                   /* No magic */
43     goto out;
44   }
45   if ( gi->version < 0x0102 ) {
46     rv = -3;                   /* VESA 1.2+ required */
47     goto out;
48   }
49 
50   lua_newtable(L);      /* list of modes */
51 
52   /* Copy general info */
53   memcpy(&__vesa_info.gi, gi, sizeof *gi);
54 
55   /* Search for a 640x480 mode with a suitable color and memory model... */
56 
57   mode_ptr = GET_PTR(gi->video_mode_ptr);
58 
59   while ((mode = *mode_ptr++) != 0xFFFF) {
60     mode &= 0x1FF;              /* The rest are attributes of sorts */
61 
62     printf("Found mode: 0x%04x (%dx%dx%d)\n", mode, mi->h_res, mi->v_res, mi->bpp);
63 
64     memset(&rm, 0, sizeof(rm));
65     memset(mi, 0, sizeof *mi);
66     rm.eax.w[0] = 0x4F01;       /* Get SVGA mode information */
67     rm.ecx.w[0] = mode;
68     rm.edi.w[0] = OFFS(mi);
69     rm.es  = SEG(mi);
70     __intcall(0x10, &rm, &rm);
71 
72     /* Must be a supported mode */
73     if ( rm.eax.w[0] != 0x004f )
74       continue;
75 
76     lua_pushnumber(L, nmode++);
77     lua_newtable(L); /* mode info */
78 
79     lua_pushstring(L, "mode");
80     lua_pushnumber(L, mode);
81     lua_settable(L,-3);
82 
83     lua_pushstring(L, "hres");
84     lua_pushnumber(L, mi->h_res);
85     lua_settable(L,-3);
86 
87     lua_pushstring(L, "vres");
88     lua_pushnumber(L, mi->v_res);
89     lua_settable(L,-3);
90 
91     lua_pushstring(L, "bpp");
92     lua_pushnumber(L, mi->bpp);
93     lua_settable(L,-3);
94 
95     lua_settable(L, -3); /* add to mode list */
96 
97   }
98 
99   rv = 1;
100 out:
101   lfree(mi);
102   lfree(gi);
103   return rv;
104 }
105 
106 
vesa_setmode(lua_State * L)107 static int vesa_setmode(lua_State *L)
108 {
109   /* Preventing GCC to complain about unused L*/
110   L=L;
111   openconsole(&dev_rawcon_r, &dev_vesaserial_w);
112 
113   return 0;
114 }
115 
116 
vesa_load_background(lua_State * L)117 static int vesa_load_background(lua_State *L)
118 {
119   const char *filename = luaL_checkstring(L, 1);
120 
121   vesacon_load_background(filename);
122 
123   return 0;
124 }
125 
126 static const luaL_Reg vesalib[] = {
127   {"getmodes", vesa_getmodes},
128   {"setmode", vesa_setmode},
129   {"load_background", vesa_load_background},
130   {NULL, NULL}
131 };
132 
133 /* This defines a function that opens up your library. */
134 
luaopen_vesa(lua_State * L)135 LUALIB_API int luaopen_vesa (lua_State *L) {
136   luaL_newlib(L, vesalib);
137   return 1;
138 }
139 
140