9 // 04-07: arg0/response
11 // 0c: last_irq_vec_master
12 // 0d: last_irq_vec_slave
13 // 0e: exception_index_master
14 // 0f: exception_index_slave
15 static void do_cmd(u16 cmd, u16 r[6], u32 is_slave)
24 v = read16(&r[4/2]) ^ (is_slave << 15);
62 asm volatile("stc gbr, %0" : "=r"(d));
66 asm volatile("stc vbr, %0" : "=r"(d));
70 asm volatile("stc sr, %0" : "=r"(d));
75 asm volatile("ldc %0, sr" :: "r"(d));
84 void main_c(u32 is_slave)
86 u16 *r = (u16 *)0x20004000;
93 cmd = read16(&r[0x20/2]);
95 cmdr = read16(&r[0x20/2]);
97 || cmd != cmdr // documented as "normal" case
98 || ((cmd & 0x8000) ^ (is_slave << 15))
99 || cmd == 0x4d5f) { // 'M_' from BIOS
104 do_cmd(cmd, &r[0x20/2], is_slave);
105 write16(&r[0x20/2], 0);
109 // vim:ts=4:sw=4:expandtab