use last version of HD63484 (like shanghai driver)

This commit is contained in:
Roberto Zandona 2008-08-12 12:23:24 +00:00
parent 526be2629c
commit d6269d15fa

View File

@ -137,18 +137,20 @@ 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 int get_pixel(int x,int y);
#define FIFO_LENGTH 50 #define FIFO_LENGTH 50
#define HD63484_RAM_SIZE 0x200000 #define HD63484_RAM_SIZE 0x100000
static int fifo_counter; static int fifo_counter;
static UINT16 fifo[FIFO_LENGTH]; static UINT16 fifo[FIFO_LENGTH];
static UINT16 readfifo; static UINT16 readfifo;
static UINT8 *HD63484_ram; static UINT16 *HD63484_ram;
static UINT16 HD63484_reg[256/2]; static UINT16 HD63484_reg[256/2];
static int org,rwp; static int org,org_dpd,rwp;
static UINT16 cl0,cl1,ccmp; static UINT16 cl0,cl1,ccmp,edg,mask,ppy,pzcy,ppx,pzcs,psy,psx,pey,pzy,pex,pzx,xmin,ymin,xmax,ymax,rwp_dn;
static INT16 cpx,cpy; static INT16 cpx,cpy;
static const int instruction_length[64] = static const int instruction_length[64] =
{ {
0, 3, 2, 1, /* 0x */ 0, 3, 2, 1, /* 0x */
@ -196,7 +198,7 @@ static void HD63484_start(void)
memset(HD63484_ram,0,HD63484_RAM_SIZE); memset(HD63484_ram,0,HD63484_RAM_SIZE);
} }
static void doclr(int opcode,UINT16 fill,int *dst,INT16 _ax,INT16 _ay) static void doclr16(int opcode,UINT16 fill,int *dst,INT16 _ax,INT16 _ay)
{ {
INT16 ax,ay; INT16 ax,ay;
@ -210,13 +212,17 @@ static void doclr(int opcode,UINT16 fill,int *dst,INT16 _ax,INT16 _ay)
switch (opcode & 0x0003) switch (opcode & 0x0003)
{ {
case 0: case 0:
HD63484_ram[*dst] = fill; break; HD63484_ram[*dst] = fill;
break;
case 1: case 1:
HD63484_ram[*dst] |= fill; break; HD63484_ram[*dst] |= fill;
break;
case 2: case 2:
HD63484_ram[*dst] &= fill; break; HD63484_ram[*dst] &= fill;
break;
case 3: case 3:
HD63484_ram[*dst] ^= fill; break; HD63484_ram[*dst] ^= fill;
break;
} }
if (ax == 0) break; if (ax == 0) break;
else if (ax > 0) else if (ax > 0)
@ -234,20 +240,20 @@ static void doclr(int opcode,UINT16 fill,int *dst,INT16 _ax,INT16 _ay)
ax = _ax; ax = _ax;
if (_ay < 0) if (_ay < 0)
{ {
*dst = (*dst + 384 - ax) & (HD63484_RAM_SIZE-1); *dst = (*dst + (HD63484_reg[0xca/2] & 0x0fff) - ax) & (HD63484_RAM_SIZE-1);
if (ay == 0) break; if (ay == 0) break;
ay++; ay++;
} }
else else
{ {
*dst = (*dst - 384 - ax) & (HD63484_RAM_SIZE-1); *dst = (*dst - (HD63484_reg[0xca/2] & 0x0fff) - ax) & (HD63484_RAM_SIZE-1);
if (ay == 0) break; if (ay == 0) break;
ay--; ay--;
} }
} }
} }
static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay) static void docpy16(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
{ {
int dstep1,dstep2; int dstep1,dstep2;
int ax = _ax; int ax = _ax;
@ -256,14 +262,14 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
switch (opcode & 0x0700) switch (opcode & 0x0700)
{ {
default: default:
case 0x0000: dstep1 = 1; dstep2 = -384 - ax * dstep1; break; case 0x0000: dstep1 = 1; dstep2 = -1 * (HD63484_reg[0xca/2] & 0x0fff) - ax * dstep1; break;
case 0x0100: dstep1 = 1; dstep2 = 384 - ax * dstep1; break; case 0x0100: dstep1 = 1; dstep2 = (HD63484_reg[0xca/2] & 0x0fff) - ax * dstep1; break;
case 0x0200: dstep1 = -1; dstep2 = -384 + ax * dstep1; break; case 0x0200: dstep1 = -1; dstep2 = -1 * (HD63484_reg[0xca/2] & 0x0fff) + ax * dstep1; break;
case 0x0300: dstep1 = -1; dstep2 = 384 + ax * dstep1; break; case 0x0300: dstep1 = -1; dstep2 = (HD63484_reg[0xca/2] & 0x0fff) + ax * dstep1; break;
case 0x0400: dstep1 = -384; dstep2 = 1 - ay * dstep1; break; case 0x0400: dstep1 = -1 * (HD63484_reg[0xca/2] & 0x0fff); dstep2 = 1 - ay * dstep1; break;
case 0x0500: dstep1 = 384; dstep2 = 1 - ay * dstep1; break; case 0x0500: dstep1 = (HD63484_reg[0xca/2] & 0x0fff); dstep2 = 1 - ay * dstep1; break;
case 0x0600: dstep1 = -384; dstep2 = -1 + ay * dstep1; break; case 0x0600: dstep1 = -1 * (HD63484_reg[0xca/2] & 0x0fff); dstep2 = -1 + ay * dstep1; break;
case 0x0700: dstep1 = 384; dstep2 = -1 + ay * dstep1; break; // used by kothello case 0x0700: dstep1 = (HD63484_reg[0xca/2] & 0x0fff); dstep2 = -1 + ay * dstep1; break;
} }
for (;;) for (;;)
@ -273,13 +279,17 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
switch (opcode & 0x0007) switch (opcode & 0x0007)
{ {
case 0: case 0:
HD63484_ram[*dst] = HD63484_ram[src]; break; HD63484_ram[*dst] = HD63484_ram[src];
break;
case 1: case 1:
HD63484_ram[*dst] |= HD63484_ram[src]; break; HD63484_ram[*dst] |= HD63484_ram[src];
break;
case 2: case 2:
HD63484_ram[*dst] &= HD63484_ram[src]; break; HD63484_ram[*dst] &= HD63484_ram[src];
break;
case 3: case 3:
HD63484_ram[*dst] ^= HD63484_ram[src]; break; HD63484_ram[*dst] ^= HD63484_ram[src];
break;
case 4: case 4:
if (HD63484_ram[*dst] == (ccmp & 0xff)) if (HD63484_ram[*dst] == (ccmp & 0xff))
HD63484_ram[*dst] = HD63484_ram[src]; HD63484_ram[*dst] = HD63484_ram[src];
@ -303,13 +313,13 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
if (ay == 0) break; if (ay == 0) break;
if (_ay > 0) if (_ay > 0)
{ {
src = (src - 384) & (HD63484_RAM_SIZE-1); src = (src - (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
ay--; ay--;
} }
else else
{ {
src = (src + 384) & (HD63484_RAM_SIZE-1); src = (src + (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep1) & (HD63484_RAM_SIZE-1);
ay++; ay++;
} }
@ -337,14 +347,14 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
ay = _ay; ay = _ay;
if (_ax < 0) if (_ax < 0)
{ {
src = (src - 1 + ay * 384) & (HD63484_RAM_SIZE-1); src = (src - 1 + ay * (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
if (ax == 0) break; if (ax == 0) break;
ax++; ax++;
} }
else else
{ {
src = (src + 1 - ay * 384) & (HD63484_RAM_SIZE-1); src = (src + 1 - ay * (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
if (ax == 0) break; if (ax == 0) break;
ax--; ax--;
@ -355,14 +365,14 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
ax = _ax; ax = _ax;
if (_ay < 0) if (_ay < 0)
{ {
src = (src + 384 - ax) & (HD63484_RAM_SIZE-1); src = (src + (HD63484_reg[0xca/2] & 0x0fff) - ax) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
if (ay == 0) break; if (ay == 0) break;
ay++; ay++;
} }
else else
{ {
src = (src - 384 - ax) & (HD63484_RAM_SIZE-1); src = (src - (HD63484_reg[0xca/2] & 0x0fff) - ax) & (HD63484_RAM_SIZE-1);
*dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1); *dst = (*dst + dstep2) & (HD63484_RAM_SIZE-1);
if (ay == 0) break; if (ay == 0) break;
ay--; ay--;
@ -371,38 +381,287 @@ static void docpy(int opcode,int src,int *dst,INT16 _ax,INT16 _ay)
} }
} }
static int org_first_pixel(int _org_dpd)
{
int gbm = (HD63484_reg[0x02/2] & 0x700) >> 8;
switch (gbm)
{
case 0:
return (_org_dpd & 0x0f);
case 1:
return (_org_dpd & 0x0e) >> 1;
case 2:
return (_org_dpd & 0x0c) >> 2;
case 3:
return (_org_dpd & 0x08) >> 3;
case 4:
return 0;
#define PLOT(addr,OPM) \ default:
switch (OPM) \ logerror ("Graphic bit mode not supported\n");
{ \ return 0;
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 dot(int x, int y, int opm, UINT16 color)
{
int dst, x_int, x_mod, bpp;
UINT16 color_shifted, bitmask, bitmask_shifted;
x += org_first_pixel(org_dpd);
switch ((HD63484_reg[0x02/2] & 0x700) >> 8)
{
case 0:
bpp = 1;
bitmask = 0x0001;
break;
case 1:
bpp = 2;
bitmask = 0x0003;
break;
case 2:
bpp = 4;
bitmask = 0x000f;
break;
case 3:
bpp = 8;
bitmask = 0x00ff;
break;
case 4:
bpp = 16;
bitmask = 0xffff;
break;
default:
bpp = 0;
bitmask = 0x0000;
logerror ("Graphic bit mode not supported\n");
}
if (x >= 0)
{
x_int = x / (16 / bpp);
x_mod = x % (16 / bpp);
}
else
{
x_int = x / (16 / bpp);
x_mod = -1 * (x % (16 / bpp));
if (x_mod) {
x_int--;
x_mod = (16 / bpp) - x_mod;
}
}
color &= bitmask;
bitmask_shifted = bitmask << (x_mod * bpp);
color_shifted = color << (x_mod * bpp);
dst = (org + x_int - y * (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
switch (opm)
{
case 0:
HD63484_ram[dst] = (HD63484_ram[dst] & ~bitmask_shifted) | color_shifted;
break;
case 1:
HD63484_ram[dst] = HD63484_ram[dst] | color_shifted;
break;
case 2:
HD63484_ram[dst] = HD63484_ram[dst] & ((HD63484_ram[dst] & ~bitmask_shifted) | color_shifted);
break;
case 3:
HD63484_ram[dst] = HD63484_ram[dst] ^ color_shifted;
break;
case 4:
if (get_pixel(x,y) == (ccmp & bitmask))
HD63484_ram[dst] = (HD63484_ram[dst] & ~bitmask_shifted) | color_shifted;
break;
case 5:
if (get_pixel(x,y) != (ccmp & bitmask))
HD63484_ram[dst] = (HD63484_ram[dst] & ~bitmask_shifted) | color_shifted;
break;
case 6:
if (get_pixel(x,y) < (cl0 & bitmask))
HD63484_ram[dst] = (HD63484_ram[dst] & ~bitmask_shifted) | color_shifted;
break;
case 7:
if (get_pixel(x,y) > (cl0 & bitmask))
HD63484_ram[dst] = (HD63484_ram[dst] & ~bitmask_shifted) | color_shifted;
break;
}
}
static int get_pixel(int x,int y)
{
int dst, x_int, x_mod, bpp;
UINT16 bitmask, bitmask_shifted;
switch ((HD63484_reg[0x02/2] & 0x700) >> 8)
{
case 0:
bpp = 1;
bitmask = 0x0001;
break;
case 1:
bpp = 2;
bitmask = 0x0003;
break;
case 2:
bpp = 4;
bitmask = 0x000f;
break;
case 3:
bpp = 8;
bitmask = 0x00ff;
break;
case 4:
bpp = 16;
bitmask = 0xffff;
break;
default:
bpp = 0;
bitmask = 0x0000;
logerror ("Graphic bit mode not supported\n");
}
if (x >= 0)
{
x_int = x / (16 / bpp);
x_mod = x % (16 / bpp);
}
else
{
x_int = x / (16 / bpp);
x_mod = -1 * (x % (16 / bpp));
if (x_mod) {
x_int--;
x_mod = (16 / bpp) - x_mod;
}
}
bitmask_shifted = bitmask << (x_mod * bpp);
dst = (org + x_int - y * (HD63484_reg[0xca/2] & 0x0fff)) & (HD63484_RAM_SIZE-1);
return ((HD63484_ram[dst] & bitmask_shifted) >> (x_mod * bpp));
}
static void agcpy(int opcode,int src_x,int src_y,int dst_x,int dst_y,INT16 _ax,INT16 _ay)
{
int step1_x,step1_y,step2_x,step2_y;
int ax = _ax;
int ay = _ay;
int xxs = src_x;
int yys = src_y;
int xxd = dst_x;
int yyd = dst_y;
switch (opcode & 0x0700)
{
default:
case 0x0000: step1_x = 1; step1_y = 0; step2_x = -ax; step2_y = 1; break;
case 0x0100: step1_x = 1; step1_y = 0; step2_x = -ax; step2_y = -1; break;
case 0x0200: step1_x = -1; step1_y = 0; step2_x = ax; step2_y = 1; break;
case 0x0300: step1_x = -1; step1_y = 0; step2_x = ax; step2_y = -1; break;
case 0x0400: step1_x = 0; step1_y = 1; step2_x = 1; step2_y = ay; break;
case 0x0500: step1_x = 0; step1_y = -1; step2_x = 1; step2_y = -ay; break;
case 0x0600: step1_x = 0; step1_y = 1; step2_x = -1; step2_y = ay; break;
case 0x0700: step1_x = 0; step1_y = -1; step2_x = -1; step2_y = -ay; break;
}
for (;;)
{
for (;;)
{
dot(xxd,yyd,opcode & 0x0007,get_pixel(xxs,yys));
if (opcode & 0x0800)
{
if (ay == 0) break;
if (_ay > 0)
{
yys++;
xxd += step1_x;
yyd += step1_y;
ay--;
}
else
{
yys--;
xxd += step1_x;
yyd += step1_y;
ay++;
}
}
else
{
if (ax == 0) break;
else if (ax > 0)
{
xxs++;
xxd += step1_x;
yyd += step1_y;
ax--;
}
else
{
xxs--;
xxd += step1_x;
yyd += step1_y;
ax++;
}
}
}
if (opcode & 0x0800)
{
ay = _ay;
if (_ax < 0)
{
xxs--;
yys -= ay;
xxd += step2_x;
yyd += step2_y;
if (ax == 0) break;
ax++;
}
else
{
xxs++;
yys += ay;
xxd += step2_x;
yyd += step2_y;
if (ax == 0) break;
ax--;
}
}
else
{
ax = _ax;
if (_ay < 0)
{
xxs -= ax;
yys--;
xxd += step2_x;
yyd += step2_y;
if (ay == 0) break;
ay++;
}
else
{
xxs -= ax;
yys++;
xxd += step2_x;
yyd += step2_y;
if (ay == 0) break;
ay--;
}
}
}
}
static void HD63484_command_w(UINT16 cmd) static void HD63484_command_w(UINT16 cmd)
{ {
@ -433,6 +692,7 @@ static void HD63484_command_w(UINT16 cmd)
if (fifo[0] == 0x0400) { /* ORG */ if (fifo[0] == 0x0400) { /* ORG */
org = ((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4); org = ((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4);
org_dpd = fifo[2] & 0x000f;
} }
else if ((fifo[0] & 0xffe0) == 0x0800) /* WPR */ else if ((fifo[0] & 0xffe0) == 0x0800) /* WPR */
{ {
@ -442,8 +702,42 @@ static void HD63484_command_w(UINT16 cmd)
cl1 = fifo[1]; cl1 = fifo[1];
else if (fifo[0] == 0x0802) else if (fifo[0] == 0x0802)
ccmp = fifo[1]; ccmp = fifo[1];
else if (fifo[0] == 0x0803)
edg = fifo[1];
else if (fifo[0] == 0x0804)
mask = fifo[1];
else if (fifo[0] == 0x0805)
{
ppy = (fifo[1] & 0xf000) >> 12;
pzcy = (fifo[1] & 0x0f00) >> 8;
ppx = (fifo[1] & 0x00f0) >> 4;
pzcs = (fifo[1] & 0x000f) >> 0;
}
else if (fifo[0] == 0x0806)
{
psy = (fifo[1] & 0xf000) >> 12;
psx = (fifo[1] & 0x00f0) >> 4;
}
else if (fifo[0] == 0x0807)
{
pey = (fifo[1] & 0xf000) >> 12;
pzy = (fifo[1] & 0x0f00) >> 8;
pex = (fifo[1] & 0x00f0) >> 4;
pzx = (fifo[1] & 0x000f) >> 0;
}
else if (fifo[0] == 0x0808)
xmin = fifo[1];
else if (fifo[0] == 0x0809)
ymin = fifo[1];
else if (fifo[0] == 0x080a)
xmax = fifo[1];
else if (fifo[0] == 0x080b)
ymax = fifo[1];
else if (fifo[0] == 0x080c) else if (fifo[0] == 0x080c)
{
rwp = (rwp & 0x00fff) | ((fifo[1] & 0x00ff) << 12); rwp = (rwp & 0x00fff) | ((fifo[1] & 0x00ff) << 12);
rwp_dn = (fifo[1] & 0xc000) >> 14;
}
else if (fifo[0] == 0x080d) else if (fifo[0] == 0x080d)
rwp = (rwp & 0xff000) | ((fifo[1] & 0xfff0) >> 4); rwp = (rwp & 0xff000) | ((fifo[1] & 0xfff0) >> 4);
else else
@ -455,26 +749,17 @@ logerror("unsupported register\n");
} }
else if (fifo[0] == 0x4400) /* RD */ else if (fifo[0] == 0x4400) /* RD */
{ {
readfifo = HD63484_ram[2*rwp] | (HD63484_ram[2*rwp+1] << 8); readfifo = HD63484_ram[rwp];
rwp = (rwp + 1) & (HD63484_RAM_SIZE/2-1); rwp = (rwp + 1) & (HD63484_RAM_SIZE-1);
} }
else if (fifo[0] == 0x4800) /* WT */ else if (fifo[0] == 0x4800) /* WT */
{ {
HD63484_ram[2*rwp] = fifo[1] & 0x00ff ; HD63484_ram[rwp] = fifo[1];
HD63484_ram[2*rwp+1] = (fifo[1] & 0xff00) >> 8; rwp = (rwp + 1) & (HD63484_RAM_SIZE-1);
rwp = (rwp + 1) & (HD63484_RAM_SIZE/2-1);
} }
else if (fifo[0] == 0x5800) /* CLR */ else if (fifo[0] == 0x5800) /* CLR */
{ {
int ax = 2*fifo[2]; doclr16(fifo[0],fifo[1],&rwp,fifo[2],fifo[3]);
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;
/* /*
{ {
@ -487,15 +772,7 @@ logerror("unsupported register\n");
} }
else if ((fifo[0] & 0xfffc) == 0x5c00) /* SCLR */ else if ((fifo[0] & 0xfffc) == 0x5c00) /* SCLR */
{ {
int ax = 2*fifo[2]; doclr16(fifo[0],fifo[1],&rwp,fifo[2],fifo[3]);
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;
/* /*
{ {
@ -508,17 +785,7 @@ logerror("unsupported register\n");
} }
else if ((fifo[0] & 0xf0ff) == 0x6000) /* CPY */ else if ((fifo[0] & 0xf0ff) == 0x6000) /* CPY */
{ {
int src,ax; docpy16(fifo[0],((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4),&rwp,fifo[3],fifo[4]);
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;
/* /*
{ {
@ -531,17 +798,7 @@ logerror("unsupported register\n");
} }
else if ((fifo[0] & 0xf0fc) == 0x7000) /* SCPY */ else if ((fifo[0] & 0xf0fc) == 0x7000) /* SCPY */
{ {
int src,ax; docpy16(fifo[0],((fifo[1] & 0x00ff) << 12) | ((fifo[2] & 0xfff0) >> 4),&rwp,fifo[3],fifo[4]);
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;
/* /*
{ {
@ -557,12 +814,10 @@ logerror("unsupported register\n");
cpx = fifo[1]; cpx = fifo[1];
cpy = fifo[2]; cpy = fifo[2];
} }
// else if ((fifo[0] & 0xff00) == 0x8800) /* ALINE */
else if ((fifo[0] & 0xfff8) == 0x8800) /* ALINE */ else if ((fifo[0] & 0xfff8) == 0x8800) /* ALINE */
{ {
INT16 ex,ey,sx,sy; INT16 ex,ey,sx,sy;
INT16 ax,ay; INT16 ax,ay;
int dst;
sx = cpx; sx = cpx;
sy = cpy; sy = cpy;
@ -576,8 +831,7 @@ logerror("unsupported register\n");
{ {
while (ax) while (ax)
{ {
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1); dot(cpx,cpy,fifo[0] & 0x0007,cl0);
PLOT(dst,fifo[0] & 0x0007)
if (ax > 0) if (ax > 0)
{ {
@ -596,8 +850,7 @@ logerror("unsupported register\n");
{ {
while (ay) while (ay)
{ {
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1); dot(cpx,cpy,fifo[0] & 0x0007,cl0);
PLOT(dst,fifo[0] & 0x0007)
if (ay > 0) if (ay > 0)
{ {
@ -613,31 +866,31 @@ logerror("unsupported register\n");
} }
} }
} }
// else if ((fifo[0] & 0xff00) == 0x9000) /* ARCT */
else if ((fifo[0] & 0xfff8) == 0x9000) /* ARCT */ else if ((fifo[0] & 0xfff8) == 0x9000) /* ARCT */
{ {
INT16 pcx,pcy; INT16 pcx,pcy;
INT16 ax,ay; INT16 ax,ay,xx,yy;
int dst;
pcx = fifo[1]; pcx = fifo[1];
pcy = fifo[2]; pcy = fifo[2];
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1);
xx = cpx;
yy = cpy;
ax = pcx - cpx; ax = pcx - cpx;
for (;;) for (;;)
{ {
PLOT(dst,fifo[0] & 0x0007) dot(xx,yy,fifo[0] & 0x0007,cl0);
if (ax == 0) break; if (ax == 0) break;
else if (ax > 0) else if (ax > 0)
{ {
dst = (dst + 1) & (HD63484_RAM_SIZE-1); xx++;
ax--; ax--;
} }
else else
{ {
dst = (dst - 1) & (HD63484_RAM_SIZE-1); xx--;
ax++; ax++;
} }
} }
@ -645,17 +898,17 @@ logerror("unsupported register\n");
ay = pcy - cpy; ay = pcy - cpy;
for (;;) for (;;)
{ {
PLOT(dst,fifo[0] & 0x0007) dot(xx,yy,fifo[0] & 0x0007,cl0);
if (ay == 0) break; if (ay == 0) break;
else if (ay > 0) else if (ay > 0)
{ {
dst = (dst - 384) & (HD63484_RAM_SIZE-1); yy++;
ay--; ay--;
} }
else else
{ {
dst = (dst + 384) & (HD63484_RAM_SIZE-1); yy--;
ay++; ay++;
} }
} }
@ -663,17 +916,17 @@ logerror("unsupported register\n");
ax = cpx - pcx; ax = cpx - pcx;
for (;;) for (;;)
{ {
PLOT(dst,fifo[0] & 0x0007) dot(xx,yy,fifo[0] & 0x0007,cl0);
if (ax == 0) break; if (ax == 0) break;
else if (ax > 0) else if (ax > 0)
{ {
dst = (dst + 1) & (HD63484_RAM_SIZE-1); xx++;
ax--; ax--;
} }
else else
{ {
dst = (dst - 1) & (HD63484_RAM_SIZE-1); xx--;
ax++; ax++;
} }
} }
@ -681,49 +934,49 @@ logerror("unsupported register\n");
ay = cpy - pcy; ay = cpy - pcy;
for (;;) for (;;)
{ {
PLOT(dst,fifo[0] & 0x0007) dot(xx,yy,fifo[0] & 0x0007,cl0);
if (ay == 0) break; if (ay == 0) break;
else if (ay > 0) else if (ay > 0)
{ {
dst = (dst - 384) & (HD63484_RAM_SIZE-1); yy++;
ay--; ay--;
} }
else else
{ {
dst = (dst + 384) & (HD63484_RAM_SIZE-1); yy--;
ay++; ay++;
} }
} }
} }
// else if ((fifo[0] & 0xff00) == 0xc000) /* AFRCT */
else if ((fifo[0] & 0xfff8) == 0xc000) /* AFRCT */ else if ((fifo[0] & 0xfff8) == 0xc000) /* AFRCT */
{ {
INT16 pcx,pcy; INT16 pcx,pcy;
INT16 ax,ay; INT16 ax,ay,xx,yy;
int dst;
pcx = fifo[1]; pcx = fifo[1];
pcy = fifo[2]; pcy = fifo[2];
ax = pcx - cpx; ax = pcx - cpx;
ay = pcy - cpy; ay = pcy - cpy;
dst = (2*org + cpx - cpy * 384) & (HD63484_RAM_SIZE-1); xx = cpx;
yy = cpy;
for (;;) for (;;)
{ {
for (;;) for (;;)
{ {
PLOT(dst,fifo[0] & 0x0007) dot(xx,yy,fifo[0] & 0x0007,cl0);
if (ax == 0) break; if (ax == 0) break;
else if (ax > 0) else if (ax > 0)
{ {
dst = (dst + 1) & (HD63484_RAM_SIZE-1); xx++;
ax--; ax--;
} }
else else
{ {
dst = (dst - 1) & (HD63484_RAM_SIZE-1); xx--;
ax++; ax++;
} }
} }
@ -731,43 +984,30 @@ logerror("unsupported register\n");
ax = pcx - cpx; ax = pcx - cpx;
if (pcy < cpy) if (pcy < cpy)
{ {
dst = (dst + 384 - ax) & (HD63484_RAM_SIZE-1); yy--;
xx -= ax;
if (ay == 0) break; if (ay == 0) break;
ay++; ay++;
} }
else else
{ {
dst = (dst - 384 - ax) & (HD63484_RAM_SIZE-1); yy++;
xx -= ax;
if (ay == 0) break; if (ay == 0) break;
ay--; ay--;
} }
} }
} }
// else if ((fifo[0] & 0xff00) == 0xcc00) /* DOT */
else if ((fifo[0] & 0xfff8) == 0xcc00) /* DOT */ else if ((fifo[0] & 0xfff8) == 0xcc00) /* DOT */
{ {
int dst; dot(cpx,cpy,fifo[0] & 0x0007,cl0);
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 */ else if ((fifo[0] & 0xf0f8) == 0xe000) /* AGCPY */
{ {
INT16 pcx,pcy; agcpy(fifo[0],fifo[1],fifo[2],cpx,cpy,fifo[3],fifo[4]);
int src,dst;
pcx = fifo[1]; cpx += fifo[3];
pcy = fifo[2]; cpy += fifo[4];
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 else
{ {
@ -862,14 +1102,14 @@ static VIDEO_UPDATE(adp)
{ {
int x,y,b; int x,y,b;
b = ((HD63484_reg[0xcc/2] & 0x000f) << 16) + HD63484_reg[0xce/2];
b = 2 * (((HD63484_reg[0xcc/2] & 0x000f) << 16) + HD63484_reg[0xce/2]);
for (y = 0;y < 280;y++) for (y = 0;y < 280;y++)
{ {
for (x = 0 ; x<384 ; x++) for (x = 0 ; x<(HD63484_reg[0xca/2] & 0x0fff) * 2 ; x += 2)
{ {
b &= (HD63484_RAM_SIZE-1); b &= (HD63484_RAM_SIZE-1);
*BITMAP_ADDR16(bitmap, y, x) = HD63484_ram[b]; *BITMAP_ADDR16(bitmap, y, x) = HD63484_ram[b] & 0x00ff;
*BITMAP_ADDR16(bitmap, y, x+1) = (HD63484_ram[b] & 0xff00) >> 8;
b++; b++;
} }
} }
@ -880,18 +1120,20 @@ static VIDEO_UPDATE(adp)
int h = HD63484_reg[0x96/2] & 0x0fff; int h = HD63484_reg[0x96/2] & 0x0fff;
int sx = ((HD63484_reg[0x92/2] >> 8) - (HD63484_reg[0x84/2] >> 8)) * 4; int sx = ((HD63484_reg[0x92/2] >> 8) - (HD63484_reg[0x84/2] >> 8)) * 4;
int w = (HD63484_reg[0x92/2] & 0xff) * 4; int w = (HD63484_reg[0x92/2] & 0xff) * 4;
if (sx < 0) sx = 0; /* not sure about this (shangha2 title screen) */ if (sx < 0) sx = 0; // not sure about this (shangha2 title screen)
b = 2 * (((HD63484_reg[0xdc/2] & 0x000f) << 16) + HD63484_reg[0xde/2]); b = (((HD63484_reg[0xdc/2] & 0x000f) << 16) + HD63484_reg[0xde/2]);
for (y = sy ; y<sy+h && y<280 ; y++) for (y = sy ; y <= sy + h && y < 280 ; y++)
{ {
for (x = 0 ; x < 384 ; x++) for (x = 0 ; x < (HD63484_reg[0xca/2] & 0x0fff) * 2 ; x += 2)
{ {
b &= (HD63484_RAM_SIZE-1); b &= (HD63484_RAM_SIZE - 1);
if (x <= w && x + sx >= 0 && x+sx < 384) if (x <= w && x + sx >= 0 && x + sx < (HD63484_reg[0xca/2] & 0x0fff) * 2)
*BITMAP_ADDR16(bitmap, y, x+sx) = HD63484_ram[b]; {
*BITMAP_ADDR16(bitmap, y, x + sx) = HD63484_ram[b] & 0x00ff;
*BITMAP_ADDR16(bitmap, y, x + sx + 1) = (HD63484_ram[b] & 0xff00) >> 8;
}
b++; b++;
} }
} }