Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. _DEBUG = 1
  3.  
  4. ; --- Parameters inside WndProc
  5.  
  6. hWnd equ [ebp + 8]
  7. uiMsg equ [ebp + 12]
  8. WParam equ [ebp + 16]
  9. LParam equ [ebp + 20]
  10.  
  11. ; --- Splitting WndProc parameters
  12.  
  13. macro mcLPtoXY LParam {
  14.     ; OUT: EDX = Y coordinate or HEIGHT
  15.     ; OUT: EAX = X coordinate or WIDTH
  16.     mov     eax, LParam
  17.     mov     edx, LParam
  18.     and     eax, 0000FFFFh
  19.     shr     edx, 16
  20. }
  21.  
  22. ; --- String operation (WCHAR)
  23.  
  24. macro mcStrCopy {
  25.     xor     eax, eax
  26. @@:
  27.     lodsw
  28.     stosw
  29.     test    eax, eax
  30.     jnz     @r
  31. }
  32.  
  33. ; --- Indirectly call STDCALL procedure
  34.  
  35. macro invoke api_proc, [arg]
  36. {
  37.     common
  38.     if ~ arg eq
  39.     reverse
  40.     pushd arg
  41.     common
  42.     end if
  43.     call [api_proc]
  44. }
  45.  
  46. macro rinvoke api_proc_reg, [arg]
  47. {
  48.     common
  49.     if ~ arg eq
  50.     reverse
  51.     pushd arg
  52.     common
  53.     end if
  54.     call api_proc_reg
  55. }
  56.  
  57. ; --- FPU
  58.  
  59. macro mcFpuPushR32 r32
  60. {
  61.     mov     [glb_FPU_Int32], r32
  62.     fild    [glb_FPU_Int32]
  63. }
  64.  
  65. macro mcFpuPop
  66. {
  67.     fstp    [glb_dbl_FpuPopper]
  68. }
  69.  
  70. ; --- Heap allocator
  71.  
  72. macro mcMemAlloc hHeap, nBytes {
  73.     invoke  HeapAlloc, hHeap, HEAP_NO_SERIALIZE, nBytes
  74. }
  75.  
  76. macro mcMemFree hHeap, pBuf {
  77.     invoke  HeapFree, hHeap, HEAP_NO_SERIALIZE, pBuf
  78. }
  79.  
  80. macro mcGlobalMalloc nBytes {
  81.     mcMemAlloc [glb_HAllocator], nBytes
  82. }
  83.  
  84. macro mcGlobalFree pBuf {
  85.     mcMemFree [glb_HAllocator], pBuf
  86. }
  87.  
  88. ; --- Page allocator
  89.  
  90. macro mcAllocatePages nBytes {
  91.     invoke  VirtualAlloc, 0, nBytes, \
  92.             MEM_RESERVE or MEM_COMMIT, \
  93.             PAGE_READWRITE
  94. }
  95.  
  96. macro mcReleasePages pData {
  97.     invoke  VirtualFree, pData, 0, MEM_RELEASE
  98. }
  99.  
  100. ; --- Local variables
  101.  
  102. macro mcLoadLocalRef AnyReg, instance {
  103.     lea     AnyReg, [esp + instance]
  104. }
  105.  
  106. macro mcLoadLocal AnyReg, instance {
  107.     mov     AnyReg, [esp + instance]
  108. }
  109.  
  110. macro mcStoreThis {
  111.     mov     [esp], ebx
  112. }
  113.  
  114. macro mcLoadThis {
  115.     mov     ebx, [esp]
  116. }
  117.  
  118. macro mcStoreLocal instance, AnyReg {
  119.     mov     [esp + instance], AnyReg
  120. }
  121.  
  122. macro mcBeginLocals LocalSize {
  123.     sub     esp, LocalSize
  124. }
  125.  
  126. macro mcEndLocals LocalSize {
  127.     add     esp, LocalSize
  128. }
  129.  
  130. ; --- Virtual call on the object instance
  131.  
  132. macro mcVirtCallOnEBX OfsMethod {
  133.     mov     eax, [ebx]
  134.     call    dword [eax + OfsMethod]
  135. }
  136.  
  137. macro mcVirtCall Instance, OfsMethod {
  138.     lea     ebx, [Instance]
  139.     mov     eax, [ebx]
  140.     call    dword [eax + OfsMethod]
  141. }
  142.  
  143. ; --- CALLBACK
  144.  
  145. macro mcProlog {
  146.     push    ebp
  147.     mov     ebp, esp
  148.     push    ebx
  149.     push    esi
  150.     push    edi
  151. }
  152.  
  153. macro mcEpilog {
  154.     pop     edi
  155.     pop     esi
  156.     pop     ebx
  157.     leave
  158. }
  159.  
  160. ; --- Misc...
  161.  
  162. macro mc_CMP_ST0_ST1
  163. {
  164.     fcomip  st, st1
  165.     fstp    [glb_dbl_FpuPopper]
  166. }
  167.  
  168. macro mcLoadQuadStatePtr r32
  169. {
  170.     mov     r32, [glb_pGameState]
  171.     add     r32, TGameState.game_QuadState
  172. }
  173.  
  174. macro mcLoadNeg1 r32
  175. {
  176.     mcZeroBits r32
  177.     dec     r32
  178. }
  179.  
  180. macro mcLoad8bitsToReg32 r32, _8bit_value
  181. {
  182.     push    _8bit_value
  183.     pop     r32
  184. }
  185.  
  186. macro mcLoad1 r32
  187. {
  188.     mcZeroBits r32
  189.     inc     r32
  190. }
  191.  
  192. ; ESI = source
  193. ; EDI = destination
  194. macro mcMemCopy nBytesAligned4
  195. {
  196.     mov     ecx, nBytesAligned4
  197.     shr     ecx, 2
  198.     rep     movsd
  199. }
  200.  
  201. macro mcMul10 r32 {
  202.     push    esi
  203.     shl     r32, 1
  204.     push    r32
  205.     shl     r32, 2
  206.     pop     esi
  207.     add     r32, esi
  208.     pop     esi
  209. }
  210.  
  211. macro mcZeroBits any_reg {
  212.     xor     any_reg, any_reg
  213. }
  214.  
  215. macro mcLoadRGB reg32, r8, g8, b8 {
  216.     mov     reg32, (b8 shl 16) or (g8 shl 8) or r8
  217. }
  218.  
  219. ; --- Rectangle
  220.  
  221. macro mcRectCopy {
  222.     ; ESI = source rectangle
  223.     ; EDI = target rectangle
  224.     movsd
  225.     movsd
  226.     movsd
  227.     movsd
  228. }
  229.  
  230. macro mcRectCopySafe {
  231.     ; ESI = source rectangle
  232.     ; EDI = target rectangle
  233.     push    esi
  234.     movsd
  235.     movsd
  236.     movsd
  237.     movsd
  238.     pop     esi
  239. }
  240.  
  241. macro mcRectWidth r32, pRect {
  242.     mov     r32, [pRect + RECT.rc_Right]
  243.     sub     r32, [pRect + RECT.rc_Left]
  244. }
  245.  
  246. macro mcRectHeight r32, pRect {
  247.     mov     r32, [pRect + RECT.rc_Bottom]
  248.     sub     r32, [pRect + RECT.rc_Top]
  249. }
  250.  
  251. ; --- Branching
  252.  
  253. macro mcOnRegEqu AnyReg, AnyValue, AnyLabel {
  254.     cmp     AnyReg, AnyValue
  255.     je      AnyLabel
  256. }
  257.  
  258. macro mcOnRegNotEqu AnyReg, AnyValue, AnyLabel {
  259.     cmp     AnyReg, AnyValue
  260.     jne     AnyLabel
  261. }
  262.  
  263. macro mcOnRegZero AnyReg, AnyLabel {
  264.     test    AnyReg, AnyReg
  265.     jz      AnyLabel
  266. }
  267.  
  268. macro mcOnRegNotZero AnyReg, AnyLabel {
  269.     test    AnyReg, AnyReg
  270.     jnz     AnyLabel
  271. }
  272.  
  273. ; --- OOP
  274.  
  275. macro mcLoadMemberRef AnyReg, instance {
  276.     lea     AnyReg, [ebx + instance]
  277. }
  278.  
  279. macro mcLoadMember AnyReg, instance {
  280.     mov     AnyReg, [ebx + instance]
  281. }
  282.  
  283. macro mcStoreMember instance, AnyReg {
  284.     mov     [ebx + instance], AnyReg
  285. }
  286.  
  287. macro mcAttachVTable addrvtbl {
  288.     mov     eax, addrvtbl
  289.     mov     [ebx], eax
  290. }
  291.  
  292. ; --- EOF ---
  293.