Subversion Repositories Kolibri OS

Rev

Rev 111 | 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. ;pushad
  221. ;pushfd
  222. ;dps `name
  223. ;newline
  224. ;mcall 5,1
  225. ;popfd
  226. ;popad
  227. }
  228. macro endf { end if }
  229.  
  230. macro diff16 title,l1,l2
  231.  {
  232.   local s,d
  233.   s = l2-l1
  234.   display title,': 0x'
  235.   repeat 8
  236.    d = '0' + s shr ((8-%) shl 2) and $0F
  237.    if d > '9'
  238.     d = d + 'A'-'9'-1
  239.    end if
  240.    display d
  241.   end repeat
  242.   display 13,10
  243.  }
  244.  
  245. macro diff10 title,l1,l2
  246.  {
  247.   local s,d,z,m
  248.   s = l2-l1
  249.   z = 0
  250.   m = 1000000000
  251.   display title,': '
  252.   repeat 10
  253.    d = '0' + s / m
  254.    s = s - (s/m)*m
  255.    m = m / 10
  256.    if d <> '0'
  257.     z = 1
  258.    end if
  259.    if z <> 0
  260.     display d
  261.    end if
  262.   end repeat
  263.   display 13,10
  264.  }
  265.  
  266. ; optimize the code for size
  267. __regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
  268.  
  269. macro add arg1,arg2
  270.  {
  271.    if (arg2 eqtype 0)
  272.       if (arg2) = 1
  273.      inc arg1
  274.       else
  275.      add arg1,arg2
  276.       end if
  277.    else
  278.       add arg1,arg2
  279.    end if
  280.  }
  281.  
  282. macro sub arg1,arg2
  283.  {
  284.    if (arg2 eqtype 0)
  285.       if (arg2) = 1
  286.      dec arg1
  287.       else
  288.      sub arg1,arg2
  289.       end if
  290.    else
  291.       sub arg1,arg2
  292.    end if
  293.  }
  294.  
  295. macro mov arg1,arg2
  296.  {
  297.    if (arg1 in __regs) & (arg2 eqtype 0)
  298.       if (arg2) = 0
  299.      xor arg1,arg1
  300.       else if (arg2) = 1
  301.      xor arg1,arg1
  302.      inc arg1
  303.       else if (arg2) = -1
  304.      or  arg1,-1
  305.       else if (arg2) > -128 & (arg2) < 128
  306.      push arg2
  307.      pop  arg1
  308.       else
  309.      mov  arg1,arg2
  310.       end if
  311.    else
  312.       mov arg1,arg2
  313.    end if
  314.  }
  315.  
  316.  
  317. macro RGB [a] {
  318.  common
  319.   match (r=,g=,b),a \{
  320.    \dd ((r) shl 16) or ((g) shl 8) or (b)
  321.   \}
  322. }
  323.  
  324.  
  325. struc POINT _t,_dx,_dy {
  326.  .x _t _dx
  327.  .y _t _dy
  328. }
  329.  
  330.  
  331. ; Macroinstructions for defining data structures
  332.  
  333. macro struct name
  334.  { fields@struct equ name
  335.    match child parent, name \{ fields@struct equ child,fields@\#parent \}
  336.    sub@struct equ
  337.    struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
  338.    struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
  339.    struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
  340.    struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
  341.    struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
  342.    struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
  343.    struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
  344.    struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
  345.    struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
  346.    struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
  347.    struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
  348.    struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
  349.    struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
  350.    macro db [val] \{ \common \local anonymous
  351.              fields@struct equ fields@struct,anonymous,db,<val> \}
  352.    macro dw [val] \{ \common \local anonymous
  353.              fields@struct equ fields@struct,anonymous,dw,<val> \}
  354.    macro du [val] \{ \common \local anonymous
  355.              fields@struct equ fields@struct,anonymous,du,<val> \}
  356.    macro dd [val] \{ \common \local anonymous
  357.              fields@struct equ fields@struct,anonymous,dd,<val> \}
  358.    macro dp [val] \{ \common \local anonymous
  359.              fields@struct equ fields@struct,anonymous,dp,<val> \}
  360.    macro dq [val] \{ \common \local anonymous
  361.              fields@struct equ fields@struct,anonymous,dq,<val> \}
  362.    macro dt [val] \{ \common \local anonymous
  363.              fields@struct equ fields@struct,anonymous,dt,<val> \}
  364.    macro rb count \{ \local anonymous
  365.              fields@struct equ fields@struct,anonymous,db,count dup (?) \}
  366.    macro rw count \{ \local anonymous
  367.              fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
  368.    macro rd count \{ \local anonymous
  369.              fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
  370.    macro rp count \{ \local anonymous
  371.              fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
  372.    macro rq count \{ \local anonymous
  373.              fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
  374.    macro rt count \{ \local anonymous
  375.              fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
  376.    macro union \{ fields@struct equ fields@struct,,union,<
  377.           sub@struct equ union \}
  378.    macro struct \{ fields@struct equ fields@struct,,substruct,<
  379.           sub@struct equ substruct \}
  380.    virtual at 0 }
  381.  
  382. macro ends
  383.  { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
  384.              restruc rb,rw,rd,rp,rq,rt
  385.              purge db,dw,du,dd,dp,dq,dt
  386.              purge rb,rw,rd,rp,rq,rt
  387.              purge union,struct
  388.              match name=,fields,fields@struct \\{ fields@struct equ
  389.                                   make@struct name,fields
  390.                                   fields@\\#name equ fields \\}
  391.              end virtual \}
  392.    match any, sub@struct \{ fields@struct equ fields@struct> \}
  393.    restore sub@struct }
  394.  
  395. macro make@struct name,[field,type,def]
  396.  { common
  397.     if $
  398.      display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
  399.      err
  400.     end if
  401.     local define
  402.     define equ name
  403.    forward
  404.     local sub
  405.     match , field \{ make@substruct type,name,sub def
  406.              define equ define,.,sub, \}
  407.     match any, field \{ define equ define,.#field,type,<def> \}
  408.    common
  409.     match fields, define \{ define@struct fields \} }
  410.  
  411. macro define@struct name,[field,type,def]
  412.  { common
  413.     local list
  414.     list equ
  415.    forward
  416.     if ~ field eq .
  417.      name#field type def
  418.      sizeof.#name#field = $ - name#field
  419.     else
  420.      rb sizeof.#type
  421.     end if
  422.     local value
  423.     match any, list \{ list equ list, \}
  424.     list equ list <value>
  425.    common
  426.     sizeof.#name = $
  427.     restruc name
  428.     match values, list \{
  429.     struc name value \\{
  430.     match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
  431.     match , fields@struct \\\{ label .
  432.    forward
  433.      match , value \\\\{ field type def \\\\}
  434.      match any, value \\\\{ field type value
  435.                if ~ field eq .
  436.                 rb sizeof.#name#field - ($-field)
  437.                end if \\\\}
  438.    common \\\} \\} \} }
  439.  
  440. macro enable@substruct
  441.  { macro make@substruct substruct,parent,name,[field,type,def]
  442.     \{ \common
  443.     \local define
  444.     define equ parent,name
  445.        \forward
  446.     \local sub
  447.     match , field \\{ match any, type \\\{ enable@substruct
  448.                            make@substruct type,name,sub def
  449.                            purge make@substruct
  450.                            define equ define,.,sub, \\\} \\}
  451.     match any, field \\{ define equ define,.\#field,type,<def> \\}
  452.        \common
  453.     match fields, define \\{ define@\#substruct fields \\} \} }
  454.  
  455. enable@substruct
  456.  
  457. macro define@union parent,name,[field,type,def]
  458.  { common
  459.     virtual at 0
  460.    forward
  461.     if ~ field eq .
  462.      virtual at 0
  463.       parent#field type def
  464.       sizeof.#parent#field = $ - parent#field
  465.      end virtual
  466.      if sizeof.#parent#field > $
  467.       rb sizeof.#parent#field - $
  468.      end if
  469.     else if sizeof.#type > $
  470.      rb sizeof.#type - $
  471.     end if
  472.    common
  473.     sizeof.#name = $
  474.     end virtual
  475.     struc name [value] \{ \common
  476.     label .\#name
  477.     last@union equ
  478.    forward
  479.     match any, last@union \\{ virtual at .\#name
  480.                    field type def
  481.                   end virtual \\}
  482.     match , last@union \\{ match , value \\\{ field type def \\\}
  483.                match any, value \\\{ field type value \\\} \\}
  484.     last@union equ field
  485.    common rb sizeof.#name - ($ - .\#name) \} }
  486.  
  487. macro define@substruct parent,name,[field,type,def]
  488.  { common
  489.     virtual at 0
  490.    forward
  491.     if ~ field eq .
  492.      parent#field type def
  493.      sizeof.#parent#field = $ - parent#field
  494.     else
  495.      rb sizeof.#type
  496.     end if
  497.     local value
  498.    common
  499.     sizeof.#name = $
  500.     end virtual
  501.     struc name value \{
  502.     label .\#name
  503.    forward
  504.      match , value \\{ field type def \\}
  505.      match any, value \\{ field type value
  506.               if ~ field eq .
  507.                rb sizeof.#parent#field - ($-field)
  508.               end if \\}
  509.    common \} }
  510.  
  511. ; structures used in MeOS
  512. struct process_information
  513.   cpu_usage          dd ?    ; +0
  514.   window_stack_position   dw ?    ; +4
  515.   window_stack_value      dw ?    ; +6
  516.   not_used1          dw ?    ; +8
  517.   process_name          rb 12 ; +10
  518.   memory_start          dd ?    ; +22
  519.   used_memory          dd ?    ; +26
  520.   PID              dd ?    ; +30
  521.   x_start          dd ?    ; +34
  522.   y_start          dd ?    ; +38
  523.   x_size          dd ?    ; +42
  524.   y_size          dd ?    ; +46
  525.   slot_state          dw ?    ; +50
  526.   rb (1024-52)
  527. ends
  528.  
  529. struct system_colors
  530.   frame        dd ?
  531.   grab           dd ?
  532.   grab_button       dd ?
  533.   grab_button_text dd ?
  534.   grab_text       dd ?
  535.   work           dd ?
  536.   work_button       dd ?
  537.   work_button_text dd ?
  538.   work_text       dd ?
  539.   work_graph       dd ?
  540. ends
  541.  
  542.  
  543. ; constants
  544.  
  545. ; events
  546. EV_IDLE        = 0
  547. EV_TIMER       = 0
  548. EV_REDRAW      = 1
  549. EV_KEY           = 2
  550. EV_BUTTON      = 3
  551. EV_EXIT        = 4
  552. EV_BACKGROUND  = 5
  553. EV_MOUSE       = 6
  554. EV_IPC           = 7
  555. EV_STACK       = 8
  556.  
  557. ; event mask bits for function 40
  558. EVM_REDRAW     =    1b
  559. EVM_KEY        =       10b
  560. EVM_BUTTON     =      100b
  561. EVM_EXIT       =     1000b
  562. EVM_BACKGROUND =    10000b
  563. EVM_MOUSE      =   100000b
  564. EVM_IPC        =  1000000b
  565. EVM_STACK      = 10000000b
  566.