Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 484 → Rev 485

/shark/trunk/drivers/fb/fun16.c
0,0 → 1,400
#include <ll/i386/hw-data.h>
#include <ll/i386/mem.h>
#include <linux/fb.h>
 
#include <drivers/grx_fb.h>
 
static unsigned char font_table[127][8] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e},
{0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e},
{0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00},
{0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00},
{0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c},
{0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c},
{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00},
{0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff},
{0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00},
{0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff},
{0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78},
{0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18},
{0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0},
{0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0},
{0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99},
{0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00},
{0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00},
{0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18},
{0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00},
{0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},
{0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},
{0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00},
{0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff},
{0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00},
{0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00},
{0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00},
{0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00},
{0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00},
{0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00},
{0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00},
{0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00},
{0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00},
{0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00},
{0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00},
{0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00},
{0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00},
{0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60},
{0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00},
{0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00},
{0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00},
{0x78, 0xcc, 0x0c, 0x38, 0x60, 0xcc, 0xfc, 0x00},
{0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00},
{0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00},
{0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00},
{0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00},
{0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00},
{0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60},
{0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00},
{0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00},
{0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00},
{0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00},
{0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00},
{0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00},
{0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00},
{0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00},
{0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00},
{0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00},
{0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00},
{0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00},
{0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00},
{0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00},
{0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00},
{0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00},
{0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00},
{0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00},
{0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00},
{0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00},
{0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00},
{0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
{0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00},
{0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00},
{0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00},
{0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00},
{0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00},
{0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00},
{0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00},
{0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
{0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00},
{0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00},
{0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
{0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00},
{0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
{0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00},
{0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78},
{0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00},
{0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00},
{0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
{0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0},
{0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e},
{0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00},
{0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00},
{0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
{0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00},
{0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
{0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00},
{0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00},
{0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},
{0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00},
{0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
};
 
#define memsetw(addr, val, n) {LIN_ADDR i; for(i = addr; i < addr + n; i += 2) *(WORD *)i = val;}
 
struct fb_info *grx_info = NULL;
 
void grx_fb_init(struct fb_info *info)
{
 
if (!info) return;
 
grx_info = info;
 
}
 
void grx_putimage(WORD x1, WORD y1, WORD x2, WORD y2, BYTE *buf)
{
 
struct fb_image image;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
 
image.depth = grx_info->var.bits_per_pixel;
image.data = buf;
image.width = x2-x1+1;
image.height = y2-y1+1;
image.dy = y1;
image.dx = x1;
 
grx_info->fbops->fb_imageblit(grx_info, &image);
 
}
 
void grx_getimage(WORD x1, WORD y1, WORD x2, WORD y2, BYTE *buf)
{
WORD bpr;
LIN_ADDR addr, p;
WORD dx, y;
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
 
bpr = grx_info->var.xres * 2;
p = buf;
addr = (LIN_ADDR)(grx_info->screen_base + x1 * 2 + bpr * y1);
dx = (x2 - x1 + 1) * 2;
 
for (y = y1; y <= y2; y++) {
memcpy(p, addr, dx);
p += dx;
addr += bpr;
}
 
}
 
void grx_box(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color)
{
struct fb_fillrect rect;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
rect.dx = x1;
rect.dy = y1;
rect.width = x2-x1+1;
rect.height = x2-x1+1;
rect.color = color;
rect.rop = ROP_COPY;
grx_info->fbops->fb_fillrect(grx_info, &rect);
}
 
void grx_rect(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color)
{
WORD bpr;
DWORD addr;
WORD dx, y;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
bpr = grx_info->var.xres * 2;
addr = (DWORD)(grx_info->screen_base + x1 * 2 + bpr * y1);
dx = (x2 - x1) * 2;
 
memsetw((LIN_ADDR)addr, color, dx+2);
addr += bpr;
 
for (y = y1 + 1; y <= y2 - 1; y++) {
*(WORD *)addr = color;
*(WORD *)(addr + dx) = color;
addr += bpr;
}
memsetw((LIN_ADDR)addr, color, dx+2);
}
 
void grx_text(char *text, WORD x, WORD y, DWORD fg, DWORD bg)
{
DWORD fp, addr;
WORD bpr;
int r, c, bits;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
 
bpr = grx_info->var.xres * 2;
addr = (DWORD)(grx_info->screen_base);
while (*text) {
fp = (DWORD)&(font_table[*(BYTE *)text][0]);
for (r=0; r<8; r++) {
bits = *(BYTE *)(fp++);
for (c=0; c<8; c++)
if (bits & (0x80>>c))
*(WORD *)(addr + (y + r) * bpr + ((x + c) * 2)) = fg;
else
*(WORD *)(addr + (y + r) * bpr + ((x + c) * 2)) = bg;
}
text++;
x += 8;
}
}
 
void linLine16(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color)
{
register int t, distance;
register DWORD addr;
register WORD bpr;
int xerr=0, yerr=0, deltax, deltay;
int incx, incy;
 
bpr = grx_info->var.xres * 2;
addr = (DWORD)(grx_info->screen_base);
deltax = x2 - x1; /* compute both distances */
deltay = y2 - y1;
 
if (deltax > 0) /* compute increments */
incx = 1;
else if (deltax == 0)
incx = 0;
else
incx = -1;
 
if (deltay > 0)
incy = 1;
else if (deltay == 0)
incy = 0;
else
incy = -1;
 
deltax = abs(deltax); /* determine greater distance */
deltay = abs(deltay);
if (deltax > deltay)
distance = deltax;
else
distance = deltay;
 
for (t=0; t<=distance+1; t++) { /* draw the line */
*(WORD *)(addr + y1 * bpr + (x1 * 2)) = color;
xerr += deltax;
yerr += deltay;
if (xerr > distance) {
xerr -= distance;
x1 += incx;
}
if (yerr > distance) {
yerr -= distance;
y1 += incy;
}
}
}
 
void grx_plot(WORD x, WORD y, DWORD color)
{
WORD bpr;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
 
bpr = grx_info->var.xres * 2;
*(WORD *)(grx_info->screen_base + y * bpr + (x * 2)) = color;
}
 
DWORD grx_getpixel(WORD x, WORD y)
{
WORD bpr;
DWORD rv;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return -1;
 
bpr = grx_info->var.xres * 2;
rv = *(WORD *)(grx_info->screen_base + y * bpr + (x * 2));
return rv;
 
}
 
static void circlepixels(WORD x, WORD y, WORD sx, WORD sy, DWORD c)
{
grx_plot(sx + x, sy + y, c);
grx_plot(sx - x, sy + y, c);
grx_plot(sx + x, sy - y, c);
grx_plot(sx - x, sy - y, c);
grx_plot(sx + y, sy + x, c);
grx_plot(sx - y, sy + x, c);
grx_plot(sx + y, sy - x, c);
grx_plot(sx - y, sy - x, c);
}
 
void grx_circle(WORD sx, WORD sy, WORD r, DWORD c)
{
int x, y, d;
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
 
if (r < 1) {
grx_plot(sx, sy, c);
return;
}
 
x = 0;
y = r;
d = 1 - r;
circlepixels(x, y, sx, sy, c);
while (x < y) {
if (d < 0)
d += x * 2 + 3;
else {
d += x * 2 - y * 2 + 5;
y--;
}
x++;
circlepixels(x, y, sx, sy, c);
}
}
 
static __inline__ void discpixels(WORD x, WORD y, WORD sx, WORD sy, DWORD c)
{
grx_line(sx + x, sy + y, sx + x, sy - y, c);
grx_line(sx - x, sy + y, sx - x, sy - y, c);
grx_line(sx + y, sy + x, sx + y, sy - x , c);
grx_line(sx - y, sy + x, sx - y, sy - x , c);
}
 
void grx_disc(WORD sx, WORD sy, WORD r, DWORD c)
{
int x, y, d;
 
if (!grx_info || grx_info->var.bits_per_pixel != 16) return;
if (r < 1) {
grx_plot(sx, sy, c);
return;
}
x = 0;
y = r;
d = 1 - r;
discpixels(x, y, sx, sy, c);
while (x < y) {
if (d < 0)
d += x * 2 + 3;
else {
d += x * 2 - y * 2 + 5;
y--;
}
x++;
discpixels(x, y, sx, sy, c);
}
}
 
/shark/trunk/drivers/fb/include/drivers/grx_fb.h
0,0 → 1,18
#ifndef __GRX_FB__
#define __GRX_FB__
 
/* GRX emulation under FrameBuffer */
 
void grx_fb_init(struct fb_info *info);
void grx_plot(WORD x, WORD y, DWORD color);
DWORD grx_getpixel(WORD x, WORD y);
void grx_getimage(WORD x1, WORD y1, WORD x2, WORD y2, BYTE *buf);
void grx_putimage(WORD x1, WORD y1, WORD x2, WORD y2, BYTE *buf);
void grx_box(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color);
void grx_rect(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color);
void grx_line(WORD x1, WORD y1, WORD x2, WORD y2, DWORD color);
void grx_text(char *text, WORD x, WORD y, DWORD fg, DWORD bg);
void grx_circle(WORD x, WORD y, WORD r, DWORD col);
void grx_disc(WORD x, WORD y, WORD r, DWORD col);
 
#endif