mirror of
https://github.com/libretro/FBNeo.git
synced 2025-02-01 06:32:17 +00:00
Add preliminary Namco System 2 driver - please use frequent check-ins if you are working on this!
This commit is contained in:
parent
814ef16340
commit
509717a744
@ -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
158
src/burn/devices/c169.cpp
Normal 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
2
src/burn/devices/c169.h
Normal file
@ -0,0 +1,2 @@
|
||||
void c169_roz_init(UINT8 *ram, UINT8 *control,UINT16 *bitmap);
|
||||
void c169_roz_draw(int pri);
|
281
src/burn/devices/namco_c45.cpp
Normal file
281
src/burn/devices/namco_c45.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
6
src/burn/devices/namco_c45.h
Normal file
6
src/burn/devices/namco_c45.h
Normal file
@ -0,0 +1,6 @@
|
||||
extern UINT8 *c45RoadRAM; // external
|
||||
|
||||
void c45RoadReset();
|
||||
void c45RoadInit(UINT32 trans_color, UINT8 *clut);
|
||||
void c45RoadExit();
|
||||
void c45RoadDraw(INT32 pri);
|
6416
src/burn/drv/pst90s/d_namcos2.cpp
Normal file
6416
src/burn/drv/pst90s/d_namcos2.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user