* 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:
Couriersud 2008-01-08 20:46:56 +00:00
parent 5ef1f5ec19
commit e8be9779ee
4 changed files with 432 additions and 199 deletions

View File

@ -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")

View File

@ -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

View File

@ -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 );

View File

@ -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;
}