... | ... |
@@ -6,6 +6,7 @@ clang-format -i src/uxn.h |
6 | 6 |
clang-format -i src/uxn.c |
7 | 7 |
clang-format -i src/emulator.c |
8 | 8 |
clang-format -i src/debugger.c |
9 |
+clang-format -i src/ppu.c |
|
9 | 10 |
clang-format -i src/apu.c |
10 | 11 |
|
11 | 12 |
echo "Cleaning.." |
... | ... |
@@ -20,12 +21,12 @@ if [ "${1}" = '--debug' ]; |
20 | 21 |
then |
21 | 22 |
echo "[debug]" |
22 | 23 |
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined src/assembler.c -o bin/assembler |
23 |
- cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined src/uxn.c src/emulator.c src/apu.c -L/usr/local/lib -lSDL2 -o bin/emulator |
|
24 |
+ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined src/uxn.c src/ppu.c src/emulator.c src/apu.c -L/usr/local/lib -lSDL2 -o bin/emulator |
|
24 | 25 |
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined src/uxn.c src/debugger.c -o bin/debugger |
25 | 26 |
else |
26 | 27 |
cc src/assembler.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o bin/assembler |
27 | 28 |
cc src/uxn.c src/debugger.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o bin/debugger |
28 |
- cc src/uxn.c src/emulator.c src/apu.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator |
|
29 |
+ cc src/uxn.c src/ppu.c src/emulator.c src/apu.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator |
|
29 | 30 |
fi |
30 | 31 |
|
31 | 32 |
echo "Assembling.." |
... | ... |
@@ -14,25 +14,11 @@ WITH REGARD TO THIS SOFTWARE. |
14 | 14 |
*/ |
15 | 15 |
|
16 | 16 |
#include "uxn.h" |
17 |
+#include "ppu.h" |
|
17 | 18 |
|
18 | 19 |
int initapu(Uxn *u, Uint8 id); |
19 |
-void stepapu(Uxn *u); |
|
20 | 20 |
|
21 |
-#define HOR 48 |
|
22 |
-#define VER 32 |
|
23 |
-#define PAD 2 |
|
24 |
-#define RES (HOR * VER * 16) |
|
25 |
- |
|
26 |
-typedef struct { |
|
27 |
- Uint8 reqdraw, bg[RES], fg[RES]; |
|
28 |
- Uint16 x1, y1, x2, y2; |
|
29 |
-} Screen; |
|
30 |
- |
|
31 |
-int WIDTH = 8 * HOR + 8 * PAD * 2; |
|
32 |
-int HEIGHT = 8 * VER + 8 * PAD * 2; |
|
33 |
-int FPS = 30, GUIDES = 0, ZOOM = 2; |
|
34 |
- |
|
35 |
-Uint32 *pixels, theme[4]; |
|
21 |
+static Ppu screen; |
|
36 | 22 |
|
37 | 23 |
Uint8 font[][8] = { |
38 | 24 |
{0x00, 0x3c, 0x46, 0x4a, 0x52, 0x62, 0x3c, 0x00}, |
... | ... |
@@ -56,7 +42,6 @@ static SDL_Window *gWindow; |
56 | 42 |
static SDL_Renderer *gRenderer; |
57 | 43 |
static SDL_Texture *gTexture; |
58 | 44 |
SDL_AudioDeviceID audio_id; |
59 |
-static Screen screen; |
|
60 | 45 |
static Device *devsystem, *devscreen, *devmouse, *devkey, *devctrl; |
61 | 46 |
|
62 | 47 |
#pragma mark - Helpers |
... | ... |
@@ -82,66 +67,8 @@ getflag(Uint8 *a, char flag) |
82 | 67 |
return *a & flag; |
83 | 68 |
} |
84 | 69 |
|
85 |
-#pragma mark - Paint |
|
86 |
- |
|
87 |
-void |
|
88 |
-paintpixel(Uint8 *dst, Uint16 x, Uint16 y, Uint8 color) |
|
89 |
-{ |
|
90 |
- Uint16 row = (y % 8) + ((x / 8 + y / 8 * HOR) * 16), col = 7 - (x % 8); |
|
91 |
- if(x >= HOR * 8 || y >= VER * 8 || row > RES - 8) |
|
92 |
- return; |
|
93 |
- if(color == 0 || color == 2) |
|
94 |
- dst[row] &= ~(1UL << col); |
|
95 |
- else |
|
96 |
- dst[row] |= 1UL << col; |
|
97 |
- if(color == 0 || color == 1) |
|
98 |
- dst[row + 8] &= ~(1UL << col); |
|
99 |
- else |
|
100 |
- dst[row + 8] |= 1UL << col; |
|
101 |
-} |
|
102 |
- |
|
103 | 70 |
#pragma mark - Helpers |
104 | 71 |
|
105 |
-void |
|
106 |
-clear(Uint32 *dst) |
|
107 |
-{ |
|
108 |
- int v, h; |
|
109 |
- for(v = 0; v < HEIGHT; v++) |
|
110 |
- for(h = 0; h < WIDTH; h++) |
|
111 |
- dst[v * WIDTH + h] = theme[0]; |
|
112 |
-} |
|
113 |
- |
|
114 |
-void |
|
115 |
-drawpixel(Uint32 *dst, Uint16 x, Uint16 y, Uint8 color) |
|
116 |
-{ |
|
117 |
- if(x >= screen.x1 && x <= screen.x2 && y >= screen.x1 && y <= screen.y2) |
|
118 |
- dst[y * WIDTH + x] = theme[color]; |
|
119 |
-} |
|
120 |
- |
|
121 |
-void |
|
122 |
-drawchr(Uint32 *dst, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 alpha) |
|
123 |
-{ |
|
124 |
- Uint8 v, h; |
|
125 |
- for(v = 0; v < 8; v++) |
|
126 |
- for(h = 0; h < 8; h++) { |
|
127 |
- Uint8 ch1 = ((sprite[v] >> h) & 0x1); |
|
128 |
- Uint8 ch2 = (((sprite[v + 8] >> h) & 0x1) << 1); |
|
129 |
- if(!alpha || (alpha && ch1 + ch2 != 0)) |
|
130 |
- drawpixel(dst, x + 7 - h, y + v, ch1 + ch2); |
|
131 |
- } |
|
132 |
-} |
|
133 |
- |
|
134 |
-void |
|
135 |
-drawicn(Uint32 *dst, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 fg, Uint8 bg) |
|
136 |
-{ |
|
137 |
- Uint8 v, h; |
|
138 |
- for(v = 0; v < 8; v++) |
|
139 |
- for(h = 0; h < 8; h++) { |
|
140 |
- Uint8 ch1 = (sprite[v] >> (7 - h)) & 0x1; |
|
141 |
- drawpixel(dst, x + h, y + v, ch1 ? fg : bg); |
|
142 |
- } |
|
143 |
-} |
|
144 |
- |
|
145 | 72 |
#pragma mark - Core |
146 | 73 |
|
147 | 74 |
int |
... | ... |
@@ -151,36 +78,22 @@ error(char *msg, const char *err) |
151 | 78 |
return 0; |
152 | 79 |
} |
153 | 80 |
|
154 |
-void |
|
155 |
-loadtheme(Uint8 *addr) |
|
156 |
-{ |
|
157 |
- int i; |
|
158 |
- for(i = 0; i < 4; ++i) { |
|
159 |
- Uint8 |
|
160 |
- r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f, |
|
161 |
- g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f, |
|
162 |
- b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; |
|
163 |
- theme[i] = (r << 20) + (r << 16) + (g << 12) + (g << 8) + (b << 4) + b; |
|
164 |
- } |
|
165 |
- screen.reqdraw = 1; |
|
166 |
-} |
|
167 |
- |
|
168 | 81 |
void |
169 | 82 |
drawdebugger(Uint32 *dst, Uxn *u) |
170 | 83 |
{ |
171 | 84 |
Uint8 i, x, y, b; |
172 | 85 |
for(i = 0; i < 0x10; ++i) { /* memory */ |
173 | 86 |
x = ((i % 8) * 3 + 3) * 8, y = screen.x1 + 8 + i / 8 * 8, b = u->wst.dat[i]; |
174 |
- drawicn(dst, x, y, font[(b >> 4) & 0xf], 1 + (u->wst.ptr == i), 0); |
|
175 |
- drawicn(dst, x + 8, y, font[b & 0xf], 1 + (u->wst.ptr == i), 0); |
|
87 |
+ drawicn(&screen, x, y, font[(b >> 4) & 0xf], 1 + (u->wst.ptr == i), 0); |
|
88 |
+ drawicn(&screen, x + 8, y, font[b & 0xf], 1 + (u->wst.ptr == i), 0); |
|
176 | 89 |
} |
177 | 90 |
for(x = 0; x < 32; ++x) { |
178 |
- drawpixel(dst, x, HEIGHT / 2, 2); |
|
179 |
- drawpixel(dst, WIDTH - x, HEIGHT / 2, 2); |
|
180 |
- drawpixel(dst, WIDTH / 2, HEIGHT - x, 2); |
|
181 |
- drawpixel(dst, WIDTH / 2, x, 2); |
|
182 |
- drawpixel(dst, WIDTH / 2 - 16 + x, HEIGHT / 2, 2); |
|
183 |
- drawpixel(dst, WIDTH / 2, HEIGHT / 2 - 16 + x, 2); |
|
91 |
+ drawpixel(&screen, x, HEIGHT / 2, 2); |
|
92 |
+ drawpixel(&screen, WIDTH - x, HEIGHT / 2, 2); |
|
93 |
+ drawpixel(&screen, WIDTH / 2, HEIGHT - x, 2); |
|
94 |
+ drawpixel(&screen, WIDTH / 2, x, 2); |
|
95 |
+ drawpixel(&screen, WIDTH / 2 - 16 + x, HEIGHT / 2, 2); |
|
96 |
+ drawpixel(&screen, WIDTH / 2, HEIGHT / 2 - 16 + x, 2); |
|
184 | 97 |
} |
185 | 98 |
} |
186 | 99 |
|
... | ... |
@@ -191,10 +104,10 @@ redraw(Uint32 *dst, Uxn *u) |
191 | 104 |
for(y = 0; y < VER; ++y) |
192 | 105 |
for(x = 0; x < HOR; ++x) { |
193 | 106 |
Uint16 key = (y * HOR + x) * 16; |
194 |
- drawchr(dst, (x + PAD) * 8, (y + PAD) * 8, &screen.bg[key], 0); |
|
195 |
- drawchr(dst, (x + PAD) * 8, (y + PAD) * 8, &screen.fg[key], 1); |
|
107 |
+ drawchr(&screen, (x + PAD) * 8, (y + PAD) * 8, &screen.bg[key], 0); |
|
108 |
+ drawchr(&screen, (x + PAD) * 8, (y + PAD) * 8, &screen.fg[key], 1); |
|
196 | 109 |
} |
197 |
- if(GUIDES) |
|
110 |
+ if(screen.debugger) |
|
198 | 111 |
drawdebugger(dst, u); |
199 | 112 |
SDL_UpdateTexture(gTexture, NULL, dst, WIDTH * sizeof(Uint32)); |
200 | 113 |
SDL_RenderClear(gRenderer); |
... | ... |
@@ -206,22 +119,22 @@ redraw(Uint32 *dst, Uxn *u) |
206 | 119 |
void |
207 | 120 |
toggledebug(Uxn *u) |
208 | 121 |
{ |
209 |
- GUIDES = !GUIDES; |
|
210 |
- redraw(pixels, u); |
|
122 |
+ screen.debugger = !screen.debugger; |
|
123 |
+ redraw(screen.output, u); |
|
211 | 124 |
} |
212 | 125 |
|
213 | 126 |
void |
214 | 127 |
togglezoom(Uxn *u) |
215 | 128 |
{ |
216 |
- ZOOM = ZOOM == 3 ? 1 : ZOOM + 1; |
|
217 |
- SDL_SetWindowSize(gWindow, WIDTH * ZOOM, HEIGHT * ZOOM); |
|
218 |
- redraw(pixels, u); |
|
129 |
+ screen.zoom = screen.zoom == 3 ? 1 : screen.zoom + 1; |
|
130 |
+ SDL_SetWindowSize(gWindow, WIDTH * screen.zoom, HEIGHT * screen.zoom); |
|
131 |
+ redraw(screen.output, u); |
|
219 | 132 |
} |
220 | 133 |
|
221 | 134 |
void |
222 | 135 |
quit(void) |
223 | 136 |
{ |
224 |
- free(pixels); |
|
137 |
+ free(screen.output); |
|
225 | 138 |
SDL_DestroyTexture(gTexture); |
226 | 139 |
gTexture = NULL; |
227 | 140 |
SDL_DestroyRenderer(gRenderer); |
... | ... |
@@ -237,7 +150,7 @@ init(void) |
237 | 150 |
{ |
238 | 151 |
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) |
239 | 152 |
return error("Init", SDL_GetError()); |
240 |
- gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH * ZOOM, HEIGHT * ZOOM, SDL_WINDOW_SHOWN); |
|
153 |
+ gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH * screen.zoom, HEIGHT * screen.zoom, SDL_WINDOW_SHOWN); |
|
241 | 154 |
if(gWindow == NULL) |
242 | 155 |
return error("Window", SDL_GetError()); |
243 | 156 |
gRenderer = SDL_CreateRenderer(gWindow, -1, 0); |
... | ... |
@@ -246,9 +159,9 @@ init(void) |
246 | 159 |
gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, WIDTH, HEIGHT); |
247 | 160 |
if(gTexture == NULL) |
248 | 161 |
return error("Texture", SDL_GetError()); |
249 |
- if(!(pixels = (Uint32 *)malloc(WIDTH * HEIGHT * sizeof(Uint32)))) |
|
162 |
+ if(!(screen.output = (Uint32 *)malloc(WIDTH * HEIGHT * sizeof(Uint32)))) |
|
250 | 163 |
return error("Pixels", "Failed to allocate memory"); |
251 |
- clear(pixels); |
|
164 |
+ clear(&screen); |
|
252 | 165 |
SDL_StartTextInput(); |
253 | 166 |
SDL_ShowCursor(SDL_DISABLE); |
254 | 167 |
screen.x1 = PAD * 8; |
... | ... |
@@ -263,8 +176,8 @@ domouse(Uxn *u, SDL_Event *event) |
263 | 176 |
{ |
264 | 177 |
Uint8 flag = 0x00; |
265 | 178 |
Uint16 addr = devmouse->addr + 2; |
266 |
- Uint16 x = clamp(event->motion.x / ZOOM - PAD * 8, 0, HOR * 8 - 1); |
|
267 |
- Uint16 y = clamp(event->motion.y / ZOOM - PAD * 8, 0, VER * 8 - 1); |
|
179 |
+ Uint16 x = clamp(event->motion.x / screen.zoom - PAD * 8, 0, HOR * 8 - 1); |
|
180 |
+ Uint16 y = clamp(event->motion.y / screen.zoom - PAD * 8, 0, VER * 8 - 1); |
|
268 | 181 |
u->ram.dat[addr + 0] = (x >> 8) & 0xff; |
269 | 182 |
u->ram.dat[addr + 1] = x & 0xff; |
270 | 183 |
u->ram.dat[addr + 2] = (y >> 8) & 0xff; |
... | ... |
@@ -450,7 +363,7 @@ system_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1) |
450 | 363 |
{ |
451 | 364 |
Uint8 *m = u->ram.dat; |
452 | 365 |
m[PAGE_DEVICE + b0] = b1; |
453 |
- loadtheme(&m[PAGE_DEVICE + 0x0008]); |
|
366 |
+ loadtheme(&screen, &m[PAGE_DEVICE + 0x0008]); |
|
454 | 367 |
(void)ptr; |
455 | 368 |
return b1; |
456 | 369 |
} |
... | ... |
@@ -470,7 +383,7 @@ int |
470 | 383 |
start(Uxn *u) |
471 | 384 |
{ |
472 | 385 |
inituxn(u, 0x0200); |
473 |
- redraw(pixels, u); |
|
386 |
+ redraw(screen.output, u); |
|
474 | 387 |
while(1) { |
475 | 388 |
SDL_Event event; |
476 | 389 |
double elapsed, start = SDL_GetPerformanceCounter(); |
... | ... |
@@ -498,14 +411,14 @@ start(Uxn *u) |
498 | 411 |
break; |
499 | 412 |
case SDL_WINDOWEVENT: |
500 | 413 |
if(event.window.event == SDL_WINDOWEVENT_EXPOSED) |
501 |
- redraw(pixels, u); |
|
414 |
+ redraw(screen.output, u); |
|
502 | 415 |
break; |
503 | 416 |
} |
504 | 417 |
} |
505 | 418 |
evaluxn(u, devscreen->vector); |
506 | 419 |
SDL_UnlockAudioDevice(audio_id); |
507 | 420 |
if(screen.reqdraw) |
508 |
- redraw(pixels, u); |
|
421 |
+ redraw(screen.output, u); |
|
509 | 422 |
elapsed = (SDL_GetPerformanceCounter() - start) / (double)SDL_GetPerformanceFrequency() * 1000.0f; |
510 | 423 |
SDL_Delay(clamp(16.666f - elapsed, 0, 1000)); |
511 | 424 |
} |
... | ... |
@@ -516,6 +429,7 @@ int |
516 | 429 |
main(int argc, char **argv) |
517 | 430 |
{ |
518 | 431 |
Uxn u; |
432 |
+ screen.zoom = 2; |
|
519 | 433 |
|
520 | 434 |
if(argc < 2) |
521 | 435 |
return error("Input", "Missing"); |
522 | 436 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,83 @@ |
1 |
+/* |
|
2 |
+Copyright (c) 2021 Devine Lu Linvega |
|
3 |
+Copyright (c) 2021 Andrew Alderwick |
|
4 |
+ |
|
5 |
+Permission to use, copy, modify, and distribute this software for any |
|
6 |
+purpose with or without fee is hereby granted, provided that the above |
|
7 |
+copyright notice and this permission notice appear in all copies. |
|
8 |
+ |
|
9 |
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
10 |
+WITH REGARD TO THIS SOFTWARE. |
|
11 |
+*/ |
|
12 |
+ |
|
13 |
+#include "ppu.h" |
|
14 |
+ |
|
15 |
+void |
|
16 |
+clear(Ppu *p) |
|
17 |
+{ |
|
18 |
+ int v, h; |
|
19 |
+ for(v = 0; v < HEIGHT; v++) |
|
20 |
+ for(h = 0; h < WIDTH; h++) |
|
21 |
+ p->output[v * WIDTH + h] = p->colors[0]; |
|
22 |
+} |
|
23 |
+ |
|
24 |
+void |
|
25 |
+drawpixel(Ppu *p, Uint16 x, Uint16 y, Uint8 color) |
|
26 |
+{ |
|
27 |
+ if(x >= p->x1 && x <= p->x2 && y >= p->x1 && y <= p->y2) |
|
28 |
+ p->output[y * WIDTH + x] = p->colors[color]; |
|
29 |
+} |
|
30 |
+ |
|
31 |
+void |
|
32 |
+drawchr(Ppu *p, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 alpha) |
|
33 |
+{ |
|
34 |
+ Uint8 v, h; |
|
35 |
+ for(v = 0; v < 8; v++) |
|
36 |
+ for(h = 0; h < 8; h++) { |
|
37 |
+ Uint8 ch1 = ((sprite[v] >> h) & 0x1); |
|
38 |
+ Uint8 ch2 = (((sprite[v + 8] >> h) & 0x1) << 1); |
|
39 |
+ if(!alpha || (alpha && ch1 + ch2 != 0)) |
|
40 |
+ drawpixel(p, x + 7 - h, y + v, ch1 + ch2); |
|
41 |
+ } |
|
42 |
+} |
|
43 |
+ |
|
44 |
+void |
|
45 |
+drawicn(Ppu *p, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 fg, Uint8 bg) |
|
46 |
+{ |
|
47 |
+ Uint8 v, h; |
|
48 |
+ for(v = 0; v < 8; v++) |
|
49 |
+ for(h = 0; h < 8; h++) { |
|
50 |
+ Uint8 ch1 = (sprite[v] >> (7 - h)) & 0x1; |
|
51 |
+ drawpixel(p, x + h, y + v, ch1 ? fg : bg); |
|
52 |
+ } |
|
53 |
+} |
|
54 |
+ |
|
55 |
+void |
|
56 |
+paintpixel(Uint8 *dst, Uint16 x, Uint16 y, Uint8 color) |
|
57 |
+{ |
|
58 |
+ Uint16 row = (y % 8) + ((x / 8 + y / 8 * HOR) * 16), col = 7 - (x % 8); |
|
59 |
+ if(x >= HOR * 8 || y >= VER * 8 || row > RES - 8) |
|
60 |
+ return; |
|
61 |
+ if(color == 0 || color == 2) |
|
62 |
+ dst[row] &= ~(1UL << col); |
|
63 |
+ else |
|
64 |
+ dst[row] |= 1UL << col; |
|
65 |
+ if(color == 0 || color == 1) |
|
66 |
+ dst[row + 8] &= ~(1UL << col); |
|
67 |
+ else |
|
68 |
+ dst[row + 8] |= 1UL << col; |
|
69 |
+} |
|
70 |
+ |
|
71 |
+void |
|
72 |
+loadtheme(Ppu *p, Uint8 *addr) |
|
73 |
+{ |
|
74 |
+ int i; |
|
75 |
+ for(i = 0; i < 4; ++i) { |
|
76 |
+ Uint8 |
|
77 |
+ r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f, |
|
78 |
+ g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f, |
|
79 |
+ b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; |
|
80 |
+ p->colors[i] = (r << 20) + (r << 16) + (g << 12) + (g << 8) + (b << 4) + b; |
|
81 |
+ } |
|
82 |
+ p->reqdraw = 1; |
|
83 |
+} |
|
0 | 84 |
\ No newline at end of file |
1 | 85 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,44 @@ |
1 |
+#include <stdio.h> |
|
2 |
+ |
|
3 |
+/* |
|
4 |
+Copyright (c) 2021 Devine Lu Linvega |
|
5 |
+ |
|
6 |
+Permission to use, copy, modify, and distribute this software for any |
|
7 |
+purpose with or without fee is hereby granted, provided that the above |
|
8 |
+copyright notice and this permission notice appear in all copies. |
|
9 |
+ |
|
10 |
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 |
+WITH REGARD TO THIS SOFTWARE. |
|
12 |
+*/ |
|
13 |
+ |
|
14 |
+typedef unsigned char Uint8; |
|
15 |
+typedef signed char Sint8; |
|
16 |
+typedef unsigned short Uint16; |
|
17 |
+typedef signed short Sint16; |
|
18 |
+typedef unsigned int Uint32; |
|
19 |
+ |
|
20 |
+#define HOR 48 |
|
21 |
+#define VER 32 |
|
22 |
+#define PAD 2 |
|
23 |
+#define RES (HOR * VER * 16) |
|
24 |
+ |
|
25 |
+#define WIDTH (8 * HOR + 8 * PAD * 2) |
|
26 |
+#define HEIGHT (8 * VER + 8 * PAD * 2) |
|
27 |
+ |
|
28 |
+typedef struct Ppu { |
|
29 |
+ Uint8 reqdraw, zoom, debugger, bg[RES], fg[RES]; |
|
30 |
+ Uint16 x1, y1, x2, y2; |
|
31 |
+ Uint32 *output, colors[4]; |
|
32 |
+} Ppu; |
|
33 |
+ |
|
34 |
+void |
|
35 |
+clear(Ppu *p); |
|
36 |
+void |
|
37 |
+drawpixel(Ppu *p, Uint16 x, Uint16 y, Uint8 color); |
|
38 |
+void |
|
39 |
+drawchr(Ppu *p, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 alpha); |
|
40 |
+void |
|
41 |
+drawicn(Ppu *p, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 fg, Uint8 bg); |
|
42 |
+ |
|
43 |
+void paintpixel(Uint8 *dst, Uint16 x, Uint16 y, Uint8 color); |
|
44 |
+void loadtheme(Ppu *p, Uint8 *addr); |
|
0 | 45 |
\ No newline at end of file |