Ported uxncli to latest device I/O
This commit is contained in:
parent
62a35a9b15
commit
c9ad8e9e43
6
build.sh
6
build.sh
|
@ -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."
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
|
|
23
src/uxn11.c
23
src/uxn11.c
|
@ -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);
|
||||||
|
|
66
src/uxncli.c
66
src/uxncli.c
|
@ -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++) {
|
||||||
|
|
Loading…
Reference in New Issue