X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=samples%2Fmousedemo.c;h=d1b48e9eec571be8928482f12e2d4a696ffcd153;hb=2eac69a94361323bf7556d2cdde8f61c85c5ef99;hp=6f0825e6a89ed3458796d1fda3899fcd96a1bf3d;hpb=895779d6129f3edf337d2bcfc795f78ada831821;p=cc65 diff --git a/samples/mousedemo.c b/samples/mousedemo.c index 6f0825e6a..d1b48e9ee 100644 --- a/samples/mousedemo.c +++ b/samples/mousedemo.c @@ -1,221 +1,284 @@ /* - * Demo program for mouse usage. Will work for the C64/C128/CBM510/Atari/Apple2 - * - * Ullrich von Bassewitz, 13.09.2001 - * - */ +** Demo program for mouse usage. +** Supports the C64/C128/CBM510/Atari/Apple2. +** +** 2001-09-13, Ullrich von Bassewitz +** 2013-09-05, Greg King +** +*/ +#include #include #include #include +#include #include #include #include +#include +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) -#if defined(__C64__) || defined(__C128__) -/* Address of data for sprite 0 */ -#if defined(__C64__) -# define SPRITE0_DATA 0x0340 -# define SPRITE0_PTR 0x07F8 -#elif defined(__C128__) -# define SPRITE0_DATA 0x0E00 -# define SPRITE0_PTR 0x07F8 +#ifdef MOUSE_DRIVER + +/* A statically linked driver was named on the compiler's command line. +** Make sure that it is used instead of a dynamic one. +*/ +# undef DYN_DRV +# define DYN_DRV 0 +#else + +/* Use a dynamically loaded driver, by default. */ +# ifndef DYN_DRV +# define DYN_DRV 1 +# endif #endif -/* The mouse sprite (an arrow) */ -static const unsigned char MouseSprite[64] = { - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x0F, 0xE0, 0x00, - 0x0F, 0xC0, 0x00, - 0x0F, 0x80, 0x00, - 0x0F, 0xC0, 0x00, - 0x0D, 0xE0, 0x00, - 0x08, 0xF0, 0x00, - 0x00, 0x78, 0x00, - 0x00, 0x3C, 0x00, - 0x00, 0x1E, 0x00, - 0x00, 0x0F, 0x00, - 0x00, 0x07, 0x80, - 0x00, 0x03, 0x80, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00 -}; - -#endif /* __C64__ or __C128__ */ -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#define min(a,b) (((a) < (b)) ? (a) : (b)) +#ifdef __CBM__ +/* Set dark-on-light colors. */ +const unsigned char mouse_def_pointercolor = COLOR_BLACK; + +#endif -static void CheckError (const char* S, unsigned char Error) + +static void __fastcall__ CheckError (const char* S, unsigned char Error) { if (Error != MOUSE_ERR_OK) { - cprintf ("%s: %s(%d)\r\n", S, mouse_geterrormsg (Error), Error); + cprintf ("\n%s: %s(%u)\r\n", S, mouse_geterrormsg (Error), Error); + + /* Wait for a key-press, so that some platforms can show the error + ** message before they remove the current screen. + */ + if (doesclrscrafterexit ()) { + cgetc (); + } exit (EXIT_FAILURE); } } +#if DYN_DRV + +/* Points to the dynamic driver's name. */ +static const char *mouse_name; + + + static void DoWarning (void) -/* Warn the user that a mouse driver is needed for this program */ +/* Warn the user that a driver is needed for this program. */ { - cprintf ("Warning: This program needs the mouse\r\n" - "driver with the name\r\n" + cprintf ("Warning: This program needs\r\n" + "the driver with the name\r\n" " %s\r\n" - "on disk! Press 'y' if you have it or\r\n" - "any other key to exit.\r\n", mouse_stddrv); + "on a disk! Press 'y' if you have it;\r\n" + "or, any other key to exit.\r\n", mouse_stddrv); if (tolower (cgetc ()) != 'y') { exit (EXIT_SUCCESS); } - cprintf ("Ok. Please wait patiently...\r\n"); + cprintf ("OK. Please wait patiently...\r\n"); } +#endif -static void ShowState (unsigned char Jailed, unsigned char Invisible) -/* Display jail and cursor state */ +static void __fastcall__ ShowState (unsigned char Jailed, unsigned char Invisible) +/* Display jail and cursor states. */ { - gotoxy (0, 6); - cclear (40); - gotoxy (0, 6); - cprintf ("Mouse cursor %svisible%s", Invisible? "in" : "", Jailed? ", jailed" : ""); + cclearxy (0, 7, 32); + gotoxy (0, 7); + cprintf ("Pointer is %svisible%s.", Invisible? "in" : "", Jailed? " and jailed" : ""); } +#if DYN_DRV +int main (int argc, char *argv[]) +#else int main (void) +#endif { struct mouse_info info; - struct mouse_box full_box; - struct mouse_box small_box; - unsigned char Invisible; - unsigned char Done; - unsigned char Jailed; + struct mouse_box full_box, small_box; + unsigned char width, height; + char C; + bool Invisible = true, Done = false, Jailed = false; /* Initialize the debugger */ DbgInit (0); - /* Clear the screen, set white on black */ - (void) bordercolor (COLOR_BLACK); - (void) bgcolor (COLOR_BLACK); - (void) textcolor (COLOR_GRAY3); + /* Set dark-on-light colors. Clear the screen. */ +#ifdef __CBM__ + (void) bordercolor (COLOR_GRAY2); + (void) bgcolor (COLOR_WHITE); + (void) textcolor (COLOR_GRAY1); +#else + (void) bordercolor (COLOR_BLUE); + (void) bgcolor (COLOR_WHITE); + (void) textcolor (COLOR_BLACK); +#endif cursor (0); clrscr (); + /* If a lightpen driver is installed, then it can get a calibration value + ** from this file (if it exists). Or, the user can adjust the pen; and, + ** the value will be put into this file, for the next time. + ** (Other drivers will ignore this.) + */ #if defined(__C64__) || defined(__C128__) || defined(__CBM510__) - /* Copy the sprite data */ - memcpy ((void*) SPRITE0_DATA, MouseSprite, sizeof (MouseSprite)); + pen_adjust ("pen.dat"); +#endif - /* Set the VIC sprite pointer */ - *(unsigned char*)SPRITE0_PTR = SPRITE0_DATA / 64; +#if DYN_DRV + /* If a dynamically loadable driver is named on the command line, + ** then use that driver instead of the standard one. + */ + if (argc > 1) { + mouse_name = argv[1]; + } else { + /* Output a warning about the standard driver that is needed. */ + DoWarning (); + mouse_name = mouse_stddrv; + } - /* Set the color of sprite 0 */ -#ifdef __CBM510__ - pokebsys ((unsigned) &VIC.spr0_color, COLOR_WHITE); + /* Load and install the driver. */ + CheckError ("mouse_load_driver", + mouse_load_driver (&mouse_def_callbacks, mouse_name)); #else - VIC.spr0_color = COLOR_WHITE; + /* Install the driver. */ + CheckError ("mouse_install", + mouse_install (&mouse_def_callbacks, +# ifdef MOUSE_DRIVER + MOUSE_DRIVER +# else + mouse_static_stddrv +# endif + )); #endif -#endif - - /* Output a warning about the driver that is needed */ - DoWarning (); + /* Get the initial bounding box. */ + mouse_getbox (&full_box); - /* Load and install the mouse driver */ - CheckError ("mouse_load_driver", - mouse_load_driver (&mouse_def_callbacks, mouse_stddrv)); + screensize (&width, &height); - /* Get the initial mouse bounding box */ - mouse_getbox (&full_box); +top: + clrscr (); /* Print a help line */ - clrscr (); - revers (1); - cputsxy (0, 0, "d)ebug h)ide q)uit s)how j)ail "); - revers (0); + cputs (" d)ebug h)ide q)uit s)how j)ail"); + + /* Put a cross at the center of the screen. */ + gotoxy (width / 2 - 3, height / 2 - 1); +#if defined(__CBM__) + cprintf ("%3u,%3u\r\n%*s\xDB", width / 2 * 8 + 4, height / 2 * 8 + 4, + width / 2, ""); +#else + cprintf ("%3u,%3u\r\n%*s+", width / 2 * 8 + 4, height / 2 * 8 + 4, + width / 2, ""); +#endif /* Test loop */ - Done = 0; - Jailed = 0; - Invisible = 1; ShowState (Jailed, Invisible); - while (!Done) { - - /* Get the current mouse coordinates and button states and print them */ + do { + /* Get the current co-ordinates and button states; and, print them. */ mouse_info (&info); gotoxy (0, 2); - cprintf ("X = %3d", info.pos.x); - gotoxy (0, 3); - cprintf ("Y = %3d", info.pos.y); - gotoxy (0, 4); - cprintf ("LB = %c", (info.buttons & MOUSE_BTN_LEFT)? '1' : '0'); - gotoxy (0, 5); - cprintf ("RB = %c", (info.buttons & MOUSE_BTN_RIGHT)? '1' : '0'); + cprintf (" X = %3d\r\n", info.pos.x); + cprintf (" Y = %3d\r\n", info.pos.y); + cprintf (" B1 = %c\r\n", (info.buttons & MOUSE_BTN_LEFT) ? +#ifdef __CBM__ + 0x5F +#else + 'v' +#endif + : '^'); + cprintf (" B2 = %c", (info.buttons & MOUSE_BTN_RIGHT) ? +#ifdef __CBM__ + 0x5F +#else + 'v' +#endif + : '^'); /* Handle user input */ if (kbhit ()) { - switch (tolower (cgetc ())) { - + cclearxy (1, 9, 23); + switch (tolower (C = cgetc ())) { case 'd': BREAK(); - break; + + /* The debugger might have changed the colors. + ** Restore them. + */ +#ifdef __CBM__ + (void) bordercolor (COLOR_GRAY2); + (void) bgcolor (COLOR_WHITE); + (void) textcolor (COLOR_GRAY1); +#else + (void) bordercolor (COLOR_BLUE); + (void) bgcolor (COLOR_WHITE); + (void) textcolor (COLOR_BLACK); +#endif + + /* The debugger changed the screen; restore it. */ + goto top; case 'h': - ShowState (Jailed, ++Invisible); mouse_hide (); + ShowState (Jailed, ++Invisible); break; case 'j': if (Jailed) { - Jailed = 0; mouse_setbox (&full_box); + Jailed = false; } else { - Jailed = 1; small_box.minx = max (info.pos.x - 10, full_box.minx); small_box.miny = max (info.pos.y - 10, full_box.miny); small_box.maxx = min (info.pos.x + 10, full_box.maxx); small_box.maxy = min (info.pos.y + 10, full_box.maxy); mouse_setbox (&small_box); + Jailed = true; } ShowState (Jailed, Invisible); break; case 's': + mouse_show (); if (Invisible) { ShowState (Jailed, --Invisible); - mouse_show (); } break; case 'q': - Done = 1; + Done = true; break; + + default: + gotoxy (1, 9); + cprintf ("Spurious character: $%02X", C); } } + } while (!Done); - } - - /* Uninstall and unload the mouse driver */ +#if DYN_DRV + /* Uninstall and unload the driver. */ CheckError ("mouse_unload", mouse_unload ()); +#else + /* Uninstall the static driver. */ + CheckError ("mouse_uninstall", mouse_uninstall ()); +#endif /* Say goodbye */ - clrscr (); - cputs ("Goodbye!\r\n"); - + cputsxy (0, height / 2 + 3, "Goodbye!"); return EXIT_SUCCESS; }