531 lines
14 KiB
C
531 lines
14 KiB
C
/*
|
|
* Copyright (c) 1992, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to Berkeley by
|
|
* Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the University of
|
|
* California, Berkeley and its contributors.
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* from: $Hdr: fbdefs.h,v 4.300 91/06/09 06:33:54 root Rel41 $ SONY
|
|
*
|
|
* @(#)fbdefs.h 8.1 (Berkeley) 6/11/93
|
|
*/
|
|
|
|
#ifndef mips
|
|
#define volatile
|
|
#endif
|
|
|
|
#ifdef CPU_SINGLE
|
|
|
|
#if defined(news3400) || defined(news3700)
|
|
#define splbitmap cpu_spl0 /* Lite2 used spl3 */
|
|
#endif
|
|
#define FB_LOCK lock_bitmap()
|
|
#define FB_UNLOCK unlock_bitmap()
|
|
|
|
extern int splbitmap();
|
|
|
|
#else /* CPU_SINGLE */
|
|
|
|
#undef PRE_EMPT
|
|
#define PRE_EMPT
|
|
#define FB_LOCK
|
|
#define FB_UNLOCK
|
|
#include <news3400/fb/fbsem.h> /* semaphore name */
|
|
|
|
#endif /* CPU_SINGLE */
|
|
|
|
#if defined(news3400) || defined(news3700)
|
|
#define WB_FLUSH wbflush()
|
|
#else
|
|
#define WB_FLUSH
|
|
#endif
|
|
|
|
/*
|
|
* macro to compute modulo
|
|
* MOD(-1, 16) --> 15
|
|
* DIV(-1, 16) --> -1
|
|
*/
|
|
#define MOD(x, d, t) (((t)=(x)%(d))>=0?(t):(t)+(d))
|
|
#define TRUNC(x, d, t) ((x)-MOD(x,d,t))
|
|
#define DIV(x, d, t) (((x)-MOD(x,d,t))/(d))
|
|
|
|
/* BitsPerWord should be 2^x */
|
|
#define MODWORD(x) ((x)&((BitsPerWord)-1))
|
|
#define TRUNCWORD(x) ((x)-MODWORD(x))
|
|
#define DIVWORD(x) (((x)-MODWORD(x))/BitsPerWord)
|
|
|
|
|
|
#define AllOnes 0xffff
|
|
|
|
/* transparency */
|
|
#define TRANS(t,f) ((t) ? (((f) & 0x3) | 0x4) : (f))
|
|
|
|
/*
|
|
* color definitions
|
|
*/
|
|
#define MODE_1to1 0
|
|
#define MODE_1toN 1
|
|
#define MODE_Nto1 2
|
|
#define MODE_NtoN 3
|
|
|
|
#define PARALLEL 0
|
|
#define INTERNAL 1
|
|
|
|
#define NODRAW 0
|
|
#define DRAW 1
|
|
|
|
typedef struct _mergeRopBits {
|
|
unsigned long ca1, cx1, ca2, cx2;
|
|
} mergeRopRec;
|
|
|
|
extern mergeRopRec mergeRopBits[];
|
|
|
|
#define DoRop(f, s, d, r) \
|
|
{ \
|
|
switch(f) { \
|
|
case BF_0: \
|
|
(r) = 0; break; \
|
|
case BF_SDA: \
|
|
(r) = (s)&(d); break; \
|
|
case BF_SDIA: \
|
|
(r) = (s)&~(d); break; \
|
|
case BF_S: \
|
|
(r) = (s); break; \
|
|
case BF_SIDA: \
|
|
(r) = ~(s)&(d); break; \
|
|
case BF_D: \
|
|
(r) = (d); break; \
|
|
case BF_SDX: \
|
|
(r) = (s)^(d); break; \
|
|
case BF_SDO: \
|
|
(r) = (s)|(d); break; \
|
|
case BF_SDOI: \
|
|
(r) = ~((s)|(d)); break; \
|
|
case BF_SDXI: \
|
|
(r) = ~((s)^(d)); break; \
|
|
case BF_DI: \
|
|
(r) = ~(d); break; \
|
|
case BF_SDIO: \
|
|
(r) = (s)|~(d); break; \
|
|
case BF_SI: \
|
|
(r) = ~(s); break; \
|
|
case BF_SIDO: \
|
|
(r) = ~(s)|(d); break; \
|
|
case BF_SDAI: \
|
|
(r) = ~((s)&(d)); break; \
|
|
case BF_1: \
|
|
(r) = 0xffffffff; break; \
|
|
} \
|
|
}
|
|
|
|
#define DoMergeRop(src, dst) \
|
|
(((dst) & (((src) & _ca1) ^ _cx1)) ^ (((src) & _ca2) ^ _cx2))
|
|
#define DoMergeRopMask(src, dst, mask) \
|
|
(((dst) & ((((src) & _ca1) ^ _cx1) | ~(mask))) ^ \
|
|
((((src) & _ca2) ^ _cx2) & (mask)))
|
|
#define DoMergeFill(dst) (((dst) & (rop_and)) ^ (rop_xor))
|
|
#define DoMergeFillMask(dst, mask) \
|
|
(((dst) & ((rop_and) | ~(mask))) ^ ((rop_xor) & (mask)))
|
|
#define DoMultiRop(src, dst) \
|
|
{ \
|
|
DoRop(funcs[0], src, dst, tmp0) \
|
|
DoRop(funcs[1], src, dst, tmp1) \
|
|
DoRop(funcs[2], src, dst, tmp2) \
|
|
DoRop(funcs[3], src, dst, tmp3) \
|
|
(dst) = (tmp0 & masks[0]) | (tmp1 & masks[1]) | \
|
|
(tmp2 & masks[2]) | (tmp3 & masks[3]); \
|
|
}
|
|
#define DoMultiRopMask(src, dst, mask) \
|
|
{ \
|
|
DoRop(funcs[0], src, dst, tmp0) \
|
|
DoRop(funcs[1], src, dst, tmp1) \
|
|
DoRop(funcs[2], src, dst, tmp2) \
|
|
DoRop(funcs[3], src, dst, tmp3) \
|
|
(dst) = dst & ~(mask) | \
|
|
((tmp0 & masks[0]) | (tmp1 & masks[1]) | \
|
|
(tmp2 & masks[2]) | (tmp3 & masks[3])) & mask; \
|
|
}
|
|
|
|
#define TypeAt(m, p) ((m)->fm_vaddr + (p) - (m)->fm_offset)
|
|
|
|
#ifdef CPU_DOUBLE
|
|
# define _TypeAt(m, p) ((m)->fm_addr[(p)>>CLSHIFT] + (CLOFSET&(p)))
|
|
#else /* CPU_DOUBLE */
|
|
# define _TypeAt(m, p) ((m)->fm_vaddr + (p) - (m)->fm_offset)
|
|
#endif /* CPU_DOUBLE */
|
|
|
|
#define WordAt(m, p) (*(Word *)_TypeAt(m, p))
|
|
|
|
/*
|
|
* Device Dependent Structure
|
|
*/
|
|
|
|
#define MAXPLANE 24
|
|
|
|
struct fbdev {
|
|
struct fbdev_ops *fbbm_op;
|
|
int type;
|
|
int unit;
|
|
lRectangle FrameRect;
|
|
lRectangle VisRect;
|
|
lRectangle CursorRect;
|
|
lRectangle MaskRect;
|
|
lRectangle SaveRect;
|
|
lBitmap Krom_BM0;
|
|
lBitmap Krom_BM1;
|
|
char * Krom_base;
|
|
lPoint Krom_font_extent0;
|
|
lPoint Krom_font_extent1;
|
|
char funcvec[MAXPLANE];
|
|
int Mode;
|
|
int Pmask;
|
|
unsigned int pat;
|
|
char func;
|
|
int fore;
|
|
int aux;
|
|
int trans;
|
|
int cache_off;
|
|
int font_w;
|
|
int font_h;
|
|
int char_w;
|
|
int char_h;
|
|
int scr_w;
|
|
int scr_h;
|
|
int ch_pos;
|
|
int ul_pos;
|
|
int x_offset;
|
|
int y_offset;
|
|
int rit_m;
|
|
int btm_m;
|
|
lRectangle moveArea;
|
|
lPoint size;
|
|
lPoint hot;
|
|
char curfuncv[MAXPLANE];
|
|
char maskfuncv[MAXPLANE];
|
|
int cursorSet;
|
|
int cursorShow;
|
|
int cursorVis;
|
|
lPoint cursorP;
|
|
char *rcont_base;
|
|
char *rcont_reg;
|
|
int fbNplane;
|
|
int Colorwidth;
|
|
int planemask;
|
|
int Mono;
|
|
int Dimmer;
|
|
int DispVer;
|
|
unsigned short status_flag;
|
|
unsigned short run_flag;
|
|
char *private;
|
|
int hard_cursor;
|
|
};
|
|
|
|
#ifdef CPU_SINGLE
|
|
struct mfbdev {
|
|
char *vram_start;
|
|
int vram_width;
|
|
};
|
|
#endif /* CPU_SINGLE */
|
|
|
|
struct fbdev_ops {
|
|
void (*fb_rop_init)();
|
|
void (*fb_rop_copy)();
|
|
void (*fb_rop_winit)();
|
|
void (*fb_rop_write)();
|
|
void (*fb_rop_read)();
|
|
void (*fb_rop_cinit)();
|
|
void (*fb_rop_clear)();
|
|
void (*fb_rop_vect)();
|
|
void (*fb_rop_dot)();
|
|
void (*fb_rop_fillscan)();
|
|
void (*fb_rop_wait)();
|
|
void (*fb_rop_reset)();
|
|
char *(*fb_Krom_addr)();
|
|
void (*fb_init_palette)();
|
|
int (*fb_set_palette)();
|
|
int (*fb_get_palette)();
|
|
int (*fb_get_pixel)();
|
|
int (*fb_set_dimmer)();
|
|
int (*fb_get_dimmer)();
|
|
int (*fb_open)();
|
|
int (*fb_close)();
|
|
int (*fb_ioctl)();
|
|
int (*fb_get_page)();
|
|
void (*fb_cursor_set)();
|
|
void (*fb_cursor_on)();
|
|
void (*fb_cursor_off)();
|
|
void (*fb_cursor_move)();
|
|
};
|
|
|
|
struct autodev {
|
|
int type;
|
|
char *base;
|
|
char *reg;
|
|
};
|
|
|
|
struct fbdevsw {
|
|
int num;
|
|
int (*fb_probe)();
|
|
void (*fb_setup)();
|
|
};
|
|
|
|
#ifdef _KERNEL
|
|
|
|
extern struct autodev autodev[];
|
|
extern struct fbdev fbdev[];
|
|
extern int nfbdev;
|
|
extern struct fbdev *consfb;
|
|
extern unsigned short fb_color_pallet_def[];
|
|
extern unsigned short fb_gray_pallet_def[];
|
|
|
|
/* fb_ioctl Command */
|
|
|
|
#define FB_INTCHECK 1
|
|
#define FB_INTCLEAR 2
|
|
#define FB_INTENABLE 3
|
|
#define FB_STATUSCHECK 4
|
|
|
|
#define FB_SETVIDEOCTL 10
|
|
#define FB_GETVIDEOSTATUS 11
|
|
#define FB_SETPALETTEMODE 12
|
|
#define FB_GETPALETTEMODE 13
|
|
|
|
#define FB_INT_VSYNC 1
|
|
#define FB_INT_ROPDONE 2
|
|
|
|
#define FB_STATUS_ROPEXEC 4
|
|
#define FB_STATUS_ROPWAIT 8
|
|
#define FB_STATUS_ROPVSYNC 16
|
|
|
|
/* run_flag */
|
|
|
|
#define FB_ACTIVE 1
|
|
#define FB_WAITING 2
|
|
#define FB_DONE 4
|
|
|
|
/*
|
|
* Pseudo Frame Buffer
|
|
*
|
|
* unit no
|
|
* 0 Console Device and old Interface (/dev/fb)
|
|
* 1 B/W Display and New Interface (/dev/mfb)
|
|
* 2 Color Display and New Interface (/dev/cfb)
|
|
*
|
|
*/
|
|
|
|
#define fbbm_rop_init(fb, func) \
|
|
(*(fb)->fbbm_op->fb_rop_init)(fb, func)
|
|
|
|
#define fbbm_rop_copy(fb, s, d, rp, wp) \
|
|
(*(fb)->fbbm_op->fb_rop_copy)(fb, s, d, rp, wp)
|
|
|
|
#define fbbm_rop_winit(fb) \
|
|
(*(fb)->fbbm_op->fb_rop_winit)(fb)
|
|
|
|
#define fbbm_rop_write(fb, map, p, width, srp, drp, wplane) \
|
|
(*(fb)->fbbm_op->fb_rop_write)(fb, map, p, width, srp, drp, wplane)
|
|
|
|
#define fbbm_rop_read(fb, map, p, width, srp, drp, rplane, wplane) \
|
|
(*(fb)->fbbm_op->fb_rop_read)(fb, map, p, width, srp, drp, rplane, wplane)
|
|
|
|
#define fbbm_rop_cinit(fb, wplane, bw) \
|
|
(*(fb)->fbbm_op->fb_rop_cinit)(fb, wplane, bw)
|
|
|
|
#define fbbm_rop_clear(fb, dr) \
|
|
(*(fb)->fbbm_op->fb_rop_clear)(fb, dr)
|
|
|
|
#define fbbm_rop_vect(fb, dr, func, forc, auxc, transp, wplane, n, p, lptn, lpf, sw) \
|
|
(*(fb)->fbbm_op->fb_rop_vect)(fb, dr, func, forc, auxc, transp, wplane, n, p, lptn, lpf, sw)
|
|
|
|
#define fbbm_rop_dot(fb, dr, func, forc, auxc, transp, wplane, n, p) \
|
|
(*(fb)->fbbm_op->fb_rop_dot)(fb, dr, func, forc, auxc, transp, wplane, n, p)
|
|
|
|
#define fbbm_rop_fillscan(fb, ls, ns, clip, sw) \
|
|
(*(fb)->fbbm_op->fb_rop_fillscan)(fb, ls, ns, clip, sw)
|
|
|
|
#define fbbm_Krom_addr(fb, c, sr) \
|
|
(*(fb)->fbbm_op->fb_Krom_addr)(fb, c, sr)
|
|
|
|
#define fbbm_rop_wait(fb) \
|
|
(*(fb)->fbbm_op->fb_rop_wait)(fb)
|
|
#define fbbm_rop_reset(fb) \
|
|
(*(fb)->fbbm_op->fb_rop_reset)(fb)
|
|
|
|
#define fbbm_init_palette(fb) \
|
|
(*(fb)->fbbm_op->fb_init_palette)(fb)
|
|
#define fbbm_set_palette(fb, palette) \
|
|
(*(fb)->fbbm_op->fb_set_palette)(fb, palette)
|
|
#define fbbm_get_palette(fb, palette) \
|
|
(*(fb)->fbbm_op->fb_get_palette)(fb, palette)
|
|
#define fbbm_get_pixel(fb, pixel) \
|
|
(*(fb)->fbbm_op->fb_get_pixel)(fb, pixel)
|
|
|
|
#define fbbm_set_dimmer(fb, n) \
|
|
(*(fb)->fbbm_op->fb_set_dimmer)(fb, n)
|
|
#define fbbm_get_dimmer(fb) \
|
|
(*(fb)->fbbm_op->fb_get_dimmer)(fb)
|
|
|
|
#define fbbm_open(fb) \
|
|
(*(fb)->fbbm_op->fb_open)(fb)
|
|
#define fbbm_close(fb) \
|
|
(*(fb)->fbbm_op->fb_close)(fb)
|
|
#define fbbm_ioctl(fb, cmd, data) \
|
|
(*(fb)->fbbm_op->fb_ioctl)(fb, cmd, data)
|
|
|
|
#define fbbm_get_page(fb, off) \
|
|
(*(fb)->fbbm_op->fb_get_page)(fb, off)
|
|
|
|
#define fbbm_cursor_set(fb, fc, bc) \
|
|
(*(fb)->fbbm_op->fb_cursor_set)(fb, fc, bc)
|
|
#define fbbm_cursor_on(fb) \
|
|
(*(fb)->fbbm_op->fb_cursor_on)(fb)
|
|
#define fbbm_cursor_off(fb) \
|
|
(*(fb)->fbbm_op->fb_cursor_off)(fb)
|
|
#define fbbm_cursor_move(fb) \
|
|
(*(fb)->fbbm_op->fb_cursor_move)(fb)
|
|
|
|
/* fb_mfbs.c */
|
|
extern unsigned short mfbstarttab16[16];
|
|
extern unsigned short mfbendtab16[16];
|
|
extern unsigned short mfbpartmasks16[16][16];
|
|
extern unsigned int mfbstarttab32[32];
|
|
extern unsigned int mfbendtab32[32];
|
|
extern unsigned int mfbpartmasks32[32][32];
|
|
|
|
struct fbdev;
|
|
extern void mfb_copy_area32
|
|
__P((u_int *, u_int *, u_int, u_int, lRectangle *, lPoint *));
|
|
extern void mfb_copyinv_area32
|
|
__P((u_int *, u_int *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_or_area32
|
|
__P((u_int *, u_int *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_xor_area32
|
|
__P((u_int *, u_int *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_general_area32
|
|
__P((int, u_int *, u_int *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_clr_area32 __P((int, int, int, int, u_int *, int));
|
|
extern void mfb_inv_area32 __P((int, int, int, int, u_int *, int));
|
|
extern void mfb_set_area32 __P((int, int, int, int, u_int *, int));
|
|
extern void mfb_copy_area16
|
|
__P((u_short *, u_short *, u_int, u_int, lRectangle *, lPoint *));
|
|
extern void mfb_copyinv_area16
|
|
__P((u_short *, u_short *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_or_area16
|
|
__P((u_short *, u_short *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_xor_area16
|
|
__P((u_short *, u_short *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_general_area16
|
|
__P((int, u_short *, u_short *, int, int, lRectangle *, lPoint *));
|
|
extern void mfb_clr_area16 __P((int, int, int, int, u_short *, int));
|
|
extern void mfb_inv_area16 __P((int, int, int, int, u_short *, int));
|
|
extern void mfb_set_area16 __P((int, int, int, int, u_short *, int));
|
|
extern void mfb_clrvvector32 __P((u_int *, int, int, int, int));
|
|
extern void mfb_clrhvector32 __P((u_int *, int, int, int));
|
|
extern void mfb_clrvector32
|
|
__P((struct fbdev *, u_int *, int, lPoint *, lPoint *, int));
|
|
extern void mfb_invvvector32 __P((u_int *, int, int, int, int));
|
|
extern void mfb_invhvector32 __P((u_int *, int, int, int));
|
|
extern void mfb_invvector32
|
|
__P((struct fbdev *, u_int *, int, lPoint *, lPoint *, int));
|
|
extern void mfb_setvvector32 __P((u_int *, int, int, int, int));
|
|
extern void mfb_sethvector32 __P((u_int *, int, int, int));
|
|
extern void mfb_setvector32
|
|
__P((struct fbdev *, u_int *, int, lPoint *, lPoint *, int));
|
|
extern void mfb_point __P((u_int *, int, u_int, char *));
|
|
extern void mfb_vector32
|
|
__P((struct fbdev *, u_int *, int, lPoint *, lPoint *, int));
|
|
|
|
/* fb_start.c */
|
|
struct fbreg;
|
|
#ifdef CPU_SINGLE
|
|
extern void lock_bitmap __P((void));
|
|
extern void unlock_bitmap __P((void));
|
|
extern int lock_bitmap_poll __P((void));
|
|
extern void unlock_bitmap_poll __P((void));
|
|
extern int bmlockedp __P((void));
|
|
#else
|
|
#ifdef IPC_MRX
|
|
extern caddr_t fb_map_page __P((int *, int, int));
|
|
extern caddr_t fb_map_page2 __P((int *, int, int));
|
|
#endif /* IPC_MRX */
|
|
#endif /* CPU_SINGLE */
|
|
extern int nofunc __P((void));
|
|
extern int fb_error __P((void));
|
|
extern void updateCursor __P((int *, int *, int));
|
|
extern void linerop __P((struct fbdev *, u_int, int, int, int));
|
|
extern int lineclip __P((lPoint *, lPoint *, lRectangle *));
|
|
extern int fbstart __P((struct fbreg *, int));
|
|
|
|
/* vt100.c */
|
|
extern void auto_dimmer_on __P((void));
|
|
extern void auto_dimmer_off __P((void));
|
|
extern void rst_dimmer_cnt __P((void));
|
|
|
|
/* fb_probe.c */
|
|
extern int search_fbdev __P((int, int));
|
|
|
|
/* bitmapif.c */
|
|
extern void cursor_on __P((lPoint *));
|
|
extern void cursor_off __P((void));
|
|
extern void move_lines(int, int, int);
|
|
extern void move_chars(int, int, int, int);
|
|
extern void clear_lines(int, int, int, int, int);
|
|
extern void clear_chars(int, int, int, int, int, int);
|
|
extern void reverse_rec(int, int);
|
|
extern void copy_char(/*SCREEN *, u_int, int*/);
|
|
extern int bm_pallet_write(int, int);
|
|
extern int bm_pallet_read(int);
|
|
extern void bitmapinit(void);
|
|
extern void line(short *);
|
|
|
|
/* kb_ctrl.c */
|
|
extern int kbd_ioctl();
|
|
|
|
/* vt100.c */
|
|
extern void addch();
|
|
extern void scroll_up();
|
|
extern void scroll_down();
|
|
extern void set_default_param(void);
|
|
extern void vt100init(void);
|
|
|
|
/* fnt.c */
|
|
extern void font_jisroman __P((void));
|
|
extern void font_ascii __P((void));
|
|
extern void setup_fnt __P((void));
|
|
|
|
/* fnt24.c */
|
|
extern void font_jisroman24 __P((void));
|
|
extern void font_ascii24 __P((void));
|
|
extern void setup_fnt24 __P((void));
|
|
|
|
#endif /* _KERNEL */
|
|
|