mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
mario.c:
* discrete sound * hooked up z80dma * combined memory maps * statics in mario_state struct * fixed save state issues * combine sh_* writes into one routine The skid sound is different from the samples. Reducing the LS123 capacitor by 40% will give the same sound, so I assume this is due to capacitor aging on the board the samples were recorded.
This commit is contained in:
parent
5ef1f5ec19
commit
e8be9779ee
@ -2,7 +2,7 @@
|
||||
#include "cpu/i8039/i8039.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "sound/samples.h"
|
||||
#include "sound/discrete.h"
|
||||
|
||||
#include "includes/mario.h"
|
||||
|
||||
@ -15,16 +15,210 @@
|
||||
#define ACTIVELOW_PORT_BIT(P,A,D) ((P & (~(1 << A))) | ((D ^ 1) << A))
|
||||
#define ACTIVEHIGH_PORT_BIT(P,A,D) ((P & (~(1 << A))) | (D << A))
|
||||
|
||||
#define I8035_T_R(N) ((soundlatch2_r(0) >> (N)) & 1)
|
||||
#define I8035_T_W_AH(N,D) do { state->portT = ACTIVEHIGH_PORT_BIT(state->portT,N,D); soundlatch2_w(0, state->portT); } while (0)
|
||||
|
||||
#define I8035_P1_R() (soundlatch3_r(0))
|
||||
#define I8035_P2_R() (soundlatch4_r(0))
|
||||
#define I8035_P1_W(D) soundlatch3_w(0,D)
|
||||
#define I8035_P2_W(D) soundlatch4_w(0,D)
|
||||
|
||||
#define I8035_P1_W_AH(B,D) I8035_P1_W(ACTIVEHIGH_PORT_BIT(I8035_P1_R(),B,(D)))
|
||||
#define I8035_P2_W_AH(B,D) I8035_P2_W(ACTIVEHIGH_PORT_BIT(I8035_P2_R(),B,(D)))
|
||||
|
||||
/****************************************************************
|
||||
*
|
||||
* Discrete Sound defines
|
||||
*
|
||||
****************************************************************/
|
||||
|
||||
/* Discrete sound inputs */
|
||||
|
||||
#define DS_SOUND0_INV NODE_01
|
||||
#define DS_SOUND1_INV NODE_02
|
||||
#define DS_SOUND7_INV NODE_05
|
||||
#define DS_DAC NODE_07
|
||||
|
||||
#define DS_SOUND0 NODE_208
|
||||
#define DS_SOUND1 NODE_209
|
||||
#define DS_SOUND7 NODE_212
|
||||
|
||||
#define DS_OUT_SOUND0 NODE_241
|
||||
#define DS_OUT_SOUND1 NODE_242
|
||||
#define DS_OUT_SOUND7 NODE_248
|
||||
#define DS_OUT_DAC NODE_250
|
||||
|
||||
/* Input definitions for write handlers */
|
||||
|
||||
#define DS_SOUND0_INP DS_SOUND0_INV
|
||||
#define DS_SOUND1_INP DS_SOUND1_INV
|
||||
#define DS_SOUND7_INP DS_SOUND7_INV
|
||||
|
||||
/* General defines */
|
||||
|
||||
#define VSS 5.0
|
||||
#define TTL_HIGH 4.0
|
||||
#define GND 0.0
|
||||
|
||||
#define R_PARALLEL(R1,R2) ((R1)*(R2)/((R1)+(R2)))
|
||||
#define R_SERIE(R1,R2) ((R1)+(R2))
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* statics
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static UINT8 p[8] = { 0,0xf0,0,0,0,0,0,0 };
|
||||
static UINT8 t[2] = { 0,0 };
|
||||
/****************************************************************
|
||||
*
|
||||
* Mario Discrete Sound Interface
|
||||
*
|
||||
****************************************************************/
|
||||
|
||||
static UINT8 last;
|
||||
#define MR_R6 RES_K(4.7)
|
||||
#define MR_R7 RES_K(4.7)
|
||||
#define MR_R17 RES_K(30)
|
||||
#define MR_R18 RES_K(30)
|
||||
#define MR_R61 RES_K(47)
|
||||
#define MR_R64 RES_K(20)
|
||||
#define MR_R65 RES_K(10)
|
||||
|
||||
#define MR_C3 CAP_U(10)
|
||||
#define MR_C4 CAP_U(47)
|
||||
#define MR_C5 CAP_N(39)
|
||||
#define MR_C6 CAP_N(3.9)
|
||||
#define MR_C14 CAP_U(4.7)
|
||||
#define MR_C15 CAP_U(4.7)
|
||||
#define MR_C16 CAP_N(6.8)
|
||||
#define MR_C17 CAP_N(22)
|
||||
#define MR_C39 CAP_N(4.7)
|
||||
#define MR_C40 CAP_N(22)
|
||||
#define MR_C41 CAP_U(4.7)
|
||||
#define MR_C43 CAP_U(3.3)
|
||||
#define MR_C44 CAP_U(3.3)
|
||||
|
||||
/* KT = 0.25 for diode circuit, 0.33 else */
|
||||
|
||||
#define DISCRETE_LS123(_N, _T, _R, _C) \
|
||||
DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE)
|
||||
#define DISCRETE_LS123_INV(_N, _T, _R, _C) \
|
||||
DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE | DISC_OUT_ACTIVE_LOW)
|
||||
|
||||
#define DISCRETE_BITSET(_N, _N1, _B) DISCRETE_TRANSFORM3(_N, 1, _N1, 1 << ((_B)-1), 0, "01&2>")
|
||||
#define DISCRETE_ENERGY_NAND(_N, _E, _N1, _N2) DISCRETE_TRANSFORM3(_N, _E, _N1, _N2, 1, "201*-")
|
||||
|
||||
#define MR_R20 RES_K(22)
|
||||
#define MR_R19 RES_K(22)
|
||||
|
||||
#define MR_R41 RES_K(100)
|
||||
#define MR_R40 RES_K(22)
|
||||
|
||||
#define MR_C32 CAP_U(1)
|
||||
#define MR_C31 CAP_U(0.022)
|
||||
|
||||
static const discrete_mixer_desc mario_mixer_desc =
|
||||
{DISC_MIXER_IS_RESISTOR,
|
||||
{MR_R20, MR_R19, MR_R41, MR_R40},
|
||||
{0,0,0,0,0}, // no variable resistors
|
||||
{0,0,0,0,0}, // no node capacitors
|
||||
0, RES_M(1), // Dummy,
|
||||
MR_C31,
|
||||
MR_C32,
|
||||
0, 1};
|
||||
|
||||
|
||||
static DISCRETE_SOUND_START(mario)
|
||||
|
||||
/************************************************/
|
||||
/* Input register mapping for dkongjr */
|
||||
/************************************************/
|
||||
|
||||
/* DISCRETE_INPUT_DATA */
|
||||
DISCRETE_INPUT_NOT(DS_SOUND0_INV)
|
||||
DISCRETE_INPUT_NOT(DS_SOUND1_INV)
|
||||
DISCRETE_INPUT_NOT(DS_SOUND7_INV)
|
||||
DISCRETE_INPUT_DATA(DS_DAC)
|
||||
|
||||
/************************************************/
|
||||
/* SIGNALS */
|
||||
/************************************************/
|
||||
|
||||
//DISCRETE_LOGIC_INVERT(DS_SOUND7,1,DS_SOUND7_INV)
|
||||
//DISCRETE_LOGIC_INVERT(DS_SOUND9,1,DS_SOUND9_INV)
|
||||
|
||||
/************************************************/
|
||||
/* SOUND0 */
|
||||
/************************************************/
|
||||
|
||||
DISCRETE_LS123(NODE_10, DS_SOUND0_INV, MR_R17, MR_C14)
|
||||
DISCRETE_RCFILTER(NODE_11, 1, NODE_10, MR_R6, MR_C3)
|
||||
DISCRETE_74LS624( NODE_12, 1, NODE_11, VSS, MR_C6, DISC_LS624_OUT_ENERGY)
|
||||
DISCRETE_74LS624( NODE_13, 1, NODE_11, VSS, MR_C17, DISC_LS624_OUT_ENERGY)
|
||||
|
||||
DISCRETE_LOGIC_XOR(NODE_14, 1, NODE_12, NODE_13)
|
||||
DISCRETE_LOGIC_AND(NODE_15, 1, NODE_14, NODE_10)
|
||||
DISCRETE_MULTIPLY(DS_OUT_SOUND0, 1, NODE_15, TTL_HIGH)
|
||||
|
||||
/************************************************/
|
||||
/* SOUND1 */
|
||||
/************************************************/
|
||||
|
||||
DISCRETE_LS123(NODE_20, DS_SOUND1_INV, MR_R18, MR_C15)
|
||||
DISCRETE_RCFILTER(NODE_21, 1, NODE_20, MR_R7, MR_C4)
|
||||
DISCRETE_74LS624( NODE_22, 1, NODE_21, VSS, MR_C5, DISC_LS624_OUT_ENERGY)
|
||||
DISCRETE_74LS624( NODE_23, 1, NODE_21, VSS, MR_C16, DISC_LS624_OUT_ENERGY)
|
||||
|
||||
DISCRETE_LOGIC_XOR(NODE_24, 1, NODE_22, NODE_23)
|
||||
DISCRETE_LOGIC_AND(NODE_25, 1, NODE_24, NODE_20)
|
||||
DISCRETE_MULTIPLY(DS_OUT_SOUND1, 1, NODE_25, TTL_HIGH)
|
||||
|
||||
/************************************************/
|
||||
/* SOUND7 */
|
||||
/************************************************/
|
||||
|
||||
DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT)
|
||||
|
||||
DISCRETE_BITSET(NODE_102, NODE_100, 4) //LS157 2B
|
||||
DISCRETE_BITSET(NODE_104, NODE_100, 12) //LS157 3B
|
||||
|
||||
DISCRETE_LS123(NODE_110, DS_SOUND7_INV, MR_R61, MR_C41)
|
||||
DISCRETE_TRANSFORM2(NODE_111, 1, TTL_HIGH, NODE_110, "01-")
|
||||
DISCRETE_RCFILTER(NODE_112, 1, NODE_111, MR_R65, MR_C44)
|
||||
DISCRETE_74LS624(NODE_113, 1, NODE_112, VSS, MR_C40, DISC_LS624_OUT_LOGIC)
|
||||
|
||||
DISCRETE_LOGIC_XOR(NODE_115, 1, NODE_102, NODE_113)
|
||||
|
||||
DISCRETE_TRANSFORM2(NODE_116,1, NODE_104, TTL_HIGH, "0!1*")
|
||||
DISCRETE_RCFILTER(NODE_117, 1, NODE_116, MR_R64, MR_C43)
|
||||
DISCRETE_74LS624(NODE_118, 1, NODE_117, VSS, MR_C39, DISC_LS624_OUT_COUNT_F)
|
||||
|
||||
DISCRETE_LOGIC_AND(NODE_120, 1, NODE_115, NODE_110)
|
||||
DISCRETE_MULTIPLY(DS_OUT_SOUND7, 1, NODE_120, TTL_HIGH)
|
||||
|
||||
/************************************************/
|
||||
/* DAC */
|
||||
/************************************************/
|
||||
|
||||
/* following the resistor DAC are two opamps. The first is a 1:1 amplifier, the second
|
||||
* is a filter circuit. Simulation in LTSPICE shows, that the following is equivalent:
|
||||
*/
|
||||
|
||||
DISCRETE_MULTIPLY(NODE_170, 1, DS_DAC, TTL_HIGH/256.0)
|
||||
DISCRETE_RCFILTER(DS_OUT_DAC, 1, NODE_170, RES_K(750), CAP_P(200))
|
||||
|
||||
/************************************************/
|
||||
/* Amplifier */
|
||||
/************************************************/
|
||||
|
||||
DISCRETE_MIXER4(NODE_295, 1, DS_OUT_SOUND0, DS_OUT_SOUND1, DS_OUT_SOUND7, DS_OUT_DAC, &mario_mixer_desc)
|
||||
|
||||
/* Amplifier: internal amplifier
|
||||
* Just a 1:n amplifier without filters and no output capacitor
|
||||
*/
|
||||
DISCRETE_OUTPUT(NODE_295, 32767.0/5.0 * 3 )
|
||||
DISCRETE_WAVELOG2(DS_SOUND7_INV, 32767/5, NODE_110, 32767/5)
|
||||
|
||||
DISCRETE_SOUND_END
|
||||
|
||||
/****************************************************************
|
||||
*
|
||||
@ -34,10 +228,26 @@ static UINT8 last;
|
||||
|
||||
static SOUND_START( mario )
|
||||
{
|
||||
p[1] = 0xf0;
|
||||
state_save_register_global_array(p);
|
||||
state_save_register_global_array(t);
|
||||
state_save_register_global(last);
|
||||
mario_state *state = machine->driver_data;
|
||||
|
||||
state_save_register_global(state->last);
|
||||
state_save_register_global(state->portT);
|
||||
soundlatch_clear_w(0,0);
|
||||
soundlatch2_clear_w(0,0);
|
||||
soundlatch3_clear_w(0,0);
|
||||
soundlatch4_clear_w(0,0);
|
||||
/*
|
||||
* The code below will play the correct start up sound
|
||||
* However, it is not backed by hardware at all.
|
||||
*/
|
||||
//soundlatch_w(0,2);
|
||||
}
|
||||
|
||||
static SOUND_RESET( mario )
|
||||
{
|
||||
mario_state *state = machine->driver_data;
|
||||
|
||||
state->last = 0;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
@ -48,42 +258,49 @@ static SOUND_START( mario )
|
||||
|
||||
static READ8_HANDLER( mario_sh_p1_r )
|
||||
{
|
||||
return p[1];
|
||||
return I8035_P1_R();
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mario_sh_p2_r )
|
||||
{
|
||||
return p[2];
|
||||
return I8035_P2_R() & 0xE0; /* Bit 4 connected to GND! */
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mario_sh_t0_r )
|
||||
{
|
||||
return t[0];
|
||||
return I8035_T_R(0);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mario_sh_t1_r )
|
||||
{
|
||||
return t[1];
|
||||
return I8035_T_R(1);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mario_sh_tune_r )
|
||||
{
|
||||
return soundlatch_r(offset);
|
||||
UINT8 *SND = memory_region(REGION_CPU2);
|
||||
UINT16 mask = memory_region_length(REGION_CPU2)-1;
|
||||
UINT8 p2 = I8035_P2_R();
|
||||
|
||||
if ((p2 >> 7) & 1)
|
||||
return soundlatch_r(offset);
|
||||
else
|
||||
return (SND[(0x1000 + (p2 & 0x0f)*256+offset) & mask]);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mario_sh_sound_w )
|
||||
{
|
||||
DAC_data_w(0,data);
|
||||
discrete_sound_w(DS_DAC,data);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mario_sh_p1_w )
|
||||
{
|
||||
p[1] = data;
|
||||
I8035_P1_W(data);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mario_sh_p2_w )
|
||||
{
|
||||
p[2] = data;
|
||||
I8035_P2_W(data);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
@ -92,35 +309,17 @@ static WRITE8_HANDLER( mario_sh_p2_w )
|
||||
*
|
||||
****************************************************************/
|
||||
|
||||
WRITE8_HANDLER( mario_sh_getcoin_w )
|
||||
{
|
||||
t[0] = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_sh_crab_w )
|
||||
{
|
||||
p[1] = ACTIVEHIGH_PORT_BIT(p[1],0,data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_sh_turtle_w )
|
||||
{
|
||||
p[1] = ACTIVEHIGH_PORT_BIT(p[1],1,data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_sh_fly_w )
|
||||
{
|
||||
p[1] = ACTIVEHIGH_PORT_BIT(p[1],2,data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( masao_sh_irqtrigger_w )
|
||||
{
|
||||
if (last == 1 && data == 0)
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
if (state->last == 1 && data == 0)
|
||||
{
|
||||
/* setting bit 0 high then low triggers IRQ on the sound CPU */
|
||||
cpunum_set_input_line_and_vector(1,0,HOLD_LINE,0xff);
|
||||
}
|
||||
|
||||
last = data;
|
||||
state->last = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_sh_tuneselect_w )
|
||||
@ -128,62 +327,52 @@ WRITE8_HANDLER( mario_sh_tuneselect_w )
|
||||
soundlatch_w(offset,data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_sh_w )
|
||||
{
|
||||
if (data)
|
||||
cpunum_set_input_line(1,0,ASSERT_LINE);
|
||||
else
|
||||
cpunum_set_input_line(1,0,CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
/* Mario running sample */
|
||||
WRITE8_HANDLER( mario_sh1_w )
|
||||
{
|
||||
static int last;
|
||||
|
||||
if (last!= data)
|
||||
{
|
||||
last = data;
|
||||
if (data && sample_playing(0) == 0) sample_start (0, 3, 0);
|
||||
}
|
||||
discrete_sound_w(DS_SOUND0_INP,data & 1);
|
||||
}
|
||||
|
||||
/* Luigi running sample */
|
||||
WRITE8_HANDLER( mario_sh2_w )
|
||||
{
|
||||
static int last;
|
||||
|
||||
if (last!= data)
|
||||
{
|
||||
last = data;
|
||||
if (data && sample_playing(1) == 0) sample_start (1, 4, 0);
|
||||
}
|
||||
discrete_sound_w(DS_SOUND1_INP,data & 1);
|
||||
}
|
||||
|
||||
/* Misc samples */
|
||||
WRITE8_HANDLER( mario_sh3_w )
|
||||
{
|
||||
static int state[8];
|
||||
|
||||
/* Don't trigger the sample if it's still playing */
|
||||
if (state[offset] == data) return;
|
||||
|
||||
state[offset] = data;
|
||||
if (data)
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 2: /* ice */
|
||||
sample_start (2, 0, 0);
|
||||
break;
|
||||
case 6: /* coin */
|
||||
sample_start (2, 1, 0);
|
||||
break;
|
||||
case 7: /* skid */
|
||||
sample_start (2, 2, 0);
|
||||
break;
|
||||
}
|
||||
case 0: /* death */
|
||||
if (data)
|
||||
cpunum_set_input_line(1,0,ASSERT_LINE);
|
||||
else
|
||||
cpunum_set_input_line(1,0,CLEAR_LINE);
|
||||
break;
|
||||
case 1: /* get coin */
|
||||
I8035_T_W_AH(0,data & 1);
|
||||
break;
|
||||
case 2: /* ice */
|
||||
I8035_T_W_AH(1,data & 1);
|
||||
break;
|
||||
case 3: /* crab */
|
||||
I8035_P1_W_AH(0,data & 1);
|
||||
break;
|
||||
case 4: /* turtle */
|
||||
I8035_P1_W_AH(1,data & 1);
|
||||
break;
|
||||
case 5: /* fly */
|
||||
I8035_P1_W_AH(2,data & 1);
|
||||
break;
|
||||
case 6: /* coin */
|
||||
I8035_P1_W_AH(3,data & 1);
|
||||
break;
|
||||
case 7: /* skid */
|
||||
discrete_sound_w(DS_SOUND7_INP,data & 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -218,30 +407,6 @@ ADDRESS_MAP_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const char *const mario_sample_names[] =
|
||||
{
|
||||
"*mario",
|
||||
|
||||
/* 7f01 - 7f07 sounds */
|
||||
"ice.wav", /* 0x02 ice appears (formerly effect0.wav) */
|
||||
"coin.wav", /* 0x06 coin appears (formerly effect1.wav) */
|
||||
"skid.wav", /* 0x07 skid */
|
||||
|
||||
/* 7c00 */
|
||||
"run.wav", /* 03, 02, 01 - 0x1b */
|
||||
|
||||
/* 7c80 */
|
||||
"luigirun.wav", /* 03, 02, 01 - 0x1c */
|
||||
|
||||
0 /* end of array */
|
||||
};
|
||||
|
||||
static const struct Samplesinterface samples_interface =
|
||||
{
|
||||
3, /* 3 channels */
|
||||
mario_sample_names
|
||||
};
|
||||
|
||||
static const struct AY8910interface ay8910_interface =
|
||||
{
|
||||
soundlatch_r
|
||||
@ -261,15 +426,12 @@ MACHINE_DRIVER_START( mario_audio )
|
||||
MDRV_CPU_IO_MAP(mario_sound_io_map, 0)
|
||||
|
||||
MDRV_SOUND_START(mario)
|
||||
MDRV_SOUND_RESET(mario)
|
||||
|
||||
MDRV_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MDRV_SOUND_ADD(DAC, 0)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
|
||||
MDRV_SOUND_ADD(SAMPLES, 0)
|
||||
MDRV_SOUND_CONFIG(samples_interface)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||
MDRV_SOUND_ADD_TAG("discrete", DISCRETE, 0)
|
||||
MDRV_SOUND_CONFIG_DISCRETE(mario)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.5)
|
||||
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
@ -279,6 +441,7 @@ MACHINE_DRIVER_START( masao_audio )
|
||||
MDRV_CPU_PROGRAM_MAP(masao_sound_map,0)
|
||||
|
||||
MDRV_SOUND_START(mario)
|
||||
MDRV_SOUND_RESET(mario)
|
||||
|
||||
MDRV_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
|
@ -1,11 +1,15 @@
|
||||
/***************************************************************************
|
||||
|
||||
TODO:
|
||||
- combine memory maps
|
||||
- discrete sound
|
||||
- combine sh_* writes into one routine
|
||||
- start up sound (Sound #2 should play but does not
|
||||
|
||||
Done:
|
||||
- discrete sound
|
||||
- hooked up z80dma
|
||||
- combined memory maps
|
||||
- statics in mario_state struct
|
||||
- fixed save state issues
|
||||
- combine sh_* writes into one routine
|
||||
- Hooked up flipscreen
|
||||
- Changed monitor orientation to ROT0
|
||||
- fixed mario0110u1gre
|
||||
@ -86,70 +90,118 @@ write:
|
||||
***************************************************************************/
|
||||
|
||||
#include "driver.h"
|
||||
#include "machine/z80dma.h"
|
||||
|
||||
#include "mario.h"
|
||||
|
||||
static UINT8 mario_dma_read_byte(offs_t offset);
|
||||
static void mario_dma_write_byte(offs_t offset, UINT8 data);
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* statics
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const struct z80dma_interface mario_dma =
|
||||
{
|
||||
0,
|
||||
Z80_CLOCK,
|
||||
|
||||
mario_dma_read_byte,
|
||||
mario_dma_write_byte,
|
||||
0, 0, 0, 0
|
||||
};
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine setup
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( mario )
|
||||
{
|
||||
z80dma_init(1);
|
||||
z80dma_config(0, &mario_dma);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mario )
|
||||
{
|
||||
z80dma_reset();
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* DMA handling
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static UINT8 mario_dma_read_byte(offs_t offset)
|
||||
{
|
||||
UINT8 result;
|
||||
|
||||
cpuintrf_push_context(0);
|
||||
result = program_read_byte(offset);
|
||||
cpuintrf_pop_context();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void mario_dma_write_byte(offs_t offset, UINT8 data)
|
||||
{
|
||||
cpuintrf_push_context(0);
|
||||
program_write_byte(offset, data);
|
||||
cpuintrf_pop_context();
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Main CPU memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_READ(MRA8_ROM)
|
||||
AM_RANGE(0x6000, 0x6fff) AM_READ(MRA8_RAM)
|
||||
AM_RANGE(0x7400, 0x77ff) AM_READ(MRA8_RAM) /* video RAM */
|
||||
AM_RANGE(0x7c00, 0x7c00) AM_READ(input_port_0_r) /* IN0 */
|
||||
AM_RANGE(0x7c80, 0x7c80) AM_READ(input_port_1_r) /* IN1 */
|
||||
AM_RANGE(0x7f80, 0x7f80) AM_READ(input_port_2_r) /* DSW */
|
||||
AM_RANGE(0xf000, 0xffff) AM_READ(MRA8_ROM)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_WRITE(MWA8_ROM)
|
||||
AM_RANGE(0x6000, 0x68ff) AM_WRITE(MWA8_RAM)
|
||||
AM_RANGE(0x6a80, 0x6fff) AM_WRITE(MWA8_RAM)
|
||||
AM_RANGE(0x6900, 0x6a7f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
|
||||
AM_RANGE(0x7400, 0x77ff) AM_WRITE(mario_videoram_w) AM_BASE(&videoram)
|
||||
AM_RANGE(0x7c00, 0x7c00) AM_WRITE(mario_sh1_w) /* Mario run sample */
|
||||
AM_RANGE(0x7c80, 0x7c80) AM_WRITE(mario_sh2_w) /* Luigi run sample */
|
||||
static ADDRESS_MAP_START( mario_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_ROM
|
||||
AM_RANGE(0x6000, 0x6fff) AM_RAM
|
||||
AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* physical sprite ram */
|
||||
AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, mario_videoram_w) AM_BASE(&videoram)
|
||||
AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_WRITE(mario_sh1_w) /* Mario run sample */
|
||||
AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_WRITE(mario_sh2_w) /* Luigi run sample */
|
||||
AM_RANGE(0x7d00, 0x7d00) AM_WRITE(mario_scroll_w)
|
||||
AM_RANGE(0x7e80, 0x7e80) AM_WRITE(mario_gfxbank_w)
|
||||
AM_RANGE(0x7e82, 0x7e82) AM_WRITE(mario_flip_w)
|
||||
AM_RANGE(0x7e83, 0x7e83) AM_WRITE(mario_palettebank_w)
|
||||
AM_RANGE(0x7e84, 0x7e84) AM_WRITE(interrupt_enable_w)
|
||||
AM_RANGE(0x7f00, 0x7f00) AM_WRITE(mario_sh_w) /* death */
|
||||
AM_RANGE(0x7f01, 0x7f01) AM_WRITE(mario_sh_getcoin_w)
|
||||
AM_RANGE(0x7f03, 0x7f03) AM_WRITE(mario_sh_crab_w)
|
||||
AM_RANGE(0x7f04, 0x7f04) AM_WRITE(mario_sh_turtle_w)
|
||||
AM_RANGE(0x7f05, 0x7f05) AM_WRITE(mario_sh_fly_w)
|
||||
AM_RANGE(0x7f00, 0x7f07) AM_WRITE(mario_sh3_w) /* Misc discrete samples */
|
||||
AM_RANGE(0x7e85, 0x7e85) AM_WRITE(z80dma_0_rdy_w) /* ==> DMA Chip */
|
||||
AM_RANGE(0x7f00, 0x7f07) AM_WRITE(mario_sh3_w) /* Sound port */
|
||||
AM_RANGE(0x7f80, 0x7f80) AM_READ_PORT("DSW0") /* DSW */
|
||||
AM_RANGE(0x7e00, 0x7e00) AM_WRITE(mario_sh_tuneselect_w)
|
||||
AM_RANGE(0x7000, 0x73ff) AM_WRITE(MWA8_NOP) /* ??? */
|
||||
// AM_RANGE(0x7e85, 0x7e85) AM_WRITE(MWA8_RAM) /* Sets alternative 1 and 0 */
|
||||
AM_RANGE(0xf000, 0xffff) AM_WRITE(MWA8_ROM)
|
||||
AM_RANGE(0xf000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( masao_writemem, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_WRITE(MWA8_ROM)
|
||||
AM_RANGE(0x6000, 0x68ff) AM_WRITE(MWA8_RAM)
|
||||
AM_RANGE(0x6a80, 0x6fff) AM_WRITE(MWA8_RAM)
|
||||
AM_RANGE(0x6900, 0x6a7f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
|
||||
AM_RANGE(0x7400, 0x77ff) AM_WRITE(mario_videoram_w) AM_BASE(&videoram)
|
||||
static ADDRESS_MAP_START( masao_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_ROM
|
||||
AM_RANGE(0x6000, 0x6fff) AM_RAM
|
||||
AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* physical sprite ram */
|
||||
AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, mario_videoram_w) AM_BASE(&videoram)
|
||||
AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0")
|
||||
AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1")
|
||||
AM_RANGE(0x7d00, 0x7d00) AM_WRITE(mario_scroll_w)
|
||||
AM_RANGE(0x7e00, 0x7e00) AM_WRITE(soundlatch_w)
|
||||
AM_RANGE(0x7e80, 0x7e80) AM_WRITE(mario_gfxbank_w)
|
||||
AM_RANGE(0x7e82, 0x7e82) AM_WRITE(mario_flip_w)
|
||||
AM_RANGE(0x7e83, 0x7e83) AM_WRITE(mario_palettebank_w)
|
||||
AM_RANGE(0x7e84, 0x7e84) AM_WRITE(interrupt_enable_w)
|
||||
AM_RANGE(0x7000, 0x73ff) AM_WRITE(MWA8_NOP) /* ??? */
|
||||
AM_RANGE(0x7e85, 0x7e85) AM_WRITE(z80dma_0_rdy_w) /* ==> DMA Chip */
|
||||
AM_RANGE(0x7f00, 0x7f00) AM_WRITE(masao_sh_irqtrigger_w)
|
||||
AM_RANGE(0xf000, 0xffff) AM_WRITE(MWA8_ROM)
|
||||
AM_RANGE(0x7f80, 0x7f80) AM_READ_PORT("DSW0") /* DSW */
|
||||
AM_RANGE(0xf000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mario_writeport, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
|
||||
AM_RANGE(0x00, 0x00) AM_WRITE(MWA8_NOP) /*Z80 DMA Ctrl port */
|
||||
AM_RANGE(0x00, 0x00) AM_READWRITE(z80dma_0_r, z80dma_0_w) /* dma controller */
|
||||
//AM_RANGE(0x00, 0x00) AM_WRITE(MWA8_NOP) /*Z80 DMA Ctrl port */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*************************************
|
||||
@ -299,13 +351,19 @@ GFXDECODE_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_DRIVER_START( mario )
|
||||
static MACHINE_DRIVER_START( mario_base )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mario_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD(Z80, Z80_CLOCK) /* verified on pcb */
|
||||
MDRV_CPU_PROGRAM_MAP(readmem,writemem)
|
||||
MDRV_CPU_ADD_TAG("main", Z80, Z80_CLOCK) /* verified on pcb */
|
||||
MDRV_CPU_PROGRAM_MAP(mario_map, 0)
|
||||
MDRV_CPU_IO_MAP(0,mario_writeport)
|
||||
MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
|
||||
|
||||
MDRV_MACHINE_START(mario)
|
||||
MDRV_MACHINE_RESET(mario)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
|
||||
@ -318,6 +376,13 @@ static MACHINE_DRIVER_START( mario )
|
||||
MDRV_VIDEO_START(mario)
|
||||
MDRV_VIDEO_UPDATE(mario)
|
||||
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
static MACHINE_DRIVER_START( mario )
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_IMPORT_FROM(mario_base )
|
||||
|
||||
/* sound hardware */
|
||||
MDRV_IMPORT_FROM(mario_audio)
|
||||
MACHINE_DRIVER_END
|
||||
@ -326,21 +391,13 @@ MACHINE_DRIVER_END
|
||||
static MACHINE_DRIVER_START( masao )
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD(Z80, 4000000) /* 4.000 MHz (?) */
|
||||
MDRV_CPU_PROGRAM_MAP(readmem,masao_writemem)
|
||||
MDRV_IMPORT_FROM(mario_base )
|
||||
|
||||
MDRV_CPU_REPLACE("main", Z80, 4000000) /* 4.000 MHz (?) */
|
||||
MDRV_CPU_PROGRAM_MAP(masao_map, 0)
|
||||
MDRV_CPU_IO_MAP(0,mario_writeport)
|
||||
MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
|
||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||
MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
|
||||
MDRV_GFXDECODE(mario)
|
||||
MDRV_PALETTE_LENGTH(512)
|
||||
|
||||
MDRV_PALETTE_INIT(mario)
|
||||
MDRV_VIDEO_START(mario)
|
||||
MDRV_VIDEO_UPDATE(mario)
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
MDRV_IMPORT_FROM(masao_audio)
|
||||
MACHINE_DRIVER_END
|
||||
|
@ -39,12 +39,16 @@ struct _mario_state
|
||||
/* machine states */
|
||||
|
||||
/* sound state */
|
||||
UINT8 last;
|
||||
UINT8 portT;
|
||||
|
||||
/* video state */
|
||||
UINT8 gfx_bank;
|
||||
UINT8 palette_bank;
|
||||
UINT16 gfx_scroll;
|
||||
|
||||
/* Save state relevant */
|
||||
|
||||
UINT8 dummy; /* structs need to have something */
|
||||
tilemap *bg_tilemap;
|
||||
int monitor;
|
||||
};
|
||||
|
||||
/*----------- defined in video/mario.c -----------*/
|
||||
@ -62,15 +66,10 @@ VIDEO_UPDATE( mario );
|
||||
|
||||
/*----------- defined in audio/mario.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mario_sh_w );
|
||||
WRITE8_HANDLER( mario_sh1_w );
|
||||
WRITE8_HANDLER( mario_sh2_w );
|
||||
WRITE8_HANDLER( mario_sh3_w );
|
||||
|
||||
WRITE8_HANDLER( mario_sh_getcoin_w );
|
||||
WRITE8_HANDLER( mario_sh_crab_w );
|
||||
WRITE8_HANDLER( mario_sh_turtle_w );
|
||||
WRITE8_HANDLER( mario_sh_fly_w );
|
||||
WRITE8_HANDLER( mario_sh_tuneselect_w );
|
||||
WRITE8_HANDLER( masao_sh_irqtrigger_w );
|
||||
|
||||
|
@ -11,11 +11,6 @@
|
||||
|
||||
#include "includes/mario.h"
|
||||
|
||||
static UINT8 gfx_bank, palette_bank;
|
||||
static int monitor;
|
||||
|
||||
static tilemap *bg_tilemap;
|
||||
|
||||
static const res_net_decode_info mario_decode_info =
|
||||
{
|
||||
1, // there may be two proms needed to construct color
|
||||
@ -84,57 +79,71 @@ PALETTE_INIT( mario )
|
||||
|
||||
WRITE8_HANDLER( mario_videoram_w )
|
||||
{
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
videoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap, offset);
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_gfxbank_w )
|
||||
{
|
||||
if (gfx_bank != (data & 0x01))
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
if (state->gfx_bank != (data & 0x01))
|
||||
{
|
||||
gfx_bank = data & 0x01;
|
||||
state->gfx_bank = data & 0x01;
|
||||
tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_palettebank_w )
|
||||
{
|
||||
if (palette_bank != (data & 0x01))
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
if (state->palette_bank != (data & 0x01))
|
||||
{
|
||||
palette_bank = data & 0x01;
|
||||
state->palette_bank = data & 0x01;
|
||||
tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_scroll_w )
|
||||
{
|
||||
tilemap_set_scrolly(bg_tilemap, 0, data + 17);
|
||||
mario_state *state = Machine->driver_data;
|
||||
|
||||
state->gfx_scroll = data + 17;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mario_flip_w )
|
||||
{
|
||||
|
||||
flip_screen_set(data & 0x01);
|
||||
tilemap_set_scrollx(bg_tilemap, 0, flip_screen ? (HTOTAL-HBSTART) : 0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
int code = videoram[tile_index] + 256 * gfx_bank;
|
||||
mario_state *state = Machine->driver_data;
|
||||
int code = videoram[tile_index] + 256 * state->gfx_bank;
|
||||
int color;
|
||||
|
||||
color = ((videoram[tile_index] >> 2) & 0x38) | 0x40 | (palette_bank<<7) | (monitor<<8);
|
||||
color = ((videoram[tile_index] >> 2) & 0x38) | 0x40 | (state->palette_bank<<7) | (state->monitor<<8);
|
||||
color = color >> 2;
|
||||
SET_TILE_INFO(0, code, color, 0);
|
||||
}
|
||||
|
||||
VIDEO_START( mario )
|
||||
{
|
||||
bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows,
|
||||
mario_state *state = machine->driver_data;
|
||||
|
||||
state->bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows,
|
||||
TILEMAP_TYPE_PEN, 8, 8, 32, 32);
|
||||
|
||||
state_save_register_global(gfx_bank);
|
||||
state_save_register_global(palette_bank);
|
||||
state->gfx_bank = 0;
|
||||
state->palette_bank = 0;
|
||||
state->gfx_scroll = 0;
|
||||
state_save_register_global(state->gfx_bank);
|
||||
state_save_register_global(state->palette_bank);
|
||||
state_save_register_global(state->gfx_scroll);
|
||||
state_save_register_global(flip_screen);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -144,6 +153,7 @@ VIDEO_START( mario )
|
||||
|
||||
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
|
||||
{
|
||||
mario_state *state = Machine->driver_data;
|
||||
int offs;
|
||||
|
||||
for (offs = 0;offs < spriteram_size;offs += 4)
|
||||
@ -167,7 +177,7 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re
|
||||
x -= 7;
|
||||
drawgfx(bitmap,machine->gfx[1],
|
||||
spriteram[offs + 2],
|
||||
(spriteram[offs + 1] & 0x0f) + 16 * palette_bank+32 * monitor,
|
||||
(spriteram[offs + 1] & 0x0f) + 16 * state->palette_bank + 32 * state->monitor,
|
||||
!(spriteram[offs + 1] & 0x80),!(spriteram[offs + 1] & 0x40),
|
||||
x, y,
|
||||
cliprect,TRANSPARENCY_PEN,0);
|
||||
@ -178,7 +188,7 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re
|
||||
x -= 8;
|
||||
drawgfx(bitmap,machine->gfx[1],
|
||||
spriteram[offs + 2],
|
||||
(spriteram[offs + 1] & 0x0f) + 16 * palette_bank+32 * monitor,
|
||||
(spriteram[offs + 1] & 0x0f) + 16 * state->palette_bank + 32 * state->monitor,
|
||||
(spriteram[offs + 1] & 0x80),(spriteram[offs + 1] & 0x40),
|
||||
x, y,
|
||||
cliprect,TRANSPARENCY_PEN,0);
|
||||
@ -189,14 +199,18 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re
|
||||
|
||||
VIDEO_UPDATE( mario )
|
||||
{
|
||||
mario_state *state = machine->driver_data;
|
||||
int t;
|
||||
|
||||
t = readinputportbytag("MONITOR");
|
||||
if (t != monitor)
|
||||
if (t != state->monitor)
|
||||
{
|
||||
monitor = t;
|
||||
state->monitor = t;
|
||||
tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
|
||||
}
|
||||
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
|
||||
tilemap_set_scrollx(state->bg_tilemap, 0, flip_screen ? (HTOTAL-HBSTART) : 0);
|
||||
tilemap_set_scrolly(state->bg_tilemap, 0, state->gfx_scroll);
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
draw_sprites(machine, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user