1 |
/* |
2 |
* $Id: rectangles.c,v 1.5 2006/07/09 07:53:33 debug Exp $ |
3 |
* |
4 |
* GXemul demo: Random rectangles |
5 |
* |
6 |
* This file is in the Public Domain. |
7 |
*/ |
8 |
|
9 |
#include "dev_fb.h" |
10 |
|
11 |
|
12 |
#ifdef MIPS |
13 |
/* Note: The ugly cast to a signed int (32-bit) causes the address to be |
14 |
sign-extended correctly on MIPS when compiled in 64-bit mode */ |
15 |
#define PHYSADDR_OFFSET ((signed int)0xa0000000) |
16 |
#else |
17 |
#define PHYSADDR_OFFSET 0 |
18 |
#endif |
19 |
|
20 |
|
21 |
/* Framebuffer linear memory and controller base addresss: */ |
22 |
#define FB_BASE (PHYSADDR_OFFSET + DEV_FB_ADDRESS) |
23 |
#define FBCTRL_BASE (PHYSADDR_OFFSET + DEV_FBCTRL_ADDRESS) |
24 |
|
25 |
|
26 |
#define XRES 800 |
27 |
#define YRES 600 |
28 |
|
29 |
|
30 |
void my_memset(unsigned char *a, int x, int len) |
31 |
{ |
32 |
while (len-- > 0) |
33 |
*a++ = x; |
34 |
} |
35 |
|
36 |
|
37 |
void draw_rectangle(int x1, int y1, int x2, int y2, int c) |
38 |
{ |
39 |
int y, len; |
40 |
|
41 |
for (y=y1; y<=y2; y++) { |
42 |
len = 3 * (x2-x1+1); |
43 |
if (len > 0) { |
44 |
my_memset((unsigned char *)FB_BASE + |
45 |
3 * (XRES * y + x1), c, len); |
46 |
} |
47 |
} |
48 |
} |
49 |
|
50 |
|
51 |
unsigned int my_random() |
52 |
{ |
53 |
static int a = 0x124879b; |
54 |
static int b = 0xb7856fa2; |
55 |
int c = a ^ (b * 51); |
56 |
a = 17 * c - (b * 171); |
57 |
return c; |
58 |
} |
59 |
|
60 |
|
61 |
void fbctrl_write_port(int p) |
62 |
{ |
63 |
*(volatile int *)(FBCTRL_BASE + DEV_FBCTRL_PORT) = p; |
64 |
} |
65 |
|
66 |
|
67 |
void fbctrl_write_data(int d) |
68 |
{ |
69 |
*(volatile int *)(FBCTRL_BASE + DEV_FBCTRL_DATA) = d; |
70 |
} |
71 |
|
72 |
|
73 |
void fbctrl_set_x1(int v) |
74 |
{ |
75 |
fbctrl_write_port(DEV_FBCTRL_PORT_X1); |
76 |
fbctrl_write_data(v); |
77 |
} |
78 |
|
79 |
|
80 |
void fbctrl_set_y1(int v) |
81 |
{ |
82 |
fbctrl_write_port(DEV_FBCTRL_PORT_Y1); |
83 |
fbctrl_write_data(v); |
84 |
} |
85 |
|
86 |
|
87 |
void fbctrl_command(int c) |
88 |
{ |
89 |
fbctrl_write_port(DEV_FBCTRL_PORT_COMMAND); |
90 |
fbctrl_write_data(c); |
91 |
} |
92 |
|
93 |
|
94 |
void change_resolution(int xres, int yres) |
95 |
{ |
96 |
fbctrl_set_x1(xres); |
97 |
fbctrl_set_y1(yres); |
98 |
fbctrl_command(DEV_FBCTRL_COMMAND_SET_RESOLUTION); |
99 |
} |
100 |
|
101 |
|
102 |
void f(void) |
103 |
{ |
104 |
/* Change to the resolution we want: */ |
105 |
change_resolution(XRES, YRES); |
106 |
|
107 |
/* Draw random rectangles forever: */ |
108 |
for (;;) { |
109 |
draw_rectangle(my_random() % XRES, my_random() % YRES, |
110 |
my_random() % XRES, my_random() % YRES, my_random()); |
111 |
} |
112 |
} |
113 |
|