mirror of
https://github.com/holub/mame
synced 2025-05-10 08:12:13 +03:00
add some routines to skeleton "adp" driver
This commit is contained in:
parent
6c3fe42bae
commit
dff7bfdcb5
@ -137,29 +137,786 @@ There's also (external) JAMMA adapter - 4th board filled with resistors and diod
|
|||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "sound/ay8910.h"
|
#include "sound/ay8910.h"
|
||||||
|
|
||||||
static ADDRESS_MAP_START( skattv_mem, ADDRESS_SPACE_PROGRAM, 16 )
|
#define FIFO_LENGTH 50
|
||||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM
|
#define HD63484_RAM_SIZE 0x200000
|
||||||
AM_RANGE(0xfc0000, 0xffffff) AM_RAM
|
static int fifo_counter;
|
||||||
ADDRESS_MAP_END
|
static UINT16 fifo[FIFO_LENGTH];
|
||||||
|
static UINT16 readfifo;
|
||||||
|
static UINT8 *HD63484_ram;
|
||||||
|
static UINT16 HD63484_reg[256/2];
|
||||||
|
static int org,rwp;
|
||||||
|
static UINT16 cl0,cl1,ccmp;
|
||||||
|
static INT16 cpx,cpy;
|
||||||
|
|
||||||
static VIDEO_START(skattv)
|
|
||||||
|
static const int instruction_length[64] =
|
||||||
{
|
{
|
||||||
|
0, 3, 2, 1, /* 0x */
|
||||||
|
0, 0,-1, 2, /* 1x */
|
||||||
|
0, 3, 3, 3, /* 2x */
|
||||||
|
0, 0, 0, 0, /* 3x */
|
||||||
|
0, 1, 2, 2, /* 4x */
|
||||||
|
0, 0, 4, 4, /* 5x */
|
||||||
|
5, 5, 5, 5, /* 6x */
|
||||||
|
5, 5, 5, 5, /* 7x */
|
||||||
|
3, 3, 3, 3, /* 8x */
|
||||||
|
3, 3,-2,-2, /* 9x */
|
||||||
|
-2,-2, 2, 4, /* Ax */
|
||||||
|
5, 5, 7, 7, /* Bx */
|
||||||
|
3, 3, 1, 1, /* Cx */
|
||||||
|
2, 2, 2, 2, /* Dx */
|
||||||
|
5, 5, 5, 5, /* Ex */
|
||||||
|
5, 5, 5, 5 /* Fx */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const instruction_name[64] =
|
||||||
|
{
|
||||||
|
"undef","ORG ","WPR ","RPR ", /* 0x */
|
||||||
|
"undef","undef","WPTN ","RPTN ", /* 1x */
|
||||||
|
"undef","DRD ","DWT ","DMOD ", /* 2x */
|
||||||
|
"undef","undef","undef","undef", /* 3x */
|
||||||
|
"undef","RD ","WT ","MOD ", /* 4x */
|
||||||
|
"undef","undef","CLR ","SCLR ", /* 5x */
|
||||||
|
"CPY ","CPY ","CPY ","CPY ", /* 6x */
|
||||||
|
"SCPY ","SCPY ","SCPY ","SCPY ", /* 7x */
|
||||||
|
"AMOVE","RMOVE","ALINE","RLINE", /* 8x */
|
||||||
|
"ARCT ","RRCT ","APLL ","RPLL ", /* 9x */
|
||||||
|
"APLG ","RPLG ","CRCL ","ELPS ", /* Ax */
|
||||||
|
"AARC ","RARC ","AEARC","REARC", /* Bx */
|
||||||
|
"AFRCT","RFRCT","PAINT","DOT ", /* Cx */
|
||||||
|
"PTN ","PTN ","PTN ","PTN ", /* Dx */
|
||||||
|
"AGCPY","AGCPY","AGCPY","AGCPY", /* Ex */
|
||||||
|
"RGCPY","RGCPY","RGCPY","RGCPY" /* Fx */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void HD63484_start(void)
|
||||||
|
{
|
||||||
|
fifo_counter = 0;
|
||||||
|
HD63484_ram = auto_malloc(HD63484_RAM_SIZE);
|
||||||
|
memset(HD63484_ram,0,HD63484_RAM_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VIDEO_UPDATE(skattv)
|
static void doclr(int opcode,UINT16 fill,int *dst,INT16 _ax,INT16 _ay)
|
||||||
{
|
{
|
||||||
|
INT16 ax,ay;
|
||||||
|
|
||||||
|
ax = _ax;
|
||||||
|
ay = _ay;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
switch (opcode & 0x0003)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
HD63484_ram[*dst] = fill; break;
|
||||||
|
case 1:
|
||||||
|
HD63484_ram[*dst] |= fill; break;
|
||||||
|
case 2:
|
||||||
|
HD63484_ram[*dst] &= fill; break;
|
||||||
|
case 3:
|
||||||
|
HD63484_ram[*dst] ^= fill; break;
|
||||||
|
}
|
||||||
|
if (ax == 0) break;
|
||||||
|
else if (ax > 0)
|
||||||
|
{
|
||||||
|
*dst = (*dst + 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dst = (*dst - 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ax = _ax;
|
||||||
|
if (_ay < 0)
|
||||||
|
{
|
||||||
|
*dst = (*dst + 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dst = (*dst - 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
|
||||||
|
{
|
||||||
|
int dstep1,dstep2;
|
||||||
|
int ax = _ax;
|
||||||
|
int ay = _ay;
|
||||||
|
|
||||||
|
switch (opcode & 0x0700)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case 0x0000: dstep1 = 1; dstep2 = -384 - ax * dstep1; break;
|
||||||
|
case 0x0100: dstep1 = 1; dstep2 = 384 - ax * dstep1; break;
|
||||||
|
case 0x0200: dstep1 = -1; dstep2 = -384 + ax * dstep1; break;
|
||||||
|
case 0x0300: dstep1 = -1; dstep2 = 384 + ax * dstep1; break;
|
||||||
|
case 0x0400: dstep1 = -384; dstep2 = 1 - ay * dstep1; break;
|
||||||
|
case 0x0500: dstep1 = 384; dstep2 = 1 - ay * dstep1; break;
|
||||||
|
case 0x0600: dstep1 = -384; dstep2 = -1 + ay * dstep1; break;
|
||||||
|
case 0x0700: dstep1 = 384; dstep2 = -1 + ay * dstep1; break; // used by kothello
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
switch (opcode & 0x0007)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
HD63484_ram[*dst] = HD63484_ram[src]; break;
|
||||||
|
case 1:
|
||||||
|
HD63484_ram[*dst] |= HD63484_ram[src]; break;
|
||||||
|
case 2:
|
||||||
|
HD63484_ram[*dst] &= HD63484_ram[src]; break;
|
||||||
|
case 3:
|
||||||
|
HD63484_ram[*dst] ^= HD63484_ram[src]; break;
|
||||||
|
case 4:
|
||||||
|
if (HD63484_ram[*dst] == (ccmp & 0xff))
|
||||||
|
HD63484_ram[*dst] = HD63484_ram[src];
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (HD63484_ram[*dst] != (ccmp & 0xff))
|
||||||
|
HD63484_ram[*dst] = HD63484_ram[src];
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (HD63484_ram[*dst] < HD63484_ram[src])
|
||||||
|
HD63484_ram[*dst] = HD63484_ram[src];
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if (HD63484_ram[*dst] > HD63484_ram[src])
|
||||||
|
HD63484_ram[*dst] = HD63484_ram[src];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode & 0x0800)
|
||||||
|
{
|
||||||
|
if (ay == 0) break;
|
||||||
|
if (_ay > 0)
|
||||||
|
{
|
||||||
|
src = (src - 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src = (src + 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ax == 0) break;
|
||||||
|
else if (ax > 0)
|
||||||
|
{
|
||||||
|
src = (src + 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src = (src - 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode & 0x0800)
|
||||||
|
{
|
||||||
|
ay = _ay;
|
||||||
|
if (_ax < 0)
|
||||||
|
{
|
||||||
|
src = (src - 1 + ay * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ax == 0) break;
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src = (src + 1 - ay * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ax == 0) break;
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ax = _ax;
|
||||||
|
if (_ay < 0)
|
||||||
|
{
|
||||||
|
src = (src + 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src = (src - 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PLOT(addr,OPM) \
|
||||||
|
switch (OPM) \
|
||||||
|
{ \
|
||||||
|
case 0: \
|
||||||
|
HD63484_ram[addr] = cl0; break; \
|
||||||
|
case 1: \
|
||||||
|
HD63484_ram[addr] |= cl0; break; \
|
||||||
|
case 2: \
|
||||||
|
HD63484_ram[addr] &= cl0; break; \
|
||||||
|
case 3: \
|
||||||
|
HD63484_ram[addr] ^= cl0; break; \
|
||||||
|
case 4: \
|
||||||
|
if (HD63484_ram[addr] == (ccmp & 0xff)) \
|
||||||
|
HD63484_ram[addr] = cl0; \
|
||||||
|
break; \
|
||||||
|
case 5: \
|
||||||
|
if (HD63484_ram[addr] != (ccmp & 0xff)) \
|
||||||
|
HD63484_ram[addr] = cl0; \
|
||||||
|
break; \
|
||||||
|
case 6: \
|
||||||
|
if (HD63484_ram[addr] < (cl0 & 0xff)) \
|
||||||
|
HD63484_ram[addr] = cl0; \
|
||||||
|
break; \
|
||||||
|
case 7: \
|
||||||
|
if (HD63484_ram[addr] > (cl0 & 0xff)) \
|
||||||
|
HD63484_ram[addr] = cl0; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void HD63484_command_w(UINT16 cmd)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
fifo[fifo_counter++] = cmd;
|
||||||
|
|
||||||
|
len = instruction_length[fifo[0]>>10];
|
||||||
|
if (len == -1)
|
||||||
|
{
|
||||||
|
if (fifo_counter < 2) return;
|
||||||
|
else len = fifo[1]+2;
|
||||||
|
}
|
||||||
|
else if (len == -2)
|
||||||
|
{
|
||||||
|
if (fifo_counter < 2) return;
|
||||||
|
else len = 2*fifo[1]+2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fifo_counter >= len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
logerror("PC %05x: HD63484 command %s (%04x) ",activecpu_get_pc(),instruction_name[fifo[0]>>10],fifo[0]);
|
||||||
|
for (i = 1;i < fifo_counter;i++)
|
||||||
|
logerror("%04x ",fifo[i]);
|
||||||
|
logerror("\n");
|
||||||
|
|
||||||
|
if (fifo[0] == 0x0400) { /* ORG */
|
||||||
|
org = ((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4);
|
||||||
|
}
|
||||||
|
else if ((fifo[0] & 0xffe0) == 0x0800) /* WPR */
|
||||||
|
{
|
||||||
|
if (fifo[0] == 0x0800)
|
||||||
|
cl0 = fifo[1];
|
||||||
|
else if (fifo[0] == 0x0801)
|
||||||
|
cl1 = fifo[1];
|
||||||
|
else if (fifo[0] == 0x0802)
|
||||||
|
ccmp = fifo[1];
|
||||||
|
else if (fifo[0] == 0x080c)
|
||||||
|
rwp = (rwp & 0x00fff) | ((fifo[1] & 0x00ff) << 12);
|
||||||
|
else if (fifo[0] == 0x080d)
|
||||||
|
rwp = (rwp & 0xff000) | ((fifo[1] & 0xfff0) >> 4);
|
||||||
|
else
|
||||||
|
logerror("unsupported register\n");
|
||||||
|
}
|
||||||
|
else if ((fifo[0] & 0xfff0) == 0x1800) /* WPTN */
|
||||||
|
{
|
||||||
|
/* pattern RAM not supported */
|
||||||
|
}
|
||||||
|
else if (fifo[0] == 0x4400) /* RD */
|
||||||
|
{
|
||||||
|
readfifo = HD63484_ram[2*rwp] | (HD63484_ram[2*rwp+1] << 8);
|
||||||
|
rwp = (rwp + 1) & (HD63484_RAM_SIZE/2-1);
|
||||||
|
}
|
||||||
|
else if (fifo[0] == 0x4800) /* WT */
|
||||||
|
{
|
||||||
|
HD63484_ram[2*rwp] = fifo[1] & 0x00ff ;
|
||||||
|
HD63484_ram[2*rwp+1] = (fifo[1] & 0xff00) >> 8;
|
||||||
|
rwp = (rwp + 1) & (HD63484_RAM_SIZE/2-1);
|
||||||
|
}
|
||||||
|
else if (fifo[0] == 0x5800) /* CLR */
|
||||||
|
{
|
||||||
|
int ax = 2*fifo[2];
|
||||||
|
|
||||||
|
rwp *= 2;
|
||||||
|
if (fifo[2] & 0x8000) { rwp += 1; ax -= 1; } else { ax += 1; }
|
||||||
|
|
||||||
|
doclr(fifo[0],fifo[1],&rwp,ax,fifo[3]);
|
||||||
|
|
||||||
|
if (fifo[2] & 0x8000) rwp -= 1;
|
||||||
|
rwp /= 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
int fifo2 = (int)fifo[2],fifo3 = (int)fifo[3];
|
||||||
|
if (fifo2<0) fifo2 *= -1;
|
||||||
|
if (fifo3<0) fifo3 *= -1;
|
||||||
|
rwp += ((fifo2+1)*(fifo3+1));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else if ((fifo[0] & 0xfffc) == 0x5c00) /* SCLR */
|
||||||
|
{
|
||||||
|
int ax = 2*fifo[2];
|
||||||
|
|
||||||
|
rwp *= 2;
|
||||||
|
if (fifo[2] & 0x8000) { rwp += 1; ax -= 1; } else { ax += 1; }
|
||||||
|
|
||||||
|
doclr(fifo[0],fifo[1],&rwp,ax,fifo[3]);
|
||||||
|
|
||||||
|
if (fifo[2] & 0x8000) rwp -= 1;
|
||||||
|
rwp /= 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
int fifo2 = (int)fifo[2],fifo3 = (int)fifo[3];
|
||||||
|
if (fifo2<0) fifo2 *= -1;
|
||||||
|
if (fifo3<0) fifo3 *= -1;
|
||||||
|
rwp += ((fifo2+1)*(fifo3+1));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else if ((fifo[0] & 0xf0ff) == 0x6000) /* CPY */
|
||||||
|
{
|
||||||
|
int src,ax;
|
||||||
|
|
||||||
|
ax = 2*fifo[3];
|
||||||
|
src = (((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4))*2;
|
||||||
|
rwp *= 2;
|
||||||
|
if (fifo[3] & 0x8000) { rwp += 1; src += 1; ax -= 1; } else { ax += 1; }
|
||||||
|
|
||||||
|
docpy(fifo[0],src,&rwp,ax,fifo[4]);
|
||||||
|
|
||||||
|
if (fifo[3] & 0x8000) rwp -= 1;
|
||||||
|
rwp /= 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
int fifo2 = (int)fifo[2],fifo3 = (int)fifo[3];
|
||||||
|
if (fifo2<0) fifo2 *= -1;
|
||||||
|
if (fifo3<0) fifo3 *= -1;
|
||||||
|
rwp += ((fifo2+1)*(fifo3+1));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else if ((fifo[0] & 0xf0fc) == 0x7000) /* SCPY */
|
||||||
|
{
|
||||||
|
int src,ax;
|
||||||
|
|
||||||
|
ax = 2*fifo[3];
|
||||||
|
src = (((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4))*2;
|
||||||
|
rwp *= 2;
|
||||||
|
if (fifo[3] & 0x8000) { rwp += 1; src += 1; ax -= 1; } else { ax += 1; }
|
||||||
|
|
||||||
|
docpy(fifo[0],src,&rwp,ax,fifo[4]);
|
||||||
|
|
||||||
|
if (fifo[3] & 0x8000) rwp -= 1;
|
||||||
|
rwp /= 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
int fifo2 = (int)fifo[2],fifo3 = (int)fifo[3];
|
||||||
|
if (fifo2<0) fifo2 *= -1;
|
||||||
|
if (fifo3<0) fifo3 *= -1;
|
||||||
|
rwp += ((fifo2+1)*(fifo3+1));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else if (fifo[0] == 0x8000) /* AMOVE */
|
||||||
|
{
|
||||||
|
cpx = fifo[1];
|
||||||
|
cpy = fifo[2];
|
||||||
|
}
|
||||||
|
// else if ((fifo[0] & 0xff00) == 0x8800) /* ALINE */
|
||||||
|
else if ((fifo[0] & 0xfff8) == 0x8800) /* ALINE */
|
||||||
|
{
|
||||||
|
INT16 ex,ey,sx,sy;
|
||||||
|
INT16 ax,ay;
|
||||||
|
int dst;
|
||||||
|
|
||||||
|
sx = cpx;
|
||||||
|
sy = cpy;
|
||||||
|
ex = fifo[1];
|
||||||
|
ey = fifo[2];
|
||||||
|
|
||||||
|
ax = ex - sx;
|
||||||
|
ay = ey - sy;
|
||||||
|
|
||||||
|
if (abs(ax) >= abs(ay))
|
||||||
|
{
|
||||||
|
while (ax)
|
||||||
|
{
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ax > 0)
|
||||||
|
{
|
||||||
|
cpx++;
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cpx--;
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
cpy = sy + ay * (cpx - sx) / (ex - sx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (ay)
|
||||||
|
{
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ay > 0)
|
||||||
|
{
|
||||||
|
cpy++;
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cpy--;
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
cpx = sx + ax * (cpy - sy) / (ey - sy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// else if ((fifo[0] & 0xff00) == 0x9000) /* ARCT */
|
||||||
|
else if ((fifo[0] & 0xfff8) == 0x9000) /* ARCT */
|
||||||
|
{
|
||||||
|
INT16 pcx,pcy;
|
||||||
|
INT16 ax,ay;
|
||||||
|
int dst;
|
||||||
|
|
||||||
|
pcx = fifo[1];
|
||||||
|
pcy = fifo[2];
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
|
||||||
|
ax = pcx - cpx;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ax == 0) break;
|
||||||
|
else if (ax > 0)
|
||||||
|
{
|
||||||
|
dst = (dst + 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst - 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ay = pcy - cpy;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ay == 0) break;
|
||||||
|
else if (ay > 0)
|
||||||
|
{
|
||||||
|
dst = (dst - 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst + 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ax = cpx - pcx;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ax == 0) break;
|
||||||
|
else if (ax > 0)
|
||||||
|
{
|
||||||
|
dst = (dst + 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst - 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ay = cpy - pcy;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ay == 0) break;
|
||||||
|
else if (ay > 0)
|
||||||
|
{
|
||||||
|
dst = (dst - 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst + 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// else if ((fifo[0] & 0xff00) == 0xc000) /* AFRCT */
|
||||||
|
else if ((fifo[0] & 0xfff8) == 0xc000) /* AFRCT */
|
||||||
|
{
|
||||||
|
INT16 pcx,pcy;
|
||||||
|
INT16 ax,ay;
|
||||||
|
int dst;
|
||||||
|
|
||||||
|
pcx = fifo[1];
|
||||||
|
pcy = fifo[2];
|
||||||
|
ax = pcx - cpx;
|
||||||
|
ay = pcy - cpy;
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
|
||||||
|
if (ax == 0) break;
|
||||||
|
else if (ax > 0)
|
||||||
|
{
|
||||||
|
dst = (dst + 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst - 1) & (HD63484_RAM_SIZE-1);
|
||||||
|
ax++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ax = pcx - cpx;
|
||||||
|
if (pcy < cpy)
|
||||||
|
{
|
||||||
|
dst = (dst + 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst = (dst - 384 - ax) & (HD63484_RAM_SIZE-1);
|
||||||
|
if (ay == 0) break;
|
||||||
|
ay--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// else if ((fifo[0] & 0xff00) == 0xcc00) /* DOT */
|
||||||
|
else if ((fifo[0] & 0xfff8) == 0xcc00) /* DOT */
|
||||||
|
{
|
||||||
|
int dst;
|
||||||
|
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
|
||||||
|
PLOT(dst,fifo[0] & 0x0007)
|
||||||
|
}
|
||||||
|
// else if ((fifo[0] & 0xf000) == 0xe000) /* AGCPY */
|
||||||
|
else if ((fifo[0] & 0xf0f8) == 0xe000) /* AGCPY */
|
||||||
|
{
|
||||||
|
INT16 pcx,pcy;
|
||||||
|
int src,dst;
|
||||||
|
|
||||||
|
pcx = fifo[1];
|
||||||
|
pcy = fifo[2];
|
||||||
|
|
||||||
|
src = (2*org + pcx - pcy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
|
||||||
|
|
||||||
|
docpy(fifo[0],src,&dst,fifo[3],fifo[4]);
|
||||||
|
|
||||||
|
cpx = (dst - 2*org) % 384;
|
||||||
|
cpy = (dst - 2*org) / 384;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logerror("unsupported command\n");
|
||||||
|
popmessage("unsupported command %s (%04x)",instruction_name[fifo[0]>>10],fifo[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo_counter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int regno;
|
||||||
|
|
||||||
|
static READ16_HANDLER( HD63484_status_r )
|
||||||
|
{
|
||||||
|
if (activecpu_get_pc() != 0xfced6 && activecpu_get_pc() != 0xfe1d6) logerror("%05x: HD63484 status read\n",activecpu_get_pc());
|
||||||
|
return 0xff22|4; /* write FIFO ready + command end + read FIFO ready */
|
||||||
|
}
|
||||||
|
|
||||||
|
static WRITE16_HANDLER( HD63484_address_w )
|
||||||
|
{
|
||||||
|
/* only low 8 bits are used */
|
||||||
|
if (ACCESSING_BITS_0_7)
|
||||||
|
regno = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WRITE16_HANDLER( HD63484_data_w )
|
||||||
|
{
|
||||||
|
COMBINE_DATA(&HD63484_reg[regno/2]);
|
||||||
|
if (regno & 0x80) regno += 2; /* autoincrement */
|
||||||
|
logerror("PC %05x: HD63484 register %02x write %04x\n",activecpu_get_pc(),regno,HD63484_reg[regno/2]);
|
||||||
|
if (regno == 0) /* FIFO */
|
||||||
|
HD63484_command_w(HD63484_reg[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static READ16_HANDLER( HD63484_data_r )
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (regno == 0x80)
|
||||||
|
res = video_screen_get_vpos(machine->primary_screen);
|
||||||
|
else if (regno == 0)
|
||||||
|
{
|
||||||
|
logerror("%05x: HD63484 read FIFO\n",activecpu_get_pc());
|
||||||
|
res = readfifo;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logerror("%05x: HD63484 read register %02x\n",activecpu_get_pc(),regno);
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PALETTE_INIT( adp )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0;i < machine->config->total_colors;i++)
|
||||||
|
{
|
||||||
|
int bit0,bit1,bit2,r,g,b;
|
||||||
|
|
||||||
|
|
||||||
|
/* red component */
|
||||||
|
bit0 = (i >> 2) & 0x01;
|
||||||
|
bit1 = (i >> 3) & 0x01;
|
||||||
|
bit2 = (i >> 4) & 0x01;
|
||||||
|
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||||
|
/* green component */
|
||||||
|
bit0 = (i >> 5) & 0x01;
|
||||||
|
bit1 = (i >> 6) & 0x01;
|
||||||
|
bit2 = (i >> 7) & 0x01;
|
||||||
|
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||||
|
/* blue component */
|
||||||
|
bit0 = 0;
|
||||||
|
bit1 = (i >> 0) & 0x01;
|
||||||
|
bit2 = (i >> 1) & 0x01;
|
||||||
|
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||||
|
|
||||||
|
palette_set_color(machine,i,MAKE_RGB(r,g,b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static VIDEO_START(adp)
|
||||||
|
{
|
||||||
|
HD63484_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
static VIDEO_UPDATE(adp)
|
||||||
|
{
|
||||||
|
int x,y,b;
|
||||||
|
|
||||||
|
|
||||||
|
b = 2 * (((HD63484_reg[0xcc/2] & 0x000f) << 16) + HD63484_reg[0xce/2]);
|
||||||
|
for (y = 0;y < 280;y++)
|
||||||
|
{
|
||||||
|
for (x = 0 ; x<384 ; x++)
|
||||||
|
{
|
||||||
|
b &= (HD63484_RAM_SIZE-1);
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = HD63484_ram[b];
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((HD63484_reg[0x06/2] & 0x0300) == 0x0300)
|
||||||
|
{
|
||||||
|
int sy = (HD63484_reg[0x94/2] & 0x0fff) - (HD63484_reg[0x88/2] >> 8);
|
||||||
|
int h = HD63484_reg[0x96/2] & 0x0fff;
|
||||||
|
int sx = ((HD63484_reg[0x92/2] >> 8) - (HD63484_reg[0x84/2] >> 8)) * 4;
|
||||||
|
int w = (HD63484_reg[0x92/2] & 0xff) * 4;
|
||||||
|
if (sx < 0) sx = 0; /* not sure about this (shangha2 title screen) */
|
||||||
|
|
||||||
|
b = 2 * (((HD63484_reg[0xdc/2] & 0x000f) << 16) + HD63484_reg[0xde/2]);
|
||||||
|
|
||||||
|
for (y = sy ; y<sy+h && y<280 ; y++)
|
||||||
|
{
|
||||||
|
for (x = 0 ; x < 384 ; x++)
|
||||||
|
{
|
||||||
|
b &= (HD63484_RAM_SIZE-1);
|
||||||
|
if (x <= w && x + sx >= 0 && x+sx < 384)
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x+sx) = HD63484_ram[b];
|
||||||
|
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INPUT_PORTS_START( skattv )
|
static ADDRESS_MAP_START( skattv_mem, ADDRESS_SPACE_PROGRAM, 16 )
|
||||||
|
AM_RANGE(0x000000, 0x0fffff) AM_ROM
|
||||||
|
AM_RANGE(0x800080, 0x80009f) AM_NOP // sound?
|
||||||
|
AM_RANGE(0x8000a0, 0x8000a1) AM_READWRITE(HD63484_status_r, HD63484_address_w) // bad
|
||||||
|
AM_RANGE(0x8000a2, 0x8000a3) AM_READWRITE(HD63484_data_r, HD63484_data_w) // bad
|
||||||
|
AM_RANGE(0x800084, 0xffbfff) AM_RAM // used?
|
||||||
|
AM_RANGE(0xffc000, 0xffffff) AM_RAM
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static INPUT_PORTS_START( adp )
|
||||||
|
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
static MACHINE_DRIVER_START( skattv )
|
static MACHINE_DRIVER_START( adp )
|
||||||
MDRV_CPU_ADD("main", M68000, 8000000)
|
MDRV_CPU_ADD("main", M68000, 8000000)
|
||||||
MDRV_CPU_PROGRAM_MAP(skattv_mem, 0)
|
MDRV_CPU_PROGRAM_MAP(skattv_mem, 0)
|
||||||
|
|
||||||
|
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(60)
|
MDRV_SCREEN_REFRESH_RATE(60)
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
||||||
@ -168,8 +925,9 @@ static MACHINE_DRIVER_START( skattv )
|
|||||||
MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
||||||
MDRV_PALETTE_LENGTH(0x100)
|
MDRV_PALETTE_LENGTH(0x100)
|
||||||
|
|
||||||
MDRV_VIDEO_START(skattv)
|
MDRV_PALETTE_INIT(adp)
|
||||||
MDRV_VIDEO_UPDATE(skattv)
|
MDRV_VIDEO_START(adp)
|
||||||
|
MDRV_VIDEO_UPDATE(adp)
|
||||||
|
|
||||||
MDRV_SPEAKER_STANDARD_MONO("mono")
|
MDRV_SPEAKER_STANDARD_MONO("mono")
|
||||||
MDRV_SOUND_ADD("ay", AY8910, 3686400/2)
|
MDRV_SOUND_ADD("ay", AY8910, 3686400/2)
|
||||||
@ -232,9 +990,9 @@ ROM_START( fashiong )
|
|||||||
ROM_LOAD16_BYTE( "m48z08posz.bin", 0x0001, 0x2000, CRC(7c5a4b78) SHA1(262d0d7f5b24e356ab54eb2450bbaa90e3fb5464) )
|
ROM_LOAD16_BYTE( "m48z08posz.bin", 0x0001, 0x2000, CRC(7c5a4b78) SHA1(262d0d7f5b24e356ab54eb2450bbaa90e3fb5464) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
GAME( 1990, backgamn, 0, skattv, skattv, 0, ROT0, "ADP", "Backgammon", GAME_NOT_WORKING )
|
GAME( 1990, backgamn, 0, adp, adp, 0, ROT0, "ADP", "Backgammon", GAME_NOT_WORKING )
|
||||||
GAME( 1993, quickjac, 0, skattv, skattv, 0, ROT0, "ADP", "Quick Jack", GAME_NOT_WORKING )
|
GAME( 1993, quickjac, 0, adp, adp, 0, ROT0, "ADP", "Quick Jack", GAME_NOT_WORKING )
|
||||||
GAME( 1994, skattv, 0, skattv, skattv, 0, ROT0, "ADP", "Skat TV", GAME_NOT_WORKING )
|
GAME( 1994, skattv, 0, adp, adp, 0, ROT0, "ADP", "Skat TV", GAME_NOT_WORKING )
|
||||||
GAME( 1995, skattva, skattv, skattv, skattv, 0, ROT0, "ADP", "Skat TV (version TS3)", GAME_NOT_WORKING )
|
GAME( 1995, skattva, skattv, adp, adp, 0, ROT0, "ADP", "Skat TV (version TS3)", GAME_NOT_WORKING )
|
||||||
GAME( 1997, fashiong, 0, skattv, skattv, 0, ROT0, "ADP", "Fashion Gambler", GAME_NOT_WORKING )
|
GAME( 1997, fashiong, 0, adp, adp, 0, ROT0, "ADP", "Fashion Gambler", GAME_NOT_WORKING )
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user