xref: /csrg-svn/sys/news3400/bm/bitmapif.c (revision 57177)
153889Smckusick /*
253889Smckusick  * Copyright (c) 1992 The Regents of the University of California.
353889Smckusick  * All rights reserved.
453889Smckusick  *
553889Smckusick  * This code is derived from software contributed to Berkeley by
653889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753889Smckusick  *
853889Smckusick  * %sccs.include.redist.c%
953889Smckusick  *
1053889Smckusick  * from: $Hdr: bitmapif.c,v 4.300 91/06/09 06:14:40 root Rel41 $ SONY
1153889Smckusick  *
12*57177Sutashiro  *	@(#)bitmapif.c	7.2 (Berkeley) 12/17/92
1353889Smckusick  */
1453889Smckusick 
15*57177Sutashiro #include <machine/fix_machine_type.h>
1653889Smckusick 
1753889Smckusick #ifdef IPC_MRX
18*57177Sutashiro #include <sys/param.h>
19*57177Sutashiro #include <sys/types.h>
20*57177Sutashiro #include <news3400/iop/framebuf.h>
21*57177Sutashiro #include <news3400/iop/fbreg.h>
2253889Smckusick #else
23*57177Sutashiro #include <sys/param.h>
24*57177Sutashiro #include <sys/types.h>
25*57177Sutashiro #include <news3400/iop/framebuf.h>
26*57177Sutashiro #include <news3400/iop/fbreg.h>
2753889Smckusick #endif
2853889Smckusick 
29*57177Sutashiro #include <news3400/fb/fbdefs.h>
3053889Smckusick 
31*57177Sutashiro #include <news3400/bm/vt100.h>
32*57177Sutashiro #include <news3400/bm/bitmapif.h>
3353889Smckusick 
3453889Smckusick extern int bm_todo;
3553889Smckusick extern int tmode;
3653889Smckusick 
3753889Smckusick #ifdef CPU_SINGLE
3853889Smckusick extern char *ext_fnt_addr[];
3953889Smckusick extern char *ext_fnt24_addr[];
4053889Smckusick #else /* CPU_SINGLE */
4153889Smckusick #ifdef IPC_MRX
4253889Smckusick extern char **ext_fnt_addr;
4353889Smckusick extern char **ext_fnt24_addr;
4453889Smckusick #else
4553889Smckusick char **ext_fnt_addr = 0;
4653889Smckusick char **ext_fnt24_addr = 0;
4753889Smckusick #endif
4853889Smckusick #define lock_bitmap()
4953889Smckusick #define unlock_bitmap()
5053889Smckusick #endif /* CPU_SINGLE */
5153889Smckusick 
5253889Smckusick extern	SCREEN	screen;
5353889Smckusick 
5453889Smckusick #ifdef IPC_MRX
5553889Smckusick extern int bitmap_use;
5653889Smckusick #endif
5753889Smckusick 
5853889Smckusick #ifdef CPU_SINGLE
59*57177Sutashiro #include <machine/cpu.h>
6053889Smckusick #define PRE_EMPT	need_resched()
6153889Smckusick #else
6253889Smckusick #define	PRE_EMPT
6353889Smckusick #endif
6453889Smckusick 
6553889Smckusick short zero[32 * 2];
6653889Smckusick struct	csr_buf local_csr_buf;
6753889Smckusick 
6853889Smckusick #ifdef CPU_SINGLE
6953889Smckusick struct fb_map rommap;
7053889Smckusick #endif
7153889Smckusick 
7253889Smckusick bitmapinit()
7353889Smckusick {
7453889Smckusick 	fbbm_rop_reset(consfb);
7553889Smckusick 	if (!consfb->Mono) {
7653889Smckusick 		lock_bitmap();
7753889Smckusick 		fbbm_init_palette(consfb);
7853889Smckusick 		unlock_bitmap();
7953889Smckusick 	}
8053889Smckusick }
8153889Smckusick 
8253889Smckusick bm_pallet_read(entry)
8353889Smckusick 	int entry;
8453889Smckusick {
8553889Smckusick 	lPalette lp;
8653889Smckusick 	sPalette palette;
8753889Smckusick #ifdef CPU_SINGLE
8853889Smckusick 	struct fb_map rommap;
8953889Smckusick #endif
9053889Smckusick 
9153889Smckusick 	lock_bitmap();
9253889Smckusick 
9353889Smckusick 	lp.count = 1;
9453889Smckusick #ifdef CPU_SINGLE
9553889Smckusick 	lp.palette = (sPalette *)&rommap;
9653889Smckusick 	rommap.fm_vaddr = (caddr_t)&palette;
9753889Smckusick 	rommap.fm_offset = 0;
9853889Smckusick #else
9953889Smckusick 	lp.palette = &palette;
10053889Smckusick #endif
10153889Smckusick 	palette.index = entry;
10253889Smckusick 
10353889Smckusick 	fbbm_get_palette(consfb, &lp);
10453889Smckusick 
10553889Smckusick 	unlock_bitmap();
10653889Smckusick 
10753889Smckusick 	return((palette.rgb.r << 16) | (palette.rgb.g << 8) | palette.rgb.b);
10853889Smckusick }
10953889Smckusick 
11053889Smckusick bm_pallet_write(entry, val)
11153889Smckusick 	int entry;
11253889Smckusick 	int val;
11353889Smckusick {
11453889Smckusick 	lPalette lp;
11553889Smckusick 	sPalette palette;
11653889Smckusick #ifdef CPU_SINGLE
11753889Smckusick 	struct fb_map rommap;
11853889Smckusick #endif
11953889Smckusick 
12053889Smckusick 	lock_bitmap();
12153889Smckusick 
12253889Smckusick 	lp.count = 1;
12353889Smckusick #ifdef CPU_SINGLE
12453889Smckusick 	lp.palette = (sPalette *)&rommap;
12553889Smckusick 	rommap.fm_vaddr = (caddr_t)&palette;
12653889Smckusick 	rommap.fm_offset = 0;
12753889Smckusick #else
12853889Smckusick 	lp.palette = &palette;
12953889Smckusick #endif
13053889Smckusick 	palette.index = entry;
13153889Smckusick 	palette.rgb.r = ((val >> 16) & 0xff);
13253889Smckusick 	palette.rgb.g = ((val >> 8) & 0xff);
13353889Smckusick 	palette.rgb.b = (val & 0xff);
13453889Smckusick 	fbbm_set_palette(consfb, &lp);
13553889Smckusick 
13653889Smckusick 	unlock_bitmap();
13753889Smckusick 
13853889Smckusick 	return(val);
13953889Smckusick }
14053889Smckusick 
14153889Smckusick unsigned
14253889Smckusick sftjis_to_jis(h, l)
14353889Smckusick 	register unsigned int h, l;
14453889Smckusick {
14553889Smckusick 	if ((h >= JVR1S) && (h <= JVR1E))
14653889Smckusick 		h -= JVR1S;
14753889Smckusick 	else if ((h >= JVR2S) && (h <= JVR2E))
14853889Smckusick 		h = h - JVR2S + 0x1f;
14953889Smckusick 	else
15053889Smckusick 		return (0);
15153889Smckusick 
15253889Smckusick 	h <<= 1;
15353889Smckusick 
15453889Smckusick 	if ((l >= JHR1S) && (l <= JHR1E))
15553889Smckusick 		l -= JHR1S;
15653889Smckusick 	else if ((l >= JHR2S) && (l <= JHR2E))
15753889Smckusick 		l = l - JHR2S + 0x3f;
15853889Smckusick 	else if ((l >= JHR3S) && (l <= JHR3E)) {
15953889Smckusick 		l -= JHR3S;
16053889Smckusick 		h++;
16153889Smckusick 	} else
16253889Smckusick 		return (0);
16353889Smckusick 
16453889Smckusick 	return(((h + 0x21) << 8) + l + 0x21);
16553889Smckusick }
16653889Smckusick 
16753889Smckusick setropfunc(func, transp, fore, aux)
16853889Smckusick 	int func, fore, aux;
16953889Smckusick {
17053889Smckusick 	char tmp[4];
17153889Smckusick 	register int i = consfb->fbNplane;
17253889Smckusick 	register char *funcp = consfb->funcvec;
17353889Smckusick 
17453889Smckusick 	consfb->func = func;
17553889Smckusick 	consfb->fore = fore;
17653889Smckusick 	consfb->aux = aux;
17753889Smckusick 	consfb->trans = transp;
17853889Smckusick 
17953889Smckusick 	tmp[0] = TRANS(transp, (func & 0x0c) | (func>>2));
18053889Smckusick 	tmp[1] = TRANS(transp, (func>>2) | ((func<<2) & 0x0c));
18153889Smckusick 	tmp[2] = TRANS(transp, func);
18253889Smckusick 	tmp[3] = TRANS(transp, (func<<2) & 0x0c | func & 3);
18353889Smckusick 
18453889Smckusick 	while (--i >= 0) {
18553889Smckusick 		*funcp++ = tmp[((fore & 1) << 1) | (aux & 1)];
18653889Smckusick 		fore >>= 1; aux >>= 1;
18753889Smckusick 	}
18853889Smckusick }
18953889Smckusick 
19053889Smckusick move_rect(src_x, src_y, width, height, dst_x, dst_y, rop)
19153889Smckusick 	int src_x, src_y;
19253889Smckusick 	int width, height;
19353889Smckusick 	int dst_x, dst_y;
19453889Smckusick 	int rop;
19553889Smckusick {
19653889Smckusick 	lRectangle sr;
19753889Smckusick 	lPoint dp;
19853889Smckusick 
19953889Smckusick 	sr.origin.x = src_x;
20053889Smckusick 	sr.origin.y = src_y;
20153889Smckusick 	sr.extent.x = width;
20253889Smckusick 	sr.extent.y = height;
20353889Smckusick 
20453889Smckusick 	dp.x = dst_x;
20553889Smckusick 	dp.y = dst_y;
20653889Smckusick 
20753889Smckusick 	lock_bitmap();
20853889Smckusick 	setropfunc(rop, 0, consfb->planemask, 0);
20953889Smckusick 	fbbm_rop_init(consfb, consfb->funcvec);
21053889Smckusick 	fbbm_rop_copy(consfb, &sr, &dp, 0, consfb->planemask);
21153889Smckusick 	unlock_bitmap();
21253889Smckusick }
21353889Smckusick 
21453889Smckusick clear_rect(x, y, width, height, rop, fore, aux)
21553889Smckusick 	int x, y;
21653889Smckusick 	int width, height;
21753889Smckusick 	int rop;
21853889Smckusick 	int fore;
21953889Smckusick 	int aux;
22053889Smckusick {
22153889Smckusick 	lRectangle dr;
22253889Smckusick 
22353889Smckusick 	dr.origin.x = x;
22453889Smckusick 	dr.origin.y = y;
22553889Smckusick 	dr.extent.x = width;
22653889Smckusick 	dr.extent.y = height;
22753889Smckusick 
22853889Smckusick 	lock_bitmap();
22953889Smckusick 	setropfunc(rop, 0, fore, aux);
23053889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 1);
23153889Smckusick 	fbbm_rop_clear(consfb, &dr);
23253889Smckusick 	unlock_bitmap();
23353889Smckusick }
23453889Smckusick 
23553889Smckusick line(param)
23653889Smckusick 	short *param;
23753889Smckusick {
23853889Smckusick 	lPoint p[2];
23953889Smckusick 	lRectangle clip;
24053889Smckusick 
24153889Smckusick 	p[0].x = param[0];
24253889Smckusick 	p[0].y = param[1];
24353889Smckusick 	p[1].x = param[2];
24453889Smckusick 	p[1].y = param[3];
24553889Smckusick 	clip = consfb->VisRect;
24653889Smckusick 
24753889Smckusick 	lock_bitmap();
24853889Smckusick 	fbbm_rop_vect(consfb, &clip, param[4] & 0xf,
24953889Smckusick 		      fbbm_get_pixel(consfb, param[5]), 0, 1,
25053889Smckusick 		      consfb->planemask, 2, p, LINE_SLD, 1, 0);
25153889Smckusick 	unlock_bitmap();
25253889Smckusick }
25353889Smckusick 
25453889Smckusick /*
25553889Smckusick  *  cursor on
25653889Smckusick  *  cursor_on(x, y, plane) puts cursor at position (x, y) with color = plane,
25753889Smckusick  *  if cursor sw is off.
25853889Smckusick  *  At the same time the image of cursor position is saved.
25953889Smckusick  */
26053889Smckusick cursor_on(p)
26153889Smckusick 	lPoint *p;
26253889Smckusick {
26353889Smckusick 	register struct csr_buf *csr_bp = &local_csr_buf;
26453889Smckusick 	register lRectangle *dr;
26553889Smckusick 
26653889Smckusick 	if (screen.s_term_mode & DECCSR_ACTV &&
26753889Smckusick 	    bm_todo <= 0 && csr_bp->csr_sw == C_OFF) {
26853889Smckusick 
26953889Smckusick 		if (csr_bp->csr_number == 2 && p->x != rit_m)
27053889Smckusick 			dr = &char_r2;
27153889Smckusick 		else
27253889Smckusick 			dr = &char_r1;
27353889Smckusick 
27453889Smckusick 		dr->origin = *p;
27553889Smckusick 
27653889Smckusick 		lock_bitmap();
27753889Smckusick 		setropfunc(BF_DI, 0, consfb->planemask, 0);
27853889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
27953889Smckusick 		fbbm_rop_copy(consfb, dr, dr, 0, (fcolor^bcolor) & consfb->planemask);
28053889Smckusick 		unlock_bitmap();
28153889Smckusick 
28253889Smckusick 		csr_bp->csr_sw = C_ON;
28353889Smckusick 		csr_bp->csr_p = *p;
28453889Smckusick 	}
28553889Smckusick }
28653889Smckusick 
28753889Smckusick /*
28853889Smckusick  *  cursor off
28953889Smckusick  *  cursor_off() turns off cursor.
29053889Smckusick  *  The image of cursor position which has previously saved by cursor_on
29153889Smckusick  *  is restored.
29253889Smckusick  */
29353889Smckusick cursor_off()
29453889Smckusick {
29553889Smckusick 	register  struct  csr_buf  *csr_bp = &local_csr_buf;
29653889Smckusick 	register lRectangle *dr;
29753889Smckusick 
29853889Smckusick 	if (screen.s_term_mode & DECCSR_ACTV && csr_bp->csr_sw == C_ON) {
29953889Smckusick 		if (csr_bp->csr_number == 2 && csr_bp->csr_x != rit_m)
30053889Smckusick 			dr = &char_r2;
30153889Smckusick 		else
30253889Smckusick 			dr = &char_r1;
30353889Smckusick 
30453889Smckusick 		dr->origin = csr_bp->csr_p;
30553889Smckusick 
30653889Smckusick 		lock_bitmap();
30753889Smckusick 		setropfunc(BF_DI, 0, consfb->planemask, 0);
30853889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
30953889Smckusick 		fbbm_rop_copy(consfb, dr, dr, 0, (fcolor^bcolor) & consfb->planemask);
31053889Smckusick 		unlock_bitmap();
31153889Smckusick 
31253889Smckusick 		csr_bp->csr_sw = C_OFF;
31353889Smckusick 	}
31453889Smckusick }
31553889Smckusick 
31653889Smckusick /*
31753889Smckusick  *  move lines
31853889Smckusick  *  move_lines(sl, nl, dl)  moves nl lines starting at line sl to line dl.
31953889Smckusick  */
32053889Smckusick move_lines(sl, nl, dl)
32153889Smckusick 	int sl, nl, dl;
32253889Smckusick {
32353889Smckusick 	move_rect(x_ofst, char_h*(sl - 1) + y_ofst, char_w*(rit_m - LFT_M + 1),
32453889Smckusick 		char_h*nl, x_ofst, char_h*(dl - 1) + y_ofst, BF_S);
32553889Smckusick 	PRE_EMPT;
32653889Smckusick }
32753889Smckusick 
32853889Smckusick /*
32953889Smckusick  *  move chars
33053889Smckusick  *  move_chars(sx, sy, nchar, dx) moves nchar characters at position (sx, sy)
33153889Smckusick  *  to (dx, sy).
33253889Smckusick  */
33353889Smckusick move_chars(sx, sy, nchar, dx)
33453889Smckusick 	int sx, sy;
33553889Smckusick 	int nchar;
33653889Smckusick 	int dx;
33753889Smckusick {
33853889Smckusick 	move_rect(char_w*(sx - 1) + x_ofst, char_h*(sy - 1) + y_ofst,
33953889Smckusick 	    char_w * nchar, char_h,
34053889Smckusick 	    char_w*(dx - 1) + x_ofst, char_h*(sy - 1) + y_ofst, BF_S);
34153889Smckusick }
34253889Smckusick 
34353889Smckusick /*
34453889Smckusick  *  clear lines
34553889Smckusick  *  clear_lines(sl, nl, rev) clears nl lines starting at line sl with rev
34653889Smckusick  *  mode. If rev = 0 then normal clear else reverse clear.
34753889Smckusick  */
34853889Smckusick clear_lines(sl, nl, rev, fcol, bcol)
34953889Smckusick 	int sl, nl;
35053889Smckusick 	int rev;
35153889Smckusick 	int fcol, bcol;
35253889Smckusick {
35353889Smckusick 	if (nl == btm_m) {
35453889Smckusick 		clear_rect(0, 0, scr_w, scr_h, BF_S, rev?fcol:bcol, bcol);
35553889Smckusick 	} else if (nl > 0) {
35653889Smckusick 		clear_rect(x_ofst, char_h*(sl - 1) + y_ofst,
35753889Smckusick 			char_w*(rit_m - LFT_M + 1), char_h*nl,
35853889Smckusick 			BF_S, rev?fcol:bcol, bcol);
35953889Smckusick 	}
36053889Smckusick }
36153889Smckusick 
36253889Smckusick /*
36353889Smckusick  *  Clear chars
36453889Smckusick  *  clear_chars(x, y, nchar, rev) clears nchar characters following the
36553889Smckusick  *  position (x, y) with rev mode. If rev = 0 then normal clear else
36653889Smckusick  *  reverse clear.
36753889Smckusick  */
36853889Smckusick clear_chars(x, y, nchar, rev, fcol, bcol)
36953889Smckusick 	int x, y;
37053889Smckusick 	int nchar;
37153889Smckusick 	int rev;
37253889Smckusick 	int fcol, bcol;
37353889Smckusick {
37453889Smckusick 	if (nchar > 0) {
37553889Smckusick 		clear_rect(char_w*(x - 1) + x_ofst, char_h*(y - 1) + y_ofst,
37653889Smckusick 			char_w*nchar, char_h, BF_S, rev?fcol:bcol, bcol);
37753889Smckusick 	}
37853889Smckusick }
37953889Smckusick 
38053889Smckusick reverse_rec(fcol, bcol)
38153889Smckusick 	int fcol, bcol;
38253889Smckusick {
38353889Smckusick 	clear_rect(0, 0, scr_w, scr_h, BF_SDX, fcol^bcol, 0);
38453889Smckusick }
38553889Smckusick 
38653889Smckusick copy_char(sp, c, kanji)
38753889Smckusick 	register SCREEN *sp;
38853889Smckusick 	register unsigned int c;
38953889Smckusick 	int kanji;
39053889Smckusick {
39153889Smckusick 	register char *f_addr;
39253889Smckusick 	register int len;
39353889Smckusick 	register lRectangle *sr, *dr;
39453889Smckusick 	lRectangle udr;
39553889Smckusick 	register char **fnt_addr;
39653889Smckusick 	extern struct fb_map rommap;
39753889Smckusick 
39853889Smckusick 	lock_bitmap();
39953889Smckusick 
40053889Smckusick 	if (consfb->font_h == 24)
40153889Smckusick 		fnt_addr = ext_fnt24_addr;
40253889Smckusick 	else
40353889Smckusick 		fnt_addr = ext_fnt_addr;
40453889Smckusick 
40553889Smckusick 	if (kanji) {
40653889Smckusick 		dr = &char_r2;
40753889Smckusick 		sr = &font_r2;
40853889Smckusick 		len = font_len2;
40953889Smckusick 	} else {
41053889Smckusick 		dr = &char_r1;
41153889Smckusick 		sr = &font_r1;
41253889Smckusick 		len = font_len1;
41353889Smckusick 	}
41453889Smckusick 
41553889Smckusick 	dr->origin = sp->s_csr.csr_p;
41653889Smckusick 
41753889Smckusick 	setropfunc(BF_S, 0, fcolor, bcolor);
41853889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 0);
41953889Smckusick 	fbbm_rop_clear(consfb, dr);
42053889Smckusick 
42153889Smckusick 	if (kanji) {
42253889Smckusick 		/*
42353889Smckusick 		 * KANJI code... kanji char
42453889Smckusick 		 */
42553889Smckusick 		f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
42653889Smckusick #ifdef CPU_DOUBLE
42753889Smckusick 	} else if (fnt_addr == 0) {
42853889Smckusick 		/*
42953889Smckusick 		 * no external fonts... try to use ROM fonts
43053889Smckusick 		 */
43153889Smckusick 		len = font_len2;
43253889Smckusick 		f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
43353889Smckusick #endif
43453889Smckusick #ifdef KM_ASCII
43553889Smckusick 	} else if (tmode == KM_ASCII) {
43653889Smckusick 		/*
43753889Smckusick 		 * terminal mode is ASCII... ASCII (ISO) char
43853889Smckusick 		 */
43953889Smckusick 		if ((c >= 0x20) && (c <= 0x7e)) {
44053889Smckusick 			/*
44153889Smckusick 			 * ASCII char
44253889Smckusick 			 */
44353889Smckusick 			f_addr = fnt_addr[c];
44453889Smckusick 		} else if ((c >= 0xa0) && (c <= 0xff)) {
44553889Smckusick 			/*
44653889Smckusick 			 * ISO char
44753889Smckusick 			 */
44853889Smckusick 			f_addr = fnt_addr[c - 32];
44953889Smckusick 		} else {
45053889Smckusick 			/*
45153889Smckusick 			 * UNKNOWN char
45253889Smckusick 			 */
45353889Smckusick 			f_addr = (caddr_t)zero;
45453889Smckusick 		}
45553889Smckusick #endif /* KM_ASCII */
45653889Smckusick 	} else {
45753889Smckusick 		/*
45853889Smckusick 		 * terminal mode is not ASCII... JIS, SJIS, EUC, ...
45953889Smckusick 		 */
46053889Smckusick 		if ((c >= 0x20) && (c <= 0x7e)) {
46153889Smckusick 			/*
46253889Smckusick 			 * ASCII char
46353889Smckusick 			 */
46453889Smckusick 			f_addr = fnt_addr[c];
46553889Smckusick 		} else if ((c >= 0xa1) && (c <= 0xdf)) {
46653889Smckusick 			/*
46753889Smckusick 			 * KANA char
46853889Smckusick 			 */
46953889Smckusick 			f_addr = fnt_addr[c + 32];
47053889Smckusick 		} else {
47153889Smckusick 			/*
47253889Smckusick 			 * UNKNOWN char
47353889Smckusick 			 */
47453889Smckusick 			f_addr = (caddr_t)zero;
47553889Smckusick 		}
47653889Smckusick 	}
47753889Smckusick 
47853889Smckusick 	dr->origin.y += ch_pos;
47953889Smckusick 
48053889Smckusick 	setropfunc(BF_S, 1, fcolor, bcolor);
48153889Smckusick 
48253889Smckusick 	if (f_addr != 0) {
48353889Smckusick 		fbbm_rop_winit(consfb);
48453889Smckusick 		rommap.fm_vaddr = f_addr;
48553889Smckusick 		rommap.fm_offset = 0;
48653889Smckusick 		fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
48753889Smckusick 				sr, &dr->origin, consfb->planemask);
48853889Smckusick 		if (sp->s_csr.csr_attributes & BOLD) {
48953889Smckusick 			dr->origin.x += 1;
49053889Smckusick 			fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
49153889Smckusick 					sr, &dr->origin, consfb->planemask);
49253889Smckusick 		}
49353889Smckusick 	} else {
49453889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
49553889Smckusick 		fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
49653889Smckusick 		if (sp->s_csr.csr_attributes & BOLD) {
49753889Smckusick 			dr->origin.x += 1;
49853889Smckusick 			fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
49953889Smckusick 		}
50053889Smckusick 	}
50153889Smckusick 
50253889Smckusick 	if (sp->s_csr.csr_attributes & USCORE) {
50353889Smckusick 
50453889Smckusick 		udr.origin.x = sp->s_csr.csr_p.x;
50553889Smckusick 		udr.origin.y = sp->s_csr.csr_p.y + ul_pos;
50653889Smckusick 		udr.extent.x = char_w;
50753889Smckusick 		udr.extent.y = 1;
50853889Smckusick 
50953889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
51053889Smckusick 		fbbm_rop_cinit(consfb, consfb->planemask, 1);
51153889Smckusick 		fbbm_rop_clear(consfb, &udr);
51253889Smckusick 	}
51353889Smckusick 	unlock_bitmap();
51453889Smckusick }
51553889Smckusick 
51653889Smckusick vt_flush(spc)
51753889Smckusick 	struct cursor *spc;
51853889Smckusick {
51953889Smckusick 	register char *f_addr;
52053889Smckusick 	register int len;
52153889Smckusick 	register lRectangle *sr, *dr;
52253889Smckusick 	lRectangle fr, cr;
52353889Smckusick 	register int i;
52453889Smckusick 	register unsigned int c;
52553889Smckusick 	lRectangle udr;
52653889Smckusick 	register char **fnt_addr;
52753889Smckusick 	char *oldf_addr = (char *)-1;
52853889Smckusick 	extern struct fb_map rommap;
52953889Smckusick 
53053889Smckusick 	if (fp == 0)
53153889Smckusick 		return;
53253889Smckusick 
53353889Smckusick 	cursor_off();
53453889Smckusick 
53553889Smckusick 	lock_bitmap();
53653889Smckusick 
53753889Smckusick 	if (consfb->font_h == 24)
53853889Smckusick 		fnt_addr = ext_fnt24_addr;
53953889Smckusick 	else
54053889Smckusick 		fnt_addr = ext_fnt_addr;
54153889Smckusick 
54253889Smckusick 	udr.origin = fpp;
54353889Smckusick 	udr.extent.x = fpn * char_w;
54453889Smckusick 	udr.extent.y = char_h;
54553889Smckusick 
54653889Smckusick 	setropfunc(BF_S, 0, fcolor, bcolor);
54753889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 0);
54853889Smckusick 	fbbm_rop_clear(consfb, &udr);
54953889Smckusick 
55053889Smckusick 	if (fpa & BOLD)
55153889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
55253889Smckusick 	else
55353889Smckusick 		setropfunc(BF_S, 0, fcolor, bcolor);
55453889Smckusick 
55553889Smckusick 	fbbm_rop_winit(consfb);
55653889Smckusick 
55753889Smckusick 	sr = &fr;
55853889Smckusick 	dr = &cr;
55953889Smckusick 	sr->origin.x = 0;
56053889Smckusick 	sr->origin.y = 0;
56153889Smckusick 	sr->extent.y = font_h;
56253889Smckusick 	dr->origin.x = fpp.x;
56353889Smckusick 	dr->origin.y = fpp.y + ch_pos;
56453889Smckusick 
56553889Smckusick 	for (i = 0; i < fp; i++) {
56653889Smckusick 		c = fbuf[i];
56753889Smckusick 
56853889Smckusick 		sr->extent.x = font_w;
56953889Smckusick 		dr->extent.x = char_w;
57053889Smckusick 
57153889Smckusick 		if (c & 0xff00) {
57253889Smckusick 			/*
57353889Smckusick 			 * KANJI code... kanji char
57453889Smckusick 			 */
57553889Smckusick 			sr->extent.x = font_r2.extent.x;
57653889Smckusick 			dr->extent.x = char_r2.extent.x;
57753889Smckusick 			len = font_len2;
57853889Smckusick 			f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
57953889Smckusick #ifdef CPU_DOUBLE
58053889Smckusick 		} else if (fnt_addr == 0) {
58153889Smckusick 			/*
58253889Smckusick 			 * no external fonts... try to use ROM fonts
58353889Smckusick 			 */
58453889Smckusick 			sr->extent.x = font_r1.extent.x;	/*XXX*/
58553889Smckusick 			dr->extent.x = char_r1.extent.x;	/*XXX*/
58653889Smckusick 			len = font_len2;
58753889Smckusick 			f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
58853889Smckusick #endif
58953889Smckusick #ifdef KM_ASCII
59053889Smckusick 		} else if (tmode == KM_ASCII) {
59153889Smckusick 			/*
59253889Smckusick 			 * terminal mode is ASCII... ASCII (ISO) char
59353889Smckusick 			 */
59453889Smckusick 			len = font_len1;
59553889Smckusick 			if ((c >= 0x20) && (c <= 0x7e)) {
59653889Smckusick 				/*
59753889Smckusick 				 * ASCII char
59853889Smckusick 				 */
59953889Smckusick 				f_addr = fnt_addr[c];
60053889Smckusick 			} else if ((c >= 0xa0) && (c <= 0xff)) {
60153889Smckusick 				/*
60253889Smckusick 				 * ISO char
60353889Smckusick 				 */
60453889Smckusick 				f_addr = fnt_addr[c - 32];
60553889Smckusick 			} else {
60653889Smckusick 				/*
60753889Smckusick 				 * UNKNOWN char
60853889Smckusick 				 */
60953889Smckusick 				f_addr = (caddr_t)zero;
61053889Smckusick 			}
61153889Smckusick #endif /* KM_ASCII */
61253889Smckusick 		} else {
61353889Smckusick 			/*
61453889Smckusick 			 * terminal mode is not ASCII... JIS, SJIS, EUC, ...
61553889Smckusick 			 */
61653889Smckusick 			len = font_len1;
61753889Smckusick 			if ((c >= 0x20) && (c <= 0x7e)) {
61853889Smckusick 				/*
61953889Smckusick 				 * ASCII char
62053889Smckusick 				 */
62153889Smckusick 				f_addr = fnt_addr[c];
62253889Smckusick 			} else if ((c >= 0xa1) && (c <= 0xdf)) {
62353889Smckusick 				/*
62453889Smckusick 				 * KANA char
62553889Smckusick 				 */
62653889Smckusick 				f_addr = fnt_addr[c + 64];
62753889Smckusick 			} else {
62853889Smckusick 				/*
62953889Smckusick 				 * UNKNOWN char
63053889Smckusick 				 */
63153889Smckusick 				f_addr = (caddr_t)zero;
63253889Smckusick 			}
63353889Smckusick 		}
63453889Smckusick 
63553889Smckusick 		if (f_addr != 0) {
63653889Smckusick 			if (oldf_addr == 0)
63753889Smckusick 				fbbm_rop_winit(consfb);
63853889Smckusick 
63953889Smckusick 			rommap.fm_vaddr = f_addr;
64053889Smckusick 			rommap.fm_offset = 0;
64153889Smckusick 			fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
64253889Smckusick 					sr, &dr->origin, consfb->planemask);
64353889Smckusick 			if (fpa & BOLD) {
64453889Smckusick 				/*
64553889Smckusick 				 * Bold char
64653889Smckusick 				 */
64753889Smckusick 				dr->origin.x += 1;
64853889Smckusick 				fbbm_rop_write(consfb, &rommap,
64953889Smckusick 						rommap.fm_offset, len,
65053889Smckusick 						sr, &dr->origin, consfb->planemask);
65153889Smckusick 				dr->origin.x -= 1;
65253889Smckusick 			}
65353889Smckusick 		} else {
65453889Smckusick 			if (oldf_addr != 0)
65553889Smckusick 				fbbm_rop_init(consfb, consfb->funcvec);
65653889Smckusick 
65753889Smckusick 			fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
65853889Smckusick 			if (fpa & BOLD) {
65953889Smckusick 				/*
66053889Smckusick 				 * Bold char
66153889Smckusick 				 */
66253889Smckusick 				dr->origin.x += 1;
66353889Smckusick 				fbbm_rop_copy(consfb, sr, &dr->origin,
66453889Smckusick 						1, consfb->planemask);
66553889Smckusick 				dr->origin.x -= 1;
66653889Smckusick 			}
66753889Smckusick 
66853889Smckusick 		}
66953889Smckusick 		dr->origin.x += dr->extent.x;
67053889Smckusick 		oldf_addr = f_addr;
67153889Smckusick 
67253889Smckusick 		/*
67353889Smckusick 		 * sr->origin.x and sr->origin.y were changed by
67453889Smckusick 		 * fbpop_Krom_addr(), fb254_Krom_addr().
67553889Smckusick 		 */
67653889Smckusick 		sr->origin.x = 0;
67753889Smckusick 		sr->origin.y = 0;
67853889Smckusick 	}
67953889Smckusick 
68053889Smckusick 	if (fpa & USCORE) {
68153889Smckusick 		udr.origin.y += ul_pos;
68253889Smckusick 		udr.extent.y = 1;
68353889Smckusick 
68453889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
68553889Smckusick 		fbbm_rop_cinit(consfb, consfb->planemask, 1);
68653889Smckusick 		fbbm_rop_clear(consfb, &udr);
68753889Smckusick 	}
68853889Smckusick 	fp = 0;
68953889Smckusick 
69053889Smckusick 	unlock_bitmap();
69153889Smckusick 
69253889Smckusick 	dr->origin.y -= ch_pos;
69353889Smckusick 	cursor_on(&(spc->csr_p));
69453889Smckusick }
695