xref: /csrg-svn/sys/luna68k/stand/bmd.c (revision 57108)
156885Sakito /*
256885Sakito  * Copyright (c) 1992 OMRON Corporation.
356885Sakito  * Copyright (c) 1992 The Regents of the University of California.
456885Sakito  * All rights reserved.
556885Sakito  *
656885Sakito  * This code is derived from software contributed to Berkeley by
756885Sakito  * OMRON Corporation.
856885Sakito  *
956885Sakito  * %sccs.include.redist.c%
1056885Sakito  *
11*57108Sakito  *	@(#)bmd.c	7.2 (Berkeley) 12/13/92
1256885Sakito  */
1356885Sakito /*
1456885Sakito 
1556885Sakito  * bmd.c --- Bitmap-Display raw-level driver routines
1656885Sakito  *
1756885Sakito  *	by A.Fujita, SEP-09-1992
1856885Sakito  */
1956885Sakito 
2056885Sakito 
21*57108Sakito #include <sys/param.h>
22*57108Sakito #include <sys/systm.h>
2356885Sakito 
2456885Sakito extern u_short bmdfont[][20];
2556885Sakito 
2656885Sakito #define isprint(c)	( c < 0x20 ? 0 : 1)
2756885Sakito 
2856885Sakito /*
2956885Sakito  *  RFCNT register
3056885Sakito  */
3156885Sakito 
3256885Sakito struct bmd_rfcnt {
3356885Sakito 	short	rfc_hcnt;
3456885Sakito 	short	rfc_vcnt;
3556885Sakito };
3656885Sakito 
3756885Sakito 
3856885Sakito /*
3956885Sakito  *  Width & Hight
4056885Sakito  */
4156885Sakito 
4256885Sakito #define	PB_WIDTH	2048				/* Plane Width   (Bit) */
4356885Sakito #define	PB_HIGHT	1024				/* Plane Hight   (Bit) */
4456885Sakito #define PL_WIDTH	64				/* Plane Width  (long) */
4556885Sakito #define PS_WIDTH	128				/* Plane Width  (long) */
4656885Sakito #define P_WIDTH		256				/* Plane Width  (Byte) */
4756885Sakito 
4856885Sakito #define SB_WIDTH	1280				/* Screen Width  (Bit) */
4956885Sakito #define	SB_HIGHT	1024				/* Screen Hight  (Bit) */
5056885Sakito #define SL_WIDTH	40				/* Screen Width (Long) */
5156885Sakito #define S_WIDTH		160				/* Screen Width (Byte) */
5256885Sakito 
5356885Sakito #define FB_WIDTH	12				/* Font Width    (Bit) */
5456885Sakito #define FB_HIGHT	20				/* Font Hight    (Bit) */
5556885Sakito 
5656885Sakito 
5756885Sakito #define NEXT_LINE(addr)				( addr +  (PL_WIDTH * FB_HIGHT) )
5856885Sakito #define SKIP_NEXT_LINE(addr)			( addr += (PL_WIDTH - SL_WIDTH) )
5956885Sakito 
6056885Sakito 
6156885Sakito void	bmd_add_new_line();
6256885Sakito 
6356885Sakito void	bmd_draw_char();
6456885Sakito void	bmd_reverse_char();
6556885Sakito void	bmd_erase_char();
6656885Sakito void	bmd_erase_screen();
6756885Sakito void	bmd_scroll_screen();
6856885Sakito 
6956885Sakito 
7056885Sakito struct bmd_linec {
7156885Sakito 	struct bmd_linec *bl_next;
7256885Sakito 	struct bmd_linec *bl_prev;
7356885Sakito 	int	bl_col;
7456885Sakito 	int	bl_end;
7556885Sakito 	u_char	bl_line[128];
7656885Sakito };
7756885Sakito 
7856885Sakito struct bmd_softc {
7956885Sakito 	int	bc_stat;
8056885Sakito 	char   *bc_raddr;
8156885Sakito 	char   *bc_waddr;
8256885Sakito 	int	bc_xmin;
8356885Sakito 	int	bc_xmax;
8456885Sakito 	int	bc_ymin;
8556885Sakito 	int	bc_ymax;
8656885Sakito 	int	bc_col;
8756885Sakito 	int	bc_row;
8856885Sakito 	struct bmd_linec *bc_bl;
8956885Sakito 	char	bc_escseq[8];
9056885Sakito 	char   *bc_esc;
9156885Sakito 	void  (*bc_escape)();
9256885Sakito };
9356885Sakito 
9456885Sakito #define	STAT_NORMAL	0x0000
9556885Sakito #define	STAT_ESCAPE	0x0001
9656885Sakito #define	STAT_INSERT	0x0100
9756885Sakito 
9856885Sakito struct	bmd_softc bmd_softc;
9956885Sakito struct	bmd_linec bmd_linec[52];
10056885Sakito 
10156885Sakito void	bmd_escape();
10256885Sakito void	bmd_escape_0();
10356885Sakito void	bmd_escape_1();
10456885Sakito 
10556885Sakito 
10656885Sakito /*
10756885Sakito  * Escape-Sequence
10856885Sakito  */
10956885Sakito 
11056885Sakito void
11156885Sakito bmd_escape(c)
11256885Sakito 	int c;
11356885Sakito {
11456885Sakito 	register struct bmd_softc *bp = &bmd_softc;
11556885Sakito 
11656885Sakito 	switch (c) {
11756885Sakito 
11856885Sakito 	case '[':
11956885Sakito 		bp->bc_escape = bmd_escape_0;
12056885Sakito 		break;
12156885Sakito 
12256885Sakito 	default:
12356885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
12456885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
12556885Sakito 		bp->bc_escape = bmd_escape;
12656885Sakito 		break;
12756885Sakito 	}
12856885Sakito }
12956885Sakito 
13056885Sakito void
13156885Sakito bmd_escape_0(c)
13256885Sakito 	int c;
13356885Sakito {
13456885Sakito 	register struct bmd_softc *bp = &bmd_softc;
13556885Sakito 	register struct	bmd_linec *bq = bp->bc_bl;
13656885Sakito 
13756885Sakito 	switch (c) {
13856885Sakito 
13956885Sakito 	case 'A':
14056885Sakito 		if (bp->bc_row > bp->bc_ymin) {
14156885Sakito 			bp->bc_row--;
14256885Sakito 		}
14356885Sakito 		break;
14456885Sakito 
14556885Sakito 	case 'C':
14656885Sakito 		if (bq->bl_col < bp->bc_xmax - 1) {
14756885Sakito 			bq->bl_col++;
14856885Sakito 		}
14956885Sakito 		break;
15056885Sakito 
15156885Sakito 	case 'K':
15256885Sakito 		if (bq->bl_col < bp->bc_xmax) {
15356885Sakito 			register int col;
15456885Sakito 			for (col = bq->bl_col; col < bp->bc_xmax; col++)
15556885Sakito 				bmd_erase_char(bp->bc_raddr,
15656885Sakito 					       bp->bc_waddr,
15756885Sakito 					       col, bp->bc_row);
15856885Sakito 		}
15956885Sakito 		bq->bl_end = bq->bl_col;
16056885Sakito 		break;
16156885Sakito 
16256885Sakito 	case 'H':
16356885Sakito 		bq->bl_col = bq->bl_end = bp->bc_xmin;
16456885Sakito 		bp->bc_row = bp->bc_ymin;
16556885Sakito 		break;
16656885Sakito 
16756885Sakito 	default:
16856885Sakito /*
16956885Sakito 		*bp->bc_esc++ = c;
17056885Sakito 		bp->bc_escape = bmd_escape_1;
17156885Sakito 		return;
17256885Sakito  */
17356885Sakito 		break;
17456885Sakito 	}
17556885Sakito 
17656885Sakito 	bp->bc_stat &= ~STAT_ESCAPE;
17756885Sakito 	bp->bc_esc = &bp->bc_escseq[0];
17856885Sakito 	bp->bc_escape = bmd_escape;
17956885Sakito }
18056885Sakito 
18156885Sakito void
18256885Sakito bmd_escape_1(c)
18356885Sakito 	int c;
18456885Sakito {
18556885Sakito 	register struct bmd_softc *bp = &bmd_softc;
18656885Sakito 	register struct	bmd_linec *bq = bp->bc_bl;
18756885Sakito 	register int col = 0, row = 0;
18856885Sakito 	register char *p;
18956885Sakito 
19056885Sakito 	switch (c) {
19156885Sakito 
19256885Sakito 	case 'J':
19356885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
19456885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
19556885Sakito 		bp->bc_escape = bmd_escape;
19656885Sakito 		break;
19756885Sakito 
19856885Sakito 	case 'H':
19956885Sakito 		for (p = &bp->bc_escseq[0]; *p != ';'; p++)
20056885Sakito 			row = (row * 10) + (*p - 0x30);
20156885Sakito 		p++;
20256885Sakito 		for (p = &bp->bc_escseq[0]; p != bp->bc_esc; p++)
20356885Sakito 			col = (col * 10) + (*p - 0x30);
20456885Sakito 
20556885Sakito 		bq->bl_col = col + bp->bc_xmin;
20656885Sakito 		bp->bc_row = row + bp->bc_ymin;
20756885Sakito 
20856885Sakito 		bp->bc_stat &= ~STAT_ESCAPE;
20956885Sakito 		bp->bc_esc = &bp->bc_escseq[0];
21056885Sakito 		bp->bc_escape = bmd_escape;
21156885Sakito 		break;
21256885Sakito 
21356885Sakito 	default:
21456885Sakito 		*bp->bc_esc++ = c;
21556885Sakito 		break;
21656885Sakito 	}
21756885Sakito }
21856885Sakito 
21956885Sakito 
22056885Sakito /*
22156885Sakito  * Entry Routine
22256885Sakito  */
22356885Sakito 
22456885Sakito bmdinit()
22556885Sakito {
22656885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
22756885Sakito 	register struct bmd_softc *bp = &bmd_softc;
22856885Sakito 	register struct bmd_linec *bq;
22956885Sakito 	register int i;
23056885Sakito 	struct bmd_rfcnt rfcnt;
23156885Sakito 
23256885Sakito 	/*
23356885Sakito 	 *  adjust plane position
23456885Sakito 	 */
23556885Sakito 
23656885Sakito 	bp->bc_raddr = (char *) 0xB10C0008;		/* plane-0 hardware address */
23756885Sakito 	bp->bc_waddr = (char *) 0xB1080008;		/* common bitmap hardware address */
23856885Sakito 	rfcnt.rfc_hcnt = 7;				/* shift left   16 dot */
23956885Sakito 	rfcnt.rfc_vcnt = -27;				/* shift down    1 dot */
24056885Sakito 	*bmd_rfcnt = rfcnt;
24156885Sakito 
24256885Sakito 	bp->bc_stat  = STAT_NORMAL;
24356885Sakito 
24456885Sakito 	bp->bc_xmin  = 8;
24556885Sakito 	bp->bc_xmax  = 96;
24656885Sakito 	bp->bc_ymin  = 2;
24756885Sakito 	bp->bc_ymax  = 48;
24856885Sakito 
24956885Sakito 	bp->bc_row = bp->bc_ymin;
25056885Sakito 
25156885Sakito 	for (i = bp->bc_ymin; i < bp->bc_ymax; i++) {
25256885Sakito 		bmd_linec[i].bl_next = &bmd_linec[i+1];
25356885Sakito 		bmd_linec[i].bl_prev = &bmd_linec[i-1];
25456885Sakito 	}
25556885Sakito 	bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin];
25656885Sakito 	bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1];
25756885Sakito 
25856885Sakito 	bq = bp->bc_bl = &bmd_linec[bp->bc_ymin];
25956885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
26056885Sakito 
26156885Sakito 	bp->bc_col = bp->bc_xmin;
26256885Sakito 
26356885Sakito 	bp->bc_esc = &bp->bc_escseq[0];
26456885Sakito 	bp->bc_escape = bmd_escape;
26556885Sakito 
26656885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
26756885Sakito 
26856885Sakito 							/* turn on  cursole */
26956885Sakito 	bmd_reverse_char(bp->bc_raddr,
27056885Sakito 			 bp->bc_waddr,
27156885Sakito 			 bq->bl_col, bp->bc_row);
27256885Sakito }
27356885Sakito 
27456885Sakito bmdadjust(hcnt, vcnt)
27556885Sakito 	short hcnt, vcnt;
27656885Sakito {
27756885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
27856885Sakito 	struct bmd_rfcnt rfcnt;
27956885Sakito 
28056885Sakito 	printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt);
28156885Sakito 
28256885Sakito 	rfcnt.rfc_hcnt = hcnt;			/* shift left   16 dot */
28356885Sakito 	rfcnt.rfc_vcnt = vcnt;			/* shift down    1 dot */
28456885Sakito 
28556885Sakito 	*bmd_rfcnt = rfcnt;
28656885Sakito }
28756885Sakito 
28856885Sakito bmdputc(c)
28956885Sakito 	register int c;
29056885Sakito {
29156885Sakito 	register struct bmd_softc *bp = &bmd_softc;
29256885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
29356885Sakito 	register int i;
29456885Sakito 
29556885Sakito 	c &= 0x7F;
29656885Sakito 							/* turn off cursole */
29756885Sakito 	bmd_reverse_char(bp->bc_raddr,
29856885Sakito 			 bp->bc_waddr,
29956885Sakito 			 bq->bl_col, bp->bc_row);
30056885Sakito 							/* do escape-sequence */
30156885Sakito 	if (bp->bc_stat & STAT_ESCAPE) {
30256885Sakito 		*bp->bc_esc++ = c;
30356885Sakito 		(*bp->bc_escape)(c);
30456885Sakito 		goto done;
30556885Sakito 	}
30656885Sakito 
30756885Sakito 	if (isprint(c)) {
30856885Sakito 		bmd_draw_char(bp->bc_raddr, bp->bc_waddr,
30956885Sakito 			      bq->bl_col, bp->bc_row, c);
31056885Sakito 		bq->bl_col++;
31156885Sakito 		bq->bl_end++;
31256885Sakito 		if (bq->bl_col >= bp->bc_xmax) {
31356885Sakito 			bq->bl_col = bq->bl_end = bp->bc_xmin;
31456885Sakito 			bp->bc_row++;
31556885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
31656885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
31756885Sakito 						  (u_long *) bp->bc_waddr,
31856885Sakito 						  bp->bc_xmin, bp->bc_xmax,
31956885Sakito 						  bp->bc_ymin, bp->bc_ymax);
32056885Sakito 
32156885Sakito 				bp->bc_row = bp->bc_ymax - 1;
32256885Sakito 			}
32356885Sakito 		}
32456885Sakito 	} else {
32556885Sakito 		switch (c) {
32656885Sakito 		case 0x08:				/* BS */
32756885Sakito 			if (bq->bl_col > bp->bc_xmin) {
32856885Sakito 				bq->bl_col--;
32956885Sakito 			}
33056885Sakito 			break;
33156885Sakito 
33256885Sakito 		case 0x09:				/* HT */
33356885Sakito 		case 0x0B:				/* VT */
33456885Sakito 			i = ((bq->bl_col / 8) + 1) * 8;
33556885Sakito 			if (i < bp->bc_xmax) {
33656885Sakito 				bq->bl_col = bq->bl_end = i;
33756885Sakito 			}
33856885Sakito 			break;
33956885Sakito 
34056885Sakito 		case 0x0A:				/* NL */
34156885Sakito 			bp->bc_row++;
34256885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
34356885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
34456885Sakito 						  (u_long *) bp->bc_waddr,
34556885Sakito 						  bp->bc_xmin, bp->bc_xmax,
34656885Sakito 						  bp->bc_ymin, bp->bc_ymax);
34756885Sakito 
34856885Sakito 				bp->bc_row = bp->bc_ymax - 1;
34956885Sakito 			}
35056885Sakito 			break;
35156885Sakito 
35256885Sakito 		case 0x0D:				/* CR */
35356885Sakito 			bq->bl_col = bp->bc_xmin;
35456885Sakito 			break;
35556885Sakito 
35656885Sakito 		case 0x1b:				/* ESC */
35756885Sakito 			bp->bc_stat |= STAT_ESCAPE;
35856885Sakito 			*bp->bc_esc++ = 0x1b;
35956885Sakito 			break;
36056885Sakito 
36156885Sakito 		case 0x7F:				/* DEL */
36256885Sakito 			if (bq->bl_col > bp->bc_xmin) {
36356885Sakito 				bq->bl_col--;
36456885Sakito 				bmd_erase_char(bp->bc_raddr,
36556885Sakito 					       bp->bc_waddr,
36656885Sakito 					       bq->bl_col, bp->bc_row);
36756885Sakito 			}
36856885Sakito 			break;
36956885Sakito 
37056885Sakito 		default:
37156885Sakito 			break;
37256885Sakito 		}
37356885Sakito 	}
37456885Sakito 
37556885Sakito  done:
37656885Sakito 							/* turn on  cursole */
37756885Sakito 	bmd_reverse_char(bp->bc_raddr,
37856885Sakito 			 bp->bc_waddr,
37956885Sakito 			 bq->bl_col, bp->bc_row);
38056885Sakito 
38156885Sakito 	return(c);
38256885Sakito }
38356885Sakito 
38456885Sakito bmdclear()
38556885Sakito {
38656885Sakito 	register struct bmd_softc *bp = &bmd_softc;
38756885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
38856885Sakito 
38956885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
39056885Sakito 
39156885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
39256885Sakito 	bp->bc_row = bp->bc_ymin;
39356885Sakito 
39456885Sakito 	bmd_reverse_char(bp->bc_raddr,
39556885Sakito 			 bp->bc_waddr,
39656885Sakito 			 bq->bl_col, bp->bc_row);	/* turn on  cursole */
39756885Sakito }
39856885Sakito 
39956885Sakito 
40056885Sakito /*
40156885Sakito  *
40256885Sakito  */
40356885Sakito 
40456885Sakito void
40556885Sakito bmd_add_new_line()
40656885Sakito {
40756885Sakito }
40856885Sakito 
40956885Sakito 
41056885Sakito /*
41156885Sakito  *  charactor operation routines
41256885Sakito  */
41356885Sakito 
41456885Sakito void
41556885Sakito bmd_draw_char(raddr, waddr, col, row, c)
41656885Sakito 	char *raddr;
41756885Sakito 	char *waddr;
41856885Sakito 	int col;
41956885Sakito 	int row;
42056885Sakito 	int c;
42156885Sakito {
42256885Sakito 	volatile register u_short  *p,  *q, *fp;
42356885Sakito 	volatile register u_long  *lp, *lq;
42456885Sakito 	register int i;
42556885Sakito 
42656885Sakito 	fp = &bmdfont[c][0];
42756885Sakito 
42856885Sakito 	switch (col % 4) {
42956885Sakito 
43056885Sakito 	case 0:
43156885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43256885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43356885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
43456885Sakito 			*q = (*p & 0x000F) | (*fp & 0xFFF0);
43556885Sakito 			p += 128;
43656885Sakito 			q += 128;
43756885Sakito 			fp++;
43856885Sakito 		}
43956885Sakito 		break;
44056885Sakito 
44156885Sakito 	case 1:
44256885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44356885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44456885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
44556885Sakito 			*lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4);
44656885Sakito 			lp += 64;
44756885Sakito 			lq += 64;
44856885Sakito 			fp++;
44956885Sakito 		}
45056885Sakito 		break;
45156885Sakito 
45256885Sakito 	case 2:
45356885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45456885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45556885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
45656885Sakito 			*lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8);
45756885Sakito 			lp += 64;
45856885Sakito 			lq += 64;
45956885Sakito 			fp++;
46056885Sakito 		}
46156885Sakito 		break;
46256885Sakito 
46356885Sakito 	case 3:
46456885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46556885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46656885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
46756885Sakito 			*q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);
46856885Sakito 			p += 128;
46956885Sakito 			q += 128;
47056885Sakito 			fp++;
47156885Sakito 		}
47256885Sakito 		break;
47356885Sakito 
47456885Sakito 	default:
47556885Sakito 		break;
47656885Sakito 	}
47756885Sakito }
47856885Sakito 
47956885Sakito void
48056885Sakito bmd_reverse_char(raddr, waddr, col, row)
48156885Sakito 	char *raddr;
48256885Sakito 	char *waddr;
48356885Sakito 	int col;
48456885Sakito 	int row;
48556885Sakito {
48656885Sakito 	volatile register u_short  *p,  *q,  us;
48756885Sakito 	volatile register u_long  *lp, *lq,  ul;
48856885Sakito 	register int i;
48956885Sakito 
49056885Sakito 	switch (col%4) {
49156885Sakito 
49256885Sakito 	case 0:
49356885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49456885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49556885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
49656885Sakito 			*q = (*p & 0x000F) | (~(*p) & 0xFFF0);
49756885Sakito 			p += 128;
49856885Sakito 			q += 128;
49956885Sakito 		}
50056885Sakito 		break;
50156885Sakito 
50256885Sakito 	case 1:
50356885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50456885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50556885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
50656885Sakito 			*lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);
50756885Sakito 			lp += 64;
50856885Sakito 			lq += 64;
50956885Sakito 		}
51056885Sakito 		break;
51156885Sakito 
51256885Sakito 	case 2:
51356885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51456885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51556885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
51656885Sakito 			*lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);
51756885Sakito 			lp += 64;
51856885Sakito 			lq += 64;
51956885Sakito 		}
52056885Sakito 		break;
52156885Sakito 
52256885Sakito 	case 3:
52356885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52456885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52556885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
52656885Sakito 			*q = (*p & 0xF000) | (~(*p) & 0x0FFF);
52756885Sakito 			p += 128;
52856885Sakito 			q += 128;
52956885Sakito 		}
53056885Sakito 		break;
53156885Sakito 
53256885Sakito 	default:
53356885Sakito 		break;
53456885Sakito 	}
53556885Sakito }
53656885Sakito 
53756885Sakito void
53856885Sakito bmd_erase_char(raddr, waddr, col, row)
53956885Sakito 	char *raddr;
54056885Sakito 	char *waddr;
54156885Sakito 	int col;
54256885Sakito 	int row;
54356885Sakito {
54456885Sakito 	bmd_draw_char(raddr, waddr, col, row, 0);
54556885Sakito 
54656885Sakito 	return;
54756885Sakito }
54856885Sakito 
54956885Sakito 
55056885Sakito /*
55156885Sakito  * screen operation routines
55256885Sakito  */
55356885Sakito 
55456885Sakito void
55556885Sakito bmd_erase_screen(lp)
55656885Sakito 	volatile register u_long *lp;
55756885Sakito {
55856885Sakito 	register int i, j;
55956885Sakito 
56056885Sakito 	for (i = 0; i < SB_HIGHT; i++) {
56156885Sakito 		for (j = 0; j < SL_WIDTH; j++)
56256885Sakito 			*lp++ = 0;
56356885Sakito 		SKIP_NEXT_LINE(lp);
56456885Sakito 	}
56556885Sakito 
56656885Sakito 	return;
56756885Sakito }
56856885Sakito 
56956885Sakito void
57056885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax)
57156885Sakito 	volatile register u_long *lp;
57256885Sakito 	volatile register u_long *lq;
57356885Sakito 	int xmin, xmax, ymin, ymax;
57456885Sakito {
57556885Sakito 	register int i, j;
57656885Sakito 
57756885Sakito 	lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1));
57856885Sakito 	lq += ((PL_WIDTH * FB_HIGHT) *  ymin);
57956885Sakito 
58056885Sakito 	for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) {
58156885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
58256885Sakito 			*lq++ = *lp++;
58356885Sakito 		}
58456885Sakito 		lp += (PL_WIDTH - SL_WIDTH);
58556885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
58656885Sakito 	}
58756885Sakito 
58856885Sakito 	for (i = 0; i < FB_HIGHT; i++) {
58956885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
59056885Sakito 			*lq++ = 0;
59156885Sakito 		}
59256885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
59356885Sakito 	}
59456885Sakito 
59556885Sakito }
596