+static int dma_timings[] = {\r
+83, 167, 166, 83, // vblank: 32cell: dma2vram dma2[vs|c]ram vram_fill vram_copy\r
+102, 205, 204, 102, // vblank: 40cell:\r
+8, 16, 15, 8, // active: 32cell:\r
+9, 18, 17, 9 // ...\r
+};\r
+\r
+static void CheckDMA(void)\r
+{\r
+ int burn = 0, bytes_can = 0, dma_op = Pico.video.reg[0x17]>>6; // see gens for 00 and 01 modes\r
+ int bytes = Pico.m.dma_bytes;\r
+\r
+ if(dma_op & 2) bytes_can = dma_op;\r
+ else if(Pico.video.type!=1) bytes_can = 1; // setting dma_timings offset here according to Gens\r
+ if(Pico.video.reg[12] & 1) bytes_can += 4; // 40 cell mode?\r
+ if(!(Pico.video.status&8)&&(Pico.video.reg[1]&0x40)) { dma_op|=4; bytes_can += 8; } // active display?\r
+ bytes_can = dma_timings[bytes_can];\r
+\r
+ if(bytes <= bytes_can) {\r
+ if(dma_op&2) Pico.video.status&=~2; // dma no longer busy\r
+ else {\r
+ if(dma_op&4) burn = bytes*(((488<<8)/18 ))>>8; // have to be approximate because can't afford division..\r
+ else burn = bytes*(((488<<8)/205))>>8;\r
+ }\r
+ Pico.m.dma_bytes = 0;\r
+ } else {\r
+ if(!(dma_op&2)) burn = 488;\r
+ Pico.m.dma_bytes -= bytes_can;\r
+ }\r
+\r
+ SekCycleCnt+=burn;\r
+ dprintf("~Dma %i op=%i can=%i burn=%i [%i|%i]", Pico.m.dma_bytes, dma_op, bytes_can, burn, Pico.m.scanline, SekCyclesDone());\r
+}\r
+\r