diff options
author | des <des@FreeBSD.org> | 1998-12-27 22:03:09 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 1998-12-27 22:03:09 +0000 |
commit | 3b7e907f0217c81f191e3f8317273fe54c39317d (patch) | |
tree | 05aded9211959991202ecfceb9e043196bb1f3c9 /sys/dev/syscons | |
parent | c7ecc129d72ba32b5d83c9a6019e93fd181d719c (diff) | |
download | FreeBSD-src-3b7e907f0217c81f191e3f8317273fe54c39317d.zip FreeBSD-src-3b7e907f0217c81f191e3f8317273fe54c39317d.tar.gz |
Finally give FreeBSD a graphical screensaver. It isn't much, but it works,
and can serve as a template for further efforts. Consider this my (belated)
Christmas present to the Project :)
Requested by: jkh
Diffstat (limited to 'sys/dev/syscons')
-rw-r--r-- | sys/dev/syscons/warp/warp_saver.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/sys/dev/syscons/warp/warp_saver.c b/sys/dev/syscons/warp/warp_saver.c new file mode 100644 index 0000000..138b8d4 --- /dev/null +++ b/sys/dev/syscons/warp/warp_saver.c @@ -0,0 +1,141 @@ +/*- + * Copyright (c) 1998 Dag-Erling Coïdan Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id$ + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/syslog.h> + +#include <machine/md_var.h> +#include <machine/random.h> + +#include <saver.h> + +static u_char *vid; + +#define SCRW 320 +#define SCRH 200 +#define SPP 15 +#define STARS (SPP*(1+2+4+8)) + +static int star[STARS]; +static u_char warp_pal[768] = { + 0x00, 0x00, 0x00, + 0x66, 0x66, 0x66, + 0x99, 0x99, 0x99, + 0xcc, 0xcc, 0xcc, + 0xff, 0xff, 0xff + /* the rest is zero-filled by the compiler */ +}; + +static void +warp_update(void) +{ + int i, j, k, n; + + for (i = k = 1, n = SPP*8; i < 5; i++, n /= 2) + for (j = 0; j < n; j++, k++) { + vid[star[k]] = 0; + star[k] += i; + if (star[k] > SCRW*SCRH) + star[k] -= SCRW*SCRH; + vid[star[k]] = i; + } +} + +static void +warp_saver(int blank) +{ + scr_stat *scp = cur_console; + static int saved_mode; + int pl; + + if (blank) { + /* switch to graphics mode */ + if (scrn_blanked <= 0) { + pl = splhigh(); + saved_mode = scp->mode; + scp->mode = M_VGA_CG320; + scp->status |= SAVER_RUNNING|GRAPHICS_MODE; + set_mode(scp); + scrn_blanked++; + vid = (u_char *)Crtat; + load_palette(scp, (char *)warp_pal); + splx(pl); + bzero(vid, SCRW*SCRH); + } + + /* update display */ + warp_update(); + + } else { + /* return to previous video mode */ + if (scrn_blanked > 0) { + if (saved_mode) { + pl = splhigh(); + scrn_blanked = 0; + scp->mode = saved_mode; + scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); + set_mode(scp); + saved_mode = 0; + splx(pl); + } + } + } +} + +static int +warp_saver_load(void) +{ + video_info_t info; + int i; + + /* check that the console is capable of running in 320x200x256 */ + if ((*biosvidsw.get_info)(cur_console->adp, M_VGA_CG320, &info)) { + log(LOG_NOTICE, "warp_saver: the console does not support M_VGA_CG320\n"); + return ENODEV; + } + + /* randomize the star field */ + for (i = 0; i < STARS; i++) { + star[i] = random() % (SCRW*SCRH); + } + + return add_scrn_saver(warp_saver); +} + +static int +warp_saver_unload(void) +{ + return remove_scrn_saver(warp_saver); +} + +SAVER_MODULE(warp_saver); |