Subversion Repositories Kolibri OS

Rev

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

  1. ; language for programs
  2. lang fix en ; ru en fr ge fi
  3.  
  4. @^ fix macro comment {
  5. ^@ fix }
  6.  
  7.  
  8. macro m2m dest,src {
  9.  push src
  10.  pop  dest
  11. }
  12.  
  13. ; new application structure
  14. macro meos_app_start
  15.  {
  16.   use32
  17.   org 0x0
  18.  
  19.   db 'MENUET01'
  20.   dd 0x01
  21.   dd __start
  22.   dd __end
  23.   dd __memory
  24.   dd __stack
  25.  
  26.   if used __params & ~defined __params
  27.     dd __params
  28.   else
  29.     dd 0x0
  30.   end if
  31.  
  32.   dd 0x0
  33.  }
  34. MEOS_APP_START fix meos_app_start
  35.  
  36. macro code
  37.  {
  38.   __start:
  39.  }
  40. CODE fix code
  41.  
  42. macro data
  43.  {
  44.   __data:
  45.  }
  46. DATA fix data
  47.  
  48. macro udata
  49.  {
  50.   if used __params & ~defined __params
  51.     __params:
  52.       db 0
  53.     __end:
  54.       rb 255
  55.   else
  56.     __end:
  57.   end if
  58.   __udata:
  59.  }
  60. UDATA fix udata
  61.  
  62. macro meos_app_end
  63.  {
  64.   align 32
  65.   rb 2048
  66.   __stack:
  67.   __memory:
  68.  }
  69. MEOS_APP_END fix meos_app_end
  70.  
  71.  
  72. ; macro for defining multiline text data
  73. struc mstr [sstring]
  74.  {
  75.   forward
  76.     local ssize
  77.     virtual at 0
  78.       db sstring
  79.       ssize = $
  80.     end virtual
  81.     dd ssize
  82.     db sstring
  83.   common
  84.     dd -1
  85.  }
  86.  
  87.  
  88. ; strings
  89. macro sz name,[data] {       ; from MFAR [mike.dld]
  90.  common
  91.   if used name
  92.    name db data
  93.    .size = $-name
  94.   end if
  95. }
  96.  
  97. macro lsz name,[lng,data] {  ; from MFAR [mike.dld]
  98.  common
  99.   if used name
  100.    label name
  101.  forward
  102.   if lang eq lng
  103.    db data
  104.   end if
  105.  common
  106.    .size = $-name
  107.   end if
  108. }
  109.  
  110. macro szc name,elsz,[data] {         ; from MFAR [mike.dld]
  111.  common
  112.   local s,m
  113.   m = 0
  114.   if used name
  115.    label name
  116.    virtual at 0
  117.     db data
  118.     s = $
  119.    end virtual
  120.    d#elsz s
  121.    if m < s
  122.     m = s
  123.    end if
  124.    db data
  125.    .size = $-name
  126.    .maxl = m
  127.   end if
  128. }
  129.  
  130. macro lszc name,elsz,[lng,data] {  ; from MFAR [mike.dld]
  131.  common
  132.   local s,m,c
  133.   m = 0
  134.   c = 0
  135.   if used name
  136.    label name
  137.  forward
  138.   if lang eq lng
  139.    virtual at 0
  140.     db data
  141.     s = $
  142.    end virtual
  143.    d#elsz s
  144.    if m < s
  145.     m = s
  146.    end if
  147.    db data
  148.    c = c+1
  149.   end if
  150.  common
  151.    .size  = $-name
  152.    .maxl  = m
  153.    .count = c
  154.   end if
  155. }
  156.  
  157.  
  158. ; easy system call macro
  159. macro mpack dest, hsrc, lsrc
  160. {
  161.   if (hsrc eqtype 0) & (lsrc eqtype 0)
  162.     mov dest, (hsrc) shl 16 + lsrc
  163.   else
  164.     if (hsrc eqtype 0) & (~lsrc eqtype 0)
  165.       mov dest, (hsrc) shl 16
  166.       add dest, lsrc
  167.     else
  168.       mov dest, hsrc
  169.       shl dest, 16
  170.       add dest, lsrc
  171.     end if
  172.   end if
  173. }
  174.  
  175. ;macro __mov reg,a {         ; mike.dld
  176. ; if ~a eq
  177. ;   mov reg,a
  178. ; end if
  179. ;}
  180.  
  181. macro __mov reg,a,b {       ; mike.dld
  182.  if (~a eq)&(~b eq)
  183.    mpack reg,a,b
  184.  else if (~a eq)&(b eq)
  185.    mov reg,a
  186.  end if
  187. }
  188.  
  189. macro mcall a,b,c,d,e,f {   ; mike.dld
  190.  __mov eax,a
  191.  __mov ebx,b
  192.  __mov ecx,c
  193.  __mov edx,d
  194.  __mov esi,e
  195.  __mov edi,f
  196.  int   0x40
  197. }
  198.  
  199.  
  200. ; -------------------------
  201. macro header a,[b] {
  202.  common
  203.   use32
  204.   org 0
  205.   db 'MENUET',a
  206.  forward
  207.   if b eq
  208.    dd 0
  209.   else
  210.    dd b
  211.   end if }
  212. macro section name { align 16
  213.  label name }
  214. macro func name {
  215.  if ~used name
  216.   display 'FUNC NOT USED: ',`name,13,10
  217.  else
  218.   align 4
  219.   name:
  220.   ;diff16 `name,0,name
  221. ;pushad
  222. ;pushfd
  223. ;dps `name
  224. ;newline
  225. ;mcall 5,1
  226. ;popfd
  227. ;popad
  228. }
  229. macro endf { end if }
  230.  
  231. macro diff16 title,l1,l2
  232.  {
  233.   local s,d
  234.   s = l2-l1
  235.   display title,': 0x'
  236.   repeat 8
  237.    d = '0' + s shr ((8-%) shl 2) and $0F
  238.    if d > '9'
  239.     d = d + 'A'-'9'-1
  240.    end if
  241.    display d
  242.   end repeat
  243.   display 13,10
  244.  }
  245.  
  246. macro diff10 title,l1,l2
  247.  {
  248.   local s,d,z,m
  249.   s = l2-l1
  250.   z = 0
  251.   m = 1000000000
  252.   display title,': '
  253.   repeat 10
  254.    d = '0' + s / m
  255.    s = s - (s/m)*m
  256.    m = m / 10
  257.    if d <> '0'
  258.     z = 1
  259.    end if
  260.    if z <> 0
  261.     display d
  262.    end if
  263.   end repeat
  264.   display 13,10
  265.  }
  266.  
  267. ; optimize the code for size
  268. __regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
  269.  
  270. macro add arg1,arg2
  271.  {
  272.    if (arg2 eqtype 0)
  273.       if (arg2) = 1
  274.          inc arg1
  275.       else
  276.          add arg1,arg2
  277.       end if
  278.    else
  279.       add arg1,arg2
  280.    end if
  281.  }
  282.  
  283. macro sub arg1,arg2
  284.  {
  285.    if (arg2 eqtype 0)
  286.       if (arg2) = 1
  287.          dec arg1
  288.       else
  289.          sub arg1,arg2
  290.       end if
  291.    else
  292.       sub arg1,arg2
  293.    end if
  294.  }
  295.  
  296. macro mov arg1,arg2
  297.  {
  298.    if (arg1 in __regs) & (arg2 eqtype 0)
  299.       if (arg2) = 0
  300.          xor arg1,arg1
  301.       else if (arg2) = 1
  302.          xor arg1,arg1
  303.          inc arg1
  304.       else if (arg2) = -1
  305.          or  arg1,-1
  306.       else if (arg2) > -128 & (arg2) < 128
  307.          push arg2
  308.          pop  arg1
  309.       else
  310.          mov  arg1,arg2
  311.       end if
  312.    else
  313.       mov arg1,arg2
  314.    end if
  315.  }
  316.  
  317.  
  318. macro RGB [a] {
  319.  common
  320.   match (r=,g=,b),a \{
  321.    \dd ((r) shl 16) or ((g) shl 8) or (b)
  322.   \}
  323. }
  324.  
  325.  
  326. struc POINT _t,_dx,_dy {
  327.  .x _t _dx
  328.  .y _t _dy
  329. }
  330.  
  331. ; structure definition helper
  332. include 'struct.inc'
  333.  
  334. ; structures used in MeOS
  335. struct process_information
  336.   cpu_usage               dd; +0
  337.   window_stack_position   dw; +4
  338.   window_stack_value      dw; +6
  339.   not_used1               dw; +8
  340.   process_name            rb 12 ; +10
  341.   memory_start            dd; +22
  342.   used_memory             dd; +26
  343.   PID                     dd; +30
  344.   x_start                 dd; +34
  345.   y_start                 dd; +38
  346.   x_size                  dd; +42
  347.   y_size                  dd; +46
  348.   slot_state              dw; +50
  349.   rb (1024-52)
  350. ends
  351.  
  352. struct system_colors
  353.   frame            dd ?
  354.   grab             dd ?
  355.   grab_button      dd ?
  356.   grab_button_text dd ?
  357.   grab_text        dd ?
  358.   work             dd ?
  359.   work_button      dd ?
  360.   work_button_text dd ?
  361.   work_text        dd ?
  362.   work_graph       dd ?
  363. ends
  364.  
  365.  
  366. ; constants
  367.  
  368. ; events
  369. EV_IDLE        = 0
  370. EV_TIMER       = 0
  371. EV_REDRAW      = 1
  372. EV_KEY         = 2
  373. EV_BUTTON      = 3
  374. EV_EXIT        = 4
  375. EV_BACKGROUND  = 5
  376. EV_MOUSE       = 6
  377. EV_IPC         = 7
  378. EV_STACK       = 8
  379.  
  380. ; event mask bits for function 40
  381. EVM_REDRAW     =        1b
  382. EVM_KEY        =       10b
  383. EVM_BUTTON     =      100b
  384. EVM_EXIT       =     1000b
  385. EVM_BACKGROUND =    10000b
  386. EVM_MOUSE      =   100000b
  387. EVM_IPC        =  1000000b
  388. EVM_STACK      = 10000000b