X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FPico%2FMemory.c;h=2f8e1d6c3615a86e8e3a6c74060b466ebfc160c7;hb=213c16adcb630666f694646645a8ed4bc30c334b;hp=f18edc4569c3022a9e93e03a6caf141d0ef1ce99;hpb=406c96c547a11046f63cb88bd0bc666003812608;p=picodrive.git diff --git a/Pico/Pico/Memory.c b/Pico/Pico/Memory.c index f18edc4..2f8e1d6 100644 --- a/Pico/Pico/Memory.c +++ b/Pico/Pico/Memory.c @@ -1,4 +1,5 @@ #include "../PicoInt.h" +#include "../sound/sn76496.h" #ifndef UTYPES_DEFINED typedef unsigned char u8; @@ -7,6 +8,7 @@ typedef unsigned int u32; #define UTYPES_DEFINED #endif + // ----------------------------------------------------------------- // Read Rom and read Ram @@ -19,7 +21,7 @@ static u32 PicoReadPico8(u32 a) a&=0xffffff; - if ((a&0xffffe0)==0xc00000) { // VDP + if ((a&0xfffff0)==0xc00000) { // VDP d=PicoVideoRead(a); if ((a&1)==0) d>>=8; goto end; @@ -29,19 +31,19 @@ static u32 PicoReadPico8(u32 a) { switch (a & 0x1f) { + case 0x01: d = PicoPicohw.r1; break; case 0x03: - d = PicoPad[0]&0x0f; // d-pad - d |= (PicoPad[0]&0x20) >> 1; // red button -> C - d |= (PicoPad[0]&0x40) << 1; // pen tap -> A + d = PicoPad[0]&0x1f; // d-pad + d |= (PicoPad[0]&0x20) << 2; // red button -> C d = ~d; break; - case 0x05: d = (PicoPicoPenPos[0] >> 8) & 3; break; // what is MS bit for? Games read it.. - case 0x07: d = PicoPicoPenPos[0] & 0xff; break; - case 0x09: d = (PicoPicoPenPos[1] >> 8) & 3; break; - case 0x0b: d = PicoPicoPenPos[1] & 0xff; break; - case 0x0d: d = (1 << (PicoPicoPage & 7)) - 1;break; - case 0x12: d = 0x80; 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 = PicoPicohw.fifo_bytes == 0 ? 0x80 : 0; break; // guess default: elprintf(EL_UIO, "r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPc); break; @@ -65,12 +67,15 @@ static u32 PicoReadPico16(u32 a) if (a 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); @@ -89,7 +94,7 @@ static u32 PicoReadPico32(u32 a) if (a> 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); } @@ -155,7 +181,7 @@ static void PicoWritePico32(u32 a,u32 d) } a&=0xfffffe; - if ((a&0xffffe0)==0xc00000) + if ((a&0xfffff0)==0xc00000) { // VDP: PicoVideoWrite(a, (u16)(d>>16));