Add some more sim goop
[fpgaboy.git] / readout.c
CommitLineData
753fcbc6
JW
1#include <string.h>
2#include <SDL/SDL.h>
3
4#define WIN_X 800
5#define WIN_Y 600
6
7#define RINGSZ 528088
8
9char getone()
10{
11 unsigned char c;
12 static char ring[RINGSZ];
13 static int prod = 0, cons = 0;
14 int oldcons;
15
16 if (prod == cons)
17 {
18 int r;
19
20 /* Try to read some. */
21 while ((r = read(0, &(ring[prod]), RINGSZ-prod)) == 0)
22 usleep(250000);
23 prod = (prod + r) % RINGSZ;
24 }
25 oldcons = cons;
26 cons = (cons + 1) % RINGSZ;
27 return ring[oldcons];
28}
29
30char *readline()
31{
32 static char s[2048];
33 int i = 0;
34
35 while (i < 2048)
36 {
37 s[i] = getone();
38 if (s[i] == '\r' || s[i] == '\n')
39 {
40 s[i] = '\0';
41 return s;
42 }
43 i++;
44 }
45 s[2047] = 0;
46 return s;
47}
48
49struct vars {
50 char *vname, *var, *sub;
51 int val;
52};
53
54int *findvar(char *var, char *sub, struct vars *vars, int n)
55{
56 int i;
57 for (i=0; i<96*96; i++)
58 if (vars[i].var && !strcmp(vars[i].var, var) && ((!sub && !vars[i].sub) || !strcmp(vars[i].sub, sub)))
59 return &vars[i].val;
60 printf("Unknown var: %s %s\n", var, sub);
61 abort();
62}
63
64int numname(char *s)
65{
66 int i = 0;
67 while(*s)
68 {
69 i *= 96;
70 i += *(s++) - '!' + 1;
71 }
72 return i;
73}
74
75void main()
76{
77 char *s;
78 struct vars vars[96*96];
79 int nvars = 0;
80 int readingdata = 0;
81 SDL_Surface *screen;
82
83 if (SDL_Init(SDL_INIT_VIDEO) < 0)
84 {
85 printf("SDL init failed: %s\n", SDL_GetError());
86 return 1;
87 }
88 atexit(SDL_Quit);
89 screen = SDL_SetVideoMode(WIN_X, WIN_Y, 24, SDL_SWSURFACE);
90 if (!screen)
91 {
92 printf("Video init failed: %s\n", SDL_GetError());
93 }
94
95 memset(vars, 0, sizeof(vars));
96
97 while ((s = readline()))
98 {
99 if (s[0] == '$')
100 {
101 if (!strcmp(s, "$dumpvars"))
102 {
103 readingdata = 1;
104 printf("Var dump begin on %d vars\n", nvars);
105 } else if (!strncmp(s, "$var", 4)) {
106 char *t;
107 char *vname, *var, *sub;\
108 t = strtok(s, " ");
109 t = strtok(NULL, " ");
110 t = strtok(NULL, " ");
111 t = strtok(NULL, " ");
112 vname = t;
113 t = strtok(NULL, " ");
114 var = t;
115 t = strtok(NULL, " ");
116 if (strcmp(t, "$end"))
117 sub = t;
118 else
119 sub = NULL;
120 printf("Found: %s (%d) -> %s %s\n", vname, numname(vname), var, sub);
121
122 vars[numname(vname)].vname = strdup(vname);
123 vars[numname(vname)].var = strdup(var);
124 vars[numname(vname)].sub = sub ? strdup(sub) : NULL;
125 vars[numname(vname)].val = 0;
126 }
127 } else if (s[0] == '#' || !s[0])
128 ;
129 else if (readingdata)
130 {
131 int val = (s[0] == '1');
132 int i;
133 static int *tclk;
134 int oldclk = tclk ? *tclk : 0;
135 static int pixn = 0;
136
137 if (!tclk) tclk = findvar("vgaclk", NULL, vars, nvars);
138
139 vars[numname(s+1)].val = val;
140
141 if (*tclk != oldclk && ((pixn++) % 2)) {
142 static int x = 0, y = 0;
143 static int lasths;
144 unsigned char *pixp;
145 static int *r2 = NULL, *r1 = NULL, *r0 = NULL, *g2 = NULL, *g1 = NULL, *g0 = NULL, *b1 = NULL, *b0 = NULL, *vs = NULL, *hs = NULL;
146 if (!r2) r2 = findvar("r", "[2]", vars, nvars);
147 if (!r1) r1 = findvar("r", "[1]", vars, nvars);
148 if (!r0) r0 = findvar("r", "[0]", vars, nvars);
149 if (!g2) g2 = findvar("g", "[2]", vars, nvars);
150 if (!g1) g1 = findvar("g", "[1]", vars, nvars);
151 if (!g0) g0 = findvar("g", "[0]", vars, nvars);
152 if (!b1) b1 = findvar("b", "[1]", vars, nvars);
153 if (!b0) b0 = findvar("b", "[0]", vars, nvars);
154 if (!vs) vs = findvar("vs", NULL, vars, nvars);
155 if (!hs) hs = findvar("hs", NULL, vars, nvars);
156
157
158 int r = *r2 << 7 | *r1 << 6 | *r0 << 5;
159 int g = *g2 << 7 | *g1 << 6 | *g0 << 5;
160 int b = *b1 << 7 | *b0 << 6;
161 if (*vs)
162 y = 0;
163 else {
164 if (*hs)
165 {
166 x = 0;
167 if (!lasths)
168 y++;
169 } else
170 x++;
171 }
172 SDL_LockSurface(screen);
173 pixp = screen->pixels + ((WIN_X * y + x) * 3);
174 pixp[0] = b; pixp[1] = g; pixp[2] = r;
175 SDL_UnlockSurface(screen);
176 if (x == 0 && !lasths && y != 0)
177 {
178 int i;
179 SDL_LockSurface(screen);
180 for (i = 1; i < WIN_X; i++)
181 pixp[0+i*3] = pixp[1+i*3] = pixp[2+i*3] = 0xFF;
182 SDL_UnlockSurface(screen);
183 SDL_UpdateRect(screen, 0, y-1, WIN_X, 2);
184 if (!(y % 3))
185 SDL_Flip(screen);
186 }
187 lasths = *hs;
188 }
189 }
190 }
191}
This page took 0.033819 seconds and 4 git commands to generate.