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