Subversion Repositories Kolibri OS

Rev

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

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