156885Sakito /* 256885Sakito * Copyright (c) 1992 OMRON Corporation. 356885Sakito * Copyright (c) 1992 The Regents of the University of California. 456885Sakito * All rights reserved. 556885Sakito * 656885Sakito * This code is derived from software contributed to Berkeley by 756885Sakito * OMRON Corporation. 856885Sakito * 956885Sakito * %sccs.include.redist.c% 1056885Sakito * 11*57108Sakito * @(#)bmd.c 7.2 (Berkeley) 12/13/92 1256885Sakito */ 1356885Sakito /* 1456885Sakito 1556885Sakito * bmd.c --- Bitmap-Display raw-level driver routines 1656885Sakito * 1756885Sakito * by A.Fujita, SEP-09-1992 1856885Sakito */ 1956885Sakito 2056885Sakito 21*57108Sakito #include <sys/param.h> 22*57108Sakito #include <sys/systm.h> 2356885Sakito 2456885Sakito extern u_short bmdfont[][20]; 2556885Sakito 2656885Sakito #define isprint(c) ( c < 0x20 ? 0 : 1) 2756885Sakito 2856885Sakito /* 2956885Sakito * RFCNT register 3056885Sakito */ 3156885Sakito 3256885Sakito struct bmd_rfcnt { 3356885Sakito short rfc_hcnt; 3456885Sakito short rfc_vcnt; 3556885Sakito }; 3656885Sakito 3756885Sakito 3856885Sakito /* 3956885Sakito * Width & Hight 4056885Sakito */ 4156885Sakito 4256885Sakito #define PB_WIDTH 2048 /* Plane Width (Bit) */ 4356885Sakito #define PB_HIGHT 1024 /* Plane Hight (Bit) */ 4456885Sakito #define PL_WIDTH 64 /* Plane Width (long) */ 4556885Sakito #define PS_WIDTH 128 /* Plane Width (long) */ 4656885Sakito #define P_WIDTH 256 /* Plane Width (Byte) */ 4756885Sakito 4856885Sakito #define SB_WIDTH 1280 /* Screen Width (Bit) */ 4956885Sakito #define SB_HIGHT 1024 /* Screen Hight (Bit) */ 5056885Sakito #define SL_WIDTH 40 /* Screen Width (Long) */ 5156885Sakito #define S_WIDTH 160 /* Screen Width (Byte) */ 5256885Sakito 5356885Sakito #define FB_WIDTH 12 /* Font Width (Bit) */ 5456885Sakito #define FB_HIGHT 20 /* Font Hight (Bit) */ 5556885Sakito 5656885Sakito 5756885Sakito #define NEXT_LINE(addr) ( addr + (PL_WIDTH * FB_HIGHT) ) 5856885Sakito #define SKIP_NEXT_LINE(addr) ( addr += (PL_WIDTH - SL_WIDTH) ) 5956885Sakito 6056885Sakito 6156885Sakito void bmd_add_new_line(); 6256885Sakito 6356885Sakito void bmd_draw_char(); 6456885Sakito void bmd_reverse_char(); 6556885Sakito void bmd_erase_char(); 6656885Sakito void bmd_erase_screen(); 6756885Sakito void bmd_scroll_screen(); 6856885Sakito 6956885Sakito 7056885Sakito struct bmd_linec { 7156885Sakito struct bmd_linec *bl_next; 7256885Sakito struct bmd_linec *bl_prev; 7356885Sakito int bl_col; 7456885Sakito int bl_end; 7556885Sakito u_char bl_line[128]; 7656885Sakito }; 7756885Sakito 7856885Sakito struct bmd_softc { 7956885Sakito int bc_stat; 8056885Sakito char *bc_raddr; 8156885Sakito char *bc_waddr; 8256885Sakito int bc_xmin; 8356885Sakito int bc_xmax; 8456885Sakito int bc_ymin; 8556885Sakito int bc_ymax; 8656885Sakito int bc_col; 8756885Sakito int bc_row; 8856885Sakito struct bmd_linec *bc_bl; 8956885Sakito char bc_escseq[8]; 9056885Sakito char *bc_esc; 9156885Sakito void (*bc_escape)(); 9256885Sakito }; 9356885Sakito 9456885Sakito #define STAT_NORMAL 0x0000 9556885Sakito #define STAT_ESCAPE 0x0001 9656885Sakito #define STAT_INSERT 0x0100 9756885Sakito 9856885Sakito struct bmd_softc bmd_softc; 9956885Sakito struct bmd_linec bmd_linec[52]; 10056885Sakito 10156885Sakito void bmd_escape(); 10256885Sakito void bmd_escape_0(); 10356885Sakito void bmd_escape_1(); 10456885Sakito 10556885Sakito 10656885Sakito /* 10756885Sakito * Escape-Sequence 10856885Sakito */ 10956885Sakito 11056885Sakito void 11156885Sakito bmd_escape(c) 11256885Sakito int c; 11356885Sakito { 11456885Sakito register struct bmd_softc *bp = &bmd_softc; 11556885Sakito 11656885Sakito switch (c) { 11756885Sakito 11856885Sakito case '[': 11956885Sakito bp->bc_escape = bmd_escape_0; 12056885Sakito break; 12156885Sakito 12256885Sakito default: 12356885Sakito bp->bc_stat &= ~STAT_ESCAPE; 12456885Sakito bp->bc_esc = &bp->bc_escseq[0]; 12556885Sakito bp->bc_escape = bmd_escape; 12656885Sakito break; 12756885Sakito } 12856885Sakito } 12956885Sakito 13056885Sakito void 13156885Sakito bmd_escape_0(c) 13256885Sakito int c; 13356885Sakito { 13456885Sakito register struct bmd_softc *bp = &bmd_softc; 13556885Sakito register struct bmd_linec *bq = bp->bc_bl; 13656885Sakito 13756885Sakito switch (c) { 13856885Sakito 13956885Sakito case 'A': 14056885Sakito if (bp->bc_row > bp->bc_ymin) { 14156885Sakito bp->bc_row--; 14256885Sakito } 14356885Sakito break; 14456885Sakito 14556885Sakito case 'C': 14656885Sakito if (bq->bl_col < bp->bc_xmax - 1) { 14756885Sakito bq->bl_col++; 14856885Sakito } 14956885Sakito break; 15056885Sakito 15156885Sakito case 'K': 15256885Sakito if (bq->bl_col < bp->bc_xmax) { 15356885Sakito register int col; 15456885Sakito for (col = bq->bl_col; col < bp->bc_xmax; col++) 15556885Sakito bmd_erase_char(bp->bc_raddr, 15656885Sakito bp->bc_waddr, 15756885Sakito col, bp->bc_row); 15856885Sakito } 15956885Sakito bq->bl_end = bq->bl_col; 16056885Sakito break; 16156885Sakito 16256885Sakito case 'H': 16356885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 16456885Sakito bp->bc_row = bp->bc_ymin; 16556885Sakito break; 16656885Sakito 16756885Sakito default: 16856885Sakito /* 16956885Sakito *bp->bc_esc++ = c; 17056885Sakito bp->bc_escape = bmd_escape_1; 17156885Sakito return; 17256885Sakito */ 17356885Sakito break; 17456885Sakito } 17556885Sakito 17656885Sakito bp->bc_stat &= ~STAT_ESCAPE; 17756885Sakito bp->bc_esc = &bp->bc_escseq[0]; 17856885Sakito bp->bc_escape = bmd_escape; 17956885Sakito } 18056885Sakito 18156885Sakito void 18256885Sakito bmd_escape_1(c) 18356885Sakito int c; 18456885Sakito { 18556885Sakito register struct bmd_softc *bp = &bmd_softc; 18656885Sakito register struct bmd_linec *bq = bp->bc_bl; 18756885Sakito register int col = 0, row = 0; 18856885Sakito register char *p; 18956885Sakito 19056885Sakito switch (c) { 19156885Sakito 19256885Sakito case 'J': 19356885Sakito bp->bc_stat &= ~STAT_ESCAPE; 19456885Sakito bp->bc_esc = &bp->bc_escseq[0]; 19556885Sakito bp->bc_escape = bmd_escape; 19656885Sakito break; 19756885Sakito 19856885Sakito case 'H': 19956885Sakito for (p = &bp->bc_escseq[0]; *p != ';'; p++) 20056885Sakito row = (row * 10) + (*p - 0x30); 20156885Sakito p++; 20256885Sakito for (p = &bp->bc_escseq[0]; p != bp->bc_esc; p++) 20356885Sakito col = (col * 10) + (*p - 0x30); 20456885Sakito 20556885Sakito bq->bl_col = col + bp->bc_xmin; 20656885Sakito bp->bc_row = row + bp->bc_ymin; 20756885Sakito 20856885Sakito bp->bc_stat &= ~STAT_ESCAPE; 20956885Sakito bp->bc_esc = &bp->bc_escseq[0]; 21056885Sakito bp->bc_escape = bmd_escape; 21156885Sakito break; 21256885Sakito 21356885Sakito default: 21456885Sakito *bp->bc_esc++ = c; 21556885Sakito break; 21656885Sakito } 21756885Sakito } 21856885Sakito 21956885Sakito 22056885Sakito /* 22156885Sakito * Entry Routine 22256885Sakito */ 22356885Sakito 22456885Sakito bmdinit() 22556885Sakito { 22656885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000; 22756885Sakito register struct bmd_softc *bp = &bmd_softc; 22856885Sakito register struct bmd_linec *bq; 22956885Sakito register int i; 23056885Sakito struct bmd_rfcnt rfcnt; 23156885Sakito 23256885Sakito /* 23356885Sakito * adjust plane position 23456885Sakito */ 23556885Sakito 23656885Sakito bp->bc_raddr = (char *) 0xB10C0008; /* plane-0 hardware address */ 23756885Sakito bp->bc_waddr = (char *) 0xB1080008; /* common bitmap hardware address */ 23856885Sakito rfcnt.rfc_hcnt = 7; /* shift left 16 dot */ 23956885Sakito rfcnt.rfc_vcnt = -27; /* shift down 1 dot */ 24056885Sakito *bmd_rfcnt = rfcnt; 24156885Sakito 24256885Sakito bp->bc_stat = STAT_NORMAL; 24356885Sakito 24456885Sakito bp->bc_xmin = 8; 24556885Sakito bp->bc_xmax = 96; 24656885Sakito bp->bc_ymin = 2; 24756885Sakito bp->bc_ymax = 48; 24856885Sakito 24956885Sakito bp->bc_row = bp->bc_ymin; 25056885Sakito 25156885Sakito for (i = bp->bc_ymin; i < bp->bc_ymax; i++) { 25256885Sakito bmd_linec[i].bl_next = &bmd_linec[i+1]; 25356885Sakito bmd_linec[i].bl_prev = &bmd_linec[i-1]; 25456885Sakito } 25556885Sakito bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin]; 25656885Sakito bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1]; 25756885Sakito 25856885Sakito bq = bp->bc_bl = &bmd_linec[bp->bc_ymin]; 25956885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 26056885Sakito 26156885Sakito bp->bc_col = bp->bc_xmin; 26256885Sakito 26356885Sakito bp->bc_esc = &bp->bc_escseq[0]; 26456885Sakito bp->bc_escape = bmd_escape; 26556885Sakito 26656885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */ 26756885Sakito 26856885Sakito /* turn on cursole */ 26956885Sakito bmd_reverse_char(bp->bc_raddr, 27056885Sakito bp->bc_waddr, 27156885Sakito bq->bl_col, bp->bc_row); 27256885Sakito } 27356885Sakito 27456885Sakito bmdadjust(hcnt, vcnt) 27556885Sakito short hcnt, vcnt; 27656885Sakito { 27756885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000; 27856885Sakito struct bmd_rfcnt rfcnt; 27956885Sakito 28056885Sakito printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt); 28156885Sakito 28256885Sakito rfcnt.rfc_hcnt = hcnt; /* shift left 16 dot */ 28356885Sakito rfcnt.rfc_vcnt = vcnt; /* shift down 1 dot */ 28456885Sakito 28556885Sakito *bmd_rfcnt = rfcnt; 28656885Sakito } 28756885Sakito 28856885Sakito bmdputc(c) 28956885Sakito register int c; 29056885Sakito { 29156885Sakito register struct bmd_softc *bp = &bmd_softc; 29256885Sakito register struct bmd_linec *bq = bp->bc_bl; 29356885Sakito register int i; 29456885Sakito 29556885Sakito c &= 0x7F; 29656885Sakito /* turn off cursole */ 29756885Sakito bmd_reverse_char(bp->bc_raddr, 29856885Sakito bp->bc_waddr, 29956885Sakito bq->bl_col, bp->bc_row); 30056885Sakito /* do escape-sequence */ 30156885Sakito if (bp->bc_stat & STAT_ESCAPE) { 30256885Sakito *bp->bc_esc++ = c; 30356885Sakito (*bp->bc_escape)(c); 30456885Sakito goto done; 30556885Sakito } 30656885Sakito 30756885Sakito if (isprint(c)) { 30856885Sakito bmd_draw_char(bp->bc_raddr, bp->bc_waddr, 30956885Sakito bq->bl_col, bp->bc_row, c); 31056885Sakito bq->bl_col++; 31156885Sakito bq->bl_end++; 31256885Sakito if (bq->bl_col >= bp->bc_xmax) { 31356885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 31456885Sakito bp->bc_row++; 31556885Sakito if (bp->bc_row >= bp->bc_ymax) { 31656885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr, 31756885Sakito (u_long *) bp->bc_waddr, 31856885Sakito bp->bc_xmin, bp->bc_xmax, 31956885Sakito bp->bc_ymin, bp->bc_ymax); 32056885Sakito 32156885Sakito bp->bc_row = bp->bc_ymax - 1; 32256885Sakito } 32356885Sakito } 32456885Sakito } else { 32556885Sakito switch (c) { 32656885Sakito case 0x08: /* BS */ 32756885Sakito if (bq->bl_col > bp->bc_xmin) { 32856885Sakito bq->bl_col--; 32956885Sakito } 33056885Sakito break; 33156885Sakito 33256885Sakito case 0x09: /* HT */ 33356885Sakito case 0x0B: /* VT */ 33456885Sakito i = ((bq->bl_col / 8) + 1) * 8; 33556885Sakito if (i < bp->bc_xmax) { 33656885Sakito bq->bl_col = bq->bl_end = i; 33756885Sakito } 33856885Sakito break; 33956885Sakito 34056885Sakito case 0x0A: /* NL */ 34156885Sakito bp->bc_row++; 34256885Sakito if (bp->bc_row >= bp->bc_ymax) { 34356885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr, 34456885Sakito (u_long *) bp->bc_waddr, 34556885Sakito bp->bc_xmin, bp->bc_xmax, 34656885Sakito bp->bc_ymin, bp->bc_ymax); 34756885Sakito 34856885Sakito bp->bc_row = bp->bc_ymax - 1; 34956885Sakito } 35056885Sakito break; 35156885Sakito 35256885Sakito case 0x0D: /* CR */ 35356885Sakito bq->bl_col = bp->bc_xmin; 35456885Sakito break; 35556885Sakito 35656885Sakito case 0x1b: /* ESC */ 35756885Sakito bp->bc_stat |= STAT_ESCAPE; 35856885Sakito *bp->bc_esc++ = 0x1b; 35956885Sakito break; 36056885Sakito 36156885Sakito case 0x7F: /* DEL */ 36256885Sakito if (bq->bl_col > bp->bc_xmin) { 36356885Sakito bq->bl_col--; 36456885Sakito bmd_erase_char(bp->bc_raddr, 36556885Sakito bp->bc_waddr, 36656885Sakito bq->bl_col, bp->bc_row); 36756885Sakito } 36856885Sakito break; 36956885Sakito 37056885Sakito default: 37156885Sakito break; 37256885Sakito } 37356885Sakito } 37456885Sakito 37556885Sakito done: 37656885Sakito /* turn on cursole */ 37756885Sakito bmd_reverse_char(bp->bc_raddr, 37856885Sakito bp->bc_waddr, 37956885Sakito bq->bl_col, bp->bc_row); 38056885Sakito 38156885Sakito return(c); 38256885Sakito } 38356885Sakito 38456885Sakito bmdclear() 38556885Sakito { 38656885Sakito register struct bmd_softc *bp = &bmd_softc; 38756885Sakito register struct bmd_linec *bq = bp->bc_bl; 38856885Sakito 38956885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */ 39056885Sakito 39156885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin; 39256885Sakito bp->bc_row = bp->bc_ymin; 39356885Sakito 39456885Sakito bmd_reverse_char(bp->bc_raddr, 39556885Sakito bp->bc_waddr, 39656885Sakito bq->bl_col, bp->bc_row); /* turn on cursole */ 39756885Sakito } 39856885Sakito 39956885Sakito 40056885Sakito /* 40156885Sakito * 40256885Sakito */ 40356885Sakito 40456885Sakito void 40556885Sakito bmd_add_new_line() 40656885Sakito { 40756885Sakito } 40856885Sakito 40956885Sakito 41056885Sakito /* 41156885Sakito * charactor operation routines 41256885Sakito */ 41356885Sakito 41456885Sakito void 41556885Sakito bmd_draw_char(raddr, waddr, col, row, c) 41656885Sakito char *raddr; 41756885Sakito char *waddr; 41856885Sakito int col; 41956885Sakito int row; 42056885Sakito int c; 42156885Sakito { 42256885Sakito volatile register u_short *p, *q, *fp; 42356885Sakito volatile register u_long *lp, *lq; 42456885Sakito register int i; 42556885Sakito 42656885Sakito fp = &bmdfont[c][0]; 42756885Sakito 42856885Sakito switch (col % 4) { 42956885Sakito 43056885Sakito case 0: 43156885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 43256885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 43356885Sakito for (i = 0; i < FB_HIGHT; i++) { 43456885Sakito *q = (*p & 0x000F) | (*fp & 0xFFF0); 43556885Sakito p += 128; 43656885Sakito q += 128; 43756885Sakito fp++; 43856885Sakito } 43956885Sakito break; 44056885Sakito 44156885Sakito case 1: 44256885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 44356885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 44456885Sakito for (i = 0; i < FB_HIGHT; i++) { 44556885Sakito *lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4); 44656885Sakito lp += 64; 44756885Sakito lq += 64; 44856885Sakito fp++; 44956885Sakito } 45056885Sakito break; 45156885Sakito 45256885Sakito case 2: 45356885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 45456885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 45556885Sakito for (i = 0; i < FB_HIGHT; i++) { 45656885Sakito *lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8); 45756885Sakito lp += 64; 45856885Sakito lq += 64; 45956885Sakito fp++; 46056885Sakito } 46156885Sakito break; 46256885Sakito 46356885Sakito case 3: 46456885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 46556885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 46656885Sakito for (i = 0; i < FB_HIGHT; i++) { 46756885Sakito *q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4); 46856885Sakito p += 128; 46956885Sakito q += 128; 47056885Sakito fp++; 47156885Sakito } 47256885Sakito break; 47356885Sakito 47456885Sakito default: 47556885Sakito break; 47656885Sakito } 47756885Sakito } 47856885Sakito 47956885Sakito void 48056885Sakito bmd_reverse_char(raddr, waddr, col, row) 48156885Sakito char *raddr; 48256885Sakito char *waddr; 48356885Sakito int col; 48456885Sakito int row; 48556885Sakito { 48656885Sakito volatile register u_short *p, *q, us; 48756885Sakito volatile register u_long *lp, *lq, ul; 48856885Sakito register int i; 48956885Sakito 49056885Sakito switch (col%4) { 49156885Sakito 49256885Sakito case 0: 49356885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 49456885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 49556885Sakito for (i = 0; i < FB_HIGHT; i++) { 49656885Sakito *q = (*p & 0x000F) | (~(*p) & 0xFFF0); 49756885Sakito p += 128; 49856885Sakito q += 128; 49956885Sakito } 50056885Sakito break; 50156885Sakito 50256885Sakito case 1: 50356885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 50456885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 )); 50556885Sakito for (i = 0; i < FB_HIGHT; i++) { 50656885Sakito *lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00); 50756885Sakito lp += 64; 50856885Sakito lq += 64; 50956885Sakito } 51056885Sakito break; 51156885Sakito 51256885Sakito case 2: 51356885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 51456885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 ); 51556885Sakito for (i = 0; i < FB_HIGHT; i++) { 51656885Sakito *lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000); 51756885Sakito lp += 64; 51856885Sakito lq += 64; 51956885Sakito } 52056885Sakito break; 52156885Sakito 52256885Sakito case 3: 52356885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 52456885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 ); 52556885Sakito for (i = 0; i < FB_HIGHT; i++) { 52656885Sakito *q = (*p & 0xF000) | (~(*p) & 0x0FFF); 52756885Sakito p += 128; 52856885Sakito q += 128; 52956885Sakito } 53056885Sakito break; 53156885Sakito 53256885Sakito default: 53356885Sakito break; 53456885Sakito } 53556885Sakito } 53656885Sakito 53756885Sakito void 53856885Sakito bmd_erase_char(raddr, waddr, col, row) 53956885Sakito char *raddr; 54056885Sakito char *waddr; 54156885Sakito int col; 54256885Sakito int row; 54356885Sakito { 54456885Sakito bmd_draw_char(raddr, waddr, col, row, 0); 54556885Sakito 54656885Sakito return; 54756885Sakito } 54856885Sakito 54956885Sakito 55056885Sakito /* 55156885Sakito * screen operation routines 55256885Sakito */ 55356885Sakito 55456885Sakito void 55556885Sakito bmd_erase_screen(lp) 55656885Sakito volatile register u_long *lp; 55756885Sakito { 55856885Sakito register int i, j; 55956885Sakito 56056885Sakito for (i = 0; i < SB_HIGHT; i++) { 56156885Sakito for (j = 0; j < SL_WIDTH; j++) 56256885Sakito *lp++ = 0; 56356885Sakito SKIP_NEXT_LINE(lp); 56456885Sakito } 56556885Sakito 56656885Sakito return; 56756885Sakito } 56856885Sakito 56956885Sakito void 57056885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax) 57156885Sakito volatile register u_long *lp; 57256885Sakito volatile register u_long *lq; 57356885Sakito int xmin, xmax, ymin, ymax; 57456885Sakito { 57556885Sakito register int i, j; 57656885Sakito 57756885Sakito lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1)); 57856885Sakito lq += ((PL_WIDTH * FB_HIGHT) * ymin); 57956885Sakito 58056885Sakito for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) { 58156885Sakito for (j = 0; j < SL_WIDTH; j++) { 58256885Sakito *lq++ = *lp++; 58356885Sakito } 58456885Sakito lp += (PL_WIDTH - SL_WIDTH); 58556885Sakito lq += (PL_WIDTH - SL_WIDTH); 58656885Sakito } 58756885Sakito 58856885Sakito for (i = 0; i < FB_HIGHT; i++) { 58956885Sakito for (j = 0; j < SL_WIDTH; j++) { 59056885Sakito *lq++ = 0; 59156885Sakito } 59256885Sakito lq += (PL_WIDTH - SL_WIDTH); 59356885Sakito } 59456885Sakito 59556885Sakito } 596