Subversion Repositories Kolibri OS

Rev

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

  1. @^ fix macro comment {
  2. ^@ fix }
  3.  
  4. ; -------------------------
  5. macro library [lname,fname]
  6. {
  7.   forward
  8.     dd __#lname#_library_table__,__#lname#_library_name__
  9.   common
  10.     dd 0
  11.   forward
  12.     align 4
  13.     __#lname#_library_name__ db fname,0
  14. }
  15.  
  16. macro import lname,[name,sname]
  17. {
  18.   common
  19.     align 4
  20.     __#lname#_library_table__:
  21.   forward
  22.     if used name
  23.       name dd __#name#_import_name__
  24.     end if
  25.   common
  26.     dd 0
  27.   forward
  28.     if used name
  29.       align 4
  30.       __#name#_import_name__ db sname,0
  31.     end if
  32. }
  33.  
  34. macro export [name,sname]
  35. {
  36.   forward
  37.     dd __#name#_export_name__,name
  38.   common
  39.     dd 0
  40.   forward
  41.     align 4
  42.     __#name#_export_name__ db sname,0
  43. }
  44. ; -------------------------
  45.  
  46. macro m2m dest,src {
  47.  push src
  48.  pop  dest
  49. }
  50.  
  51.  
  52. macro iglobal {
  53.   IGlobals equ IGlobals,
  54.   macro __IGlobalBlock { }
  55.  
  56. macro uglobal {
  57.   UGlobals equ UGlobals,
  58.   macro __UGlobalBlock { }
  59.  
  60. endg fix }      ; Use endg for ending iglobal and uglobal blocks.
  61.  
  62.  
  63. macro IncludeIGlobals{
  64.   macro IGlobals dummy,[n] \{ __IGlobalBlock
  65.      purge __IGlobalBlock  \}
  66.   match I, IGlobals \{ I \} }
  67.  
  68. macro IncludeUGlobals{
  69.   macro UGlobals dummy,[n] \{
  70.     \common
  71.       \local begin, size
  72.       begin = $
  73.       virtual at $
  74.     \forward
  75.       __UGlobalBlock
  76.       purge __UGlobalBlock
  77.     \common
  78.       size = $ - begin
  79.     end virtual
  80.     rb size
  81.   \}
  82.   match U, UGlobals \{ U \} }
  83.  
  84. uglobal
  85. endg
  86.  
  87. iglobal
  88. endg
  89.  
  90.  
  91. ; new application structure
  92. macro meos_app_start
  93.  {
  94.   use32
  95.   org 0x0
  96.  
  97.   db 'MENUET01'
  98.   dd 0x01
  99.   dd __start
  100.   dd __end
  101.   dd __memory
  102.   dd __stack
  103.  
  104.   if used __params & ~defined __params
  105.     dd __params
  106.   else
  107.     dd 0x0
  108.   end if
  109.  
  110.   dd 0x0
  111.  }
  112. MEOS_APP_START fix meos_app_start
  113.  
  114. macro code
  115.  {
  116.   __start:
  117.  }
  118. CODE fix code
  119.  
  120. macro data
  121.  {
  122.   __data:
  123.   IncludeIGlobals
  124.  }
  125. DATA fix data
  126.  
  127. macro udata
  128.  {
  129.   if used __params & ~defined __params
  130.     __params:
  131.       db 0
  132.     __end:
  133.       rb 255
  134.   else
  135.     __end:
  136.   end if
  137.   __udata:
  138.   IncludeUGlobals
  139.  }
  140. UDATA fix udata
  141.  
  142. macro meos_app_end
  143.  {
  144.   align 32
  145.   rb 2048
  146.   __stack:
  147.   __memory:
  148.  }
  149. MEOS_APP_END fix meos_app_end
  150.  
  151.  
  152. ; macro for defining multiline text data
  153. struc mstr [sstring]
  154.  {
  155.   forward
  156.     local ssize
  157.     virtual at 0
  158.       db sstring
  159.       ssize = $
  160.     end virtual
  161.     dd ssize
  162.     db sstring
  163.   common
  164.     dd -1
  165.  }
  166.  
  167. ; macro for defining multiline text data
  168. struc mls [sstring]
  169.  {
  170.   forward
  171.     local ssize
  172.     virtual at 0
  173.       db sstring  ; mod
  174.       ssize = $
  175.     end virtual
  176.     db ssize
  177.     db sstring
  178.   common
  179.     db -1         ; mod
  180.  }
  181.  
  182.  
  183.  
  184. ; strings
  185. macro sz name,[data] {       ; from MFAR [mike.dld]
  186.  common
  187.   if used name
  188.    name db data
  189.    .size = $-name
  190.   end if
  191. }
  192.  
  193. macro lsz name,[lng,data] {  ; from MFAR [mike.dld]
  194.  common
  195.   if used name
  196.    label name
  197.  forward
  198.   if lang eq lng
  199.    db data
  200.   end if
  201.  common
  202.    .size = $-name
  203.   end if
  204. }
  205.  
  206. macro szc name,elsz,[data] {         ; from MFAR [mike.dld]
  207.  common
  208.   local s,m
  209.   m = 0
  210.   if used name
  211.    label name
  212.  forward
  213.    virtual at 0
  214.     db data
  215.     s = $
  216.    end virtual
  217.    d#elsz s
  218.    if m < s
  219.     m = s
  220.    end if
  221.    db data
  222.  common
  223.    .size = $-name
  224.    .maxl = m
  225.   end if
  226. }
  227.  
  228. macro lszc name,elsz,[lng,data] {  ; from MFAR [mike.dld]
  229.  common
  230.   local s,m,c
  231.   m = 0
  232.   c = 0
  233.   if used name
  234.    label name
  235.  forward
  236.   if lang eq lng
  237.    virtual at 0
  238.     db data
  239.     s = $
  240.    end virtual
  241.    d#elsz s
  242.    if m < s
  243.     m = s
  244.    end if
  245.    db data
  246.    c = c+1
  247.   end if
  248.  common
  249.    .size  = $-name
  250.    .maxl  = m
  251.    .count = c
  252.   end if
  253. }
  254.  
  255.  
  256. ; easy system call macro
  257. macro mpack dest, hsrc, lsrc
  258. {
  259.   if (hsrc eqtype 0) & (lsrc eqtype 0)
  260.     mov dest, (hsrc) shl 16 + lsrc
  261.   else
  262.     if (hsrc eqtype 0) & (~lsrc eqtype 0)
  263.       mov dest, (hsrc) shl 16
  264.       add dest, lsrc
  265.     else
  266.       mov dest, hsrc
  267.       shl dest, 16
  268.       add dest, lsrc
  269.     end if
  270.   end if
  271. }
  272.  
  273. macro __mov reg,a,b {       ; mike.dld
  274.  if (~a eq)&(~b eq)
  275.    mpack reg,a,b
  276.  else if (~a eq)&(b eq)
  277.    mov reg,a
  278.  end if
  279. }
  280.  
  281.  
  282. __CPU_type     equ     p5
  283. SYSENTER_VAR    equ     0
  284.  
  285. macro mcall a,b,c,d,e,f {   ; mike.dld, updated by Ghost for Fast System Calls
  286.  local  ..ret_point
  287.  __mov eax,a
  288.  __mov ebx,b
  289.  __mov ecx,c
  290.  __mov edx,d
  291.  __mov esi,e
  292.  __mov edi,f
  293.  
  294.  if __CPU_type eq p5
  295.         int     0x40
  296.  else
  297.   if __CPU_type eq p6
  298.         push    ebp
  299.         mov     ebp, esp
  300.         push    ..ret_point     ; it may be 2 or 5 byte
  301.         sysenter
  302.  ..ret_point:
  303.         pop     edx
  304.         pop     ecx
  305.  
  306.   else
  307.    if __CPU_type eq k6
  308.         push    ecx
  309.         syscall
  310.         pop     ecx
  311.    else
  312.         display 'ERROR : unknown CPU type (set to p5)', 10, 13
  313.         __CPU_type equ p5
  314.         int     0x40
  315.    end if
  316.   end if
  317.  end if
  318. }
  319.  
  320.  
  321. ; -------------------------
  322. macro header a,[b] {
  323.  common
  324.   use32
  325.   org 0
  326.   db 'MENUET',a
  327.  forward
  328.   if b eq
  329.    dd 0
  330.   else
  331.    dd b
  332.   end if }
  333. macro section name { align 16
  334.  label name }
  335. macro func name {
  336.  if ~used name
  337.   display 'FUNC NOT USED: ',`name,13,10
  338.  else
  339.   align 4
  340.   name:
  341.   ;diff16 `name,0,name
  342. ;pushad
  343. ;pushfd
  344. ;dps `name
  345. ;newline
  346. ;mcall 5,1
  347. ;popfd
  348. ;popad
  349. }
  350. macro endf { end if }
  351.  
  352. macro diff16 title,l1,l2
  353.  {
  354.   local s,d
  355.   s = l2-l1
  356.   display title,': 0x'
  357.   repeat 8
  358.    d = '0' + s shr ((8-%) shl 2) and $0F
  359.    if d > '9'
  360.     d = d + 'A'-'9'-1
  361.    end if
  362.    display d
  363.   end repeat
  364.   display 13,10
  365.  }
  366.  
  367. macro diff10 title,l1,l2
  368.  {
  369.   local s,d,z,m
  370.   s = l2-l1
  371.   z = 0
  372.   m = 1000000000
  373.   display title,': '
  374.   repeat 10
  375.    d = '0' + s / m
  376.    s = s - (s/m)*m
  377.    m = m / 10
  378.    if d <> '0'
  379.     z = 1
  380.    end if
  381.    if z <> 0
  382.     display d
  383.    end if
  384.   end repeat
  385.   display 13,10
  386.  }
  387.  
  388. ; optimize the code for size
  389. __regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
  390.  
  391. macro add arg1,arg2
  392.  {
  393.    if (arg2 eqtype 0)
  394.       if (arg2) = 1
  395.          inc arg1
  396.       else
  397.          add arg1,arg2
  398.       end if
  399.    else
  400.       add arg1,arg2
  401.    end if
  402.  }
  403.  
  404. macro sub arg1,arg2
  405.  {
  406.    if (arg2 eqtype 0)
  407.       if (arg2) = 1
  408.          dec arg1
  409.       else
  410.          sub arg1,arg2
  411.       end if
  412.    else
  413.       sub arg1,arg2
  414.    end if
  415.  }
  416.  
  417. macro mov arg1,arg2
  418.  {
  419.    if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
  420.       if (arg2) = 0
  421.          xor arg1,arg1
  422.       else if (arg2) = 1
  423.          xor arg1,arg1
  424.          inc arg1
  425.       else if (arg2) = -1
  426.          or  arg1,-1
  427.       else if (arg2) > -128 & (arg2) < 128
  428.          push arg2
  429.          pop  arg1
  430.       else
  431.          mov  arg1,arg2
  432.       end if
  433.    else
  434.       mov arg1,arg2
  435.    end if
  436.  }
  437.  
  438.  
  439. macro RGB [a] {
  440.  common
  441.   match (r=,g=,b),a \{
  442.    \dd ((r) shl 16) or ((g) shl 8) or (b)
  443.   \}
  444. }
  445.  
  446.  
  447. struc POINT _t,_dx,_dy {
  448.  .x _t _dx
  449.  .y _t _dy
  450. }
  451.  
  452. ; structure definition helper
  453. include 'struct.inc'
  454.  
  455. struct RECT
  456.   left   dd ?
  457.   top    dd ?
  458.   right  dd ?
  459.   bottom dd ?
  460. ends
  461.  
  462. struct BOX
  463.   left   dd ?
  464.   top    dd ?
  465.   width  dd ?
  466.   height dd ?
  467. ends
  468.  
  469. ; structures used in MeOS
  470. struct process_information
  471.   cpu_usage               dd; +0
  472.   window_stack_position   dw; +4
  473.   window_stack_value      dw; +6
  474.                           dw; +8
  475.   process_name            rb 12 ; +10
  476.   memory_start            dd; +22
  477.   used_memory             dd; +26
  478.   PID                     dd; +30
  479.   box                     BOX   ; +34
  480.   slot_state              dw; +50
  481.                           dw; +52
  482.   client_box              BOX   ; +54
  483.   wnd_state               db; +70
  484.   rb (1024-71)
  485. ends
  486.  
  487. struct system_colors
  488.   frame            dd ?
  489.   grab             dd ?
  490.   grab_button      dd ?
  491.   grab_button_text dd ?
  492.   grab_text        dd ?
  493.   work             dd ?
  494.   work_button      dd ?
  495.   work_button_text dd ?
  496.   work_text        dd ?
  497.   work_graph       dd ?
  498. ends
  499.  
  500. struct FILEDATE
  501.   Second db ?
  502.   Minute db ?
  503.   Hour   db ?
  504.          db ?
  505.   Day    db ?
  506.   Month  db ?
  507.   Year   dw ?
  508. ends
  509.  
  510. struct FILEINFO
  511.   Attributes dd ?
  512.   IsUnicode  db ?
  513.              db 3 dup(?)
  514.   DateCreate FILEDATE
  515.   DateAccess FILEDATE
  516.   DateModify FILEDATE
  517.   Size       dq ?
  518. ends
  519.  
  520. ; constants
  521.  
  522. ; events
  523. EV_IDLE        = 0
  524. EV_TIMER       = 0
  525. EV_REDRAW      = 1
  526. EV_KEY         = 2
  527. EV_BUTTON      = 3
  528. EV_EXIT        = 4
  529. EV_BACKGROUND  = 5
  530. EV_MOUSE       = 6
  531. EV_IPC         = 7
  532. EV_STACK       = 8
  533.  
  534. ; event mask bits for function 40
  535. EVM_REDRAW     =        1b
  536. EVM_KEY        =       10b
  537. EVM_BUTTON     =      100b
  538. EVM_EXIT       =     1000b
  539. EVM_BACKGROUND =    10000b
  540. EVM_MOUSE      =   100000b
  541. EVM_IPC        =  1000000b
  542. EVM_STACK      = 10000000b
  543.  
  544.