xref: /csrg-svn/sys/luna68k/stand/bmd.c (revision 64270)
156885Sakito /*
256885Sakito  * Copyright (c) 1992 OMRON Corporation.
363199Sbostic  * Copyright (c) 1992, 1993
463199Sbostic  *	The Regents of the University of California.  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*64270Smckusick  *	@(#)bmd.c	8.2 (Berkeley) 08/15/93
1256885Sakito  */
1356885Sakito /*
1456885Sakito 
1556885Sakito  * bmd.c --- Bitmap-Display raw-level driver routines
1656885Sakito  *
1756885Sakito  *	by A.Fujita, SEP-09-1992
1856885Sakito  */
1956885Sakito 
2056885Sakito 
2157108Sakito #include <sys/param.h>
2257108Sakito #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
bmd_escape(c)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
bmd_escape_0(c)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
bmd_escape_1(c)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 
bmdinit()22456885Sakito bmdinit()
22556885Sakito {
22656885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
227*64270Smckusick 	volatile register long *bmd_bmsel = (long *)0xB1040000;
22856885Sakito 	register struct bmd_softc *bp = &bmd_softc;
22956885Sakito 	register struct bmd_linec *bq;
23056885Sakito 	register int i;
23156885Sakito 	struct bmd_rfcnt rfcnt;
23256885Sakito 
23356885Sakito 	/*
23456885Sakito 	 *  adjust plane position
23556885Sakito 	 */
23656885Sakito 
23756885Sakito 	bp->bc_raddr = (char *) 0xB10C0008;		/* plane-0 hardware address */
23856885Sakito 	bp->bc_waddr = (char *) 0xB1080008;		/* common bitmap hardware address */
23956885Sakito 	rfcnt.rfc_hcnt = 7;				/* shift left   16 dot */
24056885Sakito 	rfcnt.rfc_vcnt = -27;				/* shift down    1 dot */
24156885Sakito 	*bmd_rfcnt = rfcnt;
24256885Sakito 
24356885Sakito 	bp->bc_stat  = STAT_NORMAL;
24456885Sakito 
24556885Sakito 	bp->bc_xmin  = 8;
24656885Sakito 	bp->bc_xmax  = 96;
24756885Sakito 	bp->bc_ymin  = 2;
24856885Sakito 	bp->bc_ymax  = 48;
24956885Sakito 
25056885Sakito 	bp->bc_row = bp->bc_ymin;
25156885Sakito 
25256885Sakito 	for (i = bp->bc_ymin; i < bp->bc_ymax; i++) {
25356885Sakito 		bmd_linec[i].bl_next = &bmd_linec[i+1];
25456885Sakito 		bmd_linec[i].bl_prev = &bmd_linec[i-1];
25556885Sakito 	}
25656885Sakito 	bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin];
25756885Sakito 	bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1];
25856885Sakito 
25956885Sakito 	bq = bp->bc_bl = &bmd_linec[bp->bc_ymin];
26056885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
26156885Sakito 
26256885Sakito 	bp->bc_col = bp->bc_xmin;
26356885Sakito 
26456885Sakito 	bp->bc_esc = &bp->bc_escseq[0];
26556885Sakito 	bp->bc_escape = bmd_escape;
26656885Sakito 
267*64270Smckusick 	*bmd_bmsel = 0xff;				/* all planes */
26856885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
269*64270Smckusick 	*bmd_bmsel = 0x01;				/* 1 plane */
27056885Sakito 
27156885Sakito 							/* turn on  cursole */
27256885Sakito 	bmd_reverse_char(bp->bc_raddr,
27356885Sakito 			 bp->bc_waddr,
27456885Sakito 			 bq->bl_col, bp->bc_row);
27556885Sakito }
27656885Sakito 
bmdadjust(hcnt,vcnt)27756885Sakito bmdadjust(hcnt, vcnt)
27856885Sakito 	short hcnt, vcnt;
27956885Sakito {
28056885Sakito 	volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
28156885Sakito 	struct bmd_rfcnt rfcnt;
28256885Sakito 
28356885Sakito 	printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt);
28456885Sakito 
28556885Sakito 	rfcnt.rfc_hcnt = hcnt;			/* shift left   16 dot */
28656885Sakito 	rfcnt.rfc_vcnt = vcnt;			/* shift down    1 dot */
28756885Sakito 
28856885Sakito 	*bmd_rfcnt = rfcnt;
28956885Sakito }
29056885Sakito 
bmdputc(c)29156885Sakito bmdputc(c)
29256885Sakito 	register int c;
29356885Sakito {
29456885Sakito 	register struct bmd_softc *bp = &bmd_softc;
29556885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
29656885Sakito 	register int i;
29756885Sakito 
29856885Sakito 	c &= 0x7F;
29956885Sakito 							/* turn off cursole */
30056885Sakito 	bmd_reverse_char(bp->bc_raddr,
30156885Sakito 			 bp->bc_waddr,
30256885Sakito 			 bq->bl_col, bp->bc_row);
30356885Sakito 							/* do escape-sequence */
30456885Sakito 	if (bp->bc_stat & STAT_ESCAPE) {
30556885Sakito 		*bp->bc_esc++ = c;
30656885Sakito 		(*bp->bc_escape)(c);
30756885Sakito 		goto done;
30856885Sakito 	}
30956885Sakito 
31056885Sakito 	if (isprint(c)) {
31156885Sakito 		bmd_draw_char(bp->bc_raddr, bp->bc_waddr,
31256885Sakito 			      bq->bl_col, bp->bc_row, c);
31356885Sakito 		bq->bl_col++;
31456885Sakito 		bq->bl_end++;
31556885Sakito 		if (bq->bl_col >= bp->bc_xmax) {
31656885Sakito 			bq->bl_col = bq->bl_end = bp->bc_xmin;
31756885Sakito 			bp->bc_row++;
31856885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
31956885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
32056885Sakito 						  (u_long *) bp->bc_waddr,
32156885Sakito 						  bp->bc_xmin, bp->bc_xmax,
32256885Sakito 						  bp->bc_ymin, bp->bc_ymax);
32356885Sakito 
32456885Sakito 				bp->bc_row = bp->bc_ymax - 1;
32556885Sakito 			}
32656885Sakito 		}
32756885Sakito 	} else {
32856885Sakito 		switch (c) {
32956885Sakito 		case 0x08:				/* BS */
33056885Sakito 			if (bq->bl_col > bp->bc_xmin) {
33156885Sakito 				bq->bl_col--;
33256885Sakito 			}
33356885Sakito 			break;
33456885Sakito 
33556885Sakito 		case 0x09:				/* HT */
33656885Sakito 		case 0x0B:				/* VT */
33756885Sakito 			i = ((bq->bl_col / 8) + 1) * 8;
33856885Sakito 			if (i < bp->bc_xmax) {
33956885Sakito 				bq->bl_col = bq->bl_end = i;
34056885Sakito 			}
34156885Sakito 			break;
34256885Sakito 
34356885Sakito 		case 0x0A:				/* NL */
34456885Sakito 			bp->bc_row++;
34556885Sakito 			if (bp->bc_row >= bp->bc_ymax) {
34656885Sakito 				bmd_scroll_screen((u_long *) bp->bc_raddr,
34756885Sakito 						  (u_long *) bp->bc_waddr,
34856885Sakito 						  bp->bc_xmin, bp->bc_xmax,
34956885Sakito 						  bp->bc_ymin, bp->bc_ymax);
35056885Sakito 
35156885Sakito 				bp->bc_row = bp->bc_ymax - 1;
35256885Sakito 			}
35356885Sakito 			break;
35456885Sakito 
35556885Sakito 		case 0x0D:				/* CR */
35656885Sakito 			bq->bl_col = bp->bc_xmin;
35756885Sakito 			break;
35856885Sakito 
35956885Sakito 		case 0x1b:				/* ESC */
36056885Sakito 			bp->bc_stat |= STAT_ESCAPE;
36156885Sakito 			*bp->bc_esc++ = 0x1b;
36256885Sakito 			break;
36356885Sakito 
36456885Sakito 		case 0x7F:				/* DEL */
36556885Sakito 			if (bq->bl_col > bp->bc_xmin) {
36656885Sakito 				bq->bl_col--;
36756885Sakito 				bmd_erase_char(bp->bc_raddr,
36856885Sakito 					       bp->bc_waddr,
36956885Sakito 					       bq->bl_col, bp->bc_row);
37056885Sakito 			}
37156885Sakito 			break;
37256885Sakito 
37356885Sakito 		default:
37456885Sakito 			break;
37556885Sakito 		}
37656885Sakito 	}
37756885Sakito 
37856885Sakito  done:
37956885Sakito 							/* turn on  cursole */
38056885Sakito 	bmd_reverse_char(bp->bc_raddr,
38156885Sakito 			 bp->bc_waddr,
38256885Sakito 			 bq->bl_col, bp->bc_row);
38356885Sakito 
38456885Sakito 	return(c);
38556885Sakito }
38656885Sakito 
bmdclear()38756885Sakito bmdclear()
38856885Sakito {
38956885Sakito 	register struct bmd_softc *bp = &bmd_softc;
39056885Sakito 	register struct bmd_linec *bq = bp->bc_bl;
39156885Sakito 
39256885Sakito 	bmd_erase_screen((u_long *) bp->bc_waddr);	/* clear screen */
39356885Sakito 
39456885Sakito 	bq->bl_col = bq->bl_end = bp->bc_xmin;
39556885Sakito 	bp->bc_row = bp->bc_ymin;
39656885Sakito 
39756885Sakito 	bmd_reverse_char(bp->bc_raddr,
39856885Sakito 			 bp->bc_waddr,
39956885Sakito 			 bq->bl_col, bp->bc_row);	/* turn on  cursole */
40056885Sakito }
40156885Sakito 
40256885Sakito 
40356885Sakito /*
40456885Sakito  *
40556885Sakito  */
40656885Sakito 
40756885Sakito void
bmd_add_new_line()40856885Sakito bmd_add_new_line()
40956885Sakito {
41056885Sakito }
41156885Sakito 
41256885Sakito 
41356885Sakito /*
41456885Sakito  *  charactor operation routines
41556885Sakito  */
41656885Sakito 
41756885Sakito void
bmd_draw_char(raddr,waddr,col,row,c)41856885Sakito bmd_draw_char(raddr, waddr, col, row, c)
41956885Sakito 	char *raddr;
42056885Sakito 	char *waddr;
42156885Sakito 	int col;
42256885Sakito 	int row;
42356885Sakito 	int c;
42456885Sakito {
42556885Sakito 	volatile register u_short  *p,  *q, *fp;
42656885Sakito 	volatile register u_long  *lp, *lq;
42756885Sakito 	register int i;
42856885Sakito 
42956885Sakito 	fp = &bmdfont[c][0];
43056885Sakito 
43156885Sakito 	switch (col % 4) {
43256885Sakito 
43356885Sakito 	case 0:
43456885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43556885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43656885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
43756885Sakito 			*q = (*p & 0x000F) | (*fp & 0xFFF0);
43856885Sakito 			p += 128;
43956885Sakito 			q += 128;
44056885Sakito 			fp++;
44156885Sakito 		}
44256885Sakito 		break;
44356885Sakito 
44456885Sakito 	case 1:
44556885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44656885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44756885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
44856885Sakito 			*lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4);
44956885Sakito 			lp += 64;
45056885Sakito 			lq += 64;
45156885Sakito 			fp++;
45256885Sakito 		}
45356885Sakito 		break;
45456885Sakito 
45556885Sakito 	case 2:
45656885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45756885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45856885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
45956885Sakito 			*lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8);
46056885Sakito 			lp += 64;
46156885Sakito 			lq += 64;
46256885Sakito 			fp++;
46356885Sakito 		}
46456885Sakito 		break;
46556885Sakito 
46656885Sakito 	case 3:
46756885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46856885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46956885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
47056885Sakito 			*q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);
47156885Sakito 			p += 128;
47256885Sakito 			q += 128;
47356885Sakito 			fp++;
47456885Sakito 		}
47556885Sakito 		break;
47656885Sakito 
47756885Sakito 	default:
47856885Sakito 		break;
47956885Sakito 	}
48056885Sakito }
48156885Sakito 
48256885Sakito void
bmd_reverse_char(raddr,waddr,col,row)48356885Sakito bmd_reverse_char(raddr, waddr, col, row)
48456885Sakito 	char *raddr;
48556885Sakito 	char *waddr;
48656885Sakito 	int col;
48756885Sakito 	int row;
48856885Sakito {
48956885Sakito 	volatile register u_short  *p,  *q,  us;
49056885Sakito 	volatile register u_long  *lp, *lq,  ul;
49156885Sakito 	register int i;
49256885Sakito 
49356885Sakito 	switch (col%4) {
49456885Sakito 
49556885Sakito 	case 0:
49656885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49756885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49856885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
49956885Sakito 			*q = (*p & 0x000F) | (~(*p) & 0xFFF0);
50056885Sakito 			p += 128;
50156885Sakito 			q += 128;
50256885Sakito 		}
50356885Sakito 		break;
50456885Sakito 
50556885Sakito 	case 1:
50656885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50756885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50856885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
50956885Sakito 			*lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);
51056885Sakito 			lp += 64;
51156885Sakito 			lq += 64;
51256885Sakito 		}
51356885Sakito 		break;
51456885Sakito 
51556885Sakito 	case 2:
51656885Sakito 		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51756885Sakito 		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51856885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
51956885Sakito 			*lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);
52056885Sakito 			lp += 64;
52156885Sakito 			lq += 64;
52256885Sakito 		}
52356885Sakito 		break;
52456885Sakito 
52556885Sakito 	case 3:
52656885Sakito 		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52756885Sakito 		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52856885Sakito 		for (i = 0; i < FB_HIGHT; i++) {
52956885Sakito 			*q = (*p & 0xF000) | (~(*p) & 0x0FFF);
53056885Sakito 			p += 128;
53156885Sakito 			q += 128;
53256885Sakito 		}
53356885Sakito 		break;
53456885Sakito 
53556885Sakito 	default:
53656885Sakito 		break;
53756885Sakito 	}
53856885Sakito }
53956885Sakito 
54056885Sakito void
bmd_erase_char(raddr,waddr,col,row)54156885Sakito bmd_erase_char(raddr, waddr, col, row)
54256885Sakito 	char *raddr;
54356885Sakito 	char *waddr;
54456885Sakito 	int col;
54556885Sakito 	int row;
54656885Sakito {
54756885Sakito 	bmd_draw_char(raddr, waddr, col, row, 0);
54856885Sakito 
54956885Sakito 	return;
55056885Sakito }
55156885Sakito 
55256885Sakito 
55356885Sakito /*
55456885Sakito  * screen operation routines
55556885Sakito  */
55656885Sakito 
55756885Sakito void
bmd_erase_screen(lp)55856885Sakito bmd_erase_screen(lp)
55956885Sakito 	volatile register u_long *lp;
56056885Sakito {
56156885Sakito 	register int i, j;
56256885Sakito 
56356885Sakito 	for (i = 0; i < SB_HIGHT; i++) {
56456885Sakito 		for (j = 0; j < SL_WIDTH; j++)
56556885Sakito 			*lp++ = 0;
56656885Sakito 		SKIP_NEXT_LINE(lp);
56756885Sakito 	}
56856885Sakito 
56956885Sakito 	return;
57056885Sakito }
57156885Sakito 
57256885Sakito void
bmd_scroll_screen(lp,lq,xmin,xmax,ymin,ymax)57356885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax)
57456885Sakito 	volatile register u_long *lp;
57556885Sakito 	volatile register u_long *lq;
57656885Sakito 	int xmin, xmax, ymin, ymax;
57756885Sakito {
57856885Sakito 	register int i, j;
57956885Sakito 
58056885Sakito 	lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1));
58156885Sakito 	lq += ((PL_WIDTH * FB_HIGHT) *  ymin);
58256885Sakito 
58356885Sakito 	for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) {
58456885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
58556885Sakito 			*lq++ = *lp++;
58656885Sakito 		}
58756885Sakito 		lp += (PL_WIDTH - SL_WIDTH);
58856885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
58956885Sakito 	}
59056885Sakito 
59156885Sakito 	for (i = 0; i < FB_HIGHT; i++) {
59256885Sakito 		for (j = 0; j < SL_WIDTH; j++) {
59356885Sakito 			*lq++ = 0;
59456885Sakito 		}
59556885Sakito 		lq += (PL_WIDTH - SL_WIDTH);
59656885Sakito 	}
59756885Sakito 
59856885Sakito }
599