2012-11-26 16:26:15 +01:00
//CODED by Veliant, Leency, Nable. GNU GPL licence.
# startaddress 0
# code32 TRUE
char os_name [ 8 ] = { ' M ' , ' E ' , ' N ' , ' U ' , ' E ' , ' T ' , ' 0 ' , ' 1 ' } ;
dword os_version = 0x00000001 ;
2015-07-12 01:45:19 +02:00
dword start_addr = # load_init_main ;
2012-11-26 16:26:15 +01:00
dword final_addr = # stop + 32 ;
2013-03-11 19:16:24 +01:00
dword alloc_mem = MEMSIZE ;
dword x86esp_reg = MEMSIZE ;
2012-11-26 16:26:15 +01:00
dword I_Param = # param ;
dword I_Path = # program_path ;
char param [ 4096 ] ;
char program_path [ 4096 ] ;
2013-03-11 19:16:24 +01:00
# define NULL 0
# define OLD -1
# define true 1
# define false 0
2012-11-26 16:26:15 +01:00
//Events
# define evReDraw 1
2014-01-27 20:34:00 +01:00
# define evKey 2
# define evButton 3
# define evMouse 6
# define evNetwork 8
2012-11-26 16:26:15 +01:00
//Button options
# define BT_DEL 0x80000000
# define BT_HIDE 0x40000000
# define BT_NOFRAME 0x20000000
2015-07-10 16:01:38 +02:00
//Button mouse
2015-07-12 01:45:19 +02:00
# define MOUSE_LEFT 001b
# define MOUSE_RIGHT 010b
# define MOUSE_CENTER 100b
2015-07-10 16:01:38 +02:00
2015-02-24 21:47:16 +01:00
//ASCII KEYS
# define ASCII_KEY_BS 008
# define ASCII_KEY_TAB 009
# define ASCII_KEY_ENTER 013
# define ASCII_KEY_ESC 027
# define ASCII_KEY_DEL 182
# define ASCII_KEY_INS 185
# define ASCII_KEY_SPACE 032
# define ASCII_KEY_LEFT 176
# define ASCII_KEY_RIGHT 179
# define ASCII_KEY_DOWN 177
# define ASCII_KEY_UP 178
# define ASCII_KEY_HOME 180
# define ASCII_KEY_END 181
# define ASCII_KEY_PGDN 183
# define ASCII_KEY_PGUP 184
2012-11-26 16:26:15 +01:00
//-------------------------------------------------------------------------
2015-02-26 17:48:22 +01:00
: struct raw_image {
dword w , h , data ;
} ;
2015-07-10 16:01:38 +02:00
/**
* The structure of the mouse
* x - coordinate X
2015-07-11 18:01:28 +02:00
* y - coordinate Y
2015-07-10 16:01:38 +02:00
* xx and yy - time coordinates
* lkm - left mouse button
* pkm - right mouse button
* mkm - mouse wheel
* key - keycode button
* tmp - time keycode
* down - key event press
* up - key release events
* move - event mouse movements
2015-07-12 01:45:19 +02:00
* click - when clicked
* dblclick - double - click the default 50 ms
2015-07-10 16:01:38 +02:00
*/
2015-07-12 01:45:19 +02:00
dword __TMP_TIME , MOUSE_TIME ;
2015-02-26 17:48:22 +01:00
: struct mouse
2012-11-26 16:26:15 +01:00
{
2015-07-12 01:45:19 +02:00
signed x , y , xx , yy , lkm , mkm , pkm , key , tmp , tmp_time , hor , vert , down , up , move , click , dblclick ;
2012-11-26 16:26:15 +01:00
void get ( ) ;
} ;
2015-07-11 18:01:28 +02:00
//get new attributes mouse
2015-02-26 17:48:22 +01:00
: void mouse : : get ( )
2012-11-26 16:26:15 +01:00
{
EAX = 37 ;
EBX = 1 ;
$ int 0x40
$ mov ebx , eax
$ shr eax , 16
$ and ebx , 0x0000FFFF
x = EAX ;
y = EBX ;
2013-10-09 20:10:23 +02:00
if ( x > 6000 ) x - = 65535 ;
if ( y > 6000 ) y - = 65535 ;
2012-11-26 16:26:15 +01:00
EAX = 37 ;
EBX = 2 ;
$ int 0x40
$ mov ebx , eax
2015-04-02 23:27:51 +02:00
$ mov ecx , eax
2015-07-10 16:01:38 +02:00
key = EAX ;
2012-11-26 16:26:15 +01:00
$ and eax , 0x00000001
$ shr ebx , 1
$ and ebx , 0x00000001
2015-04-02 23:27:51 +02:00
$ shr ecx , 2
$ and ecx , 0x00000001
2012-11-26 16:26:15 +01:00
lkm = EAX ;
pkm = EBX ;
2015-04-02 23:27:51 +02:00
mkm = ECX ;
2015-07-10 16:01:38 +02:00
//when you release the mouse button
if ( ( down ) & & ! ( key ) ) {
up = true ;
down = false ;
2015-07-12 01:45:19 +02:00
if ( ! move ) click = true ;
__TMP_TIME = GetStartTime ( ) ;
if ( __TMP_TIME - tmp_time < = MOUSE_TIME ) dblclick = true ;
tmp_time = __TMP_TIME ;
2015-07-10 16:01:38 +02:00
//returns the key code
key = tmp ;
lkm = 1 & tmp ;
pkm = 2 & tmp ;
pkm > > = 1 ;
mkm = 4 & tmp ;
mkm > > = 2 ;
}
//when you press the mouse button
else {
up = false ;
2015-07-12 01:45:19 +02:00
click = false ;
dblclick = false ;
if ( key )
{
down = true ;
tmp = key ;
}
2015-07-11 18:01:28 +02:00
else down = false ;
2015-07-10 16:01:38 +02:00
if ( ( xx ! = x ) | | ( yy ! = y ) ) {
move = true ;
xx = x ;
yy = y ;
}
else move = false ;
}
2015-07-11 18:01:28 +02:00
//scroll
EAX = 37 ;
2012-11-26 16:26:15 +01:00
EBX = 7 ;
$ int 0x40
$ mov ebx , eax
$ shr eax , 16
$ and ebx , 0x0000FFFF
//hor = EAX;
vert = EBX ;
}
2015-02-26 17:48:22 +01:00
: struct system_colors
2012-11-26 16:26:15 +01:00
{
dword frame , grab , grab_button , grab_button_text , grab_text ,
work , work_button , work_button_text , work_text , work_graph ;
void get ( ) ;
} ;
2015-02-26 17:48:22 +01:00
: void system_colors : : get ( )
2012-11-26 16:26:15 +01:00
{
EAX = 48 ;
EBX = 3 ;
ECX = # frame ;
EDX = 40 ;
$ int 0x40
}
//------------------------------------------------------------------------------
inline fastcall dword WaitEvent ( )
{
$ mov eax , 10
$ int 0x40
}
inline fastcall dword CheckEvent ( )
{
$ mov eax , 11
$ int 0x40
}
inline fastcall dword WaitEventTimeout ( EBX )
{
$ mov eax , 23
$ int 0x40
}
inline fastcall SetEventMask ( EBX )
{
$ mov eax , 40
$ int 0x40
}
inline fastcall ScancodesGeting ( ) {
$ mov eax , 66
$ mov ebx , 1
$ mov ecx , 1 //᪠<> <E1AAA0> <EFBFBD> <EFBFBD> <EFBFBD>
$ int 0x40
}
inline fastcall word GetKey ( ) //+Gluk fix
{
$ push edx
2012-12-15 01:16:06 +01:00
GETKEY :
2012-11-26 16:26:15 +01:00
$ mov eax , 2
$ int 0x40
$ cmp eax , 1
2012-12-15 01:16:06 +01:00
$ jne GETKEYI
2012-11-26 16:26:15 +01:00
$ mov ah , dh
2012-12-15 01:16:06 +01:00
$ jmp GETKEYII //jz?
GETKEYI :
2012-11-26 16:26:15 +01:00
$ mov dh , ah
2012-12-15 01:16:06 +01:00
$ jmp GETKEY
GETKEYII :
2012-11-26 16:26:15 +01:00
$ pop edx
$ shr eax , 8
}
2014-03-15 11:23:06 +01:00
inline fastcall int GetFullKey ( )
{
$ mov eax , 2
$ int 0x40
}
2012-11-26 16:26:15 +01:00
2012-12-05 16:25:01 +01:00
inline fastcall pause ( EBX )
2012-11-26 16:26:15 +01:00
{
$ mov eax , 5
$ int 0x40
}
inline fastcall word GetButtonID ( )
{
$ mov eax , 17
$ int 0x40
$ shr eax , 8
}
inline fastcall dword GetFreeRAM ( )
{
$ mov eax , 18
$ mov ebx , 16
$ int 0x40
//return eax = <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
inline fastcall dword LoadDriver ( ECX ) //ECX - <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
{
$ mov eax , 68
$ mov ebx , 16
$ int 0x40
//return 0 - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> eax = <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
inline fastcall dword RuleDriver ( ECX ) //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
{
$ mov eax , 68
$ mov ebx , 17
$ int 0x40
//return eax = <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
struct proc_info
{
# define SelfInfo -1
dword use_cpu ;
word pos_in_stack , num_slot , rezerv1 ;
2013-10-30 02:12:01 +01:00
unsigned char name [ 11 ] ;
2012-11-26 16:26:15 +01:00
char rezerv2 ;
dword adress , use_memory , ID , left , top , width , height ;
word status_slot , rezerv3 ;
dword work_left , work_top , work_width , work_height ;
char status_window ;
2012-12-15 01:16:06 +01:00
dword cwidth , cheight ;
byte reserved [ 1024 - 71 - 8 ] ;
2012-11-26 16:26:15 +01:00
} ;
inline fastcall void GetProcessInfo ( EBX , ECX )
{
$ mov eax , 9 ;
$ int 0x40
2012-12-15 01:16:06 +01:00
DSDWORD [ EBX + 71 ] = DSDWORD [ EBX + 42 ] - 9 ; //set cwidth
DSDWORD [ EBX + 75 ] = DSDWORD [ EBX + 46 ] - GetSkinHeight ( ) - 4 ; //set cheight
2012-11-26 16:26:15 +01:00
}
inline fastcall int GetPointOwner ( EBX , ECX ) //ebx=m.x, ecx=m.y
{
$ mov eax , 34
$ int 0x40
}
inline fastcall int GetProcessSlot ( ECX )
{
EAX = 18 ;
EBX = 21 ;
$ int 0x40
}
inline fastcall int GetActiveProcess ( )
{
EAX = 18 ;
EBX = 7 ;
$ int 0x40
}
2013-10-24 20:26:04 +02:00
: int CheckActiveProcess ( int Form_ID )
{
2013-11-05 00:27:39 +01:00
int id9 = GetProcessSlot ( Form_ID ) ;
if ( id9 = = GetActiveProcess ( ) ) return 1 ;
2013-10-24 20:26:04 +02:00
return 0 ;
}
2012-12-15 16:56:24 +01:00
inline fastcall void ActivateWindow ( ECX )
{
EAX = 18 ;
EBX = 3 ;
$ int 0x40
}
2015-02-18 20:52:40 +01:00
inline fastcall int MinimizeWindow ( )
{
EAX = 18 ;
EBX = 10 ;
$ int 0x40
}
2012-11-26 16:26:15 +01:00
inline fastcall int CreateThread ( ECX , EDX )
{
$ mov eax , 51
$ mov ebx , 1
$ int 0x40
}
inline fastcall void SwitchToAnotherThread ( )
{
$ mov eax , 68
$ mov ebx , 1
$ int 0x40
}
2013-04-08 15:21:32 +02:00
inline fastcall int SendWindowMessage ( ECX , EDX )
2013-04-04 19:07:38 +02:00
{
$ mov eax , 72
$ mov ebx , 1
$ int 0x40
}
2012-11-26 16:26:15 +01:00
inline fastcall int KillProcess ( ECX )
{
$ mov eax , 18 ;
$ mov ebx , 18 ;
$ int 0x40
}
# define TURN_OFF 2
# define REBOOT 3
# define KERNEL 4
inline fastcall int ExitSystem ( ECX )
{
$ mov eax , 18
$ mov ebx , 9
$ int 0x40
}
inline fastcall ExitProcess ( )
{
$ mov eax , - 1 ;
$ int 0x40
}
//------------------------------------------------------------------------------
//eax = <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (1=eng, 2=fi, 3=ger, 4=rus)
inline fastcall int GetSystemLanguage ( )
{
EAX = 26 ;
EBX = 5 ;
$ int 0x40
}
inline fastcall GetSkinHeight ( )
{
$ push ebx
$ mov eax , 48
$ mov ebx , 4
$ int 0x40
$ pop ebx
}
inline fastcall void SetSystemSkin ( ECX )
{
EAX = 48 ;
EBX = 8 ;
$ int 0x40
}
inline fastcall int GetScreenWidth ( )
{
$ mov eax , 14
$ int 0x40
$ shr eax , 16
}
inline fastcall int GetScreenHeight ( )
{
$ mov eax , 14
$ int 0x40
$ and eax , 0x0000FFFF
}
2015-02-18 20:52:40 +01:00
inline fastcall int GetClientTop ( )
{
$ mov eax , 48
$ mov ebx , 5
$ int 0x40
$ mov eax , ebx
$ shr eax , 16
}
inline fastcall int GetClientHeight ( )
{
$ mov eax , 48
$ mov ebx , 5
$ int 0x40
$ mov eax , ebx
}
2012-11-26 16:26:15 +01:00
inline fastcall dword LoadLibrary ( ECX )
{
$ mov eax , 68
$ mov ebx , 19
$ int 0x40
}
inline fastcall int TestBit ( EAX , CL )
{
$ shr eax , cl
$ and eax , 1
}
inline fastcall int PlaySpeaker ( ESI )
{
$ mov eax , 55
$ mov ebx , 55
$ int 0x40
}
2014-03-14 20:06:48 +01:00
inline fastcall void debugln ( EDX )
2012-11-26 16:26:15 +01:00
{
2012-12-19 18:37:24 +01:00
$ push eax
2012-11-26 16:26:15 +01:00
$ push ebx
$ push ecx
$ mov eax , 63
$ mov ebx , 1
2012-12-15 01:16:06 +01:00
NEXT_CHAR :
2012-11-26 16:26:15 +01:00
$ mov ecx , DSDWORD [ edx ]
$ or cl , cl
2012-12-15 01:16:06 +01:00
$ jz DONE
2012-11-26 16:26:15 +01:00
$ int 0x40
$ inc edx
2012-12-15 01:16:06 +01:00
$ jmp NEXT_CHAR
DONE :
2012-11-26 16:26:15 +01:00
$ mov cl , 13
$ int 0x40
$ mov cl , 10
$ int 0x40
$ pop ecx
$ pop ebx
2012-12-19 18:37:24 +01:00
$ pop eax
2012-11-26 16:26:15 +01:00
}
2012-12-06 08:49:06 +01:00
2014-03-15 11:23:06 +01:00
inline fastcall void debug ( EDX )
{
$ push eax
$ push ebx
$ push ecx
$ mov eax , 63
$ mov ebx , 1
NEXT_CHAR :
$ mov ecx , DSDWORD [ edx ]
$ or cl , cl
$ jz DONE
$ int 0x40
$ inc edx
$ jmp NEXT_CHAR
DONE :
$ pop ecx
$ pop ebx
$ pop eax
}
2013-03-11 19:16:24 +01:00
2012-12-06 08:49:06 +01:00
inline fastcall void debugch ( ECX )
{
2012-12-19 18:37:24 +01:00
$ push eax
$ push ebx
2012-12-06 08:49:06 +01:00
$ mov eax , 63
$ mov ebx , 1
$ int 0x40
2012-12-19 18:37:24 +01:00
$ pop ebx
$ pop eax
2012-12-06 08:49:06 +01:00
}
2012-11-26 16:26:15 +01:00
//------------------------------------------------------------------------------
2013-10-01 00:03:07 +02:00
void DefineAndDrawWindow ( dword x , y , size_w , size_h , byte WindowType , dword WindowAreaColor , EDI , ESI )
2012-11-26 16:26:15 +01:00
{
EAX = 12 ; // function 12:tell os about windowdraw
EBX = 1 ;
$ int 0x40
EAX = 0 ;
2013-10-01 00:03:07 +02:00
EBX = x < < 16 + size_w ;
ECX = y < < 16 + size_h ;
2012-11-26 16:26:15 +01:00
EDX = WindowType < < 24 | WindowAreaColor ;
$ int 0x40
EAX = 12 ; // function 12:tell os about windowdraw
EBX = 2 ;
$ int 0x40
}
inline fastcall MoveSize ( EBX , ECX , EDX , ESI )
{
$ mov eax , 67
$ int 0x40
}
inline fastcall void DrawTitle ( ECX )
{
EAX = 71 ;
EBX = 1 ;
$ int 0x40 ;
}
2012-12-15 01:16:06 +01:00
void WriteTextB ( dword x , y , byte fontType , dword color , EDX )
{
EAX = 4 ;
EBX = x < < 16 + y ;
ECX = fontType < < 24 + color ;
2013-03-11 19:16:24 +01:00
ESI = 0 ;
2012-12-15 01:16:06 +01:00
$ int 0x40 ;
$ add ebx , 1 < < 16
$ int 0x40
}
void WriteText ( dword x , y , byte fontType , dword color , EDX )
2012-11-26 16:26:15 +01:00
{
EAX = 4 ;
EBX = x < < 16 + y ;
ECX = fontType < < 24 + color ;
$ int 0x40 ;
}
2013-04-12 02:15:39 +02:00
dword WriteBufText ( dword x , y , byte fontType , dword color , EDX , EDI )
{
EAX = 4 ;
EBX = x < < 16 + y ;
ECX = fontType < < 24 + color ;
$ int 0x40 ;
}
2012-11-26 16:26:15 +01:00
void WriteNumber ( dword x , y , byte fontType , dword color , count , ECX )
{
EAX = 47 ;
EBX = count < < 16 ;
EDX = x < < 16 + y ;
ESI = fontType < < 24 + color ;
$ int 0x40 ;
}
2013-03-11 19:16:24 +01:00
void CopyScreen ( dword EBX , x , y , w , h )
2012-11-26 16:26:15 +01:00
{
EAX = 36 ;
2013-03-11 19:16:24 +01:00
ECX = w < < 16 + h ;
2012-11-26 16:26:15 +01:00
EDX = x < < 16 + y ;
$ int 0x40 ;
}
2013-04-12 02:15:39 +02:00
: dword GetPixelColor ( dword x , x_size , y )
2012-11-26 16:26:15 +01:00
{
$ mov eax , 35
EBX = y * x_size + x ;
$ int 0x40
}
void _PutImage ( dword x , y , w , h , EBX )
{
EAX = 7 ;
ECX = w < < 16 + h ;
EDX = x < < 16 + y ;
$ int 0x40
}
void PutPaletteImage ( dword EBX , w , h , x , y , ESI , EDI )
{
EAX = 65 ;
ECX = w < < 16 + h ;
EDX = x < < 16 + y ;
EBP = 0 ;
$ int 0x40
}
inline fastcall void PutPixel ( EBX , ECX , EDX )
{
EAX = 1 ;
$ int 0x40
}
void DrawBar ( dword x , y , w , h , EDX )
{
2013-02-04 14:15:13 +01:00
if ( h < = 0 ) | | ( h > 60000 ) | | ( w < = 0 ) | | ( w > 60000 ) return ; //bad boy :)
2012-11-26 16:26:15 +01:00
EAX = 13 ;
EBX = x < < 16 + w ;
ECX = y < < 16 + h ;
$ int 0x40
}
void DefineButton ( dword x , y , w , h , EDX , ESI )
{
2012-12-15 01:16:06 +01:00
EAX = 8 ;
$ push edx
EDX + = BT_DEL ;
$ int 0x40 ;
$ pop edx
EBX = x < < 16 + w ;
ECX = y < < 16 + h ;
$ int 0x40
}
void UnsafeDefineButton ( dword x , y , w , h , EDX , ESI )
{
EAX = 8 ;
2012-11-26 16:26:15 +01:00
EBX = x < < 16 + w ;
ECX = y < < 16 + h ;
$ int 0x40
}
inline fastcall void DeleteButton ( EDX )
{
EAX = 8 ;
EDX + = BT_DEL ;
$ int 0x40 ;
2015-03-25 12:46:22 +01:00
}
inline fastcall dword GetStartTime ( )
{
$ mov eax , 26
$ mov ebx , 9
$ int 0x40
2015-07-12 01:45:19 +02:00
}
dword __generator ; // random number generator - <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
//The initialization of the initial data before running
void load_init_main ( )
{
MOUSE_TIME = 50 ; //Default 50 ms.
__generator = GetStartTime ( ) ;
main ( ) ;
2013-03-11 19:16:24 +01:00
}