7 // 00-0f: master irq counters (16bit)
13 // 03: handler input: no 32x irqsrc clear flag for both (if val == 0x5a)
14 // 04-07: arg0/response
16 // 0c: last_irq_vec_master
17 // 0d: last_irq_vec_slave
18 // 0e: exception_index_master
19 // 0f: exception_index_slave
20 static void do_cmd(u16 cmd, u16 r[6], u32 is_slave)
30 v = read16(&r[4/2]) ^ (is_slave << 15);
68 asm volatile("stc gbr, %0" : "=r"(d));
72 asm volatile("stc vbr, %0" : "=r"(d));
76 asm volatile("stc sr, %0" : "=r"(d));
81 asm volatile("ldc %0, sr" :: "r"(d));
90 void main_c(u32 is_slave)
92 u16 *r = (u16 *)0x20004000;
99 cmd = read16(&r[0x20/2]);
101 cmdr = read16(&r[0x20/2]);
103 || cmd != cmdr // documented as "normal" case
104 || ((cmd & 0x8000) ^ (is_slave << 15))
105 || cmd == 0x4d5f) { // 'M_' from BIOS
110 do_cmd(cmd, &r[0x20/2], is_slave);
111 write16(&r[0x20/2], 0);
115 // vim:ts=4:sw=4:expandtab