testpico: show that vres clear is separate
[megadrive.git] / testpico / sh2_main.c
1 #include "common.h"
2
3 void spin(int loops);
4 u16  read_frt(void);
5
6 static 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;
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;
60     default:
61         r[2/2]++; // error
62         mem_barrier();
63         break;
64     }
65 }
66
67 void main_c(u32 is_slave)
68 {
69     u16 *r = (u16 *)0x20004000;
70
71     for (;;)
72     {
73         u16 cmd, cmdr;
74
75         mem_barrier();
76         cmd = read16(&r[0x20/2]);
77         mem_barrier();
78         cmdr = read16(&r[0x20/2]);
79         if (cmd == 0
80             || cmd != cmdr  // documented as "normal" case
81             || ((cmd & 0x8000) ^ (is_slave << 15))
82             || cmd == 0x4d5f) { // 'M_' from BIOS
83             spin(64);
84             continue;
85         }
86         cmd &= 0x7fff;
87         do_cmd(cmd, &r[0x20/2], is_slave);
88         write16(&r[0x20/2], 0);
89     }
90 }
91
92 // vim:ts=4:sw=4:expandtab