diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-10-21 00:13:40 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-10-21 00:13:40 +0200 |
| commit | c81e5044a5d609a42407a5e9b0725d22e33cf5fa (patch) | |
| tree | bcdd3ed322f64c8bde316bfaf065fe2248947ef1 /userspace | |
| parent | 37ceff93572bba6defd916884999c496108220ee (diff) | |
ported Brainfuck interpreter.
Diffstat (limited to 'userspace')
| -rw-r--r-- | userspace/Makefile | 2 | ||||
| -rw-r--r-- | userspace/brainfuck.c | 28 | ||||
| -rw-r--r-- | userspace/syscalls.c | 84 |
3 files changed, 90 insertions, 24 deletions
diff --git a/userspace/Makefile b/userspace/Makefile index bd1e6ec..21c4560 100644 --- a/userspace/Makefile +++ b/userspace/Makefile @@ -9,6 +9,6 @@ LDFLAGS=-L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/newlib/ \ -lnosys all: brainfuck.o crt0.o - ${CC} -T linker.ld ${LDFLAGS} brainfuck.o -Wl,--oformat,binary -o userprog + ${CC} -T linker.ld ${LDFLAGS} brainfuck.o -Wl,--oformat,binary -o userprog clean: -rm *.o *.out userprog diff --git a/userspace/brainfuck.c b/userspace/brainfuck.c index 03ce4f5..c363693 100644 --- a/userspace/brainfuck.c +++ b/userspace/brainfuck.c @@ -25,7 +25,7 @@ // by brainfuck standards (doesn't that sound funny?), the data pointer has // 30,000 bytes at its disposal, but I hate hard-coding such stuff. -#define DATA_SIZE 30000 +#define DATA_SIZE 3000 void usage() { puts( @@ -34,13 +34,14 @@ void usage() { ); } -int main(int argc, char **argv) { - - // ADDED BY FOOLOS: we will show usage anyway - usage(); +int main(int argc, char **argv) +{ + //added by FOOLOS + syscalls_init(); // used by the bf program unsigned char *dataptr = malloc(sizeof(char) * DATA_SIZE); + // position of the data pointer unsigned int datapos = 0; // input file @@ -51,6 +52,8 @@ int main(int argc, char **argv) { // we will read chars from the input into r unsigned char r; + /* uncommented by FOOLOS + // determine input if (argc == 2) { if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) { @@ -69,16 +72,26 @@ int main(int argc, char **argv) { usage(); return EXIT_FAILURE; } - + + */ + + // added by FOOLOS + input=fopen(1,"r"); + puts("Welcome to the BRAINFUCK by Felix Oghina"); + puts("Compiled for FoolOS"); + printf("dataptr: 0x%08X\n",dataptr); + // zero the data pointer for (i=0; i < DATA_SIZE; i++) { dataptr[i] = 0; } - + // start interpreting rewind(input); + while (!feof(input)) { r = (unsigned char) fgetc(input); +// printf("%c",r); switch(r) { case '>': if (datapos < DATA_SIZE - 1) datapos++; @@ -129,5 +142,6 @@ int main(int argc, char **argv) { break; } } + puts("brainfuck: finishing!"); return EXIT_SUCCESS; } diff --git a/userspace/syscalls.c b/userspace/syscalls.c index 6547879..d8a463d 100644 --- a/userspace/syscalls.c +++ b/userspace/syscalls.c @@ -1,39 +1,79 @@ - //printf needs following syscalls: sbrk write close fstat isatty lseek read // #include <sys/stat.h> +#include <string.h> + +static int preread; +static int alloc; +easywrite(char *c); + +void syscalls_init() +{ + preread=0; + alloc=0xff0000; +} int close(int file) { - return -1; + easywrite("syscall: close\n"); + return -1; } int fstat(int file, struct stat *st) { +// easywrite("syscall: fstat\n"); st->st_mode = S_IFCHR; return 0; } -int isatty(int file) { +int isatty(int file) +{ + easywrite("syscall: isatty\n"); return 1; } -int lseek(int file, int ptr, int dir) { - return 0; +int lseek(int file, int ptr, int dir) +{ +// printf("syscall: lseek %i %i %i",file,ptr,dir); + if(dir==0)preread=ptr; + else{ puts("other modes unsupported sorry"); while(1);} + return preread; } -int read(int file, char *ptr, int len) { - return 0; + + +int read(int file, char *ptr, int len) +{ +// easywrite("syscall: read\n"); + + int i; + char buf[]="++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; + + if(preread>=strlen(buf)){ + easywrite("syscall: read = EOF\n"); + while(1); + return 0; //EOF + } + + for(i=0;i<len;i++) + { + if(preread>=strlen(buf))return i; + ptr[i]=buf[preread++]; + } + + return len; } - int open(const char *name, int flags, int mode) { - return -1; - } +int open(const char *name, int flags, int mode) +{ + easywrite("syscall: open\n"); + return 99; + return -1; +} int write(int file, char *ptr, int len) { - int todo; for (todo = 0; todo < len; todo++) { @@ -58,28 +98,40 @@ int write(int file, char *ptr, int len) return len; } + + caddr_t sbrk(int incr) { + easywrite("syscall: sbrk!!\n"); + int oldalloc=alloc; + alloc+=incr; + return oldalloc; + /* -// extern char _end; /* Defined by the linker */ - char _end; + extern char end; +// char _end; static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &_end; + heap_end = &end; } prev_heap_end = heap_end; - /* + if (heap_end + incr > stack_ptr) { write (1, "Heap and stack collision\n", 25); abort (); } - */ heap_end += incr; return (caddr_t) prev_heap_end; + */ } // +// helpers +easywrite(char *c) +{ + write(1,c,strlen(c)); +} |
