Subversion Repositories Kolibri OS

Rev

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

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