1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
--- plasma_saver.c.orig 2001-01-24 12:03:23.000000000 -0500
+++ plasma_saver.c 2012-04-18 17:51:10.000000000 -0400
@@ -52,7 +52,7 @@
#define SCR_W 320
#define SCR_H 200
#define PLAS_S 128 /* Plasma is 128x128 */
-#define WAVEMOD 1.3 /* Shrink/stretch factor for sine wave.
+#define WAVEMOD 1300 /* Shrink/stretch factor for sine wave.
Effectively controls the 'speed' */
/* Miscellaneous global variables */
@@ -61,11 +61,18 @@
static char xbuffer[SCR_W];
static char ybuffer[SCR_H];
-static float angle[5];
-static float anglebak[3];
+static int64_t angle[5];
+static int64_t anglebak[3];
-static float
-aprsin(float theta)
+static __inline int64_t
+fdiv(int64_t a, int64_t b)
+{
+
+ return (a / b + ((a % b * 2) >= b));
+}
+
+static __inline int64_t
+aprsin(int64_t theta)
/*
* An evil, evil approximation of sin(x). It computes the sin
* value by first standardising the input into the range
@@ -86,11 +93,11 @@
}
if(theta > TWO_PI)
- theta -= (float)((int)(theta/TWO_PI)*TWO_PI);
+ theta %= TWO_PI;
/* theta now > 0, < 2pi, look up in table */
- apos = (int)((theta/TWO_PI)*90.0);
+ apos = fdiv(theta * SCALE, TWO_PI) * 90 / SCALE;
return((neg) ? -aprsinv[apos] : aprsinv[apos]);
}
@@ -100,7 +107,11 @@
video_info_t info;
/* Console capable of running 320x200x256? */
+#if __FreeBSD_version < 800000
if(get_mode_info(adp, M_VGA_CG320, &info)) {
+#else
+ if (vidd_get_info(adp, M_VGA_CG320, &info)) {
+#endif
log(LOG_NOTICE, "plasma_saver: the console does not support M_VGA_CG320\n");
return(ENODEV);
}
@@ -123,14 +134,15 @@
anglebak[2] = angle[2];
for (i=0; i<PLAS_S; i++)
{
- xbuffer[i] = 16*aprsin(angle[0]) + 8*aprsin(angle[1])
- + 4*aprsin(angle[2]);
- angle[0] += 2*PI/PLAS_S;
- angle[1] += 4*PI/PLAS_S;
- angle[2] += 8*PI/PLAS_S;
- angle[3] += 2*PI/PLAS_S;
- angle[4] += 4*PI/PLAS_S;
- ybuffer[i] = 16*aprsin(angle[3]) + 8*aprsin(angle[4]);
+ xbuffer[i] = fdiv(16 * aprsin(angle[0]) +
+ 8 * aprsin(angle[1]) + 4 * aprsin(angle[2]), SCALE);
+ angle[0] += fdiv(2 * PI, PLAS_S);
+ angle[1] += fdiv(4 * PI, PLAS_S);
+ angle[2] += fdiv(8 * PI, PLAS_S);
+ angle[3] += fdiv(2 * PI, PLAS_S);
+ angle[4] += fdiv(4 * PI, PLAS_S);
+ ybuffer[i] = fdiv(16 * aprsin(angle[3]) +
+ 8 * aprsin(angle[4]), SCALE);
}
for(i=0; i<PLAS_S; i++)
{
@@ -144,11 +156,11 @@
buffer[((i+45)*SCR_W) + (j+96)] = 128 +
ybuffer[i] + xbuffer[j];
}
- angle[0] = anglebak[0] - ((2*PI/SCR_W)*WAVEMOD);
- angle[1] = anglebak[1] + ((6*PI/SCR_W)*WAVEMOD);
- angle[2] = anglebak[2] + ((4*PI/SCR_W)*WAVEMOD);
- angle[3] = anglebak[0] + ((6*PI/SCR_W)*WAVEMOD);
- angle[4] = anglebak[1] + ((10*PI/SCR_W)*WAVEMOD);
+ angle[0] = anglebak[0] - fdiv(fdiv(2 * PI, SCR_W) * WAVEMOD, 1000);
+ angle[1] = anglebak[1] + fdiv(fdiv(6 * PI, SCR_W) * WAVEMOD, 1000);
+ angle[2] = anglebak[2] + fdiv(fdiv(4 * PI, SCR_W) * WAVEMOD, 1000);
+ angle[3] = anglebak[0] + fdiv(fdiv(6 * PI, SCR_W) * WAVEMOD, 1000);
+ angle[4] = anglebak[1] + fdiv(fdiv(10 * PI, SCR_W) * WAVEMOD, 1000);
}
static int
@@ -156,8 +168,13 @@
{
if(blank) {
if(blanked <= 0) {
+#if __FreeBSD_version < 800000
set_video_mode(adp, M_VGA_CG320);
load_palette(adp, plasma_pal);
+#else
+ vidd_set_mode(adp, M_VGA_CG320);
+ vidd_load_palette(adp, plasma_pal);
+#endif
blanked++;
video = (u_char *)adp->va_window;
/* Zero various stuff */
|