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