1
0
Fork 0
mirror of https://github.com/pnx/m16vm synced 2026-06-17 03:50:03 +02:00

Compare commits

..

9 commits
v0.1 ... main

36 changed files with 105 additions and 44 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
*.o
*.a
*.bin
m16vm
m16as

View file

@ -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 <inputfile> [ <outputfile> ]
```
`m16as` is pretty streigth forward. if no `outputfile` is given, the output is written to `stdout`
#### m16vm
```
usage: ./m16vm [ --dmem | --dreg ] <file>
```
* `--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
-------------

View file

@ -1,6 +1,6 @@
/* as.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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 <inputfile> [ <outputfile ]\n", program);
fprintf(stderr, "Usage: %s <inputfile> [ <outputfile> ]\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;
}

View file

@ -1,6 +1,6 @@
/* asm_error.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* ast.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* ast.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* codegen.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* codegen.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* lexer.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* lexer.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -2,7 +2,7 @@
*
* Macros for the grammar.
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* lexer/number.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* lexer/number.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* parser.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* parser.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* symtab.c
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* symtab.h
*
* Copyright (C) 2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -0,0 +1 @@
/Hϊ/Eϊ/Lϊϊ/Oϊο ϊ/Wϊ/Oϊ/Rϊ/Lϊ/Dϊ

View file

@ -1,6 +1,6 @@
/* error.c
*
* Copyright (C) 2018 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* error.h
*
* Copyright (C) 2018 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* instr.h
*
* Copyright (C) 2012,2014 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* vector.h
*
* Copyright (C) 2018 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* vector.c
*
* Copyright (C) 2018 Henrik Hautakoski <henrik@fiktivkod.org>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* cpu.c
*
* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* cpu.h
*
* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* debug.c
*
* Copyright (C) 2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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 <stdio.h>
#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");

View file

@ -1,6 +1,6 @@
/* debug.h
*
* Copyright (C) 2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* instr_decode.c
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* instr_decode.h
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* mm.c
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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 <stdlib.h>
#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) \

View file

@ -1,6 +1,6 @@
/* mm.h
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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 <stdint.h>
#ifndef MEM_SIZE
/* Set a default memory size. (2^8) */
#define MEM_SIZE 256
#endif
extern uint8_t *mm_base_addr;
void mm_init();

View file

@ -1,6 +1,6 @@
/* program.c
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* program.h
*
* Copyright (C) 2012,2014,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* syscall.c
*
* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

View file

@ -1,6 +1,6 @@
/* syscall.h
*
* Copyright (C) 2012,2014-2015,2018-2019 Henrik Hautakoski <henrik.hautakoski@gmail.com>
* Copyright (C) 2012,2014-2015,2018-2019,2023 Henrik Hautakoski <henrik.hautakoski@gmail.com>
*
* 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

14
vm/vm.c
View file

@ -50,15 +50,19 @@ void run(struct program *prog) {
mm_exit();
}
int usage(const char* name) {
fprintf(stderr, "usage: %s [ --dmem | --dreg ] <file>\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 ] <file>\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;