Add preliminary Namco System 2 driver - please use frequent check-ins if you are working on this!

This commit is contained in:
iq_132 2017-06-03 20:43:40 +00:00
parent 814ef16340
commit 509717a744
6 changed files with 6866 additions and 3 deletions

View File

@ -62,7 +62,7 @@ drvobj = d_dodonpachi.o d_donpachi.o d_esprade.o d_feversos.o d_gaia.o d_guwang
d_1945kiii.o d_aerofgt.o d_airbustr.o d_aquarium.o d_bestleag.o d_bigstrkb.o d_blmbycar.o d_bloodbro.o d_crospang.o d_crshrace.o d_dcon.o \
d_ddragon3.o d_deniam.o d_diverboy.o d_dooyong.o d_dreamwld.o d_drgnmst.o d_drtomy.o d_egghunt.o d_esd16.o d_f1gp.o d_funybubl.o d_fuukifg2.o \
d_fuukifg3.o d_gaelco.o d_gaelco2.o d_gaiden.o d_galpanic.o d_galspnbl.o d_gotcha.o d_gumbo.o d_hyperpac.o d_jchan.o d_kaneko16.o d_lordgun.o \
d_macrossp.o d_mcatadv.o d_metro.o d_midas.o d_mugsmash.o d_mwarr.o d_news.o d_nmg5.o d_nmk16.o d_ohmygod.o d_onetwo.o d_pass.o d_pirates.o \
d_macrossp.o d_mcatadv.o d_metro.o d_midas.o d_mugsmash.o d_mwarr.o d_namcos2.o d_news.o d_nmg5.o d_nmk16.o d_ohmygod.o d_onetwo.o d_pass.o d_pirates.o \
d_playmark.o d_powerins.o d_pushman.o d_raiden.o d_raiden2.o d_sandscrp.o d_seta.o d_seta2.o d_shadfrce.o d_silkroad.o d_silvmil.o d_speedspn.o \
d_ssv.o d_suna16.o d_suprnova.o d_taotaido.o d_tecmo16.o d_tecmosys.o d_tetrisp2.o d_tumbleb.o d_unico.o d_vmetal.o d_welltris.o d_wwfwfest.o \
d_xorworld.o d_yunsun16.o d_yunsung8.o d_zerozone.o \
@ -92,8 +92,8 @@ depobj := $(drvobj) \
burn.o burn_gun.o burn_led.o burn_shift.o burn_memory.o burn_pal.o burn_sound.o burn_sound_c.o cheat.o debug_track.o hiscore.o load.o \
tilemap_generic.o tiles_generic.o timer.o vector.o \
\
6821pia.o 8255ppi.o 8257dma.o eeprom.o gaelco_crypt.o joyprocess.o nb1414m4.o nb1414m4_8bit.o nmk004.o nmk112.o kaneko_tmap.o mb87078.o mermaid.o \
namcoio.o pandora.o resnet.o seibusnd.o sknsspr.o slapstic.o st0020.o t5182.o timekpr.o tms34061.o v3021.o vdc.o tms9928a.o \
6821pia.o 8255ppi.o 8257dma.o c169.0 eeprom.o gaelco_crypt.o joyprocess.o nb1414m4.o nb1414m4_8bit.o nmk004.o nmk112.o kaneko_tmap.o mb87078.o \
mermaid.o namco_c45.o namcoio.o pandora.o resnet.o seibusnd.o sknsspr.o slapstic.o st0020.o t5182.o timekpr.o tms34061.o v3021.o vdc.o tms9928a.o \
\
ay8910.o burn_y8950.o burn_ym2151.o burn_ym2203.o burn_ym2413.o burn_ym2608.o burn_ym2610.o burn_ym2612.o \
burn_ym3526.o burn_ym3812.o burn_ymf278b.o c6280.o dac.o es5506.o es8712.o flt_rc.o fm.o fmopl.o gaelco.o ics2115.o iremga20.o \

158
src/burn/devices/c169.cpp Normal file
View File

@ -0,0 +1,158 @@
#include "tiles_generic.h"
static UINT32 size;
static INT32 color;
static INT32 priority;
static INT32 left;
static INT32 top;
static INT32 incxx;
static INT32 incxy;
static INT32 incyx;
static INT32 incyy;
static INT32 startx=0;
static INT32 starty=0;
static INT32 clip_min_y;
static INT32 clip_max_y;
static UINT8 *roz_ram;
static UINT8 *roz_ctrl;
static UINT16 *roz_bitmap;
void c169_roz_init(UINT8 *ram, UINT8 *control,UINT16 *bitmap)
{
roz_ram = ram;
roz_ctrl = control;
roz_bitmap = bitmap;
}
static void c169_roz_unpack_params(const UINT16 *source)
{
const INT32 xoffset = 36, yoffset = 3;
UINT16 temp = source[1];
size = 512 << ((temp & 0x0300) >> 8);
color = (temp & 0x000f) * 256;
priority = (temp & 0x00f0) >> 4;
temp = source[2];
left = (temp & 0x7000) >> 3;
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
incxx = (INT16)temp;
temp = source[3];
top = (temp&0x7000)>>3;
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
incxy = (INT16)temp;
temp = source[4];
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
incyx = (INT16)temp;
temp = source[5];
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
incyy = (INT16)temp;
startx = (INT16)source[6];
starty = (INT16)source[7];
startx <<= 4;
starty <<= 4;
startx += xoffset * incxx + yoffset * incyx;
starty += xoffset * incxy + yoffset * incyy;
startx <<= 8;
starty <<= 8;
incxx <<= 8;
incxy <<= 8;
incyx <<= 8;
incyy <<= 8;
}
static void c169_roz_draw_helper()
{
UINT32 size_mask = size - 1;
UINT16 *srcbitmap = roz_bitmap;
UINT32 hstartx = startx + 0 * incxx + clip_min_y * incyx;
UINT32 hstarty = starty + 0 * incxy + clip_min_y * incyy;
INT32 sx = 0;
INT32 sy = clip_min_y;
while (sy < clip_max_y)
{
INT32 x = sx;
UINT32 cx = hstartx;
UINT32 cy = hstarty;
UINT16 *dest = pTransDraw + (sy * nScreenWidth) + sx;
while (x < nScreenWidth)
{
UINT32 xpos = (((cx >> 16) & size_mask) + left) & 0xfff;
UINT32 ypos = (((cy >> 16) & size_mask) + top) & 0xfff;
INT32 pxl = srcbitmap[(ypos * 0x1000) + xpos];
if ((pxl & 0x8000) == 0)
*dest = srcbitmap[(ypos * 0x1000) + xpos] + color;
cx += incxx;
cy += incxy;
x++;
dest++;
}
hstartx += incyx;
hstarty += incyy;
sy++;
}
}
static void c169_roz_draw_scanline(int line, int pri)
{
if (line >= 0 && line < nScreenHeight)
{
int row = line / 8;
int offs = row * 0x100 + (line & 7) * 0x10 + 0xe080;
UINT16 *source = (UINT16*)(roz_ram + offs);
if ((source[1] & 0x8000) == 0)
{
if (pri == priority)
{
c169_roz_unpack_params(source);
clip_min_y = line;
clip_max_y = line+1;
c169_roz_draw_helper();
}
}
}
}
void c169_roz_draw(int pri)
{
const UINT16 *source = (UINT16*)roz_ctrl;
INT32 mode = source[0]; // 0x8000 or 0x1000
for (INT32 which = 1; which >= 0; which--)
{
UINT16 attrs = source[1 + (which*8)];
if ((attrs & 0x8000) == 0)
{
if (which == 1 && mode == 0x8000)
{
for (INT32 line = 0; line < 224; line++)
c169_roz_draw_scanline(line, pri);
}
else
{
clip_min_y = 0;
clip_max_y = nScreenHeight;
c169_roz_unpack_params(source + (which*8));
if (priority == pri)
c169_roz_draw_helper();
}
}
}
}

2
src/burn/devices/c169.h Normal file
View File

@ -0,0 +1,2 @@
void c169_roz_init(UINT8 *ram, UINT8 *control,UINT16 *bitmap);
void c169_roz_draw(int pri);

View File

@ -0,0 +1,281 @@
#include "tiles_generic.h"
UINT8 *c45RoadRAM; // external
static UINT8 *c45RoadTiles = NULL;
static UINT16 *c45RoadBitmap = NULL;
static UINT8 *c45RoadBuffer = NULL;
static UINT8 *c45RoadClut = NULL;
static INT32 c45_road_force_update = 0;
static INT32 frame_decoded;
static UINT32 c45_road_transparent_color = 0;
static UINT8 c45_temp_clut[0x100];
void c45RoadReset()
{
c45_road_force_update = 1;
frame_decoded = -1;
}
void c45RoadInit(UINT32 trans_color, UINT8 *clut)
{
c45RoadRAM = (UINT8*)BurnMalloc(0x20000);
c45RoadBuffer = (UINT8*)BurnMalloc(0x10000);
c45RoadTiles = (UINT8*)BurnMalloc(0x40000);
c45RoadClut = clut;
c45RoadBitmap = (UINT16*)BurnMalloc(0x2000 * 0x400 * sizeof(UINT16));
c45_road_force_update = 1;
c45_road_transparent_color = trans_color;
if (c45RoadClut == NULL) {
c45RoadClut = c45_temp_clut;
for (INT32 i = 0; i < 0x100; i++) c45RoadClut[i] = i;
}
}
void c45RoadExit()
{
if (c45RoadRAM != NULL) BurnFree(c45RoadRAM);
if (c45RoadBuffer != NULL) BurnFree(c45RoadBuffer);
if (c45RoadTiles != NULL) BurnFree(c45RoadTiles);
if (c45RoadBitmap != NULL) BurnFree(c45RoadBitmap);
c45RoadClut = NULL;
}
static void c45RoadGfxDecode()
{
INT32 Planes[2] = { 0, 8 };
INT32 XOffs[16] = { STEP8(0, 1), STEP8(16, 1) };
INT32 YOffs[16] = { STEP16(0, 32) };
GfxDecode(0x0400, 2, 16, 16, Planes, XOffs, YOffs, 0x200, c45RoadRAM + 0x10000, c45RoadTiles);
}
static void predraw_c45_road_tiles()
{
UINT16 *ram = (UINT16*)c45RoadRAM;
// UINT16 *buf = (UINT16*)c45RoadBuffer;
for (INT32 offs = 0; offs < 64 * 512; offs++)
{
INT32 sx = (offs & 0x3f) * 16;
INT32 sy = (offs / 0x40) * 16;
// if ((ram[offs] == buf[offs]) && c45_road_force_update == 0) continue;
// buf[offs] = ram[offs];
INT32 code = (ram[offs] & 0x3ff) * 0x100;
INT32 color = ((ram[offs] >> 10) << 2) + 0xf00;
UINT8 *gfx = c45RoadTiles + code;
UINT16 *dst = c45RoadBitmap + (sy * 1024) + sx;
for (INT32 y = 0; y < 16; y++)
{
for (INT32 x = 0; x < 16; x++)
{
dst[x] = c45RoadClut[gfx[x]] + color;
}
gfx += 16;
dst += 1024;
}
}
c45_road_force_update = 0;
}
#if 0
void c45RoadDraw(int pri)
{
if (frame_decoded != (INT32)(nCurrentFrame & 1)) {
c45RoadGfxDecode();
predraw_c45_road_tiles();
}
frame_decoded = (nCurrentFrame & 1);
INT32 min_x, min_y, max_x, max_y;
GenericTilesGetClip(&min_x, &max_x, &min_y, &max_y);
max_x--;
max_y--;
UINT16 *m_lineram = (UINT16*)(c45RoadRAM + 0x1fa00);
UINT32 yscroll = m_lineram[0x3fe/2];
static int ROAD_COLS = 64;
static int ROAD_ROWS = 512;
static int ROAD_TILE_SIZE = 16;
static int ROAD_TILEMAP_WIDTH = ROAD_TILE_SIZE * ROAD_COLS;
static int ROAD_TILEMAP_HEIGHT = ROAD_TILE_SIZE * ROAD_ROWS;
for (int y = min_y; y <= max_y; y++)
{
int screenx = m_lineram[y + 15];
if (pri != ((screenx & 0xf000) >> 12))
continue;
unsigned zoomx = m_lineram[0x400/2 + y + 15] & 0x3ff;
if (zoomx == 0)
continue;
unsigned sourcey = m_lineram[0x200/2 + y + 15] + yscroll;
const UINT16 *source_gfx = c45RoadBitmap + (sourcey & (ROAD_TILEMAP_HEIGHT - 1)) * ROAD_TILEMAP_WIDTH;
unsigned dsourcex = (ROAD_TILEMAP_WIDTH << 16) / zoomx;
if (dsourcex == 0)
continue;
screenx &= 0x0fff;
if (screenx & 0x0800)
screenx |= ~0x7ff;
screenx -= 64; // needs adjustment to left
int numpixels = (44 * (16 << 16)) / dsourcex;
unsigned sourcex = 0;
int clip_pixels = min_x - screenx;
if (clip_pixels > 0)
{
numpixels -= clip_pixels;
sourcex += dsourcex*clip_pixels;
screenx = min_x;
}
clip_pixels = (screenx + numpixels) - (max_x + 1);
if (clip_pixels > 0)
numpixels -= clip_pixels;
UINT16 *dest = pTransDraw + y * nScreenWidth;
while (numpixels-- > 0)
{
int pen = source_gfx[sourcex >> 16];
if (c45RoadClut != NULL)
pen = (pen & ~0xff) | c45RoadClut[pen & 0xff];
dest[screenx++] = pen;
sourcex += dsourcex;
}
}
}
#endif
void c45RoadDraw(int pri)
{
if (frame_decoded != (INT32)(nCurrentFrame & 1)) {
c45RoadGfxDecode();
predraw_c45_road_tiles();
}
frame_decoded = (nCurrentFrame & 1);
INT32 min_x, min_y, max_x, max_y;
min_x = min_y = 0;
max_y = nScreenHeight - 1;
max_x = nScreenWidth - 1;
UINT16 *m_lineram = (UINT16*)(c45RoadRAM + 0x1fa00);
static int ROAD_COLS = 64;
static int ROAD_ROWS = 512;
static int ROAD_TILE_SIZE = 16;
static int ROAD_TILEMAP_WIDTH = ROAD_TILE_SIZE * ROAD_COLS;
static int ROAD_TILEMAP_HEIGHT = ROAD_TILE_SIZE * ROAD_ROWS;
static UINT8 *m_clut = c45RoadClut;
#define nullptr NULL
static UINT32 m_transparent_color = c45_road_transparent_color;
unsigned yscroll = m_lineram[0x3fe/2];
// loop over scanlines
for (int y = min_y; y <= max_y; y++)
{
// skip if we are not the right priority
int screenx = m_lineram[y + 15];
if (pri != ((screenx & 0xf000) >> 12))
continue;
// skip if we don't have a valid zoom factor
unsigned zoomx = m_lineram[0x400/2 + y + 15] & 0x3ff;
if (zoomx == 0)
continue;
// skip if we don't have a valid source increment
unsigned sourcey = m_lineram[0x200/2 + y + 15] + yscroll;
// const uint16_t *source_gfx = &source_bitmap.pix(sourcey & (ROAD_TILEMAP_HEIGHT - 1));
const uint16_t *source_gfx = c45RoadBitmap + (sourcey & (ROAD_TILEMAP_HEIGHT - 1)) * ROAD_TILEMAP_WIDTH;
unsigned dsourcex = (ROAD_TILEMAP_WIDTH << 16) / zoomx;
if (dsourcex == 0)
continue;
// mask off priority bits and sign-extend
screenx &= 0x0fff;
if (screenx & 0x0800)
screenx |= ~0x7ff;
// adjust the horizontal placement
screenx -= 64; // needs adjustment to left
int numpixels = (44 * ROAD_TILE_SIZE << 16) / dsourcex;
unsigned sourcex = 0;
// crop left
int clip_pixels = min_x - screenx;
if (clip_pixels > 0)
{
numpixels -= clip_pixels;
sourcex += dsourcex*clip_pixels;
screenx = min_x;
}
// crop right
clip_pixels = (screenx + numpixels) - (max_x + 1);
if (clip_pixels > 0)
numpixels -= clip_pixels;
// TBA: work out palette mapping for Final Lap, Suzuka
// BUT: support transparent color for Thunder Ceptor
// uint16_t *dest = &bitmap.pix(y);
uint16_t *dest = pTransDraw + y * nScreenWidth;
if (m_transparent_color != ~0)
{
while (numpixels-- > 0)
{
int pen = source_gfx[sourcex >> 16];
// if (palette().pen_indirect(pen) != m_transparent_color)
{
if (m_clut != nullptr)
pen = (pen & ~0xff) | m_clut[pen & 0xff];
dest[screenx] = pen;
}
screenx++;
sourcex += dsourcex;
}
}
else
{
while (numpixels-- > 0)
{
int pen = source_gfx[sourcex >> 16];
if (m_clut != nullptr)
pen = (pen & ~0xff) | m_clut[pen & 0xff];
dest[screenx++] = pen;
sourcex += dsourcex;
}
}
}
}

View File

@ -0,0 +1,6 @@
extern UINT8 *c45RoadRAM; // external
void c45RoadReset();
void c45RoadInit(UINT32 trans_color, UINT8 *clut);
void c45RoadExit();
void c45RoadDraw(INT32 pri);

File diff suppressed because it is too large Load Diff