summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-10-21 00:13:40 +0200
committerMichal Idziorek <m.i@gmx.at>2014-10-21 00:13:40 +0200
commitc81e5044a5d609a42407a5e9b0725d22e33cf5fa (patch)
treebcdd3ed322f64c8bde316bfaf065fe2248947ef1
parent37ceff93572bba6defd916884999c496108220ee (diff)
ported Brainfuck interpreter.
-rw-r--r--userspace/Makefile2
-rw-r--r--userspace/brainfuck.c28
-rw-r--r--userspace/syscalls.c84
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));
+}