Subversion Repositories Kolibri OS

Rev

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

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