Module Name: src Committed By: tsutsui Date: Sat Dec 28 09:17:23 UTC 2013
Modified Files: src/sys/arch/luna68k/dev: lunafb.c omrasops.c omrasopsvar.h Log Message: Add preleminary support of 4bpp LUNA framebuffer. Changes details: - prepare and switch 4bpp rasops functions that read/write all 4 planes and also handle both fg and bg colors - make 1bpp ops use first plane on write rather than common bitmap plane (which is prepared for multiple plane write with raster ops) - prepare 4bpp allocattr function to handle ANSI 16 color text - split omrasops_init() function for each bpp - move struct hwcmap from softc to hwdevconfig to sync palette values on initialization - allow mmap(2) against all available planes Now we can use ANSI 16 color text console and also can demonstrate mlterm-fb with color sixel graphics and wallpaper. XXX: Xserver needs much more work. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/arch/luna68k/dev/lunafb.c cvs rdiff -u -r1.15 -r1.16 src/sys/arch/luna68k/dev/omrasops.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/luna68k/dev/omrasopsvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/luna68k/dev/lunafb.c diff -u src/sys/arch/luna68k/dev/lunafb.c:1.28 src/sys/arch/luna68k/dev/lunafb.c:1.29 --- src/sys/arch/luna68k/dev/lunafb.c:1.28 Sat Dec 14 19:51:13 2013 +++ src/sys/arch/luna68k/dev/lunafb.c Sat Dec 28 09:17:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: lunafb.c,v 1.28 2013/12/14 19:51:13 tsutsui Exp $ */ +/* $NetBSD: lunafb.c,v 1.29 2013/12/28 09:17:23 tsutsui Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: lunafb.c,v 1.28 2013/12/14 19:51:13 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lunafb.c,v 1.29 2013/12/28 09:17:23 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -82,27 +82,50 @@ struct bt458 { #define OMFB_RAMDAC 0xC1100000 /* Bt454/Bt458 RAMDAC */ #define OMFB_SIZE (0xB1300000 - 0xB1080000 + PAGE_SIZE) +struct hwcmap { +#define CMAP_SIZE 256 + uint8_t r[CMAP_SIZE]; + uint8_t g[CMAP_SIZE]; + uint8_t b[CMAP_SIZE]; +}; + +static const struct { + uint8_t r; + uint8_t g; + uint8_t b; +} ansicmap[16] = { + { 0, 0, 0}, + { 0x80, 0, 0}, + { 0, 0x80, 0}, + { 0x80, 0x80, 0}, + { 0, 0, 0x80}, + { 0x80, 0, 0x80}, + { 0, 0x80, 0x80}, + { 0xc0, 0xc0, 0xc0}, + { 0x80, 0x80, 0x80}, + { 0xff, 0, 0}, + { 0, 0xff, 0}, + { 0xff, 0xff, 0}, + { 0, 0, 0xff}, + { 0xff, 0, 0xff}, + { 0, 0xff, 0xff}, + { 0xff, 0xff, 0xff}, +}; + struct om_hwdevconfig { int dc_wid; /* width of frame buffer */ int dc_ht; /* height of frame buffer */ int dc_depth; /* depth, bits per pixel */ int dc_rowbytes; /* bytes in a FB scan line */ int dc_cmsize; /* colormap size */ + struct hwcmap dc_cmap; /* software copy of colormap */ vaddr_t dc_videobase; /* base of flat frame buffer */ struct rasops_info dc_ri; /* raster blitter variables */ }; -struct hwcmap { -#define CMAP_SIZE 256 - uint8_t r[CMAP_SIZE]; - uint8_t g[CMAP_SIZE]; - uint8_t b[CMAP_SIZE]; -}; - struct omfb_softc { device_t sc_dev; /* base device */ struct om_hwdevconfig *sc_dc; /* device configuration */ - struct hwcmap sc_cmap; /* software copy of colormap */ int nscreens; }; @@ -188,10 +211,6 @@ omfbattach(device_t parent, device_t sel aprint_normal(": %d x %d, %dbpp\n", sc->sc_dc->dc_wid, sc->sc_dc->dc_ht, sc->sc_dc->dc_depth); - /* WHITE on BLACK */ - memset(&sc->sc_cmap, 255, sizeof(struct hwcmap)); - sc->sc_cmap.r[0] = sc->sc_cmap.g[0] = sc->sc_cmap.b[0] = 0; - waa.console = omfb_console; waa.scrdata = &omfb_screenlist; waa.accessops = &omfb_accessops; @@ -271,7 +290,7 @@ omfbmmap(void *v, void *vs, off_t offset if (offset >= 0 && offset < OMFB_SIZE) cookie = m68k_btop(m68k_trunc_page(dc->dc_videobase) + offset); #else - if (offset >= 0 && offset < dc->dc_rowbytes * dc->dc_ht) + if (offset >= 0 && offset < dc->dc_rowbytes * dc->dc_ht * dc->dc_depth) cookie = m68k_btop(m68k_trunc_page(OMFB_FB_RADDR) + offset); #endif @@ -288,13 +307,13 @@ omgetcmap(struct omfb_softc *sc, struct if (index >= cmsize || count > cmsize - index) return EINVAL; - error = copyout(&sc->sc_cmap.r[index], p->red, count); + error = copyout(&sc->sc_dc->dc_cmap.r[index], p->red, count); if (error) return error; - error = copyout(&sc->sc_cmap.g[index], p->green, count); + error = copyout(&sc->sc_dc->dc_cmap.g[index], p->green, count); if (error) return error; - error = copyout(&sc->sc_cmap.b[index], p->blue, count); + error = copyout(&sc->sc_dc->dc_cmap.b[index], p->blue, count); return error; } @@ -319,24 +338,24 @@ omsetcmap(struct omfb_softc *sc, struct if (error) return error; - memcpy(&sc->sc_cmap.r[index], &cmap.r[index], count); - memcpy(&sc->sc_cmap.g[index], &cmap.g[index], count); - memcpy(&sc->sc_cmap.b[index], &cmap.b[index], count); + memcpy(&sc->sc_dc->dc_cmap.r[index], &cmap.r[index], count); + memcpy(&sc->sc_dc->dc_cmap.g[index], &cmap.g[index], count); + memcpy(&sc->sc_dc->dc_cmap.b[index], &cmap.b[index], count); if (hwplanemask == 0x0f) { struct bt454 *odac = (struct bt454 *)OMFB_RAMDAC; odac->bt_addr = index; for (i = index; i < index + count; i++) { - odac->bt_cmap = sc->sc_cmap.r[i]; - odac->bt_cmap = sc->sc_cmap.g[i]; - odac->bt_cmap = sc->sc_cmap.b[i]; + odac->bt_cmap = sc->sc_dc->dc_cmap.r[i]; + odac->bt_cmap = sc->sc_dc->dc_cmap.g[i]; + odac->bt_cmap = sc->sc_dc->dc_cmap.b[i]; } } else if (hwplanemask == 0xff) { struct bt458 *ndac = (struct bt458 *)OMFB_RAMDAC; ndac->bt_addr = index; for (i = index; i < index + count; i++) { - ndac->bt_cmap = sc->sc_cmap.r[i]; - ndac->bt_cmap = sc->sc_cmap.g[i]; - ndac->bt_cmap = sc->sc_cmap.b[i]; + ndac->bt_cmap = sc->sc_dc->dc_cmap.r[i]; + ndac->bt_cmap = sc->sc_dc->dc_cmap.g[i]; + ndac->bt_cmap = sc->sc_dc->dc_cmap.b[i]; } } return 0; @@ -358,7 +377,7 @@ omfb_getdevconfig(paddr_t paddr, struct break; default: case 0x0f: -#if 0 +#if 1 /* * XXX * experiment resulted in WHITE on SKYBLUE after Xorg server @@ -389,28 +408,25 @@ omfb_getdevconfig(paddr_t paddr, struct */ odac->bt_addr = 0; for (i = 0; i < 15; i++) { - odac->bt_cmap = 0; - odac->bt_cmap = 0; - odac->bt_cmap = 0; + odac->bt_cmap = dc->dc_cmap.r[i] = 0; + odac->bt_cmap = dc->dc_cmap.g[i] = 0; + odac->bt_cmap = dc->dc_cmap.b[i] = 0; } /* * The B/W video connector is connected to IOG of Bt454, * and IOR and IOB are unused. */ - odac->bt_cmap = 0; - odac->bt_cmap = 255; - odac->bt_cmap = 0; + odac->bt_cmap = dc->dc_cmap.r[15] = 0; + odac->bt_cmap = dc->dc_cmap.g[15] = 255; + odac->bt_cmap = dc->dc_cmap.b[15] = 0; } else if (hwplanemask == 0x0f) { struct bt454 *odac = (struct bt454 *)OMFB_RAMDAC; odac->bt_addr = 0; - odac->bt_cmap = 0; - odac->bt_cmap = 0; - odac->bt_cmap = 0; - for (i = 1; i < 16; i++) { - odac->bt_cmap = 255; - odac->bt_cmap = 255; - odac->bt_cmap = 255; + for (i = 0; i < 16; i++) { + odac->bt_cmap = dc->dc_cmap.r[i] = ansicmap[i].r; + odac->bt_cmap = dc->dc_cmap.g[i] = ansicmap[i].g; + odac->bt_cmap = dc->dc_cmap.b[i] = ansicmap[i].b; } } else if (hwplanemask == 0xff) { struct bt458 *ndac = (struct bt458 *)OMFB_RAMDAC; @@ -421,13 +437,13 @@ omfb_getdevconfig(paddr_t paddr, struct ndac->bt_ctrl = 0x43; /* pallete enabled, ovly plane */ ndac->bt_ctrl = 0x00; /* no test mode */ ndac->bt_addr = 0; - ndac->bt_cmap = 0; - ndac->bt_cmap = 0; - ndac->bt_cmap = 0; + ndac->bt_cmap = dc->dc_cmap.r[0] = 0; + ndac->bt_cmap = dc->dc_cmap.g[0] = 0; + ndac->bt_cmap = dc->dc_cmap.b[0] = 0; for (i = 1; i < 256; i++) { - ndac->bt_cmap = 255; - ndac->bt_cmap = 255; - ndac->bt_cmap = 255; + ndac->bt_cmap = dc->dc_cmap.r[i] = 255; + ndac->bt_cmap = dc->dc_cmap.g[i] = 255; + ndac->bt_cmap = dc->dc_cmap.b[i] = 255; } } @@ -456,7 +472,10 @@ omfb_getdevconfig(paddr_t paddr, struct ri->ri_flg |= RI_NO_AUTO; ri->ri_hw = dc; - omrasops_init(ri, 34, 80); + if (bpp == 4) + omrasops4_init(ri, 34, 80); + else + omrasops1_init(ri, 34, 80); omfb_stdscreen.nrows = ri->ri_rows; omfb_stdscreen.ncols = ri->ri_cols; Index: src/sys/arch/luna68k/dev/omrasops.c diff -u src/sys/arch/luna68k/dev/omrasops.c:1.15 src/sys/arch/luna68k/dev/omrasops.c:1.16 --- src/sys/arch/luna68k/dev/omrasops.c:1.15 Sat Dec 14 19:27:41 2013 +++ src/sys/arch/luna68k/dev/omrasops.c Sat Dec 28 09:17:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: omrasops.c,v 1.15 2013/12/14 19:27:41 tsutsui Exp $ */ +/* $NetBSD: omrasops.c,v 1.16 2013/12/28 09:17:23 tsutsui Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: omrasops.c,v 1.15 2013/12/14 19:27:41 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: omrasops.c,v 1.16 2013/12/28 09:17:23 tsutsui Exp $"); /* * Designed speficically for 'm68k bitorder'; @@ -53,14 +53,23 @@ __KERNEL_RCSID(0, "$NetBSD: omrasops.c,v #include <arch/luna68k/dev/omrasopsvar.h> /* wscons emulator operations */ -static void om_cursor(void *, int, int, int); +static void om1_cursor(void *, int, int, int); +static void om4_cursor(void *, int, int, int); static int om_mapchar(void *, int, unsigned int *); -static void om_putchar(void *, int, int, u_int, long); -static void om_copycols(void *, int, int, int, int); -static void om_copyrows(void *, int, int, int num); -static void om_erasecols(void *, int, int, int, long); -static void om_eraserows(void *, int, int, long); -static int om_allocattr(void *, int, int, int, long *); +static void om1_putchar(void *, int, int, u_int, long); +static void om4_putchar(void *, int, int, u_int, long); +static void om1_copycols(void *, int, int, int, int); +static void om4_copycols(void *, int, int, int, int); +static void om1_copyrows(void *, int, int, int num); +static void om4_copyrows(void *, int, int, int num); +static void om1_erasecols(void *, int, int, int, long); +static void om4_erasecols(void *, int, int, int, long); +static void om1_eraserows(void *, int, int, long); +static void om4_eraserows(void *, int, int, long); +static int om1_allocattr(void *, int, int, int, long *); +static int om4_allocattr(void *, int, int, int, long *); + +static int omrasops_init(struct rasops_info *, int, int); #define ALL1BITS (~0U) #define ALL0BITS (0U) @@ -70,6 +79,10 @@ static int om_allocattr(void *, int, int #define W(p) (*(uint32_t *)(p)) #define R(p) (*(uint32_t *)((uint8_t *)(p) + 0x40000)) +#define P0(p) (*(uint32_t *)((uint8_t *)(p) + 0x40000)) +#define P1(p) (*(uint32_t *)((uint8_t *)(p) + 0x80000)) +#define P2(p) (*(uint32_t *)((uint8_t *)(p) + 0xc0000)) +#define P3(p) (*(uint32_t *)((uint8_t *)(p) + 0x100000)) /* * macros to handle unaligned bit copy ops. @@ -82,19 +95,15 @@ static int om_allocattr(void *, int, int #define FASTGETBITS(psrc, x, w, dst) \ asm("bfextu %3{%1:%2},%0" \ : "=d" (dst) \ - : "di" (x), "di" (w), "o" R(psrc)) + : "di" (x), "di" (w), "o" ((uint32_t *)(psrc))) /* luna68k version PUTBITS() that puts w bits from bit x at pdst memory */ /* XXX this macro assumes (x + w) <= 32 to handle unaligned residual bits */ #define FASTPUTBITS(src, x, w, pdst) \ -do { \ - uint32_t __tmp; \ - __tmp = R(pdst); \ asm("bfins %3,%0{%1:%2}" \ - : "+d" (__tmp) \ - : "di" (x), "di" (w), "d" (src)); \ - W(pdst) = __tmp; \ -} while (/* CONSTCOND */0) + : "+o" ((uint32_t *)(pdst)) \ + : "di" (x), "di" (w), "d" (src) \ + : "memory" ); #define GETBITS(psrc, x, w, dst) FASTGETBITS(psrc, x, w, dst) #define PUTBITS(src, x, w, pdst) FASTPUTBITS(src, x, w, pdst) @@ -103,7 +112,7 @@ do { \ * Blit a character at the specified co-ordinates. */ static void -om_putchar(void *cookie, int row, int startcol, u_int uc, long attr) +om1_putchar(void *cookie, int row, int startcol, u_int uc, long attr) { struct rasops_info *ri = cookie; uint8_t *p; @@ -118,7 +127,7 @@ om_putchar(void *cookie, int row, int st height = ri->ri_font->fontheight; fb = (uint8_t *)ri->ri_font->data + (uc - ri->ri_font->firstchar) * ri->ri_fontscale; - inverse = (attr != 0) ? ALL1BITS : ALL0BITS; + inverse = ((attr & 0x00000001) != 0) ? ALL1BITS : ALL0BITS; p = (uint8_t *)ri->ri_bits + y * scanspan + ((startx / 32) * 4); align = startx & ALIGNMASK; @@ -133,7 +142,7 @@ om_putchar(void *cookie, int row, int st glyph = (glyph << 8) | *fb++; glyph <<= (4 - ri->ri_font->stride) * NBBY; glyph = (glyph >> align) ^ inverse; - W(p) = (R(p) & ~lmask) | (glyph & lmask); + P0(p) = (P0(p) & ~lmask) | (glyph & lmask); p += scanspan; height--; } @@ -147,10 +156,103 @@ om_putchar(void *cookie, int row, int st glyph = (glyph << 8) | *fb++; glyph <<= (4 - ri->ri_font->stride) * NBBY; lhalf = (glyph >> align) ^ inverse; - W(p) = (R(p) & ~lmask) | (lhalf & lmask); + P0(p) = (P0(p) & ~lmask) | (lhalf & lmask); p += BYTESDONE; rhalf = (glyph << (BLITWIDTH - align)) ^ inverse; - W(p) = (rhalf & rmask) | (R(p) & ~rmask); + P0(p) = (rhalf & rmask) | (P0(p) & ~rmask); + + p = (q += scanspan); + height--; + } + } +} + +static void +om4_putchar(void *cookie, int row, int startcol, u_int uc, long attr) +{ + struct rasops_info *ri = cookie; + uint8_t *p; + int scanspan, startx, height, width, align, y; + uint32_t lmask, rmask, glyph; + uint32_t glyphbg, fg, bg; + int i; + uint8_t *fb; + + scanspan = ri->ri_stride; + y = ri->ri_font->fontheight * row; + startx = ri->ri_font->fontwidth * startcol; + height = ri->ri_font->fontheight; + fb = (uint8_t *)ri->ri_font->data + + (uc - ri->ri_font->firstchar) * ri->ri_fontscale; + + p = (uint8_t *)ri->ri_bits + y * scanspan + ((startx / 32) * 4); + align = startx & ALIGNMASK; + width = ri->ri_font->fontwidth + align; + lmask = ALL1BITS >> align; + rmask = ALL1BITS << (-width & ALIGNMASK); + if (width <= BLITWIDTH) { + lmask &= rmask; + while (height > 0) { + glyph = 0; + for (i = ri->ri_font->stride; i != 0; i--) + glyph = (glyph << 8) | *fb++; + glyph <<= (4 - ri->ri_font->stride) * NBBY; + glyph = (glyph >> align); + glyphbg = glyph ^ ALL1BITS; + fg = (attr & 0x01000000) ? glyph : 0; + bg = (attr & 0x00010000) ? glyphbg : 0; + P0(p) = (P0(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x02000000) ? glyph : 0; + bg = (attr & 0x00020000) ? glyphbg : 0; + P1(p) = (P1(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x04000000) ? glyph : 0; + bg = (attr & 0x00040000) ? glyphbg : 0; + P2(p) = (P2(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x08000000) ? glyph : 0; + bg = (attr & 0x00080000) ? glyphbg : 0; + P3(p) = (P3(p) & ~lmask) | ((fg | bg) & lmask); + p += scanspan; + height--; + } + } else { + uint8_t *q = p; + uint32_t lhalf, rhalf; + uint32_t lhalfbg, rhalfbg; + + while (height > 0) { + glyph = 0; + for (i = ri->ri_font->stride; i != 0; i--) + glyph = (glyph << 8) | *fb++; + glyph <<= (4 - ri->ri_font->stride) * NBBY; + lhalf = (glyph >> align); + lhalfbg = lhalf ^ ALL1BITS; + fg = (attr & 0x01000000) ? lhalf : 0; + bg = (attr & 0x00010000) ? lhalfbg : 0; + P0(p) = (P0(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x02000000) ? lhalf : 0; + bg = (attr & 0x00020000) ? lhalfbg : 0; + P1(p) = (P1(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x04000000) ? lhalf : 0; + bg = (attr & 0x00040000) ? lhalfbg : 0; + P2(p) = (P2(p) & ~lmask) | ((fg | bg) & lmask); + fg = (attr & 0x08000000) ? lhalf : 0; + bg = (attr & 0x00080000) ? lhalfbg : 0; + P3(p) = (P3(p) & ~lmask) | ((fg | bg) & lmask); + p += BYTESDONE; + rhalf = (glyph << (BLITWIDTH - align)); + rhalfbg = rhalf ^ ALL1BITS; + fg = (attr & 0x01000000) ? rhalf : 0; + bg = (attr & 0x00010000) ? rhalfbg : 0; + P0(p) = ((fg | bg) & rmask) | (P0(p) & ~rmask); + fg = (attr & 0x02000000) ? rhalf : 0; + bg = (attr & 0x00020000) ? rhalfbg : 0; + P1(p) = ((fg | bg) & rmask) | (P1(p) & ~rmask); + fg = (attr & 0x04000000) ? rhalf : 0; + bg = (attr & 0x00040000) ? rhalfbg : 0; + P2(p) = ((fg | bg) & rmask) | (P2(p) & ~rmask); + fg = (attr & 0x08000000) ? rhalf : 0; + bg = (attr & 0x00080000) ? rhalfbg : 0; + P3(p) = ((fg | bg) & rmask) | (P3(p) & ~rmask); p = (q += scanspan); height--; @@ -159,7 +261,7 @@ om_putchar(void *cookie, int row, int st } static void -om_erasecols(void *cookie, int row, int startcol, int ncols, long attr) +om1_erasecols(void *cookie, int row, int startcol, int ncols, long attr) { struct rasops_info *ri = cookie; uint8_t *p; @@ -167,12 +269,11 @@ om_erasecols(void *cookie, int row, int uint32_t lmask, rmask, fill; scanspan = ri->ri_stride;; - fill = (attr != 0) ? ALL1BITS : ALL0BITS; y = ri->ri_font->fontheight * row; startx = ri->ri_font->fontwidth * startcol; height = ri->ri_font->fontheight; w = ri->ri_font->fontwidth * ncols; - fill = (attr != 0) ? ALL1BITS : ALL0BITS; + fill = ((attr & 0x00000001) != 0) ? ALL1BITS : ALL0BITS; p = (uint8_t *)ri->ri_bits + y * scanspan + ((startx / 32) * 4); align = startx & ALIGNMASK; @@ -181,24 +282,24 @@ om_erasecols(void *cookie, int row, int rmask = ALL1BITS << (-width & ALIGNMASK); if (width <= BLITWIDTH) { lmask &= rmask; - fill &= lmask; + fill &= lmask; while (height > 0) { - W(p) = (R(p) & ~lmask) | fill; + P0(p) = (P0(p) & ~lmask) | fill; p += scanspan; height--; } } else { uint8_t *q = p; while (height > 0) { - W(p) = (R(p) & ~lmask) | (fill & lmask); + P0(p) = (P0(p) & ~lmask) | (fill & lmask); width -= 2 * BLITWIDTH; while (width > 0) { p += BYTESDONE; - W(p) = fill; + P0(p) = fill; width -= BLITWIDTH; } p += BYTESDONE; - W(p) = (fill & rmask) | (R(p) & ~rmask); + P0(p) = (fill & rmask) | (P0(p) & ~rmask); p = (q += scanspan); width = w + align; @@ -208,7 +309,73 @@ om_erasecols(void *cookie, int row, int } static void -om_eraserows(void *cookie, int startrow, int nrows, long attr) +om4_erasecols(void *cookie, int row, int startcol, int ncols, long attr) +{ + struct rasops_info *ri = cookie; + uint8_t *p; + int scanspan, startx, height, width, align, w, y; + uint32_t lmask, rmask, fill0, fill1, fill2, fill3; + + scanspan = ri->ri_stride;; + y = ri->ri_font->fontheight * row; + startx = ri->ri_font->fontwidth * startcol; + height = ri->ri_font->fontheight; + w = ri->ri_font->fontwidth * ncols; + fill0 = ((attr & 0x00010000) != 0) ? ALL1BITS : ALL0BITS; + fill1 = ((attr & 0x00020000) != 0) ? ALL1BITS : ALL0BITS; + fill2 = ((attr & 0x00040000) != 0) ? ALL1BITS : ALL0BITS; + fill3 = ((attr & 0x00080000) != 0) ? ALL1BITS : ALL0BITS; + + p = (uint8_t *)ri->ri_bits + y * scanspan + ((startx / 32) * 4); + align = startx & ALIGNMASK; + width = w + align; + lmask = ALL1BITS >> align; + rmask = ALL1BITS << (-width & ALIGNMASK); + if (width <= BLITWIDTH) { + lmask &= rmask; + fill0 &= lmask; + fill1 &= lmask; + fill2 &= lmask; + fill3 &= lmask; + while (height > 0) { + P0(p) = (P0(p) & ~lmask) | fill0; + P1(p) = (P1(p) & ~lmask) | fill1; + P2(p) = (P2(p) & ~lmask) | fill2; + P3(p) = (P3(p) & ~lmask) | fill3; + p += scanspan; + height--; + } + } else { + uint8_t *q = p; + while (height > 0) { + P0(p) = (P0(p) & ~lmask) | (fill0 & lmask); + P1(p) = (P1(p) & ~lmask) | (fill1 & lmask); + P2(p) = (P2(p) & ~lmask) | (fill2 & lmask); + P3(p) = (P3(p) & ~lmask) | (fill3 & lmask); + width -= 2 * BLITWIDTH; + while (width > 0) { + p += BYTESDONE; + P0(p) = fill0; + P1(p) = fill1; + P2(p) = fill2; + P3(p) = fill3; + width -= BLITWIDTH; + } + p += BYTESDONE; + P0(p) = (fill0 & rmask) | (P0(p) & ~rmask); + P1(p) = (fill1 & rmask) | (P1(p) & ~rmask); + P2(p) = (fill2 & rmask) | (P2(p) & ~rmask); + P3(p) = (fill3 & rmask) | (P3(p) & ~rmask); + + p = (q += scanspan); + width = w + align; + height--; + } + } +} + +static void +om1_eraserows(void *cookie, int startrow, int nrows, long attr) { struct rasops_info *ri = cookie; uint8_t *p, *q; @@ -219,22 +386,22 @@ om_eraserows(void *cookie, int startrow, starty = ri->ri_font->fontheight * startrow; height = ri->ri_font->fontheight * nrows; w = ri->ri_emuwidth; - fill = (attr != 0) ? ALL1BITS : ALL0BITS; + fill = ((attr & 0x00000001) != 0) ? ALL1BITS : ALL0BITS; p = (uint8_t *)ri->ri_bits + starty * scanspan; width = w; rmask = ALL1BITS << (-width & ALIGNMASK); q = p; while (height > 0) { - W(p) = fill; /* always aligned */ + P0(p) = fill; /* always aligned */ width -= 2 * BLITWIDTH; while (width > 0) { p += BYTESDONE; - W(p) = fill; + P0(p) = fill; width -= BLITWIDTH; } p += BYTESDONE; - W(p) = (fill & rmask) | (R(p) & ~rmask); + P0(p) = (fill & rmask) | (P0(p) & ~rmask); p = (q += scanspan); width = w; height--; @@ -242,7 +409,53 @@ om_eraserows(void *cookie, int startrow, } static void -om_copyrows(void *cookie, int srcrow, int dstrow, int nrows) +om4_eraserows(void *cookie, int startrow, int nrows, long attr) +{ + struct rasops_info *ri = cookie; + uint8_t *p, *q; + int scanspan, starty, height, width, w; + uint32_t rmask, fill0, fill1, fill2, fill3; + + scanspan = ri->ri_stride; + starty = ri->ri_font->fontheight * startrow; + height = ri->ri_font->fontheight * nrows; + w = ri->ri_emuwidth; + fill0 = ((attr & 0x00010000) != 0) ? ALL1BITS : ALL0BITS; + fill1 = ((attr & 0x00020000) != 0) ? ALL1BITS : ALL0BITS; + fill2 = ((attr & 0x00040000) != 0) ? ALL1BITS : ALL0BITS; + fill3 = ((attr & 0x00080000) != 0) ? ALL1BITS : ALL0BITS; + + p = (uint8_t *)ri->ri_bits + starty * scanspan; + width = w; + rmask = ALL1BITS << (-width & ALIGNMASK); + q = p; + while (height > 0) { + P0(p) = fill0; /* always aligned */ + P1(p) = fill1; + P2(p) = fill2; + P3(p) = fill3; + width -= 2 * BLITWIDTH; + while (width > 0) { + p += BYTESDONE; + P0(p) = fill0; + P1(p) = fill1; + P2(p) = fill2; + P3(p) = fill3; + width -= BLITWIDTH; + } + p += BYTESDONE; + P0(p) = (fill0 & rmask) | (P0(p) & ~rmask); + P1(p) = (fill1 & rmask) | (P1(p) & ~rmask); + P2(p) = (fill2 & rmask) | (P2(p) & ~rmask); + P3(p) = (fill3 & rmask) | (P3(p) & ~rmask); + p = (q += scanspan); + width = w; + height--; + } +} + +static void +om1_copyrows(void *cookie, int srcrow, int dstrow, int nrows) { struct rasops_info *ri = cookie; uint8_t *p, *q; @@ -264,15 +477,15 @@ om_copyrows(void *cookie, int srcrow, in rmask = ALL1BITS << (-width & ALIGNMASK); q = p; while (height > 0) { - W(p + offset) = R(p); /* always aligned */ + P0(p + offset) = P0(p); /* always aligned */ width -= 2 * BLITWIDTH; while (width > 0) { p += BYTESDONE; - W(p + offset) = R(p); + P0(p + offset) = P0(p); width -= BLITWIDTH; } p += BYTESDONE; - W(p + offset) = (R(p) & rmask) | (R(p + offset) & ~rmask); + P0(p + offset) = (P0(p) & rmask) | (P0(p + offset) & ~rmask); p = (q += scanspan); width = w; @@ -281,7 +494,185 @@ om_copyrows(void *cookie, int srcrow, in } static void -om_copycols(void *cookie, int startrow, int srccol, int dstcol, int ncols) +om4_copyrows(void *cookie, int srcrow, int dstrow, int nrows) +{ + struct rasops_info *ri = cookie; + uint8_t *p, *q; + int scanspan, offset, srcy, height, width, w; + uint32_t rmask; + + scanspan = ri->ri_stride; + height = ri->ri_font->fontheight * nrows; + offset = (dstrow - srcrow) * scanspan * ri->ri_font->fontheight; + srcy = ri->ri_font->fontheight * srcrow; + if (srcrow < dstrow && srcrow + nrows > dstrow) { + scanspan = -scanspan; + srcy = srcy + height - 1; + } + + p = (uint8_t *)ri->ri_bits + srcy * ri->ri_stride; + w = ri->ri_emuwidth; + width = w; + rmask = ALL1BITS << (-width & ALIGNMASK); + q = p; + while (height > 0) { + P0(p + offset) = P0(p); /* always aligned */ + P1(p + offset) = P1(p); + P2(p + offset) = P2(p); + P3(p + offset) = P3(p); + width -= 2 * BLITWIDTH; + while (width > 0) { + p += BYTESDONE; + P0(p + offset) = P0(p); + P1(p + offset) = P1(p); + P2(p + offset) = P2(p); + P3(p + offset) = P3(p); + width -= BLITWIDTH; + } + p += BYTESDONE; + P0(p + offset) = (P0(p) & rmask) | (P0(p + offset) & ~rmask); + P1(p + offset) = (P1(p) & rmask) | (P1(p + offset) & ~rmask); + P2(p + offset) = (P2(p) & rmask) | (P2(p + offset) & ~rmask); + P3(p + offset) = (P3(p) & rmask) | (P3(p + offset) & ~rmask); + + p = (q += scanspan); + width = w; + height--; + } +} + +static void +om1_copycols(void *cookie, int startrow, int srccol, int dstcol, int ncols) +{ + struct rasops_info *ri = cookie; + uint8_t *sp, *dp, *sq, *dq, *basep; + int scanspan, height, w, y, srcx, dstx; + int sb, eb, db, sboff, full, cnt, lnum, rnum; + uint32_t lmask, rmask, tmp; + bool sbover; + + scanspan = ri->ri_stride; + y = ri->ri_font->fontheight * startrow; + srcx = ri->ri_font->fontwidth * srccol; + dstx = ri->ri_font->fontwidth * dstcol; + height = ri->ri_font->fontheight; + w = ri->ri_font->fontwidth * ncols; + basep = (uint8_t *)ri->ri_bits + y * scanspan; + + sb = srcx & ALIGNMASK; + db = dstx & ALIGNMASK; + + if (db + w <= BLITWIDTH) { + /* Destination is contained within a single word */ + sp = basep + (srcx / 32) * 4; + dp = basep + (dstx / 32) * 4; + + while (height > 0) { + GETBITS(P0(sp), sb, w, tmp); + PUTBITS(tmp, db, w, P0(dp)); + dp += scanspan; + sp += scanspan; + height--; + } + return; + } + + lmask = (db == 0) ? 0 : ALL1BITS >> db; + eb = (db + w) & ALIGNMASK; + rmask = (eb == 0) ? 0 : ALL1BITS << (32 - eb); + lnum = (32 - db) & ALIGNMASK; + rnum = (dstx + w) & ALIGNMASK; + + if (lmask != 0) + full = (w - (32 - db)) / 32; + else + full = w / 32; + + sbover = (sb + lnum) >= 32; + + if (dstcol < srccol || srccol + ncols < dstcol) { + /* copy forward (left-to-right) */ + sp = basep + (srcx / 32) * 4; + dp = basep + (dstx / 32) * 4; + + if (lmask != 0) { + sboff = sb + lnum; + if (sboff >= 32) + sboff -= 32; + } else + sboff = sb; + + sq = sp; + dq = dp; + while (height > 0) { + if (lmask != 0) { + GETBITS(P0(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P0(dp)); + dp += BYTESDONE; + if (sbover) + sp += BYTESDONE; + } + + for (cnt = full; cnt; cnt--) { + GETBITS(P0(sp), sboff, 32, tmp); + P0(dp) = tmp; + sp += BYTESDONE; + dp += BYTESDONE; + } + + if (rmask != 0) { + GETBITS(P0(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P0(dp)); + } + + sp = (sq += scanspan); + dp = (dq += scanspan); + height--; + } + } else { + /* copy backward (right-to-left) */ + sp = basep + ((srcx + w) / 32) * 4; + dp = basep + ((dstx + w) / 32) * 4; + + sboff = (srcx + w) & ALIGNMASK; + sboff -= rnum; + if (sboff < 0) { + sp -= BYTESDONE; + sboff += 32; + } + + sq = sp; + dq = dp; + while (height > 0) { + if (rnum != 0) { + GETBITS(P0(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P0(dp)); + } + + for (cnt = full; cnt; cnt--) { + sp -= BYTESDONE; + dp -= BYTESDONE; + GETBITS(P0(sp), sboff, 32, tmp); + P0(dp) = tmp; + } + + if (lmask != 0) { + if (sbover) + sp -= BYTESDONE; + dp -= BYTESDONE; + GETBITS(P0(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P0(dp)); + } + + sp = (sq += scanspan); + dp = (dq += scanspan); + height--; + } + } +} + +static void +om4_copycols(void *cookie, int startrow, int srccol, int dstcol, int ncols) { struct rasops_info *ri = cookie; uint8_t *sp, *dp, *sq, *dq, *basep; @@ -307,8 +698,14 @@ om_copycols(void *cookie, int startrow, dp = basep + (dstx / 32) * 4; while (height > 0) { - GETBITS(sp, sb, w, tmp); - PUTBITS(tmp, db, w, dp); + GETBITS(P0(sp), sb, w, tmp); + PUTBITS(tmp, db, w, P0(dp)); + GETBITS(P1(sp), sb, w, tmp); + PUTBITS(tmp, db, w, P1(dp)); + GETBITS(P2(sp), sb, w, tmp); + PUTBITS(tmp, db, w, P2(dp)); + GETBITS(P3(sp), sb, w, tmp); + PUTBITS(tmp, db, w, P3(dp)); dp += scanspan; sp += scanspan; height--; @@ -345,23 +742,41 @@ om_copycols(void *cookie, int startrow, dq = dp; while (height > 0) { if (lmask != 0) { - GETBITS(sp, sb, lnum, tmp); - PUTBITS(tmp, db, lnum, dp); + GETBITS(P0(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P0(dp)); + GETBITS(P1(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P1(dp)); + GETBITS(P2(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P2(dp)); + GETBITS(P3(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P3(dp)); dp += BYTESDONE; if (sbover) sp += BYTESDONE; } for (cnt = full; cnt; cnt--) { - GETBITS(sp, sboff, 32, tmp); - W(dp) = tmp; + GETBITS(P0(sp), sboff, 32, tmp); + P0(dp) = tmp; + GETBITS(P1(sp), sboff, 32, tmp); + P1(dp) = tmp; + GETBITS(P2(sp), sboff, 32, tmp); + P2(dp) = tmp; + GETBITS(P3(sp), sboff, 32, tmp); + P3(dp) = tmp; sp += BYTESDONE; dp += BYTESDONE; } if (rmask != 0) { - GETBITS(sp, sboff, rnum, tmp); - PUTBITS(tmp, 0, rnum, dp); + GETBITS(P0(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P0(dp)); + GETBITS(P1(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P1(dp)); + GETBITS(P2(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P2(dp)); + GETBITS(P3(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P3(dp)); } sp = (sq += scanspan); @@ -384,23 +799,41 @@ om_copycols(void *cookie, int startrow, dq = dp; while (height > 0) { if (rnum != 0) { - GETBITS(sp, sboff, rnum, tmp); - PUTBITS(tmp, 0, rnum, dp); + GETBITS(P0(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P0(dp)); + GETBITS(P1(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P1(dp)); + GETBITS(P2(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P2(dp)); + GETBITS(P3(sp), sboff, rnum, tmp); + PUTBITS(tmp, 0, rnum, P3(dp)); } for (cnt = full; cnt; cnt--) { sp -= BYTESDONE; dp -= BYTESDONE; - GETBITS(sp, sboff, 32, tmp); - W(dp) = tmp; + GETBITS(P0(sp), sboff, 32, tmp); + P0(dp) = tmp; + GETBITS(P1(sp), sboff, 32, tmp); + P1(dp) = tmp; + GETBITS(P2(sp), sboff, 32, tmp); + P2(dp) = tmp; + GETBITS(P3(sp), sboff, 32, tmp); + P3(dp) = tmp; } if (lmask != 0) { if (sbover) sp -= BYTESDONE; dp -= BYTESDONE; - GETBITS(sp, sb, lnum, tmp); - PUTBITS(tmp, db, lnum, dp); + GETBITS(P0(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P0(dp)); + GETBITS(P1(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P1(dp)); + GETBITS(P2(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P2(dp)); + GETBITS(P3(sp), sb, lnum, tmp); + PUTBITS(tmp, db, lnum, P3(dp)); } sp = (sq += scanspan); @@ -440,7 +873,7 @@ om_mapchar(void *cookie, int c, u_int *c * Position|{enable|disable} the cursor at the specified location. */ static void -om_cursor(void *cookie, int on, int row, int col) +om1_cursor(void *cookie, int on, int row, int col) { struct rasops_info *ri = cookie; uint8_t *p; @@ -473,8 +906,8 @@ om_cursor(void *cookie, int on, int row, if (width <= BLITWIDTH) { lmask &= rmask; while (height > 0) { - image = R(p); - W(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P0(p); + P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); p += scanspan; height--; } @@ -482,11 +915,85 @@ om_cursor(void *cookie, int on, int row, uint8_t *q = p; while (height > 0) { - image = R(p); - W(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P0(p); + P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); p += BYTESDONE; - image = R(p); - W(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); + image = P0(p); + P0(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); + + p = (q += scanspan); + height--; + } + } + ri->ri_flg ^= RI_CURSOR; +} + +static void +om4_cursor(void *cookie, int on, int row, int col) +{ + struct rasops_info *ri = cookie; + uint8_t *p; + int scanspan, startx, height, width, align, y; + uint32_t lmask, rmask, image; + + if (!on) { + /* make sure it's on */ + if ((ri->ri_flg & RI_CURSOR) == 0) + return; + + row = ri->ri_crow; + col = ri->ri_ccol; + } else { + /* unpaint the old copy. */ + ri->ri_crow = row; + ri->ri_ccol = col; + } + + scanspan = ri->ri_stride; + y = ri->ri_font->fontheight * row; + startx = ri->ri_font->fontwidth * col; + height = ri->ri_font->fontheight; + + p = (uint8_t *)ri->ri_bits + y * scanspan + ((startx / 32) * 4); + align = startx & ALIGNMASK; + width = ri->ri_font->fontwidth + align; + lmask = ALL1BITS >> align; + rmask = ALL1BITS << (-width & ALIGNMASK); + if (width <= BLITWIDTH) { + lmask &= rmask; + while (height > 0) { + image = P0(p); + P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P1(p); + P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P2(p); + P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P3(p); + P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + p += scanspan; + height--; + } + } else { + uint8_t *q = p; + + while (height > 0) { + image = P0(p); + P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P1(p); + P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P2(p); + P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + image = P3(p); + P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); + p += BYTESDONE; + image = P0(p); + P0(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); + image = P1(p); + P1(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); + image = P2(p); + P2(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); + image = P3(p); + P3(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); p = (q += scanspan); height--; @@ -499,23 +1006,92 @@ om_cursor(void *cookie, int on, int row, * Allocate attribute. We just pack these into an integer. */ static int -om_allocattr(void *id, int fg, int bg, int flags, long *attrp) +om1_allocattr(void *id, int fg, int bg, int flags, long *attrp) { - if (flags & (WSATTR_HILIT | WSATTR_BLINK | - WSATTR_UNDERLINE | WSATTR_WSCOLORS)) + if ((flags & (WSATTR_HILIT | WSATTR_BLINK | + WSATTR_UNDERLINE | WSATTR_WSCOLORS)) != 0) return EINVAL; - if (flags & WSATTR_REVERSE) + if ((flags & WSATTR_REVERSE) != 0) *attrp = 1; else *attrp = 0; return 0; } +static int +om4_allocattr(void *id, int fg, int bg, int flags, long *attrp) +{ + + if ((flags & (WSATTR_BLINK | WSATTR_UNDERLINE)) != 0) + return EINVAL; + if ((flags & WSATTR_WSCOLORS) == 0) { + fg = WSCOL_WHITE; + bg = WSCOL_BLACK; + } + + if ((flags & WSATTR_REVERSE) != 0) { + int swap; + swap = fg; + fg = bg; + bg = swap; + } + + if ((flags & WSATTR_HILIT) != 0) + fg += 8; + + *attrp = (fg << 24) | (bg << 16); + return 0; +} + /* * Init subset of rasops(9) for omrasops. */ int +omrasops1_init(struct rasops_info *ri, int wantrows, int wantcols) +{ + + omrasops_init(ri, wantrows, wantcols); + + /* fill our own emulops */ + ri->ri_ops.cursor = om1_cursor; + ri->ri_ops.mapchar = om_mapchar; + ri->ri_ops.putchar = om1_putchar; + ri->ri_ops.copycols = om1_copycols; + ri->ri_ops.erasecols = om1_erasecols; + ri->ri_ops.copyrows = om1_copyrows; + ri->ri_ops.eraserows = om1_eraserows; + ri->ri_ops.allocattr = om1_allocattr; + ri->ri_caps = WSSCREEN_REVERSE; + + ri->ri_flg |= RI_CFGDONE; + + return 0; +} + +int +omrasops4_init(struct rasops_info *ri, int wantrows, int wantcols) +{ + + omrasops_init(ri, wantrows, wantcols); + + /* fill our own emulops */ + ri->ri_ops.cursor = om4_cursor; + ri->ri_ops.mapchar = om_mapchar; + ri->ri_ops.putchar = om4_putchar; + ri->ri_ops.copycols = om4_copycols; + ri->ri_ops.erasecols = om4_erasecols; + ri->ri_ops.copyrows = om4_copyrows; + ri->ri_ops.eraserows = om4_eraserows; + ri->ri_ops.allocattr = om4_allocattr; + ri->ri_caps = WSSCREEN_HILIT | WSSCREEN_WSCOLORS | WSSCREEN_REVERSE; + + ri->ri_flg |= RI_CFGDONE; + + return 0; +} + +static int omrasops_init(struct rasops_info *ri, int wantrows, int wantcols) { int wsfcookie, bpp; @@ -541,7 +1117,8 @@ omrasops_init(struct rasops_info *ri, in KASSERT(ri->ri_font->fontwidth > 4 && ri->ri_font->fontwidth <= 32); - bpp = ri->ri_depth; + /* all planes are independently addressed */ + bpp = 1; /* Now constrain what they get */ ri->ri_emuwidth = ri->ri_font->fontwidth * wantcols; @@ -586,18 +1163,5 @@ omrasops_init(struct rasops_info *ri, in } else ri->ri_xorigin = ri->ri_yorigin = 0; - /* fill our own emulops */ - ri->ri_ops.cursor = om_cursor; - ri->ri_ops.mapchar = om_mapchar; - ri->ri_ops.putchar = om_putchar; - ri->ri_ops.copycols = om_copycols; - ri->ri_ops.erasecols = om_erasecols; - ri->ri_ops.copyrows = om_copyrows; - ri->ri_ops.eraserows = om_eraserows; - ri->ri_ops.allocattr = om_allocattr; - ri->ri_caps = WSSCREEN_REVERSE; - - ri->ri_flg |= RI_CFGDONE; - return 0; } Index: src/sys/arch/luna68k/dev/omrasopsvar.h diff -u src/sys/arch/luna68k/dev/omrasopsvar.h:1.1 src/sys/arch/luna68k/dev/omrasopsvar.h:1.2 --- src/sys/arch/luna68k/dev/omrasopsvar.h:1.1 Fri Jul 20 19:31:53 2012 +++ src/sys/arch/luna68k/dev/omrasopsvar.h Sat Dec 28 09:17:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: omrasopsvar.h,v 1.1 2012/07/20 19:31:53 tsutsui Exp $ */ +/* $NetBSD: omrasopsvar.h,v 1.2 2013/12/28 09:17:23 tsutsui Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -26,4 +26,5 @@ * POSSIBILITY OF SUCH DAMAGE. */ -int omrasops_init(struct rasops_info *, int, int); +int omrasops1_init(struct rasops_info *, int, int); +int omrasops4_init(struct rasops_info *, int, int);