Fixed audio playing
[kvidha.git] / executor.c
1 #include "dblbuf.h"\r
2 #include "kvidha.h"\r
3 #include "sb.h"\r
4 \r
5 unsigned long Color16To32(unsigned short c)\r
6 {\r
7     Color Temp;\r
8 \r
9     Temp.Reserved = 0;\r
10     Temp.R = (((c & 0xF800) >> 11) * 255) / 31;\r
11     Temp.G = (((c & 0x07E0) >> 5) * 255) / 63;\r
12     Temp.B = ((c & 0x001F) * 255) / 31;\r
13     return(*(unsigned long *)&Temp);\r
14 }\r
15 \r
16 unsigned short Color32To16(unsigned long c)\r
17 {\r
18     Color Temp;\r
19     unsigned short Result;\r
20 \r
21     *(unsigned long *)&Temp = c;\r
22     Result = (((unsigned short)Temp.R * 31) / 255) << 11;\r
23     Result |= (((unsigned short)Temp.G * 63) / 255) << 5;\r
24     Result |= ((unsigned short)Temp.B * 31) / 255;\r
25     return(Result);\r
26 }\r
27 \r
28 signed short GetArg(unsigned char *Code, unsigned short *Offset, signed short *Variables)\r
29 {\r
30     unsigned char ArgType;\r
31     signed short Result;\r
32 \r
33     ArgType = Code[*Offset];\r
34     switch(ArgType)\r
35     {\r
36         case 0:\r
37             Result = (signed short)((unsigned short)Code[*Offset + 1] + (unsigned short)(Code[*Offset + 2] << 8));\r
38             *Offset += 3;\r
39             break;\r
40         case 1:\r
41             Result = Regs[Code[*Offset + 1]];\r
42             *Offset += 2;\r
43             break;\r
44         case 2:\r
45             Result = Variables[Code[*Offset + 1]];\r
46             *Offset += 2;\r
47             break;\r
48     }\r
49     return(Result);\r
50 }\r
51 \r
52 void Execute(unsigned char *WorkCode, signed short *Variables, unsigned short StartOffset)\r
53 {\r
54     unsigned short Offset;\r
55     unsigned char Finished;\r
56     unsigned short DestroyObject;\r
57     unsigned short ObjectNum;\r
58     unsigned short SpriteNum;\r
59     unsigned short Instruction;\r
60     signed short Damage, Damage2;\r
61     signed short x, y, x2, y2, xv, yv;\r
62     signed short Data, Data2, Angle;\r
63     unsigned short dx, dy;\r
64     unsigned char Frame;\r
65     unsigned char Smokes;\r
66     unsigned short Max;\r
67     unsigned char Register, Player, Reg2, Reg3, Reg4, Reg5, Reg6;\r
68     unsigned char Data3, Data4;\r
69     unsigned short Color;\r
70     unsigned short i;\r
71     unsigned char DisplayInfo;\r
72     unsigned char Choice;\r
73     unsigned short LocalStackPos;\r
74     unsigned long Misc;\r
75     float Data5, Data6;\r
76     static unsigned short DbgPtr = 0;\r
77 \r
78     Finished = 0;\r
79     DisplayInfo = 1;\r
80     Choice = 0;\r
81     Offset = StartOffset;\r
82     LocalStackPos = 0;\r
83     while(Finished == 0)\r
84     {\r
85         if((DebugMode == 1) && (DisplayInfo == 1))\r
86         {\r
87             for(i = 0; i < NumClasses; i++)\r
88             {\r
89                 if(WorkCode == Classes[i]->Code)\r
90                     break;\r
91             }\r
92             DBFRect(33, 58, 287, 142, MakeColor(0, 255, 0));\r
93             DBFRect(34, 59, 286, 141, MakeColor(0, 0, 0));\r
94             Data = sprintf(TextBuffer, "Debugging!\n\n\rClass: %u\n\rOffset: %u\n\n\rCode dump:\n\r", i, Offset);\r
95             for(y = 0; y < 2; y++)\r
96             {\r
97                 for(x = 0; x < 15; x++)\r
98                 {\r
99                     Data += sprintf(TextBuffer + Data, " %02X", WorkCode[Offset + x + (y * 15)]);\r
100                 }\r
101                 Data += sprintf(TextBuffer + Data, "\n\r");\r
102             }\r
103             sprintf(TextBuffer + Data, "\0");\r
104             DBPrint(TextBuffer, 35, 60, 255);\r
105             Data = sprintf(TextBuffer, "Register dump:\n\r");\r
106             for(y = 0; y < 4; y++)\r
107             {\r
108                 for(x = 0; x < 8; x++)\r
109                 {\r
110                     Data += sprintf(TextBuffer + Data, " %-6i", Regs[x + (y * 8)]);\r
111                 }\r
112                 Data += sprintf(TextBuffer + Data, "\n\r");\r
113             }\r
114             sprintf(TextBuffer + Data, "\0");\r
115             DBPrint(TextBuffer, 35, 105, 255);\r
116             DisplayDB();\r
117             while(KeyTable[57] == 0)\r
118             {\r
119                 GetEvents();\r
120                 if(KeyTable[203] == 1)\r
121                 {\r
122                     if(Choice > 0)\r
123                         Choice--;\r
124                     while(KeyTable[203] == 1)\r
125                         GetEvents();\r
126                 }\r
127                 if(KeyTable[205] == 1)\r
128                 {\r
129                     if(Choice < 2)\r
130                         Choice++;\r
131                     while(KeyTable[205] == 1)\r
132                         GetEvents();\r
133                 }\r
134                 sprintf(TextBuffer, " %cStep       %cRun to return      %cComplete\0", (unsigned short)(Choice == 0)?45:32, (unsigned short)(Choice == 1)?45:32, (unsigned short)(Choice == 2)?45:32);\r
135                 DBPrint(TextBuffer, 35, 135, 255);\r
136                 DisplayDB();\r
137             }\r
138             while(KeyTable[57] == 1)\r
139                 GetEvents();\r
140             if(Choice == 1)\r
141                 DisplayInfo = 2;\r
142             if(Choice == 2)\r
143                 DisplayInfo = 0;\r
144         }\r
145         Instruction = (unsigned short)WorkCode[Offset] + ((unsigned short)WorkCode[Offset + 1] << 8);\r
146         Offset += 2;\r
147         switch(Instruction)\r
148         {\r
149             case 0:                                 //Return\r
150                 if(DisplayInfo == 2)\r
151                     DisplayInfo = 1;\r
152                 if(LocalStackPos == 0)\r
153                 {\r
154                     Finished = 1;\r
155                 } else {\r
156                     Offset = Stack[--StackPos];\r
157                     LocalStackPos--;\r
158                 }\r
159                 break;\r
160             case 1:                                 //DestroyObject\r
161                 DestroyObject = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
162                 RemoveHitTest(DestroyObject);\r
163                 if(Objects[DestroyObject]->SpriteLink != 0xFFFF)\r
164                     Sprites[Objects[DestroyObject]->SpriteLink]->Used = 0;\r
165                 Objects[DestroyObject]->SpriteLink = 0xFFFF;\r
166                 Objects[DestroyObject]->Used = 2;\r
167                 break;\r
168             case 2:                                 //SpawnExplosion\r
169                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
170                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
171                 Frame = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
172                 Smokes = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
173                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
174                 SpawnExplosion(x, y, Frame, Smokes, (unsigned char)Data);\r
175                 break;\r
176             case 3:                                 //StoreRandom\r
177                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
178                 Max = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
179                 Regs[Register] = rand() % Max;\r
180                 break;\r
181             case 4:                                 //StoreReg\r
182                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
183                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
184                 Regs[Register] = Data;\r
185                 break;\r
186             case 5:                                 //Add\r
187                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
188                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
189                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
190                 Regs[Register] = Data + Data2;\r
191                 break;\r
192             case 6:                                 //Equals\r
193                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
194                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
195                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
196                 Regs[Register] = (Data == Data2)?1:0;\r
197                 break;\r
198             case 7:                                 //If\r
199                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
200                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
201                 if(Data != 0)\r
202                     Offset = Data2;\r
203                 break;\r
204             case 8:                                 //SpawnPixel\r
205                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
206                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
207                 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
208                 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
209                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
210                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
211                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
212                 Damage = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
213                 Color = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
214                 SpawnPixel((unsigned short)x, (unsigned short)y, (float)xv / 100, (float)yv / 100, Player, (unsigned char)Data, (unsigned char)Data2, Damage, Color16To32(Color));\r
215                 break;\r
216             case 9:                                 //NotEquals\r
217                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
218                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
219                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
220                 Regs[Register] = (Data != Data2)?1:0;\r
221                 break;\r
222             case 10:                                //Substract\r
223                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
224                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
225                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
226                 Regs[Register] = Data - Data2;\r
227                 break;\r
228             case 11:                                //SpawnObject\r
229                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
230                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
231                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
232                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
233                 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
234                 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
235                 SpawnObject((unsigned short)Data, (unsigned char)Data2, (unsigned short)x, (unsigned short)y, (float)xv / 100, (float)yv / 100);\r
236                 break;\r
237             case 12:                                //Goto\r
238                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
239                 Offset = Data;\r
240                 break;\r
241             case 13:                                //StoreVariable\r
242                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
243                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
244                 Variables[Data] = Data2;\r
245                 break;\r
246             case 14:                                //GetLevelInfo\r
247                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
248                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
249                 if(Data == 0) Regs[Register] = LevelWidth;\r
250                 if(Data == 1) Regs[Register] = LevelHeight;\r
251                 if(Data == 2) Regs[Register] = (signed short)LevelFinished;\r
252                 if(Data == 3) Regs[Register] = (signed short)GameType;\r
253                 if(Data == 4) Regs[Register] = (signed short)((Gravity + 0.005) * 100);\r
254                 break;\r
255             case 15:                                //SetPlayerInfo\r
256                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
257                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
258                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
259                 if(Data == 0) Players[Player]->Object = (unsigned short)Data2;\r
260                 if(Data == 1) Players[Player]->VPObject = (unsigned short)Data2;\r
261                 if(Data == 2) Players[Player]->Used = (unsigned char)Data2;\r
262                 if(Data == 3) Players[Player]->Angle = (float)Data2;\r
263                 if(Data == 4) Players[Player]->Dir = (unsigned char)Data2;\r
264                 if(Data == 5) Players[Player]->CrossColor = (unsigned long)Color16To32(Data2);\r
265                 if(Data == 6) Players[Player]->Left = (unsigned char)Data2;\r
266                 if(Data == 7) Players[Player]->Right = (unsigned char)Data2;\r
267                 if(Data == 8) Players[Player]->Up = (unsigned char)Data2;\r
268                 if(Data == 9) Players[Player]->Down = (unsigned char)Data2;\r
269                 if(Data == 10) Players[Player]->Shoot = (unsigned char)Data2;\r
270                 if(Data == 11) Players[Player]->Change = (unsigned char)Data2;\r
271                 if(Data == 13) Players[Player]->Health = (unsigned short)Data2;\r
272                 if(Data == 14) Players[Player]->MaxHealth = (unsigned short)Data2;\r
273                 if(Data == 15) Players[Player]->Kills = Data2;\r
274                 if(Data == 16) Players[Player]->Lives = Data2;\r
275                 if(Data == 18) Players[Player]->JustShot = (unsigned char)Data2;\r
276                 if(Data == 18) Players[Player]->CurWeapon = Data2;\r
277                 break;\r
278             case 16:                                //GetPlayerInfo\r
279                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
280                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
281                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
282                 if(Data == 0) Regs[Register] = (signed short)Players[Player]->Object;\r
283                 if(Data == 1) Regs[Register] = (signed short)Players[Player]->VPObject;\r
284                 if(Data == 2) Regs[Register] = (signed short)Players[Player]->Used;\r
285                 if(Data == 3) Regs[Register] = (signed short)Players[Player]->Angle;\r
286                 if(Data == 4) Regs[Register] = (signed short)Players[Player]->Dir;\r
287                 if(Data == 5) Regs[Register] = (signed short)Players[Player]->CrossColor;\r
288                 if(Data == 6) Regs[Register] = (signed short)Players[Player]->Left;\r
289                 if(Data == 7) Regs[Register] = (signed short)Players[Player]->Right;\r
290                 if(Data == 8) Regs[Register] = (signed short)Players[Player]->Up;\r
291                 if(Data == 9) Regs[Register] = (signed short)Players[Player]->Down;\r
292                 if(Data == 10) Regs[Register] = (signed short)Players[Player]->Shoot;\r
293                 if(Data == 11) Regs[Register] = (signed short)Players[Player]->Change;\r
294                 if(Data == 12)\r
295                 {\r
296                     Angle = Players[Player]->Angle;\r
297                     if(Angle > 90)\r
298                         Angle -= 360;\r
299                     if(Players[Player]->Dir == 1)\r
300                         Angle = 180 - Angle;\r
301                     if(Angle < 0)\r
302                         Angle += 360;\r
303                     Regs[Register] = Angle;\r
304                 }\r
305                 if(Data == 13) Regs[Register] = (signed short)Players[Player]->Health;\r
306                 if(Data == 14) Regs[Register] = (signed short)Players[Player]->MaxHealth;\r
307                 if(Data == 15) Regs[Register] = (signed short)Players[Player]->Kills;\r
308                 if(Data == 16) Regs[Register] = (signed short)Players[Player]->Lives;\r
309                 if(Data == 17) Regs[Register] = (signed short)Players[Player]->JustShot;\r
310                 if(Data == 18) Regs[Register] = (signed short)Players[Player]->CurWeapon;\r
311                 break;\r
312             case 17:                                //SetObjectInfo\r
313                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
314                 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
315                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
316                 if(Data == 0) Objects[ObjectNum]->x = (float)Data2;\r
317                 if(Data == 1) Objects[ObjectNum]->y = (float)Data2;\r
318                 if(Data == 2) Objects[ObjectNum]->xv = (float)Data2 / 100;\r
319                 if(Data == 3) Objects[ObjectNum]->yv = (float)Data2 / 100;\r
320                 if(Data == 4) Objects[ObjectNum]->SpriteLink = (unsigned short)Data2;\r
321                 if(Data == 5) Objects[ObjectNum]->Owner = (unsigned char)Data2;\r
322                 if(Data == 6) Objects[ObjectNum]->Class = (unsigned short)Data2;\r
323                 if(Data == 7) Objects[ObjectNum]->Used = (unsigned char)Data2;\r
324                 if(Data == 8) Objects[ObjectNum]->xv = (float)(signed short)Objects[ObjectNum]->xv + ((float)Data2 / 10000);\r
325                 if(Data == 9) Objects[ObjectNum]->yv = (float)(signed short)Objects[ObjectNum]->yv + ((float)Data2 / 10000);\r
326                 break;\r
327             case 18:                                //GetObjectInfo\r
328                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
329                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
330                 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
331                 if(Data == 0) Regs[Register] = (signed short)Objects[ObjectNum]->x;\r
332                 if(Data == 1) Regs[Register] = (signed short)Objects[ObjectNum]->y;\r
333                 if(Data == 2) Regs[Register] = (signed short)(Objects[ObjectNum]->xv * 100);\r
334                 if(Data == 3) Regs[Register] = (signed short)(Objects[ObjectNum]->yv * 100);\r
335                 if(Data == 4) Regs[Register] = (signed short)Objects[ObjectNum]->SpriteLink;\r
336                 if(Data == 5) Regs[Register] = (signed short)Objects[ObjectNum]->Owner;\r
337                 if(Data == 6) Regs[Register] = (signed short)Objects[ObjectNum]->Class;\r
338                 if(Data == 7) Regs[Register] = (signed short)Objects[ObjectNum]->Used;\r
339                 if(Data == 8) Regs[Register] = (signed short)((Objects[ObjectNum]->xv - (float)(signed short)Objects[ObjectNum]->xv) * 10000);\r
340                 if(Data == 9) Regs[Register] = (signed short)((Objects[ObjectNum]->yv - (float)(signed short)Objects[ObjectNum]->yv) * 10000);\r
341                 break;\r
342             case 19:                                //ChangeSign\r
343                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
344                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
345                 Regs[Register] = -Data;\r
346                 break;\r
347             case 20:                                //Multiply\r
348                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
349                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
350                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
351                 Regs[Register] = Data * Data2;\r
352                 break;\r
353             case 21:                                //Divide\r
354                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
355                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
356                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
357                 Regs[Register] = Data / Data2;\r
358                 break;\r
359             case 22:                                //Call\r
360                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
361                 if(StackPos < MAX_STACK)\r
362                 {\r
363                     Stack[StackPos++] = Offset;\r
364                     LocalStackPos++;\r
365                     Offset = Data;\r
366                 } else {\r
367                     sprintf(TextBuffer, "Stack overflow!\n\n\n\rPress space to continue...\0");\r
368                     DBFRect(68, 88, 252, 112, MakeColor(255, 0, 0));\r
369                     DBFRect(69, 89, 251, 111, MakeColor(0, 0, 0));\r
370                     DBPrint(TextBuffer, 70, 90, 255);\r
371                     DisplayDB();\r
372                     while(KeyTable[57] == 1)\r
373                         GetEvents();\r
374                     while(KeyTable[57] == 0)\r
375                         GetEvents();\r
376                 }\r
377                 break;\r
378             case 23:                                //SetSpriteInfo\r
379                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
380                 SpriteNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
381                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
382                 if((unsigned short)SpriteNum == 0xFFFF)\r
383                     break;\r
384                 if(Data == 0) Sprites[SpriteNum]->CurFrame = (unsigned char)Data2;\r
385                 if(Data == 1) Sprites[SpriteNum]->AnimTimer = (unsigned char)Data2;\r
386                 if(Data == 2) Sprites[SpriteNum]->AnimDelay = (unsigned char)Data2;\r
387                 if(Data == 3) Sprites[SpriteNum]->Transparent = (unsigned char)Data2;\r
388                 if(Data == 4) Sprites[SpriteNum]->x = (signed short)Data2;\r
389                 if(Data == 5) Sprites[SpriteNum]->y = (signed short)Data2;\r
390                 break;\r
391             case 24:                                //GetSpriteInfo\r
392                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
393                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
394                 SpriteNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
395                 if((unsigned short)SpriteNum == 0xFFFF)\r
396                     break;\r
397                 if(Data == 0) Regs[Register] = (signed short)Sprites[SpriteNum]->CurFrame;\r
398                 if(Data == 1) Regs[Register] = (signed short)Sprites[SpriteNum]->AnimTimer;\r
399                 if(Data == 2) Regs[Register] = (signed short)Sprites[SpriteNum]->AnimDelay;\r
400                 if(Data == 3) Regs[Register] = (signed short)Sprites[SpriteNum]->Transparent;\r
401                 if(Data == 4) Regs[Register] = (signed short)Sprites[SpriteNum]->x;\r
402                 if(Data == 5) Regs[Register] = (signed short)Sprites[SpriteNum]->y;\r
403                 if(Data == 6) Regs[Register] = (signed short)Sprites[SpriteNum]->Template;\r
404                 break;\r
405             case 25:                                //GreaterThan\r
406                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
407                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
408                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
409                 Regs[Register] = (Data > Data2)?1:0;\r
410                 break;\r
411             case 26:                                //LessThan\r
412                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
413                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
414                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
415                 Regs[Register] = (Data < Data2)?1:0;\r
416                 break;\r
417             case 27:                                //GetKey\r
418                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
419                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
420                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
421                 Regs[Register] = Players[Data]->Keys[Data2];\r
422                 break;\r
423             case 28:                                //CalcSine\r
424                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
425                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
426                 if(Data < 0)\r
427                     Data += ((unsigned short)(-Data / 360) + 1) * 360;\r
428                 if(Data >= 360)\r
429                     Data -= (unsigned short)(Data / 360) * 360;\r
430                 Regs[Register] = Sine[Data] * 100;\r
431                 break;\r
432             case 29:                                //CalcCosine\r
433                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
434                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
435                 if(Data < 0)\r
436                     Data += ((unsigned short)(-Data / 360) + 1) * 360;\r
437                 if(Data >= 360)\r
438                     Data -= (unsigned short)(Data / 360) * 360;\r
439                 Regs[Register] = Cosine[Data] * 100;\r
440                 break;\r
441             case 30:                                //GetPixelInfo\r
442                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
443                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
444                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
445                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
446                 if(Data == 0) Regs[Register] = (signed short)Color32To16(GetMapPixel((unsigned short)x, (unsigned short)y, 0));\r
447                 if(Data == 1) Regs[Register] = (signed short)GetMapPixel((unsigned short)x, (unsigned short)y, 1);\r
448                 break;\r
449             case 31:                                //And\r
450                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
451                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
452                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
453                 Regs[Register] = Data & Data2;\r
454                 break;\r
455             case 32:                                //Or\r
456                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
457                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
458                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
459                 Regs[Register] = Data | Data2;\r
460                 break;\r
461             case 33:                                //BNot\r
462                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
463                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
464                 Regs[Register] = !Data;\r
465                 break;\r
466             case 34:                                //Not\r
467                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
468                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
469                 Regs[Register] = ~Data;\r
470                 break;\r
471             case 35:                                //DrawLine\r
472                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
473                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
474                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
475                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
476                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
477                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
478                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
479                 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
480                 DrawLine(x, y, x2, y2, Color16To32(Data), Color16To32(Data2), Data3, Data4);\r
481                 break;\r
482             case 36:                                //StorePVar\r
483                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
484                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
485                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
486                 Players[Player]->PVars[Data] = Data2;\r
487                 break;\r
488             case 37:                                //GetPVar\r
489                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
490                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
491                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
492                 Regs[Register] = Players[Player]->PVars[Data];\r
493                 break;\r
494             case 38:                                //CalcDist\r
495                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
496                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
497                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
498                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
499                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
500                 Misc = ((unsigned long)(x - x2) * (unsigned long)(x - x2)) + ((unsigned long)(y - y2) * (unsigned long)(y - y2));\r
501                 Regs[Register] = sqrt((double)Misc);\r
502                 break;\r
503             case 39:                                //CalcAngle\r
504                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
505                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
506                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
507                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
508                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
509                 Regs[Register] = CalcAngle(x, y, x2, y2);\r
510                 break;\r
511             case 40:                                //AddHitTest\r
512                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
513                 AddHitTest((unsigned short)Data);\r
514                 break;\r
515             case 41:                                //RemoveHitTest\r
516                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
517                 RemoveHitTest((unsigned short)Data);\r
518                 break;\r
519             case 42:                                //CopyToMap\r
520                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
521                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
522                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
523                 Frame = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
524                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
525                 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
526                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
527                 CopyToMap(x - Caches[Data]->cx[Frame], y - Caches[Data]->cy[Frame], Caches[Data]->Frames[Frame], Caches[Data]->w, Caches[Data]->h, 0, Data3, Data4, (unsigned short)Data2);\r
528                 break;\r
529             case 43:                                //HurtRadius\r
530                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
531                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
532                 Damage = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
533                 Damage2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
534                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
535                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
536                 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
537                 HurtRadius(x, y, Damage, Damage2, (unsigned short)Data, (unsigned short)Data2, Player);\r
538                 break;\r
539             case 44:                                //CollVel\r
540                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
541                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
542                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
543                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
544                 Data5 = ((float)GetArg(WorkCode, (unsigned short *)&Offset, Variables)) / 100;\r
545                 Data6 = ((float)GetArg(WorkCode, (unsigned short *)&Offset, Variables)) / 100;\r
546                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
547                 CollVel(x, y, (float *)&Data5, (float *)&Data6, Data3);\r
548                 Regs[Data] = (signed short)(Data5 * 100);\r
549                 Regs[Data2] = (signed short)(Data6 * 100);\r
550                 break;\r
551             case 45:                                //SetObjectVar\r
552                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
553                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
554                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
555                 Objects[Data]->Variables[Data3] = Data2;\r
556                 break;\r
557             case 46:                                //GetObjectVar\r
558                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
559                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
560                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
561                 Regs[Register] = Objects[Data]->Variables[Data3];\r
562                 break;\r
563             case 47:                                //Debug\r
564                 DebugMode = 1;\r
565                 break;\r
566             case 48:                                //Trace\r
567                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
568                 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
569                 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
570                 Reg4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
571                 Reg5 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
572                 Reg6 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
573                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
574                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
575                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
576                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
577                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
578                 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
579                 Data = -1;\r
580                 Regs[Register] = CollisionTest((signed short *)&x, (signed short *)&y, (signed short *)&x2, (signed short *)&y2, Data3, Data4, (unsigned short *)&Data, 0xFF, 0);\r
581                 Regs[Reg2] = x;\r
582                 Regs[Reg3] = y;\r
583                 Regs[Reg4] = x2;\r
584                 Regs[Reg5] = y2;\r
585                 Regs[Reg6] = Data;\r
586                 break;\r
587             case 49:                                //CallExternal\r
588                 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
589                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
590                 Execute(Classes[Objects[ObjectNum]->Class]->Code, (signed short *)&Objects[ObjectNum]->Variables[0], Classes[Objects[ObjectNum]->Class]->Scripts[Data]);\r
591                 break;\r
592             case 50:                                //SetLevelInfo\r
593                 Data = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
594                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
595                 if(Data == 0) LevelWidth = Data2;\r
596                 if(Data == 1) LevelHeight = Data2;\r
597                 if(Data == 2) LevelFinished = (unsigned short)Data2;\r
598                 if(Data == 3) GameType = (unsigned char)Data2;\r
599                 if(Data == 4) Gravity = (float)Data2 / 100;\r
600                 break;\r
601             case 51:                                //SpawnSprite\r
602                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
603                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
604                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
605                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
606                 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
607                 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
608                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
609                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
610                 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
611                 Regs[Register] = SpawnSprite((unsigned char)Data, x, y, (signed char)xv, (signed char)yv, Data2, Data3, Data4);\r
612                 break;\r
613             case 52:                                //Proximity\r
614                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
615                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
616                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
617                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
618                 Regs[Register] = -1;\r
619                 for(i = 0; i < MAX_HITTESTS; i++)\r
620                 {\r
621                     if((ObjectNum = HitTests[i]) == 0xFFFF)\r
622                         break;\r
623                     if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))\r
624                     {\r
625                         Misc = ((unsigned long)(x - (signed short)Objects[ObjectNum]->x) * (unsigned long)(x - (signed short)Objects[ObjectNum]->x)) + ((unsigned long)(y - (signed short)Objects[ObjectNum]->y) * (unsigned long)(y - (signed short)Objects[ObjectNum]->y));\r
626                         if((signed short)sqrt((double)Misc) <= Data)\r
627                         {\r
628                             Regs[Register] = ObjectNum;\r
629                             break;\r
630                         }\r
631                     }\r
632                 }\r
633                 break;\r
634             case 53:                                //PlaySound\r
635                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
636                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
637                 PlaySound((unsigned short)Data, (unsigned char)Data2, 0, MAX_SOUNDS - 1, 22050, 1);\r
638                 break;\r
639             case 54:                                //MakeColor\r
640                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
641                 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
642                 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
643                 Reg4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
644                 Regs[Register] = (Reg2 << 11) + (Reg3 << 5) + Reg4;\r
645                 break;\r
646             case 55:                                //SetPixelInfo\r
647                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
648                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
649                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
650                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
651                 SetMapPixel((unsigned short)x, (unsigned short)y, (Data == 0)?Color16To32(Data2):Data2, Data);\r
652                 break;\r
653             case 56:                                //ExtProximity\r
654                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
655                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
656                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
657                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
658                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
659                 Max = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
660                 Regs[Register] = -1;\r
661                 for(i = 0; i < MAX_HITTESTS; i++)\r
662                 {\r
663                     if((ObjectNum = HitTests[i]) == 0xFFFF)\r
664                         break;\r
665                     if((ObjectNum == Max) || (Objects[ObjectNum]->Class == (unsigned short)Data2))\r
666                         continue;\r
667                     if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))\r
668                     {\r
669                         Misc = ((unsigned long)(x - (signed short)Objects[ObjectNum]->x) * (unsigned long)(x - (signed short)Objects[ObjectNum]->x)) + ((unsigned long)(y - (signed short)Objects[ObjectNum]->y) * (unsigned long)(y - (signed short)Objects[ObjectNum]->y));\r
670                         if((signed short)sqrt((double)Misc) <= Data)\r
671                         {\r
672                             Regs[Register] = ObjectNum;\r
673                             break;\r
674                         }\r
675                     }\r
676                 }\r
677                 break;\r
678             case 57:                                //DrawLightning\r
679                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
680                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
681                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
682                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
683                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
684                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
685                 DrawLightning(x, y, x2, y2, Data, Data3);\r
686                 break;\r
687             case 58:                                //PlaySoundLoop\r
688                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
689                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
690                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
691                 Misc = (unsigned long)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
692                 Data5 = (float)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
693                 Regs[Register] = (signed short)PlaySound((unsigned short)Data, (unsigned char)Data2, 0, MAX_SOUNDS - 1, Misc * 10, Data5 / 100);\r
694                 break;\r
695             case 59:                                //SetSoundInfo\r
696                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
697                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
698                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
699                 if(Data == 0) Sounds[Data3].Pitch = (unsigned long)Data2 * 10;\r
700                 if(Data == 1) Sounds[Data3].Playing = (unsigned char)Data2;\r
701                 if(Data == 2) Sounds[Data3].Volume = (float)(Data2 / 100);\r
702                 break;\r
703             case 60:                                //GetSoundInfo\r
704                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
705                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
706                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
707                 if(Data == 0) Regs[Register] = (signed short)(Sounds[Data3].Pitch / 10);\r
708                 if(Data == 1) Regs[Register] = (signed short)Sounds[Data3].Playing;\r
709                 if(Data == 2) Regs[Register] = (signed short)(Sounds[Data3].Volume * 100);\r
710                 break;\r
711             case 61:                                //TraceCoords\r
712                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
713                 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
714                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
715                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
716                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
717                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
718                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
719                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
720                 Data4 = 0;\r
721                 if(x2 > x)\r
722                 {\r
723                     xv = 1;\r
724                     dx = x2 - x;\r
725                 } else {\r
726                     xv = -1;\r
727                     dx = x - x2;\r
728                 }\r
729                 if(y2 > y)\r
730                 {\r
731                     yv = 1;\r
732                     dy = y2 - y;\r
733                 } else {\r
734                     yv = -1;\r
735                     dy = y - y2;\r
736                 }\r
737                 Max = 0;\r
738                 if(dx > dy)\r
739                 {\r
740                     for(i = 0; i <= dx; i++)\r
741                     {\r
742                         Regs[Register] = x;\r
743                         Regs[Reg2] = y;\r
744                         if(++Data4 >= Data3)\r
745                         {\r
746                             Execute(WorkCode, Variables, Data);\r
747                             Data4 = 0;\r
748                         }\r
749                         GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);\r
750                     }\r
751                 } else {\r
752                     for(i = 0; i <= dy; i++)\r
753                     {\r
754                         Regs[Register] = x;\r
755                         Regs[Reg2] = y;\r
756                         if(++Data4 >= Data3)\r
757                         {\r
758                             Execute(WorkCode, Variables, Data);\r
759                             Data4 = 0;\r
760                         }\r
761                         GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);\r
762                     }\r
763                 }\r
764                 break;\r
765             case 62:                                //DecodeColor\r
766                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
767                 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
768                 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
769                 i = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
770                 Regs[Register] = (i & 0xF800) >> 11;\r
771                 Regs[Reg2] = (i & 0x07E0) >> 5;\r
772                 Regs[Reg3] = i & 0x001F;\r
773                 break;\r
774             case 63:                                //DrawPoly\r
775                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
776                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
777                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
778                 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
779                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
780                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
781                 Color = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
782                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
783                 DrawPoly(x, y, x2, y2, Data, Data2, Color16To32(Color), Data3);\r
784                 break;\r
785             case 64:                                //LoopHitTests\r
786                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
787                 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
788                 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
789                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
790                 for(i = 0; i < MAX_HITTESTS; i++)\r
791                 {\r
792                     if(HitTests[i] == 0xFFFF)\r
793                         break;\r
794                     Regs[Register] = HitTests[i];\r
795                     Regs[Reg2] = (signed short)Objects[HitTests[i]]->x;\r
796                     Regs[Reg3] = (signed short)Objects[HitTests[i]]->y;\r
797                     Execute(WorkCode, Variables, Data);\r
798                 }\r
799                 break;\r
800             case 65:                                //DrawCircle\r
801                 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
802                 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
803                 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
804                 Color = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
805                 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
806                 DrawCircle(x, y, x2, Color16To32(Color), Data3);\r
807                 break;\r
808             case 66:                                //Sqrt\r
809                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
810                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
811                 if(Data < 0)\r
812                     Data = 0;\r
813                 Regs[Register] = (unsigned short)sqrt((float)Data);\r
814                 break;\r
815             case 67:                                //Abs\r
816                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
817                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
818                 if(Data < 0)\r
819                     Regs[Register] = -Data;\r
820                 else\r
821                     Regs[Register] = Data;\r
822                 break;\r
823             case 68:                                //StoreGVar\r
824                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
825                 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
826                 GameVars[Data] = Data2;\r
827                 break;\r
828             case 69:                                //GetGVar\r
829                 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
830                 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
831                 Regs[Register] = GameVars[Data];\r
832                 break;\r
833             case 70:                                //CondDebug\r
834                 if(KeyTable[68] == 1)\r
835                     DebugMode = 1;\r
836                 break;\r
837             default:\r
838                 sprintf(TextBuffer, "Unknown instruction %u at offset %u!\n\rCode address: %p\n\n\rPress space to continue...\0", Instruction, Offset, (void *)WorkCode);\r
839                 DBFRect(68, 88, 252, 112, MakeColor(255, 0, 0));\r
840                 DBFRect(69, 89, 251, 111, MakeColor(0, 0, 0));\r
841                 DBPrint(TextBuffer, 70, 90, 255);\r
842                 DisplayDB();\r
843                 while(KeyTable[57] == 1)\r
844                     GetEvents();\r
845                 while(KeyTable[57] == 0)\r
846                     GetEvents();\r
847         }\r
848     }\r
849 }\r