Subversion Repositories Kolibri OS

Rev

Rev 9604 | Blame | Compare with Previous | Last modification | View Log | 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. KOS_APP_START fix meos_app_start
  114.  
  115. macro code
  116.  {
  117.   __start:
  118.  }
  119. CODE fix code
  120.  
  121. macro data
  122.  {
  123.   __data:
  124.   IncludeIGlobals
  125.  }
  126. DATA fix data
  127.  
  128. macro udata
  129.  {
  130.   if used __params & ~defined __params
  131.     __params:
  132.       db 0
  133.     __end:
  134.       rb 255
  135.   else
  136.     __end:
  137.   end if
  138.   __udata:
  139.   IncludeUGlobals
  140.  }
  141. UDATA fix udata
  142.  
  143. macro meos_app_end
  144.  {
  145.   align 32
  146.   rb 2048
  147.   __stack:
  148.   __memory:
  149.  }
  150. MEOS_APP_END fix meos_app_end
  151. KOS_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] {       ; [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 for zero terminated 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] {  ; [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] {     ; [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] {  ; [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,g {   ; [mike.dld], [Ghost]
  298.  local  ..ret_point
  299.  __mov eax,a
  300.  __mov ebx,b
  301.  __mov ecx,c
  302.  __mov edx,d
  303.  __mov esi,e
  304.  __mov edi,f
  305.  __mov ebp,g
  306.  
  307.  if __CPU_type eq p5
  308.         int     0x40
  309.  else
  310.   if __CPU_type eq p6
  311.         push    ebp
  312.         mov     ebp, esp
  313.         push    ..ret_point     ; it may be 2 or 5 byte
  314.         sysenter
  315.  ..ret_point:
  316.         pop     edx
  317.         pop     ecx
  318.  
  319.   else
  320.    if __CPU_type eq k6
  321.         push    ecx
  322.         syscall
  323.         pop     ecx
  324.    else
  325.         display 'ERROR : unknown CPU type (set to p5)', 10, 13
  326.         __CPU_type equ p5
  327.         int     0x40
  328.    end if
  329.   end if
  330.  end if
  331. }
  332.  
  333.  
  334. ; -------------------------
  335. macro __header a,[b] {
  336.  common
  337.   use32
  338.   org 0
  339.   db 'MENUET',a
  340.  forward
  341.   if b eq
  342.    dd 0
  343.   else
  344.    dd b
  345.   end if
  346. }
  347.  
  348. macro __section name {
  349.  align 16
  350.  label name
  351. }
  352.  
  353. macro __func name {
  354.  if ~used name
  355.   display 'FUNC NOT USED: ',`name,13,10
  356.  else
  357.   align 4
  358.   name:
  359.   ;diff16 `name,0,name
  360. }
  361.  
  362. macro endf { end if }
  363.  
  364. macro diff16 title,l1,l2
  365.  {
  366.   local s,d
  367.   s = l2-l1
  368.   display title,': 0x'
  369.   repeat 8
  370.    d = '0' + s shr ((8-%) shl 2) and $0F
  371.    if d > '9'
  372.     d = d + 'A'-'9'-1
  373.    end if
  374.    display d
  375.   end repeat
  376.   display 13,10
  377.  }
  378.  
  379. macro diff10 title,l1,l2
  380.  {
  381.   local s,d,z,m
  382.   s = l2-l1
  383.   z = 0
  384.   m = 1000000000
  385.   display title,': '
  386.   repeat 10
  387.    d = '0' + s / m
  388.    s = s - (s/m)*m
  389.    m = m / 10
  390.    if d <> '0'
  391.     z = 1
  392.    end if
  393.    if z <> 0
  394.     display d
  395.    end if
  396.   end repeat
  397.   display 13,10
  398.  }
  399.  
  400.  
  401. macro movi arg1,arg2
  402. {
  403. if (arg1 in <eax,ebx,ecx,edx,esi,edi,ebp,esp>) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
  404.   if (arg2) = 0
  405.     xor arg1,arg1
  406.   else if (arg2) = 1
  407.     xor arg1,arg1
  408.     inc arg1
  409.   else if (arg2) = -1
  410.     or arg1,-1
  411.   else if (arg2) >= -128 & (arg2) <= 127
  412.     push arg2
  413.     pop arg1
  414.   else
  415.     mov arg1,arg2
  416.   end if
  417. else
  418.   mov arg1,arg2
  419. end if
  420. }
  421.  
  422.  
  423. macro RGB [a] {
  424.  common
  425.   match (r=,g=,b),a \{
  426.    \dd ((r) shl 16) or ((g) shl 8) or (b)
  427.   \}
  428. }
  429.  
  430.  
  431. struc POINT _t,_dx,_dy {
  432.  .x _t _dx
  433.  .y _t _dy
  434. }
  435.  
  436. ; structure definition helper
  437. include 'struct.inc'
  438.  
  439. struct RECT
  440.   left   dd ?
  441.   top    dd ?
  442.   right  dd ?
  443.   bottom dd ?
  444. ends
  445.  
  446. struct BOX
  447.   left   dd ?
  448.   top    dd ?
  449.   width  dd ?
  450.   height dd ?
  451. ends
  452.  
  453. ; structures used in KolibriOS
  454. struct process_information
  455.   cpu_usage               dd ?  ; +0
  456.   window_stack_position   dw ?  ; +4
  457.   window_stack_value      dw ?  ; +6
  458.                           dw ?  ; +8
  459.   process_name            rb 12 ; +10
  460.   memory_start            dd ?  ; +22
  461.   used_memory             dd ?  ; +26
  462.   PID                     dd ?  ; +30
  463.   box                     BOX   ; +34
  464.   slot_state              dw ?  ; +50
  465.                           dw ?  ; +52
  466.   client_box              BOX   ; +54
  467.   wnd_state               db ?  ; +70
  468.   event_mask              dd ?  ; +71
  469.   keyboard_mode           db ?  ; +75
  470.   rb (1024-76)
  471. ends
  472.  
  473. struct system_colors
  474.   frame            dd ? ;nonset1
  475.   grab             dd ? ;nonset2
  476.   work_dark        dd ?
  477.   work_light       dd ?
  478.   grab_text        dd ? ;window_title
  479.   work             dd ?
  480.   work_button      dd ?
  481.   work_button_text dd ?
  482.   work_text        dd ?
  483.   work_graph       dd ?
  484. ends
  485.  
  486. struct FILEDATE
  487.   Second db ?
  488.   Minute db ?
  489.   Hour   db ?
  490.          db ?
  491.   Day    db ?
  492.   Month  db ?
  493.   Year   dw ?
  494. ends
  495.  
  496. struct FILEINFO
  497.   Attributes dd ?
  498.   IsUnicode  db ?
  499.              db 3 dup(?)
  500.   DateCreate FILEDATE
  501.   DateAccess FILEDATE
  502.   DateModify FILEDATE
  503.   Size       dq ?
  504. ends
  505.  
  506. cmove   fix     cmovz
  507.  
  508. macro cmovz reg1, reg2 {
  509.  
  510.         local   ..jumpaddr
  511.  
  512. if __CPU_type eq p5             ; CMOVcc isnt supported on the P5
  513.         jnz     ..jumpaddr
  514.         mov     reg1, reg2
  515.   ..jumpaddr:
  516. else
  517.         cmovz   reg1, reg2
  518. end if
  519.  
  520. }
  521.  
  522. cmovne  fix     cmovnz
  523.  
  524. macro cmovnz reg1, reg2 {
  525.  
  526.         local   ..jumpaddr
  527.  
  528. if __CPU_type eq p5             ; CMOVcc isnt supported on the P5
  529.         jz      ..jumpaddr
  530.         mov     reg1, reg2
  531.   ..jumpaddr:
  532. else
  533.         cmovnz  reg1, reg2
  534. end if
  535.  
  536. }
  537.  
  538. macro cmovg reg1, reg2 {
  539.  
  540.         local   ..jumpaddr
  541.  
  542. if __CPU_type eq p5             ; CMOVcc isnt supported on the P5
  543.         jle     ..jumpaddr
  544.         mov     reg1, reg2
  545.   ..jumpaddr:
  546. else
  547.         cmovg   reg1, reg2
  548. end if
  549. }
  550.  
  551. macro cmovl reg1, reg2 {
  552.  
  553.         local   ..jumpaddr
  554.  
  555. if __CPU_type eq p5             ; CMOVcc isnt supported on the P5
  556.         jge     ..jumpaddr
  557.         mov     reg1, reg2
  558.   ..jumpaddr:
  559. else
  560.         cmovl   reg1, reg2
  561. end if
  562. }
  563.  
  564. ; replaces /programs/cmp.inc
  565. irp cond, e, ne, g, ng, l, nl, ge, le {
  566.   macro cmp#cond a, b, c\{
  567.     cmp a, b
  568.     j#cond c
  569.   \}
  570. }
  571.  
  572. ; constants
  573.  
  574. ; button flags
  575. BT_DEL         = 0x80000000
  576. BT_HIDE        = 0x40000000
  577. BT_NOFRAME     = 0x20000000
  578.  
  579. ; events
  580. EV_IDLE        = 0
  581. EV_TIMER       = 0
  582. EV_REDRAW      = 1
  583. EV_KEY         = 2
  584. EV_BUTTON      = 3
  585. EV_EXIT        = 4
  586. EV_BACKGROUND  = 5
  587. EV_MOUSE       = 6
  588. EV_IPC         = 7
  589. EV_STACK       = 8
  590.  
  591. ; event mask bits for function 40
  592. EVM_REDRAW     =          1b
  593. EVM_KEY        =         10b
  594. EVM_BUTTON     =        100b
  595. EVM_EXIT       =       1000b
  596. EVM_BACKGROUND =      10000b
  597. EVM_MOUSE      =     100000b
  598. EVM_IPC        =    1000000b
  599. EVM_STACK      =   10000000b
  600. EVM_DEBUG      =  100000000b
  601. EVM_STACK2     = 1000000000b
  602.  
  603. EVM_MOUSE_FILTER  = 0x80000000
  604. EVM_CURSOR_FILTER = 0x40000000
  605.