]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/syscons/warp/warp_saver.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / syscons / warp / warp_saver.c
1 /*-
2  * Copyright (c) 1998 Dag-Erling Coïdan Smørgrav
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  *    in this position and unchanged.
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  * $FreeBSD$
29  */
30
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/module.h>
35 #include <sys/syslog.h>
36 #include <sys/consio.h>
37 #include <sys/fbio.h>
38
39 #include <dev/fb/fbreg.h>
40 #include <dev/fb/splashreg.h>
41 #include <dev/syscons/syscons.h>
42
43 #define SAVER_NAME       "warp_saver"
44 #define SPP              15
45 #define STARS            (SPP * (1 + 2 + 4 + 8))
46
47 #define SET_ORIGIN(adp, o) do {                         \
48         int oo = o;                                     \
49         if (oo != last_origin)                          \
50             vidd_set_win_org(adp, last_origin = oo);            \
51         } while (0)
52
53 static u_char           *vid;
54 static int               banksize, scrmode, bpsl, scrw, scrh;
55 static int               blanked;
56 static int               star[STARS];
57 static u_char            warp_pal[768] = {
58         0x00, 0x00, 0x00,
59         0x66, 0x66, 0x66,
60         0x99, 0x99, 0x99,
61         0xcc, 0xcc, 0xcc,
62         0xff, 0xff, 0xff
63         /* the rest is zero-filled by the compiler */
64 };
65
66 static void
67 warp_update(video_adapter_t *adp)
68 {
69         int i, j, k, n, o, p;
70         int last_origin = -1;
71
72         for (i = 1, k = 0, n = SPP*8; i < 5; i++, n /= 2) {
73                 for (j = 0; j < n; j++, k++) {
74                         p = (star[k] / scrw) *  bpsl + (star[k] % scrw);
75                         o = 0;
76                         while (p > banksize) {
77                                 p -= banksize;
78                                 o += banksize;
79                         }
80                         SET_ORIGIN(adp, o);
81                         vid[p] = 0;
82                         star[k] += i;
83                         if (star[k] > scrw*scrh)
84                                 star[k] -= scrw*scrh;
85                         p = (star[k] / scrw) *  bpsl + (star[k] % scrw);
86                         o = 0;
87                         while (p > banksize) {
88                                 p -= banksize;
89                                 o += banksize;
90                         }
91                         SET_ORIGIN(adp, o);
92                         vid[p] = i;
93                 }
94         }
95 }
96
97 static int
98 warp_saver(video_adapter_t *adp, int blank)
99 {
100         int pl;
101         
102         if (blank) {
103                 /* switch to graphics mode */
104                 if (blanked <= 0) {
105                         pl = splhigh();
106                         vidd_set_mode(adp, scrmode);
107                         vidd_load_palette(adp, warp_pal);
108                         vidd_set_border(adp, 0);
109                         blanked++;
110                         vid = (u_char *)adp->va_window;
111                         banksize = adp->va_window_size;
112                         bpsl = adp->va_line_width;
113                         splx(pl);
114                         vidd_clear(adp);
115                 }
116                 /* update display */
117                 warp_update(adp);
118         } else {
119                 blanked = 0;
120         }
121         return (0);
122 }
123
124 static int
125 warp_init(video_adapter_t *adp)
126 {
127         video_info_t info;
128         int i;
129         
130         if (!vidd_get_info(adp, M_VGA_CG320, &info)) {
131                 scrmode = M_VGA_CG320;
132         } else if (!vidd_get_info(adp, M_PC98_PEGC640x480, &info)) {
133                 scrmode = M_PC98_PEGC640x480;
134         } else if (!vidd_get_info(adp, M_PC98_PEGC640x400, &info)) {
135                 scrmode = M_PC98_PEGC640x400;
136         } else {
137                 log(LOG_NOTICE,
138                     "%s: the console does not support M_VGA_CG320\n",
139                     SAVER_NAME);
140                 return (ENODEV);
141         }
142         
143         scrw = info.vi_width;
144         scrh = info.vi_height;
145
146         /* randomize the star field */
147         for (i = 0; i < STARS; i++)
148                 star[i] = random() % (scrw * scrh);
149         
150         return (0);
151 }
152
153 static int
154 warp_term(video_adapter_t *adp)
155 {
156         return (0);
157 }
158
159 static scrn_saver_t warp_module = {
160         SAVER_NAME,
161         warp_init,
162         warp_term,
163         warp_saver,
164         NULL
165 };
166
167 SAVER_MODULE(warp_saver, warp_module);