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