summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/audio/mario.c385
-rw-r--r--src/mame/drivers/mario.c169
-rw-r--r--src/mame/includes/mario.h15
-rw-r--r--src/mame/video/mario.c60
4 files changed, 431 insertions, 198 deletions
diff --git a/src/mame/audio/mario.c b/src/mame/audio/mario.c
index 50c22f53eb7..3e39e54a4d3 100644
--- a/src/mame/audio/mario.c
+++ b/src/mame/audio/mario.c
@@ -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
+ *
+ ****************************************************************/
+
+#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))
-static UINT8 last;
+ /************************************************/
+ /* 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")
diff --git a/src/mame/drivers/mario.c b/src/mame/drivers/mario.c
index b0e9ba7c777..7b359d11d79 100644
--- a/src/mame/drivers/mario.c
+++ b/src/mame/drivers/mario.c
@@ -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);
+
/*************************************
*
- * Main CPU memory handlers
+ * statics
*
*************************************/
-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 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();
+}
-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 */
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+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
diff --git a/src/mame/includes/mario.h b/src/mame/includes/mario.h
index c95fd9575da..516890005df 100644
--- a/src/mame/includes/mario.h
+++ b/src/mame/includes/mario.h
@@ -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 );
diff --git a/src/mame/video/mario.c b/src/mame/video/mario.c
index def96e18de5..004a8224516 100644
--- a/src/mame/video/mario.c
+++ b/src/mame/video/mario.c
@@ -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;
}