testpico: 32x reset + other tests
[megadrive.git] / testpico / sh2_main.c
CommitLineData
9d39a80e 1#include "common.h"
2
3void spin(int loops);
71b41fdd 4u16 read_frt(void);
9d39a80e 5
06d7984c 6static void do_cmd(u16 cmd, u16 r[6], u32 is_slave)
7{
8 u32 *rl = (u32 *)r;
9 u32 a, d;
10 u16 v;
11
12 switch (cmd)
13 {
14 case CMD_ECHO:
15 v = read16(&r[4/2]) ^ (is_slave << 15);
16 write16(&r[6/2], v);
17 break;
18 case CMD_READ_FRT:
19 v = read_frt();
20 write16(&r[4/2], v);
21 break;
22 case CMD_READ8:
23 a = read32(&rl[4/4]);
24 d = read8(a);
25 write32(&rl[4/4], d);
26 break;
27 case CMD_READ16:
28 a = read32(&rl[4/4]);
29 d = read16(a);
30 write32(&rl[4/4], d);
31 break;
32 case CMD_READ32:
33 a = read32(&rl[4/4]);
34 d = read32(a);
35 write32(&rl[4/4], d);
36 break;
37 case CMD_WRITE8:
38 a = read32(&rl[4/4]);
39 d = read32(&rl[8/4]);
40 write8(a, d);
41 break;
42 case CMD_WRITE16:
43 a = read32(&rl[4/4]);
44 d = read32(&rl[8/4]);
45 write16(a, d);
46 break;
47 case CMD_WRITE32:
48 a = read32(&rl[4/4]);
49 d = read32(&rl[8/4]);
50 write32(a, d);
51 break;
5073ab5a 52 case CMD_GETGBR:
53 asm("stc gbr, %0" : "=r"(d));
54 write32(&rl[4/4], d);
55 break;
56 case CMD_GETVBR:
57 asm("stc vbr, %0" : "=r"(d));
58 write32(&rl[4/4], d);
59 break;
06d7984c 60 default:
61 r[2/2]++; // error
62 mem_barrier();
63 break;
64 }
65}
66
9d39a80e 67void main_c(u32 is_slave)
68{
06d7984c 69 u16 *r = (u16 *)0x20004000;
9d39a80e 70
71 for (;;)
72 {
71b41fdd 73 u16 cmd, cmdr;
9d39a80e 74
75 mem_barrier();
76 cmd = read16(&r[0x20/2]);
71b41fdd 77 mem_barrier();
78 cmdr = read16(&r[0x20/2]);
06d7984c 79 if (cmd == 0
80 || cmd != cmdr // documented as "normal" case
81 || ((cmd & 0x8000) ^ (is_slave << 15))
82 || cmd == 0x4d5f) { // 'M_' from BIOS
9d39a80e 83 spin(64);
84 continue;
85 }
86 cmd &= 0x7fff;
06d7984c 87 do_cmd(cmd, &r[0x20/2], is_slave);
9d39a80e 88 write16(&r[0x20/2], 0);
89 }
90}
91
92// vim:ts=4:sw=4:expandtab