Subversion Repositories Kolibri OS

Rev

Rev 7555 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Author Pavel Iakovlev
  3. */
  4.  
  5. #define MEMSIZE 4096*10
  6.  
  7. #include "../lib/io.h"
  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. 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.         }
  27. }
  28.  
  29. void evalBrainFuckCode(dword code)
  30. {
  31.         dword offsetMemory = 0;
  32.         dword countStack = 0;
  33.         dword countOffset = memoryBrainfuck / 2 / memoryByteBF;
  34.         offsetMemory = memory;
  35.         // clear memory
  36.         EBX = memoryBrainfuck;
  37.         offsetMemory = memory;
  38.         WHILE(EBX)
  39.         {
  40.                 EBX--;
  41.                 DSBYTE[offsetMemory] = 0;
  42.                 offsetMemory++;
  43.         }
  44.         //--------
  45.        
  46.         offsetMemory = memory + countOffset;
  47.        
  48.         WHILE(1)
  49.         {
  50.                 switch(DSBYTE[code])
  51.                 {
  52.                         case '+':
  53.                                 DSBYTE[offsetMemory]++;
  54.                         break;
  55.                         case '-':
  56.                                 DSBYTE[offsetMemory]--;
  57.                         break;
  58.                         case '[':
  59.                                 $push code;
  60.                         break;
  61.                         case ']':
  62.                                 IF (DSBYTE[offsetMemory]) code = DSDWORD[ESP];
  63.                                 ELSE $pop EAX;
  64.                         break;
  65.                         case ',':
  66.                                 consoleInit();
  67.                                 con_getch stdcall();
  68.                                 DSBYTE[offsetMemory] = AL;
  69.                         break;
  70.                         case '.':
  71.                                 consoleInit();
  72.                                 DSBYTE[#bufferSymbol] = DSBYTE[offsetMemory];
  73.                                 con_printf stdcall (#bufferSymbol);
  74.                         break;
  75.                         case '>':
  76.                                 offsetMemory++;
  77.                         break;
  78.                         case '<':
  79.                                 offsetMemory--;
  80.                         break;
  81.                         case 0:
  82.                                 return;
  83.                         break;
  84.                 }
  85.                 code++;
  86.         }
  87. }
  88.  
  89.  
  90. void main()
  91. {
  92.         dword brainFuckCode = 0;
  93.        
  94.         buffer = malloc(bufferSize);
  95.         memory = malloc(memoryBrainfuck);
  96.        
  97.         load_dll(libConsole, #con_init, 0);
  98.        
  99.         IF(DSBYTE[I_Param])
  100.         {
  101.                 IF(io.read(I_Param)) evalBrainFuckCode(EAX);
  102.         }
  103.         ELSE
  104.         {
  105.                 consoleInit();
  106.                 con_printf stdcall ("BrainF*ck interpreter v1.1\r\n");
  107.                 loop()
  108.                 {
  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);
  112.                         evalBrainFuckCode(EAX);
  113.                         con_printf stdcall ("\r\n");
  114.                 }
  115.         }
  116.         IF(initConsole) con_exit stdcall (0);
  117.         ExitProcess();
  118. }
  119.  
  120.