... | ... |
@@ -20,5 +20,5 @@ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werr |
20 | 20 |
# cc uxn.c emulator.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator |
21 | 21 |
|
22 | 22 |
# run |
23 |
-./bin/assembler examples/gui.shapes.usm bin/boot.rom |
|
23 |
+./bin/assembler examples/dev.mouse.usm bin/boot.rom |
|
24 | 24 |
./bin/emulator bin/boot.rom |
... | ... |
@@ -253,30 +253,31 @@ init(void) |
253 | 253 |
} |
254 | 254 |
|
255 | 255 |
void |
256 |
-domouse(SDL_Event *event) |
|
256 |
+domouse(Uxn *u, SDL_Event *event) |
|
257 | 257 |
{ |
258 | 258 |
Uint8 flag = 0x00; |
259 |
+ Uint16 addr = 0xff50; /* TODO: get dynamically */ |
|
259 | 260 |
Uint16 x = clamp(event->motion.x / ZOOM - PAD * 8, 0, HOR * 8 - 1); |
260 | 261 |
Uint16 y = clamp(event->motion.y / ZOOM - PAD * 8, 0, VER * 8 - 1); |
261 |
- devmouse->mem[0] = (x >> 8) & 0xff; |
|
262 |
- devmouse->mem[1] = x & 0xff; |
|
263 |
- devmouse->mem[2] = (y >> 8) & 0xff; |
|
264 |
- devmouse->mem[3] = y & 0xff; |
|
265 |
- devmouse->mem[5] = 0x00; |
|
262 |
+ u->ram.dat[addr + 0] = (x >> 8) & 0xff; |
|
263 |
+ u->ram.dat[addr + 1] = x & 0xff; |
|
264 |
+ u->ram.dat[addr + 2] = (y >> 8) & 0xff; |
|
265 |
+ u->ram.dat[addr + 3] = y & 0xff; |
|
266 |
+ u->ram.dat[addr + 5] = 0x00; |
|
266 | 267 |
switch(event->button.button) { |
267 | 268 |
case SDL_BUTTON_LEFT: flag = 0x01; break; |
268 | 269 |
case SDL_BUTTON_RIGHT: flag = 0x10; break; |
269 | 270 |
} |
270 | 271 |
switch(event->type) { |
271 | 272 |
case SDL_MOUSEBUTTONUP: |
272 |
- setflag(&devmouse->mem[4], flag, 0); |
|
273 |
+ setflag(&u->ram.dat[addr + 4], flag, 0); |
|
273 | 274 |
break; |
274 | 275 |
case SDL_MOUSEBUTTONDOWN: |
275 |
- setflag(&devmouse->mem[4], flag, 1); |
|
276 |
- if(flag == 0x01 && getflag(&devmouse->mem[4], 0x10)) |
|
277 |
- devmouse->mem[5] = 0x01; |
|
278 |
- if(flag == 0x10 && getflag(&devmouse->mem[4], 0x01)) |
|
279 |
- devmouse->mem[5] = 0x10; |
|
276 |
+ setflag(&u->ram.dat[addr + 4], flag, 1); |
|
277 |
+ if(flag == 0x01 && getflag(&u->ram.dat[addr + 4], 0x10)) |
|
278 |
+ u->ram.dat[addr + 5] = 0x01; |
|
279 |
+ if(flag == 0x10 && getflag(&u->ram.dat[addr + 4], 0x01)) |
|
280 |
+ u->ram.dat[addr + 5] = 0x10; |
|
280 | 281 |
break; |
281 | 282 |
} |
282 | 283 |
} |
... | ... |
@@ -325,19 +326,23 @@ doctrl(SDL_Event *event, int z) |
325 | 326 |
#pragma mark - Devices |
326 | 327 |
|
327 | 328 |
Uint8 |
328 |
-console_poke(Uint8 *m, Uint8 b0, Uint8 b1) |
|
329 |
+console_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1) |
|
329 | 330 |
{ |
330 | 331 |
printf("%c", b1); |
331 | 332 |
fflush(stdout); |
333 |
+ (void)m; |
|
334 |
+ (void)ptr; |
|
335 |
+ (void)b0; |
|
332 | 336 |
return b1; |
333 | 337 |
} |
334 | 338 |
|
335 | 339 |
Uint8 |
336 |
-screen_poke(Uint8 *m, Uint8 b0, Uint8 b1) |
|
340 |
+screen_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1) |
|
337 | 341 |
{ |
338 |
- if(b0 == 0x04) { |
|
339 |
- Uint16 x = (*(m + 2) << 8) + *(m + 3); |
|
340 |
- Uint16 y = (*m << 8) + *(m + 1); |
|
342 |
+ ptr += 8; |
|
343 |
+ if(b0 == 0x0c) { |
|
344 |
+ Uint16 x = (m[ptr] << 8) + m[ptr + 1]; |
|
345 |
+ Uint16 y = (m[ptr + 2] << 8) + m[ptr + 3]; |
|
341 | 346 |
paintpixel(b1 >> 4 & 0xf ? screen.fg : screen.bg, x, y, b1 & 0xf); |
342 | 347 |
screen.reqdraw = 1; |
343 | 348 |
} |
... | ... |
@@ -345,16 +350,30 @@ screen_poke(Uint8 *m, Uint8 b0, Uint8 b1) |
345 | 350 |
} |
346 | 351 |
|
347 | 352 |
Uint8 |
348 |
-peek1(Uint8 *m, Uint8 b0, Uint8 b1) |
|
353 |
+sprite_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1) |
|
349 | 354 |
{ |
350 |
- printf("PEEK! %02x\n", b1); |
|
355 |
+ ptr += 8; |
|
356 |
+ if(b0 == 0x0e) { |
|
357 |
+ Uint16 x = (m[ptr] << 8) + m[ptr + 1]; |
|
358 |
+ Uint16 y = (m[ptr + 2] << 8) + m[ptr + 3]; |
|
359 |
+ Uint16 a = (m[ptr + 4] << 8) + m[ptr + 5]; |
|
360 |
+ Uint8 source = (b1 >> 4) & 0xf; |
|
361 |
+ Uint8 *layer = source % 2 ? screen.fg : screen.bg; |
|
362 |
+ if(source / 2) |
|
363 |
+ paintchr(layer, x, y, &m[a]); |
|
364 |
+ else |
|
365 |
+ painticn(layer, x, y, &m[a], b1 & 0xf); |
|
366 |
+ screen.reqdraw = 1; |
|
367 |
+ } |
|
351 | 368 |
return b1; |
352 | 369 |
} |
353 | 370 |
|
354 | 371 |
Uint8 |
355 |
-poke1(Uint8 *m, Uint8 b0, Uint8 b1) |
|
372 |
+ppnil(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1) |
|
356 | 373 |
{ |
357 |
- printf("POKE! %02x\n", b1); |
|
374 |
+ (void)m; |
|
375 |
+ (void)ptr; |
|
376 |
+ (void)b0; |
|
358 | 377 |
return b1; |
359 | 378 |
} |
360 | 379 |
|
... | ... |
@@ -376,37 +395,6 @@ consolew(Device *d, Memory *m, Uint8 b) |
376 | 395 |
return 0; |
377 | 396 |
} |
378 | 397 |
|
379 |
-Uint8 |
|
380 |
-screenr(Device *d, Memory *m, Uint8 b) |
|
381 |
-{ |
|
382 |
- loadtheme(m->dat + 0xfff0); |
|
383 |
- switch(b) { |
|
384 |
- case 0: return (HOR * 8 >> 8) & 0xff; |
|
385 |
- case 1: return HOR * 8 & 0xff; |
|
386 |
- case 2: return (VER * 8 >> 8) & 0xff; |
|
387 |
- case 3: return VER * 8 & 0xff; |
|
388 |
- } |
|
389 |
- (void)m; |
|
390 |
- return d->mem[b]; |
|
391 |
-} |
|
392 |
- |
|
393 |
-Uint8 |
|
394 |
-screenw(Device *d, Memory *m, Uint8 b) |
|
395 |
-{ |
|
396 |
- d->mem[d->ptr++] = b; |
|
397 |
- if(d->ptr > 4) { |
|
398 |
- Uint16 x = (d->mem[2] << 8) + d->mem[3]; |
|
399 |
- Uint16 y = (d->mem[0] << 8) + d->mem[1]; |
|
400 |
- Uint8 clr = d->mem[4] & 0xf; |
|
401 |
- Uint8 layer = d->mem[4] >> 4 & 0xf; |
|
402 |
- paintpixel(layer ? screen.fg : screen.bg, x, y, clr); |
|
403 |
- screen.reqdraw = 1; |
|
404 |
- d->ptr = 0; |
|
405 |
- } |
|
406 |
- (void)m; |
|
407 |
- return 0; |
|
408 |
-} |
|
409 |
- |
|
410 | 398 |
Uint8 |
411 | 399 |
spritew(Device *d, Memory *m, Uint8 b) |
412 | 400 |
{ |
... | ... |
@@ -449,7 +437,7 @@ start(Uxn *u) |
449 | 437 |
case SDL_QUIT: quit(); break; |
450 | 438 |
case SDL_MOUSEBUTTONUP: |
451 | 439 |
case SDL_MOUSEBUTTONDOWN: |
452 |
- case SDL_MOUSEMOTION: domouse(&event); break; |
|
440 |
+ case SDL_MOUSEMOTION: domouse(u, &event); break; |
|
453 | 441 |
case SDL_TEXTINPUT: dotext(&event); break; |
454 | 442 |
case SDL_KEYDOWN: doctrl(&event, 1); break; |
455 | 443 |
case SDL_KEYUP: doctrl(&event, 0); break; |
... | ... |
@@ -479,12 +467,17 @@ main(int argc, char **argv) |
479 | 467 |
if(!init()) |
480 | 468 |
return error("Init", "Failed"); |
481 | 469 |
|
482 |
- devconsole = portuxn(&u, "console", defaultrw, consolew, peek1, console_poke); |
|
483 |
- devscreen = portuxn(&u, "screen", screenr, screenw, peek1, screen_poke); |
|
484 |
- devsprite = portuxn(&u, "sprite", screenr, spritew, peek1, poke1); |
|
485 |
- devcontroller = portuxn(&u, "controller", defaultrw, defaultrw, peek1, poke1); |
|
486 |
- devkey = portuxn(&u, "key", defaultrw, consolew, peek1, poke1); |
|
487 |
- devmouse = portuxn(&u, "mouse", defaultrw, defaultrw, peek1, poke1); |
|
470 |
+ devconsole = portuxn(&u, "console", defaultrw, consolew, ppnil, console_poke); |
|
471 |
+ devscreen = portuxn(&u, "screen", defaultrw, defaultrw, ppnil, screen_poke); |
|
472 |
+ devsprite = portuxn(&u, "sprite", defaultrw, spritew, ppnil, sprite_poke); |
|
473 |
+ devcontroller = portuxn(&u, "controller", defaultrw, defaultrw, ppnil, ppnil); |
|
474 |
+ devkey = portuxn(&u, "key", defaultrw, consolew, ppnil, ppnil); |
|
475 |
+ devmouse = portuxn(&u, "mouse", defaultrw, defaultrw, ppnil, ppnil); |
|
476 |
+ |
|
477 |
+ u.ram.dat[0xff10] = (HOR * 8 >> 8) & 0xff; |
|
478 |
+ u.ram.dat[0xff11] = HOR * 8 & 0xff; |
|
479 |
+ u.ram.dat[0xff12] = (VER * 8 >> 8) & 0xff; |
|
480 |
+ u.ram.dat[0xff13] = VER * 8 & 0xff; |
|
488 | 481 |
|
489 | 482 |
start(&u); |
490 | 483 |
quit(); |
... | ... |
@@ -1,11 +1,18 @@ |
1 | 1 |
( blank ) |
2 | 2 |
|
3 |
-:dev/r fff8 ( std read port ) |
|
4 |
-:dev/w fff9 ( std write port ) |
|
3 |
+&Console { pad 8 stdio 1 } |
|
4 |
+&Screen { width 2 height 2 pad 4 y 2 x 2 color 1 } |
|
5 |
+&Sprite { pad 8 y 2 x 2 addr 2 color 1 } |
|
6 |
+&Mouse { x 2 y 2 state 1 chord 1 } |
|
5 | 7 |
|
6 | 8 |
|0100 @RESET BRK |
7 | 9 |
|c000 @FRAME BRK |
8 | 10 |
|d000 @ERROR BRK |
9 | 11 |
|
12 |
+|FF00 ;dev/console Console |
|
13 |
+|FF10 ;dev/screen Screen |
|
14 |
+|FF20 ;dev/sprite Sprite |
|
15 |
+|FF50 ;dev/mouse Mouse |
|
16 |
+ |
|
10 | 17 |
|FFF0 [ f2ac 35bb 2b53 ] ( palette ) |
11 | 18 |
|FFFA .RESET .FRAME .ERROR |
7 | 7 |
similarity index 83% |
8 | 8 |
rename from examples/devmouse.usm |
9 | 9 |
rename to examples/dev.mouse.usm |
... | ... |
@@ -1,45 +1,37 @@ |
1 | 1 |
( mouse ) |
2 | 2 |
|
3 |
-:dev/r fff8 ( std read port ) |
|
4 |
-:dev/w fff9 ( std write port ) |
|
3 |
+&Screen { width 2 height 2 pad 4 y 2 x 2 color 1 } |
|
4 |
+&Sprite { pad 8 y 2 x 2 addr 2 color 1 } |
|
5 |
+&Mouse { x 2 y 2 state 1 chord 1 } |
|
5 | 6 |
|
6 | 7 |
&Point2d { x 2 y 2 } |
7 | 8 |
|
8 |
-;mouse Point2d |
|
9 |
-;cat Point2d |
|
9 |
+;cat Point2d ;mouse Point2d |
|
10 | 10 |
|
11 |
-;state 1 ;timer 1 |
|
11 |
+;timer 1 |
|
12 | 12 |
|
13 | 13 |
|0100 @RESET |
14 |
- |
|
15 |
- #01 =dev/r ( set dev/read screen ) |
|
16 | 14 |
|
17 | 15 |
( position cat ) |
18 |
- #00 IOR2 #0002 DIV2 =cat.x |
|
19 |
- #02 IOR2 #0038 SUB2 =cat.y |
|
20 |
- |
|
21 |
- #05 =dev/r ( set dev/read mouse ) |
|
22 |
- #02 =dev/w ( set dev/write to sprite ) |
|
23 |
- |
|
16 |
+ ~dev/screen.width #0002 DIV2 =cat.x |
|
17 |
+ ~dev/screen.height #0038 SUB2 =cat.y |
|
24 | 18 |
( draw polycat ) |
25 | 19 |
,draw-polycat JSR |
26 | 20 |
|
27 | 21 |
BRK |
28 | 22 |
|
29 | 23 |
|c000 @FRAME |
30 |
- |
|
24 |
+ |
|
31 | 25 |
( clear last cursor ) |
32 | 26 |
#10 ,clear_icn ~mouse.x ~mouse.y ,draw-sprite JSR |
33 | 27 |
( record mouse positions ) |
34 |
- #00 IOR2 =mouse.x #02 IOR2 =mouse.y |
|
35 |
- ( record mouse state ) |
|
36 |
- #04 IOR #11 ADD =state |
|
28 |
+ ~dev/mouse.x =mouse.x ~dev/mouse.y =mouse.y |
|
37 | 29 |
( detect click ) |
38 |
- #04 IOR #01 NEQ ,no-click ROT JMP? POP2 |
|
30 |
+ ~dev/mouse.state #01 NEQ ,no-click ROT JMP? POP2 |
|
39 | 31 |
#50 =timer |
40 | 32 |
@no-click |
41 | 33 |
( draw mouse ) |
42 |
- ~state ,cursor_icn ~mouse.x ~mouse.y ,draw-sprite JSR |
|
34 |
+ ~dev/mouse.state #11 ADD ,cursor_icn ~mouse.x ~mouse.y ,draw-sprite JSR |
|
43 | 35 |
( animate ) |
44 | 36 |
,animate-polycat JSR |
45 | 37 |
( update last pos ) |
... | ... |
@@ -99,17 +91,17 @@ RTS |
99 | 91 |
RTS |
100 | 92 |
|
101 | 93 |
@draw-sprite |
102 |
- IOW2 ( y byte ) |
|
103 |
- IOW2 ( x byte ) |
|
104 |
- IOW2 ( sprite address ) |
|
105 |
- IOW ( layer-color ) |
|
94 |
+ =dev/sprite.x |
|
95 |
+ =dev/sprite.y |
|
96 |
+ =dev/sprite.addr |
|
97 |
+ =dev/sprite.color |
|
106 | 98 |
RTS |
107 | 99 |
|
108 | 100 |
@draw-sprite-chr |
109 |
- IOW2 ( y byte ) |
|
110 |
- IOW2 ( x byte ) |
|
111 |
- IOW2 ( sprite address ) |
|
112 |
- #20 IOW ( layer-color ) |
|
101 |
+ =dev/sprite.x |
|
102 |
+ =dev/sprite.y |
|
103 |
+ =dev/sprite.addr |
|
104 |
+ #20 =dev/sprite.color |
|
113 | 105 |
RTS |
114 | 106 |
|
115 | 107 |
@clear_icn [ 0000 0000 0000 0000 ] |
... | ... |
@@ -132,6 +124,10 @@ RTS |
132 | 124 |
c0f0 f0e0 e080 8000 c0f1 faf9 fef8 b000 |
133 | 125 |
] |
134 | 126 |
|
127 |
+|FF10 ;dev/screen Screen |
|
128 |
+|FF20 ;dev/sprite Sprite |
|
129 |
+|FF50 ;dev/mouse Mouse |
|
130 |
+ |
|
135 | 131 |
|d000 @ERROR BRK |
136 | 132 |
|FFF0 [ 0f85 0fd5 0fb5 ] ( palette ) |
137 | 133 |
|FFFA .RESET .FRAME .ERROR |
138 | 134 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,40 @@ |
1 |
+( screen ) |
|
2 |
+ |
|
3 |
+&Screen { width 2 height 2 pad 4 x 2 y 2 color 1 } |
|
4 |
+ |
|
5 |
+;centerx 2 ;centery 2 ;i 2 |
|
6 |
+ |
|
7 |
+|0100 @RESET |
|
8 |
+ |
|
9 |
+ ( find screen center ) |
|
10 |
+ ~dev/screen.width #0002 DIV2 =centerx |
|
11 |
+ ~dev/screen.height #0002 DIV2 =centery |
|
12 |
+ |
|
13 |
+ ( draw hor line ) |
|
14 |
+ #0000 =i |
|
15 |
+ ~centery =dev/screen.y |
|
16 |
+ @draw-hor |
|
17 |
+ #03 ~i =dev/screen.x =dev/screen.color |
|
18 |
+ ~i #0002 ADD2 =i ( increment ) |
|
19 |
+ ~i ~dev/screen.width LTH2 ,draw-hor ROT JMP? POP2 |
|
20 |
+ |
|
21 |
+ ( draw ver line ) |
|
22 |
+ #0000 =i |
|
23 |
+ ~centerx =dev/screen.x |
|
24 |
+ @draw-ver |
|
25 |
+ #03 ~i =dev/screen.y =dev/screen.color |
|
26 |
+ ~i #0002 ADD2 =i ( increment ) |
|
27 |
+ ~i ~dev/screen.width LTH2 ,draw-ver ROT JMP? POP2 |
|
28 |
+ |
|
29 |
+ ( draw pixel in the middle ) |
|
30 |
+ #01 ~centerx ~centery =dev/screen.y =dev/screen.x =dev/screen.color |
|
31 |
+ |
|
32 |
+BRK |
|
33 |
+ |
|
34 |
+|c000 @FRAME BRK |
|
35 |
+|d000 @ERROR BRK |
|
36 |
+ |
|
37 |
+|FF10 ;dev/screen Screen |
|
38 |
+ |
|
39 |
+|FFF0 [ f0ac f0bb f053 ] ( palette ) |
|
40 |
+|FFFA .RESET .FRAME .ERROR ( vectors ) |
0 | 41 |
deleted file mode 100644 |
... | ... |
@@ -1,45 +0,0 @@ |
1 |
-( screen ) |
|
2 |
- |
|
3 |
-:dev/r fff8 ( std read port ) |
|
4 |
-:dev/w fff9 ( std write port ) |
|
5 |
- |
|
6 |
-;centerx 2 ;centery 2 ;i 2 |
|
7 |
- |
|
8 |
-|0100 @RESET |
|
9 |
- |
|
10 |
- ( set read/write to dev/screen ) |
|
11 |
- #01 DUP =dev/r =dev/w |
|
12 |
- |
|
13 |
- ( find screen center ) |
|
14 |
- #00 IOR2 #0002 DIV2 =centerx |
|
15 |
- #02 IOR2 #0002 DIV2 =centery |
|
16 |
- |
|
17 |
- ( draw hor line ) |
|
18 |
- #0000 =i |
|
19 |
- @draw-hor |
|
20 |
- #03 ~i ~centery ,draw-pixel JSR |
|
21 |
- ~i #0002 ADD2 =i ( increment ) |
|
22 |
- ~i #00 IOR2 LTH2 ,draw-hor ROT JMP? POP2 |
|
23 |
- |
|
24 |
- ( draw ver line ) |
|
25 |
- #0000 =i |
|
26 |
- @draw-ver |
|
27 |
- #03 ~centerx ~i ,draw-pixel JSR |
|
28 |
- ~i #0002 ADD2 =i ( increment ) |
|
29 |
- ~i #02 IOR2 LTH2 ,draw-ver ROT JMP? POP2 |
|
30 |
- |
|
31 |
- ( draw pixel in the middle ) |
|
32 |
- #01 ~centerx ~centery ,draw-pixel JSR |
|
33 |
- |
|
34 |
-BRK |
|
35 |
- |
|
36 |
-@draw-pixel |
|
37 |
- IOW2 ( y short ) |
|
38 |
- IOW2 ( x short ) |
|
39 |
- IOW ( color byte ) |
|
40 |
- RTS |
|
41 |
- |
|
42 |
-|c000 @FRAME BRK |
|
43 |
-|d000 @ERROR BRK |
|
44 |
-|FFF0 [ f0ac f0bb f053 ] ( palette ) |
|
45 |
-|FFFA .RESET .FRAME .ERROR ( vectors ) |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
( draw routines ) |
2 | 2 |
|
3 |
-&Screen { y 2 x 2 color 1 } |
|
3 |
+&Screen { width 2 height 2 pad 4 y 2 x 2 color 1 red 1 green 1 blue 1 } |
|
4 | 4 |
|
5 | 5 |
;color 1 ;x1 2 ;x2 2 ;y1 2 ;y2 2 |
6 | 6 |
|
... | ... |
@@ -53,7 +53,7 @@ RTS |
53 | 53 |
|c000 @FRAME BRK |
54 | 54 |
|d000 @ERROR BRK |
55 | 55 |
|
56 |
-|FF08 ;dev/screen Screen |
|
56 |
+|FF10 ;dev/screen Screen |
|
57 | 57 |
|
58 | 58 |
|FFF0 [ 0f0f 0fff 0ff0 ] ( palette ) |
59 | 59 |
|FFFA .RESET .FRAME .ERROR ( vectors ) |
60 | 60 |
\ No newline at end of file |
... | ... |
@@ -18,9 +18,9 @@ WITH REGARD TO THIS SOFTWARE. |
18 | 18 |
/* clang-format off */ |
19 | 19 |
void setflag(Uint8 *a, char flag, int b) { if(b) *a |= flag; else *a &= (~flag); } |
20 | 20 |
int getflag(Uint8 *a, char flag) { return *a & flag; } |
21 |
-Uint8 devpoke8(Uxn *u, Uint8 id, Uint8 b0, Uint8 b1){ return id < u->devices ? u->dev[id].poke(&u->ram.dat[0xff00 + id * 8], b0, b1) : b1; } |
|
22 |
-Uint8 devpeek8(Uxn *u, Uint8 id, Uint8 b0, Uint8 b1){ return id < u->devices ? u->dev[id].peek(&u->ram.dat[0xff00 + id * 8], b0, b1) : b1; } |
|
23 |
-void mempoke8(Uxn *u, Uint16 a, Uint8 b) { u->ram.dat[a] = a >= 0xff00 ? devpoke8(u, (a & 0xff) >> 3, (a & 0xf) % 8, b) : b; } |
|
21 |
+Uint8 devpoke8(Uxn *u, Uint8 id, Uint8 b0, Uint8 b1){ return id < u->devices ? u->dev[id].poke(u->ram.dat, 0xff00 + id * 0x10, b0, b1) : b1; } |
|
22 |
+Uint8 devpeek8(Uxn *u, Uint8 id, Uint8 b0, Uint8 b1){ return id < u->devices ? u->dev[id].peek(u->ram.dat, 0xff00 + id * 0x10, b0, b1) : b1; } |
|
23 |
+void mempoke8(Uxn *u, Uint16 a, Uint8 b) { u->ram.dat[a] = a >= 0xff00 ? devpoke8(u, (a & 0xff) >> 4, a & 0xf, b) : b; } |
|
24 | 24 |
Uint8 mempeek8(Uxn *u, Uint16 a) { return a >= 0xff00 ? devpeek8(u, (a & 0xff) >> 4, a & 0xf, u->ram.dat[a]) : u->ram.dat[a]; } |
25 | 25 |
void mempoke16(Uxn *u, Uint16 a, Uint16 b) { mempoke8(u, a, b >> 8); mempoke8(u, a + 1, b); } |
26 | 26 |
Uint16 mempeek16(Uxn *u, Uint16 a) { return (mempeek8(u, a) << 8) + mempeek8(u, a + 1); } |
... | ... |
@@ -211,7 +211,7 @@ loaduxn(Uxn *u, char *filepath) |
211 | 211 |
} |
212 | 212 |
|
213 | 213 |
Device * |
214 |
-portuxn(Uxn *u, char *name, Uint8 (*rfn)(Device *, Memory *, Uint8), Uint8 (*wfn)(Device *, Memory *, Uint8), Uint8 (*pefn)(Uint8 *m, Uint8 b0, Uint8 b1), Uint8 (*pofn)(Uint8 *m, Uint8 b0, Uint8 b1)) |
|
214 |
+portuxn(Uxn *u, char *name, Uint8 (*rfn)(Device *, Memory *, Uint8), Uint8 (*wfn)(Device *, Memory *, Uint8), Uint8 (*pefn)(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1), Uint8 (*pofn)(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1)) |
|
215 | 215 |
{ |
216 | 216 |
Device *d = &u->dev[u->devices++]; |
217 | 217 |
d->read = rfn; |
... | ... |
@@ -35,8 +35,8 @@ typedef struct Device { |
35 | 35 |
Uint8 ptr, mem[8]; |
36 | 36 |
Uint8 (*read)(struct Device *, Memory *, Uint8); |
37 | 37 |
Uint8 (*write)(struct Device *, Memory *, Uint8); |
38 |
- Uint8 (*peek)(Uint8 *, Uint8, Uint8); |
|
39 |
- Uint8 (*poke)(Uint8 *, Uint8, Uint8); |
|
38 |
+ Uint8 (*peek)(Uint8 *, Uint16, Uint8, Uint8); |
|
39 |
+ Uint8 (*poke)(Uint8 *, Uint16, Uint8, Uint8); |
|
40 | 40 |
} Device; |
41 | 41 |
|
42 | 42 |
typedef struct { |
... | ... |
@@ -52,4 +52,4 @@ int getflag(Uint8 *status, char flag); |
52 | 52 |
int loaduxn(Uxn *c, char *filepath); |
53 | 53 |
int bootuxn(Uxn *c); |
54 | 54 |
int evaluxn(Uxn *u, Uint16 vec); |
55 |
-Device *portuxn(Uxn *u, char *name, Uint8 (*rfn)(Device *, Memory *, Uint8), Uint8 (*wfn)(Device *, Memory *, Uint8), Uint8 (*pefn)(Uint8 *, Uint8, Uint8), Uint8 (*pofn)(Uint8 *, Uint8, Uint8)); |
|
55 |
+Device *portuxn(Uxn *u, char *name, Uint8 (*rfn)(Device *, Memory *, Uint8), Uint8 (*wfn)(Device *, Memory *, Uint8), Uint8 (*pefn)(Uint8 *, Uint16, Uint8, Uint8), Uint8 (*pofn)(Uint8 *, Uint16, Uint8, Uint8)); |