xref: /csrg-svn/sys/news3400/bm/bitmapif.c (revision 53889)
1*53889Smckusick /*
2*53889Smckusick  * Copyright (c) 1992 The Regents of the University of California.
3*53889Smckusick  * All rights reserved.
4*53889Smckusick  *
5*53889Smckusick  * This code is derived from software contributed to Berkeley by
6*53889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7*53889Smckusick  *
8*53889Smckusick  * %sccs.include.redist.c%
9*53889Smckusick  *
10*53889Smckusick  * from: $Hdr: bitmapif.c,v 4.300 91/06/09 06:14:40 root Rel41 $ SONY
11*53889Smckusick  *
12*53889Smckusick  *	@(#)bitmapif.c	7.1 (Berkeley) 06/04/92
13*53889Smckusick  */
14*53889Smckusick 
15*53889Smckusick #include "../include/fix_machine_type.h"
16*53889Smckusick 
17*53889Smckusick #ifdef IPC_MRX
18*53889Smckusick #include "../../h/param.h"
19*53889Smckusick #include "../../h/types.h"
20*53889Smckusick #include "../../iop/framebuf.h"
21*53889Smckusick #include "../../iop/fbreg.h"
22*53889Smckusick #else
23*53889Smckusick #include "param.h"
24*53889Smckusick #include "types.h"
25*53889Smckusick #include "../iop/framebuf.h"
26*53889Smckusick #include "../iop/fbreg.h"
27*53889Smckusick #endif
28*53889Smckusick 
29*53889Smckusick #include "../fb/fbdefs.h"
30*53889Smckusick 
31*53889Smckusick #include "../bm/vt100.h"
32*53889Smckusick #include "../bm/bitmapif.h"
33*53889Smckusick 
34*53889Smckusick extern int bm_todo;
35*53889Smckusick extern int tmode;
36*53889Smckusick 
37*53889Smckusick #ifdef CPU_SINGLE
38*53889Smckusick extern char *ext_fnt_addr[];
39*53889Smckusick extern char *ext_fnt24_addr[];
40*53889Smckusick #else /* CPU_SINGLE */
41*53889Smckusick #ifdef IPC_MRX
42*53889Smckusick extern char **ext_fnt_addr;
43*53889Smckusick extern char **ext_fnt24_addr;
44*53889Smckusick #else
45*53889Smckusick char **ext_fnt_addr = 0;
46*53889Smckusick char **ext_fnt24_addr = 0;
47*53889Smckusick #endif
48*53889Smckusick #define lock_bitmap()
49*53889Smckusick #define unlock_bitmap()
50*53889Smckusick #endif /* CPU_SINGLE */
51*53889Smckusick 
52*53889Smckusick extern	SCREEN	screen;
53*53889Smckusick 
54*53889Smckusick #ifdef IPC_MRX
55*53889Smckusick extern int bitmap_use;
56*53889Smckusick #endif
57*53889Smckusick 
58*53889Smckusick #ifdef CPU_SINGLE
59*53889Smckusick #include "../include/cpu.h"
60*53889Smckusick #define PRE_EMPT	need_resched()
61*53889Smckusick #else
62*53889Smckusick #define	PRE_EMPT
63*53889Smckusick #endif
64*53889Smckusick 
65*53889Smckusick short zero[32 * 2];
66*53889Smckusick struct	csr_buf local_csr_buf;
67*53889Smckusick 
68*53889Smckusick #ifdef CPU_SINGLE
69*53889Smckusick struct fb_map rommap;
70*53889Smckusick #endif
71*53889Smckusick 
72*53889Smckusick bitmapinit()
73*53889Smckusick {
74*53889Smckusick 	fbbm_rop_reset(consfb);
75*53889Smckusick 	if (!consfb->Mono) {
76*53889Smckusick 		lock_bitmap();
77*53889Smckusick 		fbbm_init_palette(consfb);
78*53889Smckusick 		unlock_bitmap();
79*53889Smckusick 	}
80*53889Smckusick }
81*53889Smckusick 
82*53889Smckusick bm_pallet_read(entry)
83*53889Smckusick 	int entry;
84*53889Smckusick {
85*53889Smckusick 	lPalette lp;
86*53889Smckusick 	sPalette palette;
87*53889Smckusick #ifdef CPU_SINGLE
88*53889Smckusick 	struct fb_map rommap;
89*53889Smckusick #endif
90*53889Smckusick 
91*53889Smckusick 	lock_bitmap();
92*53889Smckusick 
93*53889Smckusick 	lp.count = 1;
94*53889Smckusick #ifdef CPU_SINGLE
95*53889Smckusick 	lp.palette = (sPalette *)&rommap;
96*53889Smckusick 	rommap.fm_vaddr = (caddr_t)&palette;
97*53889Smckusick 	rommap.fm_offset = 0;
98*53889Smckusick #else
99*53889Smckusick 	lp.palette = &palette;
100*53889Smckusick #endif
101*53889Smckusick 	palette.index = entry;
102*53889Smckusick 
103*53889Smckusick 	fbbm_get_palette(consfb, &lp);
104*53889Smckusick 
105*53889Smckusick 	unlock_bitmap();
106*53889Smckusick 
107*53889Smckusick 	return((palette.rgb.r << 16) | (palette.rgb.g << 8) | palette.rgb.b);
108*53889Smckusick }
109*53889Smckusick 
110*53889Smckusick bm_pallet_write(entry, val)
111*53889Smckusick 	int entry;
112*53889Smckusick 	int val;
113*53889Smckusick {
114*53889Smckusick 	lPalette lp;
115*53889Smckusick 	sPalette palette;
116*53889Smckusick #ifdef CPU_SINGLE
117*53889Smckusick 	struct fb_map rommap;
118*53889Smckusick #endif
119*53889Smckusick 
120*53889Smckusick 	lock_bitmap();
121*53889Smckusick 
122*53889Smckusick 	lp.count = 1;
123*53889Smckusick #ifdef CPU_SINGLE
124*53889Smckusick 	lp.palette = (sPalette *)&rommap;
125*53889Smckusick 	rommap.fm_vaddr = (caddr_t)&palette;
126*53889Smckusick 	rommap.fm_offset = 0;
127*53889Smckusick #else
128*53889Smckusick 	lp.palette = &palette;
129*53889Smckusick #endif
130*53889Smckusick 	palette.index = entry;
131*53889Smckusick 	palette.rgb.r = ((val >> 16) & 0xff);
132*53889Smckusick 	palette.rgb.g = ((val >> 8) & 0xff);
133*53889Smckusick 	palette.rgb.b = (val & 0xff);
134*53889Smckusick 	fbbm_set_palette(consfb, &lp);
135*53889Smckusick 
136*53889Smckusick 	unlock_bitmap();
137*53889Smckusick 
138*53889Smckusick 	return(val);
139*53889Smckusick }
140*53889Smckusick 
141*53889Smckusick unsigned
142*53889Smckusick sftjis_to_jis(h, l)
143*53889Smckusick 	register unsigned int h, l;
144*53889Smckusick {
145*53889Smckusick 	if ((h >= JVR1S) && (h <= JVR1E))
146*53889Smckusick 		h -= JVR1S;
147*53889Smckusick 	else if ((h >= JVR2S) && (h <= JVR2E))
148*53889Smckusick 		h = h - JVR2S + 0x1f;
149*53889Smckusick 	else
150*53889Smckusick 		return (0);
151*53889Smckusick 
152*53889Smckusick 	h <<= 1;
153*53889Smckusick 
154*53889Smckusick 	if ((l >= JHR1S) && (l <= JHR1E))
155*53889Smckusick 		l -= JHR1S;
156*53889Smckusick 	else if ((l >= JHR2S) && (l <= JHR2E))
157*53889Smckusick 		l = l - JHR2S + 0x3f;
158*53889Smckusick 	else if ((l >= JHR3S) && (l <= JHR3E)) {
159*53889Smckusick 		l -= JHR3S;
160*53889Smckusick 		h++;
161*53889Smckusick 	} else
162*53889Smckusick 		return (0);
163*53889Smckusick 
164*53889Smckusick 	return(((h + 0x21) << 8) + l + 0x21);
165*53889Smckusick }
166*53889Smckusick 
167*53889Smckusick setropfunc(func, transp, fore, aux)
168*53889Smckusick 	int func, fore, aux;
169*53889Smckusick {
170*53889Smckusick 	char tmp[4];
171*53889Smckusick 	register int i = consfb->fbNplane;
172*53889Smckusick 	register char *funcp = consfb->funcvec;
173*53889Smckusick 
174*53889Smckusick 	consfb->func = func;
175*53889Smckusick 	consfb->fore = fore;
176*53889Smckusick 	consfb->aux = aux;
177*53889Smckusick 	consfb->trans = transp;
178*53889Smckusick 
179*53889Smckusick 	tmp[0] = TRANS(transp, (func & 0x0c) | (func>>2));
180*53889Smckusick 	tmp[1] = TRANS(transp, (func>>2) | ((func<<2) & 0x0c));
181*53889Smckusick 	tmp[2] = TRANS(transp, func);
182*53889Smckusick 	tmp[3] = TRANS(transp, (func<<2) & 0x0c | func & 3);
183*53889Smckusick 
184*53889Smckusick 	while (--i >= 0) {
185*53889Smckusick 		*funcp++ = tmp[((fore & 1) << 1) | (aux & 1)];
186*53889Smckusick 		fore >>= 1; aux >>= 1;
187*53889Smckusick 	}
188*53889Smckusick }
189*53889Smckusick 
190*53889Smckusick move_rect(src_x, src_y, width, height, dst_x, dst_y, rop)
191*53889Smckusick 	int src_x, src_y;
192*53889Smckusick 	int width, height;
193*53889Smckusick 	int dst_x, dst_y;
194*53889Smckusick 	int rop;
195*53889Smckusick {
196*53889Smckusick 	lRectangle sr;
197*53889Smckusick 	lPoint dp;
198*53889Smckusick 
199*53889Smckusick 	sr.origin.x = src_x;
200*53889Smckusick 	sr.origin.y = src_y;
201*53889Smckusick 	sr.extent.x = width;
202*53889Smckusick 	sr.extent.y = height;
203*53889Smckusick 
204*53889Smckusick 	dp.x = dst_x;
205*53889Smckusick 	dp.y = dst_y;
206*53889Smckusick 
207*53889Smckusick 	lock_bitmap();
208*53889Smckusick 	setropfunc(rop, 0, consfb->planemask, 0);
209*53889Smckusick 	fbbm_rop_init(consfb, consfb->funcvec);
210*53889Smckusick 	fbbm_rop_copy(consfb, &sr, &dp, 0, consfb->planemask);
211*53889Smckusick 	unlock_bitmap();
212*53889Smckusick }
213*53889Smckusick 
214*53889Smckusick clear_rect(x, y, width, height, rop, fore, aux)
215*53889Smckusick 	int x, y;
216*53889Smckusick 	int width, height;
217*53889Smckusick 	int rop;
218*53889Smckusick 	int fore;
219*53889Smckusick 	int aux;
220*53889Smckusick {
221*53889Smckusick 	lRectangle dr;
222*53889Smckusick 
223*53889Smckusick 	dr.origin.x = x;
224*53889Smckusick 	dr.origin.y = y;
225*53889Smckusick 	dr.extent.x = width;
226*53889Smckusick 	dr.extent.y = height;
227*53889Smckusick 
228*53889Smckusick 	lock_bitmap();
229*53889Smckusick 	setropfunc(rop, 0, fore, aux);
230*53889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 1);
231*53889Smckusick 	fbbm_rop_clear(consfb, &dr);
232*53889Smckusick 	unlock_bitmap();
233*53889Smckusick }
234*53889Smckusick 
235*53889Smckusick line(param)
236*53889Smckusick 	short *param;
237*53889Smckusick {
238*53889Smckusick 	lPoint p[2];
239*53889Smckusick 	lRectangle clip;
240*53889Smckusick 
241*53889Smckusick 	p[0].x = param[0];
242*53889Smckusick 	p[0].y = param[1];
243*53889Smckusick 	p[1].x = param[2];
244*53889Smckusick 	p[1].y = param[3];
245*53889Smckusick 	clip = consfb->VisRect;
246*53889Smckusick 
247*53889Smckusick 	lock_bitmap();
248*53889Smckusick 	fbbm_rop_vect(consfb, &clip, param[4] & 0xf,
249*53889Smckusick 		      fbbm_get_pixel(consfb, param[5]), 0, 1,
250*53889Smckusick 		      consfb->planemask, 2, p, LINE_SLD, 1, 0);
251*53889Smckusick 	unlock_bitmap();
252*53889Smckusick }
253*53889Smckusick 
254*53889Smckusick /*
255*53889Smckusick  *  cursor on
256*53889Smckusick  *  cursor_on(x, y, plane) puts cursor at position (x, y) with color = plane,
257*53889Smckusick  *  if cursor sw is off.
258*53889Smckusick  *  At the same time the image of cursor position is saved.
259*53889Smckusick  */
260*53889Smckusick cursor_on(p)
261*53889Smckusick 	lPoint *p;
262*53889Smckusick {
263*53889Smckusick 	register struct csr_buf *csr_bp = &local_csr_buf;
264*53889Smckusick 	register lRectangle *dr;
265*53889Smckusick 
266*53889Smckusick 	if (screen.s_term_mode & DECCSR_ACTV &&
267*53889Smckusick 	    bm_todo <= 0 && csr_bp->csr_sw == C_OFF) {
268*53889Smckusick 
269*53889Smckusick 		if (csr_bp->csr_number == 2 && p->x != rit_m)
270*53889Smckusick 			dr = &char_r2;
271*53889Smckusick 		else
272*53889Smckusick 			dr = &char_r1;
273*53889Smckusick 
274*53889Smckusick 		dr->origin = *p;
275*53889Smckusick 
276*53889Smckusick 		lock_bitmap();
277*53889Smckusick 		setropfunc(BF_DI, 0, consfb->planemask, 0);
278*53889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
279*53889Smckusick 		fbbm_rop_copy(consfb, dr, dr, 0, (fcolor^bcolor) & consfb->planemask);
280*53889Smckusick 		unlock_bitmap();
281*53889Smckusick 
282*53889Smckusick 		csr_bp->csr_sw = C_ON;
283*53889Smckusick 		csr_bp->csr_p = *p;
284*53889Smckusick 	}
285*53889Smckusick }
286*53889Smckusick 
287*53889Smckusick /*
288*53889Smckusick  *  cursor off
289*53889Smckusick  *  cursor_off() turns off cursor.
290*53889Smckusick  *  The image of cursor position which has previously saved by cursor_on
291*53889Smckusick  *  is restored.
292*53889Smckusick  */
293*53889Smckusick cursor_off()
294*53889Smckusick {
295*53889Smckusick 	register  struct  csr_buf  *csr_bp = &local_csr_buf;
296*53889Smckusick 	register lRectangle *dr;
297*53889Smckusick 
298*53889Smckusick 	if (screen.s_term_mode & DECCSR_ACTV && csr_bp->csr_sw == C_ON) {
299*53889Smckusick 		if (csr_bp->csr_number == 2 && csr_bp->csr_x != rit_m)
300*53889Smckusick 			dr = &char_r2;
301*53889Smckusick 		else
302*53889Smckusick 			dr = &char_r1;
303*53889Smckusick 
304*53889Smckusick 		dr->origin = csr_bp->csr_p;
305*53889Smckusick 
306*53889Smckusick 		lock_bitmap();
307*53889Smckusick 		setropfunc(BF_DI, 0, consfb->planemask, 0);
308*53889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
309*53889Smckusick 		fbbm_rop_copy(consfb, dr, dr, 0, (fcolor^bcolor) & consfb->planemask);
310*53889Smckusick 		unlock_bitmap();
311*53889Smckusick 
312*53889Smckusick 		csr_bp->csr_sw = C_OFF;
313*53889Smckusick 	}
314*53889Smckusick }
315*53889Smckusick 
316*53889Smckusick /*
317*53889Smckusick  *  move lines
318*53889Smckusick  *  move_lines(sl, nl, dl)  moves nl lines starting at line sl to line dl.
319*53889Smckusick  */
320*53889Smckusick move_lines(sl, nl, dl)
321*53889Smckusick 	int sl, nl, dl;
322*53889Smckusick {
323*53889Smckusick 	move_rect(x_ofst, char_h*(sl - 1) + y_ofst, char_w*(rit_m - LFT_M + 1),
324*53889Smckusick 		char_h*nl, x_ofst, char_h*(dl - 1) + y_ofst, BF_S);
325*53889Smckusick 	PRE_EMPT;
326*53889Smckusick }
327*53889Smckusick 
328*53889Smckusick /*
329*53889Smckusick  *  move chars
330*53889Smckusick  *  move_chars(sx, sy, nchar, dx) moves nchar characters at position (sx, sy)
331*53889Smckusick  *  to (dx, sy).
332*53889Smckusick  */
333*53889Smckusick move_chars(sx, sy, nchar, dx)
334*53889Smckusick 	int sx, sy;
335*53889Smckusick 	int nchar;
336*53889Smckusick 	int dx;
337*53889Smckusick {
338*53889Smckusick 	move_rect(char_w*(sx - 1) + x_ofst, char_h*(sy - 1) + y_ofst,
339*53889Smckusick 	    char_w * nchar, char_h,
340*53889Smckusick 	    char_w*(dx - 1) + x_ofst, char_h*(sy - 1) + y_ofst, BF_S);
341*53889Smckusick }
342*53889Smckusick 
343*53889Smckusick /*
344*53889Smckusick  *  clear lines
345*53889Smckusick  *  clear_lines(sl, nl, rev) clears nl lines starting at line sl with rev
346*53889Smckusick  *  mode. If rev = 0 then normal clear else reverse clear.
347*53889Smckusick  */
348*53889Smckusick clear_lines(sl, nl, rev, fcol, bcol)
349*53889Smckusick 	int sl, nl;
350*53889Smckusick 	int rev;
351*53889Smckusick 	int fcol, bcol;
352*53889Smckusick {
353*53889Smckusick 	if (nl == btm_m) {
354*53889Smckusick 		clear_rect(0, 0, scr_w, scr_h, BF_S, rev?fcol:bcol, bcol);
355*53889Smckusick 	} else if (nl > 0) {
356*53889Smckusick 		clear_rect(x_ofst, char_h*(sl - 1) + y_ofst,
357*53889Smckusick 			char_w*(rit_m - LFT_M + 1), char_h*nl,
358*53889Smckusick 			BF_S, rev?fcol:bcol, bcol);
359*53889Smckusick 	}
360*53889Smckusick }
361*53889Smckusick 
362*53889Smckusick /*
363*53889Smckusick  *  Clear chars
364*53889Smckusick  *  clear_chars(x, y, nchar, rev) clears nchar characters following the
365*53889Smckusick  *  position (x, y) with rev mode. If rev = 0 then normal clear else
366*53889Smckusick  *  reverse clear.
367*53889Smckusick  */
368*53889Smckusick clear_chars(x, y, nchar, rev, fcol, bcol)
369*53889Smckusick 	int x, y;
370*53889Smckusick 	int nchar;
371*53889Smckusick 	int rev;
372*53889Smckusick 	int fcol, bcol;
373*53889Smckusick {
374*53889Smckusick 	if (nchar > 0) {
375*53889Smckusick 		clear_rect(char_w*(x - 1) + x_ofst, char_h*(y - 1) + y_ofst,
376*53889Smckusick 			char_w*nchar, char_h, BF_S, rev?fcol:bcol, bcol);
377*53889Smckusick 	}
378*53889Smckusick }
379*53889Smckusick 
380*53889Smckusick reverse_rec(fcol, bcol)
381*53889Smckusick 	int fcol, bcol;
382*53889Smckusick {
383*53889Smckusick 	clear_rect(0, 0, scr_w, scr_h, BF_SDX, fcol^bcol, 0);
384*53889Smckusick }
385*53889Smckusick 
386*53889Smckusick copy_char(sp, c, kanji)
387*53889Smckusick 	register SCREEN *sp;
388*53889Smckusick 	register unsigned int c;
389*53889Smckusick 	int kanji;
390*53889Smckusick {
391*53889Smckusick 	register char *f_addr;
392*53889Smckusick 	register int len;
393*53889Smckusick 	register lRectangle *sr, *dr;
394*53889Smckusick 	lRectangle udr;
395*53889Smckusick 	register char **fnt_addr;
396*53889Smckusick 	extern struct fb_map rommap;
397*53889Smckusick 
398*53889Smckusick 	lock_bitmap();
399*53889Smckusick 
400*53889Smckusick 	if (consfb->font_h == 24)
401*53889Smckusick 		fnt_addr = ext_fnt24_addr;
402*53889Smckusick 	else
403*53889Smckusick 		fnt_addr = ext_fnt_addr;
404*53889Smckusick 
405*53889Smckusick 	if (kanji) {
406*53889Smckusick 		dr = &char_r2;
407*53889Smckusick 		sr = &font_r2;
408*53889Smckusick 		len = font_len2;
409*53889Smckusick 	} else {
410*53889Smckusick 		dr = &char_r1;
411*53889Smckusick 		sr = &font_r1;
412*53889Smckusick 		len = font_len1;
413*53889Smckusick 	}
414*53889Smckusick 
415*53889Smckusick 	dr->origin = sp->s_csr.csr_p;
416*53889Smckusick 
417*53889Smckusick 	setropfunc(BF_S, 0, fcolor, bcolor);
418*53889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 0);
419*53889Smckusick 	fbbm_rop_clear(consfb, dr);
420*53889Smckusick 
421*53889Smckusick 	if (kanji) {
422*53889Smckusick 		/*
423*53889Smckusick 		 * KANJI code... kanji char
424*53889Smckusick 		 */
425*53889Smckusick 		f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
426*53889Smckusick #ifdef CPU_DOUBLE
427*53889Smckusick 	} else if (fnt_addr == 0) {
428*53889Smckusick 		/*
429*53889Smckusick 		 * no external fonts... try to use ROM fonts
430*53889Smckusick 		 */
431*53889Smckusick 		len = font_len2;
432*53889Smckusick 		f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
433*53889Smckusick #endif
434*53889Smckusick #ifdef KM_ASCII
435*53889Smckusick 	} else if (tmode == KM_ASCII) {
436*53889Smckusick 		/*
437*53889Smckusick 		 * terminal mode is ASCII... ASCII (ISO) char
438*53889Smckusick 		 */
439*53889Smckusick 		if ((c >= 0x20) && (c <= 0x7e)) {
440*53889Smckusick 			/*
441*53889Smckusick 			 * ASCII char
442*53889Smckusick 			 */
443*53889Smckusick 			f_addr = fnt_addr[c];
444*53889Smckusick 		} else if ((c >= 0xa0) && (c <= 0xff)) {
445*53889Smckusick 			/*
446*53889Smckusick 			 * ISO char
447*53889Smckusick 			 */
448*53889Smckusick 			f_addr = fnt_addr[c - 32];
449*53889Smckusick 		} else {
450*53889Smckusick 			/*
451*53889Smckusick 			 * UNKNOWN char
452*53889Smckusick 			 */
453*53889Smckusick 			f_addr = (caddr_t)zero;
454*53889Smckusick 		}
455*53889Smckusick #endif /* KM_ASCII */
456*53889Smckusick 	} else {
457*53889Smckusick 		/*
458*53889Smckusick 		 * terminal mode is not ASCII... JIS, SJIS, EUC, ...
459*53889Smckusick 		 */
460*53889Smckusick 		if ((c >= 0x20) && (c <= 0x7e)) {
461*53889Smckusick 			/*
462*53889Smckusick 			 * ASCII char
463*53889Smckusick 			 */
464*53889Smckusick 			f_addr = fnt_addr[c];
465*53889Smckusick 		} else if ((c >= 0xa1) && (c <= 0xdf)) {
466*53889Smckusick 			/*
467*53889Smckusick 			 * KANA char
468*53889Smckusick 			 */
469*53889Smckusick 			f_addr = fnt_addr[c + 32];
470*53889Smckusick 		} else {
471*53889Smckusick 			/*
472*53889Smckusick 			 * UNKNOWN char
473*53889Smckusick 			 */
474*53889Smckusick 			f_addr = (caddr_t)zero;
475*53889Smckusick 		}
476*53889Smckusick 	}
477*53889Smckusick 
478*53889Smckusick 	dr->origin.y += ch_pos;
479*53889Smckusick 
480*53889Smckusick 	setropfunc(BF_S, 1, fcolor, bcolor);
481*53889Smckusick 
482*53889Smckusick 	if (f_addr != 0) {
483*53889Smckusick 		fbbm_rop_winit(consfb);
484*53889Smckusick 		rommap.fm_vaddr = f_addr;
485*53889Smckusick 		rommap.fm_offset = 0;
486*53889Smckusick 		fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
487*53889Smckusick 				sr, &dr->origin, consfb->planemask);
488*53889Smckusick 		if (sp->s_csr.csr_attributes & BOLD) {
489*53889Smckusick 			dr->origin.x += 1;
490*53889Smckusick 			fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
491*53889Smckusick 					sr, &dr->origin, consfb->planemask);
492*53889Smckusick 		}
493*53889Smckusick 	} else {
494*53889Smckusick 		fbbm_rop_init(consfb, consfb->funcvec);
495*53889Smckusick 		fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
496*53889Smckusick 		if (sp->s_csr.csr_attributes & BOLD) {
497*53889Smckusick 			dr->origin.x += 1;
498*53889Smckusick 			fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
499*53889Smckusick 		}
500*53889Smckusick 	}
501*53889Smckusick 
502*53889Smckusick 	if (sp->s_csr.csr_attributes & USCORE) {
503*53889Smckusick 
504*53889Smckusick 		udr.origin.x = sp->s_csr.csr_p.x;
505*53889Smckusick 		udr.origin.y = sp->s_csr.csr_p.y + ul_pos;
506*53889Smckusick 		udr.extent.x = char_w;
507*53889Smckusick 		udr.extent.y = 1;
508*53889Smckusick 
509*53889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
510*53889Smckusick 		fbbm_rop_cinit(consfb, consfb->planemask, 1);
511*53889Smckusick 		fbbm_rop_clear(consfb, &udr);
512*53889Smckusick 	}
513*53889Smckusick 	unlock_bitmap();
514*53889Smckusick }
515*53889Smckusick 
516*53889Smckusick vt_flush(spc)
517*53889Smckusick 	struct cursor *spc;
518*53889Smckusick {
519*53889Smckusick 	register char *f_addr;
520*53889Smckusick 	register int len;
521*53889Smckusick 	register lRectangle *sr, *dr;
522*53889Smckusick 	lRectangle fr, cr;
523*53889Smckusick 	register int i;
524*53889Smckusick 	register unsigned int c;
525*53889Smckusick 	lRectangle udr;
526*53889Smckusick 	register char **fnt_addr;
527*53889Smckusick 	char *oldf_addr = (char *)-1;
528*53889Smckusick 	extern struct fb_map rommap;
529*53889Smckusick 
530*53889Smckusick 	if (fp == 0)
531*53889Smckusick 		return;
532*53889Smckusick 
533*53889Smckusick 	cursor_off();
534*53889Smckusick 
535*53889Smckusick 	lock_bitmap();
536*53889Smckusick 
537*53889Smckusick 	if (consfb->font_h == 24)
538*53889Smckusick 		fnt_addr = ext_fnt24_addr;
539*53889Smckusick 	else
540*53889Smckusick 		fnt_addr = ext_fnt_addr;
541*53889Smckusick 
542*53889Smckusick 	udr.origin = fpp;
543*53889Smckusick 	udr.extent.x = fpn * char_w;
544*53889Smckusick 	udr.extent.y = char_h;
545*53889Smckusick 
546*53889Smckusick 	setropfunc(BF_S, 0, fcolor, bcolor);
547*53889Smckusick 	fbbm_rop_cinit(consfb, consfb->planemask, 0);
548*53889Smckusick 	fbbm_rop_clear(consfb, &udr);
549*53889Smckusick 
550*53889Smckusick 	if (fpa & BOLD)
551*53889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
552*53889Smckusick 	else
553*53889Smckusick 		setropfunc(BF_S, 0, fcolor, bcolor);
554*53889Smckusick 
555*53889Smckusick 	fbbm_rop_winit(consfb);
556*53889Smckusick 
557*53889Smckusick 	sr = &fr;
558*53889Smckusick 	dr = &cr;
559*53889Smckusick 	sr->origin.x = 0;
560*53889Smckusick 	sr->origin.y = 0;
561*53889Smckusick 	sr->extent.y = font_h;
562*53889Smckusick 	dr->origin.x = fpp.x;
563*53889Smckusick 	dr->origin.y = fpp.y + ch_pos;
564*53889Smckusick 
565*53889Smckusick 	for (i = 0; i < fp; i++) {
566*53889Smckusick 		c = fbuf[i];
567*53889Smckusick 
568*53889Smckusick 		sr->extent.x = font_w;
569*53889Smckusick 		dr->extent.x = char_w;
570*53889Smckusick 
571*53889Smckusick 		if (c & 0xff00) {
572*53889Smckusick 			/*
573*53889Smckusick 			 * KANJI code... kanji char
574*53889Smckusick 			 */
575*53889Smckusick 			sr->extent.x = font_r2.extent.x;
576*53889Smckusick 			dr->extent.x = char_r2.extent.x;
577*53889Smckusick 			len = font_len2;
578*53889Smckusick 			f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
579*53889Smckusick #ifdef CPU_DOUBLE
580*53889Smckusick 		} else if (fnt_addr == 0) {
581*53889Smckusick 			/*
582*53889Smckusick 			 * no external fonts... try to use ROM fonts
583*53889Smckusick 			 */
584*53889Smckusick 			sr->extent.x = font_r1.extent.x;	/*XXX*/
585*53889Smckusick 			dr->extent.x = char_r1.extent.x;	/*XXX*/
586*53889Smckusick 			len = font_len2;
587*53889Smckusick 			f_addr = (char *)fbbm_Krom_addr(consfb, c, sr);
588*53889Smckusick #endif
589*53889Smckusick #ifdef KM_ASCII
590*53889Smckusick 		} else if (tmode == KM_ASCII) {
591*53889Smckusick 			/*
592*53889Smckusick 			 * terminal mode is ASCII... ASCII (ISO) char
593*53889Smckusick 			 */
594*53889Smckusick 			len = font_len1;
595*53889Smckusick 			if ((c >= 0x20) && (c <= 0x7e)) {
596*53889Smckusick 				/*
597*53889Smckusick 				 * ASCII char
598*53889Smckusick 				 */
599*53889Smckusick 				f_addr = fnt_addr[c];
600*53889Smckusick 			} else if ((c >= 0xa0) && (c <= 0xff)) {
601*53889Smckusick 				/*
602*53889Smckusick 				 * ISO char
603*53889Smckusick 				 */
604*53889Smckusick 				f_addr = fnt_addr[c - 32];
605*53889Smckusick 			} else {
606*53889Smckusick 				/*
607*53889Smckusick 				 * UNKNOWN char
608*53889Smckusick 				 */
609*53889Smckusick 				f_addr = (caddr_t)zero;
610*53889Smckusick 			}
611*53889Smckusick #endif /* KM_ASCII */
612*53889Smckusick 		} else {
613*53889Smckusick 			/*
614*53889Smckusick 			 * terminal mode is not ASCII... JIS, SJIS, EUC, ...
615*53889Smckusick 			 */
616*53889Smckusick 			len = font_len1;
617*53889Smckusick 			if ((c >= 0x20) && (c <= 0x7e)) {
618*53889Smckusick 				/*
619*53889Smckusick 				 * ASCII char
620*53889Smckusick 				 */
621*53889Smckusick 				f_addr = fnt_addr[c];
622*53889Smckusick 			} else if ((c >= 0xa1) && (c <= 0xdf)) {
623*53889Smckusick 				/*
624*53889Smckusick 				 * KANA char
625*53889Smckusick 				 */
626*53889Smckusick 				f_addr = fnt_addr[c + 64];
627*53889Smckusick 			} else {
628*53889Smckusick 				/*
629*53889Smckusick 				 * UNKNOWN char
630*53889Smckusick 				 */
631*53889Smckusick 				f_addr = (caddr_t)zero;
632*53889Smckusick 			}
633*53889Smckusick 		}
634*53889Smckusick 
635*53889Smckusick 		if (f_addr != 0) {
636*53889Smckusick 			if (oldf_addr == 0)
637*53889Smckusick 				fbbm_rop_winit(consfb);
638*53889Smckusick 
639*53889Smckusick 			rommap.fm_vaddr = f_addr;
640*53889Smckusick 			rommap.fm_offset = 0;
641*53889Smckusick 			fbbm_rop_write(consfb, &rommap, rommap.fm_offset, len,
642*53889Smckusick 					sr, &dr->origin, consfb->planemask);
643*53889Smckusick 			if (fpa & BOLD) {
644*53889Smckusick 				/*
645*53889Smckusick 				 * Bold char
646*53889Smckusick 				 */
647*53889Smckusick 				dr->origin.x += 1;
648*53889Smckusick 				fbbm_rop_write(consfb, &rommap,
649*53889Smckusick 						rommap.fm_offset, len,
650*53889Smckusick 						sr, &dr->origin, consfb->planemask);
651*53889Smckusick 				dr->origin.x -= 1;
652*53889Smckusick 			}
653*53889Smckusick 		} else {
654*53889Smckusick 			if (oldf_addr != 0)
655*53889Smckusick 				fbbm_rop_init(consfb, consfb->funcvec);
656*53889Smckusick 
657*53889Smckusick 			fbbm_rop_copy(consfb, sr, &dr->origin, 1, consfb->planemask);
658*53889Smckusick 			if (fpa & BOLD) {
659*53889Smckusick 				/*
660*53889Smckusick 				 * Bold char
661*53889Smckusick 				 */
662*53889Smckusick 				dr->origin.x += 1;
663*53889Smckusick 				fbbm_rop_copy(consfb, sr, &dr->origin,
664*53889Smckusick 						1, consfb->planemask);
665*53889Smckusick 				dr->origin.x -= 1;
666*53889Smckusick 			}
667*53889Smckusick 
668*53889Smckusick 		}
669*53889Smckusick 		dr->origin.x += dr->extent.x;
670*53889Smckusick 		oldf_addr = f_addr;
671*53889Smckusick 
672*53889Smckusick 		/*
673*53889Smckusick 		 * sr->origin.x and sr->origin.y were changed by
674*53889Smckusick 		 * fbpop_Krom_addr(), fb254_Krom_addr().
675*53889Smckusick 		 */
676*53889Smckusick 		sr->origin.x = 0;
677*53889Smckusick 		sr->origin.y = 0;
678*53889Smckusick 	}
679*53889Smckusick 
680*53889Smckusick 	if (fpa & USCORE) {
681*53889Smckusick 		udr.origin.y += ul_pos;
682*53889Smckusick 		udr.extent.y = 1;
683*53889Smckusick 
684*53889Smckusick 		setropfunc(BF_S, 1, fcolor, bcolor);
685*53889Smckusick 		fbbm_rop_cinit(consfb, consfb->planemask, 1);
686*53889Smckusick 		fbbm_rop_clear(consfb, &udr);
687*53889Smckusick 	}
688*53889Smckusick 	fp = 0;
689*53889Smckusick 
690*53889Smckusick 	unlock_bitmap();
691*53889Smckusick 
692*53889Smckusick 	dr->origin.y -= ch_pos;
693*53889Smckusick 	cursor_on(&(spc->csr_p));
694*53889Smckusick }
695