#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setCursor(0, 0);
display.setTextColor(WHITE, BLACK);
display.setTextSize(1);
display.setTextWrap(true);
display.display();
runCode("clear;alocmem;1;set;0;a;write;0;display;j;6");
}
void loop() {
}
void runCode(String code) {
int numSemicolons = 0;
for (int i = 0; i < code.length(); i++) {
if (code[i] == ';') {
numSemicolons++;
}
}
String* lines = new String[numSemicolons + 1];
int numLines = 0;
int startIndex = 0;
for (int i = 0; i < code.length(); i++) {
if (code[i] == ';') {
String line = code.substring(startIndex, i);
lines[numLines] = line;
numLines++;
startIndex = i + 1;
}
}
lines[numLines] = code.substring(startIndex);
numLines++;
String* memory;
for (int i = 0; i < numLines; i++) {
display.write(String(i).c_str());
display.display();
if(lines[i] == "j"){
i = lines[i + 1].toInt() - 1;
}else if(lines[i] == "alocmem"){
memory = new String[lines[i + 1].toInt()];
i++;
}else if(lines[i] == "set"){
memory[lines[i + 1].toInt()] = lines[i + 2];
i+=2;
}else if(lines[i] == "clear"){
display.clearDisplay();
}else if(lines[i] == "display"){
display.display();
}else if(lines[i] == "write"){
display.write(memory[lines[i + 1].toInt()].c_str());
i++;
}else if(lines[i] == "join"){
memory[lines[i + 1].toInt()] = memory[lines[i + 1].toInt()] + lines[i + 2];
i+=2;
}else if(lines[i] == "joinfm"){
memory[lines[i + 1].toInt()] = memory[lines[i + 1].toInt()] + memory[lines[i + 2].toInt()];
i+=2;
}else if(lines[i] == "wait"){
delay(lines[i + 1].toInt());
i++;
}
}
delete[] lines;
}