rnd-20100313-1-src
[rocksndiamonds.git] / src / game_sp / ASM.c
1 // ----------------------------------------------------------------------------
2 // ASM.c
3 // ----------------------------------------------------------------------------
4
5 #include "ASM.h"
6
7
8 void Mov(int *Var, int Val)
9 {
10   *Var = Val;
11 }
12
13 void MovLowByte(int *Var, int Val)
14 {
15   *Var = (*Var & 0xFF00) | (Val & 0xFF);
16 }
17
18 void MovHighByte(int *Var, int Val)
19 {
20   int Tmp;
21
22   Tmp = Val & 0x7F;
23   Tmp = 0x100 * Tmp;
24
25   if ((Val & 0x80) != 0)
26     Tmp = Tmp | 0x8000;
27
28   *Var = (*Var & 0xFF) | Tmp;
29 }
30
31 int LowByte(int Var)
32 {
33   int LowByte;
34
35   LowByte = (Var & 0xFF);
36
37   return LowByte;
38 }
39
40 int HighByte(int Var)
41 {
42   int HighByte;
43
44   if (Var & 0x8000)
45     HighByte = ((Var & 0x7FFF) / 0x100) | 0x80;
46   else
47     HighByte = Var / 0x100;
48
49   return HighByte;
50 }
51
52 int SgnHighByte(int Var) // extends the signum to 16 bit
53 {
54 #if 1
55   short SgnHighByte;
56 #else
57   int SgnHighByte;
58 #endif
59
60   if (Var & 0x8000)
61     SgnHighByte = ((Var & 0x7FFF) / 0x100) | 0xFF80;
62   else
63     SgnHighByte = Var / 0x100;
64
65   return SgnHighByte;
66 }
67
68 int SHL(int *Var, int Count)
69 {
70   int SHL;
71
72   int i;
73
74   for (i = 1; i <= Count; i++)
75   {
76     *Var = *Var & 0x7FFF;
77
78     if ((*Var & 0x4000) != 0)
79       *Var = (2 * (*Var & 0x3FFF)) | 0x8000;
80     else
81       *Var = 2 * *Var;
82   }
83
84   return SHL;
85 }
86
87 int SHR(int *Var, int Count)
88 {
89   int SHR;
90
91   int i;
92
93   if (*Var & 0x8000)
94     *Var = ((*Var & 0x7FFF) / 2) | 0x4000;
95   else
96     *Var = *Var / 2;
97
98   for (i = 2; i <= Count; i++)
99     *Var = *Var / 2;
100
101   return SHR;
102 }
103
104 int ByteToInt(byte B)
105 {
106   int ByteToInt;
107
108   if ((B & 0x80) == 0x80)
109     ByteToInt = -(0xFF - B + 1);
110   else
111     ByteToInt = B;
112
113   return ByteToInt;
114 }
115
116 byte IntToByte(int i)
117 {
118   byte IntToByte;
119
120   IntToByte = (byte)(i & 0xFF);
121
122   return IntToByte;
123 }