extern const unsigned short vcounts[];\r
extern int rendstatus;\r
\r
+typedef unsigned char u8;\r
typedef unsigned short u16;\r
\r
\r
SekSetCyclesLeft(SekCyclesLeft - (len*(((488<<8)/167))>>8));\r
}\r
\r
- if ((source&0xe00000)==0xe00000) { pd=(u16 *)(Pico.ram+(source&0xfffe)); pdend=(u16 *)(Pico.ram+0x10000); } // Ram\r
- else if(PicoMCD & 1) {\r
- if(source<0x20000) { pd=(u16 *)(Pico_mcd->bios+(source&~1)); pdend=(u16 *)(Pico_mcd->bios+0x20000); } // Bios area\r
- else { dprintf("unsupported src"); return; } // Invalid source address\r
+ if ((source&0xe00000)==0xe00000) { // Ram\r
+ pd=(u16 *)(Pico.ram+(source&0xfffe));\r
+ pdend=(u16 *)(Pico.ram+0x10000);\r
+ } else if(PicoMCD & 1) {\r
+ dprintf("DmaSlow CD");\r
+ if(source<0x20000) { // Bios area\r
+ pd=(u16 *)(Pico_mcd->bios+(source&~1));\r
+ pdend=(u16 *)(Pico_mcd->bios+0x20000);\r
+ } else if ((source&0xfc0000)==0x200000 && (!(Pico_mcd->s68k_regs[3]&4))) { // Word Ram\r
+ if (!(Pico_mcd->s68k_regs[3]&4)) { // 2M mode\r
+ source -= 2;\r
+ pd=(u16 *)(Pico_mcd->word_ram+(source&0x3fffe));\r
+ pdend=(u16 *)(Pico_mcd->word_ram+0x40000);\r
+ } else {\r
+ dprintf("DmaSlow: unsupported src");\r
+ return;\r
+ }\r
+ } else if ((source&0xfe0000)==0x020000) { // Prg Ram\r
+ u8 *prg_ram = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
+ pd=(u16 *)(prg_ram+(source&0x1fffe));\r
+ pdend=(u16 *)(prg_ram+0x20000);\r
+ } else {\r
+ dprintf("DmaSlow: unsupported src");\r
+ return;\r
+ }\r
} else {\r
- if(source<Pico.romsize) { pd=(u16 *)(Pico.rom+(source&~1)); pdend=(u16 *)(Pico.rom+Pico.romsize); } // Rom\r
- else { dprintf("invalid dma src"); return; } // Invalid source address\r
+ if(source<Pico.romsize) { // Rom\r
+ pd=(u16 *)(Pico.rom+(source&~1));\r
+ pdend=(u16 *)(Pico.rom+Pico.romsize);\r
+ } else {\r
+ dprintf("DmaSlow: invalid dma src");\r
+ return;\r
+ }\r
+ }\r
+\r
+ // overflow protection, might break something..\r
+ if (len > pdend - pd) {\r
+ len = pdend - pd;\r
+ dprintf("DmaSlow overflow");\r
}\r
\r
switch (Pico.video.type)\r
// AutoIncrement\r
a=(u16)(a+inc);\r
// didn't src overlap?\r
- if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
+ //if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
}\r
rendstatus|=0x10;\r
break;\r
// AutoIncrement\r
a2+=inc;\r
// didn't src overlap?\r
- if(pd >= pdend) pd-=0x8000;\r
+ //if(pd >= pdend) pd-=0x8000;\r
// good dest?\r
if(a2 >= 0x80) break; // Todds Adventures in Slime World / Andre Agassi tennis\r
}\r
// AutoIncrement\r
a2+=inc;\r
// didn't src overlap?\r
- if(pd >= pdend) pd-=0x8000;\r
+ //if(pd >= pdend) pd-=0x8000;\r
// good dest?\r
if(a2 >= 0x80) break;\r
}\r
if(Pico.m.rotate++&8) d|=0x0100; else d|=0x0200; // Toggle fifo full empty (who uses that stuff?)\r
if(!(Pico.video.reg[1]&0x40)) d|=0x0008; // set V-Blank if display is disabled\r
if(SekCyclesLeft < 84+4) d|=0x0004; // H-Blank (Sonic3 vs)\r
- dprintf("sr_read %04x @ %06x [%i|%i]", d, SekPc, Pico.m.scanline, SekCyclesDone());\r
+ // dprintf("sr_read %04x @ %06x [%i|%i]", d, SekPc, Pico.m.scanline, SekCyclesDone());\r
\r
Pico.video.pending=0; // ctrl port reads clear write-pending flag (Charles MacDonald)\r
\r