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:
parent
e65719bf98
commit
dc977737aa
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user