
if ~ defined global.macros.inc | defined @f
@@:global.macros.inc:

macro require alias, path
{
  file@include equ path
  match head alias tail, files@included \{ file@include equ \} 
  match head alias, files@included \{ file@include equ \} 
  match alias tail, files@included \{ file@include equ \}
  match alias, files@included \{ file@include equ \}
  match file, file@include \{ include file
    files@included equ files@included alias \} 
}

require 'struct.inc', 'struct.inc'

; language for programs
lang fix en ; ru en fr ge fi

__DISPLAY_NOT_USED__ = 1


; new application structure
macro meos_app_start
 {
  use32
  org 0x0

  db 'MENUET01'
  dd 0x01
  dd __start
  dd __end
  dd __memory
  dd __stack

  if used __params & ~defined __params
    dd __params
  else
    dd 0x0
  end if

  dd 0x0
 }
MEOS_APP_START fix meos_app_start

macro code
 {
  __start:
 }
CODE fix code

macro data
 {
  __data:
 }
DATA fix data

macro udata
 {
  if used __params & ~defined __params
    __params:
      db 0
    __end:
      rb 255
  else
    __end:
  end if
  __udata:
 }
UDATA fix udata

macro meos_app_end
 {
  align 32
  rb 2048
  __stack:
  __memory:
 }
MEOS_APP_END fix meos_app_end


; macro for defining multiline text data
struc mstr [sstring]
 {
  forward
    local ssize
    virtual at 0
      db sstring
      ssize = $
    end virtual
    dd ssize
    db sstring
  common
    dd -1
 }


; strings
macro sz name,[data] {
  common
   if used name
    label name
   end if
  forward
   if used name
    db data
   end if
  common
   if used name
    .size = $-name
   end if
}

macro lsz name,[lng,data] {
  common
   if used name
    label name
   end if
  forward
   if (used name)&(lang eq lng)
    db data
   end if
  common
   if used name
    .size = $-name
   end if
}



; easy system call macro
macro mpack dest, hsrc, lsrc
{
  if (hsrc eqtype 0) & (lsrc eqtype 0)
    mov dest, (hsrc) shl 16 + lsrc
  else
    if (hsrc eqtype 0) & (~lsrc eqtype 0)
      mov dest, (hsrc) shl 16
      add dest, lsrc
    else
      mov dest, dword hsrc
      shl dest, 16
      add dest, lsrc
    end if
  end if
}

;macro __mov reg,a {         ; mike.dld
; if ~a eq
;   mov reg,a
; end if
;}

macro __mov reg,a,b {       ; mike.dld
 if (~a eq)&(~b eq)
   mpack reg,a,b
 else if (~a eq)&(b eq)
   mov reg,a
 end if
}

macro mcall a,b,c,d,e,f {   ; mike.dld
 __mov eax,a
 __mov ebx,b
 __mov ecx,c
 __mov edx,d
 __mov esi,e
 __mov edi,f
 int   0x40
}


; -------------------------
macro header a,[b] {
 common
  use32
  org 0
  db 'MENUET',a
 forward
  if b eq
   dd 0
  else
   dd b
  end if }
macro section name,alb {
 if alb eq
  align 4
 else
  align alb
 end if
 name: }

macro _export lib_name,[func_name,func_addr]
{
  ;
}
macro _import lib_name,[func_name,func_addr]
{
  ;
}

macro export_funcs lib_name,[func_name,func_addr]
{
  ;
}

;macro func name,[arg] {
; common
; if ~used name
;  if __DISPLAY_NOT_USED__
;   display 'FUNC NOT USED: ',`name,13,10
;  end if
; else
;  align 4
;  name:
;  virtual at ebp+8
;   if ~arg eq
; forward
;    first@args fix arg
; reverse
;    local ..arg
;    ..arg dd ?
;    arg equ ..arg
; common
;   end if
;   ..ret = $-(ebp+8)
;  end virtual
;}
;macro rstargs [arg] { restore arg }
;macro endf {
;  macro rstargs#first@args \{\}
;  rstargs args@func
;  purge rstargs#first@args
; end if
;}
;macro purge@func [arg] { purge arg }

macro diff16 title,l1,l2
 {
  local s,d
  s = l2-l1
  display title,': 0x'
  repeat 8
   d = '0' + s shr ((8-%) shl 2) and $0F
   if d > '9'
    d = d + 'A'-'9'-1
   end if
   display d
  end repeat
  display 13,10
 }

macro diff10 title,l1,l2
 {
  local s,d,z,m
  s = l2-l1
  z = 0
  m = 1000000000
  display title,': '
  repeat 10
   d = '0' + s / m
   s = s - (s/m)*m
   m = m / 10
   if d <> '0'
    z = 1
   end if
   if z <> 0
    display d
   end if
  end repeat
  display 13,10
 }

; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>

macro add arg1,arg2
 {
   if (arg2 eqtype 0)
      if (arg2) = 1
         inc arg1
      else
         add arg1,arg2
      end if
   else
      add arg1,arg2
   end if
 }

macro sub arg1,arg2
 {
   if (arg2 eqtype 0)
      if (arg2) = 1
         dec arg1
      else
         sub arg1,arg2
      end if
   else
      sub arg1,arg2
   end if
 }

macro mov arg1,arg2
 {
   if (arg1 in __regs) & (arg2 eqtype 0)
      if (arg2) = 0
         xor arg1,arg1
      else if (arg2) = 1
         xor arg1,arg1
         inc arg1
      else if (arg2) = -1
         or  arg1,-1
      else if (arg2) > -128 & (arg2) < 128
         push arg2
         pop  arg1
      else
         mov  arg1,arg2
      end if
   else
      mov arg1,arg2
   end if
 }


macro library [name,fname]
{
  forward
    dd __#name#_library_table__,__#name#_library_name__
  common
    dd 0
  forward
    align 4
    __#name#_library_name__ db fname,0
}

macro import lname,[name,sname]
{
  common
    align 4
    __#lname#_library_table__:
  forward
    name dd __#name#_import_name__
  common
    dd 0
  forward
    align 4
    __#name#_import_name__ db sname,0
}

macro export [name,sname]
{
  forward
    dd __#name#_export_name__,name
  common
    dd 0
  forward
    if ~defined __#name#_export_name__ | defined @f
      align 4
      @@:__#name#_export_name__ db sname,0
    end if
}


struc POINT _t,_dx,_dy {
  x _t _dx
  y _t _dy
}

; structures used in MeOS
struct process_information
  cpu_usage               dd ?  ; +0
  window_stack_position   dw ?  ; +4
  window_stack_value      dw ?  ; +6
  not_used1               dw ?  ; +8
  process_name            rb 12 ; +10
  memory_start            dd ?  ; +22
  used_memory             dd ?  ; +26
  PID                     dd ?  ; +30
  x_start                 dd ?  ; +34
  y_start                 dd ?  ; +38
  x_size                  dd ?  ; +42
  y_size                  dd ?  ; +46
  slot_state              dw ?  ; +50
  rb (1024-52)
ends

struct system_colors
  frame            dd ?
  grab             dd ?
  grab_button      dd ?
  grab_button_text dd ?
  grab_text        dd ?
  work             dd ?
  work_button      dd ?
  work_button_text dd ?
  work_text        dd ?
  work_graph       dd ?
ends


; constants

; events
EV_IDLE        = 0
EV_TIMER       = 0
EV_REDRAW      = 1
EV_KEY         = 2
EV_BUTTON      = 3
EV_EXIT        = 4
EV_BACKGROUND  = 5
EV_MOUSE       = 6
EV_IPC         = 7
EV_STACK       = 8

; event mask bits for function 40
EVM_REDRAW     = 000000001b
EVM_KEY        = 000000010b
EVM_BUTTON     = 000000100b
EVM_EXIT       = 000001000b
EVM_BACKGROUND = 000010000b
EVM_MOUSE      = 000100000b
EVM_IPC        = 001000000b
EVM_STACK      = 010000000b

end if ; global.macros.inc
