Subversion Repositories Kolibri OS

Rev

Rev 7556 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7553 pavelyakov 1
/*
7556 pavelyakov 2
 * Author Pavel Iakovlev
7553 pavelyakov 3
*/
4
 
5
#define MEMSIZE 4096*10
6
 
7555 pavelyakov 7
#include "../lib/io.h"
7553 pavelyakov 8
#include "../lib/obj/console.h"
9
 
10
#define bufferSize 10000;
11
#define memoryBrainfuck 30000
12
#define memoryByteBF 1
13
#define stackBrainFuck 4*1024
14
 
15
dword buffer = 0;
16
word bufferSymbol = 0;
17
dword memory = 0;
7556 pavelyakov 18
byte initConsole = 0;
7557 pavelyakov 19
dword stack = 0;
7553 pavelyakov 20
 
7556 pavelyakov 21
void consoleInit()
22
{
23
	IF(!initConsole)
24
	{
7557 pavelyakov 25
		load_dll(libConsole, #con_init, 0);
7556 pavelyakov 26
		con_init stdcall (-1, -1, -1, -1, "BrainF*ck interpreter");
27
		initConsole = 0xFF;
28
	}
29
}
30
 
7553 pavelyakov 31
void evalBrainFuckCode(dword code)
32
{
33
	dword offsetMemory = 0;
34
	dword countStack = 0;
35
	dword countOffset = memoryBrainfuck / 2 / memoryByteBF;
36
	offsetMemory = memory;
37
	// clear memory
38
	EBX = memoryBrainfuck;
39
	offsetMemory = memory;
40
	WHILE(EBX)
41
	{
42
		EBX--;
43
		DSBYTE[offsetMemory] = 0;
44
		offsetMemory++;
45
	}
46
	//--------
47
 
48
	offsetMemory = memory + countOffset;
7557 pavelyakov 49
	countStack = stack;
7553 pavelyakov 50
 
7556 pavelyakov 51
	WHILE(1)
7553 pavelyakov 52
	{
7556 pavelyakov 53
		switch(DSBYTE[code])
7553 pavelyakov 54
		{
55
			case '+':
56
				DSBYTE[offsetMemory]++;
57
			break;
58
			case '-':
59
				DSBYTE[offsetMemory]--;
60
			break;
61
			case '[':
7557 pavelyakov 62
				DSDWORD[countStack] = code;
63
				countStack += 4;
7553 pavelyakov 64
			break;
65
			case ']':
7557 pavelyakov 66
				IF (DSBYTE[offsetMemory]) code = DSDWORD[countStack - 4];
67
				ELSE countStack -= 4;
7553 pavelyakov 68
			break;
69
			case ',':
7556 pavelyakov 70
				consoleInit();
7553 pavelyakov 71
				con_getch stdcall();
72
				DSBYTE[offsetMemory] = AL;
73
			break;
74
			case '.':
7556 pavelyakov 75
				consoleInit();
7553 pavelyakov 76
				DSBYTE[#bufferSymbol] = DSBYTE[offsetMemory];
77
				con_printf stdcall (#bufferSymbol);
78
			break;
79
			case '>':
80
				offsetMemory++;
81
			break;
82
			case '<':
83
				offsetMemory--;
84
			break;
7556 pavelyakov 85
			case 0:
7553 pavelyakov 86
				return;
87
			break;
88
		}
89
		code++;
90
	}
91
}
92
 
7555 pavelyakov 93
 
7553 pavelyakov 94
void main()
95
{
96
	dword brainFuckCode = 0;
97
 
98
	buffer = malloc(bufferSize);
99
	memory = malloc(memoryBrainfuck);
7557 pavelyakov 100
	stack = malloc(stackBrainFuck);
7553 pavelyakov 101
 
7555 pavelyakov 102
	IF(DSBYTE[I_Param])
7553 pavelyakov 103
	{
7556 pavelyakov 104
		IF(io.read(I_Param)) evalBrainFuckCode(EAX);
7555 pavelyakov 105
	}
7556 pavelyakov 106
	ELSE
7555 pavelyakov 107
	{
7556 pavelyakov 108
		consoleInit();
7557 pavelyakov 109
		con_printf stdcall ("BrainF*ck interpreter v1.01\r\n");
7556 pavelyakov 110
		loop()
111
		{
112
			con_printf stdcall ("\r\nEnter BrainF*ck code:\r\n");
113
			con_gets stdcall(buffer, bufferSize);
114
			evalBrainFuckCode(EAX);
7557 pavelyakov 115
			con_printf stdcall ("\r\nOutput BrainF*ck:\r\n");
7556 pavelyakov 116
		}
7553 pavelyakov 117
	}
7557 pavelyakov 118
	ExitProcess();
7556 pavelyakov 119
	IF(initConsole) con_exit stdcall (0);
7553 pavelyakov 120
}
121