]> git.sur5r.net Git - cc65/blobdiff - samples/tgidemo.c
Added '_' prefix to sin and cos.
[cc65] / samples / tgidemo.c
index d6b1586ae9faf46faa0c38cc37785f6bea6c6944..de743314e6ac86b12abf7d6f8e8ff287b749ec74 100644 (file)
@@ -1,62 +1,36 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <cc65.h>
 #include <conio.h>
+#include <ctype.h>
 #include <modload.h>
 #include <tgi.h>
 
 
 
+#ifndef DYN_DRV
+#  define DYN_DRV       1
+#endif
+
+#define COLOR_BACK      TGI_COLOR_BLACK
+#define COLOR_FORE      TGI_COLOR_WHITE
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
-static const unsigned char SinusTable[] = {
-    0x64,0x63,0x61,0x5F,0x5D,0x5B,0x59,0x57,0x55,0x54,
-    0x52,0x50,0x4E,0x4C,0x4A,0x49,0x47,0x45,0x43,0x42,
-    0x40,0x3E,0x3C,0x3B,0x39,0x38,0x36,0x34,0x33,0x31,
-    0x30,0x2E,0x2D,0x2B,0x2A,0x28,0x27,0x26,0x24,0x23,
-    0x22,0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19,0x18,
-    0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x10,
-    0x0F,0x0E,0x0E,0x0D,0x0D,0x0C,0x0C,0x0C,0x0B,0x0B,
-    0x0B,0x0B,0x0B,0x0B,0x0B,0x0A,0x0B,0x0B,0x0B,0x0B,
-    0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,
-    0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16,
-    0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,
-    0x22,0x23,0x24,0x26,0x27,0x28,0x2A,0x2B,0x2D,0x2E,
-    0x30,0x31,0x33,0x34,0x36,0x38,0x39,0x3B,0x3C,0x3E,
-    0x40,0x42,0x43,0x45,0x47,0x49,0x4A,0x4C,0x4E,0x50,
-    0x52,0x54,0x55,0x57,0x59,0x5B,0x5D,0x5F,0x61,0x63,
-    0x64,0x65,0x67,0x69,0x6B,0x6D,0x6F,0x71,0x73,0x74,
-    0x76,0x78,0x7A,0x7C,0x7E,0x7F,0x81,0x83,0x85,0x86,
-    0x88,0x8A,0x8C,0x8D,0x8F,0x91,0x92,0x94,0x95,0x97,
-    0x98,0x9A,0x9B,0x9D,0x9E,0xA0,0xA1,0xA2,0xA4,0xA5,
-    0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,
-    0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB8,
-    0xB9,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xBD,0xBD,
-    0xBD,0xBD,0xBD,0xBD,0xBD,0xBE,0xBD,0xBD,0xBD,0xBD,
-    0xBD,0xBD,0xBD,0xBC,0xBC,0xBC,0xBB,0xBB,0xBA,0xBA,
-    0xB9,0xB8,0xB8,0xB7,0xB6,0xB6,0xB5,0xB4,0xB3,0xB2,
-    0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,
-    0xA6,0xA5,0xA4,0xA2,0xA1,0xA0,0x9E,0x9D,0x9B,0x9A,
-    0x98,0x97,0x95,0x94,0x92,0x91,0x8F,0x8D,0x8C,0x8A,
-    0x88,0x86,0x85,0x83,0x81,0x7F,0x7E,0x7C,0x7A,0x78,
-    0x76,0x74,0x73,0x71,0x6F,0x6D,0x6B,0x69,0x67,0x65
-};
-
-
-
 /* Driver stuff */
-static unsigned XRes;
-static unsigned YRes;
+static unsigned MaxX;
+static unsigned MaxY;
+static unsigned AspectRatio;
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -66,41 +40,49 @@ static void CheckError (const char* S)
     unsigned char Error = tgi_geterror ();
     if (Error != TGI_ERR_OK) {
         printf ("%s: %d\n", S, Error);
+        if (doesclrscrafterexit ()) {
+            cgetc ();
+        }
         exit (EXIT_FAILURE);
     }
 }
 
 
+
+#if DYN_DRV
 static void DoWarning (void)
-/* Warn the user that the TGI driver is needed for this program */
+/* Warn the user that the dynamic TGI driver is needed for this program */
 {
     printf ("Warning: This program needs the TGI\n"
             "driver on disk! Press 'y' if you have\n"
             "it - any other key exits.\n");
-    if (cgetc () != 'y') {
+    if (tolower (cgetc ()) != 'y') {
         exit (EXIT_SUCCESS);
     }
-    printf ("Ok. Please wait patiently...\n");
+    printf ("OK. Please wait patiently...\n");
 }
+#endif
 
 
 
 static void DoCircles (void)
 {
-    static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_LIGHTRED };
+    static const unsigned char Palette[2] = { TGI_COLOR_WHITE, TGI_COLOR_ORANGE };
     unsigned char I;
-    unsigned char Color = 1;
+    unsigned char Color = COLOR_FORE;
+    unsigned X = MaxX / 2;
+    unsigned Y = MaxY / 2;
 
     tgi_setpalette (Palette);
     while (!kbhit ()) {
-        tgi_setcolor (1);
-        tgi_line (0, 0, 319, 199);
-        tgi_line (0, 199, 319, 0);
+        tgi_setcolor (COLOR_FORE);
+        tgi_line (0, 0, MaxX, MaxY);
+        tgi_line (0, MaxY, MaxX, 0);
         tgi_setcolor (Color);
         for (I = 10; I < 240; I += 10) {
-            tgi_circle (160, 100, I);
+            tgi_ellipse (X, Y, I, tgi_imulround (I, AspectRatio));
         }
-        Color ^= 0x01;
+        Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
     }
 
     cgetc ();
@@ -111,27 +93,27 @@ static void DoCircles (void)
 
 static void DoCheckerboard (void)
 {
-    static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
+    static const unsigned char Palette[2] = { TGI_COLOR_WHITE, TGI_COLOR_BLACK };
     unsigned X, Y;
     unsigned char Color;
 
     tgi_setpalette (Palette);
-    Color = 0;
+    Color = COLOR_BACK;
     while (1) {
-        for (Y = 0; Y < YRes; Y += 10) {
-            for (X = 0; X < XRes; X += 10) {
+        for (Y = 0; Y <= MaxY; Y += 10) {
+            for (X = 0; X <= MaxX; X += 10) {
                 tgi_setcolor (Color);
                 tgi_bar (X, Y, X+9, Y+9);
-                Color ^= 0x01;
+                Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
                 if (kbhit ()) {
                     cgetc ();
                     tgi_clear ();
                     return;
                 }
             }
-            Color ^= 0x01;
+            Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
         }
-        Color ^= 0x01;
+        Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
     }
 }
 
@@ -139,19 +121,40 @@ static void DoCheckerboard (void)
 
 static void DoDiagram (void)
 {
-    static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
-    unsigned X;
+    static const unsigned char Palette[2] = { TGI_COLOR_WHITE, TGI_COLOR_BLACK };
+    int XOrigin, YOrigin;
+    int Amp;
+    int X, Y;
+    unsigned I;
 
     tgi_setpalette (Palette);
-    tgi_setcolor (1);
-    tgi_line (10, 10, 10, 190);
-    tgi_lineto (310, 190);
-    tgi_line (8, 12, 10, 10);
-    tgi_lineto (12, 12);
-    tgi_line (308, 188, 310, 190);
-    tgi_lineto (308, 192);
-    for (X = 0; X < sizeof (SinusTable); ++X) {
-        tgi_setpixel (X+10, SinusTable[X]);
+    tgi_setcolor (COLOR_FORE);
+
+    /* Determine zero and aplitude */
+    YOrigin = MaxY / 2;
+    XOrigin = 10;
+    Amp     = (MaxY - 19) / 2;
+
+    /* Y axis */
+    tgi_line (XOrigin, 10, XOrigin, MaxY-10);
+    tgi_line (XOrigin-2, 12, XOrigin, 10);
+    tgi_lineto (XOrigin+2, 12);
+
+    /* X axis */
+    tgi_line (XOrigin, YOrigin, MaxX-10, YOrigin);
+    tgi_line (MaxX-12, YOrigin-2, MaxX-10, YOrigin);
+    tgi_lineto (MaxX-12, YOrigin+2);
+
+    /* Sine */
+    tgi_gotoxy (XOrigin, YOrigin);
+    for (I = 0; I <= 360; I += 5) {
+
+        /* Calculate the next points */
+        X = (int) (((long) (MaxX - 19) * I) / 360);
+        Y = (int) (((long) Amp * -_sin (I)) / 256);
+
+        /* Draw the line */
+        tgi_lineto (XOrigin + X, YOrigin + Y);
     }
 
     cgetc ();
@@ -159,41 +162,53 @@ static void DoDiagram (void)
 }
 
 
+
 static void DoLines (void)
 {
-    static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
+    static const unsigned char Palette[2] = { TGI_COLOR_WHITE, TGI_COLOR_BLACK };
     unsigned X;
 
     tgi_setpalette (Palette);
-    tgi_setcolor (1);
-    
-    for        (X = 0; X < 200; X+=10) {
-       tgi_line(0, 0, 200, X);
-       tgi_line(0, 0, X, 200);
-       tgi_line(200, 200, 0, 200-X);
-       tgi_line(200, 200, 200-X, 0);
+    tgi_setcolor (COLOR_FORE);
+
+    for (X = 0; X <= MaxY; X += 10) {
+        tgi_line (0, 0, MaxY, X);
+        tgi_line (0, 0, X, MaxY);
+        tgi_line (MaxY, MaxY, 0, MaxY-X);
+        tgi_line (MaxY, MaxY, MaxY-X, 0);
     }
-    
+
     cgetc ();
     tgi_clear ();
 }
 
+
+
 int main (void)
 {
     unsigned char Border;
 
+#if DYN_DRV
     /* Warn the user that the tgi driver is needed */
     DoWarning ();
 
     /* Load and initialize the driver */
-    tgi_load (TGI_MODE_320_200_2);
-    CheckError ("tgi_load");
-    tgi_init (TGI_MODE_320_200_2);
+    tgi_load_driver (tgi_stddrv);
+    CheckError ("tgi_load_driver");
+#else
+    /* Install the driver */
+    tgi_install (tgi_static_stddrv);
+    CheckError ("tgi_install");
+#endif
+
+    tgi_init ();
     CheckError ("tgi_init");
+    tgi_clear ();
 
     /* Get stuff from the driver */
-    XRes = tgi_getxres ();
-    YRes = tgi_getyres ();
+    MaxX = tgi_getmaxx ();
+    MaxY = tgi_getmaxy ();
+    AspectRatio = tgi_getaspectratio ();
 
     /* Set the palette, set the border color */
     Border = bordercolor (COLOR_BLACK);
@@ -204,11 +219,16 @@ int main (void)
     DoDiagram ();
     DoLines ();
 
+#if DYN_DRV
     /* Unload the driver */
     tgi_unload ();
+#else
+    /* Uninstall the driver */
+    tgi_uninstall ();
+#endif
 
     /* Reset the border */
-    bordercolor (Border);
+    (void) bordercolor (Border);
 
     /* Done */
     printf ("Done\n");