diff --git a/makefile b/makefile index f1db850..6be53a0 100644 --- a/makefile +++ b/makefile @@ -1,11 +1,11 @@ -SRC=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=src/uxn.c src/devices/system.c src/devices/console.c src/devices/screen.c src/devices/controller.c src/devices/mouse.c src/devices/file.c src/devices/datetime.c RELEASE_flags=-std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas DEBUG_flags=-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 ASM=bin/uxnasm .PHONY: all dest run install uninstall format clean -all: dest bin/uxnasm bin/porporo bin/menu.rom bin/potato.rom bin/wallpaper.rom bin/log.rom +all: dest bin/uxnasm bin/uxncli bin/porporo bin/menu.rom bin/potato.rom bin/wallpaper.rom bin/log.rom dest: @ mkdir -p bin @@ -20,8 +20,10 @@ format: clean: @ rm -f bin/* -bin/uxnasm: etc/uxnasm.c - @ cc ${RELEASE_flags} etc/uxnasm.c -o bin/uxnasm +bin/uxnasm: src/uxnasm.c + @ cc ${RELEASE_flags} src/uxnasm.c -o bin/uxnasm +bin/uxncli: src/uxncli.c + @ cc ${RELEASE_flags} ${SRC} src/uxncli.c -o bin/uxncli bin/porporo: ${SRC} src/porporo.c @ cc ${DEBUG_flags} ${SRC} src/porporo.c -L/usr/local/lib -lSDL2 -o bin/porporo diff --git a/etc/uxnasm.c b/src/uxnasm.c similarity index 100% rename from etc/uxnasm.c rename to src/uxnasm.c diff --git a/src/uxncli.c b/src/uxncli.c new file mode 100644 index 0000000..b02db8e --- /dev/null +++ b/src/uxncli.c @@ -0,0 +1,86 @@ +#include +#include + +#include "uxn.h" +#include "devices/system.h" +#include "devices/console.h" +#include "devices/file.h" +#include "devices/datetime.h" + +/* +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE. +*/ + +static Varvara varvara; + +Uint8 +emu_dei(Uxn *u, Uint8 addr) +{ + switch(addr & 0xf0) { + case 0x00: return system_dei(u, addr); + case 0xc0: return datetime_dei(u, addr); + } + return u->dev[addr]; +} + +void +emu_deo(Uxn *u, Uint8 addr, Uint8 value) +{ + Uint8 p = addr & 0x0f, d = addr & 0xf0; + u->dev[addr] = value; + switch(d) { + case 0x00: system_deo(u, &u->dev[d], p); break; + case 0x10: console_deo(&u->dev[d], p); break; + case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break; + case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break; + } +} + +static void +emu_run(Uxn *u) +{ + while(!u->dev[0x0f]) { + int c = fgetc(stdin); + if(c == EOF) { + console_input(u, 0x00, CONSOLE_END); + break; + } + console_input(u, (Uint8)c, CONSOLE_STD); + } +} + +static int +emu_end(Uxn *u) +{ + free(u->ram); + return u->dev[0x0f] & 0x7f; +} + +int +main(int argc, char **argv) +{ + int i = 1; + if(i == argc) + return system_error("usage", "uxncli [-v] file.rom [args..]"); + /* Read flags */ + if(argv[i][0] == '-' && argv[i][1] == 'v') + return !fprintf(stdout, "Porporo - Console Varvara Emulator, 15 Dec 2023.\n"); + varvara.u.ram = (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)); + system_boot(&varvara.u, 0); + if(!system_load(&varvara, &varvara.u, argv[i++])) + return system_error("Init", "Failed to initialize uxn."); + /* Game Loop */ + varvara.u.dev[0x17] = argc - i; + if(uxn_eval(&varvara.u, PAGE_PROGRAM)) { + console_listen(&varvara.u, i, argc, argv); + emu_run(&varvara.u); + } + return emu_end(&varvara.u); +}