]> Joshua Wise's Git repositories - firearm.git/blob - tests/testbench.c
tests/Makefile: Build without THUMB support. This fixes the 'regression'...
[firearm.git] / tests / testbench.c
1 extern void putc(unsigned char c);
2
3 int serial_getc (void)
4 {
5         int c;
6         do
7                 asm volatile("mrc 5, 0, %0, c1, c1, 1" : "=r"(c));
8         while (!(c & 0x100));
9         return c & 0xFF;
10 }
11
12 void puts(unsigned char *s)
13 {
14         while (*s)
15                 putc(*(s++));
16 }
17
18 void puthex(unsigned int x)
19 {
20         unsigned char *hex = "0123456789ABCDEF";
21         int i;
22         
23         for (i = 7; i >= 0; i--)
24                 putc(hex[(x >> (i * 4)) & 0xF]);
25 }
26
27 #define putchar putc
28 #include "ack.c"
29 #include "j4cbo.c"
30 #include "corecurse.c"
31 #include "miniblarg.c"
32
33 int fact(int n)
34 {
35         if (n == 0)
36                 return 1;
37         else
38                 return n * fact(n-1);
39 }
40
41 void facttest()
42 {
43         if (fact(10) != 3628800)
44                 puts("FAIL\n");
45         else
46                 puts("PASS\n");
47 }
48
49 struct tests {
50         char *name;
51         void (*test)();
52 };
53
54 extern int ldm_bonehead();
55
56 #ifndef X86
57 int shnasto()
58 {
59 __asm__ volatile(
60 ".globl ldm_bonehead\n"
61 "ldm_bonehead:;"
62 "mov r3, lr;"
63 "bl 1f;"
64 "nop;"
65 "nop;"
66 "nop;"
67 "nop;"
68 "nop;"
69 "nop;"
70 "nop;"
71 "nop;"
72 "nop;"
73 "mov pc, r3\n;"
74 "1:\n"
75 "mov r2, #0x00002F00;"
76 "orr r2, r2, #0x000000E0;"
77 "mov r1, #0x0000004C;"
78 "mov ip, sp;"
79 "stmdb sp!, {fp, ip, lr, pc};"
80 "mov r0, #0x00880000;"
81 "ldmia sp, {fp, sp, pc};"
82 "mul r0, r1, r2;"
83 "nop;"
84 "nop;\n"
85 );
86 }
87 #endif
88
89 void ldm_tester()
90 {
91 #ifdef X86
92         int x = 0x00880000;
93 #else
94         int x = ldm_bonehead();
95 #endif
96         if (x != 0x00880000)
97         {
98                 puts("FAIL: result was ");
99                 puthex(x);
100                 puts("\n");
101         } else
102                 puts("PASS\n");
103 }
104
105 struct tests tlist[] = {
106         {"ldm pc/mul", ldm_tester},
107         {"fact", facttest},
108         {"j4cbo", j4cbo},
109         {"ack", acktest},
110         {"miniblarg", testmain},
111         {"corecurse", corecurse},
112         {0, 0}};
113
114 int main()
115 {
116         struct tests *t;
117         
118         puts("Testbench running\n");
119         
120         for (t = tlist; t->name; t++)
121         {
122                 puts("Running ");
123                 puts(t->name);
124                 puts(": ");
125                 t->test();
126         }
127         puts("Done! Echoing characters.\n");
128         
129         while (1)
130                 putc(serial_getc());
131         return 0;
132 }
This page took 0.032167 seconds and 4 git commands to generate.