xref: /csrg-svn/sys/luna68k/dev/bmd.c (revision 56885)
1*56885Sakito /*
2*56885Sakito  * Copyright (c) 1992 OMRON Corporation.
3*56885Sakito  * Copyright (c) 1992 The Regents of the University of California.
4*56885Sakito  * All rights reserved.
5*56885Sakito  *
6*56885Sakito  * This code is derived from software contributed to Berkeley by
7*56885Sakito  * OMRON Corporation.
8*56885Sakito  *
9*56885Sakito  * %sccs.include.redist.c%
10*56885Sakito  *
11*56885Sakito  *	@(#)bmd.c	7.1 (Berkeley) 11/17/92
12*56885Sakito  */
13*56885Sakito /*
14*56885Sakito 
15*56885Sakito  * bmd.c --- Bitmap-Display raw-level driver routines
16*56885Sakito  *
17*56885Sakito  *	by A.Fujita, SEP-09-1992
18*56885Sakito  */
19*56885Sakito 
20*56885Sakito 
21*56885Sakito #include "param.h"
22*56885Sakito #include "systm.h"
23*56885Sakito 
24*56885Sakito extern u_short bmdfont[][20];
25*56885Sakito 
26*56885Sakito #define isprint(c)	( c < 0x20 ? 0 : 1)
27*56885Sakito 
28*56885Sakito /*
29*56885Sakito  *  RFCNT register
30*56885Sakito  */
31*56885Sakito 
32*56885Sakito struct bmd_rfcnt {
33*56885Sakito 	short	rfc_hcnt;
34*56885Sakito 	short	rfc_vcnt;
35*56885Sakito };
36*56885Sakito 
37*56885Sakito 
38*56885Sakito /*
39*56885Sakito  *  Width & Hight
40*56885Sakito  */
41*56885Sakito 
42*56885Sakito #define	PB_WIDTH	2048				/* Plane Width   (Bit) */
43*56885Sakito #define	PB_HIGHT	1024				/* Plane Hight   (Bit) */
44*56885Sakito #define PL_WIDTH	64				/* Plane Width  (long) */
45*56885Sakito #define PS_WIDTH	128				/* Plane Width  (long) */
46*56885Sakito #define P_WIDTH		256				/* Plane Width  (Byte) */
47*56885Sakito 
48*56885Sakito #define SB_WIDTH	1280				/* Screen Width  (Bit) */
49*56885Sakito #define	SB_HIGHT	1024				/* Screen Hight  (Bit) */
50*56885Sakito #define SL_WIDTH	40				/* Screen Width (Long) */
51*56885Sakito #define S_WIDTH		160				/* Screen Width (Byte) */
52*56885Sakito 
53*56885Sakito #define FB_WIDTH	12				/* Font Width    (Bit) */
54*56885Sakito #define FB_HIGHT	20				/* Font Hight    (Bit) */
55*56885Sakito 
56*56885Sakito 
57*56885Sakito #define NEXT_LINE(addr)				( addr +  (PL_WIDTH * FB_HIGHT) )
58*56885Sakito #define SKIP_NEXT_LINE(addr)			( addr += (PL_WIDTH - SL_WIDTH) )
59*56885Sakito 
60*56885Sakito 
61*56885Sakito void	bmd_add_new_line();
62*56885Sakito 
63*56885Sakito void	bmd_draw_char();
64*56885Sakito void	bmd_reverse_char();
65*56885Sakito void	bmd_erase_char();
66*56885Sakito void	bmd_erase_screen();
67*56885Sakito void	bmd_scroll_screen();
68*56885Sakito 
69*56885Sakito 
70*56885Sakito struct bmd_linec {
71*56885Sakito 	struct bmd_linec *bl_next;
72*56885Sakito 	struct bmd_linec *bl_prev;
73*56885Sakito 	int	bl_col;
74*56885Sakito 	int	bl_end;
75*56885Sakito 	u_char	bl_line[128];
76*56885Sakito };
77*56885Sakito 
78*56885Sakito struct bmd_softc {
79*56885Sakito 	int	bc_stat;
80*56885Sakito 	char   *bc_raddr;
81*56885Sakito 	char   *bc_waddr;
82*56885Sakito 	int	bc_xmin;
83*56885Sakito 	int	bc_xmax;
84*56885Sakito 	int	bc_ymin;
85*56885Sakito 	int	bc_ymax;
86*56885Sakito 	int	bc_col;
87*56885Sakito 	int	bc_row;
88*56885Sakito 	struct bmd_linec *bc_bl;
89*56885Sakito 	char	bc_escseq[8];
90*56885Sakito 	char   *bc_esc;
91*56885Sakito 	void  (*bc_escape)();
92*56885Sakito };
93*56885Sakito 
94*56885Sakito #define	STAT_NORMAL	0x0000
95*56885Sakito #define	STAT_ESCAPE	0x0001
96*56885Sakito #define	STAT_INSERT	0x0100
97*56885Sakito 
98*56885Sakito struct	bmd_softc bmd_softc;
99*56885Sakito struct	bmd_linec bmd_linec[52];
100*56885Sakito 
101*56885Sakito void	bmd_escape();
102*56885Sakito void	bmd_escape_0();
103*56885Sakito void	bmd_escape_1();
104*56885Sakito 
105*56885Sakito 
106*56885Sakito /*
107*56885Sakito  * Escape-Sequence
108*56885Sakito  */
109*56885Sakito 
110*56885Sakito void
111*56885Sakito bmd_escape(c)
112*56885Sakito 	int c;
113*56885Sakito {
114*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
115*56885Sakito 
116*56885Sakito 	switch (c) {
117*56885Sakito 
118*56885Sakito 	case '[':
119*56885Sakito 		bp->bc_escape = bmd_escape_0;
120*56885Sakito 		break;
121*56885Sakito 
122*56885Sakito 	default:
123*56885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
124*56885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
125*56885Sakito 		bp->bc_escape = bmd_escape;
126*56885Sakito 		break;
127*56885Sakito 	}
128*56885Sakito }
129*56885Sakito 
130*56885Sakito void
131*56885Sakito bmd_escape_0(c)
132*56885Sakito 	int c;
133*56885Sakito {
134*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
135*56885Sakito 	register struct	bmd_linec *bq = bp->bc_bl;
136*56885Sakito 
137*56885Sakito 	switch (c) {
138*56885Sakito 
139*56885Sakito 	case 'A':
140*56885Sakito 		if (bp->bc_row > bp->bc_ymin) {
141*56885Sakito 			bp->bc_row--;
142*56885Sakito 		}
143*56885Sakito 		break;
144*56885Sakito 
145*56885Sakito 	case 'C':
146*56885Sakito 		if (bq->bl_col < bp->bc_xmax - 1) {
147*56885Sakito 			bq->bl_col++;
148*56885Sakito 		}
149*56885Sakito 		break;
150*56885Sakito 
151*56885Sakito 	case 'K':
152*56885Sakito 		if (bq->bl_col < bp->bc_xmax) {
153*56885Sakito 			register int col;
154*56885Sakito 			for (col = bq->bl_col; col < bp->bc_xmax; col++)
155*56885Sakito 				bmd_erase_char(bp->bc_raddr,
156*56885Sakito 					       bp->bc_waddr,
157*56885Sakito 					       col, bp->bc_row);
158*56885Sakito 		}
159*56885Sakito 		bq->bl_end = bq->bl_col;
160*56885Sakito 		break;
161*56885Sakito 
162*56885Sakito 	case 'H':
163*56885Sakito 		bq->bl_col = bq->bl_end = bp->bc_xmin;
164*56885Sakito 		bp->bc_row = bp->bc_ymin;
165*56885Sakito 		break;
166*56885Sakito 
167*56885Sakito 	default:
168*56885Sakito /*
169*56885Sakito 		*bp->bc_esc++ = c;
170*56885Sakito 		bp->bc_escape = bmd_escape_1;
171*56885Sakito 		return;
172*56885Sakito  */
173*56885Sakito 		break;
174*56885Sakito 	}
175*56885Sakito 
176*56885Sakito 	bp->bc_stat &= ~STAT_ESCAPE;
177*56885Sakito 	bp->bc_esc = &bp->bc_escseq[0];
178*56885Sakito 	bp->bc_escape = bmd_escape;
179*56885Sakito }
180*56885Sakito 
181*56885Sakito void
182*56885Sakito bmd_escape_1(c)
183*56885Sakito 	int c;
184*56885Sakito {
185*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
186*56885Sakito 	register struct	bmd_linec *bq = bp->bc_bl;
187*56885Sakito 	register int col = 0, row = 0;
188*56885Sakito 	register char *p;
189*56885Sakito 
190*56885Sakito 	switch (c) {
191*56885Sakito 
192*56885Sakito 	case 'J':
193*56885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
194*56885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
195*56885Sakito 		bp->bc_escape = bmd_escape;
196*56885Sakito 		break;
197*56885Sakito 
198*56885Sakito 	case 'H':
199*56885Sakito 		for (p = &bp->bc_escseq[0]; *p != ';'; p++)
200*56885Sakito 			row = (row * 10) + (*p - 0x30);
201*56885Sakito 		p++;
202*56885Sakito 		for (p = &bp->bc_escseq[0]; p != bp->bc_esc; p++)
203*56885Sakito 			col = (col * 10) + (*p - 0x30);
204*56885Sakito 
205*56885Sakito 		bq->bl_col = col + bp->bc_xmin;
206*56885Sakito 		bp->bc_row = row + bp->bc_ymin;
207*56885Sakito 
208*56885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
209*56885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
210*56885Sakito 		bp->bc_escape = bmd_escape;
211*56885Sakito 		break;
212*56885Sakito 
213*56885Sakito 	default:
214*56885Sakito 		*bp->bc_esc++ = c;
215*56885Sakito 		break;
216*56885Sakito 	}
217*56885Sakito }
218*56885Sakito 
219*56885Sakito 
220*56885Sakito /*
221*56885Sakito  * Entry Routine
222*56885Sakito  */
223*56885Sakito 
224*56885Sakito bmdinit()
225*56885Sakito {
226*56885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
227*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
228*56885Sakito 	register struct bmd_linec *bq;
229*56885Sakito 	register int i;
230*56885Sakito 	struct bmd_rfcnt rfcnt;
231*56885Sakito 
232*56885Sakito 	/*
233*56885Sakito 	 *  adjust plane position
234*56885Sakito 	 */
235*56885Sakito 
236*56885Sakito 	bp->bc_raddr = (char *) 0xB10C0008;		/* plane-0 hardware address */
237*56885Sakito 	bp->bc_waddr = (char *) 0xB1080008;		/* common bitmap hardware address */
238*56885Sakito 	rfcnt.rfc_hcnt = 7;				/* shift left   16 dot */
239*56885Sakito 	rfcnt.rfc_vcnt = -27;				/* shift down    1 dot */
240*56885Sakito 	*bmd_rfcnt = rfcnt;
241*56885Sakito 
242*56885Sakito 	bp->bc_stat  = STAT_NORMAL;
243*56885Sakito 
244*56885Sakito 	bp->bc_xmin  = 8;
245*56885Sakito 	bp->bc_xmax  = 96;
246*56885Sakito 	bp->bc_ymin  = 2;
247*56885Sakito 	bp->bc_ymax  = 48;
248*56885Sakito 
249*56885Sakito 	bp->bc_row = bp->bc_ymin;
250*56885Sakito 
251*56885Sakito 	for (i = bp->bc_ymin; i < bp->bc_ymax; i++) {
252*56885Sakito 		bmd_linec[i].bl_next = &bmd_linec[i+1];
253*56885Sakito 		bmd_linec[i].bl_prev = &bmd_linec[i-1];
254*56885Sakito 	}
255*56885Sakito 	bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin];
256*56885Sakito 	bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1];
257*56885Sakito 
258*56885Sakito 	bq = bp->bc_bl = &bmd_linec[bp->bc_ymin];
259*56885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
260*56885Sakito 
261*56885Sakito 	bp->bc_col = bp->bc_xmin;
262*56885Sakito 
263*56885Sakito 	bp->bc_esc = &bp->bc_escseq[0];
264*56885Sakito 	bp->bc_escape = bmd_escape;
265*56885Sakito 
266*56885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
267*56885Sakito 
268*56885Sakito 							/* turn on  cursole */
269*56885Sakito 	bmd_reverse_char(bp->bc_raddr,
270*56885Sakito 			 bp->bc_waddr,
271*56885Sakito 			 bq->bl_col, bp->bc_row);
272*56885Sakito }
273*56885Sakito 
274*56885Sakito bmdadjust(hcnt, vcnt)
275*56885Sakito 	short hcnt, vcnt;
276*56885Sakito {
277*56885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
278*56885Sakito 	struct bmd_rfcnt rfcnt;
279*56885Sakito 
280*56885Sakito 	printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt);
281*56885Sakito 
282*56885Sakito 	rfcnt.rfc_hcnt = hcnt;			/* shift left   16 dot */
283*56885Sakito 	rfcnt.rfc_vcnt = vcnt;			/* shift down    1 dot */
284*56885Sakito 
285*56885Sakito 	*bmd_rfcnt = rfcnt;
286*56885Sakito }
287*56885Sakito 
288*56885Sakito bmdputc(c)
289*56885Sakito 	register int c;
290*56885Sakito {
291*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
292*56885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
293*56885Sakito 	register int i;
294*56885Sakito 
295*56885Sakito 	c &= 0x7F;
296*56885Sakito 							/* turn off cursole */
297*56885Sakito 	bmd_reverse_char(bp->bc_raddr,
298*56885Sakito 			 bp->bc_waddr,
299*56885Sakito 			 bq->bl_col, bp->bc_row);
300*56885Sakito 							/* do escape-sequence */
301*56885Sakito 	if (bp->bc_stat & STAT_ESCAPE) {
302*56885Sakito 		*bp->bc_esc++ = c;
303*56885Sakito 		(*bp->bc_escape)(c);
304*56885Sakito 		goto done;
305*56885Sakito 	}
306*56885Sakito 
307*56885Sakito 	if (isprint(c)) {
308*56885Sakito 		bmd_draw_char(bp->bc_raddr, bp->bc_waddr,
309*56885Sakito 			      bq->bl_col, bp->bc_row, c);
310*56885Sakito 		bq->bl_col++;
311*56885Sakito 		bq->bl_end++;
312*56885Sakito 		if (bq->bl_col >= bp->bc_xmax) {
313*56885Sakito 			bq->bl_col = bq->bl_end = bp->bc_xmin;
314*56885Sakito 			bp->bc_row++;
315*56885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
316*56885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
317*56885Sakito 						  (u_long *) bp->bc_waddr,
318*56885Sakito 						  bp->bc_xmin, bp->bc_xmax,
319*56885Sakito 						  bp->bc_ymin, bp->bc_ymax);
320*56885Sakito 
321*56885Sakito 				bp->bc_row = bp->bc_ymax - 1;
322*56885Sakito 			}
323*56885Sakito 		}
324*56885Sakito 	} else {
325*56885Sakito 		switch (c) {
326*56885Sakito 		case 0x08:				/* BS */
327*56885Sakito 			if (bq->bl_col > bp->bc_xmin) {
328*56885Sakito 				bq->bl_col--;
329*56885Sakito 			}
330*56885Sakito 			break;
331*56885Sakito 
332*56885Sakito 		case 0x09:				/* HT */
333*56885Sakito 		case 0x0B:				/* VT */
334*56885Sakito 			i = ((bq->bl_col / 8) + 1) * 8;
335*56885Sakito 			if (i < bp->bc_xmax) {
336*56885Sakito 				bq->bl_col = bq->bl_end = i;
337*56885Sakito 			}
338*56885Sakito 			break;
339*56885Sakito 
340*56885Sakito 		case 0x0A:				/* NL */
341*56885Sakito 			bp->bc_row++;
342*56885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
343*56885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
344*56885Sakito 						  (u_long *) bp->bc_waddr,
345*56885Sakito 						  bp->bc_xmin, bp->bc_xmax,
346*56885Sakito 						  bp->bc_ymin, bp->bc_ymax);
347*56885Sakito 
348*56885Sakito 				bp->bc_row = bp->bc_ymax - 1;
349*56885Sakito 			}
350*56885Sakito 			break;
351*56885Sakito 
352*56885Sakito 		case 0x0D:				/* CR */
353*56885Sakito 			bq->bl_col = bp->bc_xmin;
354*56885Sakito 			break;
355*56885Sakito 
356*56885Sakito 		case 0x1b:				/* ESC */
357*56885Sakito 			bp->bc_stat |= STAT_ESCAPE;
358*56885Sakito 			*bp->bc_esc++ = 0x1b;
359*56885Sakito 			break;
360*56885Sakito 
361*56885Sakito 		case 0x7F:				/* DEL */
362*56885Sakito 			if (bq->bl_col > bp->bc_xmin) {
363*56885Sakito 				bq->bl_col--;
364*56885Sakito 				bmd_erase_char(bp->bc_raddr,
365*56885Sakito 					       bp->bc_waddr,
366*56885Sakito 					       bq->bl_col, bp->bc_row);
367*56885Sakito 			}
368*56885Sakito 			break;
369*56885Sakito 
370*56885Sakito 		default:
371*56885Sakito 			break;
372*56885Sakito 		}
373*56885Sakito 	}
374*56885Sakito 
375*56885Sakito  done:
376*56885Sakito 							/* turn on  cursole */
377*56885Sakito 	bmd_reverse_char(bp->bc_raddr,
378*56885Sakito 			 bp->bc_waddr,
379*56885Sakito 			 bq->bl_col, bp->bc_row);
380*56885Sakito 
381*56885Sakito 	return(c);
382*56885Sakito }
383*56885Sakito 
384*56885Sakito bmdclear()
385*56885Sakito {
386*56885Sakito 	register struct bmd_softc *bp = &bmd_softc;
387*56885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
388*56885Sakito 
389*56885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
390*56885Sakito 
391*56885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
392*56885Sakito 	bp->bc_row = bp->bc_ymin;
393*56885Sakito 
394*56885Sakito 	bmd_reverse_char(bp->bc_raddr,
395*56885Sakito 			 bp->bc_waddr,
396*56885Sakito 			 bq->bl_col, bp->bc_row);	/* turn on  cursole */
397*56885Sakito }
398*56885Sakito 
399*56885Sakito 
400*56885Sakito /*
401*56885Sakito  *
402*56885Sakito  */
403*56885Sakito 
404*56885Sakito void
405*56885Sakito bmd_add_new_line()
406*56885Sakito {
407*56885Sakito }
408*56885Sakito 
409*56885Sakito 
410*56885Sakito /*
411*56885Sakito  *  charactor operation routines
412*56885Sakito  */
413*56885Sakito 
414*56885Sakito void
415*56885Sakito bmd_draw_char(raddr, waddr, col, row, c)
416*56885Sakito 	char *raddr;
417*56885Sakito 	char *waddr;
418*56885Sakito 	int col;
419*56885Sakito 	int row;
420*56885Sakito 	int c;
421*56885Sakito {
422*56885Sakito 	volatile register u_short  *p,  *q, *fp;
423*56885Sakito 	volatile register u_long  *lp, *lq;
424*56885Sakito 	register int i;
425*56885Sakito 
426*56885Sakito 	fp = &bmdfont[c][0];
427*56885Sakito 
428*56885Sakito 	switch (col % 4) {
429*56885Sakito 
430*56885Sakito 	case 0:
431*56885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
432*56885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
433*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
434*56885Sakito 			*q = (*p & 0x000F) | (*fp & 0xFFF0);
435*56885Sakito 			p += 128;
436*56885Sakito 			q += 128;
437*56885Sakito 			fp++;
438*56885Sakito 		}
439*56885Sakito 		break;
440*56885Sakito 
441*56885Sakito 	case 1:
442*56885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
443*56885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
444*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
445*56885Sakito 			*lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4);
446*56885Sakito 			lp += 64;
447*56885Sakito 			lq += 64;
448*56885Sakito 			fp++;
449*56885Sakito 		}
450*56885Sakito 		break;
451*56885Sakito 
452*56885Sakito 	case 2:
453*56885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
454*56885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
455*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
456*56885Sakito 			*lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8);
457*56885Sakito 			lp += 64;
458*56885Sakito 			lq += 64;
459*56885Sakito 			fp++;
460*56885Sakito 		}
461*56885Sakito 		break;
462*56885Sakito 
463*56885Sakito 	case 3:
464*56885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
465*56885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
466*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
467*56885Sakito 			*q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);
468*56885Sakito 			p += 128;
469*56885Sakito 			q += 128;
470*56885Sakito 			fp++;
471*56885Sakito 		}
472*56885Sakito 		break;
473*56885Sakito 
474*56885Sakito 	default:
475*56885Sakito 		break;
476*56885Sakito 	}
477*56885Sakito }
478*56885Sakito 
479*56885Sakito void
480*56885Sakito bmd_reverse_char(raddr, waddr, col, row)
481*56885Sakito 	char *raddr;
482*56885Sakito 	char *waddr;
483*56885Sakito 	int col;
484*56885Sakito 	int row;
485*56885Sakito {
486*56885Sakito 	volatile register u_short  *p,  *q,  us;
487*56885Sakito 	volatile register u_long  *lp, *lq,  ul;
488*56885Sakito 	register int i;
489*56885Sakito 
490*56885Sakito 	switch (col%4) {
491*56885Sakito 
492*56885Sakito 	case 0:
493*56885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
494*56885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
495*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
496*56885Sakito 			*q = (*p & 0x000F) | (~(*p) & 0xFFF0);
497*56885Sakito 			p += 128;
498*56885Sakito 			q += 128;
499*56885Sakito 		}
500*56885Sakito 		break;
501*56885Sakito 
502*56885Sakito 	case 1:
503*56885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
504*56885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
505*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
506*56885Sakito 			*lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);
507*56885Sakito 			lp += 64;
508*56885Sakito 			lq += 64;
509*56885Sakito 		}
510*56885Sakito 		break;
511*56885Sakito 
512*56885Sakito 	case 2:
513*56885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
514*56885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
515*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
516*56885Sakito 			*lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);
517*56885Sakito 			lp += 64;
518*56885Sakito 			lq += 64;
519*56885Sakito 		}
520*56885Sakito 		break;
521*56885Sakito 
522*56885Sakito 	case 3:
523*56885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
524*56885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
525*56885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
526*56885Sakito 			*q = (*p & 0xF000) | (~(*p) & 0x0FFF);
527*56885Sakito 			p += 128;
528*56885Sakito 			q += 128;
529*56885Sakito 		}
530*56885Sakito 		break;
531*56885Sakito 
532*56885Sakito 	default:
533*56885Sakito 		break;
534*56885Sakito 	}
535*56885Sakito }
536*56885Sakito 
537*56885Sakito void
538*56885Sakito bmd_erase_char(raddr, waddr, col, row)
539*56885Sakito 	char *raddr;
540*56885Sakito 	char *waddr;
541*56885Sakito 	int col;
542*56885Sakito 	int row;
543*56885Sakito {
544*56885Sakito 	bmd_draw_char(raddr, waddr, col, row, 0);
545*56885Sakito 
546*56885Sakito 	return;
547*56885Sakito }
548*56885Sakito 
549*56885Sakito 
550*56885Sakito /*
551*56885Sakito  * screen operation routines
552*56885Sakito  */
553*56885Sakito 
554*56885Sakito void
555*56885Sakito bmd_erase_screen(lp)
556*56885Sakito 	volatile register u_long *lp;
557*56885Sakito {
558*56885Sakito 	register int i, j;
559*56885Sakito 
560*56885Sakito 	for (i = 0; i < SB_HIGHT; i++) {
561*56885Sakito 		for (j = 0; j < SL_WIDTH; j++)
562*56885Sakito 			*lp++ = 0;
563*56885Sakito 		SKIP_NEXT_LINE(lp);
564*56885Sakito 	}
565*56885Sakito 
566*56885Sakito 	return;
567*56885Sakito }
568*56885Sakito 
569*56885Sakito void
570*56885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax)
571*56885Sakito 	volatile register u_long *lp;
572*56885Sakito 	volatile register u_long *lq;
573*56885Sakito 	int xmin, xmax, ymin, ymax;
574*56885Sakito {
575*56885Sakito 	register int i, j;
576*56885Sakito 
577*56885Sakito 	lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1));
578*56885Sakito 	lq += ((PL_WIDTH * FB_HIGHT) *  ymin);
579*56885Sakito 
580*56885Sakito 	for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) {
581*56885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
582*56885Sakito 			*lq++ = *lp++;
583*56885Sakito 		}
584*56885Sakito 		lp += (PL_WIDTH - SL_WIDTH);
585*56885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
586*56885Sakito 	}
587*56885Sakito 
588*56885Sakito 	for (i = 0; i < FB_HIGHT; i++) {
589*56885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
590*56885Sakito 			*lq++ = 0;
591*56885Sakito 		}
592*56885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
593*56885Sakito 	}
594*56885Sakito 
595*56885Sakito }
596