1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-26 17:36:57 +00:00

Patch contributed by Greg King:

1. Implements a real progress bar.
2. Decomposes the timer's result.


git-svn-id: svn://svn.cc65.org/cc65/trunk@4496 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2009-12-02 15:15:49 +00:00
parent e65719bf98
commit dc977737aa

View File

@ -1,23 +1,48 @@
/* mul-test.c -- Test the multiplication operator. */
#include <time.h> #include <time.h>
#include <conio.h> #include <conio.h>
#include <ctype.h> #include <ctype.h>
/* Number of elements in the progress bar. Use a power of 2 to avoid the /* Number of elements in the progress bar. Use a power of 2, to avoid the
* multiplication (which is about to be tested). * multiplication (which is about to be tested).
*/ */
#define BAR_ELEMENTS 32U #define BAR_ELEMENTS 32U
/* Screen coordinates for the progress meter */ #if defined(__CBM__)
static const unsigned char revers_bar[8] = {
0, 0, 0, 0, 0, 1, 1, 1
};
static const unsigned char small_bar[8] = {
' ', 0xa5, 0xb4, 0xb5, 0xa1, 0xb6, 0xaa, 0xa7
};
#elif defined(__ATARI__)
#endif
/* Screen co-ordinates for the progress meter */
static unsigned char Width, Height; static unsigned char Width, Height;
static unsigned char X, Y; static unsigned char X, Y;
static void ProgressMeter (unsigned Val) static void ProgressMeter (unsigned Val)
/* Print the progress bar */ /* Print the progress bar. */
{ {
cclearxy (X, Y, Width);
gotoxy (X, Y); gotoxy (X, Y);
cprintf ("% 6lu/65536", (unsigned long) Val); cprintf (" %5lu/65536\r\n", (unsigned long) Val);
revers (1);
cclear (Val / (unsigned)(65536U / BAR_ELEMENTS));
/* Commodore and Atari computers can show eight times greater precision. */
#if defined(__CBM__)
Val = (Val / (unsigned)(65536U / BAR_ELEMENTS / 8)) % 8;
revers (revers_bar[Val]);
cputc (small_bar[Val]);
#elif defined(__ATARI__)
#endif
revers (0);
} }
@ -26,8 +51,12 @@ int main(void)
{ {
char C; char C;
/* Clock variable */ /* Clock variables */
clock_t Ticks; clock_t Ticks;
clock_t Wait;
unsigned Days;
unsigned Hours;
unsigned Minu;
unsigned Sec; unsigned Sec;
unsigned Milli; unsigned Milli;
@ -36,59 +65,109 @@ int main(void)
register unsigned rhs = 0; register unsigned rhs = 0;
register unsigned res; register unsigned res;
/* Clear the screen and output an informational message */ /* Clear the screen, and output an informational message. */
clrscr (); clrscr ();
screensize (&Width, &Height); screensize (&Width, &Height);
cprintf ("This program does an exhaustive test of\r\n" cprintf ("This program does an exhaustive test of\r\n"
"the multiplication routine. It runs\r\n" "the multiplication routine. It runs for\r\n"
"several days, so please wait very\r\n" "several days; so, please wait very\r\n"
"patiently (or speedup your emulator)\r\n" "patiently (or, speed up your emulator).\r\n"
"\r\n" "\n"
"Progress:\r\n"); "Progress: ");
/* Remember the current position for the progress bar */ /* Remember the current position for the progress bar */
X = wherex (); X = wherex ();
Y = wherey (); Y = wherey ();
/* Mark the maximum limit of the bar. */
revers (1);
cputcxy (BAR_ELEMENTS, Y, ' ');
cputcxy (BAR_ELEMENTS, Y + 1, ' ');
revers (0);
/* Read the clock */ /* [Targets that have clock() will define CLOCKS_PER_SEC.] */
#ifdef CLOCKS_PER_SEC
/* Start timing the test. */
Ticks = clock(); Ticks = clock();
#endif
do { do {
/* Update the progress bar */ /* Update the progress bar */
ProgressMeter (lhs); ProgressMeter (lhs);
/* Enable this to test the progress-meter code.
** (And, run emulators at their maximun speed.)
*/
#if 0
continue;
#endif
/* Do one row of tests */ /* Do one row of tests */
res = 0; res = 0;
do { do {
if (lhs * rhs != res) { if (lhs * rhs != res) {
gotoxy (X, Y+1); #ifdef CLOCKS_PER_SEC
Wait = clock ();
#endif
gotoxy (0, Y+3);
cprintf ("Error on %u * %u: %u != %u\r\n", lhs, rhs, lhs * rhs, res); cprintf ("Error on %u * %u: %u != %u\r\n", lhs, rhs, lhs * rhs, res);
cprintf ("Press a key ..., 'Q' to quit"); cprintf ("Press a key -- 'Q' to quit. ");
cursor (1);
C = toupper (cgetc ()); C = toupper (cgetc ());
cclearxy (X, Y+1, Width); cclearxy (0, Y+3, Width);
cclearxy (X, Y+2, Width); cclearxy (0, Y+4, Width);
#ifdef CLOCKS_PER_SEC
/* Don't time the user's interaction. */
Ticks += clock () - Wait;
#endif
if (C == 'Q') { if (C == 'Q') {
goto Done; goto Done;
} }
} }
if (kbhit () && toupper (cgetc ()) == 'Q') {
goto Done;
}
res += lhs; res += lhs;
} while (++rhs != 0); } while (++rhs != 0);
} while (++lhs != 0); } while (++lhs != 0);
Done: Done:
#ifdef CLOCKS_PER_SEC
/* Calculate the time used */ /* Calculate the time used */
Ticks = clock() - Ticks; Ticks = clock() - Ticks;
Sec = (unsigned) (Ticks / CLOCKS_PER_SEC);
Milli = ((Ticks % CLOCKS_PER_SEC) * 1000) / CLOCKS_PER_SEC; Milli = ((Ticks % CLOCKS_PER_SEC) * 1000) / CLOCKS_PER_SEC;
Sec = (unsigned) (Ticks / CLOCKS_PER_SEC);
Minu = Sec / 60;
Hours = Minu / 60;
Days = Hours / 24;
Hours %= 24;
Minu %= 60;
Sec %= 60;
/* Print the time used */ /* Print the time used */
gotoxy (X, Y+1); gotoxy (0, Y+3);
cprintf ("Time used: %u.%03u seconds\n", Sec, Milli); cprintf ("Time used:\r\n"
" %u days,\r\n"
" %u hours,\r\n"
" %u minutes,\r\n"
" %u.%03u seconds.\n", Days, Hours, Minu, Sec, Milli);
#endif
#ifdef __ATARI__
if (_dos_type != SPARTADOS && _dos_type != OSADOS) {
cprintf ("\rTap a key, to exit. ");
cgetc();
}
#endif
return 0; return 0;
} }