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