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