xref: /freebsd/sys/dev/syscons/star/star_saver.c (revision 380a989b3223d455375b4fae70fd0b9bdd43bafb)
1 /*-
2  * Copyright (c) 1995-1998 S�ren Schmidt
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer,
10  *    without modification, immediately at the beginning of the file.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  *	$Id: star_saver.c,v 1.16 1998/09/17 19:40:30 sos Exp $
29  */
30 
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/module.h>
35 
36 #include <machine/md_var.h>
37 #include <machine/pc/display.h>
38 
39 #include <saver.h>
40 
41 #define NUM_STARS	50
42 
43 static u_short *window;
44 
45 /*
46  * Alternate saver that got its inspiration from a well known utility
47  * package for an inferior^H^H^H^H^H^Hfamous OS.
48  */
49 static void
50 star_saver(int blank)
51 {
52 	scr_stat	*scp = cur_console;
53 	int		cell, i;
54 	char 		pattern[] = {"...........++++***   "};
55 	char		colors[] = {FG_DARKGREY, FG_LIGHTGREY,
56 				    FG_WHITE, FG_LIGHTCYAN};
57 	static u_short 	stars[NUM_STARS][2];
58 
59 	if (blank) {
60 		if (!ISTEXTSC(scp))
61 			return;
62 		if (scrn_blanked <= 0) {
63 			scp->status |= SAVER_RUNNING;
64 			window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window;
65 			scrn_blanked = 1;
66 			fillw((FG_LIGHTGREY|BG_BLACK)<<8|scr_map[0x20], window,
67 			      scp->xsize * scp->ysize);
68 			set_border(scp, 0);
69 			for(i=0; i<NUM_STARS; i++) {
70 				stars[i][0] =
71 					random() % (scp->xsize*scp->ysize);
72 				stars[i][1] = 0;
73 			}
74 		}
75 		cell = random() % NUM_STARS;
76 		*((u_short*)(window + stars[cell][0])) =
77 			scr_map[pattern[stars[cell][1]]] |
78 				colors[random()%sizeof(colors)] << 8;
79 		if ((stars[cell][1]+=(random()%4)) >= sizeof(pattern)-1) {
80 			stars[cell][0] = random() % (scp->xsize*scp->ysize);
81 			stars[cell][1] = 0;
82 		}
83 	}
84 	else {
85 		if (scrn_blanked > 0) {
86 			set_border(scp, scp->border);
87 			scrn_blanked = 0;
88 			scp->status &= ~SAVER_RUNNING;
89 		}
90 	}
91 }
92 
93 static int
94 star_saver_load(void)
95 {
96 	return add_scrn_saver(star_saver);
97 }
98 
99 static int
100 star_saver_unload(void)
101 {
102 	return remove_scrn_saver(star_saver);
103 }
104 
105 SAVER_MODULE(star_saver);
106