BUGFIX - CPI off by a factor of 10 X
[yari.git] / testcases / testvga.c
blobae7ef307be93da0137d62bbaec9d11c6428ff74b
1 #define NCAND 8 // 512
3 #ifdef STANDALONE
4 asm(" .globl _start");
5 asm(" # This is to stay compatible with crt0 C programs (starts at 0x80000003c)");
6 asm("_init:");
7 asm(" nop # 0x80000000");
8 asm(" nop");
9 asm(" nop");
10 asm(" nop");
11 asm(" nop");
12 asm(" nop");
13 asm(" nop");
14 asm(" nop");
15 asm(" nop");
16 asm(" nop");
17 asm(" nop");
18 asm(" nop");
19 asm(" nop");
20 asm(" nop");
21 asm(" nop");
22 asm("");
23 asm("# 0x8000003c");
24 asm("_start: la $28,_gp ");
25 asm(" la $29,0x80002000");/* + 8KiB */
26 asm(" jal main ");
27 asm(" nop ");
28 asm(" break ");
29 #endif
31 static inline putchar(unsigned ch)
33 if (ch == '\n')
34 putchar('\r');
36 #define SER_OUTBUSY() (*(volatile unsigned *)0xFF000000 != 0)
37 #define SER_OUT(data) (*(volatile unsigned *)0xFF000000 = (data))
38 while (SER_OUTBUSY())
40 SER_OUT(ch);
44 static void put_unsigned(unsigned n)
46 // (unsigned)-1 == 4294967295
47 static unsigned powers10[] = {
48 1000000000,
49 100000000,
50 10000000,
51 1000000,
52 100000,
53 10000,
54 1000,
55 100,
56 10,
60 unsigned *p;
61 unsigned leading_zero = 1;
63 if (!n) {
64 putchar('0');
65 return;
68 for (p = powers10; *p; ++p) {
69 unsigned scale = *p;
70 unsigned i, t;
72 for (i = 0; n >= scale; ++i, n -= scale)
74 if (i != 0 || !leading_zero) {
75 putchar('0' + i);
76 leading_zero = 0;
81 void myputs(char *s)
83 while (*s)
84 putchar(*s++);
87 typedef unsigned char pixel_t;
89 int volatile broken;
91 #define SCR(x) ((0-((x)&1)) ^ (((x) << 4) + 1))
93 static void
94 check(unsigned i, unsigned found)
96 unsigned want = SCR(i);
98 if (found != want) {
100 broken++;
103 myputs("FAILED at ");
104 put_unsigned(i);
105 myputs("! Got ");
106 put_unsigned(found);
107 myputs(" expected ");
108 put_unsigned(want);
109 myputs("\n");
114 main()
116 pixel_t *fb = (pixel_t *) 0x90000000;
117 unsigned *ft = (unsigned *) 0x90000000;
119 unsigned i, n, k, j = 0;
120 int x = 10, y = 20;
121 int dx = 1, dy = 1;
123 putchar('O');
124 putchar('k');
125 putchar('?');
126 putchar('\r');
127 putchar('\n');
129 #define SET(x) (ft[(x)] = SCR(x))
131 #ifdef NOT
132 SET(0);
133 SET(1);
134 SET(2);
135 SET(3);
136 SET(4);
137 SET(5);
139 for (i = 0; i < 1000; i += 4) {
140 unsigned ft_i0 = ft[i+0];
141 unsigned ft_i1 = ft[i+1];
142 unsigned ft_i2 = ft[i+2];
143 unsigned ft_i3 = ft[i+3];
145 check(i+0, ft_i0);
146 check(i+1, ft_i1);
147 check(i+2, ft_i2);
148 check(i+3, ft_i3);
150 SET(i + 6);
151 SET(i + 7);
152 SET(i + 8);
153 SET(i + 9);
157 // for (;;) {}
158 ((unsigned *)fb)[0] = 0x01020304;
159 for (i = 0; i < 1024*1024/sizeof(unsigned); ++i) {
160 ((unsigned *)fb)[i+1] = ((unsigned *)fb)[i] + 0x04040404;
162 #endif
164 #define DELAY() for (i = 0; i < 10000; ++i) {putchar(0);putchar(0);putchar(0);putchar(0);putchar(0);putchar(0);putchar(0); fb[1024*1024-1]++;}
166 for (n = 0; ; ++n) {
167 #ifdef NOT
168 myputs("Test #1: First set fb[i] = i ... \n");
169 for (i = 0; i < 1024 * 1024; ++i) {
170 fb[i] = i;
173 for (i = 0; i < 1024 * 1024; ++i) {
174 pixel_t got = fb[i];
175 if (got != (i & 255)) {
176 myputs("FAILED at ");
177 put_unsigned(i);
178 myputs("! Got ");
179 put_unsigned(got);
180 myputs(" expected ");
181 put_unsigned(i & 255);
182 myputs("\n");
183 break;
186 test2: myputs("Test #2: First set ft[i] = (i << 4) + 1 ... \n");
187 #endif
188 for (i = 0; i < /*1024 * */ 1024 / 4; ++i) {
189 ft[i] = (i << 4) + 1;
192 for (i = 0; i < 1024 * 1024 / 4; ++i) {
193 unsigned got = ft[i];
194 if (got != (i << 4) + 1) {
195 myputs("FAILED at ");
196 put_unsigned(i);
197 myputs("! Got ");
198 put_unsigned(got);
199 myputs(" expected ");
200 put_unsigned((i << 4) + 1);
201 myputs("\n");
202 break;
206 test3:
207 DELAY();
208 x = y = 0;
209 for (i = 0; i < 640*480; ++i) {
210 fb[y * 640 + x] = j;
211 if (x + dx < 0) dx = 1;
212 if (x + dx >= 640) dx = -1;
213 if (y + dy < 0) dy = 1;
214 if (y + dy >= 480) dy = -1;
215 y += dy;
216 x += dx;
219 ++j;
221 DELAY();
223 x = y = 0;
224 for (i = 0; i < 640*480; ++i) {
225 fb[y * 640 + x] <<= 1;
226 if (x + dx < 0) dx = 1;
227 if (x + dx >= 640) dx = -1;
228 if (y + dy < 0) dy = 1;
229 if (y + dy >= 480) dy = -1;
230 y += dy;
231 x += dx;
234 DELAY();
236 x = y = 0;
237 dy = 1; dx = 0;
238 for (i = 0; ; ++i) {
239 fb[y * 640 + x] = i;
240 if (x + dx < 0) break;
241 if (x + dx >= 640) break;
242 if (y + dy < 0) dy = 1, ++x;
243 if (y + dy >= 480) dy = -1, ++x;
244 y += dy;
245 x += dx;
248 DELAY();
250 x = 639; y = 479;
251 dy = -1; dx = 0;
252 for (;; --i) {
253 fb[y * 640 + x] = ((y >> 3) << 3) ^ (x >> 3);
254 putchar(0);
255 if (x + dx < 0) break;
256 if (x + dx >= 640) break;
257 if (y + dy < 0) dy = 1, --x;
258 if (y + dy >= 480) dy = -1, --x;
259 y += dy;
260 x += dx;