80 lines
1.6 KiB
C
80 lines
1.6 KiB
C
/*
|
|
* PicoDrive
|
|
* (C) notaz, 2007
|
|
*
|
|
* This work is licensed under the terms of MAME license.
|
|
* See COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#include "../pico_int.h"
|
|
|
|
#include "cell_map.c"
|
|
|
|
#ifndef UTYPES_DEFINED
|
|
typedef unsigned short u16;
|
|
#endif
|
|
|
|
// check: Heart of the alien, jaguar xj 220
|
|
PICO_INTERNAL void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc)
|
|
{
|
|
unsigned char *base;
|
|
unsigned int asrc, a2;
|
|
u16 *r;
|
|
|
|
base = Pico_mcd->word_ram1M[Pico_mcd->s68k_regs[3]&1];
|
|
|
|
switch (Pico.video.type)
|
|
{
|
|
case 1: // vram
|
|
r = Pico.vram;
|
|
for(; len; len--)
|
|
{
|
|
asrc = cell_map(source >> 2) << 2;
|
|
asrc |= source & 2;
|
|
// if(a&1) d=(d<<8)|(d>>8); // ??
|
|
r[a>>1] = *(u16 *)(base + asrc);
|
|
source += 2;
|
|
// AutoIncrement
|
|
a=(u16)(a+inc);
|
|
}
|
|
rendstatus |= PDRAW_SPRITES_MOVED;
|
|
break;
|
|
|
|
case 3: // cram
|
|
Pico.m.dirtyPal = 1;
|
|
r = Pico.cram;
|
|
for(a2=a&0x7f; len; len--)
|
|
{
|
|
asrc = cell_map(source >> 2) << 2;
|
|
asrc |= source & 2;
|
|
r[a2>>1] = *(u16 *)(base + asrc);
|
|
source += 2;
|
|
// AutoIncrement
|
|
a2+=inc;
|
|
// good dest?
|
|
if(a2 >= 0x80) break;
|
|
}
|
|
a=(a&0xff00)|a2;
|
|
break;
|
|
|
|
case 5: // vsram[a&0x003f]=d;
|
|
r = Pico.vsram;
|
|
for(a2=a&0x7f; len; len--)
|
|
{
|
|
asrc = cell_map(source >> 2) << 2;
|
|
asrc |= source & 2;
|
|
r[a2>>1] = *(u16 *)(base + asrc);
|
|
source += 2;
|
|
// AutoIncrement
|
|
a2+=inc;
|
|
// good dest?
|
|
if(a2 >= 0x80) break;
|
|
}
|
|
a=(a&0xff00)|a2;
|
|
break;
|
|
}
|
|
// remember addr
|
|
Pico.video.addr=(u16)a;
|
|
}
|
|
|