Add Jibun wo Migaku Culture School Mahjong Hen driver

This commit is contained in:
iq_132 2018-01-18 03:55:09 +00:00
parent 7e1e4543c3
commit acbb008e1c
2 changed files with 553 additions and 2 deletions

View File

@ -59,8 +59,8 @@ drvsrc = d_dodonpachi.o d_donpachi.o d_esprade.o d_feversos.o d_gaia.o d_guwang
d_tigeroad.o d_timelimt.o d_toki.o d_toypop.o d_travrusa.o d_tsamurai.o d_twincobr.o d_usgames.o d_vastar.o d_vulgus.o d_wallc.o d_warpwarp.o d_wc90.o \
d_wc90b.o d_wiping.o d_wiz.o d_wrally.o d_wwfsstar.o d_xain.o d_xxmissio.o d_zodiack.o \
\
d_3x3puzzl.o d_1945kiii.o d_20pacgal.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_3x3puzzl.o d_1945kiii.o d_20pacgal.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_cultures.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_glass.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_mosaic.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_patapata.o \
d_pipedrm.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 \

View File

@ -0,0 +1,551 @@
// FB Alpha Jibun wo Migaku Culture School Mahjong Hen driver module
// Based on MAME driver by Pierpaolo Prazzoli
#include "tiles_generic.h"
#include "z80_intf.h"
#include "msm6295.h"
static UINT8 *AllMem;
static UINT8 *MemEnd;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *DrvZ80ROM;
static UINT8 *DrvGfxROM0;
static UINT8 *DrvGfxROM1;
static UINT8 *DrvGfxROM2;
static UINT8 *DrvSndROM;
static UINT8 *DrvZ80RAM;
static UINT8 *DrvVidRAM;
static UINT8 *DrvPalRAM;
static UINT8 *DrvPortRAM;
static UINT32 *DrvPalette;
static UINT8 DrvRecalc;
static UINT8 nBankData;
static UINT8 nOkiBank;
static UINT8 nIrqEnable;
static UINT8 nBgBank1;
static UINT8 nBgBank2;
static UINT8 DrvJoy1[8];
static UINT8 DrvJoy2[8];
static UINT8 DrvJoy3[8];
static UINT8 DrvJoy4[8];
static UINT8 DrvJoy5[8];
static UINT8 DrvJoy6[8];
static UINT8 DrvJoy7[8];
static UINT8 DrvDips[4];
static UINT8 DrvInputs[8];
static UINT8 DrvReset;
static struct BurnInputInfo CulturesInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy7 + 7, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy6 + 0, "p1 start" },
{"A", BIT_DIGITAL, DrvJoy1 + 0, "mah a" },
{"B", BIT_DIGITAL, DrvJoy1 + 1, "mah b" },
{"C", BIT_DIGITAL, DrvJoy1 + 2, "mah c" },
{"D", BIT_DIGITAL, DrvJoy1 + 3, "mah d" },
{"E", BIT_DIGITAL, DrvJoy2 + 0, "mah e" },
{"F", BIT_DIGITAL, DrvJoy2 + 1, "mah f" },
{"G", BIT_DIGITAL, DrvJoy2 + 2, "mah g" },
{"H", BIT_DIGITAL, DrvJoy2 + 3, "mah h" },
{"I", BIT_DIGITAL, DrvJoy3 + 0, "mah i" },
{"J", BIT_DIGITAL, DrvJoy3 + 1, "mah j" },
{"K", BIT_DIGITAL, DrvJoy3 + 2, "mah k" },
{"L", BIT_DIGITAL, DrvJoy3 + 3, "mah l" },
{"M", BIT_DIGITAL, DrvJoy4 + 0, "mah m" },
{"N", BIT_DIGITAL, DrvJoy4 + 1, "mah n" },
{"Pon", BIT_DIGITAL, DrvJoy4 + 3, "mah pon" },
{"Chi", BIT_DIGITAL, DrvJoy4 + 2, "mah chi" },
{"Kan", BIT_DIGITAL, DrvJoy5 + 0, "mah kan" },
{"Ron", BIT_DIGITAL, DrvJoy5 + 2, "mah ron" },
{"Reach", BIT_DIGITAL, DrvJoy5 + 1, "mah reach" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Service", BIT_DIGITAL, DrvJoy7 + 5, "service" },
{"Service", BIT_DIGITAL, DrvJoy7 + 6, "service" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
{"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" },
{"Dip C", BIT_DIPSWITCH, DrvDips + 2, "dip" },
{"Dip D", BIT_DIPSWITCH, DrvDips + 3, "dip" },
};
STDINPUTINFO(Cultures)
static struct BurnDIPInfo CulturesDIPList[]=
{
{0x18, 0xff, 0xff, 0xf7, NULL },
{0x19, 0xff, 0xff, 0xff, NULL },
{0x1a, 0xff, 0xff, 0xff, NULL },
{0x1b, 0xff, 0xff, 0xfb, NULL },
{0 , 0xfe, 0 , 8, "Coinage" },
{0x18, 0x01, 0x07, 0x00, "10 Coins / 1 Credit" },
{0x18, 0x01, 0x07, 0x01, "5 Coins 1 Credits" },
{0x18, 0x01, 0x07, 0x02, "4 Coins 1 Credits" },
{0x18, 0x01, 0x07, 0x03, "3 Coins 1 Credits" },
{0x18, 0x01, 0x07, 0x04, "2 Coins 1 Credits" },
{0x18, 0x01, 0x07, 0x07, "1 Coin 1 Credits" },
{0x18, 0x01, 0x07, 0x06, "1 Coin 2 Credits" },
{0x18, 0x01, 0x07, 0x05, "1 Coin 3 Credits" },
{0 , 0xfe, 0 , 2, "Flip Screen" },
{0x18, 0x01, 0x08, 0x00, "Off" },
{0x18, 0x01, 0x08, 0x08, "On" },
{0 , 0xfe, 0 , 0, "Auto Mode After Reach" },
{0x19, 0x01, 0x01, 0x00, "No" },
{0x19, 0x01, 0x01, 0x01, "Yes" },
{0 , 0xfe, 0 , 2, "Attract Mode" },
{0x19, 0x01, 0x02, 0x02, "Partial" },
{0x19, 0x01, 0x02, 0x00, "Full" },
{0 , 0xfe, 0 , 2, "Open Hands After Noten" },
{0x19, 0x01, 0x04, 0x00, "No" },
{0x19, 0x01, 0x04, 0x04, "Yes" },
{0 , 0xfe, 0 , 2, "Datsui Count After Continue" },
{0x19, 0x01, 0x08, 0x08, "Not Cleared" },
{0x19, 0x01, 0x08, 0x00, "Cleared" },
{0 , 0xfe, 0 , 2, "Difficulty" },
{0x1a, 0x01, 0x03, 0x00, "Hardest" },
{0x1a, 0x01, 0x03, 0x01, "Hard" },
{0x1a, 0x01, 0x03, 0x03, "Normal" },
{0x1a, 0x01, 0x03, 0x02, "Easy" },
{0 , 0xfe, 0 , 0, "Demo Sounds" },
{0x1a, 0x01, 0x04, 0x00, "Off" },
{0x1a, 0x01, 0x04, 0x04, "On" },
{0 , 0xfe, 0 , 4, "Game Background Music" },
{0x1a, 0x01, 0x08, 0x00, "No" },
{0x1a, 0x01, 0x08, 0x08, "Yes" },
{0 , 0xfe, 0 , 2, "Allow Continue" },
{0x1b, 0x01, 0x01, 0x00, "No" },
{0x1b, 0x01, 0x01, 0x01, "Yes" },
{0 , 0xfe, 0 , 2, "Machihai Display" },
{0x1b, 0x01, 0x02, 0x00, "No" },
{0x1b, 0x01, 0x02, 0x02, "Yes" },
{0 , 0xfe, 0 , 0, "Service Mode" },
{0x1b, 0x01, 0x08, 0x08, "Off" },
{0x1b, 0x01, 0x08, 0x00, "On" },
};
STDDIPINFO(Cultures)
static void bankswitch(INT32 data)
{
nBankData = data;
ZetMapMemory(DrvZ80ROM + ((data & 0xf) * 0x4000), 0x4000, 0x7fff, MAP_ROM);
if (data & 0x20)
{
ZetMapMemory(DrvPalRAM, 0x8000, 0xafff, MAP_RAM);
ZetUnmapMemory( 0xb000, 0xbfff, MAP_RAM);
}
else
{
ZetMapMemory(DrvVidRAM, 0x8000, 0xbfff, MAP_RAM);
}
}
static void set_oki_bank(INT32 data)
{
nOkiBank = data;
MSM6295SetBank(0, DrvSndROM + ((data & 0xf) * 0x20000), 0x20000, 0x3ffff);
}
static void __fastcall cultures_write_port(UINT16 port, UINT8 data)
{
port &= 0xff;
if (port < 0x80 && (port & 0xf) < 3) {
DrvPortRAM[port] = data;
return;
}
switch (port)
{
case 0x80:
bankswitch(data);
return;
case 0x90:
nIrqEnable = data & 0x80;
return;
case 0xa0:
nBgBank1 = data & 0x03;
nBgBank2 =(data & 0x0c) >> 2;
// coin counter = data & 0x10
return;
case 0xc0:
MSM6295Command(0, data);
return;
}
}
static UINT8 __fastcall cultures_read_port(UINT16 port)
{
port &= 0xff;
if (port < 0x80 && (port & 0xf) < 3) {
return DrvPortRAM[port];
}
switch (port)
{
case 0xc0:
return MSM6295ReadStatus(0);
case 0xd0:
case 0xd1:
case 0xd2:
case 0xd3:
return DrvDips[port & 3];
case 0xe0:
case 0xe1:
case 0xe2:
case 0xe3:
case 0xe4:
case 0xe5:
return DrvInputs[port & 7];
case 0xf0:
case 0xf1:
case 0xf2:
case 0xf3:
return 0xff;
case 0xf7:
return DrvInputs[6];
}
return 0;
}
static tilemap_callback( bg0 )
{
INT32 code = DrvVidRAM[offs * 2] + (DrvVidRAM[offs * 2 + 1] * 256);
TILE_SET_INFO(0, code, code / 0x1000, 0);
}
static tilemap_callback( bg1 )
{
UINT16 *map = (UINT16*)DrvGfxROM1;
UINT16 code = map[0x100000 + nBgBank1 * 0x40000 + offs];
code = (code << 8) | (code >> 8); //?
TILE_SET_INFO(1, code, code / 0x1000, 0);
}
static tilemap_callback( bg2 )
{
UINT16 *map = (UINT16*)DrvGfxROM2;
UINT16 code = map[0x100000 + nBgBank2 * 0x40000 + offs];
code = (code << 8) | (code >> 8);//?
TILE_SET_INFO(2, code, code / 0x1000, 0);
}
static INT32 DrvDoReset()
{
memset (AllRam, 0, RamEnd - AllRam);
ZetOpen(0);
bankswitch(1|(0<<4));
ZetReset();
ZetClose();
MSM6295Reset(0);
set_oki_bank(1);
nIrqEnable = 0;
nBgBank1 = 0;
nBgBank2 = 0;
return 0;
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
DrvZ80ROM = Next; Next += 0x040000;
DrvGfxROM0 = Next; Next += 0x400000;
DrvGfxROM1 = Next; Next += 0x400000;
DrvGfxROM2 = Next; Next += 0x400000;
MSM6295ROM = Next;
DrvSndROM = Next; Next += 0x200000;
DrvPalette = (UINT32*)Next; Next += 0x1800 * sizeof(UINT32);
AllRam = Next;
DrvZ80RAM = Next; Next += 0x004000;
DrvVidRAM = Next; Next += 0x004000;
DrvPalRAM = Next; Next += 0x003000;
DrvPortRAM = Next; Next += 0x000080;
RamEnd = Next;
MemEnd = Next;
return 0;
}
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(DrvZ80ROM + 0x000000, 0, 1)) return 1;
if (BurnLoadRom(DrvGfxROM0 + 0x000000, 1, 1)) return 1;
if (BurnLoadRom(DrvGfxROM0 + 0x200000, 2, 1)) return 1;
BurnByteswap(DrvGfxROM0, 0x400000);
if (BurnLoadRom(DrvGfxROM1 + 0x000000, 3, 1)) return 1;
if (BurnLoadRom(DrvGfxROM1 + 0x200000, 4, 1)) return 1;
BurnByteswap(DrvGfxROM1, 0x400000);
if (BurnLoadRom(DrvGfxROM2 + 0x000000, 5, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x200000, 6, 1)) return 1;
BurnByteswap(DrvGfxROM2, 0x400000);
if (BurnLoadRom(DrvSndROM + 0x000000, 7, 1)) return 1;
}
ZetInit(0);
ZetOpen(0);
ZetMapMemory(DrvZ80ROM, 0x0000, 0x3fff, MAP_ROM);
ZetMapMemory(DrvZ80RAM, 0xc000, 0xffff, MAP_RAM);
ZetSetOutHandler(cultures_write_port);
ZetSetInHandler(cultures_read_port);
ZetClose();
MSM6295Init(0, 2000000 / 132, 0);
MSM6295SetRoute(0, 0.30, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, bg0_map_callback, 8, 8, 64, 128);
GenericTilemapInit(1, TILEMAP_SCAN_ROWS, bg1_map_callback, 8, 8, 512, 512);
GenericTilemapInit(2, TILEMAP_SCAN_ROWS, bg2_map_callback, 8, 8, 512, 512);
GenericTilemapSetGfx(0, DrvGfxROM0, 8, 8, 8, 0x400000, 0x0000, 0xf);
GenericTilemapSetGfx(1, DrvGfxROM1, 8, 8, 8, 0x400000, 0x1000, 0x7);
GenericTilemapSetGfx(2, DrvGfxROM2, 8, 8, 8, 0x400000, 0x1000, 0x7);
GenericTilemapSetOffsets(TMAP_GLOBAL, 502, 256);
GenericTilemapSetTransparent(0, 0);
GenericTilemapSetTransparent(1, 0);
DrvDoReset();
return 0;
}
static INT32 DrvExit()
{
GenericTilesExit();
MSM6295Exit(0);
ZetExit();
BurnFree (AllMem);
MSM6295ROM = NULL;
return 0;
}
static void DrvPaletteUpdate()
{
UINT8 r,g,b;
UINT16 *p = (UINT16*)DrvPalRAM;
for (INT32 i = 0; i < 0x3000/2; i++)
{
UINT16 data = BURN_ENDIAN_SWAP_INT16(p[i]);
r = ((data >> 7) & 0x1e) | ((data >> 14) & 0x01);
g = ((data >> 3) & 0x1e) | ((data >> 13) & 0x01);
b = ((data << 1) & 0x1e) | ((data >> 12) & 0x01);
r = (r << 3) | (r >> 2);
g = (g << 3) | (g >> 2);
b = (b << 3) | (b >> 2);
DrvPalette[i] = BurnHighCol(r, g, b, 0);
}
}
static INT32 DrvDraw()
{
if (DrvRecalc) {
DrvPaletteUpdate();
DrvRecalc = 1;
}
UINT8 *r = DrvPortRAM;
INT32 bg0_flip = ((r[0x23] & 1) ? TMAP_FLIPX : 0) | ((r[0x33] & 1) ? TMAP_FLIPY : 0);
INT32 bg1_flip = ((r[0x43] & 1) ? TMAP_FLIPX : 0) | ((r[0x53] & 1) ? TMAP_FLIPY : 0);
INT32 bg2_flip = ((r[0x63] & 1) ? TMAP_FLIPX : 0) | ((r[0x73] & 1) ? TMAP_FLIPY : 0);
GenericTilemapSetFlip(0, bg0_flip);
GenericTilemapSetFlip(1, bg1_flip);
GenericTilemapSetFlip(2, bg2_flip);
GenericTilemapSetScrollX(0, (r[0x22] * 256) + r[0x20]);
GenericTilemapSetScrollY(0, (r[0x32] * 256) + r[0x30]);
GenericTilemapSetScrollX(1, (r[0x42] * 256) + r[0x40]);
GenericTilemapSetScrollY(1, (r[0x52] * 256) + r[0x50]);
GenericTilemapSetScrollX(2, (r[0x62] * 256) + r[0x60]);
GenericTilemapSetScrollY(2, (r[0x72] * 256) + r[0x70]);
GenericTilemapDraw(2, pTransDraw, 0);
GenericTilemapDraw(0, pTransDraw, 0);
GenericTilemapDraw(1, pTransDraw, 0);
BurnTransferCopy(DrvPalette);
return 0;
}
static INT32 DrvFrame()
{
if (DrvReset) {
DrvDoReset();
}
{
memset (DrvInputs, 0xff, 8);
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;
DrvInputs[3] ^= (DrvJoy4[i] & 1) << i;
DrvInputs[4] ^= (DrvJoy5[i] & 1) << i;
DrvInputs[5] ^= (DrvJoy6[i] & 1) << i;
DrvInputs[6] ^= (DrvJoy7[i] & 1) << i;
}
}
INT32 nInterleave = 256;
INT32 nCyclesTotal[1] = { 8000000 / 60 };
INT32 nCyclesDone[1] = { 0 };
ZetOpen(0);
for (INT32 i = 0; i < nInterleave; i++)
{
nCyclesDone[0] += ZetRun(nCyclesTotal[0] / nInterleave);
if (i == (nInterleave - 1) && nIrqEnable)
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
}
ZetClose();
if (pBurnSoundOut) {
MSM6295Render(0, pBurnSoundOut, nBurnSoundLen);
}
if (pBurnDraw) {
DrvDraw();
}
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) {
ZetScan(nAction);
MSM6295Scan(0, nAction);
SCAN_VAR(nBankData);
SCAN_VAR(nOkiBank);
SCAN_VAR(nIrqEnable);
SCAN_VAR(nBgBank1);
SCAN_VAR(nBgBank2);
}
if (nAction & ACB_WRITE)
{
ZetOpen(0);
bankswitch(nBankData);
set_oki_bank(nOkiBank);
ZetClose();
}
return 0;
}
// Jibun wo Migaku Culture School Mahjong Hen
static struct BurnRomInfo culturesRomDesc[] = {
{ "ma01.u12", 0x040000, 0xf57417b3, 1 | BRF_PRG | BRF_ESS }, // 0 Z80 Code
{ "bg0c.u45", 0x200000, 0xad2e1263, 2 | BRF_GRA }, // 1 Layer 0 Tiles
{ "bg0c2.u46", 0x100000, 0x97c71c09, 2 | BRF_GRA }, // 2
{ "bg2c.u68", 0x200000, 0xfa598644, 3 | BRF_GRA }, // 3 Layer 1 Tiles & Map
{ "bg1t.u67", 0x100000, 0xd2e594ee, 3 | BRF_GRA }, // 4
{ "bg1c.u80", 0x200000, 0x9ab99bd9, 4 | BRF_GRA }, // 5 Layer 2 Tiles & Map
{ "bg2t.u79", 0x100000, 0x0610a79f, 4 | BRF_GRA }, // 6
{ "pcm.u87", 0x200000, 0x84206475, 5 | BRF_SND }, // 7 Samples
};
STD_ROM_PICK(cultures)
STD_ROM_FN(cultures)
struct BurnDriver BurnDrvCultures = {
"cultures", NULL, NULL, NULL, "1994",
"Jibun wo Migaku Culture School Mahjong Hen\0", NULL, "Face", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_MISC_POST90S, GBF_MAHJONG, 0,
NULL, culturesRomInfo, culturesRomName, NULL, NULL, CulturesInputInfo, CulturesDIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x1800,
384, 240, 4, 3
};