-// This is part of Pico Library\r
+// PicoDrive\r
\r
// (c) Copyright 2004 Dave, All rights reserved.\r
-// (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas\r
+// (c) Copyright 2006-2008, Grazvydas "notaz" Ignotas\r
// Free for non-commercial use.\r
\r
// For commercial use, separate licencing terms must be obtained.\r
{\r
case 1: if(a&1) d=(u16)((d<<8)|(d>>8)); // If address is odd, bytes are swapped (which game needs this?)\r
Pico.vram [(a>>1)&0x7fff]=d;\r
- rendstatus |= PDRAW_DIRTY_SPRITES; break;\r
+ if (a - ((unsigned)(Pico.video.reg[5]&0x7f) << 9) < 0x400)\r
+ rendstatus |= PDRAW_DIRTY_SPRITES;\r
+ break;\r
case 3: Pico.m.dirtyPal = 1;\r
Pico.cram [(a>>1)&0x003f]=d; break; // wraps (Desert Strike)\r
case 5: Pico.vsram[(a>>1)&0x003f]=d; break;\r
{\r
a&=0x1c;\r
\r
- if (a==0x00) // data port\r
- {\r
- return VideoRead();\r
- }\r
-\r
if (a==0x04) // control port\r
{\r
struct PicoVideo *pv=&Pico.video;\r
unsigned int d;\r
d=pv->status;\r
- if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast)\r
- if (!(pv->reg[1]&0x40)) d|=0x0008; // set V-Blank if display is disabled\r
+ //if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast)\r
if (SekCyclesLeft < 84+4) d|=0x0004; // H-Blank (Sonic3 vs)\r
\r
- d|=(pv->pending_ints&0x20)<<2; // V-int pending?\r
+ d |= ((pv->reg[1]&0x40)^0x40) >> 3; // set V-Blank if display is disabled\r
+ d |= (pv->pending_ints&0x20)<<2; // V-int pending?\r
if (d&0x100) pv->status&=~0x100; // FIFO no longer full\r
\r
- pv->pending=0; // ctrl port reads clear write-pending flag (Charles MacDonald)\r
+ pv->pending = 0; // ctrl port reads clear write-pending flag (Charles MacDonald)\r
\r
elprintf(EL_SR, "SR read: %04x @ %06x", d, SekPc);\r
return d;\r
// check: Sonic 3D Blast bonus, Cannon Fodder, Chase HQ II, 3 Ninjas kick back, Road Rash 3, Skitchin', Wheel of Fortune\r
if ((a&0x1c)==0x08)\r
{\r
- unsigned int hc, d;\r
+ unsigned int d;\r
int lineCycles;\r
- \r
- lineCycles = (488-SekCyclesLeft)&0x1ff;\r
- d = Pico.m.scanline; // V-Counter\r
\r
+ lineCycles = (488-SekCyclesLeft)&0x1ff;\r
if (Pico.video.reg[12]&1)\r
- hc=hcounts_40[lineCycles];\r
- else hc=hcounts_32[lineCycles];\r
+ d = hcounts_40[lineCycles];\r
+ else d = hcounts_32[lineCycles];\r
\r
- if (Pico.m.pal) {\r
- if (d >= 0x103) d-=56; // based on Gens\r
- } else {\r
- if (d >= 0xEB) d-=6;\r
- }\r
+ elprintf(EL_HVCNT, "hv: %02x %02x (%i) @ %06x", d, Pico.video.v_counter, SekCyclesDone(), SekPc);\r
+ return d | (Pico.video.v_counter << 8);\r
+ }\r
\r
- if ((Pico.video.reg[12]&6) == 6) {\r
- // interlace mode 2 (Combat Cars (UE) [!])\r
- d <<= 1;\r
- if (d&0xf00) d|= 1;\r
- }\r
+ if (a==0x00) // data port\r
+ {\r
+ return VideoRead();\r
+ }\r
\r
- elprintf(EL_HVCNT, "hv: %02x %02x (%i) @ %06x", hc, d, SekCyclesDone(), SekPc);\r
- d&=0xff; d<<=8;\r
- d|=hc;\r
- return d;\r
+ return 0;\r
+}\r
+\r
+unsigned int PicoVideoRead8(unsigned int a)\r
+{\r
+ unsigned int d;\r
+ a&=0x1d;\r
+\r
+ switch (a)\r
+ {\r
+ case 0: return VideoRead() >> 8;\r
+ case 1: return VideoRead() & 0xff;\r
+ case 4: // control port/status reg\r
+ d = Pico.video.status >> 8;\r
+ if (d&1) Pico.video.status&=~0x100; // FIFO no longer full\r
+ Pico.video.pending = 0;\r
+ elprintf(EL_SR, "SR read (h): %02x @ %06x", d, SekPc);\r
+ return d;\r
+ case 5:\r
+ d = Pico.video.status & 0xff;\r
+ //if (PicoOpt&POPT_ALT_RENDERER) d|=0x0020; // sprite collision (Shadow of the Beast)\r
+ d |= ((Pico.video.reg[1]&0x40)^0x40) >> 3; // set V-Blank if display is disabled\r
+ d |= (Pico.video.pending_ints&0x20)<<2; // V-int pending?\r
+ if (SekCyclesLeft < 84+4) d |= 4; // H-Blank\r
+ Pico.video.pending = 0;\r
+ elprintf(EL_SR, "SR read (l): %02x @ %06x", d, SekPc);\r
+ return d;\r
+ case 8: // hv counter\r
+ elprintf(EL_HVCNT, "vcounter: %02x (%i) @ %06x", Pico.video.v_counter, SekCyclesDone(), SekPc);\r
+ return Pico.video.v_counter;\r
+ case 9:\r
+ d = (488-SekCyclesLeft)&0x1ff;\r
+ if (Pico.video.reg[12]&1)\r
+ d = hcounts_40[d];\r
+ else d = hcounts_32[d];\r
+ elprintf(EL_HVCNT, "hcounter: %02x (%i) @ %06x", d, SekCyclesDone(), SekPc);\r
+ return d;\r
}\r
\r
return 0;\r