Subversion Repositories Kolibri OS

Rev

Rev 7555 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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