rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / ASM.c
1 // ----------------------------------------------------------------------------
2 // ASM.c
3 // ----------------------------------------------------------------------------
4
5 #include "ASM.h"
6
7 static char *VB_Name = "modASM";
8 // --- Option Explicit
9
10 // PseudoRegisters:
11 // Public ax%, bx%
12 // --- const int ByteMask = 0xFF;
13 int cmpFlag;
14
15 void Neg(int *Val)
16 {
17   *Val = -*Val;
18 }
19
20 void Mov(int *Var, int Val)
21 {
22   *Var = Val;
23 }
24
25 void MovLowByte(int *Var, int Val)
26 {
27   *Var = (*Var & 0xFF00) | (Val & 0xFF);
28 }
29
30 void MovHighByte(int *Var, int Val)
31 {
32   int Tmp;
33
34   Tmp = Val & 0x7F;
35   Tmp = 0x100 * Tmp;
36   if ((Val & 0x80) != 0)
37     Tmp = Tmp | 0x8000;
38
39   *Var = (*Var & 0xFF) | Tmp;
40 }
41
42 int LowByte(int Var)
43 {
44   int LowByte;
45
46   // Dim Tmp As Byte
47   LowByte = (Var & 0xFF);
48   // LowByte = ByteToInt(Tmp)
49
50   return LowByte;
51 }
52
53 int HighByte(int Var)
54 {
55   int HighByte;
56
57   if (Var & 0x8000)
58   {
59     HighByte = ((Var & 0x7FFF) / 0x100) | 0x80;
60   }
61   else
62   {
63     HighByte = Var / 0x100;
64   }
65
66   return HighByte;
67 }
68
69 int SgnHighByte(int Var) // extends the signum to 16 bit
70 {
71   int SgnHighByte;
72
73   if (Var & 0x8000)
74   {
75     SgnHighByte = ((Var & 0x7FFF) / 0x100) | 0xFF80;
76   }
77   else
78   {
79     SgnHighByte = Var / 0x100;
80   }
81
82   return SgnHighByte;
83 }
84
85 boolean Less()
86 {
87   boolean Less;
88
89   Less = (cmpFlag < 0);
90
91   return Less;
92 }
93
94 boolean GreaterOrEqual()
95 {
96   boolean GreaterOrEqual;
97
98   GreaterOrEqual = (0 <= cmpFlag);
99
100   return GreaterOrEqual;
101 }
102
103 boolean Equal()
104 {
105   boolean Equal;
106
107   Equal = (0 == cmpFlag);
108
109   return Equal;
110 }
111
112 void CMP(int A, int B)
113 {
114   cmpFlag = A - B;
115 }
116
117 void Add(int *A, int B)
118 {
119   *A = *A + B;
120 }
121
122 void MySub(int *A, int B)
123 {
124   *A = *A - B;
125 }
126
127 int SHR(int Var, int Count)
128 {
129   int SHR;
130
131   int i;
132
133   if (Var & 0x8000)
134   {
135     Var = ((Var & 0x7FFF) / 2) | 0x4000;
136   }
137   else
138   {
139     Var = Var / 2;
140   }
141
142   for (i = 2; i <= Count; i++)
143   {
144     Var = Var / 2;
145   }
146
147   return SHR;
148 }
149
150 int SHL(int Var, int Count)
151 {
152   int SHL;
153
154   int i;
155
156   for (i = 1; i <= Count; i++)
157   {
158     Var = Var & 0x7FFF;
159     if ((Var & 0x4000) != 0)
160     {
161       Var = (2 * (Var & 0x3FFF)) | 0x8000;
162     }
163     else
164     {
165       Var = 2 * Var;
166     }
167   }
168
169   return SHL;
170 }
171
172 int ByteToInt(byte B)
173 {
174   int ByteToInt;
175
176   if ((B & 0x80) == 0x80)
177   {
178     ByteToInt = -(0xFF - B + 1);
179   }
180   else
181   {
182     ByteToInt = B;
183   }
184
185   return ByteToInt;
186 }
187
188 byte IntToByte(int i)
189 {
190   byte IntToByte;
191
192   // IntToByte = CByte(i & 0xFF);
193   IntToByte = (byte)(i & 0xFF);
194
195   return IntToByte;
196 }
197
198 void XCHG(int A, int B)
199 {
200   int Tmp;
201
202   Tmp = B;
203   B = A;
204   A = Tmp;
205 }