1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6 /*
7 Module Name:
8 
9     tools.cpp
10 
11 Abstract:
12 
13     This module contains some useful functions for data manipulation.
14 
15 Environment:
16 
17  */
18 ///////////////////////////////////////////////////////////////////////////////
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 //----------------
25 
26 #include "tools.h"
27 
28 //----------------
29 
30 #ifdef _X86_
31 
32 __declspec (naked)
33 void
34 __fastcall
35 _MOV_DD_SWP(
36     void* a, // ECX
37     void* b  // EDX
38     )
39 {
40   _asm {
41     mov   eax,[edx]
42     bswap eax
43     mov   [ecx],eax
44     ret
45   }
46 }
47 
48 __declspec (naked)
49 void
50 __fastcall
51 _MOV_DW_SWP(
52     void* a, // ECX
53     void* b  // EDX
54     )
55 {
56   _asm {
57     mov   ax,[edx]
58     rol   ax,8
59     mov   [ecx],ax
60     ret
61   }
62 }
63 
64 __declspec (naked)
65 void
66 __fastcall
67 _REVERSE_DD(
68     void* a  // ECX
69     )
70 {
71   _asm {
72     mov   eax,[ecx]
73     bswap eax
74     mov   [ecx],eax
75     ret
76   }
77 }
78 
79 __declspec (naked)
80 void
81 __fastcall
82 _REVERSE_DW(
83     void* a  // ECX
84     )
85 {
86   _asm {
87     mov   ax,[ecx]
88     rol   ax,8
89     mov   [ecx],ax
90     ret
91   }
92 }
93 
94 __declspec (naked)
95 void
96 __fastcall
97 _MOV_DW2DD_SWP(
98     void* a, // ECX
99     void* b  // EDX
100     )
101 {
102   _asm {
103     mov   ax,[edx]
104     rol   ax,8
105     mov   [ecx+2],ax
106     mov   [ecx],0
107     ret
108   }
109 }
110 
111 __declspec (naked)
112 void
113 __fastcall
114 _MOV_MSF(
115     void* a, // ECX
116     void* b  // EDX
117     )
118 {
119   _asm {
120     mov   eax,[edx]
121     mov   [ecx],ax
122     shr   eax,16
123     mov   [ecx+2],al
124     ret
125   }
126 }
127 
128 __declspec (naked)
129 void
130 __fastcall
131 _MOV_MSF_SWP(
132     void* a, // ECX
133     void* b  // EDX
134     )
135 {
136   _asm {
137     mov   eax,[edx]
138     mov   [ecx+2],al
139     bswap eax
140     shr   eax,8
141     mov   [ecx],ax
142     ret
143   }
144 }
145 
146 __declspec (naked)
147 void
148 __fastcall
149 _XCHG_DD(
150     void* a, // ECX
151     void* b  // EDX
152     )
153 {
154   _asm {
155     mov   eax,[edx]
156     xchg  eax,[ecx]
157     mov   [edx],eax
158     ret
159   }
160 }
161 
162 #endif _X86_
163 
164 #ifdef __cplusplus
165 };
166 #endif
167