Apps: fixed 3 programs for using a long path in parameters
[kolibrios.git] / programs / macros.inc
blob39fb53aa6aff13916fe13911ba3ef63367cfdf00
1 @^ fix macro comment {\r
2 ^@ fix }\r
3 \r
4 ; --------------------------\r
5 macro library [lname,fname]\r
6 {\r
7   forward\r
8     dd __#lname#_library_table__,__#lname#_library_name__\r
9   common\r
10     dd 0\r
11   forward\r
12     align 4\r
13     __#lname#_library_name__ db fname,0\r
14 }\r
16 macro import lname,[name,sname]\r
17 {\r
18   common\r
19     align 4\r
20     __#lname#_library_table__:\r
21   forward\r
22     if used name\r
23       name dd __#name#_import_name__\r
24     end if\r
25   common\r
26     dd 0\r
27   forward\r
28     if used name\r
29       align 4\r
30       __#name#_import_name__ db sname,0\r
31     end if\r
32 }\r
34 macro export [name,sname]\r
35 {\r
36   forward\r
37     dd __#name#_export_name__,name\r
38   common\r
39     dd 0\r
40   forward\r
41     align 4\r
42     __#name#_export_name__ db sname,0\r
43 }\r
44 ; -------------------------\r
46 macro m2m dest,src {\r
47  push src\r
48  pop  dest\r
49 }\r
52 macro iglobal {\r
53   IGlobals equ IGlobals,\r
54   macro __IGlobalBlock { }\r
56 macro uglobal {\r
57   UGlobals equ UGlobals,\r
58   macro __UGlobalBlock { }\r
60 endg fix }      ; Use endg for ending iglobal and uglobal blocks.\r
63 macro IncludeIGlobals{\r
64   macro IGlobals dummy,[n] \{ __IGlobalBlock\r
65      purge __IGlobalBlock  \}\r
66   match I, IGlobals \{ I \} }\r
68 macro IncludeUGlobals{\r
69   macro UGlobals dummy,[n] \{\r
70     \common\r
71       \local begin, size\r
72       begin = $\r
73       virtual at $\r
74     \forward\r
75       __UGlobalBlock\r
76       purge __UGlobalBlock\r
77     \common\r
78       size = $ - begin\r
79     end virtual\r
80     rb size\r
81   \}\r
82   match U, UGlobals \{ U \} }\r
84 uglobal\r
85 endg\r
87 iglobal\r
88 endg\r
91 ; new application structure\r
92 macro meos_app_start\r
93  {\r
94   use32\r
95   org 0x0\r
97   db 'MENUET01'\r
98   dd 0x01\r
99   dd __start\r
100   dd __end\r
101   dd __memory\r
102   dd __stack\r
104   if used __params & ~defined __params\r
105     dd __params\r
106   else\r
107     dd 0x0\r
108   end if\r
110   dd 0x0\r
111  }\r
112 MEOS_APP_START fix meos_app_start\r
113 KOS_APP_START fix meos_app_start\r
115 macro code\r
116  {\r
117   __start:\r
118  }\r
119 CODE fix code\r
121 macro data\r
122  {\r
123   __data:\r
124   IncludeIGlobals\r
125  }\r
126 DATA fix data\r
128 macro udata\r
129  {\r
130   if used __params & ~defined __params\r
131     __params:\r
132       db 0\r
133     __end:\r
134       rb 255\r
135   else\r
136     __end:\r
137   end if\r
138   __udata:\r
139   IncludeUGlobals\r
140  }\r
141 UDATA fix udata\r
143 macro meos_app_end\r
144  {\r
145   align 32\r
146   rb 2048\r
147   __stack:\r
148   __memory:\r
149  }\r
150 MEOS_APP_END fix meos_app_end\r
151 KOS_APP_END fix meos_app_end\r
154 ; macro for defining multiline text data\r
155 struc mstr [sstring]\r
156  {\r
157   forward\r
158     local ssize\r
159     virtual at 0\r
160       db sstring\r
161       ssize = $\r
162     end virtual\r
163     dd ssize\r
164     db sstring\r
165   common\r
166     dd -1\r
167  }\r
169 ; macro for defining multiline text data\r
170 struc mls [sstring]\r
171  {\r
172   forward\r
173     local ssize\r
174     virtual at 0\r
175       db sstring  ; mod\r
176       ssize = $\r
177     end virtual\r
178     db ssize\r
179     db sstring\r
180   common\r
181     db -1         ; mod\r
182  }\r
186 ; strings\r
187 macro sz name,[data] {       ; [mike.dld]\r
188  common\r
189   if used name\r
190    name db data\r
191    .size = $-name\r
192   end if\r
195 macro szZ name,[data] {      ; same as sz, but for zero terminated string [dunkaist]\r
196  common\r
197   if used name\r
198    name db data,0\r
199    .size = $-name-1\r
200   end if\r
202 sz0 fix szZ\r
204 macro lsz name,[lng,data] {  ; [mike.dld]\r
205  common\r
206   if used name\r
207    label name\r
208  forward\r
209   if lang eq lng\r
210    db data\r
211   end if\r
212  common\r
213    .size = $-name\r
214   end if\r
217 macro szc name,elsz,[data] {     ; [mike.dld]\r
218  common\r
219   local s,m\r
220   m = 0\r
221   if used name\r
222    label name\r
223  forward\r
224    virtual at 0\r
225     db data\r
226     s = $\r
227    end virtual\r
228    d#elsz s\r
229    if m < s\r
230     m = s\r
231    end if\r
232    db data\r
233  common\r
234    .size = $-name\r
235    .maxl = m\r
236   end if\r
239 macro lszc name,elsz,[lng,data] {  ; [mike.dld]\r
240  common\r
241   local s,m,c\r
242   m = 0\r
243   c = 0\r
244   if used name\r
245    label name\r
246  forward\r
247   if lang eq lng\r
248    virtual at 0\r
249     db data\r
250     s = $\r
251    end virtual\r
252    d#elsz s\r
253    if m < s\r
254     m = s\r
255    end if\r
256    db data\r
257    c = c+1\r
258   end if\r
259  common\r
260    .size  = $-name\r
261    .maxl  = m\r
262    .count = c\r
263   end if\r
267 ; easy system call macro\r
268 macro mpack dest, hsrc, lsrc\r
270   if (hsrc eqtype 0) & (lsrc eqtype 0)\r
271     mov dest, (hsrc) shl 16 + lsrc\r
272   else\r
273     if (hsrc eqtype 0) & (~lsrc eqtype 0)\r
274       mov dest, (hsrc) shl 16\r
275       add dest, lsrc\r
276     else\r
277       mov dest, hsrc\r
278       shl dest, 16\r
279       add dest, lsrc\r
280     end if\r
281   end if\r
284 macro __mov reg,a,b {       ; mike.dld\r
285  if (~a eq)&(~b eq)\r
286    mpack reg,a,b\r
287  else if (~a eq)&(b eq)\r
288    mov reg,a\r
289  end if\r
293 ;include 'config.inc'\r
294 __CPU_type equ p5\r
295 SYSENTER_VAR    equ 0\r
297 macro mcall a,b,c,d,e,f,g {   ; [mike.dld], [Ghost]\r
298  local  ..ret_point\r
299  __mov eax,a\r
300  __mov ebx,b\r
301  __mov ecx,c\r
302  __mov edx,d\r
303  __mov esi,e\r
304  __mov edi,f\r
305  __mov ebp,g\r
307  if __CPU_type eq p5\r
308         int     0x40\r
309  else\r
310   if __CPU_type eq p6\r
311         push    ebp\r
312         mov     ebp, esp\r
313         push    ..ret_point     ; it may be 2 or 5 byte\r
314         sysenter\r
315  ..ret_point:\r
316         pop     edx\r
317         pop     ecx\r
319   else\r
320    if __CPU_type eq k6\r
321         push    ecx\r
322         syscall\r
323         pop     ecx\r
324    else\r
325         display 'ERROR : unknown CPU type (set to p5)', 10, 13\r
326         __CPU_type equ p5\r
327         int     0x40\r
328    end if\r
329   end if\r
330  end if\r
334 ; -------------------------\r
335 macro __header a,[b] {\r
336  common\r
337   use32\r
338   org 0\r
339   db 'MENUET',a\r
340  forward\r
341   if b eq\r
342    dd 0\r
343   else\r
344    dd b\r
345   end if\r
348 macro __section name {\r
349  align 16\r
350  label name\r
353 macro __func name {\r
354  if ~used name\r
355   display 'FUNC NOT USED: ',`name,13,10\r
356  else\r
357   align 4\r
358   name:\r
359   ;diff16 `name,0,name\r
362 macro endf { end if }\r
364 macro diff16 title,l1,l2\r
365  {\r
366   local s,d\r
367   s = l2-l1\r
368   display title,': 0x'\r
369   repeat 8\r
370    d = '0' + s shr ((8-%) shl 2) and $0F\r
371    if d > '9'\r
372     d = d + 'A'-'9'-1\r
373    end if\r
374    display d\r
375   end repeat\r
376   display 13,10\r
377  }\r
379 macro diff10 title,l1,l2\r
380  {\r
381   local s,d,z,m\r
382   s = l2-l1\r
383   z = 0\r
384   m = 1000000000\r
385   display title,': '\r
386   repeat 10\r
387    d = '0' + s / m\r
388    s = s - (s/m)*m\r
389    m = m / 10\r
390    if d <> '0'\r
391     z = 1\r
392    end if\r
393    if z <> 0\r
394     display d\r
395    end if\r
396   end repeat\r
397   display 13,10\r
398  }\r
401 macro movi arg1,arg2\r
403 if (arg1 in <eax,ebx,ecx,edx,esi,edi,ebp,esp>) & ((arg2 eqtype 0) | (arg2 eqtype '0'))\r
404   if (arg2) = 0\r
405     xor arg1,arg1\r
406   else if (arg2) = 1\r
407     xor arg1,arg1\r
408     inc arg1\r
409   else if (arg2) = -1\r
410     or arg1,-1\r
411   else if (arg2) >= -128 & (arg2) <= 127\r
412     push arg2\r
413     pop arg1\r
414   else\r
415     mov arg1,arg2\r
416   end if\r
417 else\r
418   mov arg1,arg2\r
419 end if\r
423 macro RGB [a] {\r
424  common\r
425   match (r=,g=,b),a \{\r
426    \dd ((r) shl 16) or ((g) shl 8) or (b)\r
427   \}\r
431 struc POINT _t,_dx,_dy {\r
432  .x _t _dx\r
433  .y _t _dy\r
436 ; structure definition helper\r
437 include 'struct.inc'\r
439 struct RECT\r
440   left   dd ?\r
441   top    dd ?\r
442   right  dd ?\r
443   bottom dd ?\r
444 ends\r
446 struct BOX\r
447   left   dd ?\r
448   top    dd ?\r
449   width  dd ?\r
450   height dd ?\r
451 ends\r
453 ; structures used in KolibriOS\r
454 struct process_information\r
455   cpu_usage               dd ?  ; +0\r
456   window_stack_position   dw ?  ; +4\r
457   window_stack_value      dw ?  ; +6\r
458                           dw ?  ; +8\r
459   process_name            rb 12 ; +10\r
460   memory_start            dd ?  ; +22\r
461   used_memory             dd ?  ; +26\r
462   PID                     dd ?  ; +30\r
463   box                     BOX   ; +34\r
464   slot_state              dw ?  ; +50\r
465                           dw ?  ; +52\r
466   client_box              BOX   ; +54\r
467   wnd_state               db ?  ; +70\r
468   event_mask              dd ?  ; +71\r
469   keyboard_mode           db ?  ; +75\r
470   rb (1024-76)\r
471 ends\r
473 struct system_colors\r
474   frame            dd ? ;nonset1\r
475   grab             dd ? ;nonset2\r
476   work_dark        dd ?\r
477   work_light       dd ?\r
478   grab_text        dd ? ;window_title\r
479   work             dd ?\r
480   work_button      dd ?\r
481   work_button_text dd ?\r
482   work_text        dd ?\r
483   work_graph       dd ?\r
484 ends\r
486 struct FILEDATE\r
487   Second db ?\r
488   Minute db ?\r
489   Hour   db ?\r
490          db ?\r
491   Day    db ?\r
492   Month  db ?\r
493   Year   dw ?\r
494 ends\r
496 struct FILEINFO\r
497   Attributes dd ?\r
498   IsUnicode  db ?\r
499              db 3 dup(?)\r
500   DateCreate FILEDATE\r
501   DateAccess FILEDATE\r
502   DateModify FILEDATE\r
503   Size       dq ?\r
504 ends\r
506 cmove   fix     cmovz\r
508 macro cmovz reg1, reg2 {\r
510         local   ..jumpaddr\r
512 if __CPU_type eq p5             ; CMOVcc isnt supported on the P5\r
513         jnz     ..jumpaddr\r
514         mov     reg1, reg2\r
515   ..jumpaddr:\r
516 else\r
517         cmovz   reg1, reg2\r
518 end if\r
522 cmovne  fix     cmovnz\r
524 macro cmovnz reg1, reg2 {\r
526         local   ..jumpaddr\r
528 if __CPU_type eq p5             ; CMOVcc isnt supported on the P5\r
529         jz      ..jumpaddr\r
530         mov     reg1, reg2\r
531   ..jumpaddr:\r
532 else\r
533         cmovnz  reg1, reg2\r
534 end if\r
538 macro cmovg reg1, reg2 {\r
540         local   ..jumpaddr\r
542 if __CPU_type eq p5             ; CMOVcc isnt supported on the P5\r
543         jle     ..jumpaddr\r
544         mov     reg1, reg2\r
545   ..jumpaddr:\r
546 else\r
547         cmovg   reg1, reg2\r
548 end if\r
551 macro cmovl reg1, reg2 {\r
553         local   ..jumpaddr\r
555 if __CPU_type eq p5             ; CMOVcc isnt supported on the P5\r
556         jge     ..jumpaddr\r
557         mov     reg1, reg2\r
558   ..jumpaddr:\r
559 else\r
560         cmovl   reg1, reg2\r
561 end if\r
564 ; replaces /programs/cmp.inc\r
565 irp cond, e, ne, g, ng, l, nl, ge, le {\r
566   macro cmp#cond a, b, c\{\r
567     cmp a, b\r
568     j#cond c\r
569   \}\r
572 ; constants\r
574 ; button flags\r
575 BT_DEL         = 0x80000000\r
576 BT_HIDE        = 0x40000000\r
577 BT_NOFRAME     = 0x20000000\r
579 ; events\r
580 EV_IDLE        = 0\r
581 EV_TIMER       = 0\r
582 EV_REDRAW      = 1\r
583 EV_KEY         = 2\r
584 EV_BUTTON      = 3\r
585 EV_EXIT        = 4\r
586 EV_BACKGROUND  = 5\r
587 EV_MOUSE       = 6\r
588 EV_IPC         = 7\r
589 EV_STACK       = 8\r
591 ; event mask bits for function 40\r
592 EVM_REDRAW     =          1b\r
593 EVM_KEY        =         10b\r
594 EVM_BUTTON     =        100b\r
595 EVM_EXIT       =       1000b\r
596 EVM_BACKGROUND =      10000b\r
597 EVM_MOUSE      =     100000b\r
598 EVM_IPC        =    1000000b\r
599 EVM_STACK      =   10000000b\r
600 EVM_DEBUG      =  100000000b\r
601 EVM_STACK2     = 1000000000b\r
603 EVM_MOUSE_FILTER  = 0x80000000\r
604 EVM_CURSOR_FILTER = 0x40000000\r