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