9cad09d548a65f105ce0c765b3d27142486c994c
[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 #if 1
73   short SgnHighByte;
74 #else
75   int SgnHighByte;
76 #endif
77
78   if (Var & 0x8000)
79   {
80     SgnHighByte = ((Var & 0x7FFF) / 0x100) | 0xFF80;
81   }
82   else
83   {
84     SgnHighByte = Var / 0x100;
85   }
86
87   return SgnHighByte;
88 }
89
90 boolean Less()
91 {
92   boolean Less;
93
94   Less = (cmpFlag < 0);
95
96   return Less;
97 }
98
99 boolean GreaterOrEqual()
100 {
101   boolean GreaterOrEqual;
102
103   GreaterOrEqual = (0 <= cmpFlag);
104
105   return GreaterOrEqual;
106 }
107
108 boolean Equal()
109 {
110   boolean Equal;
111
112   Equal = (0 == cmpFlag);
113
114   return Equal;
115 }
116
117 void CMP(int A, int B)
118 {
119   cmpFlag = A - B;
120 }
121
122 void Add(int *A, int B)
123 {
124   *A = *A + B;
125 }
126
127 void MySub(int *A, int B)
128 {
129   *A = *A - B;
130 }
131
132 int SHR(int *Var, int Count)
133 {
134   int SHR;
135
136   int i;
137
138   if (*Var & 0x8000)
139   {
140     *Var = ((*Var & 0x7FFF) / 2) | 0x4000;
141   }
142   else
143   {
144     *Var = *Var / 2;
145   }
146
147   for (i = 2; i <= Count; i++)
148   {
149     *Var = *Var / 2;
150   }
151
152   return SHR;
153 }
154
155 int SHL(int *Var, int Count)
156 {
157   int SHL;
158
159   int i;
160
161   for (i = 1; i <= Count; i++)
162   {
163     *Var = *Var & 0x7FFF;
164     if ((*Var & 0x4000) != 0)
165     {
166       *Var = (2 * (*Var & 0x3FFF)) | 0x8000;
167     }
168     else
169     {
170       *Var = 2 * *Var;
171     }
172   }
173
174   return SHL;
175 }
176
177 int ByteToInt(byte B)
178 {
179   int ByteToInt;
180
181   if ((B & 0x80) == 0x80)
182   {
183     ByteToInt = -(0xFF - B + 1);
184   }
185   else
186   {
187     ByteToInt = B;
188   }
189
190   return ByteToInt;
191 }
192
193 byte IntToByte(int i)
194 {
195   byte IntToByte;
196
197   // IntToByte = CByte(i & 0xFF);
198   IntToByte = (byte)(i & 0xFF);
199
200   return IntToByte;
201 }
202
203 void XCHG(int A, int B)
204 {
205   int Tmp;
206
207   Tmp = B;
208   B = A;
209   A = Tmp;
210 }