... | ... |
@@ -10,8 +10,8 @@ |
10 | 10 |
|
11 | 11 |
( devices ) |
12 | 12 |
|
13 |
-|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 ] |
|
14 |
-|10 @Console [ &pad $8 &char $1 &byte $1 &short $2 &string $2 ] |
|
13 |
+|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 ] |
|
14 |
+|10 @Console [ &vector $2 &pad $6 &char $1 &byte $1 &short $2 &string $2 ] |
|
15 | 15 |
|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ] |
16 | 16 |
|30 @Audio0 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] |
17 | 17 |
|40 @Audio1 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] |
18 | 18 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,14 @@ |
1 |
+( dev/console ) |
|
2 |
+ |
|
3 |
+|10 @Console [ &vector $2 &pad $6 &char $1 &byte $1 &short $2 &string $2 ] |
|
4 |
+ |
|
5 |
+( init ) |
|
6 |
+ |
|
7 |
+|0100 ( -> ) |
|
8 |
+ ;on-stdin .Console/vector DEO2 |
|
9 |
+BRK |
|
10 |
+ |
|
11 |
+@on-stdin ( -> ) |
|
12 |
+ .Console/char DEI .Console/byte DEO |
|
13 |
+ #0a .Console/char DEO |
|
14 |
+BRK |
|
0 | 15 |
\ No newline at end of file |
... | ... |
@@ -1,5 +1,7 @@ |
1 | 1 |
#include <stdio.h> |
2 | 2 |
#include <time.h> |
3 |
+#include <unistd.h> |
|
4 |
+#include <string.h> |
|
3 | 5 |
#include "uxn.h" |
4 | 6 |
|
5 | 7 |
/* |
... | ... |
@@ -15,6 +17,8 @@ WITH REGARD TO THIS SOFTWARE. |
15 | 17 |
|
16 | 18 |
#pragma mark - Core |
17 | 19 |
|
20 |
+static Device *devconsole; |
|
21 |
+ |
|
18 | 22 |
int |
19 | 23 |
error(char *msg, const char *err) |
20 | 24 |
{ |
... | ... |
@@ -41,14 +45,16 @@ printstack(Stack *s) |
41 | 45 |
void |
42 | 46 |
console_talk(Device *d, Uint8 b0, Uint8 w) |
43 | 47 |
{ |
48 |
+ char buffer[7], *p = buffer; |
|
49 |
+ int len = 0; |
|
44 | 50 |
if(!w) return; |
45 | 51 |
switch(b0) { |
46 |
- case 0x8: printf("%c", d->dat[0x8]); break; |
|
47 |
- case 0x9: printf("0x%02x", d->dat[0x9]); break; |
|
48 |
- case 0xb: printf("0x%04x", mempeek16(d->dat, 0xa)); break; |
|
49 |
- case 0xd: printf("%s", &d->mem[mempeek16(d->dat, 0xc)]); break; |
|
52 |
+ case 0x8: len = 1, p = (char *)&d->dat[0x8]; break; |
|
53 |
+ case 0x9: len = sprintf(p, "0x%02x", d->dat[0x9]); break; |
|
54 |
+ case 0xb: len = sprintf(p, "0x%04x", mempeek16(d->dat, 0xa)); break; |
|
55 |
+ case 0xd: len = strlen(p = (char *)&d->mem[mempeek16(d->dat, 0xc)]); break; |
|
50 | 56 |
} |
51 |
- fflush(stdout); |
|
57 |
+ if(len) write(1, p, len); |
|
52 | 58 |
} |
53 | 59 |
|
54 | 60 |
void |
... | ... |
@@ -106,6 +112,9 @@ start(Uxn *u) |
106 | 112 |
{ |
107 | 113 |
if(!evaluxn(u, PAGE_PROGRAM)) |
108 | 114 |
return error("Reset", "Failed"); |
115 |
+ while(mempeek16(devconsole->dat, 0)) |
|
116 |
+ while(read(0, &devconsole->dat[0x8], 1) > 0) |
|
117 |
+ evaluxn(u, mempeek16(devconsole->dat, 0)); |
|
109 | 118 |
return 1; |
110 | 119 |
} |
111 | 120 |
|
... | ... |
@@ -122,7 +131,7 @@ main(int argc, char **argv) |
122 | 131 |
return error("Load", "Failed"); |
123 | 132 |
|
124 | 133 |
portuxn(&u, 0x0, "empty", nil_talk); |
125 |
- portuxn(&u, 0x1, "console", console_talk); |
|
134 |
+ devconsole = portuxn(&u, 0x1, "console", console_talk); |
|
126 | 135 |
portuxn(&u, 0x2, "empty", nil_talk); |
127 | 136 |
portuxn(&u, 0x3, "empty", nil_talk); |
128 | 137 |
portuxn(&u, 0x4, "empty", nil_talk); |
... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
#include <stdio.h> |
2 | 2 |
#include <unistd.h> |
3 | 3 |
#include <time.h> |
4 |
+#include <fcntl.h> |
|
4 | 5 |
#include "uxn.h" |
5 | 6 |
|
6 | 7 |
#pragma GCC diagnostic push |
... | ... |
@@ -28,7 +29,7 @@ static SDL_Texture *fgTexture, *bgTexture; |
28 | 29 |
static SDL_Rect gRect; |
29 | 30 |
static Ppu ppu; |
30 | 31 |
static Apu apu[POLYPHONY]; |
31 |
-static Device *devscreen, *devmouse, *devctrl, *devaudio0; |
|
32 |
+static Device *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; |
|
32 | 33 |
|
33 | 34 |
#define PAD 16 |
34 | 35 |
|
... | ... |
@@ -234,14 +235,16 @@ system_talk(Device *d, Uint8 b0, Uint8 w) |
234 | 235 |
void |
235 | 236 |
console_talk(Device *d, Uint8 b0, Uint8 w) |
236 | 237 |
{ |
238 |
+ char buffer[7], *p = buffer; |
|
239 |
+ int len = 0; |
|
237 | 240 |
if(!w) return; |
238 | 241 |
switch(b0) { |
239 |
- case 0x8: write(1, &d->dat[0x8], 1); break; |
|
240 |
- case 0x9: fprintf(stdout, "0x%02x", d->dat[0x9]); break; |
|
241 |
- case 0xb: fprintf(stdout, "0x%04x", mempeek16(d->dat, 0xa)); break; |
|
242 |
- case 0xd: fprintf(stdout, "%s", &d->mem[mempeek16(d->dat, 0xc)]); break; |
|
242 |
+ case 0x8: len = 1, p = (char *)&d->dat[0x8]; break; |
|
243 |
+ case 0x9: len = sprintf(p, "0x%02x", d->dat[0x9]); break; |
|
244 |
+ case 0xb: len = sprintf(p, "0x%04x", mempeek16(d->dat, 0xa)); break; |
|
245 |
+ case 0xd: len = strlen(p = (char *)&d->mem[mempeek16(d->dat, 0xc)]); break; |
|
243 | 246 |
} |
244 |
- fflush(stdout); |
|
247 |
+ if(len) write(1, p, len); |
|
245 | 248 |
} |
246 | 249 |
|
247 | 250 |
void |
... | ... |
@@ -374,6 +377,8 @@ start(Uxn *u) |
374 | 377 |
break; |
375 | 378 |
} |
376 | 379 |
} |
380 |
+ while(read(0, &devconsole->dat[0x8], 1) > 0) |
|
381 |
+ evaluxn(u, mempeek16(devconsole->dat, 0)); |
|
377 | 382 |
evaluxn(u, mempeek16(devscreen->dat, 0)); |
378 | 383 |
if(reqdraw) |
379 | 384 |
redraw(u); |
... | ... |
@@ -391,6 +396,9 @@ main(int argc, char **argv) |
391 | 396 |
Uxn u; |
392 | 397 |
zoom = 2; |
393 | 398 |
|
399 |
+ /* set stdin nonblocking */ |
|
400 |
+ fcntl(0, F_SETFL, fcntl(0, F_GETFL, 0) | O_NONBLOCK); |
|
401 |
+ |
|
394 | 402 |
if(argc < 2) |
395 | 403 |
return error("Input", "Missing"); |
396 | 404 |
if(!bootuxn(&u)) |
... | ... |
@@ -401,7 +409,7 @@ main(int argc, char **argv) |
401 | 409 |
return error("Init", "Failed"); |
402 | 410 |
|
403 | 411 |
portuxn(&u, 0x0, "system", system_talk); |
404 |
- portuxn(&u, 0x1, "console", console_talk); |
|
412 |
+ devconsole = portuxn(&u, 0x1, "console", console_talk); |
|
405 | 413 |
devscreen = portuxn(&u, 0x2, "screen", screen_talk); |
406 | 414 |
devaudio0 = portuxn(&u, 0x3, "audio0", audio_talk); |
407 | 415 |
portuxn(&u, 0x4, "audio1", audio_talk); |