diff --git a/src/mame/audio/8080bw.cpp b/src/mame/audio/8080bw.cpp index 5c2f9e99d42..27fcb7add51 100644 --- a/src/mame/audio/8080bw.cpp +++ b/src/mame/audio/8080bw.cpp @@ -4,9 +4,11 @@ /* 8080bw.c *******************************************/ #include "emu.h" +#include "includes/8080bw.h" + #include "sound/samples.h" #include "sound/discrete.h" -#include "includes/8080bw.h" +#include "speaker.h" /*******************************************************/ @@ -24,6 +26,67 @@ MACHINE_START_MEMBER(_8080bw_state,extra_8080bw_sh) +/************************************* + * + * Space Invaders + * + * Author : Tormod Tjaberg + * Created : 1997-04-09 + * Description : Sound routines for the 'invaders' games + * + * Note: + * The samples were taken from Michael Strutt's (mstrutt@pixie.co.za) + * excellent space invader emulator and converted to signed samples so + * they would work under SEAL. The port info was also gleaned from + * his emulator. These sounds should also work on all the invader games. + * + *************************************/ + +static const char *const invaders_sample_names[] = +{ + "*invaders", + "1", /* shot/missle */ + "2", /* base hit/explosion */ + "3", /* invader hit */ + "4", /* fleet move 1 */ + "5", /* fleet move 2 */ + "6", /* fleet move 3 */ + "7", /* fleet move 4 */ + "8", /* UFO/saucer hit */ + "9", /* bonus base */ + nullptr +}; + + +/* left in for all games that hack into invaders samples for audio */ +void _8080bw_state::invaders_samples_audio(machine_config &config) +{ + SPEAKER(config, "mono").front_center(); + + SN76477(config, m_sn); + m_sn->set_noise_params(0, 0, 0); + m_sn->set_decay_res(0); + m_sn->set_attack_params(0, RES_K(100)); + m_sn->set_amp_res(RES_K(56)); + m_sn->set_feedback_res(RES_K(10)); + m_sn->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); + m_sn->set_pitch_voltage(5.0); + m_sn->set_slf_params(CAP_U(1.0), RES_K(120)); + m_sn->set_oneshot_params(0, 0); + m_sn->set_vco_mode(1); + m_sn->set_mixer_params(0, 0, 0); + m_sn->set_envelope_params(1, 0); + m_sn->set_enable(1); + m_sn->add_route(ALL_OUTPUTS, "mono", 0.5); + + SAMPLES(config, m_samples); + m_samples->set_channels(6); + m_samples->set_samples_names(invaders_sample_names); + m_samples->add_route(ALL_OUTPUTS, "mono", 1.0); +} + + + /*******************************************************/ /* */ /* Midway "Space Invaders Part II" */ diff --git a/src/mame/audio/mw8080bw.cpp b/src/mame/audio/mw8080bw.cpp index 876169de5b3..7b63eb6b70e 100644 --- a/src/mame/audio/mw8080bw.cpp +++ b/src/mame/audio/mw8080bw.cpp @@ -14,6 +14,8 @@ #include "speaker.h" +namespace { + /************************************* * * Implementation of tone generator used @@ -40,8 +42,8 @@ DISCRETE_OP_AMP_TRIG_VCA(MIDWAY_TONE_SND, MIDWAY_TONE_BEFORE_AMP_SND, MIDWAY_TONE_EN, 0, 12, 0, &discrete_op_amp_tvca_info) -/* most common values based on clowns schematic */ -static discrete_op_amp_tvca_info const midway_music_tvca_info = +// most common values based on clowns schematic +discrete_op_amp_tvca_info const midway_music_tvca_info = { RES_M(3.3), // r502 RES_K(10) + RES_K(680), // r505 + r506 @@ -77,7 +79,7 @@ static discrete_op_amp_tvca_info const midway_music_tvca_info = * *************************************/ -static discrete_lfsr_desc const midway_lfsr = +discrete_lfsr_desc const midway_lfsr = { DISC_CLK_IS_FREQ, 17, // bit length @@ -94,6 +96,517 @@ static discrete_lfsr_desc const midway_lfsr = }; +/************************************* + * + * Shared by Space Invaders and + * Space Invaders II (cocktail) + * + *************************************/ + +// sound board 1 or 2, for multi-board games +#define INVADERS_NODE(_node, _board) (NODE(_node + ((_board - 1) * 100))) + +// nodes - inputs +#define INVADERS_SAUCER_HIT_EN 01 +#define INVADERS_FLEET_DATA 02 +#define INVADERS_BONUS_MISSLE_BASE_EN 03 +#define INVADERS_INVADER_HIT_EN 04 +#define INVADERS_EXPLOSION_EN 05 +#define INVADERS_MISSILE_EN 06 + +// nodes - sounds +#define INVADERS_NOISE NODE_10 +#define INVADERS_SAUCER_HIT_SND 11 +#define INVADERS_FLEET_SND 12 +#define INVADERS_BONUS_MISSLE_BASE_SND 13 +#define INVADERS_INVADER_HIT_SND 14 +#define INVADERS_EXPLOSION_SND 15 +#define INVADERS_MISSILE_SND 16 + + +/************************************************ + * Noise Generator + ************************************************/ + +// Noise clock was breadboarded and measured at 7515 +#define INVADERS_NOISE_GENERATOR \ + DISCRETE_LFSR_NOISE(INVADERS_NOISE, /* IC N5, pin 10 */ \ + 1, /* ENAB */ \ + 1, /* no RESET */ \ + 7515, /* CLK in Hz */ \ + 12, /* p-p AMPL */ \ + 0, /* no FEED input */ \ + 12.0/2, /* dc BIAS */ \ + &midway_lfsr) + + +/************************************************ + * Saucer Hit + ************************************************/ + +discrete_op_amp_info const invaders_saucer_hit_op_amp_B3_9 = +{ + DISC_OP_AMP_IS_NORTON, + 0, // no r1 + RES_K(100), // R72 + RES_M(1), // R71 + 0, // no r4 + CAP_U(1), // C23 + 0, // vN + 12 // vP +}; + + +discrete_op_amp_osc_info const invaders_saucer_hit_osc = +{ + DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, + RES_M(1), // R70 + RES_K(470), // R64 + RES_K(100), // R61 + RES_K(120), // R63 + RES_M(1), // R62 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_U(0.1), // C21 + 12, // vP +}; + +discrete_op_amp_osc_info const invaders_saucer_hit_vco = +{ + DISC_OP_AMP_OSCILLATOR_VCO_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_SQW, + RES_M(1), // R65 + RES_K(470), // R66 + RES_K(680), // R67 + RES_M(1), // R69 + RES_M(1), // R68 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_P(470), // C22 + 12, // vP +}; + +discrete_op_amp_info const invaders_saucer_hit_op_amp_B3_10 = +{ + DISC_OP_AMP_IS_NORTON, + RES_K(680), // R73 + RES_K(680), // R77 + RES_M(2.7), // R74 + RES_K(680), // R75 + 0, // no c + 0, // vN + 12 // vP +}; + +#define INVADERS_SAUCER_HIT(_board) \ + DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, _board), 12, 0, 0) \ + DISCRETE_OP_AMP(INVADERS_NODE(20, _board), /* IC B3, pin 9 */ \ + 1, /* ENAB */ \ + 0, /* no IN0 */ \ + INVADERS_NODE(INVADERS_SAUCER_HIT_EN, _board), /* IN1 */ \ + &invaders_saucer_hit_op_amp_B3_9) \ + DISCRETE_OP_AMP_OSCILLATOR(INVADERS_NODE(21, _board), /* IC A4, pin 5 */ \ + 1, /* ENAB */ \ + &invaders_saucer_hit_osc) \ + DISCRETE_OP_AMP_VCO1(INVADERS_NODE(22, _board), /* IC A4, pin 9 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(21, _board), /* VMOD1 */ \ + &invaders_saucer_hit_vco) \ + DISCRETE_OP_AMP(INVADERS_NODE(INVADERS_SAUCER_HIT_SND, _board), /* IC B3, pin 10 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(22, _board), /* IN0 */ \ + INVADERS_NODE(20, _board), /* IN1 */ \ + &invaders_saucer_hit_op_amp_B3_10) + + +/************************************************ + * Fleet movement + ************************************************/ + +discrete_comp_adder_table const invaders_thump_resistors = +{ + DISC_COMP_P_RESISTOR, + 0, // no cDefault + 4, // length + { RES_K(20) + RES_K(20), // R126 + R127 + RES_K(68), // R128 + RES_K(82), // R129 + RES_K(100) } // R130 +}; + +discrete_555_desc const invaders_thump_555 = +{ + DISC_555_OUT_ENERGY | DISC_555_OUT_DC, + 5, + 5.0 - 0.6, // 5V - diode drop + DEFAULT_TTL_V_LOGIC_1 // Output of F3 7411 buffer +}; + +#define INVADERS_FLEET(_board) \ + DISCRETE_INPUT_DATA (INVADERS_NODE(INVADERS_FLEET_DATA, _board)) \ + DISCRETE_COMP_ADDER(INVADERS_NODE(30, _board), \ + INVADERS_NODE(INVADERS_FLEET_DATA, _board), /* DATA */ \ + &invaders_thump_resistors) \ + DISCRETE_555_ASTABLE(INVADERS_NODE(31, _board), /* IC F3, pin 6 */ \ + 1, /* RESET */ \ + INVADERS_NODE(30, _board), /* R1 */ \ + RES_K(75), /* R131 */ \ + CAP_U(0.1), /* C29 */ \ + &invaders_thump_555) \ + DISCRETE_RCFILTER(INVADERS_NODE(32, _board), \ + INVADERS_NODE(31, _board), /* IN0 */ \ + 100, /* R132 */ \ + CAP_U(4.7) ) /* C31 */ \ + DISCRETE_RCFILTER(INVADERS_NODE(INVADERS_FLEET_SND, _board), \ + INVADERS_NODE(32, _board), /* IN0 */ \ + 100 + 100, /* R132 + R133 */ \ + CAP_U(10) ) /* C32 */ + + +/************************************************ + * Bonus Missle Base + ************************************************/ + +discrete_555_desc const invaders_bonus_555 = +{ + DISC_555_OUT_SQW | DISC_555_OUT_DC, + 5.0, // 5V + DEFAULT_555_VALUES +}; + +#define INVADERS_BONUS_MISSLE_BASE(_board) \ + DISCRETE_INPUT_LOGIC (INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board)) \ + DISCRETE_555_ASTABLE(INVADERS_NODE(40, _board), /* IC F4, pin 9 */ \ + INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board), /* RESET */ \ + RES_K(100), /* R94 */ \ + RES_K(47), /* R95 */ \ + CAP_U(1), /* C34 */ \ + &invaders_bonus_555) \ + DISCRETE_SQUAREWFIX(INVADERS_NODE(41, _board), \ + 1, /* ENAB */ \ + 480, /* FREQ */ \ + 1, /* AMP */ \ + 50, /* DUTY */ \ + 1.0/2, /* BIAS */ \ + 0) /* PHASE */ \ + DISCRETE_LOGIC_AND3(INVADERS_NODE(42, _board), /* IC F3, pin 12 */ \ + INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board), /* INP0 */ \ + INVADERS_NODE(41, _board), /* INP1 */ \ + INVADERS_NODE(40, _board) ) /* INP2 */ \ + DISCRETE_GAIN(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_SND, _board),/* adjust from logic to TTL voltage level */\ + INVADERS_NODE(42, _board), /* IN0 */ \ + DEFAULT_TTL_V_LOGIC_1) /* GAIN */ + + +/************************************************ + * Invader Hit + ************************************************/ + +discrete_op_amp_info const invaders_invader_hit_op_amp_D3_10 = +{ + DISC_OP_AMP_IS_NORTON, + 0, // no r1 + RES_K(10), // R53 + RES_M(1), // R137 + 0, // no r4 + CAP_U(0.47), // C19 + 0, // vN + 12 // vP +}; + +discrete_op_amp_osc_info const invaders_invader_hit_vco = +{ + DISC_OP_AMP_OSCILLATOR_VCO_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, + RES_M(1), // R42 + RES_K(470), // R43 + RES_K(680), // R44 + RES_M(1), // R46 + RES_M(1), // R45 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_P(330), // C16 + 12, // vP +}; + +discrete_op_amp_info const invaders_invader_hit_op_amp_D3_4 = +{ + DISC_OP_AMP_IS_NORTON, + RES_K(470), // R55 + RES_K(680), // R54 + RES_M(2.7), // R56 + RES_K(680), // R57 + 0, // no c + 0, // vN + 12 // vP +}; + +#define INVADERS_INVADER_HIT(_board, _type) \ + DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_INVADER_HIT_EN, _board), 5, 0, 0) \ + DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(50, _board), /* IC D3, pin 9 */ \ + INVADERS_NODE(INVADERS_INVADER_HIT_EN, _board), /* TRIG */ \ + &_type##_invader_hit_1sht) \ + DISCRETE_OP_AMP(INVADERS_NODE(51, _board), /* IC D3, pin 10 */ \ + 1, /* ENAB */ \ + 0, /* no IN0 */ \ + INVADERS_NODE(50, _board), /* IN1 */ \ + &invaders_invader_hit_op_amp_D3_10) \ + DISCRETE_OP_AMP_OSCILLATOR(INVADERS_NODE(52, _board), /* IC B4, pin 5 */ \ + 1, /* ENAB */ \ + &_type##_invader_hit_osc) \ + DISCRETE_OP_AMP_VCO1(INVADERS_NODE(53, _board), /* IC B4, pin 4 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(52, _board), /* VMOD1 */ \ + &invaders_invader_hit_vco) \ + DISCRETE_OP_AMP(INVADERS_NODE(INVADERS_INVADER_HIT_SND, _board),/* IC D3, pin 4 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(53, _board), /* IN0 */ \ + INVADERS_NODE(51, _board), /* IN1 */ \ + &invaders_invader_hit_op_amp_D3_4) + + +/************************************************ + * Missle Sound + ************************************************/ + +discrete_op_amp_1sht_info const invaders_missle_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R32 + RES_K(100), // R30 + RES_M(1), // R31 + RES_M(1), // R33 + RES_M(2.2), // R34 + CAP_U(1), // C12 + CAP_P(470), // C15 + 0, // vN + 12 // vP +}; + +discrete_op_amp_info const invaders_missle_op_amp_B3 = +{ + DISC_OP_AMP_IS_NORTON, + 0, // no r1 + RES_K(10), // R35 + RES_M(1.5), // R36 + 0, // no r4 + CAP_U(0.22), // C13 + 0, // vN + 12 // vP +}; + +discrete_op_amp_osc_info const invaders_missle_op_amp_osc = +{ + DISC_OP_AMP_OSCILLATOR_VCO_3 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_SQW, + 1.0 / (1.0 / RES_M(1) + 1.0 / RES_K(330)) + RES_M(1.5), // R29||R11 + R12 + RES_M(1), // R16 + RES_K(560), // R17 + RES_M(2.2), // R19 + RES_M(1), // R16 + RES_M(4.7), // R14 + RES_M(3.3), // R13 + 0, // no r8 + CAP_P(330), // C58 + 12, // vP +}; + +discrete_op_amp_info const invaders_missle_op_amp_A3 = +{ + DISC_OP_AMP_IS_NORTON, + RES_K(560), // R22 + RES_K(470), // R15 + RES_M(2.7), // R20 + RES_K(560), // R21 + 0, // no c + 0, // vN + 12 // vP +}; + +discrete_op_amp_tvca_info const invaders_missle_tvca = +{ + RES_M(2.7), // R25 + RES_K(560), // R23 + 0, // no r3 + RES_K(560), // R26 + RES_K(1), // + 0, // no r6 + RES_K(560), // R60 + 0, // no r8 + 0, // no r9 + 0, // no r10 + 0, // no r11 + CAP_U(0.1), // C14 + 0, // no c2 + 0, 0, // no c3, c4 + 5, // v1 + 0, // no v2 + 0, // no v3 + 12, // vP + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f0 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f1 + DISC_OP_AMP_TRIGGER_FUNCTION_TRG0, // f2 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f3 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f4 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE // no f5 +}; + +#define INVADERS_MISSILE(_board, _type) \ + DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_MISSILE_EN, _board), 5, 0, 0) \ + DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(70, _board), /* IC B3, pin 4 */ \ + INVADERS_NODE(INVADERS_MISSILE_EN, _board), /* TRIG */ \ + &_type##_missle_1sht) \ + DISCRETE_OP_AMP(INVADERS_NODE(71, _board), /* IC B3, pin 5 */ \ + 1, /* ENAB */ \ + 0, /* no IN0 */ \ + INVADERS_NODE(70, _board), /* IN1 */ \ + &invaders_missle_op_amp_B3) \ + /* next 2 modules simulate the D1 voltage drop */ \ + DISCRETE_ADDER2(INVADERS_NODE(72, _board), \ + 1, /* ENAB */ \ + INVADERS_NODE(71, _board), /* IN0 */ \ + -0.5) /* IN1 */ \ + DISCRETE_CLAMP(INVADERS_NODE(73, _board), \ + INVADERS_NODE(72, _board), /* IN0 */ \ + 0, /* MIN */ \ + 12) /* MAX */ \ + DISCRETE_CRFILTER(INVADERS_NODE(74, _board), \ + INVADERS_NOISE, /* IN0 */ \ + RES_M(1) + RES_K(330), /* R29, R11 */ \ + CAP_U(0.1) ) /* C57 */ \ + DISCRETE_GAIN(INVADERS_NODE(75, _board), \ + INVADERS_NODE(74, _board), /* IN0 */ \ + RES_K(330)/(RES_M(1) + RES_K(330))) /* GAIN - R29 : R11 */ \ + DISCRETE_OP_AMP_VCO2(INVADERS_NODE(76, _board), /* IC C1, pin 4 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(75, _board), /* VMOD1 */ \ + INVADERS_NODE(73, _board), /* VMOD2 */ \ + &invaders_missle_op_amp_osc) \ + DISCRETE_OP_AMP(INVADERS_NODE(77, _board), /* IC A3, pin 9 */ \ + 1, /* ENAB */ \ + INVADERS_NODE(76, _board), /* IN0 */ \ + INVADERS_NODE(73, _board), /* IN1 */ \ + &invaders_missle_op_amp_A3) \ + DISCRETE_OP_AMP_TRIG_VCA(INVADERS_NODE(INVADERS_MISSILE_SND, _board), /* IC A3, pin 10 */ \ + INVADERS_NODE(INVADERS_MISSILE_EN, _board), /* TRG0 */ \ + 0, /* no TRG1 */ \ + 0, /* no TRG2 */ \ + INVADERS_NODE(77, _board), /* IN0 */ \ + 0, /* no IN1 */ \ + &invaders_missle_tvca) + + +/************************************************ + * Explosion + ************************************************/ + +discrete_op_amp_1sht_info const invaders_explosion_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R90 + RES_K(100), // R88 + RES_M(1), // R91 + RES_M(1), // R89 + RES_M(2.2), // R92 + CAP_U(2.2), // C24 + CAP_P(470), // C25 + 0, // vN + 12 // vP +}; + +discrete_op_amp_tvca_info const invaders_explosion_tvca = +{ + RES_M(2.7), // R80 + RES_K(680), // R79 + 0, // no r3 + RES_K(680), // R82 + RES_K(10), // R93 + 0, // no r6 + RES_K(680), // R83 + 0, // no r8 + 0, // no r9 + 0, // no r10 + 0, // no r11 + CAP_U(1), // C26 + 0, // no c2 + 0, 0, // no c3, c4 + 12.0 - OP_AMP_NORTON_VBE, // v1 + 0, // no v2 + 0, // no v3 + 12, // vP + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f0 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f1 + DISC_OP_AMP_TRIGGER_FUNCTION_TRG0, // f2 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f3 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE, // no f4 + DISC_OP_AMP_TRIGGER_FUNCTION_NONE // no f5 +}; + +#define INVADERS_EXPLOSION(_board) \ + DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_EXPLOSION_EN, _board), 5, 0, 0) \ + DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(60, _board), /* IC D2, pin 10 */ \ + INVADERS_NODE(INVADERS_EXPLOSION_EN, _board), /* TRIG */ \ + &invaders_explosion_1sht) \ + DISCRETE_OP_AMP_TRIG_VCA(INVADERS_NODE(61, _board), /* IC D2, pin 4 */ \ + INVADERS_NODE(60, _board), /* TRG0 */ \ + 0, /* no TRG1 */ \ + 0, /* no TRG2 */ \ + INVADERS_NOISE, /* IN0 */ \ + 0, /* no IN1 */ \ + &invaders_explosion_tvca) \ + DISCRETE_RCFILTER(INVADERS_NODE(62, _board), \ + INVADERS_NODE(61, _board), /* IN0 */ \ + RES_K(5.6), /* R84 */ \ + CAP_U(0.1) ) /* C27 */ \ + DISCRETE_RCFILTER(INVADERS_NODE(INVADERS_EXPLOSION_SND, _board), \ + INVADERS_NODE(62, _board), /* IN0 */ \ + RES_K(5.6) + RES_K(6.8), /* R84 + R85 */ \ + CAP_U(0.1) ) /* C28 */ + + +/************************************************ + * Final mix + ************************************************/ + +discrete_mixer_desc const invaders_mixer = +{ + DISC_MIXER_IS_OP_AMP, // type + { RES_K(200), // R78 + RES_K(10) + 100 + 100, // R134 + R133 + R132 + RES_K(150), // R136 + RES_K(200), // R59 + RES_K(2) + RES_K(6.8) + RES_K(5.6), // R86 + R85 + R84 + RES_K(150) }, // R28 + {0}, // no rNode{} + { 0, + 0, + 0, + 0, + 0, + CAP_U(0.001) }, // C11 + 0, // no rI + RES_K(100), // R105 + 0, // no cF + CAP_U(0.1), // C45 + 0, // vRef = ground + 1 // gain +}; + +#define INVADERS_MIXER(_board, _type) \ + DISCRETE_MIXER6(INVADERS_NODE(90, _board), \ + 1, /* ENAB */ \ + INVADERS_NODE(INVADERS_SAUCER_HIT_SND, _board), /* IN0 */ \ + INVADERS_NODE(INVADERS_FLEET_SND, _board), /* IN1 */ \ + INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_SND, _board), /* IN2 */ \ + INVADERS_NODE(INVADERS_INVADER_HIT_SND, _board), /* IN3 */ \ + INVADERS_NODE(INVADERS_EXPLOSION_SND, _board), /* IN4 */ \ + INVADERS_NODE(INVADERS_MISSILE_SND, _board), /* IN5 */ \ + &_type##_mixer) \ + DISCRETE_OUTPUT(INVADERS_NODE(90, _board), 2500) + +} // anonymous namespace + + /************************************* * * Device type globals @@ -106,7 +619,9 @@ DEFINE_DEVICE_TYPE(GMISSILE_AUDIO, gmissile_audio_device, "gmissile_audio", "Mid DEFINE_DEVICE_TYPE(M4_AUDIO, m4_audio_device, "m4_audio", "Midway M-4 Audio") DEFINE_DEVICE_TYPE(CLOWNS_AUDIO, clowns_audio_device, "clowns_audio", "Midway Clowns Audio") DEFINE_DEVICE_TYPE(SPCENCTR_AUDIO, spcenctr_audio_device, "spcenctr_audio", "Midway Space Encounters Audio") -DEFINE_DEVICE_TYPE(PHANTOM2_AUDIO, phantom2_audio_device, "pantom2_audio", "Midway Phantom 2 Audio") +DEFINE_DEVICE_TYPE(PHANTOM2_AUDIO, phantom2_audio_device, "phantom2_audio", "Midway Phantom 2 Audio") +DEFINE_DEVICE_TYPE(INVADERS_AUDIO, invaders_audio_device, "invaders_audio", "Taito Space Invaders Audio") +DEFINE_DEVICE_TYPE(INVAD2CT_AUDIO, invad2ct_audio_device, "invad2ct_audio", "Midway Space Invaders II Audio") /************************************* @@ -928,86 +1443,86 @@ static DISCRETE_SOUND_START(spcenctr_discrete) ************************************************/ // Noise clock was breadboarded and measured at 7515 DISCRETE_LFSR_NOISE(SPCENCTR_NOISE, // IC A0, pin 10 - 1, // ENAB - 1, // no RESET - 7515, // CLK in Hz - 12, // p-p AMPL - 0, // no FEED input - 12.0/2, // dc BIAS - &midway_lfsr) + 1, // ENAB + 1, // no RESET + 7515, // CLK in Hz + 12, // p-p AMPL + 0, // no FEED input + 12.0/2, // dc BIAS + &midway_lfsr) /************************************************ * Enemy Ship Shot ************************************************/ DISCRETE_OP_AMP(NODE_20, // IC E1, pin 10 - 1, // ENAB - 0, // no IN0 - SPCENCTR_ENEMY_SHIP_SHOT_EN, // IN1 - &spcenctr_enemy_ship_shot_op_amp_E1) + 1, // ENAB + 0, // no IN0 + SPCENCTR_ENEMY_SHIP_SHOT_EN, // IN1 + &spcenctr_enemy_ship_shot_op_amp_E1) DISCRETE_OP_AMP_VCO1(NODE_21, // IC D1, pin 5 - 1, // ENAB - NODE_20, // VMOD1 - &spcenctr_enemy_ship_shot_op_amp_osc) + 1, // ENAB + NODE_20, // VMOD1 + &spcenctr_enemy_ship_shot_op_amp_osc) DISCRETE_OP_AMP(NODE_22, // IC D1, pin 9 - 1, // ENAB - NODE_21, // IN0 - NODE_20, // IN1 - &spcenctr_enemy_ship_shot_op_amp_D1) + 1, // ENAB + NODE_21, // IN0 + NODE_20, // IN1 + &spcenctr_enemy_ship_shot_op_amp_D1) DISCRETE_OP_AMP_FILTER(NODE_23, // IC D1, pin 10 - 1, // ENAB - NODE_22, // INP0 - 0, // no INP1 - DISC_OP_AMP_FILTER_IS_BAND_PASS_1M | DISC_OP_AMP_IS_NORTON, - &spcenctr_enemy_ship_shot_filt) + 1, // ENAB + NODE_22, // INP0 + 0, // no INP1 + DISC_OP_AMP_FILTER_IS_BAND_PASS_1M | DISC_OP_AMP_IS_NORTON, + &spcenctr_enemy_ship_shot_filt) DISCRETE_CRFILTER(SPCENCTR_ENEMY_SHIP_SHOT_SND, - NODE_23, // IN0 - RES_K(1.8), // R116 - CAP_U(0.1) ) // C104 + NODE_23, // IN0 + RES_K(1.8), // R116 + CAP_U(0.1) ) // C104 /************************************************ * Player Shot ************************************************/ DISCRETE_OP_AMP_ONESHOT(NODE_30, // IC E1, pin 4 - SPCENCTR_PLAYER_SHOT_EN, // TRIG - &spcenctr_player_shot_1sht) // breadboarded and scoped at 325mS + SPCENCTR_PLAYER_SHOT_EN, // TRIG + &spcenctr_player_shot_1sht) // breadboarded and scoped at 325mS DISCRETE_OP_AMP(NODE_31, // IC E1, pin 5 - 1, // ENAB - 0, // no IN0 - NODE_30, // IN1 - &spcenctr_player_shot_op_amp_E1) + 1, // ENAB + 0, // no IN0 + NODE_30, // IN1 + &spcenctr_player_shot_op_amp_E1) // next 2 modules simulate the D502 voltage drop DISCRETE_ADDER2(NODE_32, - 1, // ENAB - NODE_31, // IN0 - -0.5) // IN1 + 1, // ENAB + NODE_31, // IN0 + -0.5) // IN1 DISCRETE_CLAMP(NODE_33, - NODE_32, // IN0 - 0, // MIN - 12) // MAX + NODE_32, // IN0 + 0, // MIN + 12) // MAX DISCRETE_CRFILTER(NODE_34, - SPCENCTR_NOISE, // IN0 - RES_M(1) + RES_K(330), // R507, R509 - CAP_U(0.1) ) // C503 + SPCENCTR_NOISE, // IN0 + RES_M(1) + RES_K(330), // R507, R509 + CAP_U(0.1) ) // C503 DISCRETE_GAIN(NODE_35, - NODE_34, // IN0 - RES_K(330)/(RES_M(1) + RES_K(330))) // GAIN - R507 : R509 + NODE_34, // IN0 + RES_K(330)/(RES_M(1) + RES_K(330))) // GAIN - R507 : R509 DISCRETE_OP_AMP_VCO2(NODE_36, // IC C1, pin 4 - 1, // ENAB - NODE_35, // VMOD1 - NODE_33, // VMOD2 + 1, // ENAB + NODE_35, // VMOD1 + NODE_33, // VMOD2 &spcenctr_player_shot_op_amp_osc) DISCRETE_OP_AMP(NODE_37, // IC C1, pin 9 - 1, // ENAB - NODE_36, // IN0 - NODE_33, // IN1 - &spcenctr_player_shot_op_amp_C1) + 1, // ENAB + NODE_36, // IN0 + NODE_33, // IN1 + &spcenctr_player_shot_op_amp_C1) DISCRETE_OP_AMP_TRIG_VCA(SPCENCTR_PLAYER_SHOT_SND, // IC C1, pin 10 - SPCENCTR_PLAYER_SHOT_EN, // TRG0 - 0, // no TRG1 - 0, // no TRG2 - NODE_37, // IN0 - 0, // no IN1 - &spcenctr_player_shot_tvca) + SPCENCTR_PLAYER_SHOT_EN, // TRG0 + 0, // no TRG1 + 0, // no TRG2 + NODE_37, // IN0 + 0, // no IN1 + &spcenctr_player_shot_tvca) /************************************************ *Screech - unemulated @@ -1018,78 +1533,78 @@ static DISCRETE_SOUND_START(spcenctr_discrete) * Crash ************************************************/ DISCRETE_OP_AMP_TRIG_VCA(NODE_60, // IC C2, pin 4 - SPCENCTR_CRASH_EN, // TRG0 - 0, // no TRG1 - 0, // no TRG2 - SPCENCTR_NOISE, // IN0 - 0, // no IN1 - &spcenctr_crash_tvca) + SPCENCTR_CRASH_EN, // TRG0 + 0, // no TRG1 + 0, // no TRG2 + SPCENCTR_NOISE, // IN0 + 0, // no IN1 + &spcenctr_crash_tvca) // The next 5 modules emulate the filter. // The DC level was breadboarded and the frequency response was SPICEd DISCRETE_ADDER2(NODE_61, // center on filter DC level - 1, // ENAB - NODE_60, // IN0 - -6.8) // IN1 + 1, // ENAB + NODE_60, // IN0 + -6.8) // IN1 DISCRETE_FILTER2(NODE_62, - 1, // ENAB - NODE_61, // INP0 - 130, // FREQ - 1.0 / 8, // DAMP - DISC_FILTER_BANDPASS) + 1, // ENAB + NODE_61, // INP0 + 130, // FREQ + 1.0 / 8, // DAMP + DISC_FILTER_BANDPASS) DISCRETE_GAIN(NODE_63, - NODE_62, // IN0 - 6) // GAIN - DISCRETE_ADDER2(NODE_64, // center on filter DC level - 1, // ENAB - NODE_63, // IN0 - 6.8) // IN1 - DISCRETE_CLAMP(SPCENCTR_CRASH_SND, // IC C2, pin 5 - NODE_64, // IN0 - 0, // MIN - 12.0 - OP_AMP_NORTON_VBE) // MAX + NODE_62, // IN0 + 6) // GAIN + DISCRETE_ADDER2(NODE_64, // center on filter DC level + 1, // ENAB + NODE_63, // IN0 + 6.8) // IN1 + DISCRETE_CLAMP(SPCENCTR_CRASH_SND, // IC C2, pin 5 + NODE_64, // IN0 + 0, // MIN + 12.0 - OP_AMP_NORTON_VBE) // MAX /************************************************ * Explosion ************************************************/ DISCRETE_OP_AMP_TRIG_VCA(NODE_70, // IC D2, pin 10 - SPCENCTR_EXPLOSION_EN, // TRG0 - 0, // no TRG1 - 0, // no TRG2 - SPCENCTR_NOISE, // IN0 - 0, // no IN1 - &spcenctr_explosion_tvca) + SPCENCTR_EXPLOSION_EN, // TRG0 + 0, // no TRG1 + 0, // no TRG2 + SPCENCTR_NOISE, // IN0 + 0, // no IN1 + &spcenctr_explosion_tvca) DISCRETE_RCFILTER(NODE_71, - NODE_70, // IN0 - RES_K(1.8), // R405 - CAP_U(0.22) ) // C401 + NODE_70, // IN0 + RES_K(1.8), // R405 + CAP_U(0.22) ) // C401 DISCRETE_RCFILTER(SPCENCTR_EXPLOSION_SND, - NODE_71, // IN0 - RES_K(1.8) + RES_K(3.6), // R405 + R406 - CAP_U(0.22) ) // C402 + NODE_71, // IN0 + RES_K(1.8) + RES_K(3.6), // R405 + R406 + CAP_U(0.22) ) // C402 /************************************************ *Bonus ************************************************/ DISCRETE_555_ASTABLE(NODE_80, // pin 5 - // the pin 4 reset is not connected in schematic, but should be - SPCENCTR_BONUS_EN, // RESET - RES_K(1), // R710 - RES_K(27), // R711 - CAP_U(0.047), // C710 - &spcenctr_555_bonus) + // the pin 4 reset is not connected in schematic, but should be + SPCENCTR_BONUS_EN, // RESET + RES_K(1), // R710 + RES_K(27), // R711 + CAP_U(0.047), // C710 + &spcenctr_555_bonus) DISCRETE_555_ASTABLE(NODE_81, // pin 9 - SPCENCTR_BONUS_EN, // RESET pin 10 - RES_K(100), // R713 - RES_K(47), // R714 - CAP_U(1), // C713 - &spcenctr_555_bonus) + SPCENCTR_BONUS_EN, // RESET pin 10 + RES_K(100), // R713 + RES_K(47), // R714 + CAP_U(1), // C713 + &spcenctr_555_bonus) DISCRETE_LOGIC_AND3(NODE_82, // IC C-D, pin 6 - NODE_80, // INP0 - NODE_81, // INP1 - SPCENCTR_BONUS_EN) // INP2 + NODE_80, // INP0 + NODE_81, // INP1 + SPCENCTR_BONUS_EN) // INP2 DISCRETE_GAIN(SPCENCTR_BONUS_SND, // adjust from logic to TTL voltage level - NODE_82, // IN0 - DEFAULT_TTL_V_LOGIC_1) // GAIN + NODE_82, // IN0 + DEFAULT_TTL_V_LOGIC_1) // GAIN /************************************************ *Wind - unemulated @@ -1100,15 +1615,15 @@ static DISCRETE_SOUND_START(spcenctr_discrete) * Final mix ************************************************/ DISCRETE_MIXER7(NODE_91, - 1, // ENAB - SPCENCTR_ENEMY_SHIP_SHOT_SND, // IN0 - SPCENCTR_PLAYER_SHOT_SND, // IN1 - SPCENCTR_SCREECH_SND, // IN2 - SPCENCTR_CRASH_SND, // IN3 - SPCENCTR_EXPLOSION_SND, // IN4 - SPCENCTR_BONUS_SND, // IN5 - SPCENCTR_WIND_SND, // IN6 - &spcenctr_mixer) + 1, // ENAB + SPCENCTR_ENEMY_SHIP_SHOT_SND, // IN0 + SPCENCTR_PLAYER_SHOT_SND, // IN1 + SPCENCTR_SCREECH_SND, // IN2 + SPCENCTR_CRASH_SND, // IN3 + SPCENCTR_EXPLOSION_SND, // IN4 + SPCENCTR_BONUS_SND, // IN5 + SPCENCTR_WIND_SND, // IN6 + &spcenctr_mixer) DISCRETE_OUTPUT(NODE_91, 20000) DISCRETE_SOUND_END @@ -1289,6 +1804,351 @@ void phantom2_audio_device::device_start() } +/************************************* + * + * Space Invaders + * + * Discrete sound emulation: + * Apr 2007, D.R. + * + *************************************/ + +static discrete_op_amp_1sht_info const invaders_invader_hit_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R49 + RES_K(100), // R51 + RES_M(1), // R48 + RES_M(1), // R50 + RES_M(2.2), // R52 + CAP_U(0.1), // C18 + CAP_P(470), // C20 + 0, // vN + 12 // vP +}; + +static const discrete_op_amp_osc_info invaders_invader_hit_osc = +{ + DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, + RES_M(1), // R37 + RES_K(10), // R41 + RES_K(100), // R38 + RES_K(120), // R40 + RES_M(1), // R39 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_U(0.1), // C16 + 12, // vP +}; + +// Schematic M051-00739-A005 and M051-00739-B005 +// P.C. A084-90700-B000 and A084-90700-C000 +static DISCRETE_SOUND_START(invaders_discrete) + INVADERS_NOISE_GENERATOR + INVADERS_SAUCER_HIT(1) + INVADERS_FLEET(1) + INVADERS_BONUS_MISSLE_BASE(1) + INVADERS_INVADER_HIT(1, invaders) + INVADERS_EXPLOSION(1) + INVADERS_MISSILE(1, invaders) + INVADERS_MIXER(1, invaders) +DISCRETE_SOUND_END + +invaders_audio_device::invaders_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : + device_t(mconfig, INVADERS_AUDIO, tag, owner, clock), + m_sn(*this, "snsnd"), + m_discrete(*this, "discrete"), + m_flip_screen_out(*this), + m_p2(0U) +{ +} + +void invaders_audio_device::p1_w(u8 data) +{ + m_sn->enable_w(BIT(~data, 0)); // saucer sound + + m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 1), data & 0x02); + m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 1), data & 0x04); + m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 1), data & 0x08); + m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 1), data & 0x10); + + machine().sound().system_enable(data & 0x20); + + // D6 and D7 are not connected +} + + +void invaders_audio_device::p2_w(u8 data) +{ + u8 const changed(data ^ m_p2); + m_p2 = data; + + m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 1), data & 0x0f); + m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 1), data & 0x10); + + if (BIT(changed, 5)) m_flip_screen_out(BIT(data, 5)); + + // D6 and D7 are not connected +} + +void invaders_audio_device::device_add_mconfig(machine_config &config) +{ + SPEAKER(config, "mono").front_center(); + + SN76477(config, m_sn); + m_sn->set_noise_params(0, 0, 0); + m_sn->set_decay_res(0); + m_sn->set_attack_params(0, RES_K(100)); + m_sn->set_amp_res(RES_K(56)); + m_sn->set_feedback_res(RES_K(10)); + m_sn->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); + m_sn->set_pitch_voltage(5.0); + m_sn->set_slf_params(CAP_U(1.0), RES_K(120)); + m_sn->set_oneshot_params(0, 0); + m_sn->set_vco_mode(1); + m_sn->set_mixer_params(0, 0, 0); + m_sn->set_envelope_params(1, 0); + m_sn->set_enable(1); + m_sn->add_route(ALL_OUTPUTS, "mono", 0.5); + + DISCRETE(config, m_discrete, invaders_discrete); + m_discrete->add_route(ALL_OUTPUTS, "mono", 0.5); +} + +void invaders_audio_device::device_start() +{ + m_flip_screen_out.resolve_safe(); + + m_p2 = 0U; + + save_item(NAME(m_p2)); +} + + +/************************************* + * + * Space Invaders II (cocktail) + * + *************************************/ + +static discrete_op_amp_1sht_info const invad2ct_invader_hit_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R49 + RES_K(100), // R51 + RES_M(1), // R48 + RES_M(1), // R50 + RES_M(2.2), // R52 + CAP_U(0.22), // C18 + CAP_P(470), // C20 + 0, // vN + 12 // vP +}; + +static discrete_op_amp_osc_info const invad2ct_invader_hit_osc = +{ + DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, + RES_M(1), // R37 + RES_K(10), // R41 + RES_K(100), // R38 + RES_K(120), // R40 + RES_M(1), // R39 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_U(0.22), // C16 + 12, // vP +}; + +static discrete_op_amp_1sht_info const invad2ct_brd2_invader_hit_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R49 + RES_K(100), // R51 + RES_M(1), // R48 + RES_M(1), // R50 + RES_M(2.2), // R52 + CAP_U(1), // C18 + CAP_P(470), // C20 + 0, // vN + 12 // vP +}; + +static discrete_op_amp_osc_info const invad2ct_brd2_invader_hit_osc = +{ + DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, + RES_M(1), // R37 + RES_K(10), // R41 + RES_K(100), // R38 + RES_K(120), // R40 + RES_M(1), // R39 + 0, // no r6 + 0, // no r7 + 0, // no r8 + CAP_U(0.1), // C16 + 12, // vP +}; + +static discrete_op_amp_1sht_info const invad2ct_missle_1sht = +{ + DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, + RES_M(4.7), // R32 + RES_K(100), // R30 + RES_M(1), // R31 + RES_M(1), // R33 + RES_M(2.2), // R34 + CAP_U(0.22), // C12 + CAP_P(470), // C15 + 0, // vN + 12 // vP +}; + +static discrete_mixer_desc const invad2ct_mixer = +{ + DISC_MIXER_IS_OP_AMP, // type + { RES_K(100), // R78 + RES_K(15) + 100 + 100, // R134 + R133 + R132 + RES_K(150), // R136 + RES_K(150), // R59 + RES_K(10) + RES_K(6.8) + RES_K(5.6), // R86 + R85 + R84 + RES_K(150) }, // R28 + {0}, // no rNode{} + { 0, + 0, + 0, + 0, + 0, + CAP_U(0.001) }, // C11 + 0, // no rI + RES_K(100), // R105 + 0, // no cF + CAP_U(0.1), // C45 + 0, // vRef = ground + 1 // gain +}; + +static DISCRETE_SOUND_START(invad2ct_discrete) + // sound board 1 + // P.C. A082-90700-A000 + // Schematic M051-00851-A002 + INVADERS_NOISE_GENERATOR + INVADERS_SAUCER_HIT(1) + INVADERS_FLEET(1) + INVADERS_BONUS_MISSLE_BASE(1) + INVADERS_INVADER_HIT(1, invad2ct) + INVADERS_EXPLOSION(1) + INVADERS_MISSILE(1, invad2ct) + INVADERS_MIXER(1, invad2ct) + + // sound board 2 + // P.C. A084-90901-C851 + // Schematic M051-00851-A005 + INVADERS_SAUCER_HIT(2) + INVADERS_FLEET(2) + INVADERS_BONUS_MISSLE_BASE(2) + INVADERS_INVADER_HIT(2, invad2ct_brd2) + INVADERS_EXPLOSION(2) + INVADERS_MISSILE(2, invaders) + INVADERS_MIXER(2, invaders) +DISCRETE_SOUND_END + +invad2ct_audio_device::invad2ct_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : + device_t(mconfig, INVAD2CT_AUDIO, tag, owner, clock), + m_discrete(*this, "discrete"), + m_sn(*this, "sn%u", 1U) +{ +} + +void invad2ct_audio_device::p1_w(u8 data) +{ + m_sn[0]->enable_w(BIT(~data, 0)); // saucer sound + + m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 1), data & 0x02); + m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 1), data & 0x04); + m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 1), data & 0x08); + m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 1), data & 0x10); + + machine().sound().system_enable(data & 0x20); + + // D6 and D7 are not connected +} + +void invad2ct_audio_device::p2_w(u8 data) +{ + m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 1), data & 0x0f); + m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 1), data & 0x10); + + // D5-D7 are not connected +} + +void invad2ct_audio_device::p3_w(u8 data) +{ + m_sn[1]->enable_w(BIT(~data, 0)); // saucer sound + + m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 2), data & 0x02); + m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 2), data & 0x04); + m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 2), data & 0x08); + m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 2), data & 0x10); + + // D5-D7 are not connected +} + +void invad2ct_audio_device::p4_w(u8 data) +{ + m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 2), data & 0x0f); + m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 2), data & 0x10); + + // D5-D7 are not connected +} + +void invad2ct_audio_device::device_add_mconfig(machine_config &config) +{ + SPEAKER(config, "spk1").front_left(); + SPEAKER(config, "spk2").front_right(); + + DISCRETE(config, m_discrete, invad2ct_discrete); + m_discrete->add_route(0, "spk1", 0.5); + m_discrete->add_route(1, "spk2", 0.5); + + SN76477(config, m_sn[0]); + m_sn[0]->set_noise_params(0, 0, 0); + m_sn[0]->set_decay_res(0); + m_sn[0]->set_attack_params(0, RES_K(100)); + m_sn[0]->set_amp_res(RES_K(56)); + m_sn[0]->set_feedback_res(RES_K(10)); + m_sn[0]->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); + m_sn[0]->set_pitch_voltage(5.0); + m_sn[0]->set_slf_params(CAP_U(1.0), RES_K(120)); + m_sn[0]->set_oneshot_params(0, 0); + m_sn[0]->set_vco_mode(1); + m_sn[0]->set_mixer_params(0, 0, 0); + m_sn[0]->set_envelope_params(1, 0); + m_sn[0]->set_enable(1); + m_sn[0]->add_route(ALL_OUTPUTS, "spk1", 0.3); + + SN76477(config, m_sn[1]); + m_sn[1]->set_noise_params(0, 0, 0); + m_sn[1]->set_decay_res(0); + m_sn[1]->set_attack_params(0, RES_K(100)); + m_sn[1]->set_amp_res(RES_K(56)); + m_sn[1]->set_feedback_res(RES_K(10)); + m_sn[1]->set_vco_params(0, CAP_U(0.047), RES_K(39)); + m_sn[1]->set_pitch_voltage(5.0); + m_sn[1]->set_slf_params(CAP_U(1.0), RES_K(120)); + m_sn[1]->set_oneshot_params(0, 0); + m_sn[1]->set_vco_mode(1); + m_sn[1]->set_mixer_params(0, 0, 0); + m_sn[1]->set_envelope_params(1, 0); + m_sn[1]->set_enable(1); + m_sn[1]->add_route(ALL_OUTPUTS, "spk2", 0.3); +} + +void invad2ct_audio_device::device_start() +{ +} + + /************************************* * * Audio setup @@ -3511,679 +4371,6 @@ WRITE8_MEMBER(mw8080bw_state::bowler_audio_6_w) -/************************************* - * - * Space Invaders - * - * Author : Tormod Tjaberg - * Created : 1997-04-09 - * Description : Sound routines for the 'invaders' games - * - * Note: - * The samples were taken from Michael Strutt's (mstrutt@pixie.co.za) - * excellent space invader emulator and converted to signed samples so - * they would work under SEAL. The port info was also gleaned from - * his emulator. These sounds should also work on all the invader games. - * - * Discrete sound emulation: - * Apr 2007, D.R. - * - *************************************/ - -static const char *const invaders_sample_names[] = -{ - "*invaders", - "1", /* shot/missle */ - "2", /* base hit/explosion */ - "3", /* invader hit */ - "4", /* fleet move 1 */ - "5", /* fleet move 2 */ - "6", /* fleet move 3 */ - "7", /* fleet move 4 */ - "8", /* UFO/saucer hit */ - "9", /* bonus base */ - nullptr -}; - - -/* left in for all games that hack into invaders samples for audio */ -void mw8080bw_state::invaders_samples_audio(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - - SN76477(config, m_sn); - m_sn->set_noise_params(0, 0, 0); - m_sn->set_decay_res(0); - m_sn->set_attack_params(0, RES_K(100)); - m_sn->set_amp_res(RES_K(56)); - m_sn->set_feedback_res(RES_K(10)); - m_sn->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); - m_sn->set_pitch_voltage(5.0); - m_sn->set_slf_params(CAP_U(1.0), RES_K(120)); - m_sn->set_oneshot_params(0, 0); - m_sn->set_vco_mode(1); - m_sn->set_mixer_params(0, 0, 0); - m_sn->set_envelope_params(1, 0); - m_sn->set_enable(1); - m_sn->add_route(ALL_OUTPUTS, "mono", 0.5); - - SAMPLES(config, m_samples); - m_samples->set_channels(6); - m_samples->set_samples_names(invaders_sample_names); - m_samples->add_route(ALL_OUTPUTS, "mono", 1.0); -} - - -/* nodes - inputs */ -#define INVADERS_SAUCER_HIT_EN 01 -#define INVADERS_FLEET_DATA 02 -#define INVADERS_BONUS_MISSLE_BASE_EN 03 -#define INVADERS_INVADER_HIT_EN 04 -#define INVADERS_EXPLOSION_EN 05 -#define INVADERS_MISSILE_EN 06 - -/* nodes - sounds */ -#define INVADERS_NOISE NODE_10 -#define INVADERS_SAUCER_HIT_SND 11 -#define INVADERS_FLEET_SND 12 -#define INVADERS_BONUS_MISSLE_BASE_SND 13 -#define INVADERS_INVADER_HIT_SND 14 -#define INVADERS_EXPLOSION_SND 15 -#define INVADERS_MISSILE_SND 16 - - -static const discrete_op_amp_info invaders_saucer_hit_op_amp_B3_9 = -{ - DISC_OP_AMP_IS_NORTON, - 0, /* no r1 */ - RES_K(100), /* R72 */ - RES_M(1), /* R71 */ - 0, /* no r4 */ - CAP_U(1), /* C23 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_osc_info invaders_saucer_hit_osc = -{ - DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, - RES_M(1), /* R70 */ - RES_K(470), /* R64 */ - RES_K(100), /* R61 */ - RES_K(120), /* R63 */ - RES_M(1), /* R62 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_U(0.1), /* C21 */ - 12, /* vP */ -}; - -static const discrete_op_amp_osc_info invaders_saucer_hit_vco = -{ - DISC_OP_AMP_OSCILLATOR_VCO_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_SQW, - RES_M(1), /* R65 */ - RES_K(470), /* R66 */ - RES_K(680), /* R67 */ - RES_M(1), /* R69*/ - RES_M(1), /* R68 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_P(470), /* C22 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_info invaders_saucer_hit_op_amp_B3_10 = -{ - DISC_OP_AMP_IS_NORTON, - RES_K(680), /* R73 */ - RES_K(680), /* R77 */ - RES_M(2.7), /* R74 */ - RES_K(680), /* R75 */ - 0, /* no c */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_comp_adder_table invaders_thump_resistors = -{ - DISC_COMP_P_RESISTOR, - 0, /* no cDefault */ - 4, /* length */ - { RES_K(20) + RES_K(20), /* R126 + R127 */ - RES_K(68), /* R128 */ - RES_K(82), /* R129 */ - RES_K(100) } /* R130 */ -}; - - -static const discrete_555_desc invaders_thump_555 = -{ - DISC_555_OUT_ENERGY | DISC_555_OUT_DC, - 5, - 5.0 - 0.6, /* 5V - diode drop */ - DEFAULT_TTL_V_LOGIC_1 /* Output of F3 7411 buffer */ -}; - - -static const discrete_555_desc invaders_bonus_555 = -{ - DISC_555_OUT_SQW | DISC_555_OUT_DC, - 5.0, /* 5V */ - DEFAULT_555_VALUES -}; - - -static const discrete_op_amp_1sht_info invaders_invader_hit_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R49 */ - RES_K(100), /* R51 */ - RES_M(1), /* R48 */ - RES_M(1), /* R50 */ - RES_M(2.2), /* R52 */ - CAP_U(0.1), /* C18 */ - CAP_P(470), /* C20 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_info invaders_invader_hit_op_amp_D3_10 = -{ - DISC_OP_AMP_IS_NORTON, - 0, /* no r1 */ - RES_K(10), /* R53 */ - RES_M(1), /* R137 */ - 0, /* no r4 */ - CAP_U(0.47), /* C19 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_osc_info invaders_invader_hit_osc = -{ - DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, - RES_M(1), /* R37 */ - RES_K(10), /* R41 */ - RES_K(100), /* R38 */ - RES_K(120), /* R40 */ - RES_M(1), /* R39 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_U(0.1), /* C16 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_osc_info invaders_invader_hit_vco = -{ - DISC_OP_AMP_OSCILLATOR_VCO_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, - RES_M(1), /* R42 */ - RES_K(470), /* R43 */ - RES_K(680), /* R44 */ - RES_M(1), /* R46 */ - RES_M(1), /* R45 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_P(330), /* C16 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_info invaders_invader_hit_op_amp_D3_4 = -{ - DISC_OP_AMP_IS_NORTON, - RES_K(470), /* R55 */ - RES_K(680), /* R54 */ - RES_M(2.7), /* R56 */ - RES_K(680), /* R57 */ - 0, /* no c */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_1sht_info invaders_explosion_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R90 */ - RES_K(100), /* R88 */ - RES_M(1), /* R91 */ - RES_M(1), /* R89 */ - RES_M(2.2), /* R92 */ - CAP_U(2.2), /* C24 */ - CAP_P(470), /* C25 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_tvca_info invaders_explosion_tvca = -{ - RES_M(2.7), /* R80 */ - RES_K(680), /* R79 */ - 0, /* no r3 */ - RES_K(680), /* R82 */ - RES_K(10), /* R93 */ - 0, /* no r6 */ - RES_K(680), /* R83 */ - 0, /* no r8 */ - 0, /* no r9 */ - 0, /* no r10 */ - 0, /* no r11 */ - CAP_U(1), /* C26 */ - 0, /* no c2 */ - 0, 0, /* no c3, c4 */ - 12.0 - OP_AMP_NORTON_VBE, /* v1 */ - 0, /* no v2 */ - 0, /* no v3 */ - 12, /* vP */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f0 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f1 */ - DISC_OP_AMP_TRIGGER_FUNCTION_TRG0, /* f2 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f3 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f4 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE /* no f5 */ -}; - - -static const discrete_op_amp_1sht_info invaders_missle_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R32 */ - RES_K(100), /* R30 */ - RES_M(1), /* R31 */ - RES_M(1), /* R33 */ - RES_M(2.2), /* R34 */ - CAP_U(1), /* C12 */ - CAP_P(470), /* C15 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_info invaders_missle_op_amp_B3 = -{ - DISC_OP_AMP_IS_NORTON, - 0, /* no r1 */ - RES_K(10), /* R35 */ - RES_M(1.5), /* R36 */ - 0, /* no r4 */ - CAP_U(0.22), /* C13 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_osc_info invaders_missle_op_amp_osc = -{ - DISC_OP_AMP_OSCILLATOR_VCO_3 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_SQW, - 1.0 / (1.0 / RES_M(1) + 1.0 / RES_K(330)) + RES_M(1.5), /* R29||R11 + R12 */ - RES_M(1), /* R16 */ - RES_K(560), /* R17 */ - RES_M(2.2), /* R19 */ - RES_M(1), /* R16 */ - RES_M(4.7), /* R14 */ - RES_M(3.3), /* R13 */ - 0, /* no r8 */ - CAP_P(330), /* C58 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_info invaders_missle_op_amp_A3 = -{ - DISC_OP_AMP_IS_NORTON, - RES_K(560), /* R22 */ - RES_K(470), /* R15 */ - RES_M(2.7), /* R20 */ - RES_K(560), /* R21 */ - 0, /* no c */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_tvca_info invaders_missle_tvca = -{ - RES_M(2.7), /* R25 */ - RES_K(560), /* R23 */ - 0, /* no r3 */ - RES_K(560), /* R26 */ - RES_K(1), /* */ - 0, /* no r6 */ - RES_K(560), /* R60 */ - 0, /* no r8 */ - 0, /* no r9 */ - 0, /* no r10 */ - 0, /* no r11 */ - CAP_U(0.1), /* C14 */ - 0, /* no c2 */ - 0, 0, /* no c3, c4 */ - 5, /* v1 */ - 0, /* no v2 */ - 0, /* no v3 */ - 12, /* vP */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f0 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f1 */ - DISC_OP_AMP_TRIGGER_FUNCTION_TRG0, /* f2 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f3 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE, /* no f4 */ - DISC_OP_AMP_TRIGGER_FUNCTION_NONE /* no f5 */ -}; - - -static const discrete_mixer_desc invaders_mixer = -{ - DISC_MIXER_IS_OP_AMP, /* type */ - { RES_K(200), /* R78 */ - RES_K(10) + 100 + 100, /* R134 + R133 + R132 */ - RES_K(150), /* R136 */ - RES_K(200), /* R59 */ - RES_K(2) + RES_K(6.8) + RES_K(5.6), /* R86 + R85 + R84 */ - RES_K(150) }, /* R28 */ - {0}, /* no rNode{} */ - { 0, - 0, - 0, - 0, - 0, - CAP_U(0.001) }, /* C11 */ - 0, /* no rI */ - RES_K(100), /* R105 */ - 0, /* no cF */ - CAP_U(0.1), /* C45 */ - 0, /* vRef = ground */ - 1 /* gain */ -}; - - -/* sound board 1 or 2, for multi-board games */ -#define INVADERS_NODE(_node, _board) (NODE(_node + ((_board - 1) * 100))) - -/************************************************ - * Noise Generator - ************************************************/ -/* Noise clock was breadboarded and measured at 7515 */ -#define INVADERS_NOISE_GENERATOR \ - DISCRETE_LFSR_NOISE(INVADERS_NOISE, /* IC N5, pin 10 */ \ - 1, /* ENAB */ \ - 1, /* no RESET */ \ - 7515, /* CLK in Hz */ \ - 12, /* p-p AMPL */ \ - 0, /* no FEED input */ \ - 12.0/2, /* dc BIAS */ \ - &midway_lfsr) - - -/************************************************ - * Saucer Hit - ************************************************/ -#define INVADERS_SAUCER_HIT(_board) \ - DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, _board), 12, 0, 0) \ - DISCRETE_OP_AMP(INVADERS_NODE(20, _board), /* IC B3, pin 9 */ \ - 1, /* ENAB */ \ - 0, /* no IN0 */ \ - INVADERS_NODE(INVADERS_SAUCER_HIT_EN, _board), /* IN1 */ \ - &invaders_saucer_hit_op_amp_B3_9) \ - DISCRETE_OP_AMP_OSCILLATOR(INVADERS_NODE(21, _board), /* IC A4, pin 5 */ \ - 1, /* ENAB */ \ - &invaders_saucer_hit_osc) \ - DISCRETE_OP_AMP_VCO1(INVADERS_NODE(22, _board), /* IC A4, pin 9 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(21, _board), /* VMOD1 */ \ - &invaders_saucer_hit_vco) \ - DISCRETE_OP_AMP(INVADERS_NODE(INVADERS_SAUCER_HIT_SND, _board), /* IC B3, pin 10 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(22, _board), /* IN0 */ \ - INVADERS_NODE(20, _board), /* IN1 */ \ - &invaders_saucer_hit_op_amp_B3_10) - - -/************************************************ - * Fleet movement - ************************************************/ -#define INVADERS_FLEET(_board) \ - DISCRETE_INPUT_DATA (INVADERS_NODE(INVADERS_FLEET_DATA, _board)) \ - DISCRETE_COMP_ADDER(INVADERS_NODE(30, _board), \ - INVADERS_NODE(INVADERS_FLEET_DATA, _board), /* DATA */ \ - &invaders_thump_resistors) \ - DISCRETE_555_ASTABLE(INVADERS_NODE(31, _board), /* IC F3, pin 6 */ \ - 1, /* RESET */ \ - INVADERS_NODE(30, _board), /* R1 */ \ - RES_K(75), /* R131 */ \ - CAP_U(0.1), /* C29 */ \ - &invaders_thump_555) \ - DISCRETE_RCFILTER(INVADERS_NODE(32, _board), \ - INVADERS_NODE(31, _board), /* IN0 */ \ - 100, /* R132 */ \ - CAP_U(4.7) ) /* C31 */ \ - DISCRETE_RCFILTER(INVADERS_NODE(INVADERS_FLEET_SND, _board), \ - INVADERS_NODE(32, _board), /* IN0 */ \ - 100 + 100, /* R132 + R133 */ \ - CAP_U(10) ) /* C32 */ - - -/************************************************ - * Bonus Missle Base - ************************************************/ -#define INVADERS_BONUS_MISSLE_BASE(_board) \ - DISCRETE_INPUT_LOGIC (INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board)) \ - DISCRETE_555_ASTABLE(INVADERS_NODE(40, _board), /* IC F4, pin 9 */ \ - INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board),/* RESET */ \ - RES_K(100), /* R94 */ \ - RES_K(47), /* R95 */ \ - CAP_U(1), /* C34 */ \ - &invaders_bonus_555) \ - DISCRETE_SQUAREWFIX(INVADERS_NODE(41, _board), \ - 1, /* ENAB */ \ - 480, /* FREQ */ \ - 1, /* AMP */ \ - 50, /* DUTY */ \ - 1.0/2, /* BIAS */ \ - 0) /* PHASE */ \ - DISCRETE_LOGIC_AND3(INVADERS_NODE(42, _board), /* IC F3, pin 12 */ \ - INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, _board),/* INP0 */ \ - INVADERS_NODE(41, _board), /* INP1 */ \ - INVADERS_NODE(40, _board) ) /* INP2 */ \ - DISCRETE_GAIN(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_SND, _board),/* adjust from logic to TTL voltage level */\ - INVADERS_NODE(42, _board), /* IN0 */ \ - DEFAULT_TTL_V_LOGIC_1) /* GAIN */ - - -/************************************************ - * Invader Hit - ************************************************/ -#define INVADERS_INVADER_HIT(_board, _type) \ - DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_INVADER_HIT_EN, _board), 5, 0, 0) \ - DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(50, _board), /* IC D3, pin 9 */ \ - INVADERS_NODE(INVADERS_INVADER_HIT_EN, _board), /* TRIG */ \ - &_type##_invader_hit_1sht) \ - DISCRETE_OP_AMP(INVADERS_NODE(51, _board), /* IC D3, pin 10 */ \ - 1, /* ENAB */ \ - 0, /* no IN0 */ \ - INVADERS_NODE(50, _board), /* IN1 */ \ - &invaders_invader_hit_op_amp_D3_10) \ - DISCRETE_OP_AMP_OSCILLATOR(INVADERS_NODE(52, _board), /* IC B4, pin 5 */ \ - 1, /* ENAB */ \ - &_type##_invader_hit_osc) \ - DISCRETE_OP_AMP_VCO1(INVADERS_NODE(53, _board), /* IC B4, pin 4 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(52, _board), /* VMOD1 */ \ - &invaders_invader_hit_vco) \ - DISCRETE_OP_AMP(INVADERS_NODE(INVADERS_INVADER_HIT_SND, _board), /* IC D3, pin 4 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(53, _board), /* IN0 */ \ - INVADERS_NODE(51, _board), /* IN1 */ \ - &invaders_invader_hit_op_amp_D3_4) - - -/************************************************ - * Explosion - ************************************************/ -#define INVADERS_EXPLOSION(_board) \ - DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_EXPLOSION_EN, _board), 5, 0, 0) \ - DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(60, _board), /* IC D2, pin 10 */ \ - INVADERS_NODE(INVADERS_EXPLOSION_EN, _board), /* TRIG */ \ - &invaders_explosion_1sht) \ - DISCRETE_OP_AMP_TRIG_VCA(INVADERS_NODE(61, _board), /* IC D2, pin 4 */ \ - INVADERS_NODE(60, _board), /* TRG0 */ \ - 0, /* no TRG1 */ \ - 0, /* no TRG2 */ \ - INVADERS_NOISE, /* IN0 */ \ - 0, /* no IN1 */ \ - &invaders_explosion_tvca) \ - DISCRETE_RCFILTER(INVADERS_NODE(62, _board), \ - INVADERS_NODE(61, _board), /* IN0 */ \ - RES_K(5.6), /* R84 */ \ - CAP_U(0.1) ) /* C27 */ \ - DISCRETE_RCFILTER(INVADERS_NODE(INVADERS_EXPLOSION_SND, _board), \ - INVADERS_NODE(62, _board), /* IN0 */ \ - RES_K(5.6) + RES_K(6.8), /* R84 + R85 */ \ - CAP_U(0.1) ) /* C28 */ - - -/************************************************ - * Missle Sound - ************************************************/ -#define INVADERS_MISSILE(_board, _type) \ - DISCRETE_INPUTX_LOGIC(INVADERS_NODE(INVADERS_MISSILE_EN, _board), 5, 0, 0) \ - DISCRETE_OP_AMP_ONESHOT(INVADERS_NODE(70, _board), /* IC B3, pin 4 */ \ - INVADERS_NODE(INVADERS_MISSILE_EN, _board), /* TRIG */ \ - &_type##_missle_1sht) \ - DISCRETE_OP_AMP(INVADERS_NODE(71, _board), /* IC B3, pin 5 */ \ - 1, /* ENAB */ \ - 0, /* no IN0 */ \ - INVADERS_NODE(70, _board), /* IN1 */ \ - &invaders_missle_op_amp_B3) \ - /* next 2 modules simulate the D1 voltage drop */ \ - DISCRETE_ADDER2(INVADERS_NODE(72, _board), \ - 1, /* ENAB */ \ - INVADERS_NODE(71, _board), /* IN0 */ \ - -0.5) /* IN1 */ \ - DISCRETE_CLAMP(INVADERS_NODE(73, _board), \ - INVADERS_NODE(72, _board), /* IN0 */ \ - 0, /* MIN */ \ - 12) /* MAX */ \ - DISCRETE_CRFILTER(INVADERS_NODE(74, _board), \ - INVADERS_NOISE, /* IN0 */ \ - RES_M(1) + RES_K(330), /* R29, R11 */ \ - CAP_U(0.1) ) /* C57 */ \ - DISCRETE_GAIN(INVADERS_NODE(75, _board), \ - INVADERS_NODE(74, _board), /* IN0 */ \ - RES_K(330)/(RES_M(1) + RES_K(330))) /* GAIN - R29 : R11 */ \ - DISCRETE_OP_AMP_VCO2(INVADERS_NODE(76, _board), /* IC C1, pin 4 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(75, _board), /* VMOD1 */ \ - INVADERS_NODE(73, _board), /* VMOD2 */ \ - &invaders_missle_op_amp_osc) \ - DISCRETE_OP_AMP(INVADERS_NODE(77, _board), /* IC A3, pin 9 */ \ - 1, /* ENAB */ \ - INVADERS_NODE(76, _board), /* IN0 */ \ - INVADERS_NODE(73, _board), /* IN1 */ \ - &invaders_missle_op_amp_A3) \ - DISCRETE_OP_AMP_TRIG_VCA(INVADERS_NODE(INVADERS_MISSILE_SND, _board), /* IC A3, pin 10 */ \ - INVADERS_NODE(INVADERS_MISSILE_EN, _board), /* TRG0 */ \ - 0, /* no TRG1 */ \ - 0, /* no TRG2 */ \ - INVADERS_NODE(77, _board), /* IN0 */ \ - 0, /* no IN1 */ \ - &invaders_missle_tvca) - - -/************************************************ - * Final mix - ************************************************/ -#define INVADERS_MIXER(_board, _type) \ - DISCRETE_MIXER6(INVADERS_NODE(90, _board), \ - 1, /* ENAB */ \ - INVADERS_NODE(INVADERS_SAUCER_HIT_SND, _board), /* IN0 */ \ - INVADERS_NODE(INVADERS_FLEET_SND, _board), /* IN1 */ \ - INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_SND, _board), /* IN2 */ \ - INVADERS_NODE(INVADERS_INVADER_HIT_SND, _board), /* IN3 */ \ - INVADERS_NODE(INVADERS_EXPLOSION_SND, _board), /* IN4 */ \ - INVADERS_NODE(INVADERS_MISSILE_SND, _board), /* IN5 */ \ - &_type##_mixer) \ - DISCRETE_OUTPUT(INVADERS_NODE(90, _board), 2500) - -/* Schematic M051-00739-A005 and M051-00739-B005 */ -/* P.C. A084-90700-B000 and A084-90700-C000 */ -static DISCRETE_SOUND_START(invaders_discrete) - INVADERS_NOISE_GENERATOR - INVADERS_SAUCER_HIT(1) - INVADERS_FLEET(1) - INVADERS_BONUS_MISSLE_BASE(1) - INVADERS_INVADER_HIT(1, invaders) - INVADERS_EXPLOSION(1) - INVADERS_MISSILE(1, invaders) - INVADERS_MIXER(1, invaders) -DISCRETE_SOUND_END - - -void mw8080bw_state::invaders_audio(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - - SN76477(config, m_sn); - m_sn->set_noise_params(0, 0, 0); - m_sn->set_decay_res(0); - m_sn->set_attack_params(0, RES_K(100)); - m_sn->set_amp_res(RES_K(56)); - m_sn->set_feedback_res(RES_K(10)); - m_sn->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); - m_sn->set_pitch_voltage(5.0); - m_sn->set_slf_params(CAP_U(1.0), RES_K(120)); - m_sn->set_oneshot_params(0, 0); - m_sn->set_vco_mode(1); - m_sn->set_mixer_params(0, 0, 0); - m_sn->set_envelope_params(1, 0); - m_sn->set_enable(1); - m_sn->add_route(ALL_OUTPUTS, "mono", 0.5); - - DISCRETE(config, m_discrete, invaders_discrete); - m_discrete->add_route(ALL_OUTPUTS, "mono", 0.5); -} - - -WRITE8_MEMBER(mw8080bw_state::invaders_audio_1_w) -{ - m_sn->enable_w((~data >> 0) & 0x01); /* saucer sound */ - - m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 1), data & 0x02); - m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 1), data & 0x04); - m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 1), data & 0x08); - m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 1), data & 0x10); - - machine().sound().system_enable(data & 0x20); - - /* D6 and D7 are not connected */ -} - - -WRITE8_MEMBER(mw8080bw_state::invaders_audio_2_w) -{ - m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 1), data & 0x0f); - m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 1), data & 0x10); - - /* the flip screen line is only connected on the cocktail PCB */ - if (invaders_is_cabinet_cocktail()) - { - m_flip_screen = (data >> 5) & 0x01; - } - - /* D6 and D7 are not connected */ -} - - - /************************************* * * Blue Shark @@ -4571,227 +4758,3 @@ WRITE8_MEMBER(mw8080bw_state::blueshrk_audio_w) /* D6 and D7 are not connected */ } - - - -/************************************* - * - * Space Invaders II (cocktail) - * - *************************************/ - -static const discrete_op_amp_1sht_info invad2ct_invader_hit_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R49 */ - RES_K(100), /* R51 */ - RES_M(1), /* R48 */ - RES_M(1), /* R50 */ - RES_M(2.2), /* R52 */ - CAP_U(0.22), /* C18 */ - CAP_P(470), /* C20 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_osc_info invad2ct_invader_hit_osc = -{ - DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, - RES_M(1), /* R37 */ - RES_K(10), /* R41 */ - RES_K(100), /* R38 */ - RES_K(120), /* R40 */ - RES_M(1), /* R39 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_U(0.22), /* C16 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_1sht_info invad2ct_brd2_invader_hit_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R49 */ - RES_K(100), /* R51 */ - RES_M(1), /* R48 */ - RES_M(1), /* R50 */ - RES_M(2.2), /* R52 */ - CAP_U(1), /* C18 */ - CAP_P(470), /* C20 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_op_amp_osc_info invad2ct_brd2_invader_hit_osc = -{ - DISC_OP_AMP_OSCILLATOR_1 | DISC_OP_AMP_IS_NORTON | DISC_OP_AMP_OSCILLATOR_OUT_CAP, - RES_M(1), /* R37 */ - RES_K(10), /* R41 */ - RES_K(100), /* R38 */ - RES_K(120), /* R40 */ - RES_M(1), /* R39 */ - 0, /* no r6 */ - 0, /* no r7 */ - 0, /* no r8 */ - CAP_U(0.1), /* C16 */ - 12, /* vP */ -}; - - -static const discrete_op_amp_1sht_info invad2ct_missle_1sht = -{ - DISC_OP_AMP_1SHT_1 | DISC_OP_AMP_IS_NORTON, - RES_M(4.7), /* R32 */ - RES_K(100), /* R30 */ - RES_M(1), /* R31 */ - RES_M(1), /* R33 */ - RES_M(2.2), /* R34 */ - CAP_U(0.22), /* C12 */ - CAP_P(470), /* C15 */ - 0, /* vN */ - 12 /* vP */ -}; - - -static const discrete_mixer_desc invad2ct_mixer = -{ - DISC_MIXER_IS_OP_AMP, /* type */ - { RES_K(100), /* R78 */ - RES_K(15) + 100 + 100, /* R134 + R133 + R132 */ - RES_K(150), /* R136 */ - RES_K(150), /* R59 */ - RES_K(10) + RES_K(6.8) + RES_K(5.6), /* R86 + R85 + R84 */ - RES_K(150) }, /* R28 */ - {0}, /* no rNode{} */ - { 0, - 0, - 0, - 0, - 0, - CAP_U(0.001) }, /* C11 */ - 0, /* no rI */ - RES_K(100), /* R105 */ - 0, /* no cF */ - CAP_U(0.1), /* C45 */ - 0, /* vRef = ground */ - 1 /* gain */ -}; - - -static DISCRETE_SOUND_START(invad2ct_discrete) - /* sound board 1 */ - /* P.C. A082-90700-A000 */ - /* Schematic M051-00851-A002 */ - INVADERS_NOISE_GENERATOR - INVADERS_SAUCER_HIT(1) - INVADERS_FLEET(1) - INVADERS_BONUS_MISSLE_BASE(1) - INVADERS_INVADER_HIT(1, invad2ct) - INVADERS_EXPLOSION(1) - INVADERS_MISSILE(1, invad2ct) - INVADERS_MIXER(1, invad2ct) - - /* sound board 2 */ - /* P.C. A084-90901-C851 */ - /* Schematic M051-00851-A005 */ - INVADERS_SAUCER_HIT(2) - INVADERS_FLEET(2) - INVADERS_BONUS_MISSLE_BASE(2) - INVADERS_INVADER_HIT(2, invad2ct_brd2) - INVADERS_EXPLOSION(2) - INVADERS_MISSILE(2, invaders) - INVADERS_MIXER(2, invaders) -DISCRETE_SOUND_END - - -void mw8080bw_state::invad2ct_audio(machine_config &config) -{ - SPEAKER(config, "spk1").front_left(); - SPEAKER(config, "spk2").front_right(); - - DISCRETE(config, m_discrete, invad2ct_discrete); - m_discrete->add_route(0, "spk1", 0.5); - m_discrete->add_route(1, "spk2", 0.5); - - SN76477(config, m_sn1); - m_sn1->set_noise_params(0, 0, 0); - m_sn1->set_decay_res(0); - m_sn1->set_attack_params(0, RES_K(100)); - m_sn1->set_amp_res(RES_K(56)); - m_sn1->set_feedback_res(RES_K(10)); - m_sn1->set_vco_params(0, CAP_U(0.1), RES_K(8.2)); - m_sn1->set_pitch_voltage(5.0); - m_sn1->set_slf_params(CAP_U(1.0), RES_K(120)); - m_sn1->set_oneshot_params(0, 0); - m_sn1->set_vco_mode(1); - m_sn1->set_mixer_params(0, 0, 0); - m_sn1->set_envelope_params(1, 0); - m_sn1->set_enable(1); - m_sn1->add_route(ALL_OUTPUTS, "spk1", 0.3); - - SN76477(config, m_sn2); - m_sn2->set_noise_params(0, 0, 0); - m_sn2->set_decay_res(0); - m_sn2->set_attack_params(0, RES_K(100)); - m_sn2->set_amp_res(RES_K(56)); - m_sn2->set_feedback_res(RES_K(10)); - m_sn2->set_vco_params(0, CAP_U(0.047), RES_K(39)); - m_sn2->set_pitch_voltage(5.0); - m_sn2->set_slf_params(CAP_U(1.0), RES_K(120)); - m_sn2->set_oneshot_params(0, 0); - m_sn2->set_vco_mode(1); - m_sn2->set_mixer_params(0, 0, 0); - m_sn2->set_envelope_params(1, 0); - m_sn2->set_enable(1); - m_sn2->add_route(ALL_OUTPUTS, "spk2", 0.3); -} - - -WRITE8_MEMBER(mw8080bw_state::invad2ct_audio_1_w) -{ - m_sn1->enable_w((~data >> 0) & 0x01); /* saucer sound */ - - m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 1), data & 0x02); - m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 1), data & 0x04); - m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 1), data & 0x08); - m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 1), data & 0x10); - - machine().sound().system_enable(data & 0x20); - - /* D6 and D7 are not connected */ -} - - -WRITE8_MEMBER(mw8080bw_state::invad2ct_audio_2_w) -{ - m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 1), data & 0x0f); - m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 1), data & 0x10); - - /* D5-D7 are not connected */ -} - - -WRITE8_MEMBER(mw8080bw_state::invad2ct_audio_3_w) -{ - m_sn2->enable_w((~data >> 0) & 0x01); /* saucer sound */ - - m_discrete->write(INVADERS_NODE(INVADERS_MISSILE_EN, 2), data & 0x02); - m_discrete->write(INVADERS_NODE(INVADERS_EXPLOSION_EN, 2), data & 0x04); - m_discrete->write(INVADERS_NODE(INVADERS_INVADER_HIT_EN, 2), data & 0x08); - m_discrete->write(INVADERS_NODE(INVADERS_BONUS_MISSLE_BASE_EN, 2), data & 0x10); - - /* D5-D7 are not connected */ -} - - -WRITE8_MEMBER(mw8080bw_state::invad2ct_audio_4_w) -{ - m_discrete->write(INVADERS_NODE(INVADERS_FLEET_DATA, 2), data & 0x0f); - m_discrete->write(INVADERS_NODE(INVADERS_SAUCER_HIT_EN, 2), data & 0x10); - - /* D5-D7 are not connected */ -} diff --git a/src/mame/audio/mw8080bw.h b/src/mame/audio/mw8080bw.h index 59f1610fe0d..2aa2c776cdd 100644 --- a/src/mame/audio/mw8080bw.h +++ b/src/mame/audio/mw8080bw.h @@ -158,6 +158,48 @@ private: }; +class invaders_audio_device : public device_t +{ +public: + auto flip_screen_out() { return m_flip_screen_out.bind(); } + + invaders_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0); + + void p1_w(u8 data); + void p2_w(u8 data); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + +private: + required_device m_sn; + required_device m_discrete; + devcb_write_line m_flip_screen_out; + u8 m_p2; +}; + + +class invad2ct_audio_device : public device_t +{ +public: + invad2ct_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0); + + void p1_w(u8 data); + void p2_w(u8 data); + void p3_w(u8 data); + void p4_w(u8 data); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + +private: + required_device m_discrete; + required_device_array m_sn; +}; + + DECLARE_DEVICE_TYPE(SEAWOLF_AUDIO, seawolf_audio_device) DECLARE_DEVICE_TYPE(GUNFIGHT_AUDIO, gunfight_audio_device) DECLARE_DEVICE_TYPE(GMISSILE_AUDIO, gmissile_audio_device) @@ -165,5 +207,7 @@ DECLARE_DEVICE_TYPE(M4_AUDIO, m4_audio_device) DECLARE_DEVICE_TYPE(CLOWNS_AUDIO, clowns_audio_device) DECLARE_DEVICE_TYPE(SPCENCTR_AUDIO, spcenctr_audio_device) DECLARE_DEVICE_TYPE(PHANTOM2_AUDIO, phantom2_audio_device) +DECLARE_DEVICE_TYPE(INVADERS_AUDIO, invaders_audio_device) +DECLARE_DEVICE_TYPE(INVAD2CT_AUDIO, invad2ct_audio_device) #endif // MAME_AUDIO_MW8080BW_H diff --git a/src/mame/drivers/8080bw.cpp b/src/mame/drivers/8080bw.cpp index 1758ad9115e..5664e870c96 100644 --- a/src/mame/drivers/8080bw.cpp +++ b/src/mame/drivers/8080bw.cpp @@ -218,9 +218,10 @@ MACHINE_START_MEMBER(_8080bw_state,extra_8080bw) { + mw8080bw_state::machine_start(); + MACHINE_START_CALL_MEMBER(extra_8080bw_sh); MACHINE_START_CALL_MEMBER(extra_8080bw_vh); - MACHINE_START_CALL_MEMBER(mw8080bw); } /*******************************************************/ @@ -396,11 +397,11 @@ static INPUT_PORTS_START( invadpt2 ) PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x01, "4" ) - /* SW1:2 doesn't seem to work? */ - PORT_DIPNAME( 0x02, 0x00, "Rotate Images" ) PORT_DIPLOCATION("SW1:2") /* "When ON, the images on screen will be rotated. Default is ON." */ + // SW1:2 doesn't seem to work? + PORT_DIPNAME( 0x02, 0x00, "Rotate Images" ) PORT_DIPLOCATION("SW1:2") // "When ON, the images on screen will be rotated. Default is ON." PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "Preset Mode" ) PORT_DIPLOCATION("SW1:4") /* Preset Mode: "Switch for checking, when OFF checking can be done." */ + PORT_DIPNAME( 0x08, 0x00, "Preset Mode" ) PORT_DIPLOCATION("SW1:4") // Preset Mode: "Switch for checking, when OFF checking can be done." PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) INPUT_PORTS_END @@ -562,8 +563,8 @@ void _8080bw_state::astropal_io_map(address_map &map) map(0x01, 0x01).mirror(0x04).portr("IN1"); map(0x03, 0x03).mirror(0x04).portr("IN3"); - map(0x03, 0x03).w(FUNC(_8080bw_state::invaders_audio_1_w)); - map(0x05, 0x05).w(FUNC(_8080bw_state::invaders_audio_2_w)); + map(0x03, 0x03).w("soundboard", FUNC(invaders_audio_device::p1_w)); + map(0x05, 0x05).w("soundboard", FUNC(invaders_audio_device::p2_w)); map(0x06, 0x06).w(m_watchdog, FUNC(watchdog_timer_device::reset_w)); } @@ -812,8 +813,8 @@ void _8080bw_state::spacecom_map(address_map &map) void _8080bw_state::spacecom_io_map(address_map &map) { map(0x41, 0x41).portr("IN0"); - map(0x42, 0x42).portr("IN1").w(FUNC(_8080bw_state::invaders_audio_1_w)); - map(0x44, 0x44).portr("IN2").w(FUNC(_8080bw_state::invaders_audio_2_w)); + map(0x42, 0x42).portr("IN1").w("soundboard", FUNC(invaders_audio_device::p1_w)); + map(0x44, 0x44).portr("IN2").w("soundboard", FUNC(invaders_audio_device::p2_w)); } void _8080bw_state::spacecom(machine_config &config) @@ -825,7 +826,6 @@ void _8080bw_state::spacecom(machine_config &config) m_maincpu->set_addrmap(AS_IO, &_8080bw_state::spacecom_io_map); m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::interrupt_vector)); - MCFG_MACHINE_START_OVERRIDE(mw8080bw_state, mw8080bw) MCFG_MACHINE_RESET_OVERRIDE(mw8080bw_state, mw8080bw) /* video hardware */ @@ -836,7 +836,8 @@ void _8080bw_state::spacecom(machine_config &config) PALETTE(config, m_palette, palette_device::MONOCHROME); /* sound hardware */ - invaders_audio(config); + INVADERS_AUDIO(config, "soundboard"). // the flip screen line is only connected on the cocktail PCB + flip_screen_out().set([this] (int state) { if (invaders_is_cabinet_cocktail()) m_flip_screen = state ? 1 : 0; }); } void _8080bw_state::init_spacecom() @@ -1236,12 +1237,6 @@ static INPUT_PORTS_START( cosmicmo ) PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) INPUT_PORTS_END -WRITE8_MEMBER(_8080bw_state::cosmicmo_05_w) -{ - invaders_audio_2_w(space, offset, data); - m_flip_screen = BIT(data, 5) & BIT(ioport("IN2")->read(), 2); -} - void _8080bw_state::cosmicmo_io_map(address_map &map) { map.global_mask(0x7); @@ -1251,9 +1246,9 @@ void _8080bw_state::cosmicmo_io_map(address_map &map) map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r)); map(0x02, 0x02).w(m_mb14241, FUNC(mb14241_device::shift_count_w)); - map(0x03, 0x03).w(FUNC(_8080bw_state::invaders_audio_1_w)); + map(0x03, 0x03).w("soundboard", FUNC(invaders_audio_device::p1_w)); map(0x04, 0x04).w(m_mb14241, FUNC(mb14241_device::shift_data_w)); - map(0x05, 0x05).w(FUNC(_8080bw_state::cosmicmo_05_w)); + map(0x05, 0x05).w("soundboard", FUNC(invaders_audio_device::p2_w)); map(0x06, 0x06).w(m_watchdog, FUNC(watchdog_timer_device::reset_w)); } @@ -1261,18 +1256,19 @@ void _8080bw_state::cosmicmo(machine_config &config) { mw8080bw_root(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_addrmap(AS_IO, &_8080bw_state::cosmicmo_io_map); MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw) WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 255); - /* add shifter */ + // add shifter MB14241(config, m_mb14241); - /* sound hardware */ - invaders_audio(config); + // sound hardware + INVADERS_AUDIO(config, "soundboard"). + flip_screen_out().set([this] (int state) { m_flip_screen = (state && BIT(ioport("IN2")->read(), 2)) ? 1 : 0; }); /* video hardware */ m_screen->set_screen_update(FUNC(_8080bw_state::screen_update_invaders)); @@ -1399,12 +1395,12 @@ INPUT_PORTS_END MACHINE_START_MEMBER(_8080bw_state,rollingc) { + mw8080bw_state::machine_start(); + m_scattered_colorram = std::make_unique(0x400); m_scattered_colorram2 = std::make_unique(0x400); save_pointer(&m_scattered_colorram[0], "m_scattered_colorram", 0x400); save_pointer(&m_scattered_colorram2[0], "m_scattered_colorram2", 0x400); - - MACHINE_START_CALL_MEMBER(mw8080bw); } void _8080bw_state::rollingc(machine_config &config) @@ -1535,11 +1531,12 @@ INPUT_PORTS_END MACHINE_START_MEMBER(_8080bw_state,schaser) { + mw8080bw_state::machine_start(); + m_scattered_colorram = std::make_unique(0x800); save_pointer(&m_scattered_colorram[0], "m_scattered_colorram", 0x800); MACHINE_START_CALL_MEMBER(schaser_sh); MACHINE_START_CALL_MEMBER(extra_8080bw_vh); - MACHINE_START_CALL_MEMBER(mw8080bw); } MACHINE_RESET_MEMBER(_8080bw_state,schaser) @@ -1676,12 +1673,13 @@ INPUT_PORTS_END MACHINE_START_MEMBER(_8080bw_state,schasercv) { + mw8080bw_state::machine_start(); + m_scattered_colorram = std::make_unique(0x800); save_pointer(&m_scattered_colorram[0], "m_scattered_colorram", 0x800); MACHINE_START_CALL_MEMBER(extra_8080bw_sh); MACHINE_START_CALL_MEMBER(extra_8080bw_vh); - MACHINE_START_CALL_MEMBER(mw8080bw); } void _8080bw_state::schasercv(machine_config &config) @@ -1784,10 +1782,10 @@ INPUT_PORTS_END MACHINE_START_MEMBER(_8080bw_state,sflush) { + mw8080bw_state::machine_start(); + m_scattered_colorram = std::make_unique(0x800); save_pointer(&m_scattered_colorram[0], "m_scattered_colorram", 0x800); - - MACHINE_START_CALL_MEMBER(mw8080bw); } void _8080bw_state::sflush(machine_config &config) @@ -1977,12 +1975,12 @@ WRITE_LINE_MEMBER(_8080bw_state::polaris_60hz_w) MACHINE_START_MEMBER(_8080bw_state,polaris) { + mw8080bw_state::machine_start(); + m_scattered_colorram = std::make_unique(0x800); save_pointer(&m_scattered_colorram[0], "m_scattered_colorram", 0x800); save_item(NAME(m_polaris_cloud_speed)); save_item(NAME(m_polaris_cloud_pos)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } READ8_MEMBER(_8080bw_state::polaris_port00_r) @@ -2940,9 +2938,9 @@ void _8080bw_state::vortex_io_map(address_map &map) map(0x01, 0x01).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r)); map(0x00, 0x00).w(m_mb14241, FUNC(mb14241_device::shift_count_w)); - map(0x01, 0x01).w(FUNC(_8080bw_state::invaders_audio_1_w)); + map(0x01, 0x01).w("soundboard", FUNC(invaders_audio_device::p1_w)); map(0x06, 0x06).w(m_mb14241, FUNC(mb14241_device::shift_data_w)); - map(0x07, 0x07).w(FUNC(_8080bw_state::invaders_audio_2_w)); + map(0x07, 0x07).w("soundboard", FUNC(invaders_audio_device::p2_w)); map(0x04, 0x04).w(m_watchdog, FUNC(watchdog_timer_device::reset_w)); } @@ -2990,7 +2988,8 @@ void _8080bw_state::vortex(machine_config &config) MB14241(config, m_mb14241); /* audio hardware */ - invaders_audio(config); + INVADERS_AUDIO(config, "soundboard"). // the flip screen line is only connected on the cocktail PCB + flip_screen_out().set([this] (int state) { if (invaders_is_cabinet_cocktail()) m_flip_screen = state ? 1 : 0; }); } /* decrypt function for vortex */ @@ -3273,10 +3272,10 @@ INPUT_PORTS_END MACHINE_START_MEMBER(_8080bw_state, claybust) { + mw8080bw_state::machine_start(); + m_claybust_gun_pos = 0; save_item(NAME(m_claybust_gun_pos)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } void _8080bw_state::claybust(machine_config &config) @@ -3452,7 +3451,7 @@ static INPUT_PORTS_START( invmulti ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_sw5_r) PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_coin_input_r) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, mw8080bw_state, direct_coin_count, 0) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -3467,11 +3466,6 @@ static INPUT_PORTS_START( invmulti ) PORT_BIT( 0x70, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_in2_control_r) PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW:1" ) - /* fake port for reading the coin input */ - PORT_START(INVADERS_COIN_INPUT_PORT_TAG) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* fake port for cabinet type */ PORT_START(INVADERS_CAB_TYPE_PORT_TAG) PORT_CONFNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) diff --git a/src/mame/drivers/mw8080bw.cpp b/src/mame/drivers/mw8080bw.cpp index 4b96f9c55e5..3e819dfc356 100644 --- a/src/mame/drivers/mw8080bw.cpp +++ b/src/mame/drivers/mw8080bw.cpp @@ -172,6 +172,12 @@ +INPUT_CHANGED_MEMBER(mw8080bw_state::direct_coin_count) +{ + machine().bookkeeping().coin_counter_w(0, newval); +} + + /************************************* * * Special shifter circuit @@ -236,7 +242,6 @@ void mw8080bw_state::mw8080bw_root(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &mw8080bw_state::main_map); m_maincpu->set_irq_acknowledge_callback(FUNC(mw8080bw_state::interrupt_vector)); - MCFG_MACHINE_START_OVERRIDE(mw8080bw_state,mw8080bw) MCFG_MACHINE_RESET_OVERRIDE(mw8080bw_state,mw8080bw) /* video hardware */ @@ -253,45 +258,42 @@ void mw8080bw_state::mw8080bw_root(machine_config &config) * *************************************/ -#define SEAWOLF_ERASE_SW_PORT_TAG ("ERASESW") -#define SEAWOLF_ERASE_DIP_PORT_TAG ("ERASEDIP") - - -WRITE8_MEMBER(mw8080bw_state::seawolf_explosion_lamp_w) +void seawolf_state::machine_start() { -/* D0-D3 are column drivers and D4-D7 are row drivers. - The following table shows values that light up individual lamps. + mw8080bw_state::machine_start(); - D7 D6 D5 D4 D3 D2 D1 D0 Function - -------------------------------------------------------------------------------------- - 0 0 0 1 1 0 0 0 Explosion Lamp 0 - 0 0 0 1 0 1 0 0 Explosion Lamp 1 - 0 0 0 1 0 0 1 0 Explosion Lamp 2 - 0 0 0 1 0 0 0 1 Explosion Lamp 3 - 0 0 1 0 1 0 0 0 Explosion Lamp 4 - 0 0 1 0 0 1 0 0 Explosion Lamp 5 - 0 0 1 0 0 0 1 0 Explosion Lamp 6 - 0 0 1 0 0 0 0 1 Explosion Lamp 7 - 0 1 0 0 1 0 0 0 Explosion Lamp 8 - 0 1 0 0 0 1 0 0 Explosion Lamp 9 - 0 1 0 0 0 0 1 0 Explosion Lamp A - 0 1 0 0 0 0 0 1 Explosion Lamp B - 1 0 0 0 1 0 0 0 Explosion Lamp C - 1 0 0 0 0 1 0 0 Explosion Lamp D - 1 0 0 0 0 0 1 0 Explosion Lamp E - 1 0 0 0 0 0 0 1 Explosion Lamp F -*/ - int i; + m_exp_lamps.resolve(); + m_torp_lamps.resolve(); + m_ready_lamp.resolve(); + m_reload_lamp.resolve(); +} - static const char *const lamp_names[] = - { - "EXP_LAMP_0", "EXP_LAMP_1", "EXP_LAMP_2", "EXP_LAMP_3", - "EXP_LAMP_4", "EXP_LAMP_5", "EXP_LAMP_6", "EXP_LAMP_7", - "EXP_LAMP_8", "EXP_LAMP_9", "EXP_LAMP_A", "EXP_LAMP_B", - "EXP_LAMP_C", "EXP_LAMP_D", "EXP_LAMP_E", "EXP_LAMP_F" - }; - static const uint8_t bits_for_lamps[] = +void seawolf_state::explosion_lamp_w(u8 data) +{ + /* D0-D3 are column drivers and D4-D7 are row drivers. + The following table shows values that light up individual lamps. + + D7 D6 D5 D4 D3 D2 D1 D0 Function + -------------------------------------------------------------------------------------- + 0 0 0 1 1 0 0 0 Explosion Lamp 0 + 0 0 0 1 0 1 0 0 Explosion Lamp 1 + 0 0 0 1 0 0 1 0 Explosion Lamp 2 + 0 0 0 1 0 0 0 1 Explosion Lamp 3 + 0 0 1 0 1 0 0 0 Explosion Lamp 4 + 0 0 1 0 0 1 0 0 Explosion Lamp 5 + 0 0 1 0 0 0 1 0 Explosion Lamp 6 + 0 0 1 0 0 0 0 1 Explosion Lamp 7 + 0 1 0 0 1 0 0 0 Explosion Lamp 8 + 0 1 0 0 0 1 0 0 Explosion Lamp 9 + 0 1 0 0 0 0 1 0 Explosion Lamp A + 0 1 0 0 0 0 0 1 Explosion Lamp B + 1 0 0 0 1 0 0 0 Explosion Lamp C + 1 0 0 0 0 1 0 0 Explosion Lamp D + 1 0 0 0 0 0 1 0 Explosion Lamp E + 1 0 0 0 0 0 0 1 Explosion Lamp F + */ + static constexpr u8 BITS_FOR_LAMPS[] = { 0x18, 0x14, 0x12, 0x11, 0x28, 0x24, 0x22, 0x21, @@ -299,56 +301,52 @@ WRITE8_MEMBER(mw8080bw_state::seawolf_explosion_lamp_w) 0x88, 0x84, 0x82, 0x81 }; - /* set each lamp */ - for (i = 0; i < 16; i++) + for (int i = 0; i < 16; i++) { - uint8_t bits_for_lamp = bits_for_lamps[i]; - - output().set_value(lamp_names[i], (data & bits_for_lamp) == bits_for_lamp); + u8 const bits_for_lamp(BITS_FOR_LAMPS[i]); + m_exp_lamps[i] = ((data & bits_for_lamp) == bits_for_lamp) ? 1 : 0; } } -WRITE8_MEMBER(mw8080bw_state::seawolf_periscope_lamp_w) +void seawolf_state::periscope_lamp_w(u8 data) { - /* the schematics and the connecting diagrams show the - torpedo light order differently, but this order is - confirmed by the software */ - output().set_value("TORP_LAMP_4", (data >> 0) & 0x01); - output().set_value("TORP_LAMP_3", (data >> 1) & 0x01); - output().set_value("TORP_LAMP_2", (data >> 2) & 0x01); - output().set_value("TORP_LAMP_1", (data >> 3) & 0x01); + /* the schematics and the connecting diagrams show the torpedo light + order differently, but this order is confirmed by the software */ + m_torp_lamps[3] = BIT(data, 0); + m_torp_lamps[2] = BIT(data, 1); + m_torp_lamps[1] = BIT(data, 2); + m_torp_lamps[0] = BIT(data, 3); - output().set_value("READY_LAMP", (data >> 4) & 0x01); + m_ready_lamp = BIT(data, 4); - output().set_value("RELOAD_LAMP", (data >> 5) & 0x01); + m_reload_lamp = BIT(data, 5); } -CUSTOM_INPUT_MEMBER(mw8080bw_state::seawolf_erase_input_r) +CUSTOM_INPUT_MEMBER(seawolf_state::erase_input_r) { - return ioport(SEAWOLF_ERASE_SW_PORT_TAG)->read() & - ioport(SEAWOLF_ERASE_DIP_PORT_TAG)->read(); + return m_erase_sw->read() & m_erase_dip->read(); } -void mw8080bw_state::seawolf_io_map(address_map &map) +void seawolf_state::io_map(address_map &map) { map.global_mask(0x7); - map(0x00, 0x00).mirror(0x04).r(FUNC(mw8080bw_state::mw8080bw_shift_result_rev_r)); + map(0x00, 0x00).mirror(0x04).r(FUNC(seawolf_state::mw8080bw_shift_result_rev_r)); map(0x01, 0x01).mirror(0x04).portr("IN0"); map(0x02, 0x02).mirror(0x04).portr("IN1"); map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r)); - map(0x01, 0x01).w(FUNC(mw8080bw_state::seawolf_explosion_lamp_w)); - map(0x02, 0x02).w(FUNC(mw8080bw_state::seawolf_periscope_lamp_w)); + map(0x01, 0x01).w(FUNC(seawolf_state::explosion_lamp_w)); + map(0x02, 0x02).w(FUNC(seawolf_state::periscope_lamp_w)); map(0x03, 0x03).w(m_mb14241, FUNC(mb14241_device::shift_data_w)); map(0x04, 0x04).w(m_mb14241, FUNC(mb14241_device::shift_count_w)); map(0x05, 0x05).w("soundboard", FUNC(seawolf_audio_device::write)); } -/* the 30 position encoder is verified */ +// the 30 position encoder is verified static const ioport_value seawolf_controller_table[30] = { 0x1e, 0x1c, 0x1d, 0x19, 0x18, 0x1a, 0x1b, 0x13, @@ -360,10 +358,10 @@ static const ioport_value seawolf_controller_table[30] = static INPUT_PORTS_START( seawolf ) PORT_START("IN0") - /* the grey code is inverted by buffers */ - /* The wiring diagram shows the encoder has 32 positions. */ - /* But there is a hand written table on the game logic sheet showing only 30 positions. */ - /* The actual commutator pcb (encoder) has 30 positions and works like the table says. */ + // the grey code is inverted by buffers + // The wiring diagram shows the encoder has 32 positions. + // But there is a hand written table on the game logic sheet showing only 30 positions. + // The actual commutator pcb (encoder) has 30 positions and works like the table says. PORT_BIT( 0x1f, 0x0f, IPT_POSITIONAL ) PORT_POSITIONS(30) PORT_REMAP_TABLE(seawolf_controller_table) PORT_INVERT PORT_SENSITIVITY(20) PORT_KEYDELTA(8) PORT_CENTERDELTA(0) PORT_NAME("Periscope axis") PORT_CROSSHAIR(X, ((float)MW8080BW_HPIXCOUNT - 28) / MW8080BW_HPIXCOUNT, 16.0 / MW8080BW_HPIXCOUNT, 32.0 / MW8080BW_VBSTART) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Game_Time ) ) PORT_CONDITION("IN1", 0xe0, NOTEQUALS, 0xe0) PORT_DIPLOCATION("G4:1,2") @@ -384,7 +382,7 @@ static INPUT_PORTS_START( seawolf ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, seawolf_erase_input_r) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(seawolf_state, erase_input_r) PORT_DIPNAME( 0xe0, 0x60, "Extended Time At" ) PORT_DIPLOCATION("G4:6,7,8") PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_DIPSETTING( 0x20, "2000" ) @@ -395,7 +393,7 @@ static INPUT_PORTS_START( seawolf ) PORT_DIPSETTING( 0xc0, "7000" ) PORT_DIPSETTING( 0xe0, "Test Mode" ) - /* 2 fake ports for the 'Reset High Score' input, which has a DIP to enable it */ + // 2 fake ports for the 'Reset High Score' input, which has a DIP to enable it PORT_START(SEAWOLF_ERASE_SW_PORT_TAG) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Reset High Score") PORT_CODE(KEYCODE_F2) PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -408,18 +406,19 @@ static INPUT_PORTS_START( seawolf ) INPUT_PORTS_END -void mw8080bw_state::seawolf(machine_config &config) +void seawolf_state::seawolf(machine_config &config) { mw8080bw_root(config); - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_IO, &mw8080bw_state::seawolf_io_map); - /* there is no watchdog */ + // basic machine hardware + m_maincpu->set_addrmap(AS_IO, &seawolf_state::io_map); - /* add shifter */ + // there is no watchdog + + // add shifter MB14241(config, m_mb14241); - /* audio hardware */ + // audio hardware SEAWOLF_AUDIO(config, "soundboard"); } @@ -887,6 +886,8 @@ TIMER_CALLBACK_MEMBER(mw8080bw_state::maze_tone_timing_timer_callback) MACHINE_START_MEMBER(mw8080bw_state,maze) { + mw8080bw_state::machine_start(); + /* create astable timer for IC B1 */ m_maze_tone_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mw8080bw_state::maze_tone_timing_timer_callback), this)); m_maze_tone_timer->adjust(MAZE_555_B1_PERIOD, 0, MAZE_555_B1_PERIOD); @@ -897,8 +898,6 @@ MACHINE_START_MEMBER(mw8080bw_state,maze) /* setup for save states */ save_item(NAME(m_maze_tone_timing_state)); machine().save().register_postload(save_prepost_delegate(FUNC(mw8080bw_state::maze_update_discrete), this)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -982,10 +981,10 @@ void mw8080bw_state::maze(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,boothill) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_rev_shift_res)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -1185,10 +1184,10 @@ void mw8080bw_state::checkmat(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,desertgu) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_desertgun_controller_select)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -1514,10 +1513,10 @@ void mw8080bw_state::dplay(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,gmissile) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_rev_shift_res)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -1611,10 +1610,10 @@ void mw8080bw_state::gmissile(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,m4) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_rev_shift_res)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -1710,10 +1709,10 @@ void mw8080bw_state::m4(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,clowns) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_clowns_controller_select)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -1722,13 +1721,9 @@ CUSTOM_INPUT_MEMBER(mw8080bw_state::clowns_controller_r) uint32_t ret; if (m_clowns_controller_select) - { ret = ioport(CLOWNS_CONTROLLER_P2_TAG)->read(); - } else - { ret = ioport(CLOWNS_CONTROLLER_P1_TAG)->read(); - } return ret; } @@ -2140,8 +2135,10 @@ void mw8080bw_state::dogpatch(machine_config &config) * *************************************/ -MACHINE_START_MEMBER(spcenctr_state, spcenctr) +void spcenctr_state::machine_start() { + mw8080bw_state::machine_start(); + m_trench_width = 0U; m_trench_center = 0U; std::fill(std::begin(m_trench_slope), std::end(m_trench_slope), 0U); @@ -2153,8 +2150,6 @@ MACHINE_START_MEMBER(spcenctr_state, spcenctr) save_item(NAME(m_trench_slope)); save_item(NAME(m_bright_control)); save_item(NAME(m_brightness)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -2257,8 +2252,6 @@ void spcenctr_state::spcenctr(machine_config &config) // basic machine hardware m_maincpu->set_addrmap(AS_IO, &spcenctr_state::io_map); - MCFG_MACHINE_START_OVERRIDE(spcenctr_state, spcenctr) - WATCHDOG_TIMER(config, m_watchdog).set_time(255 * attotime::from_hz(MW8080BW_60HZ)); // video hardware @@ -2279,10 +2272,10 @@ void spcenctr_state::spcenctr(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,phantom2) { + mw8080bw_state::machine_start(); + /* setup for save states */ save_item(NAME(m_phantom2_cloud_counter)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } @@ -2505,70 +2498,48 @@ void mw8080bw_state::bowler(machine_config &config) MACHINE_START_MEMBER(mw8080bw_state,invaders) { - /* setup for save states */ + mw8080bw_state::machine_start(); + + m_flip_screen = 0U; + save_item(NAME(m_flip_screen)); - - MACHINE_START_CALL_MEMBER(mw8080bw); } -CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_coin_input_r) -{ - uint32_t ret = ioport(INVADERS_COIN_INPUT_PORT_TAG)->read(); - - // FIXME: use PORT_CHANGED_MEMBER or PORT_WRITE_LINE_MEMBER instead of updating here - machine().bookkeeping().coin_counter_w(0, !ret); - - return ret; -} - - CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_sw6_sw7_r) { - uint32_t ret; - - /* upright PCB : switches visible - cocktail PCB: HI */ + // upright PCB : switches visible + // cocktail PCB: HI if (invaders_is_cabinet_cocktail()) - ret = 0x03; + return 0x03; else - ret = ioport(INVADERS_SW6_SW7_PORT_TAG)->read(); - - return ret; + return ioport(INVADERS_SW6_SW7_PORT_TAG)->read(); } CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_sw5_r) { - uint32_t ret; - - /* upright PCB : switch visible - cocktail PCB: HI */ + // upright PCB : switch visible + // cocktail PCB: HI if (invaders_is_cabinet_cocktail()) - ret = 0x01; + return 0x01; else - ret = ioport(INVADERS_SW5_PORT_TAG)->read(); - - return ret; + return ioport(INVADERS_SW5_PORT_TAG)->read(); } CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_in0_control_r) { - uint32_t ret; - - /* upright PCB : P1 controls - cocktail PCB: HI */ + // upright PCB : P1 controls + // cocktail PCB: HI if (invaders_is_cabinet_cocktail()) - ret = 0x07; + return 0x07; else - ret = ioport(INVADERS_P1_CONTROL_PORT_TAG)->read(); - - return ret; + return ioport(INVADERS_P1_CONTROL_PORT_TAG)->read(); } @@ -2580,17 +2551,13 @@ CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_in1_control_r) CUSTOM_INPUT_MEMBER(mw8080bw_state::invaders_in2_control_r) { - uint32_t ret; - - /* upright PCB : P1 controls - cocktail PCB: P2 controls */ + // upright PCB : P1 controls + // cocktail PCB: P2 controls if (invaders_is_cabinet_cocktail()) - ret = ioport(INVADERS_P2_CONTROL_PORT_TAG)->read(); + return ioport(INVADERS_P2_CONTROL_PORT_TAG)->read(); else - ret = ioport(INVADERS_P1_CONTROL_PORT_TAG)->read(); - - return ret; + return ioport(INVADERS_P1_CONTROL_PORT_TAG)->read(); } @@ -2609,9 +2576,9 @@ void mw8080bw_state::invaders_io_map(address_map &map) map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r)); map(0x02, 0x02).w(m_mb14241, FUNC(mb14241_device::shift_count_w)); - map(0x03, 0x03).w(FUNC(mw8080bw_state::invaders_audio_1_w)); + map(0x03, 0x03).w("soundboard", FUNC(invaders_audio_device::p1_w)); map(0x04, 0x04).w(m_mb14241, FUNC(mb14241_device::shift_data_w)); - map(0x05, 0x05).w(FUNC(mw8080bw_state::invaders_audio_2_w)); + map(0x05, 0x05).w("soundboard", FUNC(invaders_audio_device::p2_w)); map(0x06, 0x06).w(m_watchdog, FUNC(watchdog_timer_device::reset_w)); } @@ -2627,7 +2594,7 @@ static INPUT_PORTS_START( invaders ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_sw5_r) PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_coin_input_r) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, mw8080bw_state, direct_coin_count, 0) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2649,11 +2616,6 @@ static INPUT_PORTS_START( invaders ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - /* fake port for reading the coin input */ - PORT_START(INVADERS_COIN_INPUT_PORT_TAG) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* fake port for cabinet type */ PORT_START(INVADERS_CAB_TYPE_PORT_TAG) PORT_CONFNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) @@ -2695,21 +2657,22 @@ void mw8080bw_state::invaders(machine_config &config) { mw8080bw_root(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_addrmap(AS_IO, &mw8080bw_state::invaders_io_map); MCFG_MACHINE_START_OVERRIDE(mw8080bw_state,invaders) WATCHDOG_TIMER(config, m_watchdog).set_time(255 * attotime::from_hz(MW8080BW_60HZ)); - /* video hardware */ + // video hardware m_screen->set_screen_update(FUNC(mw8080bw_state::screen_update_invaders)); - /* add shifter */ + // add shifter MB14241(config, m_mb14241); - /* audio hardware */ - invaders_audio(config); + // audio hardware + INVADERS_AUDIO(config, "soundboard"). // the flip screen line is only connected on the cocktail PCB + flip_screen_out().set([this] (int state) { if (invaders_is_cabinet_cocktail()) m_flip_screen = state ? 1 : 0; }); } @@ -2801,21 +2764,6 @@ void mw8080bw_state::blueshrk(machine_config &config) * *************************************/ -#define INVAD2CT_COIN_INPUT_PORT_TAG ("COIN") - - -#ifdef UNUSED_FUNCTION -uint32_t mw8080bw_state::invad2ct_coin_input_r(void *param) -{ - uint32_t ret = ioport(INVAD2CT_COIN_INPUT_PORT_TAG)->read(); - - coin_counter_w(machine, 0, !ret); - - return ret; -} -#endif - - void mw8080bw_state::invad2ct_io_map(address_map &map) { map.global_mask(0x7); @@ -2824,13 +2772,13 @@ void mw8080bw_state::invad2ct_io_map(address_map &map) map(0x02, 0x02).mirror(0x04).portr("IN2"); map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r)); - map(0x01, 0x01).w(FUNC(mw8080bw_state::invad2ct_audio_3_w)); + map(0x01, 0x01).w("soundboard", FUNC(invad2ct_audio_device::p3_w)); map(0x02, 0x02).w(m_mb14241, FUNC(mb14241_device::shift_count_w)); - map(0x03, 0x03).w(FUNC(mw8080bw_state::invad2ct_audio_1_w)); + map(0x03, 0x03).w("soundboard", FUNC(invad2ct_audio_device::p1_w)); map(0x04, 0x04).w(m_mb14241, FUNC(mb14241_device::shift_data_w)); - map(0x05, 0x05).w(FUNC(mw8080bw_state::invad2ct_audio_2_w)); + map(0x05, 0x05).w("soundboard", FUNC(invad2ct_audio_device::p2_w)); map(0x06, 0x06).w(m_watchdog, FUNC(watchdog_timer_device::reset_w)); - map(0x07, 0x07).w(FUNC(mw8080bw_state::invad2ct_audio_4_w)); + map(0x07, 0x07).w("soundboard", FUNC(invad2ct_audio_device::p4_w)); } @@ -2846,7 +2794,7 @@ static INPUT_PORTS_START( invad2ct ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, invaders_coin_input_r) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, mw8080bw_state, direct_coin_count, 0) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -2871,11 +2819,6 @@ static INPUT_PORTS_START( invad2ct ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW:1") PORT_DIPSETTING( 0x80, "1500" ) PORT_DIPSETTING( 0x00, "2000" ) - - /* fake port for reading the coin input */ - PORT_START(INVAD2CT_COIN_INPUT_PORT_TAG) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END @@ -2883,16 +2826,16 @@ void mw8080bw_state::invad2ct(machine_config &config) { mw8080bw_root(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_addrmap(AS_IO, &mw8080bw_state::invad2ct_io_map); WATCHDOG_TIMER(config, m_watchdog).set_time(255 * attotime::from_hz(MW8080BW_60HZ)); - /* add shifter */ + // add shifter MB14241(config, m_mb14241); - /* audio hardware */ - invad2ct_audio(config); + // audio hardware + INVAD2CT_AUDIO(config, "soundboard"); } @@ -3218,8 +3161,8 @@ ROM_END // PCB # year rom parent machine inp state init monitor company,fullname,flags -/* 596 */ GAMEL( 1976, seawolf, 0, seawolf, seawolf, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Sea Wolf (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_seawolf ) -/* 596 */ GAMEL( 1976, seawolfo, seawolf, seawolf, seawolf, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Sea Wolf (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_seawolf ) +/* 596 */ GAMEL( 1976, seawolf, 0, seawolf, seawolf, seawolf_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Sea Wolf (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_seawolf ) +/* 596 */ GAMEL( 1976, seawolfo, seawolf, seawolf, seawolf, seawolf_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Sea Wolf (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_seawolf ) /* 597 */ GAMEL( 1975, gunfight, 0, gunfight, gunfight, gunfight_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Gun Fight (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gunfight ) /* 597 */ GAMEL( 1975, gunfighto, gunfight, gunfight, gunfight, gunfight_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Gun Fight (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gunfight ) /* 604 Gun Fight (cocktail, dump does not exist) */ diff --git a/src/mame/includes/8080bw.h b/src/mame/includes/8080bw.h index fc7317155e9..c6cd4f34eb5 100644 --- a/src/mame/includes/8080bw.h +++ b/src/mame/includes/8080bw.h @@ -34,9 +34,11 @@ public: , m_audiocpu(*this, "audiocpu") , m_schaser_effect_555_timer(*this, "schaser_sh_555") , m_claybust_gun_on(*this, "claybust_gun") + , m_sn(*this, "snsnd") , m_speaker(*this, "speaker") , m_eeprom(*this, "eeprom") , m_palette(*this, "palette") + , m_colorram(*this, "colorram") , m_gunx(*this, "GUNX") , m_guny(*this, "GUNY") , m_timer_state(1) @@ -90,9 +92,11 @@ private: optional_device m_audiocpu; optional_device m_schaser_effect_555_timer; optional_device m_claybust_gun_on; + optional_device m_sn; optional_device m_speaker; optional_device m_eeprom; optional_device m_palette; + optional_shared_ptr m_colorram; /* misc game specific */ optional_ioport m_gunx; @@ -101,6 +105,14 @@ private: uint8_t m_screen_red; uint8_t m_fleet_step; + std::unique_ptr m_scattered_colorram; + std::unique_ptr m_scattered_colorram2; + + /* sound-related */ + uint8_t m_port_1_last_extra; + uint8_t m_port_2_last_extra; + uint8_t m_port_3_last_extra; + attotime m_schaser_effect_555_time_remain; int32_t m_schaser_effect_555_time_remain_savable; int m_schaser_effect_555_is_low; @@ -124,7 +136,6 @@ private: DECLARE_WRITE8_MEMBER(spcewars_sh_port_w); DECLARE_WRITE8_MEMBER(lrescue_sh_port_1_w); DECLARE_WRITE8_MEMBER(lrescue_sh_port_2_w); - DECLARE_WRITE8_MEMBER(cosmicmo_05_w); DECLARE_WRITE8_MEMBER(cosmo_sh_port_2_w); DECLARE_READ8_MEMBER(darthvdr_01_r); DECLARE_WRITE8_MEMBER(darthvdr_00_w); @@ -215,6 +226,8 @@ private: inline void set_8_pixels( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, uint8_t data, int fore_color, int back_color ); void clear_extra_columns( bitmap_rgb32 &bitmap, int color ); + void invaders_samples_audio(machine_config &config); + void astropal_io_map(address_map &map); void attackfc_io_map(address_map &map); void ballbomb_io_map(address_map &map); diff --git a/src/mame/includes/mw8080bw.h b/src/mame/includes/mw8080bw.h index 6148e8b917e..a3f144b0a56 100644 --- a/src/mame/includes/mw8080bw.h +++ b/src/mame/includes/mw8080bw.h @@ -52,54 +52,33 @@ public: m_mb14241(*this,"mb14241"), m_watchdog(*this, "watchdog"), m_main_ram(*this, "main_ram"), - m_colorram(*this, "colorram"), - m_colorram2(*this, "colorram2"), m_discrete(*this, "discrete"), m_samples(*this, "samples"), - m_sn1(*this, "sn1"), - m_sn2(*this, "sn2"), - m_sn(*this, "snsnd"), m_screen(*this, "screen") { } void blueshrk(machine_config &config); - void blueshrk_audio(machine_config &config); void boothill(machine_config &config); - void boothill_audio(machine_config &config); void bowler(machine_config &config); - void bowler_audio(machine_config &config); void checkmat(machine_config &config); - void checkmat_audio(machine_config &config); void clowns(machine_config &config); void desertgu(machine_config &config); - void desertgu_audio(machine_config &config); void dogpatch(machine_config &config); - void dogpatch_audio(machine_config &config); void dplay(machine_config &config); - void dplay_audio(machine_config &config); void gmissile(machine_config &config); void invad2ct(machine_config &config); - void invad2ct_audio(machine_config &config); void invaders(machine_config &config); - void invaders_audio(machine_config &config); - void invaders_samples_audio(machine_config &config); void m4(machine_config &config); void maze(machine_config &config); - void maze_audio(machine_config &config); void mw8080bw_root(machine_config &config); void phantom2(machine_config &config); - void seawolf(machine_config &config); void shuffle(machine_config &config); - void shuffle_audio(machine_config &config); void spacwalk(machine_config &config); - void spacwalk_audio(machine_config &config); void tornbase(machine_config &config); - void tornbase_audio(machine_config &config); void zzzap(machine_config &config); - void zzzap_audio(machine_config &config); + DECLARE_INPUT_CHANGED_MEMBER(direct_coin_count); - DECLARE_CUSTOM_INPUT_MEMBER(seawolf_erase_input_r); DECLARE_CUSTOM_INPUT_MEMBER(tornbase_hit_left_input_r); DECLARE_CUSTOM_INPUT_MEMBER(tornbase_hit_right_input_r); DECLARE_CUSTOM_INPUT_MEMBER(tornbase_pitch_left_input_r); @@ -110,54 +89,42 @@ public: DECLARE_CUSTOM_INPUT_MEMBER(dplay_pitch_left_input_r); DECLARE_CUSTOM_INPUT_MEMBER(dplay_pitch_right_input_r); DECLARE_CUSTOM_INPUT_MEMBER(clowns_controller_r); - DECLARE_CUSTOM_INPUT_MEMBER(invaders_coin_input_r); + DECLARE_CUSTOM_INPUT_MEMBER(blueshrk_coin_input_r); + DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw6_sw7_r); DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw5_r); - DECLARE_CUSTOM_INPUT_MEMBER(blueshrk_coin_input_r); DECLARE_CUSTOM_INPUT_MEMBER(invaders_in0_control_r); DECLARE_CUSTOM_INPUT_MEMBER(invaders_in1_control_r); DECLARE_CUSTOM_INPUT_MEMBER(invaders_in2_control_r); - DECLARE_MACHINE_START(mw8080bw); DECLARE_MACHINE_RESET(mw8080bw); IRQ_CALLBACK_MEMBER(interrupt_vector); protected: + virtual void machine_start() override; - /* device/memory pointers */ + DECLARE_READ8_MEMBER(mw8080bw_shift_result_rev_r); + + int invaders_is_cabinet_cocktail(); + + uint32_t screen_update_invaders(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + uint32_t screen_update_mw8080bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + // device/memory pointers required_device m_maincpu; optional_device m_mb14241; optional_device m_watchdog; required_shared_ptr m_main_ram; - optional_shared_ptr m_colorram; - optional_shared_ptr m_colorram2; optional_device m_discrete; - /* other devices */ + // other devices optional_device m_samples; - optional_device m_sn1; - optional_device m_sn2; - optional_device m_sn; required_device m_screen; - /* sound-related */ - uint8_t m_port_1_last_extra; - uint8_t m_port_2_last_extra; - uint8_t m_port_3_last_extra; - - /* misc game specific */ + // misc game specific uint8_t m_flip_screen; - DECLARE_WRITE8_MEMBER(invaders_audio_1_w); - DECLARE_WRITE8_MEMBER(invaders_audio_2_w); - - std::unique_ptr m_scattered_colorram; - std::unique_ptr m_scattered_colorram2; - - uint32_t screen_update_invaders(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_mw8080bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - private: /* misc game specific */ uint16_t m_phantom2_cloud_counter; @@ -172,11 +139,8 @@ private: attotime m_interrupt_time; - DECLARE_READ8_MEMBER(mw8080bw_shift_result_rev_r); DECLARE_READ8_MEMBER(mw8080bw_reversable_shift_result_r); DECLARE_WRITE8_MEMBER(mw8080bw_reversable_shift_count_w); - DECLARE_WRITE8_MEMBER(seawolf_explosion_lamp_w); - DECLARE_WRITE8_MEMBER(seawolf_periscope_lamp_w); DECLARE_WRITE8_MEMBER(tornbase_io_w); DECLARE_WRITE8_MEMBER(maze_coin_counter_w); DECLARE_WRITE8_MEMBER(maze_io_w); @@ -218,10 +182,6 @@ private: DECLARE_WRITE8_MEMBER(dogpatch_audio_w); DECLARE_WRITE8_MEMBER(bowler_audio_1_w); DECLARE_WRITE8_MEMBER(blueshrk_audio_w); - DECLARE_WRITE8_MEMBER(invad2ct_audio_1_w); - DECLARE_WRITE8_MEMBER(invad2ct_audio_2_w); - DECLARE_WRITE8_MEMBER(invad2ct_audio_3_w); - DECLARE_WRITE8_MEMBER(invad2ct_audio_4_w); void maze_update_discrete(); void maze_write_discrete(uint8_t maze_tone_timing_state); uint8_t vpos_to_vysnc_chain_counter( int vpos ); @@ -229,7 +189,20 @@ private: void mw8080bw_create_interrupt_timer( ); void mw8080bw_start_interrupt_timer( ); uint8_t tornbase_get_cabinet_type(); - int invaders_is_cabinet_cocktail(); + + void blueshrk_audio(machine_config &config); + void boothill_audio(machine_config &config); + void bowler_audio(machine_config &config); + void checkmat_audio(machine_config &config); + void desertgu_audio(machine_config &config); + void dogpatch_audio(machine_config &config); + void dplay_audio(machine_config &config); + void maze_audio(machine_config &config); + void shuffle_audio(machine_config &config); + void spacwalk_audio(machine_config &config); + void tornbase_audio(machine_config &config); + void zzzap_audio(machine_config &config); + void blueshrk_io_map(address_map &map); void boothill_io_map(address_map &map); void bowler_io_map(address_map &map); @@ -245,7 +218,6 @@ private: void main_map(address_map &map); void maze_io_map(address_map &map); void phantom2_io_map(address_map &map); - void seawolf_io_map(address_map &map); void shuffle_io_map(address_map &map); void spacwalk_io_map(address_map &map); void tornbase_io_map(address_map &map); @@ -253,6 +225,45 @@ private: }; +#define SEAWOLF_ERASE_SW_PORT_TAG ("ERASESW") +#define SEAWOLF_ERASE_DIP_PORT_TAG ("ERASEDIP") + +class seawolf_state : public mw8080bw_state +{ +public: + seawolf_state(machine_config const &mconfig, device_type type, char const *tag) : + mw8080bw_state(mconfig, type, tag), + m_erase_sw(*this, SEAWOLF_ERASE_SW_PORT_TAG), + m_erase_dip(*this, SEAWOLF_ERASE_DIP_PORT_TAG), + m_exp_lamps(*this, "EXP_LAMP_%X", 0U), + m_torp_lamps(*this, "TORP_LAMP_%u", 1U), + m_ready_lamp(*this, "READY_LAMP"), + m_reload_lamp(*this, "RELOAD_LAMP") + { + } + + void seawolf(machine_config &config); + + DECLARE_CUSTOM_INPUT_MEMBER(erase_input_r); + +protected: + virtual void machine_start() override; + +private: + void explosion_lamp_w(u8 data); + void periscope_lamp_w(u8 data); + + void io_map(address_map &map); + + required_ioport m_erase_sw; + required_ioport m_erase_dip; + output_finder<15> m_exp_lamps; + output_finder<4> m_torp_lamps; + output_finder<> m_ready_lamp; + output_finder<> m_reload_lamp; +}; + + class gunfight_state : public mw8080bw_state { public: @@ -285,7 +296,7 @@ public: void spcenctr(machine_config &config); protected: - DECLARE_MACHINE_START(spcenctr); + virtual void machine_start() override; private: void io_w(offs_t offset, u8 data); @@ -303,8 +314,6 @@ private: }; -#define SEAWOLF_GUN_PORT_TAG ("GUN") - #define TORNBASE_CAB_TYPE_UPRIGHT_OLD (0) #define TORNBASE_CAB_TYPE_UPRIGHT_NEW (1) #define TORNBASE_CAB_TYPE_COCKTAIL (2) @@ -315,7 +324,6 @@ private: #define INVADERS_CAB_TYPE_PORT_TAG ("CAB") #define INVADERS_P1_CONTROL_PORT_TAG ("CONTP1") #define INVADERS_P2_CONTROL_PORT_TAG ("CONTP2") -#define INVADERS_COIN_INPUT_PORT_TAG ("COIN") #define INVADERS_SW6_SW7_PORT_TAG ("SW6SW7") #define INVADERS_SW5_PORT_TAG ("SW5") diff --git a/src/mame/machine/mw8080bw.cpp b/src/mame/machine/mw8080bw.cpp index cabace7c321..9942209eebd 100644 --- a/src/mame/machine/mw8080bw.cpp +++ b/src/mame/machine/mw8080bw.cpp @@ -109,7 +109,7 @@ void mw8080bw_state::mw8080bw_start_interrupt_timer( ) * *************************************/ -MACHINE_START_MEMBER(mw8080bw_state,mw8080bw) +void mw8080bw_state::machine_start() { mw8080bw_create_interrupt_timer(); } diff --git a/src/mame/video/mw8080bw.cpp b/src/mame/video/mw8080bw.cpp index 83e6756a1fb..d7479eb8824 100644 --- a/src/mame/video/mw8080bw.cpp +++ b/src/mame/video/mw8080bw.cpp @@ -351,40 +351,37 @@ WRITE_LINE_MEMBER(mw8080bw_state::screen_vblank_phantom2) *************************************/ -/* the flip screen circuit is just a couple of relays on the monitor PCB */ +// the flip screen circuit is just a couple of relays on the monitor PCB uint32_t mw8080bw_state::screen_update_invaders(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { uint8_t x = 0; uint8_t y = MW8080BW_VCOUNTER_START_NO_VBLANK; uint8_t video_data = 0; - uint8_t flip = m_flip_screen; while (1) { - /* plot the current pixel */ + // plot the current pixel pen_t pen = (video_data & 0x01) ? rgb_t::white() : rgb_t::black(); - if (flip) + if (m_flip_screen) bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pen; else bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; - /* next pixel */ + // next pixel video_data = video_data >> 1; x = x + 1; - /* end of line? */ + // end of line? if (x == 0) { - /* yes, flush out the shift register */ - int i; - - for (i = 0; i < 4; i++) + // yes, flush out the shift register + for (int i = 0; i < 4; i++) { pen = (video_data & 0x01) ? rgb_t::white() : rgb_t::black(); - if (flip) + if (m_flip_screen) bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + i)) = pen; else bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; @@ -392,18 +389,16 @@ uint32_t mw8080bw_state::screen_update_invaders(screen_device &screen, bitmap_rg video_data = video_data >> 1; } - /* next row, video_data is now 0, so the next line will start - with 4 blank pixels */ + // next row, video_data is now 0, so the next line will start with 4 blank pixels y = y + 1; - /* end of screen? */ + // end of screen? if (y == 0) break; } - /* the video RAM is read at every 8 pixels starting with pixel 4 */ - else if ((x & 0x07) == 0x04) + else if ((x & 0x07) == 0x04) // the video RAM is read at every 8 pixels starting with pixel 4 { - offs_t offs = ((offs_t)y << 5) | (x >> 3); + offs_t const offs = (offs_t(y) << 5) | (x >> 3); video_data = m_main_ram[offs]; } }