d = ~d;
break;
- case 0x05: d = (PicoPicohw.pen_pos[0] >> 8) & 3; break; // what is MS bit for? Games read it..
- case 0x07: d = PicoPicohw.pen_pos[0] & 0xff; break;
- case 0x09: d = (PicoPicohw.pen_pos[1] >> 8) & 3; break;
- case 0x0b: d = PicoPicohw.pen_pos[1] & 0xff; break;
+ case 0x05: d = (PicoPicohw.pen_pos[0] >> 8); break; // what is MS bit for? Games read it..
+ case 0x07: d = PicoPicohw.pen_pos[0] & 0xff; break;
+ case 0x09: d = (PicoPicohw.pen_pos[1] >> 8); break;
+ case 0x0b: d = PicoPicohw.pen_pos[1] & 0xff; break;
case 0x0d: d = (1 << (PicoPicohw.page & 7)) - 1; break;
- case 0x12: d = 0x80; break;
+ case 0x12: d = PicoPicohw.fifo_bytes == 0 ? 0x80 : 0; break; // guess
default:
elprintf(EL_UIO, "r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPc);
break;
goto end;
}
- if (a == 0x800010)
+ if (a == 0x800010)
d = (PicoPicohw.fifo_bytes > 0x3f) ? 0 : (0x3f - PicoPicohw.fifo_bytes);
+ else if (a == 0x800012)
+ d = PicoPicohw.fifo_bytes == 0 ? 0x8000 : 0; // guess
elprintf(EL_UIO, "r16: %06x, %04x @%06x", a&0xffffff, d, SekPc);
if ((a&0xfffff0)==0xc00000) { PicoVideoWrite(a,(u16)d); return; } // VDP
// if (a == 0x800010) dump(d);
- if (a == 0x800010) PicoPicohw.fifo_bytes += 2;
- if (a == 0x800012) PicoPicohw.r12 = d;
+ if (a == 0x800010)
+ {
+ PicoPicohw.fifo_bytes += 2;
+
+ if (PicoPicohw.xpcm_ptr < PicoPicohw.xpcm_buffer + XPCM_BUFFER_SIZE) {
+ *PicoPicohw.xpcm_ptr++ = d >> 8;
+ *PicoPicohw.xpcm_ptr++ = d;
+ }
+ else if (PicoPicohw.xpcm_ptr == PicoPicohw.xpcm_buffer + XPCM_BUFFER_SIZE) {
+ elprintf(EL_ANOMALY, "xpcm_buffer overflow!");
+ PicoPicohw.xpcm_ptr++;
+ }
+ }
+ else if (a == 0x800012) {
+ int r12_old = PicoPicohw.r12;
+ PicoPicohw.r12 = d;
+ if (r12_old != d)
+ PicoReratePico();
+ }
elprintf(EL_UIO, "w16: %06x, %04x", a&0xffffff, d);
}