Ported uxncli to latest device I/O

This commit is contained in:
neauoire 2022-04-05 12:08:49 -07:00
parent 62a35a9b15
commit c9ad8e9e43
5 changed files with 42 additions and 55 deletions

View File

@ -4,6 +4,7 @@ if [ "${1}" = '--format' ];
then then
echo "Formatting.." echo "Formatting.."
clang-format -i src/uxn11.c clang-format -i src/uxn11.c
clang-format -i src/uxncli.c
clang-format -i src/devices/* clang-format -i src/devices/*
fi fi
@ -17,11 +18,12 @@ if [ "${1}" = '--install' ];
then then
echo "Installing.." echo "Installing.."
gcc src/uxn.c src/devices/system.c src/devices/screen.c src/devices/controller.c src/devices/mouse.c src/devices/file.c src/devices/datetime.c src/uxn11.c -D_POSIX_C_SOURCE=199309L -DNDEBUG -Os -g0 -s -o bin/uxn11 -lX11 gcc src/uxn.c src/devices/system.c src/devices/screen.c src/devices/controller.c src/devices/mouse.c src/devices/file.c src/devices/datetime.c src/uxn11.c -D_POSIX_C_SOURCE=199309L -DNDEBUG -Os -g0 -s -o bin/uxn11 -lX11
# gcc src/uxn.c src/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c -D_POSIX_C_SOURCE=199309L -DNDEBUG -Os -g0 -s -o bin/uxncli gcc src/uxn.c src/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c -D_POSIX_C_SOURCE=199309L -DNDEBUG -Os -g0 -s -o bin/uxncli
cp bin/uxn11 ~/bin cp bin/uxn11 ~/bin
cp bin/uxncli ~/bin
else else
gcc -std=c89 -D_POSIX_C_SOURCE=199309L -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/devices/system.c src/devices/screen.c src/devices/controller.c src/devices/mouse.c src/devices/file.c src/devices/datetime.c src/uxn11.c -o bin/uxn11 -lX11 gcc -std=c89 -D_POSIX_C_SOURCE=199309L -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/devices/system.c src/devices/screen.c src/devices/controller.c src/devices/mouse.c src/devices/file.c src/devices/datetime.c src/uxn11.c -o bin/uxn11 -lX11
# gcc -std=c89 -D_POSIX_C_SOURCE=199309L -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/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c -o bin/uxncli gcc -std=c89 -D_POSIX_C_SOURCE=199309L -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/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c -o bin/uxncli
fi fi
echo "Done." echo "Done."

View File

@ -58,6 +58,5 @@ system_deo(Uxn *u, Uint8 *d, Uint8 port)
case 0x2: u->wst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10000)); break; case 0x2: u->wst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10000)); break;
case 0x3: u->rst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10100)); break; case 0x3: u->rst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10100)); break;
case 0xe: system_inspect(u); break; case 0xe: system_inspect(u); break;
default: system_deo_special(d, port);
} }
} }

View File

@ -11,4 +11,3 @@ WITH REGARD TO THIS SOFTWARE.
void system_inspect(Uxn *u); void system_inspect(Uxn *u);
void system_deo(Uxn *u, Uint8 *d, Uint8 port); void system_deo(Uxn *u, Uint8 *d, Uint8 port);
void system_deo_special(Uint8 *d, Uint8 port);

View File

@ -30,13 +30,6 @@ error(char *msg, const char *err)
return 0; return 0;
} }
void
system_deo_special(Uint8 *d, Uint8 port)
{
if(port > 0x7 && port < 0xe)
screen_palette(&uxn_screen, &d[0x8]);
}
static int static int
console_input(Uxn *u, char c) console_input(Uxn *u, char c)
{ {
@ -61,10 +54,10 @@ uxn11_dei(struct Uxn *u, Uint8 addr)
{ {
Uint8 p = addr & 0x0f, d = addr & 0xf0; Uint8 p = addr & 0x0f, d = addr & 0xf0;
switch(d) { switch(d) {
case 0x20: return screen_dei(&u->dev[d], p); break; case 0x20: return screen_dei(&u->dev[d], p);
case 0xa0: return file_dei(0, &u->dev[d], p); break; case 0xa0: return file_dei(0, &u->dev[d], p);
case 0xb0: return file_dei(1, &u->dev[d], p); break; case 0xb0: return file_dei(1, &u->dev[d], p);
case 0xc0: return datetime_dei(&u->dev[d], p); break; case 0xc0: return datetime_dei(&u->dev[d], p);
} }
return u->dev[addr]; return u->dev[addr];
} }
@ -75,7 +68,11 @@ uxn11_deo(Uxn *u, Uint8 addr, Uint8 v)
Uint8 p = addr & 0x0f, d = addr & 0xf0; Uint8 p = addr & 0x0f, d = addr & 0xf0;
u->dev[addr] = v; u->dev[addr] = v;
switch(d) { switch(d) {
case 0x00: system_deo(u, &u->dev[d], p); break; case 0x00:
system_deo(u, &u->dev[d], p);
if(p > 0x7 && p < 0xe)
screen_palette(&uxn_screen, &u->dev[0x8]);
break;
case 0x10: console_deo(&u->dev[d], p); break; case 0x10: console_deo(&u->dev[d], p); break;
case 0x20: screen_deo(u->ram, &u->dev[d], p); break; case 0x20: screen_deo(u->ram, &u->dev[d], p); break;
case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break; case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break;
@ -171,7 +168,7 @@ start(Uxn *u, char *rom)
return error("Boot", "Failed"); return error("Boot", "Failed");
if(!load_rom(u, rom)) if(!load_rom(u, rom))
return error("Load", "Failed"); return error("Load", "Failed");
fprintf(stderr, "Loaded %s\n", rom); fprintf(stderr, ">> Loaded %s\n", rom);
u->dei = uxn11_dei; u->dei = uxn11_dei;
u->deo = uxn11_deo; u->deo = uxn11_deo;
screen_resize(&uxn_screen, WIDTH, HEIGHT); screen_resize(&uxn_screen, WIDTH, HEIGHT);

View File

@ -24,50 +24,54 @@ error(char *msg, const char *err)
return 0; return 0;
} }
void static int
system_deo_special(Uint8 *d, Uint8 port) console_input(Uxn *u, char c)
{ {
(void)d; Uint8 *d = &u->dev[0x10];
(void)port; d[0x02] = c;
return uxn_eval(u, GETVEC(d));
} }
static void static void
console_deo(Device *d, Uint8 port) console_deo(Uint8 *d, Uint8 port)
{ {
FILE *fd = port == 0x8 ? stdout : port == 0x9 ? stderr FILE *fd = port == 0x8 ? stdout : port == 0x9 ? stderr
: 0; : 0;
if(fd) { if(fd) {
fputc(d->dat[port], fd); fputc(d[port], fd);
fflush(fd); fflush(fd);
} }
} }
static Uint8 static Uint8
nil_dei(Device *d, Uint8 port) uxn11_dei(struct Uxn *u, Uint8 addr)
{ {
return d->dat[port]; Uint8 p = addr & 0x0f, d = addr & 0xf0;
switch(d) {
case 0xa0: return file_dei(0, &u->dev[d], p);
case 0xb0: return file_dei(1, &u->dev[d], p);
case 0xc0: return datetime_dei(&u->dev[d], p);
}
return u->dev[addr];
} }
static void static void
nil_deo(Device *d, Uint8 port) uxn11_deo(Uxn *u, Uint8 addr, Uint8 v)
{ {
(void)d; Uint8 p = addr & 0x0f, d = addr & 0xf0;
(void)port; u->dev[addr] = v;
} switch(d) {
case 0x00: system_deo(u, &u->dev[d], p); break;
static int case 0x10: console_deo(&u->dev[d], p); break;
console_input(Uxn *u, char c) case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break;
{ case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break;
Device *d = &u->dev[1]; }
d->dat[0x2] = c;
return uxn_eval(u, GETVECTOR(d));
} }
static void static void
run(Uxn *u) run(Uxn *u)
{ {
Device *d = &u->dev[0]; while(!u->dev[0x0f]) {
while(!d->dat[0xf]) {
int c = fgetc(stdin); int c = fgetc(stdin);
if(c != EOF) if(c != EOF)
console_input(u, (Uint8)c); console_input(u, (Uint8)c);
@ -85,22 +89,8 @@ start(Uxn *u)
{ {
if(!uxn_boot(u, (Uint8 *)calloc(0x10200, sizeof(Uint8)))) if(!uxn_boot(u, (Uint8 *)calloc(0x10200, sizeof(Uint8))))
return error("Boot", "Failed"); return error("Boot", "Failed");
/* system */ uxn_port(u, 0x0, nil_dei, system_deo); u->dei = uxn11_dei;
/* console */ uxn_port(u, 0x1, nil_dei, console_deo); u->deo = uxn11_deo;
/* empty */ uxn_port(u, 0x2, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x3, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x4, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x5, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x6, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x7, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x8, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0x9, nil_dei, nil_deo);
/* file0 */ uxn_port(u, 0xa, file_dei, file_deo);
/* file1 */ uxn_port(u, 0xb, file_dei, file_deo);
/* datetime */ uxn_port(u, 0xc, datetime_dei, nil_deo);
/* empty */ uxn_port(u, 0xd, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0xe, nil_dei, nil_deo);
/* empty */ uxn_port(u, 0xf, nil_dei, nil_deo);
return 1; return 1;
} }
@ -115,7 +105,7 @@ main(int argc, char **argv)
return error("Start", "Failed"); return error("Start", "Failed");
if(!load_rom(&u, argv[1])) if(!load_rom(&u, argv[1]))
return error("Load", "Failed"); return error("Load", "Failed");
fprintf(stderr, "Loaded %s\n", argv[1]); fprintf(stderr, ">> Loaded %s\n", argv[1]);
if(!uxn_eval(&u, PAGE_PROGRAM)) if(!uxn_eval(&u, PAGE_PROGRAM))
return error("Init", "Failed"); return error("Init", "Failed");
for(i = 2; i < argc; i++) { for(i = 2; i < argc; i++) {