diff --git a/makefile b/makefile
index fe0e9af..1a59a81 100644
--- a/makefile
+++ b/makefile
@@ -15,33 +15,41 @@
## along with stage0. If not, see .
+# Collections of tools
all: libvm vm
-libvm: wrapper.c vm_instructions.c vm_decode.c vm.h tty.c
- gcc -ggdb -Dtty_lib=true -shared -Wl,-soname,libvm.so -o libvm.so -fPIC wrapper.c vm_instructions.c vm_decode.c vm.h tty.c
+production: libvm-production vm-production asm dis
+
+development: vm libvm asm dis
+
+# VM Builds
+vm-minimal: vm.h vm_minimal.c vm_instructions.c vm_decode.c
+ gcc vm.h vm_minimal.c vm_instructions.c vm_decode.c -o bin/vm
vm: vm.h vm.c vm_instructions.c vm_decode.c tty.c
gcc -ggdb -Dtty_lib=true vm.h vm.c vm_instructions.c vm_decode.c tty.c -o bin/vm
+vm-production: vm.h vm.c vm_instructions.c vm_decode.c
+ gcc vm.h vm.c vm_instructions.c vm_decode.c -o bin/vm
+
vm-trace: vm.h vm.c vm_instructions.c vm_decode.c tty.c dynamic_execution_trace.c
gcc -ggdb -Dtty_lib=true -DTRACE=true vm.h vm.c vm_instructions.c vm_decode.c tty.c dynamic_execution_trace.c -o bin/vm
-production: libvm-production vm-production asm dis
+# libVM Builds for Development tools
+libvm: wrapper.c vm_instructions.c vm_decode.c vm.h tty.c
+ gcc -ggdb -Dtty_lib=true -shared -Wl,-soname,libvm.so -o libvm.so -fPIC wrapper.c vm_instructions.c vm_decode.c vm.h tty.c
libvm-production: wrapper.c vm_instructions.c vm_decode.c vm.h
gcc -shared -Wl,-soname,libvm.so -o libvm.so -fPIC wrapper.c vm_instructions.c vm_decode.c vm.h
-vm-production: vm.h vm.c vm_instructions.c vm_decode.c
- gcc vm.h vm.c vm_instructions.c vm_decode.c -o bin/vm
-
-development: vm libvm asm dis
-
+# Primitive development tools, not required but it was handy
asm: High_level_prototypes/asm.c
gcc -ggdb High_level_prototypes/asm.c -o bin/asm
dis: High_level_prototypes/disasm.c
gcc -ggdb High_level_prototypes/disasm.c -o bin/dis
+# Clean up after ourselves
clean:
rm libvm.so bin/vm
diff --git a/vm.c b/vm.c
index ceca29e..de77483 100644
--- a/vm.c
+++ b/vm.c
@@ -16,12 +16,13 @@
*/
#include "vm.h"
+#include
/* Load program tape into Memory */
-void load_program(struct lilith* vm, char **argv)
+void load_program(struct lilith* vm, char* rom_name)
{
FILE* program;
- program = fopen(argv[1], "r");
+ program = fopen(rom_name, "r");
/* Figure out how much we need to load */
fseek(program, 0, SEEK_END);
@@ -52,19 +53,62 @@ void execute_vm(struct lilith* vm)
/* Standard C main program */
int main(int argc, char **argv)
{
- /* Make sure we have a program tape to run */
- if (argc < 2)
+ int c;
+
+ tape_01_name = "tape_01";
+ tape_02_name = "tape_02";
+ char* rom_name = NULL;
+
+ static struct option long_options[] = {
+ {"rom", required_argument, 0, 'r'},
+ {"tape_01", required_argument, 0, '1'},
+ {"tape_02", required_argument, 0, '2'},
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ int option_index = 0;
+ while ((c = getopt_long(argc, argv, "r:h:1:2", long_options, &option_index)) != -1)
{
- fprintf(stderr, "Usage: %s $FileName\nWhere $FileName is the name of the paper tape of the program being run\n", argv[0]);
- return EXIT_FAILURE;
+ switch (c)
+ {
+ case 0: break;
+ case 'r':
+ {
+ rom_name = optarg;
+ break;
+ }
+ case 'h':
+ {
+ fprintf(stdout, "Usage: %s --rom $rom [--tape_01 $foo] [--tape_02 $bar]\n", argv[0]);
+ exit(EXIT_SUCCESS);
+ }
+ case '1':
+ {
+ tape_01_name = optarg;
+ break;
+ }
+ case '2':
+ {
+ tape_02_name = optarg;
+ break;
+ }
+ default:
+ {
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+
+ if(NULL == rom_name)
+ {
+ fprintf(stderr, "Usage: %s --rom $rom [--tape_01 $foo] [--tape_02 $bar]\n", argv[0]);
+ exit(EXIT_FAILURE);
}
/* Perform all the essential stages in order */
struct lilith* vm;
- tape_01_name = "tape_01";
- tape_02_name = "tape_02";
vm = create_vm(1 << 21);
- load_program(vm, argv);
+ load_program(vm, rom_name);
execute_vm(vm);
destroy_vm(vm);
diff --git a/vm_minimal.c b/vm_minimal.c
new file mode 100644
index 0000000..ceca29e
--- /dev/null
+++ b/vm_minimal.c
@@ -0,0 +1,72 @@
+/* Copyright (C) 2016 Jeremiah Orians
+ * This file is part of stage0.
+ *
+ * stage0 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * stage0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with stage0. If not, see .
+ */
+
+#include "vm.h"
+
+/* Load program tape into Memory */
+void load_program(struct lilith* vm, char **argv)
+{
+ FILE* program;
+ program = fopen(argv[1], "r");
+
+ /* Figure out how much we need to load */
+ fseek(program, 0, SEEK_END);
+ size_t end = ftell(program);
+ rewind(program);
+
+ /* Load the entire tape into memory */
+ fread(vm->memory, 1, end, program);
+
+ fclose(program);
+}
+
+void execute_vm(struct lilith* vm)
+{
+ struct Instruction* current;
+ current = calloc(1, sizeof(struct Instruction));
+
+ while(!vm->halted)
+ {
+ read_instruction(vm, current);
+ eval_instruction(vm, current);
+ }
+
+ free(current);
+ return;
+}
+
+/* Standard C main program */
+int main(int argc, char **argv)
+{
+ /* Make sure we have a program tape to run */
+ if (argc < 2)
+ {
+ fprintf(stderr, "Usage: %s $FileName\nWhere $FileName is the name of the paper tape of the program being run\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ /* Perform all the essential stages in order */
+ struct lilith* vm;
+ tape_01_name = "tape_01";
+ tape_02_name = "tape_02";
+ vm = create_vm(1 << 21);
+ load_program(vm, argv);
+ execute_vm(vm);
+ destroy_vm(vm);
+
+ return EXIT_SUCCESS;
+}