1*56885Sakito /* 2*56885Sakito * Copyright (c) 1992 OMRON Corporation. 3*56885Sakito * Copyright (c) 1992 The Regents of the University of California. 4*56885Sakito * All rights reserved. 5*56885Sakito * 6*56885Sakito * This code is derived from software contributed to Berkeley by 7*56885Sakito * OMRON Corporation. 8*56885Sakito * 9*56885Sakito * %sccs.include.redist.c% 10*56885Sakito * 11*56885Sakito * @(#)bmd.c 7.1 (Berkeley) 11/17/92 12*56885Sakito */ 13*56885Sakito /* 14*56885Sakito 15*56885Sakito * bmd.c --- Bitmap-Display raw-level driver routines 16*56885Sakito * 17*56885Sakito * by A.Fujita, SEP-09-1992 18*56885Sakito */ 19*56885Sakito 20*56885Sakito 21*56885Sakito #include "param.h" 22*56885Sakito #include "systm.h" 23*56885Sakito 24*56885Sakito extern u_short bmdfont[][20]; 25*56885Sakito 26*56885Sakito #define isprint(c) ( c < 0x20 ? 0 : 1) 27*56885Sakito 28*56885Sakito /* 29*56885Sakito * RFCNT register 30*56885Sakito */ 31*56885Sakito 32*56885Sakito struct bmd_rfcnt { 33*56885Sakito short rfc_hcnt; 34*56885Sakito short rfc_vcnt; 35*56885Sakito }; 36*56885Sakito 37*56885Sakito 38*56885Sakito /* 39*56885Sakito * Width & Hight 40*56885Sakito */ 41*56885Sakito 42*56885Sakito #define PB_WIDTH 2048 /* Plane Width (Bit) */ 43*56885Sakito #define PB_HIGHT 1024 /* Plane Hight (Bit) */ 44*56885Sakito #define PL_WIDTH 64 /* Plane Width (long) */ 45*56885Sakito #define PS_WIDTH 128 /* Plane Width (long) */ 46*56885Sakito #define P_WIDTH 256 /* Plane Width (Byte) */ 47*56885Sakito 48*56885Sakito #define SB_WIDTH 1280 /* Screen Width (Bit) */ 49*56885Sakito #define SB_HIGHT 1024 /* Screen Hight (Bit) */ 50*56885Sakito #define SL_WIDTH 40 /* Screen Width (Long) */ 51*56885Sakito #define S_WIDTH 160 /* Screen Width (Byte) */ 52*56885Sakito 53*56885Sakito #define FB_WIDTH 12 /* Font Width (Bit) */ 54*56885Sakito #define FB_HIGHT 20 /* Font Hight (Bit) */ 55*56885Sakito 56*56885Sakito 57*56885Sakito #define NEXT_LINE(addr) ( addr + (PL_WIDTH * FB_HIGHT) ) 58*56885Sakito #define SKIP_NEXT_LINE(addr) ( addr += (PL_WIDTH - SL_WIDTH) ) 59*56885Sakito 60*56885Sakito 61*56885Sakito void bmd_add_new_line(); 62*56885Sakito 63*56885Sakito void bmd_draw_char(); 64*56885Sakito void bmd_reverse_char(); 65*56885Sakito void bmd_erase_char(); 66*56885Sakito void bmd_erase_screen(); 67*56885Sakito void bmd_scroll_screen(); 68*56885Sakito 69*56885Sakito 70*56885Sakito struct bmd_linec { 71*56885Sakito struct bmd_linec *bl_next; 72*56885Sakito struct bmd_linec *bl_prev; 73*56885Sakito int bl_col; 74*56885Sakito int bl_end; 75*56885Sakito u_char bl_line[128]; 76*56885Sakito }; 77*56885Sakito 78*56885Sakito struct bmd_softc { 79*56885Sakito int bc_stat; 80*56885Sakito char *bc_raddr; 81*56885Sakito char *bc_waddr; 82*56885Sakito int bc_xmin; 83*56885Sakito int bc_xmax; 84*56885Sakito int bc_ymin; 85*56885Sakito int bc_ymax; 86*56885Sakito int bc_col; 87*56885Sakito int bc_row; 88*56885Sakito struct bmd_linec *bc_bl; 89*56885Sakito char bc_escseq[8]; 90*56885Sakito char *bc_esc; 91*56885Sakito void (*bc_escape)(); 92*56885Sakito }; 93*56885Sakito 94*56885Sakito #define STAT_NORMAL 0x0000 95*56885Sakito #define STAT_ESCAPE 0x0001 96*56885Sakito #define STAT_INSERT 0x0100 97*56885Sakito 98*56885Sakito struct bmd_softc bmd_softc; 99*56885Sakito struct bmd_linec bmd_linec[52]; 100*56885Sakito 101*56885Sakito void bmd_escape(); 102*56885Sakito void bmd_escape_0(); 103*56885Sakito void bmd_escape_1(); 104*56885Sakito 105*56885Sakito 106*56885Sakito /* 107*56885Sakito * Escape-Sequence 108*56885Sakito */ 109*56885Sakito 110*56885Sakito void 111*56885Sakito bmd_escape(c) 112*56885Sakito int c; 113*56885Sakito { 114*56885Sakito register struct bmd_softc *bp = &bmd_softc; 115*56885Sakito 116*56885Sakito switch (c) { 117*56885Sakito 118*56885Sakito case '[': 119*56885Sakito bp->bc_escape = bmd_escape_0; 120*56885Sakito break; 121*56885Sakito 122*56885Sakito default: 123*56885Sakito bp->bc_stat &= ~STAT_ESCAPE; 124*56885Sakito bp->bc_esc = &bp->bc_escseq[0]; 125*56885Sakito bp->bc_escape = bmd_escape; 126*56885Sakito break; 127*56885Sakito } 128*56885Sakito } 129*56885Sakito 130*56885Sakito void 131*56885Sakito bmd_escape_0(c) 132*56885Sakito int c; 133*56885Sakito { 134*56885Sakito register struct bmd_softc *bp = &bmd_softc; 135*56885Sakito register struct bmd_linec *bq = bp->bc_bl; 136*56885Sakito 137*56885Sakito switch (c) { 138*56885Sakito 139*56885Sakito case 'A': 140*56885Sakito if (bp->bc_row > bp->bc_ymin) { 141*56885Sakito bp->bc_row--; 142*56885Sakito } 143*56885Sakito break; 144*56885Sakito 145*56885Sakito case 'C': 146*56885Sakito if (bq->bl_col < bp->bc_xmax - 1) { 147*56885Sakito bq->bl_col++; 148*56885Sakito } 149*56885Sakito break; 150*56885Sakito 151*56885Sakito case 'K': 152*56885Sakito if (bq->bl_col < bp->bc_xmax) { 153*56885Sakito register int col; 154*56885Sakito for (col = bq->bl_col; col < bp->bc_xmax; col++) 155*56885Sakito bmd_erase_char(bp->bc_raddr, 156*56885Sakito bp->bc_waddr, 157*56885Sakito col, bp->bc_row); 158*56885Sakito } 159*56885Sakito bq->bl_end = bq->bl_col; 160*56885Sakito break; 161*56885Sakito 162*56885Sakito case 'H': 163*56885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 164*56885Sakito bp->bc_row = bp->bc_ymin; 165*56885Sakito break; 166*56885Sakito 167*56885Sakito default: 168*56885Sakito /* 169*56885Sakito *bp->bc_esc++ = c; 170*56885Sakito bp->bc_escape = bmd_escape_1; 171*56885Sakito return; 172*56885Sakito */ 173*56885Sakito break; 174*56885Sakito } 175*56885Sakito 176*56885Sakito bp->bc_stat &= ~STAT_ESCAPE; 177*56885Sakito bp->bc_esc = &bp->bc_escseq[0]; 178*56885Sakito bp->bc_escape = bmd_escape; 179*56885Sakito } 180*56885Sakito 181*56885Sakito void 182*56885Sakito bmd_escape_1(c) 183*56885Sakito int c; 184*56885Sakito { 185*56885Sakito register struct bmd_softc *bp = &bmd_softc; 186*56885Sakito register struct bmd_linec *bq = bp->bc_bl; 187*56885Sakito register int col = 0, row = 0; 188*56885Sakito register char *p; 189*56885Sakito 190*56885Sakito switch (c) { 191*56885Sakito 192*56885Sakito case 'J': 193*56885Sakito bp->bc_stat &= ~STAT_ESCAPE; 194*56885Sakito bp->bc_esc = &bp->bc_escseq[0]; 195*56885Sakito bp->bc_escape = bmd_escape; 196*56885Sakito break; 197*56885Sakito 198*56885Sakito case 'H': 199*56885Sakito for (p = &bp->bc_escseq[0]; *p != ';'; p++) 200*56885Sakito row = (row * 10) + (*p - 0x30); 201*56885Sakito p++; 202*56885Sakito for (p = &bp->bc_escseq[0]; p != bp->bc_esc; p++) 203*56885Sakito col = (col * 10) + (*p - 0x30); 204*56885Sakito 205*56885Sakito bq->bl_col = col + bp->bc_xmin; 206*56885Sakito bp->bc_row = row + bp->bc_ymin; 207*56885Sakito 208*56885Sakito bp->bc_stat &= ~STAT_ESCAPE; 209*56885Sakito bp->bc_esc = &bp->bc_escseq[0]; 210*56885Sakito bp->bc_escape = bmd_escape; 211*56885Sakito break; 212*56885Sakito 213*56885Sakito default: 214*56885Sakito *bp->bc_esc++ = c; 215*56885Sakito break; 216*56885Sakito } 217*56885Sakito } 218*56885Sakito 219*56885Sakito 220*56885Sakito /* 221*56885Sakito * Entry Routine 222*56885Sakito */ 223*56885Sakito 224*56885Sakito bmdinit() 225*56885Sakito { 226*56885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000; 227*56885Sakito register struct bmd_softc *bp = &bmd_softc; 228*56885Sakito register struct bmd_linec *bq; 229*56885Sakito register int i; 230*56885Sakito struct bmd_rfcnt rfcnt; 231*56885Sakito 232*56885Sakito /* 233*56885Sakito * adjust plane position 234*56885Sakito */ 235*56885Sakito 236*56885Sakito bp->bc_raddr = (char *) 0xB10C0008; /* plane-0 hardware address */ 237*56885Sakito bp->bc_waddr = (char *) 0xB1080008; /* common bitmap hardware address */ 238*56885Sakito rfcnt.rfc_hcnt = 7; /* shift left 16 dot */ 239*56885Sakito rfcnt.rfc_vcnt = -27; /* shift down 1 dot */ 240*56885Sakito *bmd_rfcnt = rfcnt; 241*56885Sakito 242*56885Sakito bp->bc_stat = STAT_NORMAL; 243*56885Sakito 244*56885Sakito bp->bc_xmin = 8; 245*56885Sakito bp->bc_xmax = 96; 246*56885Sakito bp->bc_ymin = 2; 247*56885Sakito bp->bc_ymax = 48; 248*56885Sakito 249*56885Sakito bp->bc_row = bp->bc_ymin; 250*56885Sakito 251*56885Sakito for (i = bp->bc_ymin; i < bp->bc_ymax; i++) { 252*56885Sakito bmd_linec[i].bl_next = &bmd_linec[i+1]; 253*56885Sakito bmd_linec[i].bl_prev = &bmd_linec[i-1]; 254*56885Sakito } 255*56885Sakito bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin]; 256*56885Sakito bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1]; 257*56885Sakito 258*56885Sakito bq = bp->bc_bl = &bmd_linec[bp->bc_ymin]; 259*56885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 260*56885Sakito 261*56885Sakito bp->bc_col = bp->bc_xmin; 262*56885Sakito 263*56885Sakito bp->bc_esc = &bp->bc_escseq[0]; 264*56885Sakito bp->bc_escape = bmd_escape; 265*56885Sakito 266*56885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */ 267*56885Sakito 268*56885Sakito /* turn on cursole */ 269*56885Sakito bmd_reverse_char(bp->bc_raddr, 270*56885Sakito bp->bc_waddr, 271*56885Sakito bq->bl_col, bp->bc_row); 272*56885Sakito } 273*56885Sakito 274*56885Sakito bmdadjust(hcnt, vcnt) 275*56885Sakito short hcnt, vcnt; 276*56885Sakito { 277*56885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000; 278*56885Sakito struct bmd_rfcnt rfcnt; 279*56885Sakito 280*56885Sakito printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt); 281*56885Sakito 282*56885Sakito rfcnt.rfc_hcnt = hcnt; /* shift left 16 dot */ 283*56885Sakito rfcnt.rfc_vcnt = vcnt; /* shift down 1 dot */ 284*56885Sakito 285*56885Sakito *bmd_rfcnt = rfcnt; 286*56885Sakito } 287*56885Sakito 288*56885Sakito bmdputc(c) 289*56885Sakito register int c; 290*56885Sakito { 291*56885Sakito register struct bmd_softc *bp = &bmd_softc; 292*56885Sakito register struct bmd_linec *bq = bp->bc_bl; 293*56885Sakito register int i; 294*56885Sakito 295*56885Sakito c &= 0x7F; 296*56885Sakito /* turn off cursole */ 297*56885Sakito bmd_reverse_char(bp->bc_raddr, 298*56885Sakito bp->bc_waddr, 299*56885Sakito bq->bl_col, bp->bc_row); 300*56885Sakito /* do escape-sequence */ 301*56885Sakito if (bp->bc_stat & STAT_ESCAPE) { 302*56885Sakito *bp->bc_esc++ = c; 303*56885Sakito (*bp->bc_escape)(c); 304*56885Sakito goto done; 305*56885Sakito } 306*56885Sakito 307*56885Sakito if (isprint(c)) { 308*56885Sakito bmd_draw_char(bp->bc_raddr, bp->bc_waddr, 309*56885Sakito bq->bl_col, bp->bc_row, c); 310*56885Sakito bq->bl_col++; 311*56885Sakito bq->bl_end++; 312*56885Sakito if (bq->bl_col >= bp->bc_xmax) { 313*56885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 314*56885Sakito bp->bc_row++; 315*56885Sakito if (bp->bc_row >= bp->bc_ymax) { 316*56885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr, 317*56885Sakito (u_long *) bp->bc_waddr, 318*56885Sakito bp->bc_xmin, bp->bc_xmax, 319*56885Sakito bp->bc_ymin, bp->bc_ymax); 320*56885Sakito 321*56885Sakito bp->bc_row = bp->bc_ymax - 1; 322*56885Sakito } 323*56885Sakito } 324*56885Sakito } else { 325*56885Sakito switch (c) { 326*56885Sakito case 0x08: /* BS */ 327*56885Sakito if (bq->bl_col > bp->bc_xmin) { 328*56885Sakito bq->bl_col--; 329*56885Sakito } 330*56885Sakito break; 331*56885Sakito 332*56885Sakito case 0x09: /* HT */ 333*56885Sakito case 0x0B: /* VT */ 334*56885Sakito i = ((bq->bl_col / 8) + 1) * 8; 335*56885Sakito if (i < bp->bc_xmax) { 336*56885Sakito bq->bl_col = bq->bl_end = i; 337*56885Sakito } 338*56885Sakito break; 339*56885Sakito 340*56885Sakito case 0x0A: /* NL */ 341*56885Sakito bp->bc_row++; 342*56885Sakito if (bp->bc_row >= bp->bc_ymax) { 343*56885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr, 344*56885Sakito (u_long *) bp->bc_waddr, 345*56885Sakito bp->bc_xmin, bp->bc_xmax, 346*56885Sakito bp->bc_ymin, bp->bc_ymax); 347*56885Sakito 348*56885Sakito bp->bc_row = bp->bc_ymax - 1; 349*56885Sakito } 350*56885Sakito break; 351*56885Sakito 352*56885Sakito case 0x0D: /* CR */ 353*56885Sakito bq->bl_col = bp->bc_xmin; 354*56885Sakito break; 355*56885Sakito 356*56885Sakito case 0x1b: /* ESC */ 357*56885Sakito bp->bc_stat |= STAT_ESCAPE; 358*56885Sakito *bp->bc_esc++ = 0x1b; 359*56885Sakito break; 360*56885Sakito 361*56885Sakito case 0x7F: /* DEL */ 362*56885Sakito if (bq->bl_col > bp->bc_xmin) { 363*56885Sakito bq->bl_col--; 364*56885Sakito bmd_erase_char(bp->bc_raddr, 365*56885Sakito bp->bc_waddr, 366*56885Sakito bq->bl_col, bp->bc_row); 367*56885Sakito } 368*56885Sakito break; 369*56885Sakito 370*56885Sakito default: 371*56885Sakito break; 372*56885Sakito } 373*56885Sakito } 374*56885Sakito 375*56885Sakito done: 376*56885Sakito /* turn on cursole */ 377*56885Sakito bmd_reverse_char(bp->bc_raddr, 378*56885Sakito bp->bc_waddr, 379*56885Sakito bq->bl_col, bp->bc_row); 380*56885Sakito 381*56885Sakito return(c); 382*56885Sakito } 383*56885Sakito 384*56885Sakito bmdclear() 385*56885Sakito { 386*56885Sakito register struct bmd_softc *bp = &bmd_softc; 387*56885Sakito register struct bmd_linec *bq = bp->bc_bl; 388*56885Sakito 389*56885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */ 390*56885Sakito 391*56885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 392*56885Sakito bp->bc_row = bp->bc_ymin; 393*56885Sakito 394*56885Sakito bmd_reverse_char(bp->bc_raddr, 395*56885Sakito bp->bc_waddr, 396*56885Sakito bq->bl_col, bp->bc_row); /* turn on cursole */ 397*56885Sakito } 398*56885Sakito 399*56885Sakito 400*56885Sakito /* 401*56885Sakito * 402*56885Sakito */ 403*56885Sakito 404*56885Sakito void 405*56885Sakito bmd_add_new_line() 406*56885Sakito { 407*56885Sakito } 408*56885Sakito 409*56885Sakito 410*56885Sakito /* 411*56885Sakito * charactor operation routines 412*56885Sakito */ 413*56885Sakito 414*56885Sakito void 415*56885Sakito bmd_draw_char(raddr, waddr, col, row, c) 416*56885Sakito char *raddr; 417*56885Sakito char *waddr; 418*56885Sakito int col; 419*56885Sakito int row; 420*56885Sakito int c; 421*56885Sakito { 422*56885Sakito volatile register u_short *p, *q, *fp; 423*56885Sakito volatile register u_long *lp, *lq; 424*56885Sakito register int i; 425*56885Sakito 426*56885Sakito fp = &bmdfont[c][0]; 427*56885Sakito 428*56885Sakito switch (col % 4) { 429*56885Sakito 430*56885Sakito case 0: 431*56885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 432*56885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 433*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 434*56885Sakito *q = (*p & 0x000F) | (*fp & 0xFFF0); 435*56885Sakito p += 128; 436*56885Sakito q += 128; 437*56885Sakito fp++; 438*56885Sakito } 439*56885Sakito break; 440*56885Sakito 441*56885Sakito case 1: 442*56885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 443*56885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 444*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 445*56885Sakito *lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4); 446*56885Sakito lp += 64; 447*56885Sakito lq += 64; 448*56885Sakito fp++; 449*56885Sakito } 450*56885Sakito break; 451*56885Sakito 452*56885Sakito case 2: 453*56885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 454*56885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 455*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 456*56885Sakito *lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8); 457*56885Sakito lp += 64; 458*56885Sakito lq += 64; 459*56885Sakito fp++; 460*56885Sakito } 461*56885Sakito break; 462*56885Sakito 463*56885Sakito case 3: 464*56885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 465*56885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 466*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 467*56885Sakito *q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4); 468*56885Sakito p += 128; 469*56885Sakito q += 128; 470*56885Sakito fp++; 471*56885Sakito } 472*56885Sakito break; 473*56885Sakito 474*56885Sakito default: 475*56885Sakito break; 476*56885Sakito } 477*56885Sakito } 478*56885Sakito 479*56885Sakito void 480*56885Sakito bmd_reverse_char(raddr, waddr, col, row) 481*56885Sakito char *raddr; 482*56885Sakito char *waddr; 483*56885Sakito int col; 484*56885Sakito int row; 485*56885Sakito { 486*56885Sakito volatile register u_short *p, *q, us; 487*56885Sakito volatile register u_long *lp, *lq, ul; 488*56885Sakito register int i; 489*56885Sakito 490*56885Sakito switch (col%4) { 491*56885Sakito 492*56885Sakito case 0: 493*56885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 494*56885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 495*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 496*56885Sakito *q = (*p & 0x000F) | (~(*p) & 0xFFF0); 497*56885Sakito p += 128; 498*56885Sakito q += 128; 499*56885Sakito } 500*56885Sakito break; 501*56885Sakito 502*56885Sakito case 1: 503*56885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 504*56885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 505*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 506*56885Sakito *lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00); 507*56885Sakito lp += 64; 508*56885Sakito lq += 64; 509*56885Sakito } 510*56885Sakito break; 511*56885Sakito 512*56885Sakito case 2: 513*56885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 514*56885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 515*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 516*56885Sakito *lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000); 517*56885Sakito lp += 64; 518*56885Sakito lq += 64; 519*56885Sakito } 520*56885Sakito break; 521*56885Sakito 522*56885Sakito case 3: 523*56885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 524*56885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 525*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 526*56885Sakito *q = (*p & 0xF000) | (~(*p) & 0x0FFF); 527*56885Sakito p += 128; 528*56885Sakito q += 128; 529*56885Sakito } 530*56885Sakito break; 531*56885Sakito 532*56885Sakito default: 533*56885Sakito break; 534*56885Sakito } 535*56885Sakito } 536*56885Sakito 537*56885Sakito void 538*56885Sakito bmd_erase_char(raddr, waddr, col, row) 539*56885Sakito char *raddr; 540*56885Sakito char *waddr; 541*56885Sakito int col; 542*56885Sakito int row; 543*56885Sakito { 544*56885Sakito bmd_draw_char(raddr, waddr, col, row, 0); 545*56885Sakito 546*56885Sakito return; 547*56885Sakito } 548*56885Sakito 549*56885Sakito 550*56885Sakito /* 551*56885Sakito * screen operation routines 552*56885Sakito */ 553*56885Sakito 554*56885Sakito void 555*56885Sakito bmd_erase_screen(lp) 556*56885Sakito volatile register u_long *lp; 557*56885Sakito { 558*56885Sakito register int i, j; 559*56885Sakito 560*56885Sakito for (i = 0; i < SB_HIGHT; i++) { 561*56885Sakito for (j = 0; j < SL_WIDTH; j++) 562*56885Sakito *lp++ = 0; 563*56885Sakito SKIP_NEXT_LINE(lp); 564*56885Sakito } 565*56885Sakito 566*56885Sakito return; 567*56885Sakito } 568*56885Sakito 569*56885Sakito void 570*56885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax) 571*56885Sakito volatile register u_long *lp; 572*56885Sakito volatile register u_long *lq; 573*56885Sakito int xmin, xmax, ymin, ymax; 574*56885Sakito { 575*56885Sakito register int i, j; 576*56885Sakito 577*56885Sakito lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1)); 578*56885Sakito lq += ((PL_WIDTH * FB_HIGHT) * ymin); 579*56885Sakito 580*56885Sakito for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) { 581*56885Sakito for (j = 0; j < SL_WIDTH; j++) { 582*56885Sakito *lq++ = *lp++; 583*56885Sakito } 584*56885Sakito lp += (PL_WIDTH - SL_WIDTH); 585*56885Sakito lq += (PL_WIDTH - SL_WIDTH); 586*56885Sakito } 587*56885Sakito 588*56885Sakito for (i = 0; i < FB_HIGHT; i++) { 589*56885Sakito for (j = 0; j < SL_WIDTH; j++) { 590*56885Sakito *lq++ = 0; 591*56885Sakito } 592*56885Sakito lq += (PL_WIDTH - SL_WIDTH); 593*56885Sakito } 594*56885Sakito 595*56885Sakito } 596