]> 4ch.mooo.com Git - 16.git/blob - 16/modex/x_demo.c
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / modex / x_demo.c
1 /* X-DEMO.C - a Mode "X" Demo      */\r
2 /* By Matt Pritchard, 14 Apr, 1993 */\r
3 \r
4 #include <stdlib.h>\r
5 #include <stdio.h>\r
6 \r
7 #include "modex.h"\r
8 #include "c_utils.h"\r
9 \r
10 #define MAX_SHAPES  32\r
11 #define MAX_SPRITES 64\r
12 \r
13         /* routines in this file */\r
14 \r
15 void demo_res (int, int, int);\r
16 int  get_key (void);\r
17 void error_out (char*);\r
18 void load_shapes (void);\r
19 int  int_sqrt (int, int);\r
20 void page_demo (void);\r
21 \r
22         /* Structures for Sprites */\r
23 \r
24 struct Shape\r
25 {\r
26         unsigned char Image[512];\r
27         int           X_Width;\r
28         int                       Y_Width;\r
29 }   Img [MAX_SHAPES];\r
30 \r
31 struct Sprite\r
32 {\r
33         int     X_pos;\r
34         int     Y_pos;\r
35         int X_Dir;\r
36         int Y_Dir;\r
37         int     Shape;\r
38         int     Last_X [2];\r
39         int Last_Y [2];\r
40 }   Obj [MAX_SPRITES];\r
41 \r
42 \r
43         /* MAIN */\r
44 \r
45 \r
46 int main(int argc, char *argv[])\r
47 {\r
48 \r
49    /*   if (argc > 0)\r
50         {\r
51                 while (argc > 0)\r
52                 {\r
53                         dos_print ("Unknown Argument: ");\r
54                         dos_print (makefp argv[argc]);\r
55                         argc--;\r
56                 }\r
57                 return (0);\r
58 \r
59         }\r
60          */\r
61 \r
62         init_random ();\r
63 \r
64         load_shapes ();\r
65 \r
66         demo_res ( Mode_320x200, 320, 200 );\r
67         demo_res ( Mode_320x400, 320, 400 );\r
68 \r
69         demo_res ( Mode_360x200, 360, 200 );\r
70         demo_res ( Mode_360x400, 360, 400 );\r
71 \r
72         demo_res ( Mode_320x240, 320, 240 );\r
73         demo_res ( Mode_320x480, 320, 480 );\r
74 \r
75         demo_res ( Mode_360x240, 360, 240 );\r
76         demo_res ( Mode_360x480, 360, 480 );\r
77 \r
78         page_demo ();\r
79 \r
80         set_video_mode (3);\r
81         dos_print ("This Mode X Demo is Finished");\r
82         return (0);\r
83 \r
84 }\r
85 \r
86 \r
87         /* Demonstrate a given resolution */\r
88 \r
89 \r
90 void demo_res (int Screen_Mode, int X_max, int Y_max)\r
91 {\r
92 \r
93 char    *Error1 = "Failure while calling SET_MODEX";\r
94 char    *Error2 = "Failure during READ_PIXEL test";\r
95 \r
96 char    *Abort_Msg = "Demo aborted by User";\r
97 \r
98 char    *Demo_Msg = " This is a MODE X demo ";\r
99 char    *Scrn_Msg = "Screen Resolution is     by    ";\r
100 char    *Cont_Msg = "Press <ANY KEY> to Continue";\r
101 \r
102 char    *Line_Msg = "LINE TEST";\r
103 char    *Fill_Msg = "FILL TEST";\r
104 char    *Pixel_Msg = "PIXEL TEST";\r
105 \r
106 char    Text[10];\r
107 \r
108 int             x1, y1, x2, y2 = 0;\r
109 int             x, y, z = 0;\r
110 int             X_Center, gap = 0;\r
111 \r
112 \r
113         if (set_modex (Screen_Mode) == 0)\r
114         {\r
115                 error_out (Error1);\r
116         }\r
117 \r
118         X_Center = X_max / 2;\r
119 \r
120         x1 = 10;\r
121         y1 = 10;\r
122         x2 = X_max - 1;\r
123         y2 = Y_max - 1;\r
124 \r
125         for (z = 0; z <= 3; z++)\r
126         {\r
127                 y = 31 - z -z;\r
128                 draw_line (x1+z, y1+z, x2-z, y1+z, y);\r
129                 draw_line (x1+z, y1+z, x1+z, y2-z, y);\r
130                 draw_line (x1+z, y2-z, x2-z, y2-z, y);\r
131                 draw_line (x2-z, y1+z, x2-z, y2-z, y);\r
132         }\r
133 \r
134         for (x = 0; x < (X_max / 10); x++)\r
135         {\r
136                 tgprintc (48 + ((x+1) % 10), x*10+1, 1, 9 + ((x/8) % 7) );\r
137                 draw_line (x*10+9, 0, x*10+9, 3, c_bWHITE);\r
138         }\r
139 \r
140         for (y = 0; y < (Y_max / 10); y++)\r
141         {\r
142                 tgprintc (48 + ((y+1) % 10), 1, y*10+1, 9 + ((y/10) % 7) );\r
143                 draw_line (0, y*10+9, 3, y*10+9, c_bWHITE);\r
144         }\r
145 \r
146         for (x = 0; x <= 63; x++)\r
147         {\r
148                 z = 15 + (x * 3 / 4);\r
149                 set_dac_register (64+x, z, z, z);\r
150                 set_dac_register (128+x, 0, z, z);\r
151 \r
152                 draw_line (103-x, 60, 40+x, 123, 64+x);\r
153                 draw_line (40, 60+x, 103, 123-x, 128+x);\r
154 \r
155         }\r
156 \r
157         tprint_str (Line_Msg, 9, 37, 130, c_BLUE);\r
158 \r
159         y = 60;\r
160         gap = 0;\r
161         for (x = 0; x <= 9; x++)\r
162         {\r
163                 fill_block (120, y, 120+x, y+gap, 64+x);\r
164                 fill_block (140 - (15-x), y, 150+x, y+gap, 230+x);\r
165                 fill_block (170 - (15-x), y, 170, y+gap, 128+x);\r
166                 y = y + gap + 2;\r
167                 gap++;\r
168         }\r
169 \r
170         tprint_str (Fill_Msg, 9, 110, 46, c_GREEN);\r
171 \r
172         for (x = 190; x <= 250; x+=2)\r
173         {\r
174                 for (y = 60; y <= 122; y+=2)\r
175                 {\r
176                         z = (x+x+y+y) & 0xff;\r
177                         set_point (x, y, z);\r
178                 }\r
179         }\r
180 \r
181         tprint_str (Pixel_Msg, 10, 182, 130, c_RED);\r
182 \r
183         for (x = 190; x <= 250; x+=2)\r
184         {\r
185                 for (y = 60; y <= 122; y+=2)\r
186                 {\r
187                         z = (x+x+y+y) & 0xff;\r
188                         if (read_point(x, y) != z)\r
189                         {\r
190                                 error_out (Error2);\r
191                         }\r
192                 }\r
193         }\r
194 \r
195         print_str (Demo_Msg, 23, X_Center - 92, 20, c_bRED, c_BLUE);\r
196 \r
197         x = X_Center - 124;\r
198         print_str (Scrn_Msg, 28, x, 30, c_bGREEN, c_BLACK);\r
199 \r
200         sprintf (Text, "%3d", X_max);\r
201         print_str (Text, 3, x+168, 30, c_bPURPLE, c_BLACK);\r
202 \r
203         sprintf (Text, "%3d", Y_max);\r
204         print_str (Text, 3, x + 224, 30, c_bWHITE, c_BLACK);\r
205 \r
206         for (x = 0; x <= 15; x++)\r
207         {\r
208                 set_dac_register (230+x, 63-x*4, 0, 15+x*3);\r
209                 draw_line (30+x, Y_max-6-x, X_max-20-x, Y_max-6-x, 230+x);\r
210         }\r
211 \r
212         tprint_str (Cont_Msg, 27, X_Center - 103, Y_max-18, c_YELLOW);\r
213 \r
214         if (get_key () == Ky_ESC)\r
215         {\r
216                 error_out (Abort_Msg);\r
217         }\r
218 \r
219         return ;\r
220 \r
221 }\r
222 \r
223 \r
224         /* Wait for a Keystroke */\r
225 \r
226 \r
227 int get_key(void)\r
228 {\r
229 \r
230 int     c = 0;\r
231 \r
232         while (c == 0)\r
233         {\r
234                 c = scan_keyboard ();\r
235         }\r
236 \r
237         return (c);\r
238 \r
239 }\r
240 \r
241 \r
242         /* Error Handling Routine */\r
243 \r
244 \r
245 void error_out (char * text)\r
246 {\r
247 \r
248         set_video_mode (3);\r
249         dos_print (text);\r
250         exit (EXIT_SUCCESS);\r
251 \r
252 }\r
253 \r
254 \r
255         /* Routine to generate random sprites */\r
256 \r
257 \r
258 void load_shapes ()\r
259 {\r
260 \r
261 unsigned char   Grid[33][33];\r
262 \r
263 char    *Error1 = "Bad Shape Selected Error";\r
264 \r
265 int             Shape;\r
266 int             x, y, z;\r
267 int             Style, Color;\r
268 int             X_Width, Y_Width, Center, S_Width;\r
269 int             Hollow_X, Hollow_Y;\r
270 \r
271         for (Shape = 0; Shape < MAX_SHAPES; Shape++)\r
272         {\r
273                 for (y = 0; y <= 32; y++)\r
274                 {\r
275                         for (x = 0; x <= 32; x++)\r
276                         {\r
277                                 Grid[x][y] = c_BLACK;\r
278                         }\r
279                 }\r
280 \r
281                 Style = random_int (6);\r
282                 Color = 1 + random_int (15);\r
283 \r
284                 switch (Style)\r
285 \r
286                 {\r
287                                 /* SOLID BOXES */\r
288 \r
289                         case 0:\r
290 \r
291                         {\r
292                                 do\r
293                                 {\r
294                                         X_Width = 3 + random_int(30);\r
295                                         Y_Width = 3 + random_int(30);\r
296 \r
297                                 } while ( (X_Width * Y_Width) >= 512);\r
298 \r
299                                 for (x = 1; x <= X_Width; x++)\r
300                                 {\r
301                                         for (y = 1; y <= Y_Width; y++)\r
302                                         {\r
303                                            Grid[x][y] = Color;\r
304                                         }\r
305                                 }\r
306 \r
307                                 break;\r
308 \r
309                         }\r
310                                 /* HOLLOW BOXES */\r
311 \r
312                         case 1:\r
313 \r
314                         {\r
315                                 do {\r
316                                         X_Width = 6 + random_int(27);\r
317                                         Y_Width = 6 + random_int(27);\r
318                                 } while ( (X_Width * Y_Width) >= 512);\r
319 \r
320                                 for (y = 1; y <= Y_Width; y++)\r
321                                 {\r
322                                         for (x = 1; x <= X_Width; x++)\r
323                                         {\r
324                                                 Grid[x][y] = Color;\r
325                                         }\r
326                                 }\r
327 \r
328                                 Hollow_X = 1 + random_int ((X_Width / 2) -1);\r
329                                 Hollow_Y = 1 + random_int ((Y_Width / 2) -1);\r
330 \r
331                                 for (y = Hollow_Y+1; y <= Y_Width-Hollow_Y; y++)\r
332                                 {\r
333                                         for (x = Hollow_X+1; x <= X_Width-Hollow_X; x++)\r
334                                         {\r
335                                                 Grid[x][y] = c_BLACK;\r
336                                         }\r
337                                 }\r
338 \r
339                                 break;\r
340 \r
341                         }\r
342 \r
343                                 /* SOLID DIAMOND */\r
344 \r
345                         case 2:\r
346 \r
347                         {\r
348 \r
349                                 X_Width = 3 + 2 * random_int(10);\r
350                                 Y_Width = X_Width;\r
351                                 Center = X_Width / 2;\r
352 \r
353                                 for (y = 0; y <= Center; y++)\r
354                                 {\r
355                                         for (x = 0; x <= y; x++)\r
356                                         {\r
357                                                 Grid [Center-x+1][y+1] = Color;\r
358                                                 Grid [Center+x+1][y+1] = Color;\r
359                                                 Grid [Center-x+1][Y_Width-y] = Color;\r
360                                                 Grid [Center+x+1][Y_Width-y] = Color;\r
361                                         }\r
362                                 }\r
363 \r
364                                 break;\r
365 \r
366                         }\r
367 \r
368                                 /* HOLLOW DIAMOND */\r
369 \r
370                         case 3:\r
371 \r
372                         {\r
373 \r
374                                 X_Width = 3 + 2 * random_int(10);\r
375                                 Y_Width = X_Width;\r
376                                 Center = X_Width / 2;\r
377                                 S_Width = random_int (Center);\r
378 \r
379                                 for (y = 0; y <= Center; y++)\r
380                                 {\r
381                                         for (x = 0; x <= y; x++)\r
382                                         {\r
383                                                 if ( x+(Center-y) >= S_Width )\r
384                                                 {\r
385                                                         Grid [Center-x+1][y+1] = Color;\r
386                                                         Grid [Center+x+1][y+1] = Color;\r
387                                                         Grid [Center-x+1][Y_Width-y] = Color;\r
388                                                         Grid [Center+x+1][Y_Width-y] = Color;\r
389                                                 }\r
390                                         }\r
391                                 }\r
392 \r
393                                 break;\r
394 \r
395                         }\r
396 \r
397                                 /* BALL */\r
398 \r
399                         case 4:\r
400 \r
401                         {\r
402 \r
403                                 X_Width = 7 + 2 * random_int (8);\r
404                                 Y_Width = X_Width;\r
405                                 Center  = 1 + X_Width / 2;\r
406 \r
407                                 for (y = 1; y <= Y_Width; y++)\r
408                                 {\r
409                                         for (x = 1; x <= X_Width; x++)\r
410                                         {\r
411                                                 z = int_sqrt(Center-x, Center-y);\r
412                                                 if (z < Center)\r
413                                                 {\r
414                                                         Grid[x][y] = 150 + Color * 2 + z * 3;\r
415                                                 }\r
416                                         }\r
417                                 }\r
418 \r
419                                 break;\r
420                         }\r
421 \r
422                                 /* HOLLOW BALLS */\r
423 \r
424                         case 5:\r
425 \r
426                         {\r
427                                 X_Width = 7 + 2 * random_int (8);\r
428                                 Y_Width = X_Width;\r
429                                 Center  = 1 + X_Width / 2;\r
430                                 S_Width = random_int (X_Width);\r
431 \r
432                                 for (y = 1; y <= Y_Width; y++)\r
433                                 {\r
434                                         for (x = 1; x <= X_Width; x++)\r
435                                         {\r
436                                                 z = int_sqrt(Center-x, Center-y);\r
437                                                 if ( (z < Center) && (z >= S_Width) )\r
438                                                 {\r
439                                                         Grid[x][y] = 150 + Color * 2 + z * 3;\r
440                                                 }\r
441                                         }\r
442                                 }\r
443 \r
444 \r
445                                 break;\r
446                         }\r
447 \r
448                         default:\r
449 \r
450                         {\r
451                                 error_out (Error1);\r
452                                 break;\r
453 \r
454                         }\r
455 \r
456                 }\r
457 \r
458                 z = 0;\r
459                 for (y = 1; y <= Y_Width; y++)\r
460                 {\r
461                         for (x = 1; x <= X_Width; x++)\r
462                         {\r
463                                 Img[Shape].Image[z] = Grid[x][y];\r
464                                 z++;\r
465                         }\r
466                 }\r
467 \r
468                 Img[Shape].X_Width = X_Width;\r
469                 Img[Shape].Y_Width = Y_Width;\r
470 \r
471         }\r
472 \r
473         return;\r
474 }\r
475 \r
476 \r
477         /* Quickie Psuedo Integer Square Root Routine */\r
478 \r
479 \r
480 int int_sqrt ( int x, int y )\r
481 {\r
482 \r
483 int     Sqr_Table[12] = {1, 4, 9, 6, 25, 36, 49, 64, 81, 100, 121, 144};\r
484 \r
485 int     r, d;\r
486 \r
487         d = (x * x) + (y * y);\r
488         r = 0;\r
489 \r
490         while ( d >= Sqr_Table[r] )\r
491         {\r
492                 r++;\r
493         }\r
494 \r
495         return (r);\r
496 \r
497 }\r
498 \r
499 \r
500         /* The Bit Sprite Demo */\r
501 \r
502 \r
503 void page_demo ()\r
504 {\r
505 \r
506 char    *Error1 = "Failure during SET_VGA_MODEX (0, 320, 200, 2) call";\r
507 \r
508 int             Last_Objects[2], Visible_Objects;\r
509 \r
510 int             Screen_X = 384;\r
511 int             Screen_Y = 224;\r
512 \r
513 int             x, y, z;\r
514 int             c, dc;\r
515 int             x1, y1, x2, y2;\r
516 \r
517 int             Sprite_X, Sprite_Y;\r
518 int             Current_Page;\r
519 int             New_X, New_Y;\r
520 \r
521 int             View_X, View_Y, View_Max, View_Cnt, View_XD, View_YD;\r
522 int             Set_Color, Prev_Color, S_Dir, P_Dir;\r
523 \r
524 int             Demo_Running = True;\r
525 int             redo, code;\r
526 \r
527 int pee;\r
528 pee = set_vga_modex(Mode_320x200, Screen_X, Screen_Y, 3);\r
529         if ( pee > 0)\r
530         {\r
531                 set_video_mode (3);\r
532                 dos_print (Error1);\r
533                 fprintf(stdout, "return value is %d\n", pee);\r
534                 //error_out (Error1);\r
535                 exit (EXIT_SUCCESS);\r
536         }\r
537 \r
538         set_active_page (0);\r
539         clear_vga_screen (c_BLACK);\r
540 \r
541         print_str ("This is a Test of the Following Functions:", 99, 10, 9, c_bWHITE, c_BLACK);\r
542 \r
543         draw_line (10, 18, 350, 18, c_YELLOW);\r
544         print_str ("SET_ACTIVE_PAGE", 99, 10, 20, c_bBLUE, c_BLACK);\r
545         print_str ("SET_DISPLAY_PAGE", 99, 10, 30, c_GREEN, c_BLACK);\r
546         print_str ("SET_DAC_REGISTER", 99, 10, 40, c_RED, c_BLACK);\r
547         print_str ("CLEAR_VGA_SCREEN", 99, 10, 50, c_CYAN, c_BLACK);\r
548 \r
549         print_str ("TDRAW_BITMAP", 99, 10, 60, c_PURPLE, c_BLACK);\r
550         print_str ("COPY_PAGE", 99, 10, 70, c_GREEN, c_BLACK);\r
551         print_str ("COPY_BITMAP", 99, 10, 80, c_CYAN, c_BLACK);\r
552 \r
553         print_str ("GPRINTC", 99, 10, 90, c_BLUE, c_BLACK);\r
554         print_str ("TGPRINTC", 99, 10, 100, c_GREEN, c_BLACK);\r
555         print_str ("SET_WINDOW", 99, 10, 110, c_RED, c_BLACK);\r
556 \r
557         print_str ("VIRTUAL SCREEN SIZES", 20, 190, 20, c_bBLUE, c_BLACK);\r
558         print_str ("    SMOOTH SCROLLING", 20, 190, 30, c_GREEN, c_BLACK);\r
559         print_str ("    SPRITE ANIMATION", 20, 190, 40, c_CYAN, c_BLACK);\r
560         print_str ("       PAGE FLIPPING", 20, 190, 50, c_RED, c_BLACK);\r
561         print_str ("       COLOR CYCLING", 20, 190, 60, c_PURPLE, c_BLACK);\r
562 \r
563         for (x = 0; x <=60; x++)\r
564         {\r
565                 set_dac_register (50 + x, 3 + x, 0, 60 - x);\r
566                 set_dac_register (150 + x, 3 + x, 0, 60 - x);\r
567         }\r
568 \r
569         c = 0;\r
570         dc = 1;\r
571         for (x = 0; x <= (Screen_X / 2); x++)\r
572         {\r
573                 draw_line (Screen_X / 2 - 1, Screen_Y / 4, x, Screen_Y - 1, c + 50);\r
574                 draw_line (Screen_X / 2, Screen_Y / 4, Screen_X - x - 1, Screen_Y - 1, c + 50);\r
575                 c+= dc;\r
576                 if ((c == 0) || (c == 60) ) { dc = -dc;}\r
577         }\r
578 \r
579         tprint_str ("Press <ANY KEY> to Continue", 99, 72, 190, c_bWHITE);\r
580         tprint_str ("< > = Faster   < > = Slower", 99, 72, 204, c_bGREEN);\r
581         tprint_str ("< > = Fewer Shapes  < > = More Shapes", 99, 32, 218, c_bCYAN);\r
582 \r
583         tgprintc (43, 80, 204, c_YELLOW);\r
584         tgprintc (45, 200, 204, c_YELLOW);\r
585 \r
586         tgprintc (25, 40, 218, c_YELLOW);\r
587         tgprintc (24, 200, 218, c_YELLOW);\r
588 \r
589         copy_page (0, 1);\r
590         copy_page (0, 2);\r
591 \r
592         for (x = 0; x < MAX_SPRITES; x++)\r
593         {\r
594                 do {\r
595                         Obj[x].X_Dir = random_int(7) - 3;\r
596                         Obj[x].Y_Dir = random_int(7) - 3;\r
597                 } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) );\r
598 \r
599                 Obj[x].Shape = x % MAX_SHAPES;\r
600 \r
601                 Sprite_X = Img[Obj[x].Shape].X_Width;\r
602                 Sprite_Y = Img[Obj[x].Shape].Y_Width;\r
603 \r
604                 Obj[x].X_pos = 1 + random_int(Screen_X - Sprite_X - 2);\r
605                 Obj[x].Y_pos = 1 + random_int(Screen_Y - Sprite_Y - 2);\r
606 \r
607                 Obj[x].Last_X[0] = Obj[x].X_pos;\r
608                 Obj[x].Last_X[1] = Obj[x].X_pos;\r
609                 Obj[x].Last_Y[0] = Obj[x].Y_pos;\r
610                 Obj[x].Last_Y[1] = Obj[x].Y_pos;\r
611 \r
612         }\r
613 \r
614         Current_Page = 0;\r
615 \r
616         View_X = 0;\r
617         View_Y = 0;\r
618         View_Max = 3;\r
619         View_Cnt = 0;\r
620         View_XD = 1;\r
621         View_YD = 1;\r
622 \r
623         Set_Color = 3;\r
624         S_Dir = 1;\r
625         Prev_Color = 0;\r
626         P_Dir = 1;\r
627 \r
628         Visible_Objects = MAX_SPRITES / 2;\r
629         Last_Objects[0] = 0;\r
630         Last_Objects[1] = 0;\r
631 \r
632         while (Demo_Running)\r
633         {\r
634 \r
635                 set_active_page (Current_Page);\r
636 \r
637                         /* Erase Old Images */\r
638 \r
639                 for (x = 0; x <= Last_Objects[Current_Page]; x++)\r
640                 {\r
641                         z = 2;\r
642                         y = Obj[x].Shape;\r
643                         x1 = Obj[x].Last_X[Current_Page];\r
644                         y1 = Obj[x].Last_Y[Current_Page];\r
645                         x2 = x1 + Img[y].X_Width -1;\r
646                         y2 = y1 + Img[y].Y_Width -1;\r
647 \r
648                         x1 = x1 & 0xfffc;\r
649                         x2 = x2 | 0x0003;\r
650 \r
651                         copy_bitmap (z, x1, y1, x2, y2, Current_Page, x1, y1);\r
652                 }\r
653 \r
654                         /* Draw new images */\r
655 \r
656                 for (x = 0; x <= Visible_Objects; x++)\r
657                 {\r
658                         Sprite_X = Img[Obj[x].Shape].X_Width;\r
659                         Sprite_Y = Img[Obj[x].Shape].Y_Width;\r
660 \r
661                         /*  Move Sprite */\r
662 \r
663                         do\r
664                         {\r
665                                 redo = False;\r
666                                 New_X = Obj[x].X_pos + Obj[x].X_Dir;\r
667 \r
668                                 if (( New_X < 0 ) || (New_X + Sprite_X > Screen_X) )\r
669                                 {\r
670                                         Obj[x].X_Dir = -Obj[x].X_Dir;\r
671                                         if (random_int(20) == 1)\r
672                                         {\r
673                                                 do\r
674                                                 {\r
675                                                         Obj[x].X_Dir = random_int(7) - 3;\r
676                                                         Obj[x].Y_Dir = random_int(7) - 3;\r
677                                                 } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) );\r
678                                                 redo = True;\r
679                                         }\r
680                                 }\r
681                         } while (redo);\r
682                         Obj[x].X_pos = Obj[x].X_pos + Obj[x].X_Dir;\r
683 \r
684 \r
685                         do\r
686                         {\r
687                                 redo = False;\r
688                                 New_Y = Obj[x].Y_pos + Obj[x].Y_Dir;\r
689 \r
690                                 if ( (New_Y < 0) || (New_Y + Sprite_Y > Screen_Y) )\r
691                                 {\r
692                                         Obj[x].Y_Dir = -Obj[x].Y_Dir;\r
693                                         if (random_int(20) == 1)\r
694                                         {\r
695                                                 do\r
696                                                 {\r
697                                                         Obj[x].X_Dir = random_int(7) - 3;\r
698                                                         Obj[x].Y_Dir = random_int(7) - 3;\r
699                                                 } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) );\r
700                                                 redo = True;\r
701                                         }\r
702                                 }\r
703                         } while (redo);\r
704 \r
705                         Obj[x].Y_pos = Obj[x].Y_pos + Obj[x].Y_Dir;\r
706 \r
707                         /* Draw Sprite */\r
708 \r
709                         tdraw_bitmap ((char far*) &Img[Obj[x].Shape], Obj[x].X_pos, Obj[x].Y_pos, Sprite_X, Sprite_Y);\r
710 \r
711                         Obj[x].Last_X[Current_Page] = Obj[x].X_pos;\r
712                         Obj[x].Last_Y[Current_Page] = Obj[x].Y_pos;\r
713 \r
714                 }\r
715 \r
716                 Last_Objects[Current_Page] = Visible_Objects;\r
717 \r
718 \r
719                 /* Pan Screen Back & Forth */\r
720 \r
721                 View_Cnt++;\r
722                 if (View_Cnt >= View_Max)\r
723                 {\r
724                         View_X+= View_XD;\r
725                         if ( (View_X == 0) || (View_X == 39) ) {View_XD = -View_XD;}\r
726                         if (View_XD < 0)\r
727                         {\r
728                                 View_Y+= View_YD;\r
729                                 if ( (View_Y == 0) || (View_Y == 39) ) {View_YD = -View_YD;}\r
730                         }\r
731 \r
732                         set_window (Current_Page, View_X, View_Y);\r
733 \r
734                         View_Cnt = 0;\r
735                 }\r
736                 else\r
737                 {\r
738                         set_display_page (Current_Page);\r
739                 }\r
740 \r
741                 /* Cycle Colors */\r
742 \r
743                 set_dac_register (50 + Prev_Color, 3 + Prev_Color, 0, 60 - Prev_Color);\r
744                 set_dac_register (50 + Set_Color, Set_Color, 10, 63 - Set_Color);\r
745 \r
746                 set_dac_register (150 + Prev_Color, 3 + Prev_Color, 0, 60 - Prev_Color);\r
747                 set_dac_register (150 + Set_Color, 63, 63, Set_Color);\r
748 \r
749                 Set_Color+= S_Dir;\r
750                 if ( (Set_Color == 60) || (Set_Color == 0) ) {S_Dir = -S_Dir;}\r
751 \r
752                 Prev_Color+= P_Dir;\r
753                 if ( (Prev_Color == 60) || (Prev_Color == 0) ) {P_Dir = -P_Dir;}\r
754 \r
755                 /* Check for Keystroke */\r
756 \r
757                 Current_Page = Current_Page ^ 0x01;\r
758 \r
759                 code = scan_keyboard ();\r
760 \r
761                 if (code == Ky_ESC) {Demo_Running = False;}\r
762 \r
763                 if (code == Ky_Plus)\r
764                 {\r
765                         if (View_Max < 12) {View_Max++;}\r
766                 }\r
767 \r
768                 if (code == Ky_Minus)\r
769                 {\r
770                         if (View_Max > 1) {View_Max--;}\r
771                         if (View_Cnt >= View_Max) {View_Cnt = 0;}\r
772                 }\r
773 \r
774                 if (code == Ky_Up)\r
775                 {\r
776                         if (Visible_Objects < MAX_SPRITES-1) {Visible_Objects++;}\r
777                 }\r
778 \r
779                 if (code == Ky_Down)\r
780                 {\r
781                         if (Visible_Objects > 0) {Visible_Objects--;}\r
782                 }\r
783 \r
784         }\r
785 \r
786 }\r