add driver power balls [iq_132]

This commit is contained in:
dinkc64 2022-01-04 23:03:16 -05:00
parent f38e25ce30
commit 1f64e06f1f
2 changed files with 951 additions and 1 deletions

View File

@ -78,7 +78,7 @@ drvsrc = d_akkaarrh.o d_arcadecl.o d_atarig1.o d_badlands.o d_batman.o d_blstro
d_esd16.o d_f-32.o d_f1gp.o d_funybubl.o d_fuukifg2.o d_fuukifg3.o d_gaelco.o d_gaelco2.o d_gaiden.o d_galpani3.o d_galpanic.o d_galspnbl.o d_glass.o d_go2000.o d_goori.o d_gotcha.o d_gstream.o d_gumbo.o \
d_hyperpac.o d_hyprduel.o d_itech32.o d_inufuku.o d_jchan.o d_kaneko16.o d_kickgoal.o d_legionna.o d_limenko.o d_lordgun.o d_macrossp.o d_mcatadv.o d_metro.o d_midas.o d_mirage.o \
d_missb2.o d_mosaic.o d_ms32.o d_mugsmash.o d_mwarr.o d_namcos2.o d_news.o d_ngp.o d_nmg5.o d_nmk16.o d_ohmygod.o d_oneshot.o d_onetwo.o d_pasha2.o d_pass.o d_patapata.o \
d_pipedrm.o d_pirates.o d_pkscram.o d_playmark.o d_powerins.o d_ppmast93.o d_pushman.o d_rabbit.o d_raiden.o d_raiden2.o d_sandscrp.o d_seibuspi.o d_seta.o d_seta2.o \
d_pipedrm.o d_pirates.o d_pkscram.o d_playmark.o d_powerins.o d_powerbal.o d_ppmast93.o d_pushman.o d_rabbit.o d_raiden.o d_raiden2.o d_sandscrp.o d_seibuspi.o d_seta.o d_seta2.o \
d_shadfrce.o d_shangha3.o d_silkroad.o d_silvmil.o d_speedspn.o d_ssv.o d_suna16.o d_supduck.o d_suprnova.o d_taotaido.o d_targeth.o d_tecmo16.o d_tecmosys.o \
d_tetrisp2.o d_thoop2.o d_tumbleb.o d_unico.o d_vamphalf.o d_vegaeo.o d_vmetal.o d_welltris.o d_wrally.o d_wwfwfest.o d_x2222.o d_xorworld.o d_yunsun16.o d_yunsung8.o d_zerozone.o \
\

View File

@ -0,0 +1,950 @@
// FinalBurn Neo Playmark Power Ball / Hot Mind / Magic Sticks / Atom bootleg hardware
// Bssed on MAME driver by David Haywood and Pierpaolo Prazzoli
#include "tiles_generic.h"
#include "m68000_intf.h"
#include "eeprom.h"
#include "burn_pal.h"
#include "msm6295.h"
static UINT8 *AllMem;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *MemEnd;
static UINT8 *Drv68KROM;
static UINT8 *DrvGfxROM[2];
static UINT8 *DrvSndROM;
static UINT8 *Drv68KRAM;
static UINT8 *DrvVideoRAM;
static UINT8 *DrvSprRAM;
static INT32 tilebank;
static INT32 soundbank;
static INT32 video_ram_offset;
static INT32 tilebank_shift;
static INT32 vblank;
static INT32 irq_line;
static INT32 use_vblank_eeprom;
static INT32 sprite_x_adjust;
static INT32 sprite_y_adjust;
static INT32 sprite_transpen;
static UINT8 DrvJoy1[8];
static UINT8 DrvJoy2[8];
static UINT8 DrvJoy3[8];
static UINT16 DrvInputs[3];
static UINT8 DrvDips[2];
static UINT8 DrvReset;
static struct BurnInputInfo PowerbalInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy1 + 0, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy2 + 7, "p1 start" },
{"P1 Up", BIT_DIGITAL, DrvJoy2 + 3, "p1 up" },
{"P1 Down", BIT_DIGITAL, DrvJoy2 + 2, "p1 down" },
{"P1 Left", BIT_DIGITAL, DrvJoy2 + 1, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy2 + 0, "p1 right" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p1 fire 1" },
{"P1 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p1 fire 2" },
{"P2 Coin", BIT_DIGITAL, DrvJoy1 + 1, "p2 coin" },
{"P2 Start", BIT_DIGITAL, DrvJoy3 + 7, "p2 start" },
{"P2 Up", BIT_DIGITAL, DrvJoy3 + 3, "p2 up" },
{"P2 Down", BIT_DIGITAL, DrvJoy3 + 2, "p2 down" },
{"P2 Left", BIT_DIGITAL, DrvJoy3 + 1, "p2 left" },
{"P2 Right", BIT_DIGITAL, DrvJoy3 + 0, "p2 right" },
{"P2 Button 1", BIT_DIGITAL, DrvJoy3 + 4, "p2 fire 1" },
{"P2 Button 2", BIT_DIGITAL, DrvJoy3 + 5, "p2 fire 2" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
{"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" },
};
STDINPUTINFO(Powerbal)
static struct BurnInputInfo MagicstkInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy1 + 0, "p1 coin" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p1 fire 1" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
{"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" },
};
STDINPUTINFO(Magicstk)
static struct BurnInputInfo HotmindaInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy1 + 0, "p1 coin" },
{"P1 Left", BIT_DIGITAL, DrvJoy2 + 1, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy2 + 0, "p1 right" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p1 fire 1" },
{"P1 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p1 fire 2" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
{"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" },
};
STDINPUTINFO(Hotminda)
static struct BurnInputInfo AtombjtInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy1 + 0, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy1 + 3, "p1 start" },
{"P1 Up", BIT_DIGITAL, DrvJoy2 + 3, "p1 up" },
{"P1 Down", BIT_DIGITAL, DrvJoy2 + 2, "p1 down" },
{"P1 Left", BIT_DIGITAL, DrvJoy2 + 1, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy2 + 0, "p1 right" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p1 fire 1" },
{"P1 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p1 fire 2" },
{"P2 Coin", BIT_DIGITAL, DrvJoy1 + 1, "p2 coin" },
{"P2 Start", BIT_DIGITAL, DrvJoy1 + 4, "p2 start" },
{"P2 Up", BIT_DIGITAL, DrvJoy3 + 3, "p2 up" },
{"P2 Down", BIT_DIGITAL, DrvJoy3 + 2, "p2 down" },
{"P2 Left", BIT_DIGITAL, DrvJoy3 + 1, "p2 left" },
{"P2 Right", BIT_DIGITAL, DrvJoy3 + 0, "p2 right" },
{"P2 Button 1", BIT_DIGITAL, DrvJoy3 + 4, "p2 fire 1" },
{"P2 Button 2", BIT_DIGITAL, DrvJoy3 + 5, "p2 fire 2" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Service", BIT_DIGITAL, DrvJoy1 + 2, "service" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
{"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" },
};
STDINPUTINFO(Atombjt)
static struct BurnDIPInfo PowerbalDIPList[]=
{
{0x11, 0xff, 0xff, 0xff, NULL },
{0x12, 0xff, 0xff, 0xef, NULL },
{0 , 0xfe, 0 , 2, "Free Play" },
{0x11, 0x01, 0x01, 0x01, "Off" },
{0x11, 0x01, 0x01, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Allow Continue" },
{0x11, 0x01, 0x02, 0x00, "No" },
{0x11, 0x01, 0x02, 0x02, "Yes" },
{0 , 0xfe, 0 , 8, "Coin B" },
{0x11, 0x01, 0x1c, 0x08, "6 Coins 1 Credits" },
{0x11, 0x01, 0x1c, 0x0c, "5 Coins 1 Credits" },
{0x11, 0x01, 0x1c, 0x10, "4 Coins 1 Credits" },
{0x11, 0x01, 0x1c, 0x14, "3 Coins 1 Credits" },
{0x11, 0x01, 0x1c, 0x18, "2 Coins 1 Credits" },
{0x11, 0x01, 0x1c, 0x04, "3 Coins 2 Credits" },
{0x11, 0x01, 0x1c, 0x00, "4 Coins 3 Credits" },
{0x11, 0x01, 0x1c, 0x1c, "1 Coin 1 Credits" },
{0 , 0xfe, 0 , 8, "Coin A" },
{0x11, 0x01, 0xe0, 0xe0, "1 Coin 1 Credits" },
{0x11, 0x01, 0xe0, 0x00, "3 Coins 4 Credits" },
{0x11, 0x01, 0xe0, 0x20, "2 Coins 3 Credits" },
{0x11, 0x01, 0xe0, 0xc0, "1 Coin 2 Credits" },
{0x11, 0x01, 0xe0, 0xa0, "1 Coin 3 Credits" },
{0x11, 0x01, 0xe0, 0x80, "1 Coin 4 Credits" },
{0x11, 0x01, 0xe0, 0x60, "1 Coin 5 Credits" },
{0x11, 0x01, 0xe0, 0x40, "1 Coin 6 Credits" },
{0 , 0xfe, 0 , 2, "Demo Sounds" },
{0x12, 0x01, 0x01, 0x00, "Off" },
{0x12, 0x01, 0x01, 0x01, "On" },
{0 , 0xfe, 0 , 2, "Language" },
{0x12, 0x01, 0x08, 0x08, "English" },
{0x12, 0x01, 0x08, 0x00, "Italian" },
{0 , 0xfe, 0 , 4, "Lives" },
{0x12, 0x01, 0x30, 0x30, "1" },
{0x12, 0x01, 0x30, 0x20, "2" },
{0x12, 0x01, 0x30, 0x10, "3" },
{0x12, 0x01, 0x30, 0x00, "4" },
{0 , 0xfe, 0 , 4, "Difficulty" },
{0x12, 0x01, 0xc0, 0xc0, "Easy" },
{0x12, 0x01, 0xc0, 0x80, "Normal" },
{0x12, 0x01, 0xc0, 0x40, "Hard" },
{0x12, 0x01, 0xc0, 0x00, "Very Hard" },
};
STDDIPINFO(Powerbal)
static struct BurnDIPInfo MagicstkDIPList[]=
{
{0x03, 0xff, 0xff, 0xff, NULL },
{0x04, 0xff, 0xff, 0x77, NULL },
{0 , 0xfe, 0 , 1, "Coin Mode" },
{0x03, 0x01, 0x01, 0x01, "Mode 1" },
{0 , 0xfe, 0 , 15, "Coinage Mode 1" },
{0x03, 0x01, 0x1e, 0x14, "6 Coins 1 Credits" },
{0x03, 0x01, 0x1e, 0x16, "5 Coins 1 Credits" },
{0x03, 0x01, 0x1e, 0x18, "4 Coins 1 Credits" },
{0x03, 0x01, 0x1e, 0x1a, "3 Coins 1 Credits" },
{0x03, 0x01, 0x1e, 0x02, "8 Coins 3 Credits" },
{0x03, 0x01, 0x1e, 0x1c, "2 Coins 1 Credits" },
{0x03, 0x01, 0x1e, 0x04, "5 Coins 3 Credits" },
{0x03, 0x01, 0x1e, 0x06, "3 Coins 2 Credits" },
{0x03, 0x01, 0x1e, 0x1e, "1 Coin 1 Credits" },
{0x03, 0x01, 0x1e, 0x08, "2 Coins 3 Credits" },
{0x03, 0x01, 0x1e, 0x12, "1 Coin 2 Credits" },
{0x03, 0x01, 0x1e, 0x10, "1 Coin 3 Credits" },
{0x03, 0x01, 0x1e, 0x0e, "1 Coin 4 Credits" },
{0x03, 0x01, 0x1e, 0x0c, "1 Coin 5 Credits" },
{0x03, 0x01, 0x1e, 0x0a, "1 Coin 6 Credits" },
{0 , 0xfe, 0 , 2, "Clear Counters" },
{0x04, 0x01, 0x01, 0x01, "Off" },
{0x04, 0x01, 0x01, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Ticket" },
{0x04, 0x01, 0x02, 0x02, "Off" },
{0x04, 0x01, 0x02, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Hopper" },
{0x04, 0x01, 0x04, 0x04, "Off" },
{0x04, 0x01, 0x04, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Demo Sounds" },
{0x04, 0x01, 0x08, 0x08, "Off" },
{0x04, 0x01, 0x08, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Service Mode" },
{0x07, 0x01, 0x10, 0x10, "Off" },
{0x07, 0x01, 0x10, 0x00, "On" },
{0 , 0xfe, 0 , 8, "Difficulty" },
{0x04, 0x01, 0xe0, 0xa0, "Hard 7" },
{0x04, 0x01, 0xe0, 0x20, "Very Hard 6" },
{0x04, 0x01, 0xe0, 0xc0, "Very Hard 5" },
{0x04, 0x01, 0xe0, 0x80, "Very Hard 4" },
{0x04, 0x01, 0xe0, 0x40, "Very Hard 4" },
{0x04, 0x01, 0xe0, 0x00, "Very Hard 4" },
{0x04, 0x01, 0xe0, 0x60, "Normal 8" },
{0x04, 0x01, 0xe0, 0xe0, "Easy 9" },
};
STDDIPINFO(Magicstk)
static struct BurnDIPInfo HotmindaDIPList[]=
{
{0x06, 0xff, 0xff, 0xff, NULL },
{0x07, 0xff, 0xff, 0x77, NULL },
{0 , 0xfe, 0 , 4, "Premio" },
{0x06, 0x01, 0x06, 0x00, "1 Premio ogni 10 Vincite" },
{0x06, 0x01, 0x06, 0x04, "1 Premio ogni 10 Vincite" },
{0x06, 0x01, 0x06, 0x02, "1 Premio ogni 5 Vincite" },
{0x06, 0x01, 0x06, 0x06, "Paga 1 Premio ogni Vincita"},
{0 , 0xfe, 0 , 4, "Coin B" },
{0x06, 0x01, 0x18, 0x18, "1 Coin 2 Credits" },
{0x06, 0x01, 0x18, 0x08, "1 Coin 3 Credits" },
{0x06, 0x01, 0x18, 0x10, "1 Coin 5 Credits" },
{0x06, 0x01, 0x18, 0x00, "1 Coin 6 Credits" },
{0 , 0xfe, 0 , 2, "Clear Counters" },
{0x07, 0x01, 0x01, 0x01, "Off" },
{0x07, 0x01, 0x01, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Ticket" },
{0x07, 0x01, 0x02, 0x02, "Off" },
{0x07, 0x01, 0x02, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Hopper" },
{0x07, 0x01, 0x04, 0x04, "Off" },
{0x07, 0x01, 0x04, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Demo Sounds" },
{0x07, 0x01, 0x08, 0x08, "Off" },
{0x07, 0x01, 0x08, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Service Mode" },
{0x07, 0x01, 0x10, 0x10, "Off" },
{0x07, 0x01, 0x10, 0x00, "On" },
{0 , 0xfe, 0 , 8, "Difficulty" },
{0x07, 0x01, 0xe0, 0xa0, "Hard 7" },
{0x07, 0x01, 0xe0, 0x20, "Very Hard 6" },
{0x07, 0x01, 0xe0, 0xc0, "Very Hard 5" },
{0x07, 0x01, 0xe0, 0x40, "Very Hard 4" },
{0x07, 0x01, 0xe0, 0x80, "Very Hard 3" },
{0x07, 0x01, 0xe0, 0x00, "Very Hard 2" },
{0x07, 0x01, 0xe0, 0x60, "Normal 8" },
{0x07, 0x01, 0xe0, 0xe0, "Easy 9" },
};
STDDIPINFO(Hotminda)
static struct BurnDIPInfo AtombjtDIPList[]=
{
{0x12, 0xff, 0xff, 0xfe, NULL },
{0x13, 0xff, 0xff, 0xfe, NULL },
{0 , 0xfe, 0 , 8, "Starting level" },
{0x12, 0x01, 0x0e, 0x08, "Germany" },
{0x12, 0x01, 0x0e, 0x04, "Thailand" },
{0x12, 0x01, 0x0e, 0x0c, "Nevada" },
{0x12, 0x01, 0x0e, 0x0e, "Japan" },
{0x12, 0x01, 0x0e, 0x06, "Korea" },
{0x12, 0x01, 0x0e, 0x0a, "England" },
{0x12, 0x01, 0x0e, 0x02, "Hong Kong" },
{0x12, 0x01, 0x0e, 0x00, "China" },
{0 , 0xfe, 0 , 4, "Difficulty" },
{0x12, 0x01, 0x30, 0x20, "Easy" },
{0x12, 0x01, 0x30, 0x30, "Normal" },
{0x12, 0x01, 0x30, 0x10, "Hard" },
{0x12, 0x01, 0x30, 0x00, "Hardest" },
{0 , 0xfe, 0 , 4, "Lives" },
{0x12, 0x01, 0xc0, 0x00, "1" },
{0x12, 0x01, 0xc0, 0x40, "2" },
{0x12, 0x01, 0xc0, 0xc0, "3" },
{0x12, 0x01, 0xc0, 0x80, "4" },
{0 , 0xfe, 0 , 2, "Demo Sounds" },
{0x13, 0x01, 0x02, 0x00, "Off" },
{0x13, 0x01, 0x02, 0x02, "On" },
{0 , 0xfe, 0 , 8, "Coin B" },
{0x13, 0x01, 0x1c, 0x10, "4 Coins 1 Credits" },
{0x13, 0x01, 0x1c, 0x08, "3 Coins 1 Credits" },
{0x13, 0x01, 0x1c, 0x18, "2 Coins 1 Credits" },
{0x13, 0x01, 0x1c, 0x1c, "1 Coin 1 Credits" },
{0x13, 0x01, 0x1c, 0x0c, "1 Coin 2 Credits" },
{0x13, 0x01, 0x1c, 0x14, "1 Coin 3 Credits" },
{0x13, 0x01, 0x1c, 0x04, "1 Coin 4 Credits" },
{0x13, 0x01, 0x1c, 0x00, "Free Play" },
{0 , 0xfe, 0 , 8, "Coin A" },
{0x13, 0x01, 0xe0, 0x80, "4 Coins 1 Credits" },
{0x13, 0x01, 0xe0, 0x40, "3 Coins 1 Credits" },
{0x13, 0x01, 0xe0, 0xc0, "2 Coins 1 Credits" },
{0x13, 0x01, 0xe0, 0xe0, "1 Coin 1 Credits" },
{0x13, 0x01, 0xe0, 0x60, "1 Coin 2 Credits" },
{0x13, 0x01, 0xe0, 0xa0, "1 Coin 3 Credits" },
{0x13, 0x01, 0xe0, 0x20, "1 Coin 4 Credits" },
{0x13, 0x01, 0xe0, 0x00, "Free Play" },
};
STDDIPINFO(Atombjt)
static void oki_bankswitch(INT32 data)
{
soundbank = data & 3;
MSM6295SetBank(0, DrvSndROM, 0x00000, 0x1ffff);
MSM6295SetBank(0, DrvSndROM + (data * 0x20000), 0x20000, 0x3ffff);
}
static void __fastcall magicstk_main_write_word(UINT32 address, UINT16 data)
{
switch (address)
{
case 0x094000: // atombj
if (tilebank_shift == 0) {
tilebank = (data >> tilebank_shift) & 0x0f;
}
return;
case 0x094002:
return;
case 0x094004:
if (tilebank_shift != 0) {
tilebank = (data >> tilebank_shift) & 0x0f;
}
return;
case 0xc2014:
{
if (!use_vblank_eeprom) return;
EEPROMSetCSLine((~data & 8) ? EEPROM_CLEAR_LINE : EEPROM_ASSERT_LINE);
EEPROMWriteBit((data & 2) >> 1);
EEPROMSetClockLine((~data & 4) ? EEPROM_ASSERT_LINE : EEPROM_CLEAR_LINE);
}
return;
case 0xc201c:
oki_bankswitch(data);
return;
case 0xc201e:
MSM6295Write(0, data & 0xff);
return;
case 0xc4000:
return;
}
}
static void __fastcall magicstk_main_write_byte(UINT32 address, UINT8 data)
{
switch (address)
{
case 0x094000:
if (tilebank_shift == 0) {
tilebank = (data >> (tilebank_shift & 7)) & 0x0f;
}
return;
case 0x094002:
return;
case 0x094004:
if (tilebank_shift != 0) {
tilebank = (data >> (tilebank_shift & 7)) & 0x0f;
}
return;
case 0xc2015:
{
if (!use_vblank_eeprom) return;
EEPROMSetCSLine((~data & 8) ? EEPROM_CLEAR_LINE : EEPROM_ASSERT_LINE);
EEPROMWriteBit((data & 2) >> 1);
EEPROMSetClockLine((~data & 4) ? EEPROM_ASSERT_LINE : EEPROM_CLEAR_LINE);
}
return;
case 0xc201c:
oki_bankswitch(data);
return;
case 0xc201f:
MSM6295Write(0, data & 0xff);
return;
case 0xc4000:
return;
}
}
static UINT16 __fastcall magicstk_main_read_word(UINT32 address)
{
switch (address)
{
case 0xc2010:
return DrvInputs[0];
case 0xc2012:
return DrvInputs[1];
case 0xc2014:
{
INT32 ret = DrvInputs[2];
if (use_vblank_eeprom) {
ret &= ~0x41;
ret |= EEPROMRead() ? 0x01 : 0;
ret |= vblank ? 0x40 : 0;
}
return ret;
}
case 0xc2016:
return DrvDips[0];
case 0xc2018:
return DrvDips[1];
case 0xc201f:
return MSM6295Read(0);
}
return 0;
}
static UINT8 __fastcall magicstk_main_read_byte(UINT32 address)
{
return SekReadWord(address & ~1);
}
static tilemap_callback( bg )
{
UINT16 *ram = (UINT16*)(DrvVideoRAM + video_ram_offset);
INT32 attr = ram[offs];
TILE_SET_INFO(0, (attr & 0x7ff) | (tilebank * 0x800) | ((attr & 0x800) << 4), attr >> 12, 0);
}
static INT32 DrvDoReset()
{
memset (AllRam, 0, RamEnd - AllRam);
SekOpen(0);
SekReset();
SekClose();
MSM6295Reset(0);
oki_bankswitch(1);
if (use_vblank_eeprom) EEPROMReset();
tilebank = 0;
soundbank = 0;
return 0;
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
Drv68KROM = Next; Next += 0x080000;
DrvGfxROM[0] = Next; Next += 0x400000;
DrvGfxROM[1] = Next; Next += 0x400000;
DrvSndROM = Next; Next += 0x080000;
BurnPalette = (UINT32*)Next; Next += 0x0200 * sizeof(UINT32);
AllRam = Next;
Drv68KRAM = Next; Next += 0x020000;
BurnPalRAM = Next; Next += 0x000400;
DrvVideoRAM = Next; Next += 0x001400;
DrvSprRAM = Next; Next += 0x003000;
RamEnd = Next;
MemEnd = Next;
return 0;
}
static INT32 DrvGfxDecode(INT32 chr_len, INT32 spr_len)
{
INT32 Plane0[4] = { (chr_len/4)*8*3, (chr_len/4)*8*2, (chr_len/4)*8*1, (chr_len/4)*8*0 };
INT32 Plane1[4] = { (spr_len/4)*8*3, (spr_len/4)*8*2, (spr_len/4)*8*1, (spr_len/4)*8*0 };
INT32 XOffs[16] = { STEP8(0,1), STEP8(128,1) };
INT32 YOffs[16] = { STEP16(0,8) };
UINT8 *tmp = (UINT8*)BurnMalloc((spr_len > chr_len) ? spr_len : chr_len);
if (tmp == NULL) {
return 1;
}
memcpy (tmp, DrvGfxROM[0], chr_len);
GfxDecode((chr_len * 2) / (8 * 8), 4, 8, 8, Plane0, XOffs, YOffs, 0x040, tmp, DrvGfxROM[0]);
memcpy (tmp, DrvGfxROM[1], spr_len);
GfxDecode((spr_len * 2) / (16 * 16), 4, 16, 16, Plane1, XOffs, YOffs, 0x100, tmp, DrvGfxROM[1]);
BurnFree (tmp);
return 0;
}
static INT32 DrvLoadRoms(INT32 chr_len, INT32 spr_len)
{
INT32 k = 0;
if (BurnLoadRom(Drv68KROM + 0x00001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x00000, k++, 2)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + ((chr_len / 4) * 0), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + ((chr_len / 4) * 1), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + ((chr_len / 4) * 2), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + ((chr_len / 4) * 3), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + ((spr_len / 4) * 0), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + ((spr_len / 4) * 1), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + ((spr_len / 4) * 2), k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + ((spr_len / 4) * 3), k++, 1)) return 1;
if (BurnLoadRom(DrvSndROM + 0x00000, k++, 1)) return 1;
DrvGfxDecode(chr_len, spr_len);
return 0;
}
static INT32 MagicstkInit()
{
BurnAllocMemIndex();
if (DrvLoadRoms(0x80000, 0x80000)) return 1;
SekInit(0, 0x68000);
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x03ffff, MAP_ROM);
SekMapMemory(BurnPalRAM, 0x088000, 0x0883ff, MAP_RAM);
SekMapMemory(DrvVideoRAM, 0x098000, 0x0993ff, MAP_RAM); // 180-117f
SekMapMemory(Drv68KRAM, 0x0e0000, 0x0fffff, MAP_RAM);
SekMapMemory(DrvSprRAM, 0x100000, 0x100fff, MAP_RAM);
SekSetWriteWordHandler(0, magicstk_main_write_word);
SekSetWriteByteHandler(0, magicstk_main_write_byte);
SekSetReadWordHandler(0, magicstk_main_read_word);
SekSetReadByteHandler(0, magicstk_main_read_byte);
SekClose();
EEPROMInit(&eeprom_interface_93C46);
MSM6295Init(0, 1000000 / 132, 0);
MSM6295SetRoute(0, 0.47, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, bg_map_callback, 8, 8, 64, 32);
GenericTilemapSetGfx(0, DrvGfxROM[0], 4, 8, 8, 0x100000, 0x000, 0xf);
GenericTilemapSetGfx(1, DrvGfxROM[1], 4, 16, 16, 0x100000, 0x100, 0xf);
video_ram_offset = 0x180;
tilebank_shift = 12;
use_vblank_eeprom = 1;
irq_line = 2;
sprite_x_adjust = -16;
sprite_y_adjust = -10;
sprite_transpen = 0;
DrvDoReset();
return 0;
}
static INT32 PowerbalInit()
{
BurnAllocMemIndex();
if (DrvLoadRoms(0x200000, 0x200000)) return 1;
SekInit(0, 0x68000);
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x07ffff, MAP_ROM);
SekMapMemory(BurnPalRAM, 0x088000, 0x0883ff, MAP_RAM);
SekMapMemory(DrvVideoRAM, 0x098000, 0x098fff, MAP_RAM);
SekMapMemory(Drv68KRAM + 0x10000, 0x099000, 0x09bfff, MAP_RAM);
SekMapMemory(Drv68KRAM, 0x0f0000, 0x0fffff, MAP_RAM);
SekMapMemory(DrvSprRAM, 0x101000, 0x103fff, MAP_RAM); // only 1000-1fff sprite ram!
SekSetWriteWordHandler(0, magicstk_main_write_word);
SekSetWriteByteHandler(0, magicstk_main_write_byte);
SekSetReadWordHandler(0, magicstk_main_read_word);
SekSetReadByteHandler(0, magicstk_main_read_byte);
SekClose();
MSM6295Init(0, 1000000 / 132, 0);
MSM6295SetRoute(0, 0.47, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, bg_map_callback, 8, 8, 64, 32);
GenericTilemapSetGfx(0, DrvGfxROM[0], 4, 8, 8, 0x400000, 0x000, 0xf);
GenericTilemapSetGfx(1, DrvGfxROM[1], 4, 16, 16, 0x400000, 0x100, 0xf);
GenericTilemapSetOffsets(TMAP_GLOBAL, 0, -16);
video_ram_offset = 0;
tilebank_shift = 12;
use_vblank_eeprom = 0;
irq_line = 2;
sprite_x_adjust = -16;
sprite_y_adjust = -10;
sprite_transpen = 0;
DrvDoReset();
return 0;
}
static INT32 AtombjtInit()
{
BurnAllocMemIndex();
if (DrvLoadRoms(0x200000, 0x100000)) return 1;
SekInit(0, 0x68000);
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x03ffff, MAP_ROM);
SekMapMemory(BurnPalRAM, 0x088000, 0x0883ff, MAP_RAM);
SekMapMemory(DrvVideoRAM, 0x09c000, 0x09cfff, MAP_RAM);
SekMapMemory(DrvVideoRAM, 0x09d000, 0x09dfff, MAP_RAM);
SekMapMemory(Drv68KRAM, 0x0f0000, 0x100fff, MAP_RAM);
SekMapMemory(DrvSprRAM, 0x101000, 0x103fff, MAP_RAM); // only 1000-1fff sprite ram!
SekSetWriteWordHandler(0, magicstk_main_write_word);
SekSetWriteByteHandler(0, magicstk_main_write_byte);
SekSetReadWordHandler(0, magicstk_main_read_word);
SekSetReadByteHandler(0, magicstk_main_read_byte);
SekClose();
MSM6295Init(0, 1000000 / 132, 0);
MSM6295SetRoute(0, 0.47, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_COLS, bg_map_callback, 8, 8, 64, 32);
GenericTilemapSetGfx(0, DrvGfxROM[0], 4, 8, 8, 0x400000, 0x000, 0xf);
GenericTilemapSetGfx(1, DrvGfxROM[1], 4, 16, 16, 0x200000, 0x100, 0xf);
GenericTilemapSetOffsets(TMAP_GLOBAL, 64, -16);
video_ram_offset = 0;
tilebank_shift = 0;
use_vblank_eeprom = 0;
irq_line = 6;
sprite_x_adjust = 32 + 8;
sprite_y_adjust = -16 + 9;
sprite_transpen = 0xf;
DrvDoReset();
return 0;
}
static INT32 DrvExit()
{
GenericTilesExit();
MSM6295Exit(0);
if (use_vblank_eeprom) EEPROMExit();
SekExit();
BurnFreeMemIndex();
return 0;
}
static void draw_sprites()
{
UINT16 *ram = (UINT16*)DrvSprRAM;
for (INT32 offs = 4; offs < 0x1000 / 2; offs += 4)
{
INT32 attr = ram[offs - 1];
if (attr & 0x8000) break;
INT32 sx = ram[offs + 1] & 0x01ff;
INT32 code = ram[offs + 2];
INT32 color = ram[offs + 1] >> 12;
INT32 flipx = attr & 0x4000;
INT32 sy = (232 - attr) & 0xff;
DrawGfxMaskTile(0, 1, code, sx - 23 + (sprite_x_adjust - 4), sy + sprite_y_adjust, flipx, 0, color, sprite_transpen);
}
}
static INT32 DrvDraw()
{
BurnPaletteUpdate_RRRRGGGGBBBBRGBx();
BurnTransferClear();
if (nBurnLayer & 1) GenericTilemapDraw(0, 0, 0);
if (nSpriteEnable & 1) draw_sprites();
BurnTransferCopy(BurnPalette);
return 0;
}
static INT32 DrvFrame()
{
if (DrvReset) {
DrvDoReset();
}
{
memset (DrvInputs, 0xff, sizeof(DrvInputs));
for (INT32 i = 0; i < 8; i++) {
DrvInputs[0] ^= (DrvJoy1[i] & 1) << i;
DrvInputs[1] ^= (DrvJoy2[i] & 1) << i;
DrvInputs[2] ^= (DrvJoy3[i] & 1) << i;
}
}
vblank = 0;
SekOpen(0);
SekRun(((12000000 / 60) * 240)/256);
vblank = 1;
SekSetIRQLine(irq_line, CPU_IRQSTATUS_AUTO);
SekRun(((12000000 / 60) * 16)/256);
SekClose();
if (pBurnSoundOut) {
MSM6295Render(0, pBurnSoundOut, nBurnSoundLen);
}
if (pBurnDraw) {
BurnDrvRedraw();
}
return 0;
}
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin != NULL) {
*pnMin = 0x029698;
}
if (nAction & ACB_MEMORY_RAM) {
memset(&ba, 0, sizeof(ba));
ba.Data = AllRam;
ba.nLen = RamEnd-AllRam;
ba.szName = "All Ram";
BurnAcb(&ba);
}
if (nAction & ACB_DRIVER_DATA) {
SekScan(nAction);
MSM6295Scan(nAction, pnMin);
if (use_vblank_eeprom) EEPROMScan(nAction, pnMin);
SCAN_VAR(tilebank);
SCAN_VAR(soundbank);
}
if (nAction & ACB_WRITE) {
oki_bankswitch(soundbank);
}
return 0;
}
// Power Balls
static struct BurnRomInfo powerbalRomDesc[] = {
{ "3.u67", 0x40000, 0x3aecdde4, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "2.u66", 0x40000, 0xa4552a19, 1 | BRF_PRG | BRF_ESS }, // 1
{ "4.u38", 0x80000, 0xa60aa981, 2 | BRF_GRA }, // 2 Background Tiles
{ "5.u42", 0x80000, 0x966c71df, 2 | BRF_GRA }, // 3
{ "6.u39", 0x80000, 0x668957b9, 2 | BRF_GRA }, // 4
{ "7.u45", 0x80000, 0xf5721c66, 2 | BRF_GRA }, // 5
{ "8.u86", 0x80000, 0x4130694c, 3 | BRF_GRA }, // 6 Sprites
{ "9.u85", 0x80000, 0xe7bcd2e7, 3 | BRF_GRA }, // 7
{ "10.u84", 0x80000, 0x90412135, 3 | BRF_GRA }, // 8
{ "11.u83", 0x80000, 0x92d7d40a, 3 | BRF_GRA }, // 9
{ "1.u16", 0x80000, 0x12776dbc, 4 | BRF_SND }, // 10 Samples
{ "palce16v8h.u102", 0x00117, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 11 PLDs
{ "palce22v10h.u183", 0x002dd, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 12
{ "palce22v10h.u211", 0x002dd, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 13
{ "palce22v10h.bin", 0x002dd, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 14
{ "pal22v10a.bin", 0x002dd, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 15
};
STD_ROM_PICK(powerbal)
STD_ROM_FN(powerbal)
struct BurnDriver BurnDrvPowerbal = {
"powerbal", NULL, NULL, NULL, "1994",
"Power Balls\0", NULL, "Playmark", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_MISC_POST90S, GBF_SPORTSMISC, 0,
NULL, powerbalRomInfo, powerbalRomName, NULL, NULL, NULL, NULL, PowerbalInputInfo, PowerbalDIPInfo,
PowerbalInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &BurnRecalc, 0x200,
320, 240, 4, 3
};
// Magic Sticks
static struct BurnRomInfo magicstkRomDesc[] = {
{ "12.u67", 0x20000, 0x70a9c66f, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "11.u66", 0x20000, 0xa9d7c90e, 1 | BRF_PRG | BRF_ESS }, // 1
{ "13.u36", 0x20000, 0x31e52562, 2 | BRF_GRA }, // 2 Background Tiles
{ "14.u42", 0x20000, 0xb0d35eda, 2 | BRF_GRA }, // 3
{ "15.u39", 0x20000, 0xaf27004b, 2 | BRF_GRA }, // 4
{ "16.u45", 0x20000, 0x0c980db3, 2 | BRF_GRA }, // 5
{ "17.u86", 0x20000, 0xce238006, 3 | BRF_GRA }, // 6 Sprites
{ "18.u85", 0x20000, 0x3dc88bf6, 3 | BRF_GRA }, // 7
{ "19.u84", 0x20000, 0xee12d5b2, 3 | BRF_GRA }, // 8
{ "20.u83", 0x20000, 0xa07f542b, 3 | BRF_GRA }, // 9
{ "10.u16", 0x20000, 0x1e4a03ef, 4 | BRF_SND }, // 10 Samples
{ "palce16v8.u33", 0x00117, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 11 PLDs
{ "palce16v8.u58", 0x00117, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 12
{ "gal22v10b.bin", 0x002e5, 0x00000000, 5 | BRF_NODUMP | BRF_OPT }, // 13
};
STD_ROM_PICK(magicstk)
STD_ROM_FN(magicstk)
struct BurnDriver BurnDrvMagicstk = {
"magicstk", NULL, NULL, NULL, "1995",
"Magic Sticks\0", NULL, "Playmark", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, magicstkRomInfo, magicstkRomName, NULL, NULL, NULL, NULL, MagicstkInputInfo, MagicstkDIPInfo,
MagicstkInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &BurnRecalc, 0x200,
320, 240, 4, 3
};
// Hot Mind (adjustable prize)
static struct BurnRomInfo hotmindaRomDesc[] = {
// reverse order from MAME!
{ "rom2.rom", 0x20000, 0xf5accd9f, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "rom1.rom", 0x20000, 0x33aaceba, 1 | BRF_PRG | BRF_ESS }, // 1
{ "rom13.rom", 0x20000, 0x18d22109, 2 | BRF_GRA }, // 2 Background Tiles
{ "rom14.rom", 0x20000, 0xf95a1ff6, 2 | BRF_GRA }, // 3
{ "rom15.rom", 0x20000, 0x8a9ea7ed, 2 | BRF_GRA }, // 4
{ "rom16.rom", 0x20000, 0xdf63b642, 2 | BRF_GRA }, // 5
{ "rom17.rom", 0x20000, 0x805002cf, 3 | BRF_GRA }, // 6 Sprites
{ "rom18.rom", 0x20000, 0x6a9d896b, 3 | BRF_GRA }, // 7
{ "rom19.rom", 0x20000, 0x223ad90f, 3 | BRF_GRA }, // 8
{ "rom20.rom", 0x20000, 0xab37a273, 3 | BRF_GRA }, // 9
{ "rom10.rom", 0x40000, 0x0bf3a3e5, 4 | BRF_SND }, // 10 Samples
};
STD_ROM_PICK(hotminda)
STD_ROM_FN(hotminda)
struct BurnDriver BurnDrvHotminda = {
"hotminda", "hotmind", NULL, NULL, "1995",
"Hot Mind (adjustable prize)\0", NULL, "Playmark", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, hotmindaRomInfo, hotmindaRomName, NULL, NULL, NULL, NULL, HotmindaInputInfo, HotmindaDIPInfo,
MagicstkInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &BurnRecalc, 0x200,
320, 240, 4, 3
};
// Atom (bootleg of Bombjack Twin)
static struct BurnRomInfo atombjtRomDesc[] = {
{ "22.u67", 0x20000, 0xbead8c70, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "21.u66", 0x20000, 0x73e3d488, 1 | BRF_PRG | BRF_ESS }, // 1
{ "23.u36", 0x80000, 0xa3fb6b91, 2 | BRF_GRA }, // 2 Background Tiles
{ "24.u42", 0x80000, 0x4c30e15f, 2 | BRF_GRA }, // 3
{ "25.u39", 0x80000, 0xff1af60f, 2 | BRF_GRA }, // 4
{ "26.u45", 0x80000, 0x6cc4e817, 2 | BRF_GRA }, // 5
{ "27.u86", 0x40000, 0x5a853e5c, 3 | BRF_GRA }, // 6 Sprites
{ "28.u85", 0x40000, 0x41970bf6, 3 | BRF_GRA }, // 7
{ "29.u84", 0x40000, 0x59a7d610, 3 | BRF_GRA }, // 8
{ "30.u83", 0x40000, 0x9b2dfebd, 3 | BRF_GRA }, // 9
{ "20.u16", 0x80000, 0x71c74ff9, 4 | BRF_SND }, // 10 Samples
};
STD_ROM_PICK(atombjt)
STD_ROM_FN(atombjt)
struct BurnDriver BurnDrvAtombjt = {
"atombjt", "bjtwin", NULL, NULL, "1993",
"Atom (bootleg of Bombjack Twin)\0", NULL, "bootleg (Kyon K.)", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_BOOTLEG, 2, HARDWARE_MISC_POST90S, GBF_PLATFORM, 0,
NULL, atombjtRomInfo, atombjtRomName, NULL, NULL, NULL, NULL, AtombjtInputInfo, AtombjtDIPInfo,
AtombjtInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &BurnRecalc, 0x200,
224, 384, 3, 4
};