--- /dev/null
+/*
+ * BrainDuino
+ * Arduino BrainFuck Interpreter
+ * <~~Harvie 2oo8
+ *
+ * Wanna real hardware BF processor?!
+ */
+
+#define memsize 100
+#define stacksize 20
+#define baudrate 9600
+#define pwmoutpin 11
+#define analoginpin 0
+
+void brainfuck(int memory, char cycle, char *bfcode, char pwmpin, char ainpin) {
+ //Serial.println("BF-STARTED");
+ unsigned char tape[memory]; memset(tape, 0, sizeof(tape)); memory = 0;
+ int stack[cycle]; memset(stack, 0, sizeof(stack)); cycle = -1;
+
+ for(int i = 0;bfcode[i]!=0;i++) {
+ switch(bfcode[i]) {
+ //Basic BF instructions
+ case '>': memory++; if(memory>=sizeof(tape)) { Serial.println("BF-EXIT-MEM-OVERFLOW!"); return; } break;
+ case '<': memory--; if(memory<0) { Serial.println("BF-EXIT-MEM-UNDERFLOW!"); return; } break;
+ case '+': tape[memory]++; break;
+ case '-': tape[memory]--; break;
+ case '.': Serial.print(tape[memory], BYTE); break;
+ case ',': while(Serial.available()<=0) delay(30); tape[memory] = Serial.read(); break;
+ case '[': cycle++; if(cycle>=sizeof(stack)) { Serial.println("BF-EXIT-STACK-OVERFLOW!"); return; } stack[cycle] = i; break;
+ case ']': if(tape[memory] != 0) { i = stack[cycle]-1; } cycle--; if(cycle<-1) { Serial.println("BF-EXIT-STACK-UNDERFLOW!"); return; } break;
+ //Optional BF instructions
+ case '#': Serial.print("BF-DEBUG: POS: "); Serial.print(memory, DEC);
+ Serial.print(" TAPE: "); Serial.println(tape[memory], BYTE);
+ Serial.print(" TAPE: "); Serial.println(tape[memory], BYTE);
+ break;
+ case '@': Serial.println("BF-EXIT-BY-CODE!"); return; break;
+ //Arduino extensions for BF
+ case '!': if(pwmpin>=0 && tape[memory]>0 && tape[memory]<255) analogWrite(pwmpin, tape[memory]); break; //Set pwmpin output value
+ case '?': if(ainpin>=0) tape[memory]=analogRead(ainpin); break; //Read ainpin analog value (sux-a-bit)
+ case '_': delay(10); break; //Wait for a while
+ }
+ }
+ //Serial.println("BF-ENDED");
+ return;
+}
+
+void setup() // run once, when the sketch starts
+{
+ Serial.begin(baudrate);
+ char bfcode[]=
+ //"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."; //Hello World
+ //"[,.]"; //cat
+ //"[?!+]"; //Read ananlog input pin and write it's value to pwm output pin
+ //"[+[-!__]+++++++++++++++++++++++++++++++++++++++]"; //Fade LED on pwmpin
+ "[[-]++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.[-]<[-]<[-]<[-!_]<+]"; //Hello World with pwm fading
+
+ brainfuck(memsize, stacksize, bfcode, pwmoutpin, analoginpin);
+}
+
+
+void loop() { // run over and over again
+
+}
+
+