Clean up d_meijinsn.
This commit is contained in:
parent
66fc8f2536
commit
2d6948b187
|
@ -1,7 +1,7 @@
|
|||
// FB Alpha Meijinsen Driver Module
|
||||
// Based on MAME driver by Tomasz Slanina
|
||||
|
||||
#include "burnint.h"
|
||||
#include "tiles_generic.h"
|
||||
#include "sek.h"
|
||||
#include "zet.h"
|
||||
#include "driver.h"
|
||||
|
@ -9,241 +9,216 @@ extern "C" {
|
|||
#include "ay8910.h"
|
||||
}
|
||||
|
||||
static UINT32 *Palette;
|
||||
static UINT8 *Mem, *M68KRom, *Z80Rom, *Prom;
|
||||
static INT16 *pFMBuffer, *pAY8910Buffer[3];
|
||||
static UINT8 DrvJoy1[9], DrvJoy2[8], DrvReset, DrvDips;
|
||||
static UINT8 soundlatch, deposits1, deposits2, credits;
|
||||
static UINT8 *AllMem;
|
||||
static UINT8 *MemEnd;
|
||||
static UINT8 *AllRam;
|
||||
static UINT8 *RamEnd;
|
||||
static UINT8 *Drv68KROM;
|
||||
static UINT8 *DrvZ80ROM;
|
||||
static UINT8 *Drv68KRAM;
|
||||
static UINT8 *DrvZ80RAM;
|
||||
static UINT8 *DrvVidRAM;
|
||||
static UINT8 *DrvColPROM;
|
||||
|
||||
static UINT32 *DrvPalette;
|
||||
static UINT8 DrvRecalc;
|
||||
|
||||
static UINT8 *soundlatch;
|
||||
|
||||
static INT16 *pAY8910Buffer[3];
|
||||
|
||||
static UINT16 DrvInputs[3];
|
||||
static UINT8 DrvJoy1[16];
|
||||
static UINT8 DrvJoy2[16];
|
||||
static UINT8 DrvJoy3[16];
|
||||
static UINT8 DrvReset;
|
||||
static UINT8 DrvDips;
|
||||
|
||||
static INT32 credits;
|
||||
static INT32 mcu_latch;
|
||||
static INT32 deposits1;
|
||||
static INT32 deposits2;
|
||||
|
||||
static struct BurnInputInfo DrvInputList[] = {
|
||||
{"Coin 1", BIT_DIGITAL, DrvJoy1 + 6, "p1 coin" },
|
||||
{"Coin 2", BIT_DIGITAL, DrvJoy2 + 6, "p2 coin" },
|
||||
{"Start 1", BIT_DIGITAL, DrvJoy1 + 7, "p1 start" },
|
||||
{"Start 2", BIT_DIGITAL, DrvJoy2 + 7, "p2 start" },
|
||||
{"Coin 1", BIT_DIGITAL, DrvJoy3 + 0, "p1 coin" },
|
||||
{"Coin 2", BIT_DIGITAL, DrvJoy3 + 1, "p2 coin" },
|
||||
|
||||
{"P1 Up", BIT_DIGITAL, DrvJoy1 + 0, "p1 up" },
|
||||
{"P1 Down", BIT_DIGITAL, DrvJoy1 + 1, "p1 down" },
|
||||
{"P1 Right", BIT_DIGITAL, DrvJoy1 + 2, "p1 right" },
|
||||
{"P1 Left", BIT_DIGITAL, DrvJoy1 + 3, "p1 left" },
|
||||
{"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 4, "p1 fire 1" },
|
||||
{"P1 Button 2", BIT_DIGITAL, DrvJoy1 + 5, "p1 fire 2" },
|
||||
{"Start 1", BIT_DIGITAL, DrvJoy1 + 8, "p1 start" },
|
||||
{"P1 Up", BIT_DIGITAL, DrvJoy1 + 0, "p1 up" },
|
||||
{"P1 Down", BIT_DIGITAL, DrvJoy1 + 1, "p1 down" },
|
||||
{"P1 Right", BIT_DIGITAL, DrvJoy1 + 2, "p1 right" },
|
||||
{"P1 Left", BIT_DIGITAL, DrvJoy1 + 3, "p1 left" },
|
||||
{"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 4, "p1 fire 1" },
|
||||
{"P1 Button 2", BIT_DIGITAL, DrvJoy1 + 5, "p1 fire 2" },
|
||||
|
||||
{"P2 Up", BIT_DIGITAL, DrvJoy2 + 0, "p2 up" },
|
||||
{"P2 Down", BIT_DIGITAL, DrvJoy2 + 1, "p2 down" },
|
||||
{"P2 Right", BIT_DIGITAL, DrvJoy2 + 2, "p2 right" },
|
||||
{"P2 Left", BIT_DIGITAL, DrvJoy2 + 3, "p2 left" },
|
||||
{"P2 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p2 fire 1" },
|
||||
{"P2 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p2 fire 2" },
|
||||
{"Start 2", BIT_DIGITAL, DrvJoy1 + 9, "p2 start" },
|
||||
{"P2 Up", BIT_DIGITAL, DrvJoy2 + 0, "p2 up" },
|
||||
{"P2 Down", BIT_DIGITAL, DrvJoy2 + 1, "p2 down" },
|
||||
{"P2 Right", BIT_DIGITAL, DrvJoy2 + 2, "p2 right" },
|
||||
{"P2 Left", BIT_DIGITAL, DrvJoy2 + 3, "p2 left" },
|
||||
{"P2 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p2 fire 1" },
|
||||
{"P2 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p2 fire 2" },
|
||||
|
||||
{"Clear Credit", BIT_DIGITAL, DrvJoy1 + 8, "clear credit" },
|
||||
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
|
||||
{"Dip Switches", BIT_DIPSWITCH, &DrvDips, "dip" },
|
||||
{"Service Mode", BIT_DIGITAL, DrvJoy1 + 15, "Service" },
|
||||
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
|
||||
{"Dip Switches", BIT_DIPSWITCH, &DrvDips, "dip" },
|
||||
};
|
||||
|
||||
STDINPUTINFO(Drv)
|
||||
|
||||
static struct BurnDIPInfo DrvDIPList[] =
|
||||
{
|
||||
// Defaults
|
||||
{0x12, 0xFF, 0xFF, 0x08, NULL},
|
||||
{0x12, 0xFF, 0xFF, 0x08, NULL },
|
||||
|
||||
{0, 0xFE, 0, 8, "Game time (actual game)"},
|
||||
{0x12, 0x01, 0x07, 0x07, "01:00"},
|
||||
{0x12, 0x01, 0x07, 0x06, "02:00"},
|
||||
{0x12, 0x01, 0x07, 0x05, "03:00"},
|
||||
{0x12, 0x01, 0x07, 0x04, "04:00"},
|
||||
{0x12, 0x01, 0x07, 0x03, "05:00"},
|
||||
{0x12, 0x01, 0x07, 0x02, "10:00"},
|
||||
{0x12, 0x01, 0x07, 0x01, "20:00"},
|
||||
{0x12, 0x01, 0x07, 0x00, "00:30"},
|
||||
{0, 0xFE, 0, 8, "Game time (actual game)" },
|
||||
{0x12, 0x01, 0x07, 0x07, "01:00" },
|
||||
{0x12, 0x01, 0x07, 0x06, "02:00" },
|
||||
{0x12, 0x01, 0x07, 0x05, "03:00" },
|
||||
{0x12, 0x01, 0x07, 0x04, "04:00" },
|
||||
{0x12, 0x01, 0x07, 0x03, "05:00" },
|
||||
{0x12, 0x01, 0x07, 0x02, "10:00" },
|
||||
{0x12, 0x01, 0x07, 0x01, "20:00" },
|
||||
{0x12, 0x01, 0x07, 0x00, "00:30" },
|
||||
|
||||
{0, 0xFE, 0, 2, "Coinage"},
|
||||
{0x12, 0x01, 0x08, 0x08, "A 1C/1C B 1C/5C"},
|
||||
{0x12, 0x01, 0x08, 0x00, "A 1C/2C B 2C/1C"},
|
||||
{0, 0xFE, 0, 2, "Coinage" },
|
||||
{0x12, 0x01, 0x08, 0x08, "A 1C/1C B 1C/5C" },
|
||||
{0x12, 0x01, 0x08, 0x00, "A 1C/2C B 2C/1C" },
|
||||
|
||||
{0, 0xFE, 0, 2, "2 Player"},
|
||||
{0x12, 0x01, 0x10, 0x00, "1C"},
|
||||
{0x12, 0x01, 0x10, 0x10, "2C"},
|
||||
{0, 0xFE, 0, 2, "2 Player" },
|
||||
{0x12, 0x01, 0x10, 0x00, "1C" },
|
||||
{0x12, 0x01, 0x10, 0x10, "2C" },
|
||||
|
||||
{0, 0xFE, 0, 2, "Game time (tsumeshougi)"},
|
||||
{0x12, 0x01, 0x20, 0x20, "01:00"},
|
||||
{0x12, 0x01, 0x20, 0x00, "02:00"},
|
||||
{0, 0xFE, 0, 2, "Game time (tsumeshougi)" },
|
||||
{0x12, 0x01, 0x20, 0x20, "01:00" },
|
||||
{0x12, 0x01, 0x20, 0x00, "02:00" },
|
||||
};
|
||||
|
||||
STDDIPINFO(Drv)
|
||||
|
||||
|
||||
UINT16 inputs(INT32 inp)
|
||||
static UINT8 alpha_mcu_r(UINT8 offset)
|
||||
{
|
||||
UINT8 ret = 0;
|
||||
static const UINT8 coinage1[2][2] = {{1,1}, {1,2}};
|
||||
static const UINT8 coinage2[2][2] = {{1,5}, {2,1}};
|
||||
|
||||
switch (inp)
|
||||
{
|
||||
case 0x00: { // start + service
|
||||
ret |= DrvJoy1[7] << 0; //
|
||||
ret |= DrvJoy2[7] << 1;
|
||||
ret |= DrvJoy1[8] << 7; // clear credit
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x01: { // player 1 controls
|
||||
for (INT32 i = 0; i < 6; i++) ret |= DrvJoy1[i] << i;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x02: { // player 2 controls
|
||||
for (INT32 i = 0; i < 6; i++) ret |= DrvJoy2[i] << i;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x03: { // coins
|
||||
ret = (DrvJoy1[6] | (DrvJoy2[6] << 1)) ^ 3;
|
||||
}
|
||||
break;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
UINT8 soundlatch_r(UINT32)
|
||||
{
|
||||
return soundlatch;
|
||||
}
|
||||
|
||||
UINT8 __fastcall alpha_mcu_r(UINT8 offset)
|
||||
{
|
||||
static UINT8 coinvalue = 0;
|
||||
static const UINT8 coinage1[2][2] = { {1, 1}, {1, 2} };
|
||||
static const UINT8 coinage2[2][2] = { {1, 5}, {2, 1} };
|
||||
|
||||
static INT32 latch;
|
||||
UINT16 source = SekReadWord(0x180e00 + offset);
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x01: // Dipswitch 2
|
||||
M68KRom[0x180e44] = DrvDips & 0xff;
|
||||
return 0;
|
||||
case 0x00:
|
||||
SekWriteWord(0x180e00, (source & 0xff00) | DrvDips);
|
||||
return 0;
|
||||
|
||||
case 0x45: // Coin value
|
||||
M68KRom[0x180e44] = credits & 0xff;
|
||||
return 0;
|
||||
case 0x44:
|
||||
SekWriteWord(0x180e44, (source & 0xff00) | credits);
|
||||
return 0;
|
||||
|
||||
case 0x53: // Query microcontroller for coin insert
|
||||
{
|
||||
case 0x52:
|
||||
credits = 0;
|
||||
if ((DrvInputs[2] & 0x3) == 0)
|
||||
mcu_latch = 0;
|
||||
|
||||
if ((inputs(3) & 0x03) == 0x03) latch = 0;
|
||||
SekWriteWord(0x180e52, (source & 0xff00) | 0x22);
|
||||
|
||||
M68KRom[0x180e52] = 0x22;
|
||||
|
||||
if ((inputs(3) & 0x03) != 0x03 && latch == 0)
|
||||
if ((DrvInputs[2] & 0x1) == 0x1 && !mcu_latch)
|
||||
{
|
||||
M68KRom[0x180e44] = 0x00;
|
||||
SekWriteWord(0x180e44, (source & 0xff00) | 0x00);
|
||||
mcu_latch = 1;
|
||||
|
||||
latch = 1;
|
||||
INT32 coinvalue = (~DrvDips >> 3) & 1;
|
||||
|
||||
coinvalue = (~DrvDips>>3) & 1;
|
||||
|
||||
if (~inputs(3) & 0x01)
|
||||
deposits1++;
|
||||
if (deposits1 == coinage1[coinvalue][0])
|
||||
{
|
||||
deposits1++;
|
||||
if (deposits1 == coinage1[coinvalue][0])
|
||||
{
|
||||
credits = coinage1[coinvalue][1];
|
||||
deposits1 = 0;
|
||||
}
|
||||
else
|
||||
credits = 0;
|
||||
}
|
||||
else if (~inputs(3) & 0x02)
|
||||
{
|
||||
deposits2++;
|
||||
if (deposits2 == coinage2[coinvalue][0])
|
||||
{
|
||||
credits = coinage2[coinvalue][1];
|
||||
deposits2 = 0;
|
||||
}
|
||||
else
|
||||
credits = 0;
|
||||
credits = coinage1[coinvalue][1];
|
||||
deposits1 = 0;
|
||||
}
|
||||
else
|
||||
credits = 0;
|
||||
}
|
||||
}
|
||||
else if ((DrvInputs[2] & 0x2) == 0x2 && !mcu_latch)
|
||||
{
|
||||
SekWriteWord(0x180e44, (source & 0xff00) | 0x00);
|
||||
mcu_latch = 1;
|
||||
|
||||
return 0;
|
||||
INT32 coinvalue = (~DrvDips >> 3) & 1;
|
||||
|
||||
deposits2++;
|
||||
if (deposits2 == coinage2[coinvalue][0])
|
||||
{
|
||||
credits = coinage2[coinvalue][1];
|
||||
deposits2 = 0;
|
||||
}
|
||||
else
|
||||
credits = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT8 __fastcall meijinsn_read_byte(UINT32 a)
|
||||
UINT8 __fastcall meijinsn_read_byte(UINT32 address)
|
||||
{
|
||||
if ((a & ~0xff) == 0x080e00) {
|
||||
return alpha_mcu_r(a & 0xff);
|
||||
if ((address & ~0xff) == 0x080e00) {
|
||||
return alpha_mcu_r(address & 0xfe);
|
||||
}
|
||||
|
||||
switch (a)
|
||||
switch (address)
|
||||
{
|
||||
case 0x1a0000:
|
||||
return inputs(0);
|
||||
return DrvInputs[0] >> 8;
|
||||
|
||||
case 0x1a0001:
|
||||
return inputs(1);
|
||||
return DrvInputs[0] >> 0;
|
||||
|
||||
case 0x1c0000:
|
||||
return inputs(2);
|
||||
return DrvInputs[1] >> 8;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __fastcall meijinsn_write_byte(UINT32 a, UINT8 d)
|
||||
void __fastcall meijinsn_write_byte(UINT32 address, UINT8 data)
|
||||
{
|
||||
if (a == 0x1a0001) {
|
||||
soundlatch = d & 0xff;
|
||||
if (address == 0x1a0001) {
|
||||
*soundlatch = data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UINT8 __fastcall meijinsn_in_port(UINT16 a)
|
||||
UINT8 __fastcall meijinsn_in_port(UINT16 port)
|
||||
{
|
||||
if ((a & 0xff) == 0x01) { // AY8910 read port
|
||||
if ((port & 0xff) == 0x01) {
|
||||
return AY8910Read(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __fastcall meijinsn_out_port(UINT16 a, UINT8 data)
|
||||
void __fastcall meijinsn_out_port(UINT16 port, UINT8 data)
|
||||
{
|
||||
switch (a & 0xff)
|
||||
switch (port & 0xff)
|
||||
{
|
||||
case 0x00: // AY8910 control port
|
||||
AY8910Write(0, 0, data);
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
AY8910Write(0, port & 1, data);
|
||||
break;
|
||||
|
||||
case 0x01: // AY8910 write port
|
||||
AY8910Write(0, 1, data);
|
||||
break;
|
||||
|
||||
case 0x02: // Soundlatch clear
|
||||
soundlatch = 0;
|
||||
case 0x02:
|
||||
*soundlatch = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static UINT8 ay8910_port_a_r(UINT32)
|
||||
{
|
||||
return *soundlatch;
|
||||
}
|
||||
|
||||
static INT32 DrvDoReset()
|
||||
{
|
||||
DrvReset = 0;
|
||||
|
||||
memset (M68KRom + 0x100000, 0, 0x082000); // clear 68k RAM
|
||||
memset (Z80Rom + 0x008000, 0, 0x000800); // clear z80 RAM
|
||||
|
||||
deposits1 = 0;
|
||||
deposits2 = 0;
|
||||
credits = 0;
|
||||
memset (AllRam, 0, RamEnd - AllRam);
|
||||
|
||||
SekOpen(0);
|
||||
SekReset();
|
||||
|
@ -255,102 +230,139 @@ static INT32 DrvDoReset()
|
|||
|
||||
AY8910Reset(0);
|
||||
|
||||
credits = 0;
|
||||
mcu_latch = 0;
|
||||
deposits1 = 0;
|
||||
deposits2 = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void Pallete_Init()
|
||||
static INT32 MemIndex()
|
||||
{
|
||||
#define combine_3_weights(tab,w0,w1,w2) ((int)(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2)) + 0.5))
|
||||
UINT8 *Next; Next = AllMem;
|
||||
|
||||
float weights_r[3] = { 41.697944, 73.045335, 140.256721};
|
||||
float weights_g[3] = { 41.697944, 73.045335, 140.256721};
|
||||
float weights_b[3] = { 83.228546, 159.809836, 0.000000};
|
||||
Drv68KROM = Next; Next += 0x040000;
|
||||
DrvZ80ROM = Next; Next += 0x008000;
|
||||
|
||||
DrvColPROM = Next; Next += 0x000020;
|
||||
|
||||
DrvPalette = (UINT32*)Next; Next += 0x0010 * sizeof(UINT32);
|
||||
|
||||
AllRam = Next;
|
||||
|
||||
Drv68KRAM = Next; Next += 0x002000;
|
||||
DrvZ80RAM = Next; Next += 0x000800;
|
||||
DrvVidRAM = Next; Next += 0x008000;
|
||||
|
||||
soundlatch = Next; Next += 0x000001;
|
||||
|
||||
RamEnd = Next;
|
||||
|
||||
pAY8910Buffer[0] = (INT16*)Next; Next += nBurnSoundLen * sizeof(INT16);
|
||||
pAY8910Buffer[1] = (INT16*)Next; Next += nBurnSoundLen * sizeof(INT16);
|
||||
pAY8910Buffer[2] = (INT16*)Next; Next += nBurnSoundLen * sizeof(INT16);
|
||||
|
||||
MemEnd = Next;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void DrvPaletteInit()
|
||||
{
|
||||
for (INT32 i = 0; i < 0x10; i++)
|
||||
{
|
||||
INT32 bit0,bit1,bit2,r,g,b;
|
||||
INT32 bit0 = (DrvColPROM[i] >> 0) & 0x01;
|
||||
INT32 bit1 = (DrvColPROM[i] >> 1) & 0x01;
|
||||
INT32 bit2 = (DrvColPROM[i] >> 2) & 0x01;
|
||||
|
||||
// red component
|
||||
bit0 = (Prom[i] >> 0) & 0x01;
|
||||
bit1 = (Prom[i] >> 1) & 0x01;
|
||||
bit2 = (Prom[i] >> 2) & 0x01;
|
||||
r = combine_3_weights(weights_r, bit0, bit1, bit2);
|
||||
INT32 r = ((bit0 * 4169) + (bit1 * 7304) + (bit2 * 14025)) / 100;
|
||||
|
||||
// green component
|
||||
bit0 = (Prom[i] >> 3) & 0x01;
|
||||
bit1 = (Prom[i] >> 4) & 0x01;
|
||||
bit2 = (Prom[i] >> 5) & 0x01;
|
||||
g = combine_3_weights(weights_g, bit0, bit1, bit2);
|
||||
bit0 = (DrvColPROM[i] >> 3) & 0x01;
|
||||
bit1 = (DrvColPROM[i] >> 4) & 0x01;
|
||||
bit2 = (DrvColPROM[i] >> 5) & 0x01;
|
||||
|
||||
// blue component
|
||||
bit0 = (Prom[i] >> 6) & 0x01;
|
||||
bit1 = (Prom[i] >> 7) & 0x01;
|
||||
b = combine_3_weights(weights_b, bit0, bit1, 0);
|
||||
INT32 g = ((bit0 * 4169) + (bit1 * 7304) + (bit2 * 14025)) / 100;
|
||||
|
||||
Palette[i] = (r << 16) | (g << 8) | b;
|
||||
bit0 = (DrvColPROM[i] >> 6) & 0x01;
|
||||
bit1 = (DrvColPROM[i] >> 7) & 0x01;
|
||||
|
||||
INT32 b = ((bit0 * 8322) + (bit1 * 15980)) / 100;
|
||||
|
||||
DrvPalette[i] = BurnHighCol(r, g, b, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 DrvInit()
|
||||
{
|
||||
Mem = (UINT8 *)BurnMalloc(0x210020 + (0x10 * sizeof(UINT32)));
|
||||
if (Mem == NULL) {
|
||||
return 1;
|
||||
}
|
||||
AllMem = NULL;
|
||||
MemIndex();
|
||||
INT32 nLen = MemEnd - (UINT8 *)0;
|
||||
if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;
|
||||
memset(AllMem, 0, nLen);
|
||||
MemIndex();
|
||||
|
||||
M68KRom = Mem + 0x000000;
|
||||
Z80Rom = Mem + 0x200000;
|
||||
Prom = Mem + 0x210000;
|
||||
Palette = (UINT32 *)(Mem + 0x210020);
|
||||
|
||||
pFMBuffer = (INT16 *)malloc (nBurnSoundLen * 3 * sizeof(INT16));
|
||||
if (pFMBuffer == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
pAY8910Buffer[0] = pFMBuffer + nBurnSoundLen * 0;
|
||||
pAY8910Buffer[1] = pFMBuffer + nBurnSoundLen * 1;
|
||||
pAY8910Buffer[2] = pFMBuffer + nBurnSoundLen * 2;
|
||||
|
||||
// Load roms
|
||||
{
|
||||
INT32 i;
|
||||
for (i = 0; i < 8; i+=2) {
|
||||
BurnLoadRom(M68KRom + 0x100001, i + 0, 2);
|
||||
BurnLoadRom(M68KRom + 0x100000, i + 1, 2);
|
||||
UINT8 *tmp = BurnMalloc(0x10000);
|
||||
|
||||
memcpy (M68KRom + 0x00000 + 0x08000 * (i >> 1), M68KRom + 0x100000, 0x08000);
|
||||
memcpy (M68KRom + 0x20000 + 0x08000 * (i >> 1), M68KRom + 0x108000, 0x08000);
|
||||
}
|
||||
if (BurnLoadRom(tmp + 0x000001, 0, 2)) return 1;
|
||||
if (BurnLoadRom(tmp + 0x000000, 1, 2)) return 1;
|
||||
|
||||
BurnLoadRom(Z80Rom + 0x00000, 8, 1);
|
||||
BurnLoadRom(Z80Rom + 0x04000, 9, 1);
|
||||
BurnLoadRom(Prom, 10, 1);
|
||||
memcpy (Drv68KROM + 0x000000, tmp + 0x000000, 0x008000);
|
||||
memcpy (Drv68KROM + 0x020000, tmp + 0x008000, 0x008000);
|
||||
|
||||
if (BurnLoadRom(tmp + 0x000001, 2, 2)) return 1;
|
||||
if (BurnLoadRom(tmp + 0x000000, 3, 2)) return 1;
|
||||
|
||||
memcpy (Drv68KROM + 0x008000, tmp + 0x000000, 0x008000);
|
||||
memcpy (Drv68KROM + 0x028000, tmp + 0x008000, 0x008000);
|
||||
|
||||
if (BurnLoadRom(tmp + 0x000001, 4, 2)) return 1;
|
||||
if (BurnLoadRom(tmp + 0x000000, 5, 2)) return 1;
|
||||
|
||||
memcpy (Drv68KROM + 0x010000, tmp + 0x000000, 0x008000);
|
||||
memcpy (Drv68KROM + 0x030000, tmp + 0x008000, 0x008000);
|
||||
|
||||
if (BurnLoadRom(tmp + 0x000001, 6, 2)) return 1;
|
||||
if (BurnLoadRom(tmp + 0x000000, 7, 2)) return 1;
|
||||
|
||||
memcpy (Drv68KROM + 0x018000, tmp + 0x000000, 0x008000);
|
||||
memcpy (Drv68KROM + 0x038000, tmp + 0x008000, 0x008000);
|
||||
|
||||
BurnFree (tmp);
|
||||
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x00000, 8, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x04000, 9, 1)) return 1;
|
||||
|
||||
if (BurnLoadRom(DrvColPROM + 0x000, 10, 1)) return 1;
|
||||
|
||||
DrvPaletteInit();
|
||||
}
|
||||
|
||||
SekInit(0, 0x68000);
|
||||
SekOpen(0);
|
||||
SekMapMemory(M68KRom, 0x000000, 0x03ffff, SM_ROM);
|
||||
SekMapMemory(M68KRom + 0x100000, 0x100000, 0x181fff, SM_RAM);
|
||||
SekSetReadByteHandler(0, meijinsn_read_byte);
|
||||
SekSetWriteByteHandler(0, meijinsn_write_byte);
|
||||
SekMapMemory(Drv68KROM, 0x000000, 0x03ffff, SM_ROM);
|
||||
SekMapMemory(DrvVidRAM, 0x100000, 0x107fff, SM_RAM);
|
||||
SekMapMemory(Drv68KRAM, 0x180000, 0x181fff, SM_RAM);
|
||||
SekSetWriteByteHandler(0, meijinsn_write_byte);
|
||||
SekSetReadByteHandler(0, meijinsn_read_byte);
|
||||
SekClose();
|
||||
|
||||
ZetInit(0);
|
||||
ZetOpen(0);
|
||||
ZetMapArea(0x0000, 0xffff, 0, Z80Rom);
|
||||
ZetMapArea(0x0000, 0x7fff, 2, Z80Rom);
|
||||
ZetMapArea(0x8000, 0x87ff, 0, Z80Rom + 0x8000);
|
||||
ZetMapArea(0x8000, 0x87ff, 1, Z80Rom + 0x8000);
|
||||
ZetMapArea(0x8000, 0x87ff, 2, Z80Rom + 0x8000);
|
||||
ZetSetInHandler(meijinsn_in_port);
|
||||
ZetMapArea(0x0000, 0x7fff, 0, DrvZ80ROM);
|
||||
ZetMapArea(0x0000, 0x7fff, 2, DrvZ80ROM);
|
||||
ZetMapArea(0x8000, 0x87ff, 0, DrvZ80RAM);
|
||||
ZetMapArea(0x8000, 0x87ff, 1, DrvZ80RAM);
|
||||
ZetMapArea(0x8000, 0x87ff, 2, DrvZ80RAM);
|
||||
ZetSetOutHandler(meijinsn_out_port);
|
||||
ZetSetInHandler(meijinsn_in_port);
|
||||
ZetMemEnd();
|
||||
ZetClose();
|
||||
|
||||
AY8910Init(0, 2000000, nBurnSoundRate, &soundlatch_r, NULL, NULL, NULL);
|
||||
AY8910Init(0, 2000000, nBurnSoundRate, &ay8910_port_a_r, NULL, NULL, NULL);
|
||||
|
||||
Pallete_Init();
|
||||
GenericTilesInit();
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
|
@ -359,66 +371,74 @@ static INT32 DrvInit()
|
|||
|
||||
static INT32 DrvExit()
|
||||
{
|
||||
AY8910Exit(0);
|
||||
GenericTilesExit();
|
||||
|
||||
SekExit();
|
||||
ZetExit();
|
||||
AY8910Exit(0);
|
||||
|
||||
BurnFree (Mem);
|
||||
Palette = NULL;
|
||||
BurnFree (pFMBuffer);
|
||||
Mem = M68KRom = Z80Rom = Prom = NULL;
|
||||
pFMBuffer = NULL;
|
||||
pAY8910Buffer[0] = pAY8910Buffer[1] = pAY8910Buffer[2] = NULL;
|
||||
BurnFree(AllMem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_layer()
|
||||
{
|
||||
UINT16 *vram = (UINT16*)DrvVidRAM;
|
||||
|
||||
for (INT32 i = 0; i < 0x4000; i++)
|
||||
{
|
||||
INT32 sx = (i >> 6) & 0xfc;
|
||||
INT32 sy = i & 0xff;
|
||||
|
||||
if (sy < 16 || sy > 239 || sx < 12 || sx > 240) continue;
|
||||
|
||||
sx -= 12;
|
||||
sy -= 16;
|
||||
|
||||
INT32 data = vram[i];
|
||||
|
||||
for (INT32 x = 0; x < 4; x++, data >>= 1)
|
||||
{
|
||||
pTransDraw[sy * 232 + sx + (x ^ 3)] = (data & 1) | ((data >> 3) & 2) | ((data >> 6) & 4) | ((data >> 9) & 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 DrvDraw()
|
||||
{
|
||||
for (INT32 i = 0; i < 0x4000; i++)
|
||||
{
|
||||
INT32 sx, sy, x, data1, data2, color, data;
|
||||
|
||||
sx = (i >> 6) & 0xfc;
|
||||
sy = i & 0xff;
|
||||
|
||||
if (sy < 16 || sy > 239 || sx < 12 || sx > 240) continue;
|
||||
sx -= 12; sy = (sy - 16) * 232;
|
||||
|
||||
data1 = M68KRom[0x100001 + (i << 1)];
|
||||
data2 = M68KRom[0x100000 + (i << 1)];
|
||||
|
||||
for (x = 0; x < 4; x++)
|
||||
{
|
||||
color = ((data1 >> x) & 1) | ((data1 >> (3 + x)) & 2);
|
||||
data = ((data2 >> x) & 1) | ((data2 >> (3 + x)) & 2);
|
||||
|
||||
UINT32 c = Palette[(color << 2) | data];
|
||||
|
||||
PutPix(pBurnDraw + (sy + sx + (x ^ 3)) * nBurnBpp, BurnHighCol(c >> 16, c >> 8, c, 0));
|
||||
}
|
||||
if (DrvRecalc) {
|
||||
DrvPaletteInit();
|
||||
DrvRecalc = 0;
|
||||
}
|
||||
|
||||
draw_layer();
|
||||
|
||||
BurnTransferCopy(DrvPalette);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static INT32 DrvFrame()
|
||||
{
|
||||
if (DrvReset) {
|
||||
DrvDoReset();
|
||||
}
|
||||
|
||||
INT32 nSoundBufferPos = 0;
|
||||
{
|
||||
memset (DrvInputs, 0, 3 * sizeof(INT16));
|
||||
|
||||
for (INT32 i = 0; i < 16; i++) {
|
||||
DrvInputs[0] ^= (DrvJoy1[i] & 1) << i;
|
||||
DrvInputs[1] ^= (DrvJoy2[i] & 1) << i;
|
||||
DrvInputs[2] ^= (DrvJoy3[i] & 1) << i;
|
||||
}
|
||||
}
|
||||
|
||||
INT32 nInterleave = 160;
|
||||
|
||||
INT32 nCyclesSegment;
|
||||
INT32 nCyclesDone[2], nCyclesTotal[2];
|
||||
|
||||
nCyclesTotal[0] = 9000000 / 60;
|
||||
nCyclesTotal[1] = 4000000 / 60;
|
||||
nCyclesDone[0] = nCyclesDone[1] = 0;
|
||||
INT32 nCyclesTotal[2] = { 9000000 / 60, 4000000 / 60 };
|
||||
INT32 nCyclesDone[2] = { 0, 0 };
|
||||
|
||||
SekOpen(0);
|
||||
ZetOpen(0);
|
||||
|
@ -429,7 +449,7 @@ static INT32 DrvFrame()
|
|||
nNext = (i + 1) * nCyclesTotal[0] / nInterleave;
|
||||
nCyclesSegment = nNext - nCyclesDone[0];
|
||||
nCyclesDone[0] += SekRun(nCyclesSegment);
|
||||
if (i == 79) SekSetIRQLine(2, SEK_IRQSTATUS_AUTO);
|
||||
if (i == 0) SekSetIRQLine(2, SEK_IRQSTATUS_AUTO);
|
||||
if (i == 159) SekSetIRQLine(1, SEK_IRQSTATUS_AUTO);
|
||||
|
||||
nNext = (i + 1) * nCyclesTotal[1] / nInterleave;
|
||||
|
@ -437,51 +457,25 @@ static INT32 DrvFrame()
|
|||
nCyclesSegment = ZetRun(nCyclesSegment);
|
||||
nCyclesDone[1] += nCyclesSegment;
|
||||
ZetSetIRQLine(0, ZET_IRQSTATUS_AUTO);
|
||||
|
||||
// Render Sound Segment
|
||||
if (pBurnSoundOut) {
|
||||
INT32 nSample;
|
||||
INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos;
|
||||
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
|
||||
AY8910Update(0, &pAY8910Buffer[0], nSegmentLength);
|
||||
for (INT32 n = 0; n < nSegmentLength; n++) {
|
||||
nSample = pAY8910Buffer[0][n];
|
||||
nSample += pAY8910Buffer[1][n];
|
||||
nSample += pAY8910Buffer[2][n];
|
||||
|
||||
nSample /= 4;
|
||||
|
||||
nSample = BURN_SND_CLIP(nSample);
|
||||
|
||||
pSoundBuf[(n << 1) + 0] = nSample;
|
||||
pSoundBuf[(n << 1) + 1] = nSample;
|
||||
}
|
||||
nSoundBufferPos += nSegmentLength;
|
||||
}
|
||||
}
|
||||
|
||||
ZetClose();
|
||||
SekClose();
|
||||
|
||||
// Make sure the buffer is entirely filled.
|
||||
if (pBurnSoundOut) {
|
||||
INT32 nSample;
|
||||
INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos;
|
||||
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
|
||||
if (nSegmentLength) {
|
||||
AY8910Update(0, &pAY8910Buffer[0], nSegmentLength);
|
||||
for (INT32 n = 0; n < nSegmentLength; n++) {
|
||||
nSample = pAY8910Buffer[0][n];
|
||||
nSample += pAY8910Buffer[1][n];
|
||||
nSample += pAY8910Buffer[2][n];
|
||||
AY8910Update(0, &pAY8910Buffer[0], nBurnSoundLen);
|
||||
for (INT32 n = 0; n < nBurnSoundLen; n++) {
|
||||
nSample = pAY8910Buffer[0][n];
|
||||
nSample += pAY8910Buffer[1][n];
|
||||
nSample += pAY8910Buffer[2][n];
|
||||
|
||||
nSample /= 4;
|
||||
nSample /= 4;
|
||||
|
||||
nSample = BURN_SND_CLIP(nSample);
|
||||
nSample = BURN_SND_CLIP(nSample);
|
||||
|
||||
pSoundBuf[(n << 1) + 0] = nSample;
|
||||
pSoundBuf[(n << 1) + 1] = nSample;
|
||||
}
|
||||
pBurnSoundOut[(n << 1) + 0] = nSample;
|
||||
pBurnSoundOut[(n << 1) + 1] = nSample;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -492,34 +486,26 @@ static INT32 DrvFrame()
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static INT32 DrvScan(INT32 nAction,INT32 *pnMin)
|
||||
{
|
||||
struct BurnArea ba;
|
||||
|
||||
if (pnMin) { // Return minimum compatible version
|
||||
if (pnMin) {
|
||||
*pnMin = 0x029521;
|
||||
}
|
||||
|
||||
if (nAction & ACB_VOLATILE) { // Scan volatile ram
|
||||
if (nAction & ACB_VOLATILE) {
|
||||
memset(&ba, 0, sizeof(ba));
|
||||
ba.Data = M68KRom + 0x100000;
|
||||
ba.nLen = 0x082000;
|
||||
ba.szName = "Main 68K Ram";
|
||||
ba.Data = AllRam;
|
||||
ba.nLen = RamEnd - AllRam;
|
||||
ba.szName = "All Ram";
|
||||
BurnAcb(&ba);
|
||||
|
||||
memset(&ba, 0, sizeof(ba));
|
||||
ba.Data = Z80Rom + 0x8000;
|
||||
ba.nLen = 0x00800;
|
||||
ba.szName = "Main Z80 Ram";
|
||||
BurnAcb(&ba);
|
||||
SekScan(nAction);
|
||||
ZetScan(nAction);
|
||||
AY8910Scan(nAction, pnMin);
|
||||
|
||||
SekScan(nAction); // Scan 68K
|
||||
ZetScan(nAction); // Scan Z80
|
||||
AY8910Scan(nAction, pnMin); // Scan AY8910
|
||||
|
||||
// Scan critical driver variables
|
||||
SCAN_VAR(soundlatch);
|
||||
SCAN_VAR(mcu_latch);
|
||||
SCAN_VAR(deposits1);
|
||||
SCAN_VAR(deposits2);
|
||||
SCAN_VAR(credits);
|
||||
|
@ -556,6 +542,6 @@ struct BurnDriver BurnDrvMeijinsn = {
|
|||
L"\u540D\u4EBA\u6226\0Meijinsen\0", NULL, NULL, NULL,
|
||||
BDF_GAME_WORKING, 2, HARDWARE_MISC_PRE90S, GBF_PUZZLE, 0,
|
||||
NULL, meijinsnRomInfo, meijinsnRomName, NULL, NULL, DrvInputInfo, DrvDIPInfo,
|
||||
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, NULL, 0x10,
|
||||
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x10,
|
||||
232, 224, 4, 3
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue