#include <stdio.h>
#include <stdlib.h>
+#include <cc65.h>
#include <conio.h>
#include <ctype.h>
#include <modload.h>
-#if defined(__APPLE2__) || defined(__APPLE2ENH__)
-# define TGI_MODE TGI_MODE_280_192_8
-#else
-# define TGI_MODE TGI_MODE_320_200_2
+#ifndef DYN_DRV
+# define DYN_DRV 1
#endif
-#define COLOR_BACK COLOR_BLACK
-#define COLOR_FORE COLOR_WHITE
+
+#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,0x0B,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,0xBD,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 MaxX;
static unsigned MaxY;
+static unsigned AspectRatio;
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
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"
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_ORANGE };
+ static const unsigned char Palette[2] = { TGI_COLOR_WHITE, TGI_COLOR_ORANGE };
unsigned char I;
unsigned char Color = COLOR_FORE;
unsigned X = MaxX / 2;
tgi_line (0, MaxY, MaxX, 0);
tgi_setcolor (Color);
for (I = 10; I < 240; I += 10) {
- tgi_circle (X, Y, I);
+ tgi_ellipse (X, Y, I, tgi_imulround (I, AspectRatio));
}
- Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
+ Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
}
cgetc ();
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;
for (X = 0; X <= MaxX; X += 10) {
tgi_setcolor (Color);
tgi_bar (X, Y, X+9, Y+9);
- Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
+ Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
if (kbhit ()) {
cgetc ();
tgi_clear ();
return;
}
}
- Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
+ Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
}
- Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
+ Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
}
}
static void DoDiagram (void)
{
- static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_BLACK };
- unsigned X, I;
+ 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 (COLOR_FORE);
- tgi_line (10, 10, 10, MaxY-10);
- tgi_lineto (MaxX-10, MaxY-10);
- tgi_line (8, 12, 10, 10);
- tgi_lineto (12, 12);
- tgi_line (MaxX-12, MaxY-12, MaxX-10, MaxY-10);
- tgi_lineto (MaxX-12, MaxY-8);
- for (I = 0, X = 10; X < MaxX-10; ++X) {
- tgi_setpixel (X, SinusTable[I]);
- if (++I >= sizeof (SinusTable)) {
- I = 0;
- }
+
+ /* 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 * -cc65_sin (I)) / 256);
+
+ /* Draw the line */
+ tgi_lineto (XOrigin + X, YOrigin + Y);
}
cgetc ();
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 (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);
+ 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 ();
{
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);
- CheckError ("tgi_load");
+ 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 */
MaxX = tgi_getmaxx ();
MaxY = tgi_getmaxy ();
+ AspectRatio = tgi_getaspectratio ();
/* Set the palette, set the border color */
Border = bordercolor (COLOR_BLACK);
DoDiagram ();
DoLines ();
+#if DYN_DRV
/* Unload the driver */
tgi_unload ();
+#else
+ /* Uninstall the driver */
+ tgi_uninstall ();
+#endif
/* Reset the border */
(void) bordercolor (Border);