5 asm(" # This is to stay compatible with crt0 C programs (starts at 0x80000003c)");
7 asm(" nop # 0x80000000");
24 asm("_start: la $28,_gp ");
25 asm(" la $29,0x80002000");/* + 8KiB */
31 static inline putchar(unsigned ch
)
36 #define SER_OUTBUSY() (*(volatile unsigned *)0xFF000000 != 0)
37 #define SER_OUT(data) (*(volatile unsigned *)0xFF000000 = (data))
44 static void put_unsigned(unsigned n
)
46 // (unsigned)-1 == 4294967295
47 static unsigned powers10
[] = {
61 unsigned leading_zero
= 1;
68 for (p
= powers10
; *p
; ++p
) {
72 for (i
= 0; n
>= scale
; ++i
, n
-= scale
)
74 if (i
!= 0 || !leading_zero
) {
87 typedef unsigned char pixel_t
;
91 #define SCR(x) ((0-((x)&1)) ^ (((x) << 4) + 1))
94 check(unsigned i
, unsigned found
)
96 unsigned want
= SCR(i
);
103 myputs("FAILED at ");
107 myputs(" expected ");
116 pixel_t
*fb
= (pixel_t
*) 0x90000000;
117 unsigned *ft
= (unsigned *) 0x90000000;
119 unsigned i
, n
, k
, j
= 0;
129 #define SET(x) (ft[(x)] = SCR(x))
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];
158 ((unsigned *)fb
)[0] = 0x01020304;
159 for (i
= 0; i
< 1024*1024/sizeof(unsigned); ++i
) {
160 ((unsigned *)fb
)[i
+1] = ((unsigned *)fb
)[i
] + 0x04040404;
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]++;}
168 myputs("Test #1: First set fb[i] = i ... \n");
169 for (i
= 0; i
< 1024 * 1024; ++i
) {
173 for (i
= 0; i
< 1024 * 1024; ++i
) {
175 if (got
!= (i
& 255)) {
176 myputs("FAILED at ");
180 myputs(" expected ");
181 put_unsigned(i
& 255);
186 test2
: myputs("Test #2: First set ft[i] = (i << 4) + 1 ... \n");
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 ");
199 myputs(" expected ");
200 put_unsigned((i
<< 4) + 1);
209 for (i
= 0; i
< 640*480; ++i
) {
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;
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;
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
;
253 fb
[y
* 640 + x
] = ((y
>> 3) << 3) ^ (x
>> 3);
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
;