diff options
| author | 2008-01-08 20:46:56 +0000 | |
|---|---|---|
| committer | 2008-01-08 20:46:56 +0000 | |
| commit | e8be9779ee0826ee03c9cd72250a767e8cf481c2 (patch) | |
| tree | 250ef8db4de4bc73d137ad4d4bf4965987e8c549 /src | |
| parent | 5ef1f5ec190b2124eed0ab2c0c23a69da2938da8 (diff) | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/audio/mario.c | 385 | ||||
| -rw-r--r-- | src/mame/drivers/mario.c | 169 | ||||
| -rw-r--r-- | src/mame/includes/mario.h | 15 | ||||
| -rw-r--r-- | src/mame/video/mario.c | 60 |
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; } |
