diff --git a/.gitignore b/.gitignore index 03fa769..814ac03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.o *.a +*.bin m16vm m16as diff --git a/README.md b/README.md index 0e22dda..0d90467 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,50 @@ The design is taken from the real world and tries to mimic existing RISC-archite The instruction set is by no means designed to be "fast" or "optimal" but focus more on being easy to understand and modify/play with. +Compile +------- + +The code is compiled via Makefile. + +```sh +$ make +``` + +The code is compiled into 2 programs: + +* `m16as` - Assembler - Compiles assembler code into binary form. +* `m16vm` - Virtual Machine, will run binary code from a file. + + +Example for first compile assembly code and then run it: + +```sh +$ ./m16as examples/asm/hello_world.as > prog.bin +$ ./m16vm ./prog.bin +HELLO WORLD +``` + +Usage +----- + +#### m16as + +``` +Usage: ./m16as [ ] +``` + +`m16as` is pretty streigth forward. if no `outputfile` is given, the output is written to `stdout` + +#### m16vm + +``` +usage: ./m16vm [ --dmem | --dreg ] +``` + +* `--dmem` - debug memory, after the program has executed the last instruction, the contents of the memory is printed to `stdout`. NOTE: only the first 32 bytes are printed to + +* `--dreg` - debug registers, after the program has executed the last instruction, the contents of the registers is printed to `stdout`. + Specification ------------- diff --git a/as/as.c b/as/as.c index 5218307..0c703db 100644 --- a/as/as.c +++ b/as/as.c @@ -1,6 +1,6 @@ /* as.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ int usage(char *program) { - fprintf(stderr, "Usage: %s [ [ ]\n", program); return -1; } @@ -55,6 +55,7 @@ int main(int argc, char **argv) { parse(fd_in, fd_out); fclose(fd_in); - fclose(fd_out); + if (fd_out != stdout) + fclose(fd_out); return 0; } diff --git a/as/asm_error.h b/as/asm_error.h index 950687c..f6bfbb9 100644 --- a/as/asm_error.h +++ b/as/asm_error.h @@ -1,6 +1,6 @@ /* asm_error.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/ast.c b/as/ast.c index fa78e68..752c1ff 100644 --- a/as/ast.c +++ b/as/ast.c @@ -1,6 +1,6 @@ /* ast.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/ast.h b/as/ast.h index 74c62e0..931a162 100644 --- a/as/ast.h +++ b/as/ast.h @@ -1,6 +1,6 @@ /* ast.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/codegen.c b/as/codegen.c index 334350d..8c1232d 100644 --- a/as/codegen.c +++ b/as/codegen.c @@ -1,6 +1,6 @@ /* codegen.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/codegen.h b/as/codegen.h index ae08acf..1d3b1e2 100644 --- a/as/codegen.h +++ b/as/codegen.h @@ -1,6 +1,6 @@ /* codegen.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/lexer.c b/as/lexer.c index d8ada70..98c4c39 100644 --- a/as/lexer.c +++ b/as/lexer.c @@ -1,6 +1,6 @@ /* lexer.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/lexer.h b/as/lexer.h index f9594a7..3e2a419 100644 --- a/as/lexer.h +++ b/as/lexer.h @@ -1,6 +1,6 @@ /* lexer.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/lexer/grammar.h b/as/lexer/grammar.h index 68ef410..29b9d8d 100644 --- a/as/lexer/grammar.h +++ b/as/lexer/grammar.h @@ -2,7 +2,7 @@ * * Macros for the grammar. * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/lexer/number.c b/as/lexer/number.c index 231cd42..2af610d 100644 --- a/as/lexer/number.c +++ b/as/lexer/number.c @@ -1,6 +1,6 @@ /* lexer/number.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/lexer/number.h b/as/lexer/number.h index 77404d2..43b07a9 100644 --- a/as/lexer/number.h +++ b/as/lexer/number.h @@ -1,6 +1,6 @@ /* lexer/number.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/parser.c b/as/parser.c index a8a6b70..239dd34 100644 --- a/as/parser.c +++ b/as/parser.c @@ -1,6 +1,6 @@ /* parser.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/parser.h b/as/parser.h index 12c6417..3c1dce5 100644 --- a/as/parser.h +++ b/as/parser.h @@ -1,6 +1,6 @@ /* parser.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/symtab.c b/as/symtab.c index 0aa3ab4..98a0260 100644 --- a/as/symtab.c +++ b/as/symtab.c @@ -1,6 +1,6 @@ /* symtab.c * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/as/symtab.h b/as/symtab.h index ac3c6f5..810ed7e 100644 --- a/as/symtab.h +++ b/as/symtab.h @@ -1,6 +1,6 @@ /* symtab.h * - * Copyright (C) 2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/examples/bin/invalid_inst.m16 b/examples/bin/invalid_inst.m16 new file mode 100644 index 0000000..3c9ffd5 --- /dev/null +++ b/examples/bin/invalid_inst.m16 @@ -0,0 +1 @@ +/Hú/Eú/Lúú/Oúï ú/Wú/Oú/Rú/Lú/Dú \ No newline at end of file diff --git a/lib/error.c b/lib/error.c index e04616f..6bd365f 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,6 +1,6 @@ /* error.c * - * Copyright (C) 2018 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/include/error.h b/lib/include/error.h index 1f8754d..e24b44d 100644 --- a/lib/include/error.h +++ b/lib/include/error.h @@ -1,6 +1,6 @@ /* error.h * - * Copyright (C) 2018 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/include/instr.h b/lib/include/instr.h index 4dfe36c..064589e 100644 --- a/lib/include/instr.h +++ b/lib/include/instr.h @@ -1,6 +1,6 @@ /* instr.h * - * Copyright (C) 2012,2014 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/include/vector.h b/lib/include/vector.h index cf2d2b9..8365faf 100644 --- a/lib/include/vector.h +++ b/lib/include/vector.h @@ -1,6 +1,6 @@ /* vector.h * - * Copyright (C) 2018 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/vector.c b/lib/vector.c index 15c7f9f..41df56a 100644 --- a/lib/vector.c +++ b/lib/vector.c @@ -1,6 +1,6 @@ /* vector.c * - * Copyright (C) 2018 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/cpu.c b/vm/cpu.c index f8f6669..80674b1 100644 --- a/vm/cpu.c +++ b/vm/cpu.c @@ -1,6 +1,6 @@ /* cpu.c * - * Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/cpu.h b/vm/cpu.h index f4d4912..98817bb 100644 --- a/vm/cpu.h +++ b/vm/cpu.h @@ -1,6 +1,6 @@ /* cpu.h * - * Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/debug.c b/vm/debug.c index e548270..42f2331 100644 --- a/vm/debug.c +++ b/vm/debug.c @@ -1,6 +1,6 @@ /* debug.c * - * Copyright (C) 2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,14 +20,20 @@ #include #include "cpu.h" #include "debug.h" +#include "mm.h" void debug_print_memory(uint8_t *mm) { int i = 0; - printf("\n"); + printf("\n" + " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n" + " ------------------------------------------------"); + + for(i = 0; i < MEM_SIZE; i++) { + if ((i % 16) == 0) + printf("\n%.2X| ", i); - for(i = 0; i < 32; i++) { printf("%.2X ", mm[i]); } printf("\n"); diff --git a/vm/debug.h b/vm/debug.h index 731017f..1ebb0e6 100644 --- a/vm/debug.h +++ b/vm/debug.h @@ -1,6 +1,6 @@ /* debug.h * - * Copyright (C) 2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/instr_decode.c b/vm/instr_decode.c index 532d04e..0170aac 100644 --- a/vm/instr_decode.c +++ b/vm/instr_decode.c @@ -1,6 +1,6 @@ /* instr_decode.c * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/instr_decode.h b/vm/instr_decode.h index eff474b..cf09af1 100644 --- a/vm/instr_decode.h +++ b/vm/instr_decode.h @@ -1,6 +1,6 @@ /* instr_decode.h * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/mm.c b/vm/mm.c index 66ab22e..1dff772 100644 --- a/vm/mm.c +++ b/vm/mm.c @@ -1,6 +1,6 @@ /* mm.c * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,11 +21,6 @@ #include #include "mm.h" -#ifndef MEM_SIZE -/* Set a default memory size. (2^16) */ -#define MEM_SIZE 65536 -#endif - // Get a WORD aligned (16-bit) address. // Casts the 8-bit pointer (mm_base_addr) to 16-bit (WORD) and add offset. #define addr_align_word(offset) \ diff --git a/vm/mm.h b/vm/mm.h index 772c7c3..859ae1e 100644 --- a/vm/mm.h +++ b/vm/mm.h @@ -1,6 +1,6 @@ /* mm.h * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +22,11 @@ #include +#ifndef MEM_SIZE +/* Set a default memory size. (2^8) */ +#define MEM_SIZE 256 +#endif + extern uint8_t *mm_base_addr; void mm_init(); diff --git a/vm/program.c b/vm/program.c index 72e5e11..9e65738 100644 --- a/vm/program.c +++ b/vm/program.c @@ -1,6 +1,6 @@ /* program.c * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/program.h b/vm/program.h index f790102..3c8ce5c 100644 --- a/vm/program.h +++ b/vm/program.h @@ -1,6 +1,6 @@ /* program.h * - * Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski + * Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/syscall.c b/vm/syscall.c index e5f3a00..5139055 100644 --- a/vm/syscall.c +++ b/vm/syscall.c @@ -1,6 +1,6 @@ /* syscall.c * -* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski +* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/syscall.h b/vm/syscall.h index 7c09994..cc272ba 100644 --- a/vm/syscall.h +++ b/vm/syscall.h @@ -1,6 +1,6 @@ /* syscall.h * -* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski +* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/vm/vm.c b/vm/vm.c index 6c65d7d..e424b61 100644 --- a/vm/vm.c +++ b/vm/vm.c @@ -50,15 +50,19 @@ void run(struct program *prog) { mm_exit(); } +int usage(const char* name) { + fprintf(stderr, "usage: %s [ --dmem | --dreg ] \n", name); + return 1; +} + int main(int argc, char **argv) { struct program prog = { 0 }; - const char *filename; + const char *filename = NULL; int i; if (argc < 2) { - fprintf(stderr, "usage: %s [ --dmem | --dreg ] \n", argv[0]); - return 1; + return usage(argv[0]); } // Parse options. @@ -78,6 +82,10 @@ int main(int argc, char **argv) { } } + if (filename == NULL) { + return usage(argv[0]); + } + if (program_loadfromfile(&prog, filename) < 0) return 1;