Start development on 386BSD 0.0
[unix-history] / .ref-BSD-4_3_Net_2 / usr / src / sys / hp300 / dev / ite_gb.c
CommitLineData
60f56dfc
KM
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
af359dea
C
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
60f56dfc 25 *
af359dea
C
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
60f56dfc 37 *
af359dea
C
38 * from: Utah $Hdr: ite_gb.c 1.18 91/01/21$
39 *
40 * @(#)ite_gb.c 7.5 (Berkeley) 5/7/91
60f56dfc
KM
41 */
42
43#include "ite.h"
44#if NITE > 0
45
1c15e888
C
46#include "param.h"
47#include "conf.h"
1c15e888
C
48#include "proc.h"
49#include "ioctl.h"
50#include "tty.h"
51#include "systm.h"
60f56dfc
KM
52
53#include "itevar.h"
54#include "itereg.h"
55#include "grf_gbreg.h"
56
1c15e888 57#include "machine/cpu.h"
60f56dfc
KM
58
59/* XXX */
60#include "grfioctl.h"
61#include "grfvar.h"
62
63#define REGBASE ((struct gboxfb *)(ip->regbase))
64#define WINDOWMOVER gatorbox_windowmove
65
66gatorbox_init(ip)
67 register struct ite_softc *ip;
68{
69 /* XXX */
70 if (ip->regbase == 0) {
af359dea
C
71 struct grf_softc *gp = &grf_softc[ip - ite_softc];
72 ip->regbase = gp->g_regkva;
73 ip->fbbase = gp->g_fbkva;
60f56dfc
KM
74 }
75
76 REGBASE->write_protect = 0x0;
77 REGBASE->interrupt = 0x4;
78 REGBASE->rep_rule = RR_COPY;
79 REGBASE->blink1 = 0xff;
80 REGBASE->blink2 = 0xff;
81 gb_microcode(REGADDR);
82 REGBASE->sec_interrupt = 0x01;
83
84 /*
85 * Set up the color map entries. We use three entries in the
86 * color map. The first, is for black, the second is for
87 * white, and the very last entry is for the inverted cursor.
88 */
89 REGBASE->creg_select = 0x00;
90 REGBASE->cmap_red = 0x00;
91 REGBASE->cmap_grn = 0x00;
92 REGBASE->cmap_blu = 0x00;
93 REGBASE->cmap_write = 0x00;
94 gbcm_waitbusy(REGADDR);
95
96 REGBASE->creg_select = 0x01;
97 REGBASE->cmap_red = 0xFF;
98 REGBASE->cmap_grn = 0xFF;
99 REGBASE->cmap_blu = 0xFF;
100 REGBASE->cmap_write = 0x01;
101 gbcm_waitbusy(REGADDR);
102
103 REGBASE->creg_select = 0xFF;
104 REGBASE->cmap_red = 0xFF;
105 REGBASE->cmap_grn = 0xFF;
106 REGBASE->cmap_blu = 0xFF;
107 REGBASE->cmap_write = 0x01;
108 gbcm_waitbusy(REGADDR);
109
110 ite_devinfo(ip);
111 ite_fontinit(ip);
112
113 /*
114 * Clear the display. This used to be before the font unpacking
115 * but it crashes. Figure it out later.
116 */
117 gatorbox_windowmove(ip, 0, 0, 0, 0, ip->dheight, ip->dwidth, RR_CLEAR);
118 tile_mover_waitbusy(REGADDR);
119
120 /*
121 * Stash the inverted cursor.
122 */
123 gatorbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
124 ip->cblanky, ip->cblankx, ip->ftheight,
125 ip->ftwidth, RR_COPYINVERTED);
126}
127
128gatorbox_deinit(ip)
129 struct ite_softc *ip;
130{
131 gatorbox_windowmove(ip, 0, 0, 0, 0,
132 ip->dheight, ip->dwidth, RR_CLEAR);
133 tile_mover_waitbusy(REGADDR);
134
135 ip->flags &= ~ITE_INITED;
136}
137
138gatorbox_putc(ip, c, dy, dx, mode)
139 register struct ite_softc *ip;
140 register int dy, dx;
141 int c, mode;
142{
143 register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
144
145 gatorbox_windowmove(ip, charY(ip, c), charX(ip, c),
146 dy * ip->ftheight, dx * ip->ftwidth,
147 ip->ftheight, ip->ftwidth, wrr);
148}
149
150gatorbox_cursor(ip, flag)
151 register struct ite_softc *ip;
152 register int flag;
153{
154 if (flag == DRAW_CURSOR)
155 draw_cursor(ip)
156 else if (flag == MOVE_CURSOR) {
157 erase_cursor(ip)
158 draw_cursor(ip)
159 }
160 else
161 erase_cursor(ip)
162}
163
164gatorbox_clear(ip, sy, sx, h, w)
165 struct ite_softc *ip;
166 register int sy, sx, h, w;
167{
168 gatorbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
169 sy * ip->ftheight, sx * ip->ftwidth,
170 h * ip->ftheight, w * ip->ftwidth,
171 RR_CLEAR);
172}
173#define gatorbox_blockmove(ip, sy, sx, dy, dx, h, w) \
174 gatorbox_windowmove((ip), \
175 (sy) * ip->ftheight, \
176 (sx) * ip->ftwidth, \
177 (dy) * ip->ftheight, \
178 (dx) * ip->ftwidth, \
179 (h) * ip->ftheight, \
180 (w) * ip->ftwidth, \
181 RR_COPY)
182
183gatorbox_scroll(ip, sy, sx, count, dir)
184 register struct ite_softc *ip;
185 register int sy;
186 int dir, sx, count;
187{
188 register int height, dy, i;
189
190 tile_mover_waitbusy(REGADDR);
191 REGBASE->write_protect = 0x0;
192
193 gatorbox_cursor(ip, ERASE_CURSOR);
194
195 if (dir == SCROLL_UP) {
196 dy = sy - count;
197 height = ip->rows - sy;
198 for (i = 0; i < height; i++)
199 gatorbox_blockmove(ip, sy + i, sx, dy + i, 0,
200 1, ip->cols);
201 }
202 else if (dir == SCROLL_DOWN) {
203 dy = sy + count;
204 height = ip->rows - dy;
205 for (i = (height - 1); i >= 0; i--)
206 gatorbox_blockmove(ip, sy + i, sx, dy + i, 0,
207 1, ip->cols);
208 }
209 else if (dir == SCROLL_RIGHT) {
210 gatorbox_blockmove(ip, sy, sx, sy, sx + count,
211 1, ip->cols - (sx + count));
212 }
213 else {
214 gatorbox_blockmove(ip, sy, sx, sy, sx - count,
215 1, ip->cols - sx);
216 }
217}
218
219gatorbox_windowmove(ip, sy, sx, dy, dx, h, w, mask)
220 register struct ite_softc *ip;
221 int sy, sx, dy, dx, mask;
222 register int h, w;
223{
224 register int src, dest;
225
226 src = (sy * 1024) + sx; /* upper left corner in pixels */
227 dest = (dy * 1024) + dx;
228
229 tile_mover_waitbusy(REGADDR);
230 REGBASE->width = -(w / 4);
231 REGBASE->height = -(h / 4);
232 if (src < dest)
233 REGBASE->rep_rule = MOVE_DOWN_RIGHT|mask;
234 else {
235 REGBASE->rep_rule = MOVE_UP_LEFT|mask;
236 /*
237 * Adjust to top of lower right tile of the block.
238 */
239 src = src + ((h - 4) * 1024) + (w - 4);
240 dest= dest + ((h - 4) * 1024) + (w - 4);
241 }
242 FBBASE[dest] = FBBASE[src];
243}
244#endif