Subversion Repositories Kolibri OS

Rev

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

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