Allow roms to be loaded by a given path
This commit is contained in:
parent
43eaa37472
commit
87ce7bbb4b
19
Makefile
19
Makefile
|
@ -1,10 +1,13 @@
|
||||||
BASE_UXN := src/uxn/src
|
BASE_UXN := src/uxn
|
||||||
SRC_DIR ?= src
|
SRC_DIR ?= src
|
||||||
BUILD_DIR ?= build
|
BUILD_DIR ?= build
|
||||||
SRC_MAIN ?= $(SRC_DIR)/main.c
|
SRC_MAIN ?= $(SRC_DIR)/main.c
|
||||||
EXE_NAME ?= uxnfb
|
EXE_NAME ?= uxnfb
|
||||||
BIN := $(BUILD_DIR)/$(EXE_NAME)
|
BIN := $(BUILD_DIR)/$(EXE_NAME)
|
||||||
UXN_HEAD := $(BASE_UXN)/uxn.h
|
UXN_HEAD := $(BASE_UXN)/src/uxn.h
|
||||||
|
TAL_SRC ?= $(BASE_UXN)/projects/examples/devices/screen.tal
|
||||||
|
UXN_ROM ?= $(BUILD_DIR)/screen.rom
|
||||||
|
UXN_ASM ?= $(BUILD_DIR)/uxnasm
|
||||||
|
|
||||||
CC ?= cc
|
CC ?= cc
|
||||||
CFLAGS := -Wall -Wextra -pedantic
|
CFLAGS := -Wall -Wextra -pedantic
|
||||||
|
@ -35,10 +38,16 @@ $(UXN_HEAD):
|
||||||
git submodule init
|
git submodule init
|
||||||
git submodule update
|
git submodule update
|
||||||
|
|
||||||
run: $(BIN)
|
$(UXN_ASM): $(UXN_HEAD)
|
||||||
|
$(CC) $(CFLAGS) -o $(UXN_ASM) $(BASE_UXN)/src/uxnasm.c
|
||||||
|
|
||||||
|
$(UXN_ROM): $(UXN_ASM)
|
||||||
|
./$(UXN_ASM) $(TAL_SRC) $(UXN_ROM)
|
||||||
|
|
||||||
|
run: $(BIN) $(UXN_ROM)
|
||||||
# NOTE: This should probably be done on the C code.
|
# NOTE: This should probably be done on the C code.
|
||||||
echo 0 > /sys/class/graphics/fbcon/cursor_blink
|
# echo 0 > /sys/class/graphics/fbcon/cursor_blink
|
||||||
./$(BIN)
|
./$(BIN) $(UXN_ROM)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIR)
|
rm -rf $(BUILD_DIR)
|
||||||
|
|
39
src/main.c
39
src/main.c
|
@ -11,7 +11,6 @@
|
||||||
#include "shorthand.h"
|
#include "shorthand.h"
|
||||||
#include "ppu.c"
|
#include "ppu.c"
|
||||||
#include "uxn-fast.c"
|
#include "uxn-fast.c"
|
||||||
#include "rom.c"
|
|
||||||
|
|
||||||
static Uxn u;
|
static Uxn u;
|
||||||
static Device *devscreen;
|
static Device *devscreen;
|
||||||
|
@ -140,6 +139,7 @@ screen_talk(Device *d, u8 b0, u8 w) {
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
reqdraw = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -166,15 +166,35 @@ file_talk(Device *d, u8 b0, u8 w) {
|
||||||
(void)w;
|
(void)w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
init_uxn() {
|
load_rom(char *file_name) {
|
||||||
|
FILE *file = fopen(file_name, "r");
|
||||||
|
if (!file) {
|
||||||
|
fprintf(stderr, "error: couldn't open file: %s\n", file_name);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
size_t rom_size = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
char *uxn_rom = malloc(rom_size);
|
||||||
|
fread(uxn_rom, 1, rom_size, file);
|
||||||
|
memcpy(u.ram.dat + PAGE_PROGRAM, uxn_rom, rom_size);
|
||||||
|
fclose(file);
|
||||||
|
free(uxn_rom);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_uxn(char *file_name) {
|
||||||
// Clear UXN memory.
|
// Clear UXN memory.
|
||||||
memset(&u, 0, sizeof(Uxn));
|
memset(&u, 0, sizeof(Uxn));
|
||||||
|
|
||||||
ppu_init();
|
|
||||||
|
|
||||||
// Copy rom to VM.
|
// Copy rom to VM.
|
||||||
memcpy(u.ram.dat + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom));
|
load_rom(file_name);
|
||||||
|
|
||||||
|
// Initialize framebuffer.
|
||||||
|
ppu_init();
|
||||||
|
|
||||||
// Prepare devices.
|
// Prepare devices.
|
||||||
uxn_port(&u, 0x0, "system", system_talk);
|
uxn_port(&u, 0x0, "system", system_talk);
|
||||||
|
@ -198,8 +218,13 @@ init_uxn() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void) {
|
main(int argc, char *argv[]) {
|
||||||
init_uxn();
|
if (argc <= 1) {
|
||||||
|
// TODO: If no rom is given, embed the uxn compiler rom.
|
||||||
|
fprintf(stderr, "error: no rom selected\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
init_uxn(argv[1]);
|
||||||
|
|
||||||
// Main loop.
|
// Main loop.
|
||||||
uxn_eval(&u, 0x0100);
|
uxn_eval(&u, 0x0100);
|
||||||
|
|
|
@ -88,12 +88,12 @@ ppu_init(void) {
|
||||||
// Open frambuffer and get the size.
|
// Open frambuffer and get the size.
|
||||||
int fb = open("/dev/fb0", O_RDWR);
|
int fb = open("/dev/fb0", O_RDWR);
|
||||||
if (fb <= 0) {
|
if (fb <= 0) {
|
||||||
fprintf(stderr, "couldn't open the framebuffer\n");
|
fprintf(stderr, "error: couldn't open the framebuffer\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
struct fb_var_screeninfo info;
|
struct fb_var_screeninfo info;
|
||||||
if (ioctl(fb, FBIOGET_VSCREENINFO, &info) != 0) {
|
if (ioctl(fb, FBIOGET_VSCREENINFO, &info) != 0) {
|
||||||
fprintf(stderr, "couldn't get the framebuffer size\n");
|
fprintf(stderr, "error: couldn't get the framebuffer size\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ ppu_init(void) {
|
||||||
size_t len = 4 * screen_width * screen_height;
|
size_t len = 4 * screen_width * screen_height;
|
||||||
framebuffer = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
|
framebuffer = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
|
||||||
if (framebuffer == MAP_FAILED) {
|
if (framebuffer == MAP_FAILED) {
|
||||||
fprintf(stderr, "couldn't mmap the framebuffer\n");
|
fprintf(stderr, "error: couldn't mmap the framebuffer\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
52
src/rom.c
52
src/rom.c
|
@ -1,52 +0,0 @@
|
||||||
const u16 uxn_rom[] = {
|
|
||||||
0x0120, 0x8043, 0x3720, 0xf020, 0x807f, 0x3708, 0xf020, 0x80e0,
|
|
||||||
0x370a, 0xf020, 0x80c0, 0x370c, 0x2280, 0x8036, 0x3f01, 0x0020,
|
|
||||||
0x3920, 0x0280, 0x8031, 0x3624, 0x0180, 0x803f, 0x3104, 0x0120,
|
|
||||||
0x2ed4, 0x0220, 0x2e2f, 0x0220, 0x2e71, 0x0220, 0x2eae, 0x0320,
|
|
||||||
0x2e3a, 0x8000, 0x3000, 0x2321, 0x0080, 0x8031, 0x3002, 0x0020,
|
|
||||||
0x3848, 0x2880, 0x8037, 0x3004, 0x0020, 0x3950, 0x2a80, 0x8037,
|
|
||||||
0x0f01, 0x0305, 0x0480, 0x801f, 0x0500, 0x3080, 0x203f, 0x9103,
|
|
||||||
0x8038, 0x372c, 0x80cf, 0x172f, 0x0f80, 0x801c, 0x0500, 0x3080,
|
|
||||||
0x203f, 0x9103, 0x8038, 0x372c, 0x2880, 0x2036, 0x0800, 0x8038,
|
|
||||||
0x3728, 0x80cf, 0x172f, 0x8003, 0x1f04, 0x0080, 0x8005, 0x3f30,
|
|
||||||
0x0320, 0x3891, 0x2c80, 0x8037, 0x3628, 0x0020, 0x3808, 0x2880,
|
|
||||||
0xcf37, 0x2f80, 0x8017, 0x1c0f, 0x0080, 0x8005, 0x3f30, 0x0320,
|
|
||||||
0x3891, 0x2c80, 0x8037, 0x3628, 0x0020, 0x3808, 0x2880, 0x4f37,
|
|
||||||
0x2f80, 0x0017, 0x1080, 0x0080, 0x8003, 0x1f30, 0x0080, 0x2005,
|
|
||||||
0x9103, 0x8038, 0x372c, 0x8003, 0x1f30, 0x0080, 0x8005, 0x3002,
|
|
||||||
0x0020, 0x3940, 0x8038, 0x3728, 0x0480, 0x2030, 0x5000, 0x8039,
|
|
||||||
0x372a, 0x0180, 0x2f80, 0x0317, 0x3080, 0x801f, 0x0500, 0x0480,
|
|
||||||
0x2030, 0x4000, 0x3839, 0x2a80, 0x8037, 0x3002, 0x0020, 0x3950,
|
|
||||||
0x2880, 0x8037, 0x8001, 0x172f, 0x8a01, 0xab80, 0x220d, 0x206c,
|
|
||||||
0x8103, 0x2c80, 0x8037, 0x8000, 0x0300, 0x0f80, 0x801c, 0x1f40,
|
|
||||||
0x0180, 0x801f, 0x0500, 0x0280, 0x2030, 0x4000, 0x3839, 0x2880,
|
|
||||||
0x0337, 0xf080, 0x801c, 0x1f01, 0x0080, 0x8005, 0x3004, 0x0020,
|
|
||||||
0x3940, 0x8038, 0x372a, 0x8003, 0x172f, 0x8901, 0xca80, 0x220d,
|
|
||||||
0x806c, 0x8010, 0x8f00, 0x8003, 0x1f02, 0x0080, 0x8005, 0x3f40,
|
|
||||||
0x0480, 0x2030, 0x4000, 0x3839, 0x032f, 0x0380, 0x801c, 0x0500,
|
|
||||||
0x4080, 0x203f, 0x4000, 0x8038, 0x3002, 0x0020, 0x3808, 0x6f38,
|
|
||||||
0x804f, 0x2000, 0xe702, 0x012e, 0x808a, 0x0dc9, 0x6c22, 0x1080,
|
|
||||||
0x0080, 0x038f, 0x0280, 0x801f, 0x0500, 0x4080, 0x803f, 0x3004,
|
|
||||||
0x2f38, 0x8003, 0x1c03, 0x0080, 0x8005, 0x3f40, 0x0020, 0x3840,
|
|
||||||
0x0280, 0x2030, 0x0800, 0x3838, 0x4f6f, 0x8080, 0x0220, 0x2ee7,
|
|
||||||
0x8a01, 0xcd80, 0x220d, 0x186c, 0x200f, 0x8103, 0x2c80, 0x8037,
|
|
||||||
0x372a, 0x2880, 0x8037, 0xcf00, 0x8018, 0x172f, 0x2880, 0x2036,
|
|
||||||
0x0800, 0x8038, 0x3728, 0x1080, 0x18cf, 0x2f80, 0x8017, 0x3628,
|
|
||||||
0x0020, 0x3908, 0x2880, 0x8037, 0x362a, 0x0020, 0x3808, 0x2a80,
|
|
||||||
0x8037, 0xcf20, 0x8018, 0x172f, 0x2880, 0x2036, 0x0800, 0x8038,
|
|
||||||
0x3728, 0x3080, 0x184f, 0x2f80, 0x6c17, 0x0480, 0x2030, 0x4000,
|
|
||||||
0x8039, 0x372a, 0x0280, 0x2030, 0x4800, 0x8038, 0x3728, 0x0080,
|
|
||||||
0x2e80, 0x8017, 0x3002, 0x0020, 0x3849, 0x2880, 0x8037, 0x8001,
|
|
||||||
0x172e, 0x0280, 0x2030, 0x4a00, 0x8038, 0x3728, 0x0280, 0x2e80,
|
|
||||||
0x8017, 0x3002, 0x0020, 0x384b, 0x2880, 0x8037, 0x8003, 0x172e,
|
|
||||||
0x0f6c, 0x6738, 0xdf5f, 0xbfbf, 0x00bf, 0x1807, 0x2320, 0x4844,
|
|
||||||
0x0048, 0x827c, 0x8282, 0x8282, 0x007c, 0x1030, 0x1010, 0x1010,
|
|
||||||
0x0010, 0x827c, 0x7c02, 0x8080, 0x00fe, 0x827c, 0x1c02, 0x8202,
|
|
||||||
0x007c, 0x140c, 0x4424, 0xfe84, 0x0004, 0x80fe, 0x7c80, 0x8202,
|
|
||||||
0x007c, 0x827c, 0xfc80, 0x8282, 0x007c, 0x827c, 0x1e02, 0x0202,
|
|
||||||
0x0002, 0x827c, 0x7c82, 0x8282, 0x007c, 0x827c, 0x7e82, 0x8202,
|
|
||||||
0x007c, 0x827c, 0x7e02, 0x8282, 0x007e, 0x82fc, 0xfc82, 0x8282,
|
|
||||||
0x00fc, 0x827c, 0x8080, 0x8280, 0x007c, 0x82fc, 0x8282, 0x8282,
|
|
||||||
0x00fc, 0x827c, 0xf080, 0x8280, 0x007c, 0x827c, 0xf080, 0x8080,
|
|
||||||
0x8080,
|
|
||||||
};
|
|
Loading…
Reference in New Issue