]> git.sur5r.net Git - cc65/blob - samples/tgidemo.c
Some more improvements (untested).
[cc65] / samples / tgidemo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <cc65.h>
4 #include <conio.h>
5 #include <ctype.h>
6 #include <modload.h>
7 #include <tgi.h>
8
9
10
11 #define COLOR_BACK      COLOR_BLACK
12 #define COLOR_FORE      COLOR_WHITE
13
14
15 /*****************************************************************************/
16 /*                                   Data                                    */
17 /*****************************************************************************/
18
19
20
21 /* Driver stuff */
22 static unsigned MaxX;
23 static unsigned MaxY;
24
25
26
27 /*****************************************************************************/
28 /*                                   Code                                    */
29 /*****************************************************************************/
30
31
32
33 static void CheckError (const char* S)
34 {
35     unsigned char Error = tgi_geterror ();
36     if (Error != TGI_ERR_OK) {
37         printf ("%s: %d\n", S, Error);
38         exit (EXIT_FAILURE);
39     }
40 }
41
42
43
44 static void DoWarning (void)
45 /* Warn the user that the TGI driver is needed for this program */
46 {
47     printf ("Warning: This program needs the TGI\n"
48             "driver on disk! Press 'y' if you have\n"
49             "it - any other key exits.\n");
50     if (tolower (cgetc ()) != 'y') {
51         exit (EXIT_SUCCESS);
52     }
53     printf ("Ok. Please wait patiently...\n");
54 }
55
56
57
58 static void DoCircles (void)
59 {
60     static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_ORANGE };
61     unsigned char I;
62     unsigned char Color = COLOR_FORE;
63     unsigned X = MaxX / 2;
64     unsigned Y = MaxY / 2;
65
66     tgi_setpalette (Palette);
67     while (!kbhit ()) {
68         tgi_setcolor (COLOR_FORE);
69         tgi_line (0, 0, MaxX, MaxY);
70         tgi_line (0, MaxY, MaxX, 0);
71         tgi_setcolor (Color);
72         for (I = 10; I < 240; I += 10) {
73             tgi_circle (X, Y, I);
74         }
75         Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
76     }
77
78     cgetc ();
79     tgi_clear ();
80 }
81
82
83
84 static void DoCheckerboard (void)
85 {
86     static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
87     unsigned X, Y;
88     unsigned char Color;
89
90     tgi_setpalette (Palette);
91     Color = COLOR_BACK;
92     while (1) {
93         for (Y = 0; Y <= MaxY; Y += 10) {
94             for (X = 0; X <= MaxX; X += 10) {
95                 tgi_setcolor (Color);
96                 tgi_bar (X, Y, X+9, Y+9);
97                 Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
98                 if (kbhit ()) {
99                     cgetc ();
100                     tgi_clear ();
101                     return;
102                 }
103             }
104             Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
105         }
106         Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
107     }
108 }
109
110
111
112 static void DoDiagram (void)
113 {
114     static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
115     int XOrigin, YOrigin;
116     int Amp;
117     int X, Y;
118     unsigned I;
119
120     tgi_setpalette (Palette);
121     tgi_setcolor (COLOR_FORE);
122
123     /* Determine zero and aplitude */
124     YOrigin = MaxY / 2;
125     XOrigin = 10;
126     Amp     = (MaxY - 19) / 2;
127
128     /* Y axis */
129     tgi_line (XOrigin, 10, XOrigin, MaxY-10);
130     tgi_line (XOrigin-2, 12, XOrigin, 10);
131     tgi_lineto (XOrigin+2, 12);
132
133     /* X axis */
134     tgi_line (XOrigin, YOrigin, MaxX-10, YOrigin);
135     tgi_line (MaxX-12, YOrigin-2, MaxX-10, YOrigin);
136     tgi_lineto (MaxX-12, YOrigin+2);
137
138     /* Sine */
139     tgi_gotoxy (XOrigin, YOrigin);
140     for (I = 0; I <= 360; I += 5) {
141
142         /* Calculate the next points */
143         X = (int) (((long) (MaxX - 19) * I) / 360);
144         Y = (int) (((long) Amp * -cc65_sin (I)) / 256);
145
146         /* Draw the line */
147         tgi_lineto (XOrigin + X, YOrigin + Y);
148     }
149
150     cgetc ();
151     tgi_clear ();
152 }
153
154
155
156 static void DoLines (void)
157 {
158     static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
159     unsigned X;
160
161     tgi_setpalette (Palette);
162     tgi_setcolor (COLOR_FORE);
163
164     for (X = 0; X <= MaxY; X += 10) {
165         tgi_line (0, 0, MaxY, X);
166         tgi_line (0, 0, X, MaxY);
167         tgi_line (MaxY, MaxY, 0, MaxY-X);
168         tgi_line (MaxY, MaxY, MaxY-X, 0);
169     }
170
171     cgetc ();
172     tgi_clear ();
173 }
174
175
176
177 int main (void)
178 {
179     unsigned char Border;
180
181     /* Warn the user that the tgi driver is needed */
182     DoWarning ();
183
184     /* Load and initialize the driver */
185     tgi_load_driver (tgi_stddrv);
186     CheckError ("tgi_load_driver");
187     tgi_init ();
188     CheckError ("tgi_init");
189     tgi_clear ();
190
191     /* Get stuff from the driver */
192     MaxX = tgi_getmaxx ();
193     MaxY = tgi_getmaxy ();
194
195     /* Set the palette, set the border color */
196     Border = bordercolor (COLOR_BLACK);
197
198     /* Do graphics stuff */
199     DoCircles ();
200     DoCheckerboard ();
201     DoDiagram ();
202     DoLines ();
203
204     /* Unload the driver */
205     tgi_unload ();
206
207     /* Reset the border */
208     (void) bordercolor (Border);
209
210     /* Done */
211     printf ("Done\n");
212     return EXIT_SUCCESS;
213 }