bmd.c revision 1.9 1 1.9 tsutsui /* $NetBSD: bmd.c,v 1.9 2023/10/13 16:30:01 tsutsui Exp $ */
2 1.1 tsutsui
3 1.1 tsutsui /*
4 1.1 tsutsui * Copyright (c) 1992 OMRON Corporation.
5 1.1 tsutsui *
6 1.1 tsutsui * This code is derived from software contributed to Berkeley by
7 1.1 tsutsui * OMRON Corporation.
8 1.1 tsutsui *
9 1.1 tsutsui * Redistribution and use in source and binary forms, with or without
10 1.1 tsutsui * modification, are permitted provided that the following conditions
11 1.1 tsutsui * are met:
12 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright
13 1.1 tsutsui * notice, this list of conditions and the following disclaimer.
14 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the
16 1.1 tsutsui * documentation and/or other materials provided with the distribution.
17 1.1 tsutsui * 3. All advertising materials mentioning features or use of this software
18 1.1 tsutsui * must display the following acknowledgement:
19 1.1 tsutsui * This product includes software developed by the University of
20 1.1 tsutsui * California, Berkeley and its contributors.
21 1.1 tsutsui * 4. Neither the name of the University nor the names of its contributors
22 1.1 tsutsui * may be used to endorse or promote products derived from this software
23 1.1 tsutsui * without specific prior written permission.
24 1.1 tsutsui *
25 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 1.1 tsutsui * SUCH DAMAGE.
36 1.1 tsutsui *
37 1.1 tsutsui * @(#)bmd.c 8.2 (Berkeley) 8/15/93
38 1.1 tsutsui */
39 1.1 tsutsui /*
40 1.1 tsutsui * Copyright (c) 1992, 1993
41 1.1 tsutsui * The Regents of the University of California. All rights reserved.
42 1.1 tsutsui *
43 1.1 tsutsui * This code is derived from software contributed to Berkeley by
44 1.1 tsutsui * OMRON Corporation.
45 1.1 tsutsui *
46 1.1 tsutsui * Redistribution and use in source and binary forms, with or without
47 1.1 tsutsui * modification, are permitted provided that the following conditions
48 1.1 tsutsui * are met:
49 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright
50 1.1 tsutsui * notice, this list of conditions and the following disclaimer.
51 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright
52 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the
53 1.1 tsutsui * documentation and/or other materials provided with the distribution.
54 1.1 tsutsui * 3. Neither the name of the University nor the names of its contributors
55 1.1 tsutsui * may be used to endorse or promote products derived from this software
56 1.1 tsutsui * without specific prior written permission.
57 1.1 tsutsui *
58 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68 1.1 tsutsui * SUCH DAMAGE.
69 1.1 tsutsui *
70 1.1 tsutsui * @(#)bmd.c 8.2 (Berkeley) 8/15/93
71 1.1 tsutsui */
72 1.1 tsutsui /*
73 1.1 tsutsui
74 1.1 tsutsui * bmd.c --- Bitmap-Display raw-level driver routines
75 1.1 tsutsui *
76 1.1 tsutsui * by A.Fujita, SEP-09-1992
77 1.1 tsutsui */
78 1.1 tsutsui
79 1.1 tsutsui
80 1.1 tsutsui #include <sys/param.h>
81 1.1 tsutsui #include <luna68k/stand/boot/samachdep.h>
82 1.8 tsutsui #include <machine/board.h>
83 1.1 tsutsui
84 1.1 tsutsui /*
85 1.1 tsutsui * RFCNT register
86 1.1 tsutsui */
87 1.1 tsutsui
88 1.1 tsutsui union bmd_rfcnt {
89 1.1 tsutsui struct {
90 1.5 tsutsui int16_t rfc_hcnt;
91 1.5 tsutsui int16_t rfc_vcnt;
92 1.1 tsutsui } p;
93 1.1 tsutsui uint32_t u;
94 1.1 tsutsui };
95 1.1 tsutsui
96 1.3 tsutsui #define isprint(c) ((c) >= 0x20 && (c) < 0x7f)
97 1.1 tsutsui
98 1.1 tsutsui /*
99 1.3 tsutsui * Width & Height
100 1.1 tsutsui */
101 1.1 tsutsui
102 1.8 tsutsui #define BMAP_OFFSET 8
103 1.8 tsutsui
104 1.3 tsutsui #define PB_WIDTH 2048 /* Plane Width (Bit) */
105 1.3 tsutsui #define PB_HEIGHT 1024 /* Plane Hight (Bit) */
106 1.3 tsutsui #define PL_WIDTH 64 /* Plane Width (long) */
107 1.3 tsutsui #define PS_WIDTH 128 /* Plane Width (long) */
108 1.3 tsutsui #define P_WIDTH 256 /* Plane Width (Byte) */
109 1.1 tsutsui
110 1.3 tsutsui #define SB_WIDTH 1280 /* Screen Width (Bit) */
111 1.3 tsutsui #define SB_HEIGHT 1024 /* Screen Hight (Bit) */
112 1.3 tsutsui #define SL_WIDTH 40 /* Screen Width (Long) */
113 1.3 tsutsui #define S_WIDTH 160 /* Screen Width (Byte) */
114 1.1 tsutsui
115 1.3 tsutsui #define FB_WIDTH 12 /* Font Width (Bit) */
116 1.3 tsutsui #define FB_HEIGHT 20 /* Font Hight (Bit) */
117 1.1 tsutsui
118 1.1 tsutsui
119 1.4 tsutsui #define NEXT_LINE(addr) (addr + (PL_WIDTH * FB_HEIGHT))
120 1.4 tsutsui #define SKIP_NEXT_LINE(addr) (addr += (PL_WIDTH - SL_WIDTH))
121 1.1 tsutsui
122 1.1 tsutsui
123 1.7 tsutsui static void bmd_draw_char(uint8_t *, uint8_t *, int, int, int);
124 1.7 tsutsui static void bmd_reverse_char(uint8_t *, uint8_t *, int, int);
125 1.7 tsutsui static void bmd_erase_char(uint8_t *, uint8_t *, int, int);
126 1.7 tsutsui static void bmd_erase_screen(volatile uint32_t *);
127 1.7 tsutsui static void bmd_scroll_screen(volatile uint32_t *, volatile uint32_t *,
128 1.7 tsutsui int, int, int, int);
129 1.1 tsutsui
130 1.1 tsutsui
131 1.1 tsutsui struct bmd_linec {
132 1.1 tsutsui struct bmd_linec *bl_next;
133 1.1 tsutsui struct bmd_linec *bl_prev;
134 1.1 tsutsui int bl_col;
135 1.1 tsutsui int bl_end;
136 1.5 tsutsui uint8_t bl_line[128];
137 1.1 tsutsui };
138 1.1 tsutsui
139 1.1 tsutsui struct bmd_softc {
140 1.1 tsutsui int bc_stat;
141 1.5 tsutsui uint8_t *bc_raddr;
142 1.5 tsutsui uint8_t *bc_waddr;
143 1.1 tsutsui int bc_xmin;
144 1.1 tsutsui int bc_xmax;
145 1.1 tsutsui int bc_ymin;
146 1.1 tsutsui int bc_ymax;
147 1.1 tsutsui int bc_col;
148 1.1 tsutsui int bc_row;
149 1.1 tsutsui struct bmd_linec *bc_bl;
150 1.1 tsutsui char bc_escseq[8];
151 1.1 tsutsui char *bc_esc;
152 1.1 tsutsui void (*bc_escape)(int);
153 1.1 tsutsui };
154 1.1 tsutsui
155 1.3 tsutsui #define STAT_NORMAL 0x0000
156 1.3 tsutsui #define STAT_ESCAPE 0x0001
157 1.3 tsutsui #define STAT_INSERT 0x0100
158 1.1 tsutsui
159 1.7 tsutsui static struct bmd_softc bmd_softc;
160 1.7 tsutsui static struct bmd_linec bmd_linec[52];
161 1.1 tsutsui
162 1.7 tsutsui static void bmd_escape(int);
163 1.7 tsutsui static void bmd_escape_0(int);
164 1.7 tsutsui #if 0
165 1.7 tsutsui static void bmd_escape_1(int);
166 1.7 tsutsui #endif
167 1.1 tsutsui
168 1.1 tsutsui
169 1.1 tsutsui /*
170 1.1 tsutsui * Escape-Sequence
171 1.1 tsutsui */
172 1.1 tsutsui
173 1.7 tsutsui static void
174 1.1 tsutsui bmd_escape(int c)
175 1.1 tsutsui {
176 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
177 1.1 tsutsui
178 1.1 tsutsui switch (c) {
179 1.1 tsutsui
180 1.1 tsutsui case '[':
181 1.1 tsutsui bp->bc_escape = bmd_escape_0;
182 1.1 tsutsui break;
183 1.1 tsutsui
184 1.1 tsutsui default:
185 1.1 tsutsui bp->bc_stat &= ~STAT_ESCAPE;
186 1.1 tsutsui bp->bc_esc = &bp->bc_escseq[0];
187 1.1 tsutsui bp->bc_escape = bmd_escape;
188 1.1 tsutsui break;
189 1.1 tsutsui }
190 1.1 tsutsui }
191 1.1 tsutsui
192 1.7 tsutsui static void
193 1.1 tsutsui bmd_escape_0(int c)
194 1.1 tsutsui {
195 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
196 1.1 tsutsui struct bmd_linec *bq = bp->bc_bl;
197 1.1 tsutsui
198 1.1 tsutsui switch (c) {
199 1.1 tsutsui
200 1.1 tsutsui case 'A':
201 1.1 tsutsui if (bp->bc_row > bp->bc_ymin) {
202 1.1 tsutsui bp->bc_row--;
203 1.1 tsutsui }
204 1.1 tsutsui break;
205 1.1 tsutsui
206 1.1 tsutsui case 'C':
207 1.1 tsutsui if (bq->bl_col < bp->bc_xmax - 1) {
208 1.1 tsutsui bq->bl_col++;
209 1.1 tsutsui }
210 1.1 tsutsui break;
211 1.1 tsutsui
212 1.1 tsutsui case 'K':
213 1.1 tsutsui if (bq->bl_col < bp->bc_xmax) {
214 1.1 tsutsui int col;
215 1.1 tsutsui for (col = bq->bl_col; col < bp->bc_xmax; col++)
216 1.1 tsutsui bmd_erase_char(bp->bc_raddr,
217 1.1 tsutsui bp->bc_waddr,
218 1.1 tsutsui col, bp->bc_row);
219 1.1 tsutsui }
220 1.1 tsutsui bq->bl_end = bq->bl_col;
221 1.1 tsutsui break;
222 1.1 tsutsui
223 1.1 tsutsui case 'H':
224 1.1 tsutsui bq->bl_col = bq->bl_end = bp->bc_xmin;
225 1.1 tsutsui bp->bc_row = bp->bc_ymin;
226 1.1 tsutsui break;
227 1.1 tsutsui
228 1.1 tsutsui default:
229 1.3 tsutsui #if 0
230 1.1 tsutsui *bp->bc_esc++ = c;
231 1.1 tsutsui bp->bc_escape = bmd_escape_1;
232 1.1 tsutsui return;
233 1.3 tsutsui #endif
234 1.1 tsutsui break;
235 1.1 tsutsui }
236 1.1 tsutsui
237 1.1 tsutsui bp->bc_stat &= ~STAT_ESCAPE;
238 1.1 tsutsui bp->bc_esc = &bp->bc_escseq[0];
239 1.1 tsutsui bp->bc_escape = bmd_escape;
240 1.1 tsutsui }
241 1.1 tsutsui
242 1.7 tsutsui #if 0
243 1.7 tsutsui static void
244 1.1 tsutsui bmd_escape_1(int c)
245 1.1 tsutsui {
246 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
247 1.1 tsutsui struct bmd_linec *bq = bp->bc_bl;
248 1.1 tsutsui int col = 0, row = 0;
249 1.1 tsutsui char *p;
250 1.1 tsutsui
251 1.1 tsutsui switch (c) {
252 1.1 tsutsui
253 1.1 tsutsui case 'J':
254 1.1 tsutsui bp->bc_stat &= ~STAT_ESCAPE;
255 1.1 tsutsui bp->bc_esc = &bp->bc_escseq[0];
256 1.1 tsutsui bp->bc_escape = bmd_escape;
257 1.1 tsutsui break;
258 1.1 tsutsui
259 1.1 tsutsui case 'H':
260 1.1 tsutsui for (p = &bp->bc_escseq[0]; *p != ';'; p++)
261 1.1 tsutsui row = (row * 10) + (*p - 0x30);
262 1.1 tsutsui p++;
263 1.1 tsutsui for (p = &bp->bc_escseq[0]; p != bp->bc_esc; p++)
264 1.1 tsutsui col = (col * 10) + (*p - 0x30);
265 1.1 tsutsui
266 1.1 tsutsui bq->bl_col = col + bp->bc_xmin;
267 1.1 tsutsui bp->bc_row = row + bp->bc_ymin;
268 1.1 tsutsui
269 1.1 tsutsui bp->bc_stat &= ~STAT_ESCAPE;
270 1.1 tsutsui bp->bc_esc = &bp->bc_escseq[0];
271 1.1 tsutsui bp->bc_escape = bmd_escape;
272 1.1 tsutsui break;
273 1.1 tsutsui
274 1.1 tsutsui default:
275 1.1 tsutsui *bp->bc_esc++ = c;
276 1.1 tsutsui break;
277 1.1 tsutsui }
278 1.1 tsutsui }
279 1.7 tsutsui #endif
280 1.1 tsutsui
281 1.1 tsutsui /*
282 1.1 tsutsui * Entry Routine
283 1.1 tsutsui */
284 1.1 tsutsui
285 1.1 tsutsui void
286 1.1 tsutsui bmdinit(void)
287 1.1 tsutsui {
288 1.8 tsutsui volatile uint32_t *bmd_rfcnt = (uint32_t *)BMAP_RFCNT;
289 1.8 tsutsui volatile uint32_t *bmd_bmsel = (uint32_t *)BMAP_BMSEL;
290 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
291 1.1 tsutsui struct bmd_linec *bq;
292 1.1 tsutsui int i;
293 1.1 tsutsui union bmd_rfcnt rfcnt;
294 1.1 tsutsui
295 1.1 tsutsui /*
296 1.1 tsutsui * adjust plane position
297 1.1 tsutsui */
298 1.1 tsutsui
299 1.6 tsutsui /* plane-0 hardware address */
300 1.8 tsutsui bp->bc_raddr = (uint8_t *)(BMAP_BMAP0 + BMAP_OFFSET);
301 1.6 tsutsui /* common bitmap hardware address */
302 1.8 tsutsui bp->bc_waddr = (uint8_t *)(BMAP_BMP + BMAP_OFFSET);
303 1.6 tsutsui
304 1.3 tsutsui rfcnt.p.rfc_hcnt = 7; /* shift left 16 dot */
305 1.3 tsutsui rfcnt.p.rfc_vcnt = -27; /* shift down 1 dot */
306 1.1 tsutsui *bmd_rfcnt = rfcnt.u;
307 1.1 tsutsui
308 1.1 tsutsui bp->bc_stat = STAT_NORMAL;
309 1.1 tsutsui
310 1.1 tsutsui bp->bc_xmin = 8;
311 1.1 tsutsui bp->bc_xmax = 96;
312 1.1 tsutsui bp->bc_ymin = 2;
313 1.1 tsutsui bp->bc_ymax = 48;
314 1.1 tsutsui
315 1.1 tsutsui bp->bc_row = bp->bc_ymin;
316 1.1 tsutsui
317 1.1 tsutsui for (i = bp->bc_ymin; i < bp->bc_ymax; i++) {
318 1.4 tsutsui bmd_linec[i].bl_next = &bmd_linec[i + 1];
319 1.4 tsutsui bmd_linec[i].bl_prev = &bmd_linec[i - 1];
320 1.1 tsutsui }
321 1.4 tsutsui bmd_linec[bp->bc_ymax - 1].bl_next = &bmd_linec[bp->bc_ymin];
322 1.4 tsutsui bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax - 1];
323 1.1 tsutsui
324 1.1 tsutsui bq = bp->bc_bl = &bmd_linec[bp->bc_ymin];
325 1.1 tsutsui bq->bl_col = bq->bl_end = bp->bc_xmin;
326 1.1 tsutsui
327 1.1 tsutsui bp->bc_col = bp->bc_xmin;
328 1.1 tsutsui
329 1.1 tsutsui bp->bc_esc = &bp->bc_escseq[0];
330 1.1 tsutsui bp->bc_escape = bmd_escape;
331 1.1 tsutsui
332 1.1 tsutsui *bmd_bmsel = 0xff; /* all planes */
333 1.3 tsutsui bmd_erase_screen((uint32_t *)bp->bc_waddr); /* clear screen */
334 1.1 tsutsui *bmd_bmsel = 0x01; /* 1 plane */
335 1.1 tsutsui
336 1.6 tsutsui /* turn on cursor */
337 1.1 tsutsui bmd_reverse_char(bp->bc_raddr,
338 1.1 tsutsui bp->bc_waddr,
339 1.1 tsutsui bq->bl_col, bp->bc_row);
340 1.1 tsutsui }
341 1.1 tsutsui
342 1.1 tsutsui void
343 1.5 tsutsui bmdadjust(int16_t hcnt, int16_t vcnt)
344 1.1 tsutsui {
345 1.8 tsutsui volatile uint32_t *bmd_rfcnt = (uint32_t *)BMAP_RFCNT;
346 1.1 tsutsui union bmd_rfcnt rfcnt;
347 1.1 tsutsui
348 1.1 tsutsui printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt);
349 1.1 tsutsui
350 1.1 tsutsui rfcnt.p.rfc_hcnt = hcnt; /* shift left 16 dot */
351 1.1 tsutsui rfcnt.p.rfc_vcnt = vcnt; /* shift down 1 dot */
352 1.1 tsutsui
353 1.1 tsutsui *bmd_rfcnt = rfcnt.u;
354 1.1 tsutsui }
355 1.1 tsutsui
356 1.1 tsutsui int
357 1.1 tsutsui bmdputc(int c)
358 1.1 tsutsui {
359 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
360 1.1 tsutsui struct bmd_linec *bq = bp->bc_bl;
361 1.1 tsutsui int i;
362 1.1 tsutsui
363 1.1 tsutsui c &= 0x7F;
364 1.6 tsutsui
365 1.6 tsutsui /* turn off cursor */
366 1.1 tsutsui bmd_reverse_char(bp->bc_raddr,
367 1.1 tsutsui bp->bc_waddr,
368 1.1 tsutsui bq->bl_col, bp->bc_row);
369 1.6 tsutsui
370 1.6 tsutsui /* do escape-sequence */
371 1.1 tsutsui if (bp->bc_stat & STAT_ESCAPE) {
372 1.1 tsutsui *bp->bc_esc++ = c;
373 1.1 tsutsui (*bp->bc_escape)(c);
374 1.1 tsutsui goto done;
375 1.1 tsutsui }
376 1.1 tsutsui
377 1.1 tsutsui if (isprint(c)) {
378 1.1 tsutsui bmd_draw_char(bp->bc_raddr, bp->bc_waddr,
379 1.1 tsutsui bq->bl_col, bp->bc_row, c);
380 1.1 tsutsui bq->bl_col++;
381 1.1 tsutsui bq->bl_end++;
382 1.1 tsutsui if (bq->bl_col >= bp->bc_xmax) {
383 1.1 tsutsui bq->bl_col = bq->bl_end = bp->bc_xmin;
384 1.1 tsutsui bp->bc_row++;
385 1.1 tsutsui if (bp->bc_row >= bp->bc_ymax) {
386 1.3 tsutsui bmd_scroll_screen((uint32_t *)bp->bc_raddr,
387 1.3 tsutsui (uint32_t *)bp->bc_waddr,
388 1.1 tsutsui bp->bc_xmin, bp->bc_xmax,
389 1.1 tsutsui bp->bc_ymin, bp->bc_ymax);
390 1.1 tsutsui
391 1.1 tsutsui bp->bc_row = bp->bc_ymax - 1;
392 1.1 tsutsui }
393 1.1 tsutsui }
394 1.1 tsutsui } else {
395 1.1 tsutsui switch (c) {
396 1.1 tsutsui case 0x08: /* BS */
397 1.1 tsutsui if (bq->bl_col > bp->bc_xmin) {
398 1.1 tsutsui bq->bl_col--;
399 1.1 tsutsui }
400 1.1 tsutsui break;
401 1.1 tsutsui
402 1.1 tsutsui case 0x09: /* HT */
403 1.1 tsutsui case 0x0B: /* VT */
404 1.1 tsutsui i = ((bq->bl_col / 8) + 1) * 8;
405 1.1 tsutsui if (i < bp->bc_xmax) {
406 1.1 tsutsui bq->bl_col = bq->bl_end = i;
407 1.1 tsutsui }
408 1.1 tsutsui break;
409 1.1 tsutsui
410 1.1 tsutsui case 0x0A: /* NL */
411 1.1 tsutsui bp->bc_row++;
412 1.1 tsutsui if (bp->bc_row >= bp->bc_ymax) {
413 1.3 tsutsui bmd_scroll_screen((uint32_t *)bp->bc_raddr,
414 1.3 tsutsui (uint32_t *)bp->bc_waddr,
415 1.1 tsutsui bp->bc_xmin, bp->bc_xmax,
416 1.1 tsutsui bp->bc_ymin, bp->bc_ymax);
417 1.1 tsutsui
418 1.1 tsutsui bp->bc_row = bp->bc_ymax - 1;
419 1.1 tsutsui }
420 1.1 tsutsui break;
421 1.1 tsutsui
422 1.1 tsutsui case 0x0D: /* CR */
423 1.1 tsutsui bq->bl_col = bp->bc_xmin;
424 1.1 tsutsui break;
425 1.1 tsutsui
426 1.6 tsutsui case 0x1B: /* ESC */
427 1.1 tsutsui bp->bc_stat |= STAT_ESCAPE;
428 1.1 tsutsui *bp->bc_esc++ = 0x1b;
429 1.1 tsutsui break;
430 1.1 tsutsui
431 1.1 tsutsui case 0x7F: /* DEL */
432 1.1 tsutsui if (bq->bl_col > bp->bc_xmin) {
433 1.1 tsutsui bq->bl_col--;
434 1.1 tsutsui bmd_erase_char(bp->bc_raddr,
435 1.1 tsutsui bp->bc_waddr,
436 1.1 tsutsui bq->bl_col, bp->bc_row);
437 1.1 tsutsui }
438 1.1 tsutsui break;
439 1.1 tsutsui
440 1.1 tsutsui default:
441 1.1 tsutsui break;
442 1.1 tsutsui }
443 1.1 tsutsui }
444 1.1 tsutsui
445 1.1 tsutsui done:
446 1.6 tsutsui /* turn on cursor */
447 1.1 tsutsui bmd_reverse_char(bp->bc_raddr,
448 1.1 tsutsui bp->bc_waddr,
449 1.1 tsutsui bq->bl_col, bp->bc_row);
450 1.1 tsutsui
451 1.4 tsutsui return c;
452 1.1 tsutsui }
453 1.1 tsutsui
454 1.1 tsutsui void
455 1.1 tsutsui bmdclear(void)
456 1.1 tsutsui {
457 1.1 tsutsui struct bmd_softc *bp = &bmd_softc;
458 1.1 tsutsui struct bmd_linec *bq = bp->bc_bl;
459 1.1 tsutsui
460 1.6 tsutsui /* clear screen */
461 1.6 tsutsui bmd_erase_screen((uint32_t *)bp->bc_waddr);
462 1.1 tsutsui
463 1.1 tsutsui bq->bl_col = bq->bl_end = bp->bc_xmin;
464 1.1 tsutsui bp->bc_row = bp->bc_ymin;
465 1.1 tsutsui
466 1.6 tsutsui /* turn on cursor */
467 1.1 tsutsui bmd_reverse_char(bp->bc_raddr,
468 1.1 tsutsui bp->bc_waddr,
469 1.6 tsutsui bq->bl_col, bp->bc_row);
470 1.1 tsutsui }
471 1.1 tsutsui
472 1.1 tsutsui
473 1.1 tsutsui /*
474 1.9 tsutsui * character operation routines
475 1.1 tsutsui */
476 1.1 tsutsui
477 1.7 tsutsui static void
478 1.5 tsutsui bmd_draw_char(uint8_t *raddr, uint8_t *waddr, int col, int row, int c)
479 1.1 tsutsui {
480 1.3 tsutsui volatile uint16_t *p, *q;
481 1.3 tsutsui volatile uint32_t *lp, *lq;
482 1.3 tsutsui const uint16_t *fp;
483 1.1 tsutsui int i;
484 1.1 tsutsui
485 1.1 tsutsui fp = &bmdfont[c][0];
486 1.1 tsutsui
487 1.1 tsutsui switch (col % 4) {
488 1.1 tsutsui
489 1.1 tsutsui case 0:
490 1.3 tsutsui p = (uint16_t *)(raddr + ((row * FB_HEIGHT) << 8)
491 1.3 tsutsui + ((col / 4) * 6));
492 1.3 tsutsui q = (uint16_t *)(waddr + ((row * FB_HEIGHT) << 8)
493 1.3 tsutsui + ((col / 4) * 6));
494 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
495 1.1 tsutsui *q = (*p & 0x000F) | (*fp & 0xFFF0);
496 1.1 tsutsui p += 128;
497 1.1 tsutsui q += 128;
498 1.1 tsutsui fp++;
499 1.1 tsutsui }
500 1.1 tsutsui break;
501 1.1 tsutsui
502 1.1 tsutsui case 1:
503 1.3 tsutsui lp = (uint32_t *)(raddr + ((row * FB_HEIGHT) << 8)
504 1.3 tsutsui + ((col / 4) * 6));
505 1.3 tsutsui lq = (uint32_t *)(waddr + ((row * FB_HEIGHT) << 8)
506 1.3 tsutsui + ((col / 4) * 6));
507 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
508 1.3 tsutsui *lq = (*lp & 0xFFF000FF) |
509 1.3 tsutsui ((uint32_t)(*fp & 0xFFF0) << 4);
510 1.1 tsutsui lp += 64;
511 1.1 tsutsui lq += 64;
512 1.1 tsutsui fp++;
513 1.1 tsutsui }
514 1.1 tsutsui break;
515 1.1 tsutsui
516 1.1 tsutsui case 2:
517 1.3 tsutsui lp = (uint32_t *)(raddr + ((row * FB_HEIGHT) << 8)
518 1.3 tsutsui + ((col / 4) * 6) + 2);
519 1.3 tsutsui lq = (uint32_t *)(waddr + ((row * FB_HEIGHT) << 8)
520 1.3 tsutsui + ((col / 4) * 6) + 2);
521 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
522 1.3 tsutsui *lq = (*lp & 0xFF000FFF) |
523 1.3 tsutsui ((uint32_t)(*fp & 0xFFF0) << 8);
524 1.1 tsutsui lp += 64;
525 1.1 tsutsui lq += 64;
526 1.1 tsutsui fp++;
527 1.1 tsutsui }
528 1.1 tsutsui break;
529 1.1 tsutsui
530 1.1 tsutsui case 3:
531 1.3 tsutsui p = (uint16_t *)(raddr + ((row * FB_HEIGHT) << 8)
532 1.3 tsutsui + ((col / 4) * 6) + 4);
533 1.3 tsutsui q = (uint16_t *)(waddr + ((row * FB_HEIGHT) << 8)
534 1.3 tsutsui + ((col / 4) * 6) + 4);
535 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
536 1.1 tsutsui *q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);
537 1.1 tsutsui p += 128;
538 1.1 tsutsui q += 128;
539 1.1 tsutsui fp++;
540 1.1 tsutsui }
541 1.1 tsutsui break;
542 1.1 tsutsui
543 1.1 tsutsui default:
544 1.1 tsutsui break;
545 1.1 tsutsui }
546 1.1 tsutsui }
547 1.1 tsutsui
548 1.7 tsutsui static void
549 1.5 tsutsui bmd_reverse_char(uint8_t *raddr, uint8_t *waddr, int col, int row)
550 1.1 tsutsui {
551 1.3 tsutsui volatile uint16_t *p, *q;
552 1.3 tsutsui volatile uint32_t *lp, *lq;
553 1.1 tsutsui int i;
554 1.1 tsutsui
555 1.3 tsutsui switch (col % 4) {
556 1.1 tsutsui
557 1.1 tsutsui case 0:
558 1.3 tsutsui p = (uint16_t *)(raddr + ((row * FB_HEIGHT) << 8)
559 1.3 tsutsui + ((col / 4) * 6));
560 1.3 tsutsui q = (uint16_t *)(waddr + ((row * FB_HEIGHT) << 8)
561 1.3 tsutsui + ((col / 4) * 6));
562 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
563 1.1 tsutsui *q = (*p & 0x000F) | (~(*p) & 0xFFF0);
564 1.1 tsutsui p += 128;
565 1.1 tsutsui q += 128;
566 1.1 tsutsui }
567 1.1 tsutsui break;
568 1.1 tsutsui
569 1.1 tsutsui case 1:
570 1.3 tsutsui lp = (uint32_t *)(raddr + ((row * FB_HEIGHT) << 8)
571 1.3 tsutsui + ((col / 4) * 6));
572 1.3 tsutsui lq = (uint32_t *)(waddr + ((row * FB_HEIGHT) << 8)
573 1.3 tsutsui + ((col / 4) * 6));
574 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
575 1.1 tsutsui *lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);
576 1.1 tsutsui lp += 64;
577 1.1 tsutsui lq += 64;
578 1.1 tsutsui }
579 1.1 tsutsui break;
580 1.1 tsutsui
581 1.1 tsutsui case 2:
582 1.3 tsutsui lp = (uint32_t *)(raddr + ((row * FB_HEIGHT) << 8)
583 1.3 tsutsui + ((col / 4) * 6) + 2);
584 1.3 tsutsui lq = (uint32_t *)(waddr + ((row * FB_HEIGHT) << 8)
585 1.3 tsutsui + ((col / 4) * 6) + 2);
586 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
587 1.1 tsutsui *lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);
588 1.1 tsutsui lp += 64;
589 1.1 tsutsui lq += 64;
590 1.1 tsutsui }
591 1.1 tsutsui break;
592 1.1 tsutsui
593 1.1 tsutsui case 3:
594 1.3 tsutsui p = (uint16_t *)(raddr + ((row * FB_HEIGHT) << 8)
595 1.3 tsutsui + ((col / 4) * 6) + 4);
596 1.3 tsutsui q = (uint16_t *)(waddr + ((row * FB_HEIGHT) << 8)
597 1.3 tsutsui + ((col / 4) * 6) + 4);
598 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
599 1.1 tsutsui *q = (*p & 0xF000) | (~(*p) & 0x0FFF);
600 1.1 tsutsui p += 128;
601 1.1 tsutsui q += 128;
602 1.1 tsutsui }
603 1.1 tsutsui break;
604 1.1 tsutsui
605 1.1 tsutsui default:
606 1.1 tsutsui break;
607 1.1 tsutsui }
608 1.1 tsutsui }
609 1.1 tsutsui
610 1.7 tsutsui static void
611 1.5 tsutsui bmd_erase_char(uint8_t *raddr, uint8_t *waddr, int col, int row)
612 1.1 tsutsui {
613 1.3 tsutsui
614 1.1 tsutsui bmd_draw_char(raddr, waddr, col, row, 0);
615 1.1 tsutsui }
616 1.1 tsutsui
617 1.1 tsutsui
618 1.1 tsutsui /*
619 1.1 tsutsui * screen operation routines
620 1.1 tsutsui */
621 1.1 tsutsui
622 1.7 tsutsui static void
623 1.3 tsutsui bmd_erase_screen(volatile uint32_t *lp)
624 1.1 tsutsui {
625 1.1 tsutsui int i, j;
626 1.1 tsutsui
627 1.3 tsutsui for (i = 0; i < SB_HEIGHT; i++) {
628 1.1 tsutsui for (j = 0; j < SL_WIDTH; j++)
629 1.1 tsutsui *lp++ = 0;
630 1.1 tsutsui SKIP_NEXT_LINE(lp);
631 1.1 tsutsui }
632 1.1 tsutsui }
633 1.1 tsutsui
634 1.7 tsutsui static void
635 1.3 tsutsui bmd_scroll_screen(volatile uint32_t *lp, volatile uint32_t *lq,
636 1.1 tsutsui int xmin, int xmax, int ymin, int ymax)
637 1.1 tsutsui {
638 1.1 tsutsui int i, j;
639 1.1 tsutsui
640 1.3 tsutsui lp += ((PL_WIDTH * FB_HEIGHT) * (ymin + 1));
641 1.3 tsutsui lq += ((PL_WIDTH * FB_HEIGHT) * ymin);
642 1.1 tsutsui
643 1.3 tsutsui for (i = 0; i < ((ymax - ymin -1) * FB_HEIGHT); i++) {
644 1.1 tsutsui for (j = 0; j < SL_WIDTH; j++) {
645 1.1 tsutsui *lq++ = *lp++;
646 1.1 tsutsui }
647 1.1 tsutsui lp += (PL_WIDTH - SL_WIDTH);
648 1.1 tsutsui lq += (PL_WIDTH - SL_WIDTH);
649 1.1 tsutsui }
650 1.1 tsutsui
651 1.3 tsutsui for (i = 0; i < FB_HEIGHT; i++) {
652 1.1 tsutsui for (j = 0; j < SL_WIDTH; j++) {
653 1.1 tsutsui *lq++ = 0;
654 1.1 tsutsui }
655 1.1 tsutsui lq += (PL_WIDTH - SL_WIDTH);
656 1.1 tsutsui }
657 1.1 tsutsui }
658