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