Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7553 | pavelyakov | 1 | /* |
2 | * Console example in C-- |
||
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 |