360afedfb908a6fb5169c41b184f4330a3d63c8e
[picodrive.git] / pico / cd / gfx_dma.c
1 /*
2  * PicoDrive
3  * (C) notaz, 2007
4  *
5  * This work is licensed under the terms of MAME license.
6  * See COPYING file in the top-level directory.
7  */
8
9 #include "../pico_int.h"
10
11 #include "cell_map.c"
12
13 // check: Heart of the alien, jaguar xj 220
14 PICO_INTERNAL void DmaSlowCell(u32 source, u32 a, int len, unsigned char inc)
15 {
16   unsigned char *base;
17   u32 asrc, a2;
18   u16 *r;
19
20   base = Pico_mcd->word_ram1M[Pico_mcd->s68k_regs[3]&1];
21
22   switch (Pico.video.type)
23   {
24     case 1: // vram
25       r = PicoMem.vram;
26       for(; len; len--)
27       {
28         asrc = cell_map(source >> 2) << 2;
29         asrc |= source & 2;
30         // if(a&1) d=(d<<8)|(d>>8); // ??
31         VideoWriteVRAM(a, *(u16 *)(base + asrc));
32         source += 2;
33         // AutoIncrement
34         a=(u16)(a+inc);
35       }
36       break;
37
38     case 3: // cram
39       Pico.m.dirtyPal = 1;
40       r = PicoMem.cram;
41       for(a2=a&0x7f; len; len--)
42       {
43         asrc = cell_map(source >> 2) << 2;
44         asrc |= source & 2;
45         r[a2>>1] = *(u16 *)(base + asrc);
46         source += 2;
47         // AutoIncrement
48         a2+=inc;
49         // good dest?
50         if(a2 >= 0x80) break;
51       }
52       a=(a&0xff00)|a2;
53       break;
54
55     case 5: // vsram[a&0x003f]=d;
56       r = PicoMem.vsram;
57       for(a2=a&0x7f; len; len--)
58       {
59         asrc = cell_map(source >> 2) << 2;
60         asrc |= source & 2;
61         r[a2>>1] = *(u16 *)(base + asrc);
62         source += 2;
63         // AutoIncrement
64         a2+=inc;
65         // good dest?
66         if(a2 >= 0x80) break;
67       }
68       a=(a&0xff00)|a2;
69       break;
70   }
71   // remember addr
72   Pico.video.addr=(u16)a;
73 }
74