50 #define DEV_PS2_GIF_LENGTH 0x10000 52 #define PS2_FB_ADDR 0x60000000ULL 70 int x1,
int y1,
int r1,
int g1,
int b1,
71 int x2,
int y2,
int r2,
int g2,
int b2,
72 int x3,
int y3,
int r3,
int g3,
int b3)
75 int y, tmp, scale = 32768;
76 int xofs, xlen, savedxlen, xdir, x;
83 int xpy12, xpy13, xpy23;
84 int rpy12, rpy13, rpy23;
85 int gpy12, gpy13, gpy23;
86 int bpy12, bpy13, bpy23;
91 tmp = x2; x2 = x3; x3 = tmp;
92 tmp = y2; y2 = y3; y3 = tmp;
93 tmp = r2; r2 = r3; r3 = tmp;
94 tmp = g2; g2 = g3; g3 = tmp;
95 tmp = b2; b2 = b3; b3 = tmp;
99 tmp = x1; x1 = x2; x2 = tmp;
100 tmp = y1; y1 = y2; y2 = tmp;
101 tmp = r1; r1 = r2; r2 = tmp;
102 tmp = g1; g1 = g2; g2 = tmp;
103 tmp = b1; b1 = b2; b2 = tmp;
107 tmp = x1; x1 = x3; x3 = tmp;
108 tmp = y1; y1 = y3; y3 = tmp;
109 tmp = r1; r1 = r3; r3 = tmp;
110 tmp = g1; g1 = g3; g3 = tmp;
111 tmp = b1; b1 = b3; b3 = tmp;
115 xpy12 = (y2-y1)? scale*(x2-x1)/(y2-y1) : 0;
116 xpy13 = (y3-y1)? scale*(x3-x1)/(y3-y1) : 0;
117 xpy23 = (y3-y2)? scale*(x3-x2)/(y3-y2) : 0;
120 rpy12 = (y2-y1)? scale*(r2-r1)/(y2-y1) : 0;
121 rpy13 = (y3-y1)? scale*(r3-r1)/(y3-y1) : 0;
122 rpy23 = (y3-y2)? scale*(r3-r2)/(y3-y2) : 0;
124 gpy12 = (y2-y1)? scale*(g2-g1)/(y2-y1) : 0;
125 gpy13 = (y3-y1)? scale*(g3-g1)/(y3-y1) : 0;
126 gpy23 = (y3-y2)? scale*(g3-g2)/(y3-y2) : 0;
128 bpy12 = (y2-y1)? scale*(b2-b1)/(y2-y1) : 0;
129 bpy13 = (y3-y1)? scale*(b3-b1)/(y3-y1) : 0;
130 bpy23 = (y3-y2)? scale*(b3-b2)/(y3-y2) : 0;
132 xstart = xstop = x1 * scale;
133 rstart = rstop = r1 * scale;
134 gstart = gstop = g1 * scale;
135 bstart = bstop = b1 * scale;
137 for (y=y1; y<=y3; y++) {
139 xofs = xstart/scale, xlen = (xstop-xstart)/scale + 1;
141 xofs = xstop/scale, xlen = (xstart-xstop)/scale + 1;
144 xdir = (xstart < xstop)? 1 : -1;
145 r = rstart; g = gstart; b = bstart;
147 rpx = (xstop-xstart)? (rstop-rstart) / ((xstop-xstart)
149 gpx = (xstop-xstart)? (gstop-gstart) / ((xstop-xstart)
151 bpx = (xstop-xstart)? (bstop-bstart) / ((xstop-xstart)
156 if (x>=0 && x<d->
xsize) {
160 0 : (c > 255? 255 : c);
163 0 : (c > 255? 255 : c);
166 0 : (c > 255? 255 : c);
216 debug(
"[ gif read from addr 0x%x, len=%i ]\n",
217 (
int)relative_addr, (
int)len);
219 if (
data[0] == 0x08 &&
data[1] == 0x80) {
221 debug(
"[ gif: initialize video mode (?) ]\n");
222 }
else if (
data[0] == 0x04 &&
data[1] == 0x00 && len > 300) {
226 xbase =
data[9*4 + 0] + (
data[9*4 + 1] << 8);
227 ybase =
data[9*4 + 2] + (
data[9*4 + 3] << 8);
229 xsize =
data[12*4 + 0] + (
data[12*4 + 1] << 8);
230 ysize =
data[13*4 + 0] + (
data[13*4 + 1] << 8);
265 for (y=0; y<
ysize; y++) {
266 int fb_addr = (xbase + (ybase+y) * d->
xsize)
269 for (x=0; x<
xsize; x++) {
283 }
else if (
data[0] == 0x04 &&
data[1] == 0x80 && len == 0x50) {
285 int y_source, y_dest, x_source, x_dest, x_size, y_size;
286 x_source =
data[8*4 + 0] + ((
data[8*4 + 1]) << 8);
287 y_source =
data[8*4 + 2] + ((
data[8*4 + 3]) << 8);
288 x_dest =
data[9*4 + 0] + ((
data[9*4 + 1]) << 8);
289 y_dest =
data[9*4 + 2] + ((
data[9*4 + 3]) << 8);
290 x_size =
data[12*4 + 0] + ((
data[12*4 + 1]) << 8);
291 y_size =
data[13*4 + 0] + ((
data[13*4 + 1]) << 8);
298 x_dest, y_dest, x_dest + x_size - 1, y_dest +
299 y_size - 1, x_source, y_source);
300 }
else if (
data[8] == 0x10 &&
data[9] == 0x55 && len == 48) {
303 int xbase, ybase, xend, yend;
305 xbase = (
data[8*4 + 0] + (
data[8*4 + 1] << 8)) / 16;
306 ybase = (
data[8*4 + 2] + (
data[8*4 + 3] << 8)) / 16;
307 xend = (
data[8*5 + 0] + (
data[8*5 + 1] << 8)) / 16;
308 yend = (
data[8*5 + 2] + (
data[8*5 + 3] << 8)) / 16;
314 xbase, ybase, xend - 1, yend - 1, 0,0);
315 }
else if (
data[0] == 0x07 &&
data[1] == 0x80 && len == 128) {
317 int xbase, ybase, xend, yend, x, y;
319 xbase = (
data[20*4 + 0] + (
data[20*4 + 1] << 8)) / 16;
320 ybase = (
data[20*4 + 2] + (
data[20*4 + 3] << 8)) / 16;
321 xend = (
data[28*4 + 0] + (
data[28*4 + 1] << 8)) / 16;
322 yend = (
data[28*4 + 2] + (
data[28*4 + 3] << 8)) / 16;
329 for (y=ybase; y<=yend; y++)
330 for (x=xbase; x<=xend; x++) {
331 int fb_addr = (x + y * d->
xsize) *
333 unsigned char pixels[3];
336 fb_addr, pixels,
sizeof(pixels),
339 pixels[0] = 0xff - pixels[0];
340 pixels[1] = 0xff - pixels[1];
341 pixels[2] = 0xff - pixels[2];
344 fb_addr, pixels,
sizeof(pixels),
347 }
else if (
data[0] == 0x01 &&
data[1] == 0x00 && len == 80) {
349 int xbase, ybase, xend, yend, x, y;
351 xbase = (
data[7*8 + 0] + (
data[7*8 + 1] << 8)) / 16;
352 ybase = (
data[7*8 + 2] + (
data[7*8 + 3] << 8)) / 16;
353 xend = (
data[8*8 + 0] + (
data[8*8 + 1] << 8)) / 16;
354 yend = (
data[8*8 + 2] + (
data[8*8 + 3] << 8)) / 16;
356 debug(
"[ gif: LINUX cursor at (%i,%i)-(%i,%i) ]\n",
357 xbase, ybase, xend, yend);
361 for (y=ybase; y<=yend; y++)
362 for (x=xbase; x<=xend; x++) {
363 int fb_addr = (x + y * d->
xsize) *
365 unsigned char pixels[3];
368 fb_addr, pixels,
sizeof(pixels),
371 pixels[0] = 0xff - pixels[0];
372 pixels[1] = 0xff - pixels[1];
373 pixels[2] = 0xff - pixels[2];
376 fb_addr, pixels,
sizeof(pixels),
380 fatal(
"[ gif write to addr 0x%x (len=%i):",
381 (
int)relative_addr, len);
382 for (i=0; i<len; i++)
404 memset(d, 0,
sizeof(
struct gif_data));
415 fprintf(stderr,
"could not initialize fb, out of memory\n");
420 test_triangle(d, 300,50, 255,0,0, 50,150, 0,255,0, 600,400, 0,0,255);
421 test_triangle(d, 310,210, 128,32,0, 175,410, 0,32,0,
422 500,470, 125,255,125);
423 test_triangle(d, 100,450, 255,255,0, 250,370, 0,255,255,
void fatal(const char *fmt,...)
struct vfb_data * vfb_data
struct vfb_data * dev_fb_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, int vfb_type, int visible_xsize, int visible_ysize, int xsize, int ysize, int bit_depth, const char *name)
void test_triangle(struct gif_data *d, int x1, int y1, int r1, int g1, int b1, int x2, int y2, int r2, int g2, int b2, int x3, int y3, int r3, int g3, int b3)
#define CHECK_ALLOCATION(ptr)
#define DEV_PS2_GIF_LENGTH
void framebuffer_blockcopyfill(struct vfb_data *d, int fillflag, int fill_r, int fill_g, int fill_b, int x1, int y1, int x2, int y2, int from_x, int from_y)
int dev_fb_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)