Subversion Repositories Kolibri OS

Rev

Rev 990 | Rev 2750 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "kosSyst.h"
  2. #include "func.h"
  3. #include <stdarg.h>
  4.  
  5. #define atexitBufferSize        32
  6.  
  7.  
  8. char pureCallMessage[] = "PURE function call!";
  9.  
  10. char *kosExePath = NULL;
  11.  
  12. //
  13. void (__cdecl *atExitList[atexitBufferSize])();
  14. int atExitFnNum = 0;
  15. //
  16. int __cdecl atexit( void (__cdecl *func )( void ))
  17. {
  18.         //
  19.         if ( atExitFnNum < atexitBufferSize )
  20.         {
  21.                 //
  22.                 atExitList[atExitFnNum++] = func;
  23.                 return 0;
  24.         }
  25.         else
  26.         {
  27.                 return 1;
  28.         }
  29. }
  30.  
  31.  
  32. //
  33. Dword RandomSeed = 1;
  34. //
  35. void rtlSrand( Dword seed )
  36. {
  37.         RandomSeed = seed;
  38. }
  39. //
  40. Dword rtlRand( void )
  41. {
  42.   //ìàñêà 0x80000776
  43.  
  44.   Dword dwi, i;
  45.  
  46.   for ( i = 0; i < 32; i++ )
  47.   {
  48.  
  49.     dwi = RandomSeed & 0x80000776;
  50.  
  51.       __asm{
  52.             mov   eax, dwi
  53.             mov   edx, eax
  54.             bswap eax
  55.             xor   eax, edx
  56.             xor   al, ah
  57.             setpo al
  58.             movzx eax, al
  59.             mov   dwi, eax
  60.     }
  61.  
  62.     RandomSeed = ( RandomSeed << 1 ) | ( dwi & 1 );
  63.   }
  64.  
  65.  return RandomSeed;
  66. }
  67.  
  68.  
  69. /*void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount )
  70. {
  71.         __asm{
  72.                 mov edi, dst
  73.                 mov eax, dst
  74.                 mov esi, src
  75.                 mov ecx, bytesCount
  76.                 rep movsb
  77.         }
  78. }
  79.  
  80. //
  81. void memset( Byte *dst, Byte filler, Dword count )
  82. {
  83.         //
  84.         __asm{
  85.                 mov edi, dst
  86.                 mov al, filler
  87.                 mov ecx, count
  88.                 rep stosb
  89.         }
  90. }*/
  91.  
  92.  
  93. //
  94. Dword rtlInterlockedExchange( Dword *target, Dword value )
  95. {
  96. //      Dword result;
  97.  
  98.         //
  99.         __asm{
  100.                 mov eax, value
  101.                 mov ebx, target
  102.                 xchg eax, [ebx]
  103. //              mov result, eax
  104.         }
  105.         //
  106. //      return result;
  107. }
  108.  
  109.  
  110. //////////////////////////////////////////////////////////////////////
  111. //
  112. // êîïèðîâàíèå ñòðîêè
  113. //
  114.  
  115. char * __cdecl strcpy( char *target, const char *source )
  116. {
  117.         char *result = target;
  118.  
  119.         while( target[0] = source[0] )
  120.         {
  121.                 target++;
  122.                 source++;
  123.         }
  124.  
  125.         return result;
  126. }
  127.  
  128.  
  129. //////////////////////////////////////////////////////////////////////
  130. //
  131. // ðåâåðñèâíûé ïîèñê ñèìâîëà
  132. //
  133.  
  134. char * __cdecl strrchr( const char * string, int c )
  135. {
  136.         char *cPtr;
  137.  
  138.         //
  139.         for ( cPtr = (char *)string + strlen( string ); cPtr >= string; cPtr-- )
  140.         {
  141.                 //
  142.                 if ( *cPtr == c ) return cPtr;
  143.         }
  144.         //
  145.         return NULL;
  146. }
  147.  
  148.  
  149. //////////////////////////////////////////////////////////////////////
  150. //
  151. // îïðåäåëåíèå äëèíû ñòðîêè
  152. //
  153.  
  154. int __cdecl strlen( const char *line )
  155. {
  156.   int i;
  157.  
  158.   for( i=0; line[i] != 0; i++ );
  159.   return i;
  160. }
  161.  
  162.  
  163.  
  164. //////////////////////////////////////////////////////////////////////
  165. //
  166. // ïåðåâîä øåñòíàäöàòèðè÷íîãî ÷èñëà â ñèìâîë
  167. //
  168.  
  169. unsigned int num2hex( unsigned int num )
  170. {
  171.   if( num < 10 )
  172.     return num + '0';
  173.   return num - 10 + 'A';
  174. }
  175.  
  176.  
  177. //////////////////////////////////////////////////////////////////////
  178. //
  179. // âûâîä ñòðîêè íà ïå÷àòü. barsuk äîáàâèë %f
  180.  
  181. //#define PREC 2
  182. //#define HALF 0.499
  183. #define PREC 6
  184. #define HALF 0.4999999
  185.  
  186. double double_tab[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
  187. 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30};
  188.  
  189.  
  190. //
  191.  
  192. Dword dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000,
  193.                    10000, 1000, 100, 10, 0 };
  194.  
  195. //
  196. void sprintf( char *Str, char* Format, ... )
  197. {
  198.         int i, fmtlinesize, j, k, flag;
  199.         Dword head, tail;
  200.         char c;
  201.         va_list arglist;
  202.         //
  203.         va_start(arglist, Format);
  204.  
  205.         //
  206.         fmtlinesize = strlen( Format );
  207.         //
  208.         if( fmtlinesize == 0 ) return;
  209.  
  210.         //
  211.         for( i = 0, j = 0; i < fmtlinesize; i++ )
  212.         {
  213.                 //
  214.                 c = Format[i];
  215.                 //
  216.                 if( c != '%' )
  217.                 {
  218.                         Str[j++] = c;
  219.                         continue;
  220.                 }
  221.                 //
  222.                 i++;
  223.                 //
  224.                 if( i >= fmtlinesize ) break;
  225.  
  226.                 //
  227.                 flag = 0;
  228.                 //
  229.                 c = Format[i];
  230.                 //
  231.                 switch( c )
  232.                 {
  233.                 //
  234.                 case '%':
  235.                         Str[j++] = c;
  236.                         break;
  237.                 // âûâîä ñòðîêè
  238.                 case 'S':
  239.                         Byte* str;
  240.                         str = va_arg(arglist, Byte*);
  241.                         for( k = 0; ( c = str[k] ) != 0; k++ )
  242.                         {
  243.                                 Str[j++] = c;
  244.                         }
  245.                         break;
  246.                 // âûâîä áàéòà
  247.                 case 'B':
  248.                         k = va_arg(arglist, int) & 0xFF;
  249.                         Str[j++] = num2hex( ( k >> 4 ) & 0xF );
  250.                         Str[j++] = num2hex( k & 0xF );
  251.                         break;
  252.                 // âûâîä ñèìâîëà
  253.                 case 'C':
  254.                         Str[j++] = va_arg(arglist, int) & 0xFF;
  255.                         break;
  256.                 // âûâîä äâîéíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
  257.                 case 'X':
  258.                         Dword val;
  259.                         val = va_arg(arglist, Dword);
  260.                         for( k = 7; k >= 0; k-- )
  261.                         {
  262.                                 //
  263.                                 c = num2hex ( ( val >> (k * 4) ) & 0xF );
  264.                                 //
  265.                                 if( c == '0' )
  266.                                 {
  267.                                         if( flag ) Str[j++] = c;
  268.                                 }
  269.                                 else
  270.                                 {
  271.                                         flag++;
  272.                                         Str[j++] = c;
  273.                                 }
  274.                         }
  275.                         //
  276.                         if( flag == 0 ) Str[j++] = '0';
  277.                         break;
  278.                 // âûâîä äâîéíîãî ñëîâà â äåñÿòè÷íîì âèäå
  279.                 case 'U':
  280.                         head = va_arg(arglist, Dword);
  281.                         tail = 0;
  282.                         for( k = 0; dectab[k] != 0; k++ )
  283.                         {
  284.                                 tail = head % dectab[k];
  285.                                 head /= dectab[k];
  286.                                 c = head + '0';
  287.                                 if( c == '0' )
  288.                                 {
  289.                                         if( flag ) Str[j++] = c;
  290.                                 }
  291.                                 else
  292.                                 {
  293.                                         flag++;
  294.                                         Str[j++] = c;
  295.                                 }
  296.                                 //
  297.                                 head = tail;
  298.                         }
  299.                         //
  300.                         c = head + '0';
  301.                         Str[j++] = c;
  302.                         break;
  303.                 // âåùåñòâåííîå ÷èñëî â ôîðìàòå 7.2
  304.                 case 'f':
  305.                 case 'F':
  306.                 case 'g':
  307.                 case 'G':
  308.                         {
  309.                         double val, w;
  310.                         int p;
  311.                         val = va_arg(arglist, double);
  312.                         if (val < 0.0)
  313.                         {
  314.                                 Str[j++] = '-';
  315.                                 val = -val;
  316.                         }
  317.                         for (k = 0; k < 30; k++)
  318.                                 if (val < double_tab[k])
  319.                                         break;
  320.  
  321.                         if (val < 1.0)
  322.                         {
  323.                                 Str[j++] = '0';
  324.                         }
  325.                        
  326.                         for (p = 1; p < k + 1; p++)
  327.                         {
  328.                                 int d = (int)di(val / double_tab[k - p] - HALF) % 10;
  329.                                 Str[j++] = '0' + d;
  330.                                 val -= d * double_tab[k - p];
  331.                         }
  332.                         Str[j++] = '.';
  333.                         w = 0.1;
  334.                         for (p = 0; p < PREC - 1; p++)
  335.                         {
  336.                                 val-=floor(val);
  337.                                 Str[j++] = '0' + di(val / w - HALF) % 10;
  338.                                 w /= 10.0;
  339.                         }
  340.                         }
  341.                         break;
  342.  
  343.                 // âûâîä 64-áèòíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
  344.                 case 'Q':
  345.                         unsigned int low_dword, high_dword;
  346.                         low_dword = va_arg(arglist, unsigned int);
  347.                         high_dword = va_arg(arglist, unsigned int);
  348.                         for( k = 7; k >= 0; k-- )
  349.                         {
  350.                                 //
  351.                                 c = num2hex ( ( ( high_dword + 1) >> (k * 4) ) & 0xF );
  352.                                 //
  353.                                 if( c == '0' )
  354.                                 {
  355.                                         if( flag ) Str[j++] = c;
  356.                                 }
  357.                                 else
  358.                                 {
  359.                                         flag++;
  360.                                         Str[j++] = c;
  361.                                 }
  362.                         }
  363.                         //
  364.                         for( k=7; k >= 0; k-- )
  365.                         {
  366.                                 //
  367.                                 c = num2hex ( ( low_dword >> (k * 4) ) & 0xF );
  368.                                 //
  369.                                 if( c == '0' )
  370.                                 {
  371.                                         if( flag ) Str[j++] = c;
  372.                                 }
  373.                                 else
  374.                                 {
  375.                                         flag++;
  376.                                         Str[j++] = c;
  377.                                 }
  378.                         }
  379.                         //
  380.                         if( flag == 0 ) Str[j++] = '0';
  381.                         //
  382.                         break;
  383.                 //
  384.                 default:
  385.                         break;
  386.                 }
  387.         }
  388.         //
  389.         Str[j] = 0;
  390. }
  391.  
  392.  
  393. // ôóíêöèÿ -1 çàâåðøåíèÿ ïðîöåññà
  394. void kos_ExitApp()
  395. {
  396.         int i;
  397.  
  398.         //
  399.         for ( i = atExitFnNum - 1; i >= 0; i-- )
  400.         {
  401.                 //
  402.                 atExitList[i]();
  403.         }
  404.         //
  405.         __asm{
  406.                 mov eax, -1
  407.                 int 0x40
  408.         }
  409. }
  410.  
  411.  
  412. // ôóíêöèÿ 0
  413. void kos_DefineAndDrawWindow(
  414.         Word x, Word y,
  415.         Word sizeX, Word sizeY,
  416.         Byte mainAreaType,
  417.         Dword mainAreaColour,
  418.         Byte headerType,
  419.         Dword headerColour,
  420.         Dword borderColour
  421.         )
  422. {
  423.         Dword arg1, arg2, arg3, arg4;
  424.  
  425.         //
  426.         arg1 = ( x << 16 ) + sizeX;
  427.         arg2 = ( y << 16 ) + sizeY;
  428.         arg3 = ( mainAreaType << 24 ) | mainAreaColour;
  429.         arg4 = ( headerType << 24 ) | headerColour;
  430.         //
  431.         __asm{
  432.                 mov eax, 0
  433.                 mov ebx, arg1
  434.                 mov ecx, arg2
  435.                 mov edx, arg3
  436.                 mov esi, arg4
  437.                 mov edi, borderColour
  438.                 int 0x40
  439.         }
  440. }
  441.  
  442.  
  443. // ôóíêöèÿ 1 ïîñòàâèòü òî÷êó
  444. void kos_PutPixel( Dword x, Dword y, Dword colour )
  445. {
  446.         //
  447.         __asm{
  448.                 mov eax, 1
  449.                 mov ebx, x
  450.                 mov ecx, y
  451.                 mov edx, colour
  452.                 int 0x40
  453.         }
  454. }
  455.  
  456.  
  457. // ôóíêöèÿ 2 ïîëó÷èòü êîä íàæàòîé êëàâèøè
  458. bool kos_GetKey( Byte &keyCode )
  459. {
  460.         Dword result;
  461.  
  462.         //
  463.         __asm{
  464.                 mov eax, 2
  465.                 int 0x40
  466.                 mov result, eax
  467.         }
  468.         //
  469.         keyCode = result >> 8;
  470.         //
  471.         return ( result & 0xFF ) == 0;
  472. }
  473.  
  474.  
  475. // ôóíêöèÿ 3 ïîëó÷èòü âðåìÿ
  476. Dword kos_GetSystemClock()
  477. {
  478. //      Dword result;
  479.  
  480.         //
  481.         __asm{
  482.                 mov eax, 3
  483.                 int 0x40
  484. //              mov result, eax
  485.         }
  486.         //
  487. //      return result;
  488. }
  489.  
  490.  
  491. // ôóíêöèÿ 4
  492. void kos_WriteTextToWindow(
  493.         Word x,
  494.         Word y,
  495.         Byte fontType,
  496.         Dword textColour,
  497.         char *textPtr,
  498.         Dword textLen
  499.         )
  500. {
  501.         Dword arg1, arg2;
  502.  
  503.         //
  504.         arg1 = ( x << 16 ) | y;
  505.         arg2 = ( fontType << 24 ) | textColour;
  506.         //
  507.         __asm{
  508.                 mov eax, 4
  509.                 mov ebx, arg1
  510.                 mov ecx, arg2
  511.                 mov edx, textPtr
  512.                 mov esi, textLen
  513.                 int 0x40
  514.         }
  515. }
  516.  
  517.  
  518. // ôóíêöèÿ 5 ïàóçà, â ñîòûõ äîëÿõ ñåêóíäû
  519. void kos_Pause( Dword value )
  520. {
  521.         //
  522.         __asm{
  523.                 mov eax, 5
  524.                 mov ebx, value
  525.                 int 0x40
  526.         }
  527. }
  528.  
  529.  
  530. // ôóíêöèÿ 7 íàðèñîâàòü èçîáðàæåíèå
  531. void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y )
  532. {
  533.         Dword arg1, arg2;
  534.  
  535.         //
  536.         arg1 = ( sizeX << 16 ) | sizeY;
  537.         arg2 = ( x << 16 ) | y;
  538.         //
  539.         __asm{
  540.                 mov eax, 7
  541.                 mov ebx, imagePtr
  542.                 mov ecx, arg1
  543.                 mov edx, arg2
  544.                 int 0x40
  545.         }
  546. }
  547.  
  548.  
  549.  
  550. // ôóíêöèÿ 8 îïðåäåëèòü êíîïêó
  551. void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour )
  552. {
  553.         Dword arg1, arg2;
  554.  
  555.         //
  556.         arg1 = ( x << 16 ) | sizeX;
  557.         arg2 = ( y << 16 ) | sizeY;
  558.         //
  559.         __asm{
  560.                 mov eax, 8
  561.                 mov ebx, arg1
  562.                 mov ecx, arg2
  563.                 mov edx, buttonID
  564.                 mov esi, colour
  565.                 int 0x40
  566.         }
  567. }
  568.  
  569.  
  570. // ôóíêöèÿ 9 - èíôîðìàöèÿ î ïðîöåññå
  571. Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID )
  572. {
  573. //      Dword result;
  574.  
  575.         //
  576.         __asm{
  577.                 mov eax, 9
  578.                 mov ebx, targetPtr
  579.                 mov ecx, processID
  580.                 int 0x40
  581. //              mov result, eax
  582.         }
  583.         //
  584. //      return result;
  585. }
  586.  
  587.  
  588. // ôóíêöèÿ 10
  589. Dword kos_WaitForEvent()
  590. {
  591. //      Dword result;
  592.  
  593.         __asm{
  594.                 mov eax, 10
  595.                 int 0x40
  596. //              mov result, eax
  597.         }
  598.        
  599. //      return result;
  600. }
  601.  
  602.  
  603. // ôóíêöèÿ 11
  604. Dword kos_CheckForEvent()
  605. {
  606. //      Dword result;
  607.  
  608.         __asm{
  609.                 mov eax, 11
  610.                 int 0x40
  611. //              mov result, eax
  612.         }
  613.        
  614. //      return result;
  615. }
  616.  
  617.  
  618. // ôóíêöèÿ 12
  619. void kos_WindowRedrawStatus( Dword status )
  620. {
  621.         __asm{
  622.                 mov eax, 12
  623.                 mov ebx, status
  624.                 int 0x40
  625.         }
  626. }
  627.  
  628.  
  629. // ôóíêöèÿ 13 íàðèñîâàòü ïîëîñó
  630. void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour )
  631. {
  632.         Dword arg1, arg2;
  633.  
  634.         //
  635.         arg1 = ( x << 16 ) | sizeX;
  636.         arg2 = ( y << 16 ) | sizeY;
  637.         //
  638.         __asm{
  639.                 mov eax, 13
  640.                 mov ebx, arg1
  641.                 mov ecx, arg2
  642.                 mov edx, colour
  643.                 int 0x40
  644.         }
  645. }
  646.  
  647.  
  648. // ôóíêöèÿ 17
  649. bool kos_GetButtonID( Dword &buttonID )
  650. {
  651.         Dword result;
  652.  
  653.         //
  654.         __asm{
  655.                 mov eax, 17
  656.                 int 0x40
  657.                 mov result, eax
  658.         }
  659.         //
  660.         buttonID = result >> 8;
  661.         //
  662.         return (result & 0xFF) == 0;
  663. }
  664.  
  665.  
  666. // ôóíêöèÿ 23
  667. Dword kos_WaitForEvent( Dword timeOut )
  668. {
  669. //      Dword result;
  670.  
  671.         __asm{
  672.                 mov eax, 23
  673.                 mov ebx, timeOut
  674.                 int 0x40
  675. //              mov result, eax
  676.         }
  677.        
  678. //      return result;
  679. }
  680.  
  681.  
  682. // ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37
  683. void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY )
  684. {
  685.         Dword mB;
  686.         Word curX;
  687.         Word curY;
  688.         sProcessInfo sPI;
  689.  
  690.         //
  691.         __asm{
  692.                 mov             eax, 37
  693.                 mov             ebx, 0
  694.                 int             0x40
  695.                 mov             curY, ax
  696.                 shr             eax, 16
  697.                 mov             curX, ax
  698.                 mov             eax, 37
  699.                 mov             ebx, 2
  700.                 int             0x40
  701.                 mov             mB, eax
  702.         }
  703.         //
  704.         kos_ProcessInfo( &sPI );
  705.         //
  706.         buttons = mB;
  707.         cursorX = curX - sPI.processInfo.x_start;
  708.         cursorY = curY - sPI.processInfo.y_start;
  709. }
  710.  
  711.  
  712. // ôóíêöèÿ 40 óñòàíîâèòü ìàñêó ñîáûòèé
  713. void kos_SetMaskForEvents( Dword mask )
  714. {
  715.         //
  716.         __asm{
  717.                 mov eax, 40
  718.                 mov ebx, mask
  719.                 int 0x40
  720.         }
  721. }
  722.  
  723.  
  724. // ôóíêöèÿ 47 âûâåñòè â îêíî ïðèëîæåíèÿ ÷èñëî
  725. void kos_DisplayNumberToWindow(
  726.    Dword value,
  727.    Dword digitsNum,
  728.    Word x,
  729.    Word y,
  730.    Dword colour,
  731.    eNumberBase nBase,
  732.    bool valueIsPointer
  733.    )
  734. {
  735.         Dword arg1, arg2;
  736.  
  737.         //
  738.         arg1 = ( valueIsPointer ? 1 : 0 ) |
  739.                 ( ((Byte)nBase) << 8 ) |
  740.                 ( ( digitsNum & 0x1F ) << 16 );
  741.         arg2 = ( x << 16 ) | y;
  742.         //
  743.         __asm{
  744.                 mov eax, 47
  745.                 mov ebx, arg1
  746.                 mov ecx, value
  747.                 mov edx, arg2
  748.                 mov esi, colour
  749.                 int 0x40
  750.         }
  751. }
  752.  
  753.  
  754. // ôóíêöèÿ 70 äîñòóï ê ôàéëîâîé ñèñòåìå
  755. Dword kos_FileSystemAccess( kosFileInfo *fileInfo )
  756. {
  757. //      Dword result;
  758.  
  759.         //
  760.         __asm{
  761.                 mov eax, 70
  762.                 mov ebx, fileInfo
  763.                 int 0x40
  764. //              mov result, eax
  765.         }
  766.         //
  767. //      return result;
  768. }
  769.  
  770.  
  771. // ôóíêöèÿ 63 âûâîä ñèìâîëÿ â îêíî îòëàäêè
  772. void kos_DebugOutChar( char ccc )
  773. {
  774.         //
  775.         __asm{
  776.                 mov eax, 63
  777.                 mov ebx, 1
  778.                 mov cl, ccc
  779.                 int 0x40
  780.         }
  781. }
  782.  
  783.  
  784. // ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû
  785. void kos_SetKeyboardDataMode( Dword mode )
  786. {
  787.         //
  788.         __asm{
  789.                 mov eax, 66
  790.                 mov ebx, 1
  791.                 mov ecx, mode
  792.                 int 0x40
  793.         }
  794. }
  795.  
  796.  
  797. // âûâîä ñòðîêè â îêíî îòëàäêè
  798. void rtlDebugOutString( char *str )
  799. {
  800.         //
  801.         for ( ; str[0] != 0; str++ )
  802.         {
  803.                 kos_DebugOutChar( str[0] );
  804.         }
  805.         //
  806.         kos_DebugOutChar( 13 );
  807.         kos_DebugOutChar( 10 );
  808. }
  809.  
  810.  
  811. // ôóíêöèÿ 64 èçìåíåíèå êîëè÷åñòâà ïàìÿòè, âûäåëåííîé äëÿ ïðîãðàììû
  812. bool kos_ApplicationMemoryResize( Dword targetSize )
  813. {
  814.         Dword result;
  815.  
  816.         //
  817.         __asm{
  818.                 mov eax, 64
  819.                 mov ebx, 1
  820.                 mov ecx, targetSize
  821.                 int 0x40
  822.                 mov result, eax
  823.         }
  824.         //
  825.         return result == 0;
  826. }
  827.  
  828.  
  829. // ôóíêöèÿ 67 èçìåíèòü ïàðàìåòðû îêíà, ïàðàìåòð == -1 íå ìåíÿåòñÿ
  830. void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY )
  831. {
  832.         //
  833.         __asm{
  834.                 mov eax, 67
  835.                 mov ebx, x
  836.                 mov ecx, y
  837.                 mov edx, sizeX
  838.                 mov esi, sizeY
  839.                 int 0x40
  840.         }
  841. }
  842.  
  843. void kos_InitHeap()
  844. {
  845.         __asm{
  846.                 mov eax, 68
  847.                 mov ebx, 11
  848.                 int 0x40
  849.         }
  850. }
  851.  
  852.  
  853.  
  854. // âûçîâ àáñòðàêòíîãî ìåòîäà
  855. int __cdecl _purecall()
  856. {
  857.         rtlDebugOutString( pureCallMessage );
  858.         kos_ExitApp();
  859.         return 0;
  860. }
  861.  
  862.  
  863. // âûçîâ ñòàòè÷åñêèõ èíèöèàëèçàòîðîâ
  864. // çàîäíî èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë
  865. //#pragma section(".CRT$XCA",long,read,write)
  866. //#pragma section(".CRT$XCZ",long,read,write)
  867. #pragma data_seg(".CRT$XCA")
  868. #pragma data_seg(".CRT$XCZ")
  869. typedef void (__cdecl *_PVFV)(void);
  870. __declspec(allocate(".CRT$XCA"))  _PVFV __xc_a[1] = { NULL };
  871. __declspec(allocate(".CRT$XCZ"))  _PVFV __xc_z[1] = { NULL };
  872. //
  873. #pragma comment(linker, "/merge:.CRT=.rdata")
  874. //
  875. void crtStartUp()
  876. {
  877.         // âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì
  878.         for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ )
  879.         {
  880.                 //
  881.                 if ( *pbegin != NULL )
  882.                         (**pbegin)();
  883.         }
  884.         // èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
  885.         rtlSrand( kos_GetSystemClock() );
  886.         // ïóòü ê ôàéëó ïðîöåññà
  887.         kosExePath = *((char **)0x20);
  888.         // âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ
  889.         kos_Main();
  890.         // âûõîä
  891.         kos_ExitApp();
  892. }
  893.  
  894.  
  895.