diff --git a/test/dots_termcap.c b/test/dots_termcap.c
index 9918e36..65786c4 100644
--- a/test/dots_termcap.c
+++ b/test/dots_termcap.c
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 2013 Free Software Foundation, Inc.                        *
+ * Copyright 2018-2022,2023 Thomas E. Dickey                                *
+ * Copyright 2013-2014,2017 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -29,14 +30,14 @@
 /*
  * Author: Thomas E. Dickey
  *
- * $Id: dots_termcap.c,v 1.8 2014/09/25 09:00:56 tom Exp $
+ * $Id: dots_termcap.c,v 1.32 2023/02/25 18:11:21 tom Exp $
  *
  * A simple demo of the termcap interface.
  */
 #define USE_TINFO
 #include <test.priv.h>
 
-#if !defined(__MINGW32__)
+#if !defined(_NC_WINDOWS)
 #include <sys/time.h>
 #endif
 
@@ -44,8 +45,6 @@
 
 #include <time.h>
 
-#define valid(s) ((s != 0) && s != (char *)-1)
-
 static bool interrupted = FALSE;
 static long total_chars = 0;
 static time_t started;
@@ -62,7 +61,7 @@
 static char *t_vi;
 
 static struct {
-    const char *name;
+    NCURSES_CONST char *name;
     char **value;
 } my_caps[] = {
 
@@ -116,7 +115,7 @@
 static bool
 outs(char *s)
 {
-    if (valid(s)) {
+    if (VALID_STRING(s)) {
 	tputs(s, 1, outc);
 	return TRUE;
     }
@@ -132,9 +131,10 @@
     outs(t_cl);
     outs(t_ve);
 
-    printf("\n\n%ld total chars, rate %.2f/sec\n",
-	   total_chars,
-	   ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
 }
 
 static void
@@ -150,41 +150,129 @@
     return ((double) r / 32768.);
 }
 
+/*
+ * napms is a curses function which happens to be usable without initializing
+ * the screen, but if this program happened to be build with a "real" termcap
+ * library, there is nothing like napms. 
+ */
+#if HAVE_NAPMS
+#define my_napms(ms) napms(ms)
+#else
 static void
 my_napms(int ms)
 {
-#if defined(__MINGW32__) || !HAVE_GETTIMEOFDAY
-    Sleep((DWORD) ms);
+    if (ms > 0) {
+#if defined(_NC_WINDOWS)
+	Sleep((unsigned int) ms);
 #else
-    struct timeval data;
-    data.tv_sec = 0;
-    data.tv_usec = ms * 1000;
-    select(0, NULL, NULL, NULL, &data);
+	struct timeval data;
+	data.tv_sec = 0;
+	data.tv_usec = ms * 1000;
+	select(0, NULL, NULL, NULL, &data);
 #endif
+    }
+}
+#endif
+
+static int
+get_number(NCURSES_CONST char *cap, const char *env)
+{
+    int result = tgetnum(cap);
+    char *value = env ? getenv(env) : 0;
+    if (value != 0 && *value != 0) {
+	char *next = 0;
+	long check = strtol(value, &next, 10);
+	if (check > 0 && *next == '\0')
+	    result = (int) check;
+    }
+    return result;
 }
 
-int
-main(int argc GCC_UNUSED,
-     char *argv[]GCC_UNUSED)
+static void
+usage(int ok)
 {
-    int x, y, z, p;
+    static const char *msg[] =
+    {
+	"Usage: dots_termcap [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+	," -e       allow environment $LINES / $COLUMNS"
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
     int num_colors;
     int num_lines;
     int num_columns;
+    int e_option = 0;
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
     double r;
     double c;
     char buffer[1024];
     char area[1024];
     char *name;
+    size_t need;
+    char *my_env;
 
-    CATCHALL(onsig);
-
-    srand((unsigned) time(0));
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:em:r:s:")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    if ((my_env = malloc(need)) != NULL) {
+		_nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+		putenv(my_env);
+	    }
+	    break;
+	case 'e':
+	    e_option = 1;
+	    break;
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
 
     if ((name = getenv("TERM")) == 0) {
 	fprintf(stderr, "TERM is not set\n");
 	ExitProgram(EXIT_FAILURE);
-    } else if (tgetent(buffer, name) < 0) {
+    }
+
+    srand((unsigned) time(0));
+
+    SetupAlarm((unsigned) r_option);
+    InitAndCatch(ch = tgetent(buffer, name), onsig);
+    if (ch < 0) {
 	fprintf(stderr, "terminal description not found\n");
 	ExitProgram(EXIT_FAILURE);
     } else {
@@ -197,43 +285,46 @@
     }
 
     num_colors = tgetnum("Co");
-    num_lines = tgetnum("li");
-    num_columns = tgetnum("co");
+#define GetNumber(cap,env) get_number(cap, e_option ? env : 0)
+    num_lines = GetNumber("li", "LINES");
+    num_columns = GetNumber("co", "COLUMNS");
 
     outs(t_cl);
     outs(t_vi);
     if (num_colors > 1) {
-	if (!valid(t_AF)
-	    || !valid(t_AB)
-	    || (!valid(t_oc) && !valid(t_op)))
+	if (!VALID_STRING(t_AF)
+	    || !VALID_STRING(t_AB)
+	    || (!VALID_STRING(t_oc) && !VALID_STRING(t_op)))
 	    num_colors = -1;
     }
 
-    r = (double) (num_lines - 4);
-    c = (double) (num_columns - 4);
+    r = (double) (num_lines - (2 * m_option));
+    c = (double) (num_columns - (2 * m_option));
     started = time((time_t *) 0);
 
     while (!interrupted) {
-	x = (int) (c * ranf()) + 2;
-	y = (int) (r * ranf()) + 2;
-	p = (ranf() > 0.9) ? '*' : ' ';
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
 
 	tputs(tgoto(t_cm, x, y), 1, outc);
 	if (num_colors > 0) {
-	    z = (int) (ranf() * num_colors);
+	    int z = (int) (ranf() * num_colors);
 	    if (ranf() > 0.01) {
 		tputs(tgoto(t_AF, 0, z), 1, outc);
 	    } else {
 		tputs(tgoto(t_AB, 0, z), 1, outc);
-		my_napms(1);
+		if (s_option)
+		    my_napms(s_option);
 	    }
-	} else if (valid(t_me)
-		   && valid(t_mr)) {
+	} else if (VALID_STRING(t_me)
+		   && VALID_STRING(t_mr)) {
 	    if (ranf() <= 0.01) {
 		outs((ranf() > 0.6)
 		     ? t_mr
 		     : t_me);
-		my_napms(1);
+		if (s_option)
+		    my_napms(s_option);
 	    }
 	}
 	outc(p);
@@ -245,8 +336,7 @@
 }
 #else
 int
-main(int argc GCC_UNUSED,
-     char *argv[]GCC_UNUSED)
+main(void)
 {
     fprintf(stderr, "This program requires termcap\n");
     exit(EXIT_FAILURE);
