a93a80de |
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 | |
a93a80de |
13 | // check: Heart of the alien, jaguar xj 220 |
15eed405 |
14 | PICO_INTERNAL void DmaSlowCell(u32 source, u32 a, int len, unsigned char inc) |
a93a80de |
15 | { |
16 | unsigned char *base; |
f821bb70 |
17 | u32 asrc, a2; |
a93a80de |
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 |
88fd63ad |
25 | r = PicoMem.vram; |
a93a80de |
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); // ?? |
bd73e6ee |
31 | VideoWriteVRAM(a, *(u16 *)(base + asrc)); |
a93a80de |
32 | source += 2; |
33 | // AutoIncrement |
34 | a=(u16)(a+inc); |
35 | } |
a93a80de |
36 | break; |
37 | |
38 | case 3: // cram |
39 | Pico.m.dirtyPal = 1; |
88fd63ad |
40 | r = PicoMem.cram; |
a93a80de |
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; |
88fd63ad |
56 | r = PicoMem.vsram; |
a93a80de |
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 | |