]>
Commit | Line | Data |
---|---|---|
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 | ||
9 | char 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 | ||
30 | char *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 | ||
49 | struct vars { | |
50 | char *vname, *var, *sub; | |
51 | int val; | |
52 | }; | |
53 | ||
54 | int *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 | ||
64 | int 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 | ||
75 | void 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 | } |