73 lines
1.8 KiB
C
73 lines
1.8 KiB
C
|
/* 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 <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#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;
|
||
|
}
|