156885Sakito /*
256885Sakito * Copyright (c) 1992 OMRON Corporation.
363199Sbostic * Copyright (c) 1992, 1993
463199Sbostic * The Regents of the University of California. 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*64270Smckusick * @(#)bmd.c 8.2 (Berkeley) 08/15/93
1256885Sakito */
1356885Sakito /*
1456885Sakito
1556885Sakito * bmd.c --- Bitmap-Display raw-level driver routines
1656885Sakito *
1756885Sakito * by A.Fujita, SEP-09-1992
1856885Sakito */
1956885Sakito
2056885Sakito
2157108Sakito #include <sys/param.h>
2257108Sakito #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
bmd_escape(c)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
bmd_escape_0(c)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
bmd_escape_1(c)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
bmdinit()22456885Sakito bmdinit()
22556885Sakito {
22656885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
227*64270Smckusick volatile register long *bmd_bmsel = (long *)0xB1040000;
22856885Sakito register struct bmd_softc *bp = &bmd_softc;
22956885Sakito register struct bmd_linec *bq;
23056885Sakito register int i;
23156885Sakito struct bmd_rfcnt rfcnt;
23256885Sakito
23356885Sakito /*
23456885Sakito * adjust plane position
23556885Sakito */
23656885Sakito
23756885Sakito bp->bc_raddr = (char *) 0xB10C0008; /* plane-0 hardware address */
23856885Sakito bp->bc_waddr = (char *) 0xB1080008; /* common bitmap hardware address */
23956885Sakito rfcnt.rfc_hcnt = 7; /* shift left 16 dot */
24056885Sakito rfcnt.rfc_vcnt = -27; /* shift down 1 dot */
24156885Sakito *bmd_rfcnt = rfcnt;
24256885Sakito
24356885Sakito bp->bc_stat = STAT_NORMAL;
24456885Sakito
24556885Sakito bp->bc_xmin = 8;
24656885Sakito bp->bc_xmax = 96;
24756885Sakito bp->bc_ymin = 2;
24856885Sakito bp->bc_ymax = 48;
24956885Sakito
25056885Sakito bp->bc_row = bp->bc_ymin;
25156885Sakito
25256885Sakito for (i = bp->bc_ymin; i < bp->bc_ymax; i++) {
25356885Sakito bmd_linec[i].bl_next = &bmd_linec[i+1];
25456885Sakito bmd_linec[i].bl_prev = &bmd_linec[i-1];
25556885Sakito }
25656885Sakito bmd_linec[bp->bc_ymax-1].bl_next = &bmd_linec[bp->bc_ymin];
25756885Sakito bmd_linec[bp->bc_ymin].bl_prev = &bmd_linec[bp->bc_ymax-1];
25856885Sakito
25956885Sakito bq = bp->bc_bl = &bmd_linec[bp->bc_ymin];
26056885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin;
26156885Sakito
26256885Sakito bp->bc_col = bp->bc_xmin;
26356885Sakito
26456885Sakito bp->bc_esc = &bp->bc_escseq[0];
26556885Sakito bp->bc_escape = bmd_escape;
26656885Sakito
267*64270Smckusick *bmd_bmsel = 0xff; /* all planes */
26856885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */
269*64270Smckusick *bmd_bmsel = 0x01; /* 1 plane */
27056885Sakito
27156885Sakito /* turn on cursole */
27256885Sakito bmd_reverse_char(bp->bc_raddr,
27356885Sakito bp->bc_waddr,
27456885Sakito bq->bl_col, bp->bc_row);
27556885Sakito }
27656885Sakito
bmdadjust(hcnt,vcnt)27756885Sakito bmdadjust(hcnt, vcnt)
27856885Sakito short hcnt, vcnt;
27956885Sakito {
28056885Sakito volatile register struct bmd_rfcnt *bmd_rfcnt = (struct bmd_rfcnt *) 0xB1000000;
28156885Sakito struct bmd_rfcnt rfcnt;
28256885Sakito
28356885Sakito printf("bmdadjust: hcnt = %d, vcnt = %d\n", hcnt, vcnt);
28456885Sakito
28556885Sakito rfcnt.rfc_hcnt = hcnt; /* shift left 16 dot */
28656885Sakito rfcnt.rfc_vcnt = vcnt; /* shift down 1 dot */
28756885Sakito
28856885Sakito *bmd_rfcnt = rfcnt;
28956885Sakito }
29056885Sakito
bmdputc(c)29156885Sakito bmdputc(c)
29256885Sakito register int c;
29356885Sakito {
29456885Sakito register struct bmd_softc *bp = &bmd_softc;
29556885Sakito register struct bmd_linec *bq = bp->bc_bl;
29656885Sakito register int i;
29756885Sakito
29856885Sakito c &= 0x7F;
29956885Sakito /* turn off cursole */
30056885Sakito bmd_reverse_char(bp->bc_raddr,
30156885Sakito bp->bc_waddr,
30256885Sakito bq->bl_col, bp->bc_row);
30356885Sakito /* do escape-sequence */
30456885Sakito if (bp->bc_stat & STAT_ESCAPE) {
30556885Sakito *bp->bc_esc++ = c;
30656885Sakito (*bp->bc_escape)(c);
30756885Sakito goto done;
30856885Sakito }
30956885Sakito
31056885Sakito if (isprint(c)) {
31156885Sakito bmd_draw_char(bp->bc_raddr, bp->bc_waddr,
31256885Sakito bq->bl_col, bp->bc_row, c);
31356885Sakito bq->bl_col++;
31456885Sakito bq->bl_end++;
31556885Sakito if (bq->bl_col >= bp->bc_xmax) {
31656885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin;
31756885Sakito bp->bc_row++;
31856885Sakito if (bp->bc_row >= bp->bc_ymax) {
31956885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr,
32056885Sakito (u_long *) bp->bc_waddr,
32156885Sakito bp->bc_xmin, bp->bc_xmax,
32256885Sakito bp->bc_ymin, bp->bc_ymax);
32356885Sakito
32456885Sakito bp->bc_row = bp->bc_ymax - 1;
32556885Sakito }
32656885Sakito }
32756885Sakito } else {
32856885Sakito switch (c) {
32956885Sakito case 0x08: /* BS */
33056885Sakito if (bq->bl_col > bp->bc_xmin) {
33156885Sakito bq->bl_col--;
33256885Sakito }
33356885Sakito break;
33456885Sakito
33556885Sakito case 0x09: /* HT */
33656885Sakito case 0x0B: /* VT */
33756885Sakito i = ((bq->bl_col / 8) + 1) * 8;
33856885Sakito if (i < bp->bc_xmax) {
33956885Sakito bq->bl_col = bq->bl_end = i;
34056885Sakito }
34156885Sakito break;
34256885Sakito
34356885Sakito case 0x0A: /* NL */
34456885Sakito bp->bc_row++;
34556885Sakito if (bp->bc_row >= bp->bc_ymax) {
34656885Sakito bmd_scroll_screen((u_long *) bp->bc_raddr,
34756885Sakito (u_long *) bp->bc_waddr,
34856885Sakito bp->bc_xmin, bp->bc_xmax,
34956885Sakito bp->bc_ymin, bp->bc_ymax);
35056885Sakito
35156885Sakito bp->bc_row = bp->bc_ymax - 1;
35256885Sakito }
35356885Sakito break;
35456885Sakito
35556885Sakito case 0x0D: /* CR */
35656885Sakito bq->bl_col = bp->bc_xmin;
35756885Sakito break;
35856885Sakito
35956885Sakito case 0x1b: /* ESC */
36056885Sakito bp->bc_stat |= STAT_ESCAPE;
36156885Sakito *bp->bc_esc++ = 0x1b;
36256885Sakito break;
36356885Sakito
36456885Sakito case 0x7F: /* DEL */
36556885Sakito if (bq->bl_col > bp->bc_xmin) {
36656885Sakito bq->bl_col--;
36756885Sakito bmd_erase_char(bp->bc_raddr,
36856885Sakito bp->bc_waddr,
36956885Sakito bq->bl_col, bp->bc_row);
37056885Sakito }
37156885Sakito break;
37256885Sakito
37356885Sakito default:
37456885Sakito break;
37556885Sakito }
37656885Sakito }
37756885Sakito
37856885Sakito done:
37956885Sakito /* turn on cursole */
38056885Sakito bmd_reverse_char(bp->bc_raddr,
38156885Sakito bp->bc_waddr,
38256885Sakito bq->bl_col, bp->bc_row);
38356885Sakito
38456885Sakito return(c);
38556885Sakito }
38656885Sakito
bmdclear()38756885Sakito bmdclear()
38856885Sakito {
38956885Sakito register struct bmd_softc *bp = &bmd_softc;
39056885Sakito register struct bmd_linec *bq = bp->bc_bl;
39156885Sakito
39256885Sakito bmd_erase_screen((u_long *) bp->bc_waddr); /* clear screen */
39356885Sakito
39456885Sakito bq->bl_col = bq->bl_end = bp->bc_xmin;
39556885Sakito bp->bc_row = bp->bc_ymin;
39656885Sakito
39756885Sakito bmd_reverse_char(bp->bc_raddr,
39856885Sakito bp->bc_waddr,
39956885Sakito bq->bl_col, bp->bc_row); /* turn on cursole */
40056885Sakito }
40156885Sakito
40256885Sakito
40356885Sakito /*
40456885Sakito *
40556885Sakito */
40656885Sakito
40756885Sakito void
bmd_add_new_line()40856885Sakito bmd_add_new_line()
40956885Sakito {
41056885Sakito }
41156885Sakito
41256885Sakito
41356885Sakito /*
41456885Sakito * charactor operation routines
41556885Sakito */
41656885Sakito
41756885Sakito void
bmd_draw_char(raddr,waddr,col,row,c)41856885Sakito bmd_draw_char(raddr, waddr, col, row, c)
41956885Sakito char *raddr;
42056885Sakito char *waddr;
42156885Sakito int col;
42256885Sakito int row;
42356885Sakito int c;
42456885Sakito {
42556885Sakito volatile register u_short *p, *q, *fp;
42656885Sakito volatile register u_long *lp, *lq;
42756885Sakito register int i;
42856885Sakito
42956885Sakito fp = &bmdfont[c][0];
43056885Sakito
43156885Sakito switch (col % 4) {
43256885Sakito
43356885Sakito case 0:
43456885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43556885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
43656885Sakito for (i = 0; i < FB_HIGHT; i++) {
43756885Sakito *q = (*p & 0x000F) | (*fp & 0xFFF0);
43856885Sakito p += 128;
43956885Sakito q += 128;
44056885Sakito fp++;
44156885Sakito }
44256885Sakito break;
44356885Sakito
44456885Sakito case 1:
44556885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44656885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
44756885Sakito for (i = 0; i < FB_HIGHT; i++) {
44856885Sakito *lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4);
44956885Sakito lp += 64;
45056885Sakito lq += 64;
45156885Sakito fp++;
45256885Sakito }
45356885Sakito break;
45456885Sakito
45556885Sakito case 2:
45656885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45756885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
45856885Sakito for (i = 0; i < FB_HIGHT; i++) {
45956885Sakito *lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8);
46056885Sakito lp += 64;
46156885Sakito lq += 64;
46256885Sakito fp++;
46356885Sakito }
46456885Sakito break;
46556885Sakito
46656885Sakito case 3:
46756885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46856885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
46956885Sakito for (i = 0; i < FB_HIGHT; i++) {
47056885Sakito *q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);
47156885Sakito p += 128;
47256885Sakito q += 128;
47356885Sakito fp++;
47456885Sakito }
47556885Sakito break;
47656885Sakito
47756885Sakito default:
47856885Sakito break;
47956885Sakito }
48056885Sakito }
48156885Sakito
48256885Sakito void
bmd_reverse_char(raddr,waddr,col,row)48356885Sakito bmd_reverse_char(raddr, waddr, col, row)
48456885Sakito char *raddr;
48556885Sakito char *waddr;
48656885Sakito int col;
48756885Sakito int row;
48856885Sakito {
48956885Sakito volatile register u_short *p, *q, us;
49056885Sakito volatile register u_long *lp, *lq, ul;
49156885Sakito register int i;
49256885Sakito
49356885Sakito switch (col%4) {
49456885Sakito
49556885Sakito case 0:
49656885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49756885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
49856885Sakito for (i = 0; i < FB_HIGHT; i++) {
49956885Sakito *q = (*p & 0x000F) | (~(*p) & 0xFFF0);
50056885Sakito p += 128;
50156885Sakito q += 128;
50256885Sakito }
50356885Sakito break;
50456885Sakito
50556885Sakito case 1:
50656885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50756885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));
50856885Sakito for (i = 0; i < FB_HIGHT; i++) {
50956885Sakito *lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);
51056885Sakito lp += 64;
51156885Sakito lq += 64;
51256885Sakito }
51356885Sakito break;
51456885Sakito
51556885Sakito case 2:
51656885Sakito lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51756885Sakito lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );
51856885Sakito for (i = 0; i < FB_HIGHT; i++) {
51956885Sakito *lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);
52056885Sakito lp += 64;
52156885Sakito lq += 64;
52256885Sakito }
52356885Sakito break;
52456885Sakito
52556885Sakito case 3:
52656885Sakito p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52756885Sakito q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );
52856885Sakito for (i = 0; i < FB_HIGHT; i++) {
52956885Sakito *q = (*p & 0xF000) | (~(*p) & 0x0FFF);
53056885Sakito p += 128;
53156885Sakito q += 128;
53256885Sakito }
53356885Sakito break;
53456885Sakito
53556885Sakito default:
53656885Sakito break;
53756885Sakito }
53856885Sakito }
53956885Sakito
54056885Sakito void
bmd_erase_char(raddr,waddr,col,row)54156885Sakito bmd_erase_char(raddr, waddr, col, row)
54256885Sakito char *raddr;
54356885Sakito char *waddr;
54456885Sakito int col;
54556885Sakito int row;
54656885Sakito {
54756885Sakito bmd_draw_char(raddr, waddr, col, row, 0);
54856885Sakito
54956885Sakito return;
55056885Sakito }
55156885Sakito
55256885Sakito
55356885Sakito /*
55456885Sakito * screen operation routines
55556885Sakito */
55656885Sakito
55756885Sakito void
bmd_erase_screen(lp)55856885Sakito bmd_erase_screen(lp)
55956885Sakito volatile register u_long *lp;
56056885Sakito {
56156885Sakito register int i, j;
56256885Sakito
56356885Sakito for (i = 0; i < SB_HIGHT; i++) {
56456885Sakito for (j = 0; j < SL_WIDTH; j++)
56556885Sakito *lp++ = 0;
56656885Sakito SKIP_NEXT_LINE(lp);
56756885Sakito }
56856885Sakito
56956885Sakito return;
57056885Sakito }
57156885Sakito
57256885Sakito void
bmd_scroll_screen(lp,lq,xmin,xmax,ymin,ymax)57356885Sakito bmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax)
57456885Sakito volatile register u_long *lp;
57556885Sakito volatile register u_long *lq;
57656885Sakito int xmin, xmax, ymin, ymax;
57756885Sakito {
57856885Sakito register int i, j;
57956885Sakito
58056885Sakito lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1));
58156885Sakito lq += ((PL_WIDTH * FB_HIGHT) * ymin);
58256885Sakito
58356885Sakito for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) {
58456885Sakito for (j = 0; j < SL_WIDTH; j++) {
58556885Sakito *lq++ = *lp++;
58656885Sakito }
58756885Sakito lp += (PL_WIDTH - SL_WIDTH);
58856885Sakito lq += (PL_WIDTH - SL_WIDTH);
58956885Sakito }
59056885Sakito
59156885Sakito for (i = 0; i < FB_HIGHT; i++) {
59256885Sakito for (j = 0; j < SL_WIDTH; j++) {
59356885Sakito *lq++ = 0;
59456885Sakito }
59556885Sakito lq += (PL_WIDTH - SL_WIDTH);
59656885Sakito }
59756885Sakito
59856885Sakito }
599