Subversion Repositories Kolibri OS

Rev

Rev 7555 | 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;
7553 pavelyakov 19
 
7556 pavelyakov 20
void consoleInit()
21
{
22
	IF(!initConsole)
23
	{
24
		con_init stdcall (-1, -1, -1, -1, "BrainF*ck interpreter");
25
		initConsole = 0xFF;
26
	}
27
}
28
 
7553 pavelyakov 29
void evalBrainFuckCode(dword code)
30
{
31
	dword offsetMemory = 0;
32
	dword countStack = 0;
33
	dword countOffset = memoryBrainfuck / 2 / memoryByteBF;
34
	offsetMemory = memory;
35
	// clear memory
36
	EBX = memoryBrainfuck;
37
	offsetMemory = memory;
38
	WHILE(EBX)
39
	{
40
		EBX--;
41
		DSBYTE[offsetMemory] = 0;
42
		offsetMemory++;
43
	}
44
	//--------
45
 
46
	offsetMemory = memory + countOffset;
47
 
7556 pavelyakov 48
	WHILE(1)
7553 pavelyakov 49
	{
7556 pavelyakov 50
		switch(DSBYTE[code])
7553 pavelyakov 51
		{
52
			case '+':
53
				DSBYTE[offsetMemory]++;
54
			break;
55
			case '-':
56
				DSBYTE[offsetMemory]--;
57
			break;
58
			case '[':
7556 pavelyakov 59
				$push code;
7553 pavelyakov 60
			break;
61
			case ']':
7556 pavelyakov 62
				IF (DSBYTE[offsetMemory]) code = DSDWORD[ESP];
63
				ELSE $pop EAX;
7553 pavelyakov 64
			break;
65
			case ',':
7556 pavelyakov 66
				consoleInit();
7553 pavelyakov 67
				con_getch stdcall();
68
				DSBYTE[offsetMemory] = AL;
69
			break;
70
			case '.':
7556 pavelyakov 71
				consoleInit();
7553 pavelyakov 72
				DSBYTE[#bufferSymbol] = DSBYTE[offsetMemory];
73
				con_printf stdcall (#bufferSymbol);
74
			break;
75
			case '>':
76
				offsetMemory++;
77
			break;
78
			case '<':
79
				offsetMemory--;
80
			break;
7556 pavelyakov 81
			case 0:
7553 pavelyakov 82
				return;
83
			break;
84
		}
85
		code++;
86
	}
87
}
88
 
7555 pavelyakov 89
 
7553 pavelyakov 90
void main()
91
{
92
	dword brainFuckCode = 0;
93
 
94
	buffer = malloc(bufferSize);
95
	memory = malloc(memoryBrainfuck);
96
 
97
	load_dll(libConsole, #con_init, 0);
7555 pavelyakov 98
 
99
	IF(DSBYTE[I_Param])
7553 pavelyakov 100
	{
7556 pavelyakov 101
		IF(io.read(I_Param)) evalBrainFuckCode(EAX);
7555 pavelyakov 102
	}
7556 pavelyakov 103
	ELSE
7555 pavelyakov 104
	{
7556 pavelyakov 105
		consoleInit();
106
		con_printf stdcall ("BrainF*ck interpreter v1.1\r\n");
107
		loop()
108
		{
109
			con_printf stdcall ("\r\nEnter BrainF*ck code:\r\n");
110
			con_printf stdcall ("Output BrainF*ck:\r\n");
111
			con_gets stdcall(buffer, bufferSize);
112
			evalBrainFuckCode(EAX);
113
			con_printf stdcall ("\r\n");
114
		}
7553 pavelyakov 115
	}
7556 pavelyakov 116
	IF(initConsole) con_exit stdcall (0);
7553 pavelyakov 117
	ExitProcess();
118
}
119