Subversion Repositories Kolibri OS

Rev

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

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