From 5ba9a665c5364413743a8d756962a35c43722705 Mon Sep 17 00:00:00 2001 From: pavelyakov Date: Sat, 17 Nov 2018 12:27:27 +0000 Subject: [PATCH] Brainfuck interpreter git-svn-id: svn://kolibrios.org@7553 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/BrainFuck/brainfuck.c | 109 +++++++++++++++++++++++++++++ programs/cmm/BrainFuck/compile.sh | 5 ++ 2 files changed, 114 insertions(+) create mode 100644 programs/cmm/BrainFuck/brainfuck.c create mode 100755 programs/cmm/BrainFuck/compile.sh diff --git a/programs/cmm/BrainFuck/brainfuck.c b/programs/cmm/BrainFuck/brainfuck.c new file mode 100644 index 0000000000..1d66cbec5c --- /dev/null +++ b/programs/cmm/BrainFuck/brainfuck.c @@ -0,0 +1,109 @@ +/* + * Console example in C-- +*/ + +#define MEMSIZE 4096*10 + +#include "../lib/obj/console.h" + +#define bufferSize 10000; +#define memoryBrainfuck 30000 +#define memoryByteBF 1 +#define stackBrainFuck 4*1024 + +dword buffer = 0; +word bufferSymbol = 0; +dword memory = 0; +dword stack = 0; + +void evalBrainFuckCode(dword code) +{ + byte cmd = 0; + dword offsetMemory = 0; + dword countStack = 0; + dword countOffset = memoryBrainfuck / 2 / memoryByteBF; + offsetMemory = memory; + countStack = stack; + + // clear memory + EBX = memoryBrainfuck; + offsetMemory = memory; + WHILE(EBX) + { + EBX--; + DSBYTE[offsetMemory] = 0; + offsetMemory++; + } + //-------- + + offsetMemory = memory + countOffset; + + con_printf stdcall ("Output BrainF*ck:\r\n"); + + while(1) + { + cmd = DSBYTE[code]; + switch(cmd) + { + case '+': + DSBYTE[offsetMemory]++; + break; + case '-': + DSBYTE[offsetMemory]--; + break; + case '[': + DSDWORD[countStack] = code; + countStack += 4; + break; + case ']': + IF (DSBYTE[offsetMemory]) code = DSDWORD[countStack - 4]; + ELSE countStack -= 4; + break; + case ',': + con_getch stdcall(); + DSBYTE[offsetMemory] = AL; + break; + case '.': + DSBYTE[#bufferSymbol] = DSBYTE[offsetMemory]; + con_printf stdcall (#bufferSymbol); + break; + case '>': + offsetMemory++; + break; + case '<': + offsetMemory--; + break; + default: + con_printf stdcall ("\r\n"); + //ExitProcess(); + return; + break; + } + code++; + } +} + +void main() +{ + dword brainFuckCode = 0; + + buffer = malloc(bufferSize); + memory = malloc(memoryBrainfuck); + stack = malloc(stackBrainFuck); + + load_dll(libConsole, #con_init, 0); + con_init stdcall (-1, -1, -1, -1, "BrainF*ck interpreter"); + //con_set_flags stdcall (0x1F); + con_printf stdcall ("BrainF*ck interpreter v1.0\r\n"); + loop() + { + con_printf stdcall ("\r\nEnter BrainF*ck code:\r\n"); + //con_write_string stdcall ("\r\n", 2); + con_gets stdcall(buffer, bufferSize); + //con_printf stdcall (EAX); + evalBrainFuckCode(EAX); + } + con_exit stdcall (0); + ExitProcess(); +} + diff --git a/programs/cmm/BrainFuck/compile.sh b/programs/cmm/BrainFuck/compile.sh new file mode 100755 index 0000000000..1be419bf24 --- /dev/null +++ b/programs/cmm/BrainFuck/compile.sh @@ -0,0 +1,5 @@ +#!/bin/bash +for file in `find ./ -type f -name "*.c"` +do + ./cmm $file; +done \ No newline at end of file