Subversion Repositories Kolibri OS

Rev

Rev 1042 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1042 vkos 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
 __mov eax,a
292
 __mov ebx,b
293
 __mov ecx,c
294
 __mov edx,d
295
 __mov esi,e
296
 __mov edi,f
297
 
298
	int	0x40
299
}
300
 
301
 
302
; -------------------------
303
macro header a,[b] {
304
 common
305
  use32
306
  org 0
307
  db 'MENUET',a
308
 forward
309
  if b eq
310
   dd 0
311
  else
312
   dd b
313
  end if }
314
macro section name { align 16
315
 label name }
316
macro func name {
317
 if ~used name
318
  display 'FUNC NOT USED: ',`name,13,10
319
 else
320
  align 4
321
  name:
322
  ;diff16 `name,0,name
323
;pushad
324
;pushfd
325
;dps `name
326
;newline
327
;mcall 5,1
328
;popfd
329
;popad
330
}
331
macro endf { end if }
332
 
333
macro diff16 title,l1,l2
334
 {
335
  local s,d
336
  s = l2-l1
337
  display title,': 0x'
338
  repeat 8
339
   d = '0' + s shr ((8-%) shl 2) and $0F
340
   if d > '9'
341
    d = d + 'A'-'9'-1
342
   end if
343
   display d
344
  end repeat
345
  display 13,10
346
 }
347
 
348
macro diff10 title,l1,l2
349
 {
350
  local s,d,z,m
351
  s = l2-l1
352
  z = 0
353
  m = 1000000000
354
  display title,': '
355
  repeat 10
356
   d = '0' + s / m
357
   s = s - (s/m)*m
358
   m = m / 10
359
   if d <> '0'
360
    z = 1
361
   end if
362
   if z <> 0
363
    display d
364
   end if
365
  end repeat
366
  display 13,10
367
 }
368
 
369
; optimize the code for size
370
__regs fix 
371
 
372
macro add arg1,arg2
373
 {
374
   if (arg2 eqtype 0)
375
      if (arg2) = 1
376
	 inc arg1
377
      else
378
	 add arg1,arg2
379
      end if
380
   else
381
      add arg1,arg2
382
   end if
383
 }
384
 
385
macro sub arg1,arg2
386
 {
387
   if (arg2 eqtype 0)
388
      if (arg2) = 1
389
	 dec arg1
390
      else
391
	 sub arg1,arg2
392
      end if
393
   else
394
      sub arg1,arg2
395
   end if
396
 }
397
 
398
macro mov arg1,arg2
399
 {
400
   if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
401
      if (arg2) = 0
402
	 xor arg1,arg1
403
      else if (arg2) = 1
404
	 xor arg1,arg1
405
	 inc arg1
406
      else if (arg2) = -1
407
	 or  arg1,-1
408
      else if (arg2) > -128 & (arg2) < 128
409
	 push arg2
410
	 pop  arg1
411
      else
412
	 mov  arg1,arg2
413
      end if
414
   else
415
      mov arg1,arg2
416
   end if
417
 }
418
 
419
 
420
macro RGB [a] {
421
 common
422
  match (r=,g=,b),a \{
423
   \dd ((r) shl 16) or ((g) shl 8) or (b)
424
  \}
425
}
426
 
427
 
428
struc POINT _t,_dx,_dy {
429
 .x _t _dx
430
 .y _t _dy
431
}
432
 
433
; structure definition helper
434
include 'struct.inc'
435
 
436
struct RECT
437
  left	 dd ?
438
  top	 dd ?
439
  right  dd ?
440
  bottom dd ?
441
ends
442
 
443
struct BOX
444
  left	 dd ?
445
  top	 dd ?
446
  width  dd ?
447
  height dd ?
448
ends
449
 
450
; structures used in MeOS
451
struct process_information
452
  cpu_usage		  dd ?	; +0
453
  window_stack_position   dw ?	; +4
454
  window_stack_value	  dw ?	; +6
455
			  dw ?	; +8
456
  process_name		  rb 12 ; +10
457
  memory_start		  dd ?	; +22
458
  used_memory		  dd ?	; +26
459
  PID			  dd ?	; +30
460
  box			  BOX	; +34
461
  slot_state		  dw ?	; +50
462
			  dw ?	; +52
463
  client_box		  BOX	; +54
464
  wnd_state		  db ?	; +70
465
  rb (1024-71)
466
ends
467
 
468
struct system_colors
469
  frame 	   dd ?
470
  grab		   dd ?
471
  grab_button	   dd ?
472
  grab_button_text dd ?
473
  grab_text	   dd ?
474
  work		   dd ?
475
  work_button	   dd ?
476
  work_button_text dd ?
477
  work_text	   dd ?
478
  work_graph	   dd ?
479
ends
480
 
481
struct FILEDATE
482
  Second db ?
483
  Minute db ?
484
  Hour	 db ?
485
	 db ?
486
  Day	 db ?
487
  Month  db ?
488
  Year	 dw ?
489
ends
490
 
491
struct FILEINFO
492
  Attributes dd ?
493
  IsUnicode  db ?
494
	     db 3 dup(?)
495
  DateCreate FILEDATE
496
  DateAccess FILEDATE
497
  DateModify FILEDATE
498
  Size	     dq ?
499
ends
500
 
501
; constants
502
 
503
; events
504
EV_IDLE        = 0
505
EV_TIMER       = 0
506
EV_REDRAW      = 1
507
EV_KEY	       = 2
508
EV_BUTTON      = 3
509
EV_EXIT        = 4
510
EV_BACKGROUND  = 5
511
EV_MOUSE       = 6
512
EV_IPC	       = 7
513
EV_STACK       = 8
514
 
515
; event mask bits for function 40
516
EVM_REDRAW     =	1b
517
EVM_KEY        =       10b
518
EVM_BUTTON     =      100b
519
EVM_EXIT       =     1000b
520
EVM_BACKGROUND =    10000b
521
EVM_MOUSE      =   100000b
522
EVM_IPC        =  1000000b
523
EVM_STACK      = 10000000b