X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FVideoPort.c;h=7a38ea9c43af928445448702647978754c65c173;hb=9761a7d0d41ad429d53c64ff35fe061c38092dbf;hp=db7b2b7f742451d989b8c35e38357ac8a55a7fdd;hpb=2aa27095f2dbf5b38950fcb1f856d5ffc6a70361;p=picodrive.git diff --git a/Pico/VideoPort.c b/Pico/VideoPort.c index db7b2b7..7a38ea9 100644 --- a/Pico/VideoPort.c +++ b/Pico/VideoPort.c @@ -449,24 +449,19 @@ PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a) { a&=0x1c; - if (a==0x00) // data port - { - return VideoRead(); - } - if (a==0x04) // control port { struct PicoVideo *pv=&Pico.video; unsigned int d; d=pv->status; - if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast) - if (!(pv->reg[1]&0x40)) d|=0x0008; // set V-Blank if display is disabled + //if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast) if (SekCyclesLeft < 84+4) d|=0x0004; // H-Blank (Sonic3 vs) - d|=(pv->pending_ints&0x20)<<2; // V-int pending? + d |= ((pv->reg[1]&0x40)^0x40) >> 3; // set V-Blank if display is disabled + d |= (pv->pending_ints&0x20)<<2; // V-int pending? if (d&0x100) pv->status&=~0x100; // FIFO no longer full - pv->pending=0; // ctrl port reads clear write-pending flag (Charles MacDonald) + pv->pending = 0; // ctrl port reads clear write-pending flag (Charles MacDonald) elprintf(EL_SR, "SR read: %04x @ %06x", d, SekPc); return d; @@ -489,32 +484,60 @@ PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a) // check: Sonic 3D Blast bonus, Cannon Fodder, Chase HQ II, 3 Ninjas kick back, Road Rash 3, Skitchin', Wheel of Fortune if ((a&0x1c)==0x08) { - unsigned int hc, d; + unsigned int d; int lineCycles; lineCycles = (488-SekCyclesLeft)&0x1ff; - d = Pico.m.scanline; // V-Counter - if (Pico.video.reg[12]&1) - hc=hcounts_40[lineCycles]; - else hc=hcounts_32[lineCycles]; + d = hcounts_40[lineCycles]; + else d = hcounts_32[lineCycles]; - if (Pico.m.pal) { - if (d >= 0x103) d-=56; // based on Gens - } else { - if (d >= 0xEB) d-=6; - } + elprintf(EL_HVCNT, "hv: %02x %02x (%i) @ %06x", d, Pico.video.v_counter, SekCyclesDone(), SekPc); + return d | (Pico.video.v_counter << 8); + } - if ((Pico.video.reg[12]&6) == 6) { - // interlace mode 2 (Combat Cars (UE) [!]) - d <<= 1; - if (d&0xf00) d|= 1; - } + if (a==0x00) // data port + { + return VideoRead(); + } - elprintf(EL_HVCNT, "hv: %02x %02x (%i) @ %06x", hc, d, SekCyclesDone(), SekPc); - d&=0xff; d<<=8; - d|=hc; - return d; + return 0; +} + +unsigned int PicoVideoRead8(unsigned int a) +{ + unsigned int d; + a&=0x1d; + + switch (a) + { + case 0: return VideoRead() >> 8; + case 1: return VideoRead() & 0xff; + case 4: // control port/status reg + d = Pico.video.status >> 8; + if (d&1) Pico.video.status&=~0x100; // FIFO no longer full + Pico.video.pending = 0; + elprintf(EL_SR, "SR read (h): %02x @ %06x", d, SekPc); + return d; + case 5: + d = Pico.video.status & 0xff; + //if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast) + d |= ((Pico.video.reg[1]&0x40)^0x40) >> 3; // set V-Blank if display is disabled + d |= (Pico.video.pending_ints&0x20)<<2; // V-int pending? + if (SekCyclesLeft < 84+4) d |= 4; // H-Blank + Pico.video.pending = 0; + elprintf(EL_SR, "SR read (l): %02x @ %06x", d, SekPc); + return d; + case 8: // hv counter + elprintf(EL_HVCNT, "vcounter: %02x (%i) @ %06x", Pico.video.v_counter, SekCyclesDone(), SekPc); + return Pico.video.v_counter; + case 9: + d = (488-SekCyclesLeft)&0x1ff; + if (Pico.video.reg[12]&1) + d = hcounts_40[d]; + else d = hcounts_32[d]; + elprintf(EL_HVCNT, "hcounter: %02x (%i) @ %06x", d, SekCyclesDone(), SekPc); + return d; } return 0;