add driver for Chanbara [iq_132]

This commit is contained in:
dinkc64 2015-10-04 22:12:14 +00:00
parent 5bfdcbe76a
commit e4f4125d8c
2 changed files with 580 additions and 1 deletions

View File

@ -13,7 +13,7 @@ drvobj = d_dodonpachi.o d_donpachi.o d_esprade.o d_feversos.o d_gaia.o d_guwang
\
d_cps3.o \
\
d_actfancr.o d_backfire.o d_boogwing.o d_cbuster.o d_cninja.o d_darkseal.o d_dassault.o d_dec0.o d_dec8.o \
d_actfancr.o d_backfire.o d_boogwing.o d_cbuster.o d_chanbara.o d_cninja.o d_darkseal.o d_dassault.o d_dec0.o d_dec8.o \
d_dietgogo.o d_funkyjet.o d_karnov.o d_lemmings.o d_pktgaldx.o d_rohga.o d_sidepckt.o d_simpl156.o d_supbtime.o \
d_tumblep.o d_vaportra.o \
\

View File

@ -0,0 +1,579 @@
// FB Alpha Chanbara driver module
// Based on MAME driver by Tomasz Slanina and David Haywood
// Todo:
// 1) Figure out the sprite banking issue (strange blob of broken
// sprites appears sporatically - usually when the floor pattern changes.
// 2) Patch up CompileInput() to use DrvJoy[3][8] and variants thereof, then
// update all the games in pre90s that use CompileInput() to use this style -dink
#include "tiles_generic.h"
#include "m6809_intf.h"
#include "burn_ym2203.h"
static UINT8 *AllMem;
static UINT8 *MemEnd;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *DrvM6809ROM;
static UINT8 *DrvGfxROM0;
static UINT8 *DrvGfxROM1;
static UINT8 *DrvGfxROM2;
static UINT8 *DrvGfxROM3;
static UINT8 *DrvColPROM;
static UINT8 *DrvM6809RAM;
static UINT8 *DrvVidRAM0;
static UINT8 *DrvVidRAM1;
static UINT8 *DrvColRAM0;
static UINT8 *DrvColRAM1;
static UINT8 *DrvSprRAM;
static UINT32 *DrvPalette;
static UINT8 DrvRecalc;
static INT32 scrolly;
static UINT8 flipscreen;
static UINT8 bankdata;
static INT32 vblank;
static UINT8 DrvJoy[3][8];
static UINT8 DrvDips[1];
static UINT8 DrvInputs[3];
static UINT8 DrvReset;
static struct BurnInputInfo DrvInputList[] = {
{"P1 Coin" , BIT_DIGITAL , DrvJoy[0] + 4, "p1 coin" },
{"P1 Start" , BIT_DIGITAL , DrvJoy[0] + 0, "p1 start" },
{"P1 Up (left)" , BIT_DIGITAL , DrvJoy[1] + 1, "p1 up" },
{"P1 Down (left)" , BIT_DIGITAL , DrvJoy[1] + 0, "p1 down" },
{"P1 Left (left)" , BIT_DIGITAL , DrvJoy[1] + 2, "p1 left" },
{"P1 Right (left)" , BIT_DIGITAL , DrvJoy[1] + 3, "p1 right" },
{"P1 Up (right)" , BIT_DIGITAL , DrvJoy[1] + 5, "p3 up" },
{"P1 Down (right)" , BIT_DIGITAL , DrvJoy[1] + 4, "p3 down" },
{"P1 Left (right)" , BIT_DIGITAL , DrvJoy[1] + 6, "p3 left" },
{"P1 Right (right)" , BIT_DIGITAL , DrvJoy[1] + 7, "p3 right" },
{"P2 Coin" , BIT_DIGITAL , DrvJoy[0] + 5, "p2 coin" },
{"P2 Start" , BIT_DIGITAL , DrvJoy[0] + 1, "p2 start" },
{"P2 Up (left)" , BIT_DIGITAL , DrvJoy[2] + 1, "p2 up" },
{"P2 Down (left)" , BIT_DIGITAL , DrvJoy[2] + 0, "p2 down" },
{"P2 Left (left)" , BIT_DIGITAL , DrvJoy[2] + 2, "p2 left" },
{"P2 Right (left)" , BIT_DIGITAL , DrvJoy[2] + 3, "p2 right" },
{"P2 Up (right)" , BIT_DIGITAL , DrvJoy[2] + 5, "p4 up" },
{"P2 Down (right)" , BIT_DIGITAL , DrvJoy[2] + 4, "p4 down" },
{"P2 Left (right)" , BIT_DIGITAL , DrvJoy[2] + 6, "p4 left" },
{"P2 Right (right)" , BIT_DIGITAL , DrvJoy[2] + 7, "p4 right" },
{"Reset" , BIT_DIGITAL , &DrvReset , "reset" },
{"Service" , BIT_DIGITAL , DrvJoy[0] + 6, "Service" },
{"Dip" , BIT_DIPSWITCH, DrvDips + 0 , "dip" },
};
STDINPUTINFO(Drv)
static struct BurnDIPInfo DrvDIPList[]=
{
{0x16, 0xff, 0xff, 0x7f, NULL },
{0 , 0xfe, 0 , 4 , "Coin B" },
{0x16, 0x01, 0x03, 0x00, "2 Coins 1 Play" },
{0x16, 0x01, 0x03, 0x03, "1 Coin 1 Play" },
{0x16, 0x01, 0x03, 0x02, "1 Coin 2 Plays" },
{0x16, 0x01, 0x03, 0x01, "1 Coin 3 Plays" },
{0 , 0xfe, 0 , 4 , "Coin A" },
{0x16, 0x01, 0x0c, 0x00, "2 Coins 1 Play" },
{0x16, 0x01, 0x0c, 0x0c, "1 Coin 1 Play" },
{0x16, 0x01, 0x0c, 0x08, "1 Coin 2 Plays" },
{0x16, 0x01, 0x0c, 0x04, "1 Coin 3 Plays" },
{0 , 0xfe, 0 , 2 , "Difficulty" },
{0x16, 0x01, 0x10, 0x10, "Easy" },
{0x16, 0x01, 0x10, 0x00, "Hard" },
{0 , 0xfe, 0 , 2 , "Lives" },
{0x16, 0x01, 0x20, 0x20, "3" },
{0x16, 0x01, 0x20, 0x00, "1" },
{0 , 0xfe, 0 , 2 , "Bonus Life" },
{0x16, 0x01, 0x40, 0x40, "50k and 70k" },
{0x16, 0x01, 0x40, 0x00, "None" },
{0 , 0xfe, 0 , 1 , "Cabinet" },
{0x16, 0x01, 0x80, 0x80, "Upright" },
// {0x16, 0x01, 0x80, 0x00, "Cocktail" }, // not supported atm
};
STDDIPINFO(Drv)
static void chanbara_write(UINT16 address, UINT8 data)
{
switch (address)
{
case 0x3800:
case 0x3801:
BurnYM2203Write(0, address & 1, data);
return;
}
}
static UINT8 chanbara_read(UINT16 address)
{
switch (address)
{
case 0x2000:
return DrvDips[0];
case 0x2001:
return (DrvInputs[0] & 0x7f) | (vblank ? 0x80 : 0);
case 0x2002:
return DrvInputs[2];
case 0x2003:
return DrvInputs[1];
case 0x3800:
case 0x3801:
return BurnYM2203Read(0, address & 1);
}
return 0;
}
static void bankswitch(INT32 data)
{
bankdata = data;
M6809MapMemory(DrvM6809ROM + (data * 0x1000), 0x4000, 0x7fff, MAP_ROM);
}
static void chanbara_ay_writeA(UINT32, UINT32 data)
{
scrolly = (scrolly & 0x100) + data;
}
static void chanbara_ay_writeB(UINT32, UINT32 data)
{
scrolly = ((data & 0x01) * 0x100) + (scrolly & 0xff);
flipscreen = data & 0x02;
bankswitch(data & 0x04);
}
static void DrvYM2203IRQHandler(INT32, INT32 nStatus)
{
M6809SetIRQLine(0, nStatus ? CPU_IRQSTATUS_ACK : CPU_IRQSTATUS_NONE);
}
static INT32 DrvSynchroniseStream(INT32 nSoundRate)
{
return (INT64)M6809TotalCycles() * nSoundRate / 1500000;
}
static double DrvGetTime()
{
return (double)M6809TotalCycles() / 1500000;
}
static INT32 DrvDoReset()
{
memset (AllRam, 0, RamEnd - AllRam);
M6809Open(0);
BurnYM2203Reset(); // this calls bankswitch() through the ay ports(!)
bankswitch(0);
M6809Reset();
M6809Close();
scrolly = 0;
flipscreen = 0;
return 0;
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
DrvM6809ROM = Next; Next += 0x10000;
DrvGfxROM0 = Next; Next += 0x08000;
DrvGfxROM1 = Next; Next += 0x80000;
DrvGfxROM2 = Next; Next += 0x10000;
DrvGfxROM3 = Next; Next += 0x02000;
DrvColPROM = Next; Next += 0x00300;
DrvPalette = (UINT32*)Next; Next += 0x0100 * sizeof(UINT32);
AllRam = Next;
DrvM6809RAM = Next; Next += 0x00800;
DrvVidRAM0 = Next; Next += 0x00400;
DrvVidRAM1 = Next; Next += 0x00200;
DrvColRAM0 = Next; Next += 0x00400;
DrvColRAM1 = Next; Next += 0x00200;
DrvSprRAM = Next; Next += 0x00100;
RamEnd = Next;
MemEnd = Next;
return 0;
}
static void DrvGfxDecode()
{
INT32 Plane0[2] = { 0, 4 };
INT32 Plane1[3] = { (0x24000/3) * 8 * 2, (0x24000/3) * 8 * 1, (0x24000/3) * 8 * 0 };
INT32 Plane2[3] = { (0x8000 / 2) * 8, 0, 4 };
INT32 XOffs0[8] = { STEP4(((0x2000/2) * 8),1), STEP4(0,1) };
INT32 XOffs1[16]= { STEP8(128,1), STEP8(0,1) };
INT32 XOffs2[16]= { STEP4((((0x8000/4)*8) + 128), 1), STEP4(0,1), STEP4(((0x8000/4)*8),1), STEP4(128,1) };
INT32 YOffs0[8] = { STEP8(0,8) };
INT32 YOffs1[16]= { STEP8(0,8), STEP8(64,8) };
INT32 YOffs2[16]= { STEP16(0,8) };
UINT8 *tmp = (UINT8*)BurnMalloc(0x24000);
memcpy (tmp, DrvGfxROM0, 0x02000);
GfxDecode(0x0200, 2, 8, 8, Plane0, XOffs0, YOffs0, 0x040, tmp, DrvGfxROM0);
memcpy (tmp, DrvGfxROM1, 0x24000);
GfxDecode(0x0600, 3, 16, 16, Plane1, XOffs1, YOffs1, 0x100, tmp, DrvGfxROM1);
memcpy (tmp, DrvGfxROM2, 0x8000);
GfxDecode(0x0100, 3, 16, 16, Plane2, XOffs2, YOffs2, 0x100, tmp, DrvGfxROM2);
BurnFree(tmp);
}
UINT8 *temp4;
static void DrvGfxExpand()
{
/*UINT8 *tmp = (UINT8*)BurnMalloc(0x2000);
memcpy (tmp, DrvGfxROM2 + 0x4000, 0x2000);
for (INT32 i = 0; i < 0x4000; i++) {
DrvGfxROM2[i + 0x4000] = (tmp[i/2] << ((~i&1)<<2)) & 0xf0;
}
BurnFree(tmp);
*/
// replacing the above with this fixes the "blue lines through everything" issue
// Leaving this here incase iq_132 wants to fix it.
UINT8 *dst = DrvGfxROM2 + 0x4000;
UINT8 *src = DrvGfxROM3;
for (INT32 i = 0; i < 0x1000; i++)
{
dst[i + 0x1000] = src[i] & 0xf0;
dst[i + 0x0000] = (src[i] & 0x0f) << 4;
dst[i + 0x3000] = src[i + 0x1000] & 0xf0;
dst[i + 0x2000] = (src[i + 0x1000] & 0x0f) << 4;
}
}
static INT32 DrvInit()
{
AllMem = NULL;
MemIndex();
INT32 nLen = MemEnd - (UINT8 *)0;
if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;
memset(AllMem, 0, nLen);
MemIndex();
{
if (BurnLoadRom(DrvM6809ROM + 0x08000, 0, 1)) return 1;
if (BurnLoadRom(DrvM6809ROM + 0x0c000, 1, 1)) return 1;
if (BurnLoadRom(DrvM6809ROM + 0x00000, 2, 1)) return 1;
if (BurnLoadRom(DrvGfxROM0 + 0x00000, 3, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x00000, 4, 1)) return 1;
if (BurnLoadRom(DrvGfxROM3 + 0x00000, 5, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x08000, 6, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x04000, 7, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x00000, 8, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x14000, 9, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x10000, 10, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x0c000, 11, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x20000, 12, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x1c000, 13, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x18000, 14, 1)) return 1;
if (BurnLoadRom(DrvColPROM + 0x00000, 15, 1)) return 1;
if (BurnLoadRom(DrvColPROM + 0x00100, 16, 1)) return 1;
if (BurnLoadRom(DrvColPROM + 0x00200, 17, 1)) return 1;
DrvGfxExpand();
DrvGfxDecode();
}
M6809Init(1);
M6809Open(0);
M6809MapMemory(DrvM6809RAM, 0x0000, 0x07ff, MAP_RAM);
M6809MapMemory(DrvVidRAM0, 0x0800, 0x0bff, MAP_RAM);
M6809MapMemory(DrvColRAM0, 0x0c00, 0x0fff, MAP_RAM);
M6809MapMemory(DrvSprRAM, 0x1000, 0x10ff, MAP_RAM);
M6809MapMemory(DrvVidRAM1, 0x1800, 0x19ff, MAP_RAM);
M6809MapMemory(DrvColRAM1, 0x1a00, 0x1bff, MAP_RAM);
M6809MapMemory(DrvM6809ROM, 0x4000, 0x7fff, MAP_ROM);
M6809MapMemory(DrvM6809ROM + 0x08000, 0x8000, 0xffff, MAP_ROM);
M6809SetWriteHandler(chanbara_write);
M6809SetReadHandler(chanbara_read);
M6809Close();
BurnYM2203Init(1, 1500000, &DrvYM2203IRQHandler, DrvSynchroniseStream, DrvGetTime, 0);
BurnYM2203SetPorts(0, NULL, NULL, &chanbara_ay_writeA, &chanbara_ay_writeB);
BurnTimerAttachM6809(1500000);
BurnYM2203SetAllRoutes(0, 1.00, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
DrvDoReset();
return 0;
}
static INT32 DrvExit()
{
M6809Exit();
BurnYM2203Exit();
GenericTilesExit();
BurnFree(AllMem);
return 0;
}
static void DrvPaletteInit()
{
for (INT32 i = 0; i < 0x100; i++)
{
INT32 r = (DrvColPROM[i + 0x000] << 1) & 0x0e;
INT32 g = (DrvColPROM[i + 0x100] << 1) & 0x0e;
INT32 b = (DrvColPROM[i + 0x200] << 1) & 0x0e;
DrvPalette[i] = BurnHighCol(r+r*16, g+g*16, b+b*16, 0);
}
}
static void draw_bg_layer()
{
INT32 yscroll = (scrolly + 16) & 0x1ff;
for (INT32 offs = 0; offs < 16 * 32; offs++)
{
INT32 sx = (offs & 0x0f) * 16;
INT32 sy = (offs / 0x10) * 16;
sy -= yscroll;
if (sy < -15) sy += 512;
INT32 code = DrvVidRAM1[offs];
INT32 color =(DrvColRAM1[offs] & 0x3e) >> 1;
Render16x16Tile_Clip(pTransDraw, code, sx, sy, color, 3, 0, DrvGfxROM2);
}
}
static void draw_fg_layer()
{
for (INT32 offs = 2 * 32; offs < 32 * 30; offs++)
{
INT32 sx = (offs & 0x1f) * 8;
INT32 sy = (offs / 0x20) * 8;
INT32 attr = DrvColRAM0[offs];
INT32 code = DrvVidRAM0[offs] + ((attr & 0x01) * 0x100);
INT32 color = ((attr & 0x3e) >> 1) + (0x40 >> 2);
Render8x8Tile_Mask_Clip(pTransDraw, code, sx, sy - 16, color, 2, 0, 0, DrvGfxROM0);
}
}
extern int counter;
static void draw_sprites()
{
for (INT32 offs = 0; offs < 0x80; offs += 4)
{
if (DrvSprRAM[offs + 0x80] & 0x80)
{
INT32 attr0 = DrvSprRAM[offs + 0x00];
INT32 attr1 = DrvSprRAM[offs + 0x80];
INT32 code = DrvSprRAM[offs + 0x01] | ((attr1 & 0x10) << 5) | ((attr1 & 0x20) << 5) | ((attr1 & 0x40) << 2);
INT32 color = (attr1 & 0x0f) + (0x80>>3);
INT32 flipy = attr0 & 0x2;
INT32 sx = 240 - DrvSprRAM[offs + 0x03];
INT32 sy = (232 - DrvSprRAM[offs + 0x02]);
if (attr0 & 0x10)
{
if (flipy)
{
Render16x16Tile_Mask_FlipY_Clip(pTransDraw, code+0, sx, sy , color, 3, 0, 0, DrvGfxROM1);
Render16x16Tile_Mask_FlipY_Clip(pTransDraw, code+1, sx, sy - 16, color, 3, 0, 0, DrvGfxROM1);
}
else
{
Render16x16Tile_Mask_Clip(pTransDraw, code+0, sx, sy - 16, color, 3, 0, 0, DrvGfxROM1);
Render16x16Tile_Mask_Clip(pTransDraw, code+1, sx, sy , color, 3, 0, 0, DrvGfxROM1);
}
}
else
{
if (flipy) {
Render16x16Tile_Mask_FlipY_Clip(pTransDraw, code, sx, sy, color, 3, 0, 0, DrvGfxROM1);
} else {
Render16x16Tile_Mask_Clip(pTransDraw, code, sx, sy, color, 3, 0, 0, DrvGfxROM1);
}
}
}
}
}
static INT32 DrvDraw()
{
if (DrvRecalc) {
DrvPaletteInit();
DrvRecalc = 0;
}
BurnTransferClear();
if (nBurnLayer & 2) draw_bg_layer();
if (nBurnLayer & 4) draw_sprites();
if (nBurnLayer & 8) draw_fg_layer();
BurnTransferCopy(DrvPalette);
return 0;
}
static INT32 DrvFrame()
{
if (DrvReset) {
DrvDoReset();
}
{
UINT32 JoyInit[3] = { 0x7f, 0xff, 0xff };
UINT8 *DrvJoys[3] = { DrvJoy[0], DrvJoy[1], DrvJoy[2] };
CompileInput(DrvJoys, (void*)DrvInputs, 3, 8, JoyInit);
}
INT32 nInterleave = 256;
INT32 nCyclesTotal = 1500000 / 60;
M6809Open(0);
M6809NewFrame();
vblank = 0;
for (INT32 i = 0; i < nInterleave; i++)
{
BurnTimerUpdate((i + 1) * (nCyclesTotal / nInterleave));
if (i == 240) vblank = 1;
}
BurnTimerEndFrame(nCyclesTotal);
if (pBurnSoundOut) {
BurnYM2203Update(pBurnSoundOut, nBurnSoundLen);
}
M6809Close();
if (pBurnDraw) {
DrvDraw();
}
return 0;
}
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin) {
*pnMin = 0x029702;
}
if (nAction & ACB_VOLATILE) {
memset(&ba, 0, sizeof(ba));
ba.Data = AllRam;
ba.nLen = RamEnd - AllRam;
ba.szName = "All Ram";
BurnAcb(&ba);
M6809Scan(nAction);
M6809Open(0);
BurnYM2203Scan(nAction, pnMin);
M6809Close();
SCAN_VAR(scrolly);
SCAN_VAR(flipscreen);
SCAN_VAR(bankdata);
}
return 0;
}
// Chanbara
static struct BurnRomInfo ChanbaraRomDesc[] = {
{ "cp01.16c", 0x4000, 0xa0c3c24c, 0 | BRF_ESS | BRF_PRG }, // 0 M6809 Code
{ "cp00-2.17c", 0x4000, 0xa045e463, 0 | BRF_ESS | BRF_PRG }, // 1
{ "cp02.14c", 0x8000, 0xc2b66cea, 0 | BRF_ESS | BRF_PRG }, // 2
{ "cp12.17h", 0x2000, 0xb87b96de, 1 | BRF_GRA }, // 3 Characters
{ "cp13.15h", 0x4000, 0x2dc38c3d, 1 | BRF_GRA }, // 4 Background Tiles
{ "cp14.13h", 0x2000, 0xd31db368, 1 | BRF_GRA }, // 5
{ "cp03.12c", 0x4000, 0xdea247fb, 1 | BRF_GRA }, // 6 Sprites
{ "cp04.10c", 0x4000, 0xf7dce87b, 1 | BRF_GRA }, // 7
{ "cp05.9c", 0x4000, 0xdf2dc3cb, 1 | BRF_GRA }, // 8
{ "cp06.7c", 0x4000, 0x2f337c08, 1 | BRF_GRA }, // 9
{ "cp07.6c", 0x4000, 0x0e3727f2, 1 | BRF_GRA }, // 10
{ "cp08.5c", 0x4000, 0x4cf35192, 1 | BRF_GRA }, // 11
{ "cp09.4c", 0x4000, 0x3f58b647, 1 | BRF_GRA }, // 12
{ "cp10.2c", 0x4000, 0xbfa324c0, 1 | BRF_GRA }, // 13
{ "cp11.1c", 0x4000, 0x33e6160a, 1 | BRF_GRA }, // 14
{ "cp17.4k", 0x0100, 0xcf03706e, 1 | BRF_GRA }, // 15 Color Proms
{ "cp16.5k", 0x0100, 0x5fedc8ba, 1 | BRF_GRA }, // 16
{ "cp15.6k", 0x0100, 0x655936eb, 1 | BRF_GRA }, // 17
};
STD_ROM_PICK(Chanbara)
STD_ROM_FN(Chanbara)
struct BurnDriver BurnDrvChanbara = {
"chanbara", NULL, NULL, NULL, "1985",
"Chanbara\0", NULL, "Data East", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_ORIENTATION_VERTICAL, 4, HARDWARE_PREFIX_DATAEAST, GBF_SCRFIGHT, 0,
NULL, ChanbaraRomInfo, ChanbaraRomName, NULL, NULL, DrvInputInfo, DrvDIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x100,
224, 256, 3, 4
};