mirror of
https://github.com/pnx/m16vm
synced 2026-07-03 11:43:39 +02:00
WIP
This commit is contained in:
parent
c3a1d3fe77
commit
9efedf4471
1 changed files with 78 additions and 0 deletions
78
cc/compiler.c
Normal file
78
cc/compiler.c
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void forward(FILE *fd, char ch) {
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
char c = getc(fd);
|
||||||
|
if (c == EOF)
|
||||||
|
break;
|
||||||
|
if (c == ch) {
|
||||||
|
getc(fd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute(FILE *fd) {
|
||||||
|
|
||||||
|
unsigned char mem[2048] = { 0 }; /* Memory block */
|
||||||
|
unsigned char *ptr = mem;
|
||||||
|
long int jmpaddr = -1;
|
||||||
|
|
||||||
|
while(!feof(fd)) {
|
||||||
|
char ch = getc(fd);
|
||||||
|
|
||||||
|
switch(ch) {
|
||||||
|
case '<':
|
||||||
|
ptr--;
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
ptr++;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
(*ptr)++;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
(*ptr)--;
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
putchar(*ptr);
|
||||||
|
break;
|
||||||
|
case '[':
|
||||||
|
if (*ptr == 0) {
|
||||||
|
forward(fd, ']');
|
||||||
|
jmpaddr = -1;
|
||||||
|
} else {
|
||||||
|
jmpaddr = ftell(fd) - 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ']':
|
||||||
|
if (jmpaddr > 0) {
|
||||||
|
fseek(fd, jmpaddr, SEEK_SET);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
FILE *fd;
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "usage: %s <inputfile>\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = fopen(argv[1], "r");
|
||||||
|
if (!fd) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute(fd);
|
||||||
|
|
||||||
|
fclose(fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue