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 | } |