Subversion Repositories Kolibri OS

Rev

Rev 6614 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; Magic for proc32.inc: prologue/epilogue for esp-based addressing
  2. ; fpo stands from Frame Pointer Omission
  3. macro fpo_prologue procname,flag,parmbytes,localbytes,reglist
  4. {
  5. local loc,regcount
  6.     loc = (localbytes+3) and (not 3)
  7.     regcount = 0
  8.     irps reg, reglist
  9.     \{
  10.         regcount = regcount+1
  11.         push    reg
  12.     \}
  13.     if loc
  14.         sub     esp, loc
  15.     end if
  16.     parmbase@proc equ esp+4+loc+regcount*4
  17.     localbase@proc equ esp
  18.     fpo_localsize = loc
  19.     fpo_delta = 0
  20. }
  21. macro fpo_epilogue procname,flag,parmbytes,localbytes,reglist
  22. {
  23.     if fpo_localsize
  24.         add     esp, fpo_localsize
  25.     end if
  26.     irps reg, reglist \{ reverse pop reg \}
  27.     if flag and 10000b
  28.         retn
  29.     else
  30.         retn    parmbytes
  31.     end if
  32. }
  33. macro deflocal@proc name,def,[val]
  34. {
  35.    common
  36.     deflocal@proc name#_unique_suffix,def,val
  37.     all@vars equ all@vars,name
  38.     name equ name#_unique_suffix+fpo_delta
  39. }
  40. macro defargs@proc [arg]
  41. {
  42.    common
  43.     rawargs equ
  44.     srcargs equ arg
  45.    forward
  46.     rawargs equ rawargs,arg#_unique_suffix
  47.    common
  48.     match =,tmp,rawargs \{
  49.     defargs@proc tmp
  50.     uniqargs equ args@proc
  51.     restore args@proc
  52.     args@proc equ uniqargs,srcargs
  53.     \}
  54.    forward
  55.     arg equ arg#_unique_suffix+fpo_delta
  56. }
  57. macro stdcall proc,[arg]                ; directly call STDCALL procedure
  58. {  common
  59.         fpo_delta_base = fpo_delta
  60.     if ~ arg eq
  61.    reverse
  62.         pushd   arg
  63.         fpo_delta = fpo_delta + 4
  64.    common
  65.     end if
  66.         call    proc
  67.         fpo_delta = fpo_delta_base
  68. }
  69. macro ccall proc,[arg]                  ; directly call CDECL procedure
  70. {  common
  71.         fpo_delta_base = fpo_delta
  72.         size@ccall = 0
  73.     if ~ arg eq
  74.    reverse
  75.         pushd   arg
  76.         fpo_delta = fpo_delta + 4
  77.         size@ccall = size@ccall+4
  78.    common
  79.     end if
  80.         call    proc
  81.     if size@ccall
  82.         add     esp, size@ccall
  83.     end if
  84.         fpo_delta = fpo_delta_base
  85. }
  86. fpo_delta = 0
  87.