Subversion Repositories Kolibri OS

Rev

Rev 7554 | Blame | Last modification | View Log | Download | RSS feed

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