--- trunk/src/devices/dev_openpic.c 2007/10/14 18:34:52 72 +++ trunk/src/devices/dev_openpic.c 2007/10/14 18:35:57 73 @@ -131,9 +131,11 @@ if (writeflag == MEM_READ) { // version 1.x, so 2 -> 1.2 odata = 2; - fatal("[ openpic: read version " - "offset 0x%x = 1.%d]\n", (int) - relative_addr, (int)odata); + debug("[ openpic: read version " + "offset 0x%x = 1.%d]\n", (int) + relative_addr, (int)odata); + odata |= 0x00190000; // FIXME ? + } fatal("[ openpic: unimplemented write to " "offset 0x%x: data=0x%x (OpenPIC version) ]\n", (int) @@ -143,8 +145,11 @@ // global timer frequency case 0xf0: if (writeflag == MEM_READ) { - odata = 170 * 1000000; // MHz - fatal("[ openpic: read global timer frequency " + // this would be correct, but real DSM-G600 isn't + // returning it! + //odata = 170 * 1000000; // MHz + odata = 0; + debug("[ openpic: read global timer frequency " "offset 0x%x = %x]\n", (int) relative_addr, (int)odata); } @@ -257,14 +262,35 @@ (int)relative_addr, (int)idata ); } else { - fatal("[ openpic: unimplemented read from " - "offset 0x%x odata = %x ]\n", - (int)relative_addr, (int)odata + // decoded from real device + odata |= OPENPIC_MASK; + + int vec = + ( + ( + ( + ( + ( relative_addr - 0x120 ) & 0xfff + ) / 0x40 + ) + ) & 0xff + ) + 0x40; + + odata |= vec; + + debug("[ openpic: unimplemented read from " + "offset 0x%x decoded vec = 0x%02x %d odata = %x ]\n", + (int)relative_addr, vec, vec, (int)odata ); } } if (writeflag == MEM_READ) { + + debug("[ openpic: READ %05x | %08x ]\n", + (int)relative_addr, (int)odata + ); + // shuffle byte order odata = ( odata & 0x000000ff ) << 24 | @@ -272,9 +298,6 @@ ( odata & 0x00ff0000 ) >> 8 | ( odata & 0xff000000 ) >> 24 ; memory_writemax64(cpu, data, len, odata); - debug("[ openpic: READ %05x | %08x ]\n", - (int)relative_addr, (int)odata - ); } return 1;