From 3173577a135a506680691a497337275ecc338f30 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 27 Jan 2022 13:12:00 +0100 Subject: [PATCH] New working machines -------------------- Space Battle (Hoei, set 1) [Paul Arnold] New working clones ------------------ Space Battle (Hoei, set 2) [Paul Arnold] --- src/devices/sound/sp0250.cpp | 9 ++ src/devices/sound/sp0250.h | 1 + src/devices/sound/ymf271.cpp | 6 +- src/mame/audio/galaxian.cpp | 272 ++++++++++++++++++++++++++++++-- src/mame/audio/galaxian.h | 16 ++ src/mame/drivers/galaxian.cpp | 285 ++++++++++++++++++++++++++++++++-- src/mame/drivers/seibuspi.cpp | 2 +- src/mame/includes/galaxian.h | 41 ++++- src/mame/mame.lst | 2 + src/mame/video/galaxian.cpp | 59 +++---- 10 files changed, 633 insertions(+), 60 deletions(-) diff --git a/src/devices/sound/sp0250.cpp b/src/devices/sound/sp0250.cpp index 77a66a2233f..6d9ed63ecd3 100644 --- a/src/devices/sound/sp0250.cpp +++ b/src/devices/sound/sp0250.cpp @@ -99,6 +99,15 @@ void sp0250_device::device_start() save_item(NAME(m_fifo_pos)); } +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void sp0250_device::device_reset() +{ + load_values(); +} + void sp0250_device::device_timer(emu_timer &timer, device_timer_id id, int param) { m_stream->update(); diff --git a/src/devices/sound/sp0250.h b/src/devices/sound/sp0250.h index c5b0b2caeea..260e77ad695 100644 --- a/src/devices/sound/sp0250.h +++ b/src/devices/sound/sp0250.h @@ -19,6 +19,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param) override; // sound stream update overrides diff --git a/src/devices/sound/ymf271.cpp b/src/devices/sound/ymf271.cpp index 4201d0aaf23..4cebeb3c019 100644 --- a/src/devices/sound/ymf271.cpp +++ b/src/devices/sound/ymf271.cpp @@ -253,7 +253,7 @@ inline void ymf271_device::calculate_status_end(int slotnum, bool state) if(slotnum & 3) return; - /* + /* bit scheme is kinda twisted status1 Busy End36 End24 End12 End0 ---- TimB TimA status2 End44 End32 End20 End8 End40 End28 End16 End4 @@ -1371,11 +1371,11 @@ void ymf271_device::ymf271_write_timer(uint8_t address, uint8_t data) switch (address) { case 0x10: - m_timerA = (m_timerA & 0x003) | (uint32_t(data) << 2); // High 8 bit of Timer A period + m_timerA = (m_timerA & 0x003) | (data << 2); // High 8 bit of Timer A period break; case 0x11: - // Timer A is 10 bit, splitted high 8 bit and low 2 bit like other Yamaha FM chips + // Timer A is 10 bit, split high 8 bit and low 2 bit like other Yamaha FM chips // unlike Yamaha's documentation; it says 0x11 writes timer A upper 2 bits. m_timerA = (m_timerA & 0x3fc) | (data & 0x03); // Low 2 bit of Timer A period break; diff --git a/src/mame/audio/galaxian.cpp b/src/mame/audio/galaxian.cpp index 5f97ad9a839..18fc0c32d3b 100644 --- a/src/mame/audio/galaxian.cpp +++ b/src/mame/audio/galaxian.cpp @@ -50,6 +50,11 @@ TODO: #define GAL_INP_PITCH NODE_28 /* at 6T in schematics */ +#define SB_INP_NOISE_3 NODE_30 +#define SB_INP_NOISE_2 NODE_31 +#define SB_INP_NOISE_1 NODE_32 + + #define TTL_OUT (4.0) #define GAL_R15 RES_K(100) @@ -121,6 +126,48 @@ TODO: #define GAL_C46 CAP_U(0.1) +/* + * Hoei Space Battle values + * +*/ +#define SB_VOL_MIX_R1 RES_K(120) +#define SB_VOL_MIX_R2 RES_K(39) +#define SB_VOL_MIX_R3 RES_K(82) +#define SB_VOL_MIX_R4 RES_K(62) + +#define SB_R76 RES_K(33) +#define SB_R77 RES_K(22) + +#define SB_R66 RES_K(470) +#define SB_R62 RES_K(150) +#define SB_R36 RES_K(22) +#define SB_C30 CAP_U(0.01) +#define SB_C29 CAP_U(0.01) +#define SB_C22 CAP_U(2.2) + +#define SB_R67 RES_K(470) +#define SB_R68 RES_K(100) +#define SB_R61 RES_K(22) +#define SB_C26 CAP_U(1.0) +#define SB_C32 CAP_U(0.01) +#define SB_C33 CAP_U(0.01) + +#define SB_R69 RES_K(470) +#define SB_R64 RES_K(100) +#define SB_R58 RES_K(22) +#define SB_C19 CAP_U(1.0) +#define SB_C35 CAP_U(0.01) +#define SB_C34 CAP_U(0.01) +#define SB_C40 CAP_U(0.1) +#define SB_C41 CAP_U(0.1) +#define SB_C43 CAP_U(0.1) +#define SB_C44 CAP_U(0.1) + +#define SB_R80 RES_K(4.7) +#define SB_R82 RES_K(2.2) +#define SB_R83 RES_K(2.2) +#define SB_R85 RES_K(2.2) + /************************************* * @@ -128,7 +175,6 @@ TODO: * *************************************/ - static const discrete_dac_r1_ladder galaxian_bck_dac = { 4, // size of ladder @@ -237,13 +283,55 @@ static const discrete_op_amp_filt_info galaxian_bandpass_desc = 5, 0 }; +/* sbhoei mixing */ + +static const discrete_mixer_desc sbhoei_mixer_desc = +{ + DISC_MIXER_IS_RESISTOR, + {SB_VOL_MIX_R1, 0, SB_VOL_MIX_R3, 0,SB_R82, SB_R83, SB_R85, SB_R80}, /* A, C, C, D */ + {0, GAL_INP_VOL1, 0, GAL_INP_VOL2,0, 0, 0, 0, }, + {0, 0, 0, 0, SB_C41,SB_C43,SB_C44,SB_C40}, + 0, GAL_R91, + 0, + GAL_C46, + 0, 1 +}; + +static const discrete_op_amp_filt_info sbhoei_bandpass_desc1 = +{ + SB_R62, SB_R36, 0, 0, + SB_R66, + SB_C30, SB_C29, 0, + 5.0*SB_R76/(SB_R77+SB_R76), + 5, 0 +}; + +static const discrete_op_amp_filt_info sbhoei_bandpass_desc2 = +{ + SB_R68, SB_R61, 0, 0, + SB_R67, + SB_C32, SB_C33, 0, + 5.0*SB_R76/(SB_R77+SB_R76), + 5, 0 +}; + +static const discrete_op_amp_filt_info sbhoei_bandpass_desc3 = +{ + SB_R64, SB_R58, 0, 0, + SB_R69, + SB_C35, SB_C34, 0, + 5.0*SB_R76/(SB_R77+SB_R76), + 5, 0 +}; + + + /************************************* * * Discrete Sound Blocks * *************************************/ - static DISCRETE_SOUND_START(galaxian_discrete) /************************************************/ @@ -387,8 +475,136 @@ static DISCRETE_SOUND_START(mooncrst_discrete) DISCRETE_MIXER7(NODE_280, 1, NODE_133_00, NODE_133_02, NODE_133_02,NODE_133_03, NODE_120, NODE_157, NODE_182, &mooncrst_mixer_desc) DISCRETE_SOUND_END + +static DISCRETE_SOUND_START(sbhoei_discrete) + + /************************************************/ + /* Input register mapping for hoei space battle */ + /************************************************/ + + /* HIT */ + DISCRETE_INPUTX_DATA(SB_INP_NOISE_3, TTL_OUT, 0, 0) + DISCRETE_INPUTX_DATA(SB_INP_NOISE_2, TTL_OUT, 0, 0) + DISCRETE_INPUTX_DATA(SB_INP_NOISE_1, TTL_OUT, 0, 0) + + /* FIRE */ + DISCRETE_INPUT_LOGIC(GAL_INP_FIRE) + + /* PITCH */ + DISCRETE_INPUT_DATA(GAL_INP_PITCH) + + /* Turns on / off resistors in mixer */ + DISCRETE_INPUTX_DATA(GAL_INP_VOL1, SB_VOL_MIX_R2, 0, 0) + DISCRETE_INPUTX_DATA(GAL_INP_VOL2, SB_VOL_MIX_R4, 0, 0) + + DISCRETE_TASK_START(0) + + /************************************************/ + /* NOISE */ + /************************************************/ + + /* since only a sample of the LFSR is latched @V2 we let the lfsr + * run at a lower speed + */ + DISCRETE_LFSR_NOISE(NODE_150, 1, 1, RNG_RATE.dvalue()/100, 1.0, 0, 0.5, &galaxian_lfsr) + DISCRETE_SQUAREWFIX(NODE_151,1,(60*264)/2,1.0,50,0.5,0) /* 2V signal */ + DISCRETE_LOGIC_DFLIPFLOP(NODE_152,1,1,NODE_151,NODE_150) + + DISCRETE_SQUAREWFIX(NODE_200,1,(60*264*384)/128,1.0,50,0.5,0) /* 128H signal */ + DISCRETE_LOGIC_DFLIPFLOP(NODE_201,1,1,NODE_200,NODE_150) + + DISCRETE_SQUAREWFIX(NODE_206,1,(60*264)/8,1.0,50,0.5,0) /* 4v+8v signal */ + DISCRETE_LOGIC_DFLIPFLOP(NODE_205,1,1,NODE_206,NODE_150) + DISCRETE_TASK_END() + + /* pitch */ + DISCRETE_TASK_START(1) + + /************************************************/ + /* PITCH */ + /************************************************/ + + /* two cascaded LS164 which are reset to pitch latch value, + * thus generating SOUND_CLOCK / (256 - pitch_clock) signal + * + * One possibility to implement this is + * DISCRETE_TRANSFORM3(NODE_130, SOUND_CLOCK, 256, GAL_INP_PITCH, "012-/") + * DISCRETE_COUNTER(NODE_132, 1, 0, NODE_130, 0, 15, DISC_COUNT_UP, 0, DISC_CLK_IS_FREQ) + * but there is a native choice: + */ + DISCRETE_NOTE(NODE_132, 1, SOUND_CLOCK.dvalue(), GAL_INP_PITCH, 255, 15, DISC_CLK_IS_FREQ) + + /* from the 74393 (counter 2 above) only QA, QC, QD are used. + * We decode three here and use SUB_NODE(133,x) below to access. + */ + DISCRETE_BITS_DECODE(NODE_133, NODE_132, 0, 3, TTL_OUT) /* QA-QD 74393 */ + + /* End of this task */ + DISCRETE_TASK_END() + + DISCRETE_TASK_START(1) + + /* NOISE 3 + * Not 100% correct - switching causes high impedance input for node_157 + * this is not emulated */ + DISCRETE_RCDISC5(NODE_155, NODE_152, SB_INP_NOISE_3, (SB_R62 + SB_R36), SB_C22) + DISCRETE_OP_AMP_FILTER(NODE_157, 1, NODE_155, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &sbhoei_bandpass_desc1) + + /* NOISE 2 + * Not 100% correct - switching causes high impedance input for node_157 + * this is not emulated */ + DISCRETE_RCDISC5(NODE_202, NODE_205, SB_INP_NOISE_2, (SB_R64 + SB_R58), SB_C19) + DISCRETE_OP_AMP_FILTER(NODE_204, 1, NODE_202, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &sbhoei_bandpass_desc3) + + /* NOISE 1 + * Not 100% correct - switching causes high impedance input for node_157 + * this is not emulated */ + DISCRETE_RCDISC5(NODE_207, NODE_201, SB_INP_NOISE_1, (SB_R68 + SB_R61), SB_C26) + DISCRETE_OP_AMP_FILTER(NODE_203, 1, NODE_207, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &sbhoei_bandpass_desc2) + + DISCRETE_TASK_END() + + DISCRETE_TASK_START(1) + /************************************************/ + /* FIRE */ + /************************************************/ + + DISCRETE_LOGIC_INVERT(NODE_170, GAL_INP_FIRE) + DISCRETE_MULTIPLY(NODE_171, TTL_OUT, GAL_INP_FIRE) + DISCRETE_MULTIPLY(NODE_172, TTL_OUT, NODE_170) // inverted + DISCRETE_RCFILTER(NODE_173, NODE_172, GAL_R47, GAL_C28) + /* Mix noise and 163 */ + DISCRETE_TRANSFORM5(NODE_177, NODE_152, TTL_OUT, 1.0/GAL_R46, NODE_173, 1.0/GAL_R48, + "01*2*34*+" ) + //DISCRETE_MULTIPLY(NODE_174, 1, TTL_OUT, NODE_152) + //DISCRETE_MULTIPLY(NODE_175, 1, 1.0/GAL_R46, NODE_174) + //DISCRETE_MULTIPLY(NODE_176, 1, 1.0/GAL_R48, NODE_173) + //DISCRETE_ADDER2(NODE_177, 1, NODE_175, NODE_176) + DISCRETE_MULTIPLY(NODE_178, RES_2_PARALLEL(GAL_R46, GAL_R48), NODE_177) + + DISCRETE_555_ASTABLE_CV(NODE_181, 1, GAL_R44, GAL_R45, GAL_C27, NODE_178, &galaxian_555_fire_vco_desc) + + /* 555 toggles discharge on rc discharge module */ + DISCRETE_RCDISC5(NODE_182, NODE_181, NODE_171, (GAL_R41), GAL_C25) + + /* End of task */ + DISCRETE_TASK_END() + + /************************************************/ + /* FINAL MIX */ + /************************************************/ + + DISCRETE_TASK_START(2) + DISCRETE_MIXER8(NODE_280, 1, NODE_133_00, NODE_133_02, NODE_133_02, NODE_133_03,NODE_157, NODE_203, NODE_204, NODE_182, &sbhoei_mixer_desc) + DISCRETE_OUTPUT(NODE_280, 32767.0/5.0*5) + DISCRETE_TASK_END() + +DISCRETE_SOUND_END + + DEFINE_DEVICE_TYPE(GALAXIAN_SOUND, galaxian_sound_device, "galaxian_sound", "Galaxian Custom Sound") -DEFINE_DEVICE_TYPE(MOONCRST_SOUND, mooncrst_sound_device, "mooncrst_sound", "Mooncrst Custom Sound") +DEFINE_DEVICE_TYPE(MOONCRST_SOUND, mooncrst_sound_device, "mooncrst_sound", "Moon Cresta Custom Sound") +DEFINE_DEVICE_TYPE(SBHOEI_SOUND, sbhoei_sound_device, "sbhoei_sound", "Space Battle Custom Sound") galaxian_sound_device::galaxian_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : galaxian_sound_device(mconfig, GALAXIAN_SOUND, tag, owner, clock) @@ -398,10 +614,20 @@ galaxian_sound_device::galaxian_sound_device(const machine_config &mconfig, cons galaxian_sound_device::galaxian_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , m_discrete(*this, "discrete") - , m_lfo_val(0) { } +mooncrst_sound_device::mooncrst_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : galaxian_sound_device(mconfig, MOONCRST_SOUND, tag, owner, clock) +{ +} + +sbhoei_sound_device::sbhoei_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : galaxian_sound_device(mconfig, SBHOEI_SOUND, tag, owner, clock) +{ +} + + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -413,17 +639,34 @@ void galaxian_sound_device::device_start() save_item(NAME(m_lfo_val)); } +void sbhoei_sound_device::device_start() +{ +} + + //------------------------------------------------- // machine_add_config - add device configuration //------------------------------------------------- void galaxian_sound_device::device_add_mconfig(machine_config &config) { - // sound hardware DISCRETE(config, m_discrete).add_route(ALL_OUTPUTS, ":speaker", 1.0); m_discrete->set_intf(galaxian_discrete); } +void mooncrst_sound_device::device_add_mconfig(machine_config &config) +{ + galaxian_sound_device::device_add_mconfig(config); + m_discrete->set_intf(mooncrst_discrete); +} + +void sbhoei_sound_device::device_add_mconfig(machine_config &config) +{ + galaxian_sound_device::device_add_mconfig(config); + m_discrete->set_intf(sbhoei_discrete); +} + + /************************************* * * Write handlers @@ -433,7 +676,7 @@ void galaxian_sound_device::device_add_mconfig(machine_config &config) /* IC 9J */ void galaxian_sound_device::pitch_w(uint8_t data) { - m_discrete->write(GAL_INP_PITCH, data ); + m_discrete->write(GAL_INP_PITCH, data); } void galaxian_sound_device::lfo_freq_w(offs_t offset, uint8_t data) @@ -459,7 +702,7 @@ void galaxian_sound_device::noise_enable_w(uint8_t data) void galaxian_sound_device::vol_w(offs_t offset, uint8_t data) { - m_discrete->write(NODE_RELATIVE(GAL_INP_VOL1,offset), data & 0x01); + m_discrete->write(NODE_RELATIVE(GAL_INP_VOL1, offset), data & 0x01); } void galaxian_sound_device::fire_enable_w(uint8_t data) @@ -497,13 +740,18 @@ void galaxian_sound_device::sound_w(offs_t offset, uint8_t data) } } -mooncrst_sound_device::mooncrst_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : galaxian_sound_device(mconfig, MOONCRST_SOUND, tag, owner, clock) + +void sbhoei_sound_device::noise1_enable_w(offs_t offset, uint8_t data) { + m_discrete->write(SB_INP_NOISE_1, data & 0x01); } -void mooncrst_sound_device::device_add_mconfig(machine_config &config) +void sbhoei_sound_device::noise2_enable_w(offs_t offset, uint8_t data) { - galaxian_sound_device::device_add_mconfig(config); - m_discrete->set_intf(mooncrst_discrete); + m_discrete->write(SB_INP_NOISE_2, data & 0x01); +} + +void sbhoei_sound_device::noise3_enable_w(offs_t offset, uint8_t data) +{ + m_discrete->write(SB_INP_NOISE_3, data & 0x01); } diff --git a/src/mame/audio/galaxian.h b/src/mame/audio/galaxian.h index 124b2009cf3..a2a8b119638 100644 --- a/src/mame/audio/galaxian.h +++ b/src/mame/audio/galaxian.h @@ -44,7 +44,23 @@ protected: virtual void device_add_mconfig(machine_config &config) override; }; +class sbhoei_sound_device : public galaxian_sound_device +{ +public: + sbhoei_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void noise1_enable_w(offs_t offset, uint8_t data); + void noise2_enable_w(offs_t offset, uint8_t data); + void noise3_enable_w(offs_t offset, uint8_t data); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; +}; + DECLARE_DEVICE_TYPE(GALAXIAN_SOUND, galaxian_sound_device) DECLARE_DEVICE_TYPE(MOONCRST_SOUND, mooncrst_sound_device) +DECLARE_DEVICE_TYPE(SBHOEI_SOUND, sbhoei_sound_device) #endif // MAME_AUDIO_GALAXIAN_H diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp index eef7c54ee0e..bf63d699e69 100644 --- a/src/mame/drivers/galaxian.cpp +++ b/src/mame/drivers/galaxian.cpp @@ -136,6 +136,40 @@ Notes about 'frogg' : bit 5 of IN1 is tested if "Cabinet" Dip Switch is set to "Cocktail". +Notes about 'Space Battle' by Hoei : +------------------------------------ + + The main board is based on Galaxian with the following changes... + 1. Adjustable 555 sound circuit has been removed. + 2. Two additional noise circuits have been added similar to the 'hit' noise + but using different vertical counts. + 3. Six paged graphic roms are supported on board. + 4. Different memory map. + 5. 2K of ram. + 6. Sockets for upto 26K of rom. + 7. Socket for connecting speech synthesis board. + + Roms from two boards have been dumped. The graphics roms are the same. + The game roms differ as follows: + Set 1 Rom A contains a 16bit checksum at address 0x64/0x65. + Rom I contains a 16bit checksum at address 0x7fe/0x7ff + No other roms from this set contain a checksum. + Set 2 Rom A does not contain a valid checksum. + Roms B, C, E, F, G, H, and I contain a 16bit checksum at 0x7fe/0x7ff + Rom D contains a 16bit checksum at address 0x5e3/0x534 + Rom D contains inline code for one subroutine rather than calling the + routine. It also has a check a for condition which can't happen + removed. + Rom G checks the TEST button input on power up and calls 0x5800 if it + is active. We do not have a dump of this (test ?) rom. + At no point are the checksums validated. + From a game point of view both rom sets function exactly the same. + + Interestingly, the overlapped 4764 ROM is actually from sstrangr2 (aka Super + Space Stranger, marketed by Hoei), That's on completely different hardware. + It looks like it's used here for crude protection. + + Galaxian Bootleg Single Board Layout: ------------------------------------- @@ -175,7 +209,7 @@ Galaxian Bootleg Single Board Layout: |----------------------------------------------------------------------------------------------| 1 2 3 4 5 6 7 8 9 1 0 - +**************************************************************************** Stephh's notes (based on the games Z80 code and some tests) for games based on 'scobra' MACHINE_DRIVER : @@ -676,9 +710,9 @@ t) 'bagmanmc' - DSW bit 6 was previously used for "Bonus Lives" settings, but it has no effect in this set because of 'NOP' instructions from 0x3501 to 0x3507. +**************************************************************************** TODO: ----- - Problems with Galaxian based on the observation of a real machine: - Background humming is incorrect. It's faster on a real machine - Explosion sound is much softer. Filter involved? @@ -1585,6 +1619,42 @@ void moonwar_state::port_select_w(uint8_t data) } +/************************************* + * + * Hoei Space Battle I/O + * + *************************************/ + +void sbhoei_state::machine_start() +{ + galaxian_state::machine_start(); + + m_p2 = 0xff; + save_item(NAME(m_p2)); +} + +void sbhoei_state::sbhoei_soundlatch_w(uint8_t data) +{ + m_soundlatch->write(data & 0x7f); + m_8039->set_input_line(0, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); +} + +void sbhoei_state::p2_w(uint8_t data) +{ + if ((data & 0x80) & (~m_p2 & 0x80)) + m_sp0250->reset(); + + m_p2 = data; + + m_soundbank->set_entry((data & 0x07) | ((data >> 2) & 8)); +} + +uint8_t sbhoei_state::p1_r() +{ + return (m_8039->p1_r() & 0x80) | (m_soundlatch->read() & 0x7f); +} + + /************************************* * * Memory maps @@ -2341,7 +2411,6 @@ void galaxian_state::turpins_map(address_map &map) } - // this is the same as theend, except for separate RGB background controls and some extra ROM space at $7000 and $C000 void nihon_sfx_state::sfx_map(address_map &map) { @@ -2392,7 +2461,7 @@ void monsterz_state::monsterz_map(address_map &map) $6002-$6006: graphics banking controls replace coin lockout, coin counter, and lfo $7002: coin counter (moved from $6003) $8000-$afff: additional ROM area - $b000-$bfff: protection + $b000-$bfff: protection (T00 custom chip) */ void galaxian_state::jumpbug_map(address_map &map) { @@ -2571,6 +2640,39 @@ void tenspot_state::tenspot_select_map(address_map &map) } +void sbhoei_state::sbhoei_map_discrete(address_map &map) +{ + map(0xa000, 0xa000).mirror(0x07f8).w("cust", FUNC(sbhoei_sound_device::noise1_enable_w)); + map(0xa001, 0xa001).mirror(0x07f8).w("cust", FUNC(sbhoei_sound_device::noise2_enable_w)); + map(0xa803, 0xa803).mirror(0x07f8).w("cust", FUNC(sbhoei_sound_device::noise3_enable_w)); + map(0xa805, 0xa805).mirror(0x07f8).w("cust", FUNC(sbhoei_sound_device::fire_enable_w)); + map(0xa806, 0xa807).mirror(0x07f8).w("cust", FUNC(sbhoei_sound_device::vol_w)); + map(0xb800, 0xb800).mirror(0x07ff).w("cust", FUNC(sbhoei_sound_device::pitch_w)); +} + +void sbhoei_state::sbhoei_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x7fff).rom(); + map(0x8000, 0x87ff).ram(); + map(0x8800, 0x8800).mirror(0x07ff).w(FUNC(sbhoei_state::sbhoei_soundlatch_w)); + map(0x8800, 0x8800).mirror(0x07ff).r(m_8039, FUNC(i8039_device::p1_r)); + map(0x9000, 0x93ff).mirror(0x0400).ram().w(FUNC(sbhoei_state::galaxian_videoram_w)).share("videoram"); + map(0x9800, 0x98ff).mirror(0x0700).ram().w(FUNC(sbhoei_state::galaxian_objram_w)).share("spriteram"); + map(0xa000, 0xa000).mirror(0x07ff).portr("IN0"); + map(0xa002, 0xa006).mirror(0x07f8).w(FUNC(sbhoei_state::galaxian_gfxbank_w)); + map(0xa800, 0xa800).mirror(0x07ff).portr("IN1"); + map(0xb000, 0xb000).mirror(0x07ff).portr("IN2"); + map(0xb000, 0xb000).mirror(0x07f8).w(FUNC(sbhoei_state::irq_enable_w)); + map(0xb004, 0xb004).mirror(0x07f8).w(FUNC(sbhoei_state::galaxian_stars_enable_w)); + map(0xb006, 0xb006).mirror(0x07f8).w(FUNC(sbhoei_state::galaxian_flip_screen_x_w)); + map(0xb007, 0xb007).mirror(0x07f8).w(FUNC(sbhoei_state::galaxian_flip_screen_y_w)); + map(0xb800, 0xb800).mirror(0x07ff).r("watchdog", FUNC(watchdog_timer_device::reset_r)); + sbhoei_map_discrete(map); +} + + + uint8_t galaxian_state::froggeram_ppi8255_r(offs_t offset) { // same as theend, but accesses are scrambled @@ -2653,6 +2755,7 @@ void guttangt_state::guttangts3_map(address_map &map) map(0x8000, 0x87ff).rom().region("maincpu", 0x4000); } + /************************************* * * Sound CPU memory maps @@ -2691,6 +2794,9 @@ void galaxian_state::konami_sound_portmap(address_map &map) map(0x00, 0xff).rw(FUNC(galaxian_state::konami_ay8910_r), FUNC(galaxian_state::konami_ay8910_w)); } + +// Monster Zero + void monsterz_state::monsterz_sound_map(address_map &map) { konami_sound_map(map); @@ -2712,6 +2818,7 @@ void monsterz_state::monsterz_sample_map(address_map& map) map(0x4000, 0x4000).lw8(NAME([this](uint8_t data) { m_monsterz_shift2 = (m_monsterz_shift2 << 8) | data; })); } + // Checkman with 1 x AY-8910A void galaxian_state::checkman_sound_map(address_map &map) @@ -2776,6 +2883,15 @@ void zac_scorpion_state::scorpion_sound_portmap(address_map &map) } +// Turpins bootleg + +void galaxian_state::turpins_sound_map(address_map &map) +{ + konami_sound_map(map); + map(0x9000, 0x9000).r(FUNC(galaxian_state::konami_sound_timer_r)); // why does it read it here AND from the AY port? +} + + // King and Balloon with DAC void kingball_state::kingball_map(address_map &map) @@ -2818,10 +2934,17 @@ void nihon_sfx_state::sfx_sample_portmap(address_map &map) map(0x00, 0xff).rw(FUNC(nihon_sfx_state::sample_io_r), FUNC(nihon_sfx_state::sample_io_w)); } -void galaxian_state::turpins_sound_map(address_map &map) + +// Hoei Space Battle speech board + +void sbhoei_state::sbhoei_sound_map(address_map &map) { - konami_sound_map(map); - map(0x9000, 0x9000).r(FUNC(galaxian_state::konami_sound_timer_r)); // why does it read it here AND from the AY port? + map(0x0000, 0x07ff).rom(); +} + +void sbhoei_state::sbhoei_sound_io_map(address_map &map) +{ + map(0x00, 0xff).bankr(m_soundbank); } @@ -6995,6 +7118,30 @@ static INPUT_PORTS_START( guttangt ) INPUT_PORTS_END +static INPUT_PORTS_START( sbhoei ) + PORT_INCLUDE(galaxian) + + PORT_MODIFY("IN1") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DPSW:!1") + PORT_DIPSETTING( 0x40, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Difficult ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DPSW:!2,!3") + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 4C_1C ) ) + PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DPSW:!4,!5") + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_6C ) ) +INPUT_PORTS_END + + /************************************* * * Graphics layouts @@ -7955,6 +8102,32 @@ void galaxian_state::mimonscr(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::mimonscr_map); } +void sbhoei_state::sbhoei(machine_config &config) +{ + galaxian_base(config); + + // basic machine hardware + m_maincpu->set_addrmap(AS_PROGRAM, &sbhoei_state::sbhoei_map); + + WATCHDOG_TIMER(config.replace(), "watchdog").set_vblank_count("screen", 20); + + I8039(config, m_8039, 4_MHz_XTAL); + m_8039->set_addrmap(AS_PROGRAM, &sbhoei_state::sbhoei_sound_map); + m_8039->set_addrmap(AS_IO, &sbhoei_state::sbhoei_sound_io_map); + m_8039->p1_in_cb().set(FUNC(sbhoei_state::p1_r)); + m_8039->p2_out_cb().set(FUNC(sbhoei_state::p2_w)); + m_8039->t1_in_cb().set(m_sp0250, FUNC(sp0250_device::drq_r)); + m_8039->bus_out_cb().set(m_sp0250, FUNC(sp0250_device::write)); + + // sound hardware + GENERIC_LATCH_8(config, m_soundlatch); + + SP0250(config, m_sp0250, 3.12_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 1.0); + + SBHOEI_SOUND(config, "cust", 0); +} + + /* Quaak (Frogger bootleg) @@ -8513,6 +8686,18 @@ void guttangt_state::init_guttangts3() romdata[i] = buf[i ^ 0xff]; } +void sbhoei_state::init_sbhoei() +{ + common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, nullptr); + + m_extend_tile_info_ptr = extend_tile_info_delegate(&sbhoei_state::sbhoei_extend_tile_info, this); + m_extend_sprite_info_ptr = extend_sprite_info_delegate(&sbhoei_state::sbhoei_extend_sprite_info, this); + + m_soundbank->configure_entries(0, 16, memregion("sbhoei_sound_rom")->base(), 0x0100); + m_soundbank->set_entry(8); +} + + /************************************* * * Moon Cresta-derived games @@ -9159,6 +9344,7 @@ void namenayo_state::init_namenayo() m_extend_sprite_info_ptr = extend_sprite_info_delegate(&namenayo_state::namenayo_extend_sprite_info, this); } + /************************************* * * ROM definitions @@ -9896,7 +10082,7 @@ ROM_START( luctoday ) ROM_LOAD( "ltchar2.bin", 0x0000, 0x0800, CRC(8cd73bdc) SHA1(6174f7347d2c96f9c5074bc0da5a370c9b07461b)) ROM_LOAD( "ltchar1.bin", 0x0800, 0x0800, CRC(b5ba9946) SHA1(7222cbe8c41ca74b214f4dd5439bf69d90f4644e)) - ROM_REGION( 0x0020, "proms", 0 )//This may not be the correct prom + ROM_REGION( 0x0020, "proms", 0 ) // This may not be the correct prom ROM_LOAD( "74s288.ch", 0x0000, 0x0020, BAD_DUMP CRC(24652bc4) SHA1(d89575f3749c75dc963317fe451ffeffd9856e4d)) ROM_END @@ -10344,7 +10530,7 @@ ROM_START( gteikokub2 ) ROM_LOAD( "l06_prom.bin", 0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) ) ROM_END -ROM_START( gteikokub3 ) // still has the IREM copyright, but the PCB is a bootleg with ROMs labeled "Honly Electronics" +ROM_START( gteikokub3 ) // still has the IREM copyright, but the PCB is a bootleg with ROMs labeled "Honly Electronics" ROM_REGION( 0x4000, "maincpu", 0 ) ROM_LOAD( "g1.a3", 0x0000, 0x0800, CRC(d975af10) SHA1(a2e2a36a75db8fd09441308b08b6ae073c68b8cf) ) ROM_LOAD( "g0.a2", 0x0800, 0x0800, CRC(378aba50) SHA1(713c98e76e386fe47adde79955ab15f04c1a0ab5) ) @@ -15191,6 +15377,72 @@ ROM_START( guttangts3 ) ROM_LOAD( "pal16l8cn.11j", 0x000, 0x117, BAD_DUMP CRC(c75e94db) SHA1(3ecf73884691c44e211b1cfaead3d79baa394b7b) ) // Bruteforced and untested ROM_END + +ROM_START( sbhoei ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "4764.4k", 0x0000, 0x2000, CRC(d88f86cc) SHA1(9f284ee50caf3c64bd04a79a798de620348881bc) ) + ROM_RELOAD( 0x4000, 0x0800 ) + ROM_LOAD( "a.1k", 0x0000, 0x0800, CRC(a72175a4) SHA1(42cce21992b24cd1264426141311e310b89f6c23) ) + ROM_LOAD( "b.2k", 0x0800, 0x0800, CRC(133259bd) SHA1(d85daad4b8ff5a662bc51e5b46a5b7a755e3636f) ) + ROM_LOAD( "c.3k", 0x1000, 0x0800, CRC(d35b1434) SHA1(d3de38424cea10ca7c122118cc3fb6c900d62592) ) + ROM_LOAD( "d.5k", 0x2000, 0x0800, CRC(ff2cbd5a) SHA1(ad82b04b2cd8b2f71e62e011f8def6d201293a7b) ) + ROM_LOAD( "e.1j", 0x2800, 0x0800, CRC(6fa0993f) SHA1(0d8c79c6fa9f9a9b3e8f6c9c2fdcc572fe126419) ) + ROM_LOAD( "f.2j", 0x3000, 0x0800, CRC(a90ac60a) SHA1(d53447c1c54be5b372cd77b876b5f8f6def433d7) ) + ROM_LOAD( "g.3j", 0x3800, 0x0800, CRC(b7caf17f) SHA1(1c7b5a80ad71d7974460c598f02bc6f16511b952) ) + ROM_LOAD( "h.5j", 0x4800, 0x0800, CRC(1f8841d2) SHA1(1d53357fb22ec22df4b6faa8122be521a3c7bbeb) ) + ROM_LOAD( "i.1h", 0x5000, 0x0800, CRC(b24a7a88) SHA1(b463711a6b269985a5a3231bc502136d4a034ad7) ) + + ROM_REGION( 0x0800, "i8039", 0 ) // speech board + ROM_LOAD( "sound_h.ic3", 0x0000, 0x0800, CRC(21968996) SHA1(6b7b8d831689fe14f3040db04e06168311aa8a18) ) + + ROM_REGION( 0x1000, "sbhoei_sound_rom", 0 ) // speech board + ROM_LOAD( "sound_h.ic1", 0x0000, 0x1000, CRC(74383aac) SHA1(0289e85817f7f3d9e921002b465a23934ee61ade) ) + + ROM_REGION( 0x3000, "gfx1", 0 ) + ROM_LOAD( "b.15j", 0x0000, 0x0800, CRC(df47d042) SHA1(163a016ac63159c66dfb097e99fc058c9a9c7987) ) + ROM_LOAD( "d.14j", 0x0800, 0x0800, CRC(5f08bd01) SHA1(76cbbae14187fa464e74b2ab25be5bf7310e858d) ) + ROM_LOAD( "f.13j", 0x1000, 0x0800, CRC(ac234ff4) SHA1(30e02bad8884f357444c4df2cb79e2b678634775) ) + ROM_LOAD( "a.15k", 0x1800, 0x0800, CRC(8e05141f) SHA1(3a507c24533290d532e7cfb82d93fa73956f5b20) ) + ROM_LOAD( "c.14k", 0x2000, 0x0800, CRC(c15ac36f) SHA1(dbe3cf6017c263413c770040d659612c3954be73) ) + ROM_LOAD( "e.13k", 0x2800, 0x0800, CRC(a7bb7c92) SHA1(ef356c10793d02d4f80582dc429340f682f2c40c) ) + + ROM_REGION( 0x0020, "proms", 0 ) // not sure if correct + ROM_LOAD( "colrom.bin", 0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) ) +ROM_END + +ROM_START( sbhoeia ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "4764.4k", 0x0000, 0x2000, CRC(d88f86cc) SHA1(9f284ee50caf3c64bd04a79a798de620348881bc) ) + ROM_RELOAD( 0x4000, 0x0800 ) + ROM_LOAD( "s2-a.1k", 0x0000, 0x0800, CRC(b07fa2dd) SHA1(ec2b5caa6e57e3f3ae37979af3d104e602e1fe92) ) + ROM_LOAD( "s2-b.2k", 0x0800, 0x0800, CRC(42ce5b91) SHA1(5048e0dff416a43e47879d30f7eac1861a49e4f4) ) + ROM_LOAD( "s2-c.3k", 0x1000, 0x0800, CRC(08fd6af2) SHA1(9c0f1eabe508e7f7c6f5c124289226fd6098af32) ) + ROM_LOAD( "s2-d.5k", 0x2000, 0x0800, CRC(62ea78ef) SHA1(41323b84242152a6b15f08c160d2f37cb4ef58a6) ) + ROM_LOAD( "s2-e.1j", 0x2800, 0x0800, CRC(7553955a) SHA1(f22e8a6d4399fafd5e966342bf957c7678d678a8) ) + ROM_LOAD( "s2-f.2j", 0x3000, 0x0800, CRC(54d7ef11) SHA1(635eaf6cc93af36d858302abc98481b251fed15d) ) + ROM_LOAD( "s2-g.3j", 0x3800, 0x0800, CRC(9609943b) SHA1(2ffb86d8f2043aaec86aeaa1044cbc50a3c0de97) ) + ROM_LOAD( "s2-h.5j", 0x4800, 0x0800, CRC(bf237239) SHA1(77ca35776918183d37db5110d10f5493ec4bb9b6) ) + ROM_LOAD( "i.1h", 0x5000, 0x0800, CRC(b24a7a88) SHA1(b463711a6b269985a5a3231bc502136d4a034ad7) ) + + ROM_REGION( 0x0800, "i8039", 0 ) // speech board + ROM_LOAD( "sound_h.ic3", 0x0000, 0x0800, CRC(21968996) SHA1(6b7b8d831689fe14f3040db04e06168311aa8a18) ) + + ROM_REGION( 0x1000, "sbhoei_sound_rom", 0 ) // speech board + ROM_LOAD( "sound_h.ic1", 0x0000, 0x1000, CRC(74383aac) SHA1(0289e85817f7f3d9e921002b465a23934ee61ade) ) + + ROM_REGION( 0x3000, "gfx1", 0 ) + ROM_LOAD( "b.15j", 0x0000, 0x0800, CRC(df47d042) SHA1(163a016ac63159c66dfb097e99fc058c9a9c7987) ) + ROM_LOAD( "d.14j", 0x0800, 0x0800, CRC(5f08bd01) SHA1(76cbbae14187fa464e74b2ab25be5bf7310e858d) ) + ROM_LOAD( "f.13j", 0x1000, 0x0800, CRC(ac234ff4) SHA1(30e02bad8884f357444c4df2cb79e2b678634775) ) + ROM_LOAD( "a.15k", 0x1800, 0x0800, CRC(8e05141f) SHA1(3a507c24533290d532e7cfb82d93fa73956f5b20) ) + ROM_LOAD( "c.14k", 0x2000, 0x0800, CRC(c15ac36f) SHA1(dbe3cf6017c263413c770040d659612c3954be73) ) + ROM_LOAD( "e.13k", 0x2800, 0x0800, CRC(a7bb7c92) SHA1(ef356c10793d02d4f80582dc429340f682f2c40c) ) + + ROM_REGION( 0x0020, "proms", 0 ) // not sure if correct + ROM_LOAD( "colrom.bin", 0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) ) +ROM_END + + /************************************* * * Game drivers @@ -15556,10 +15808,10 @@ GAME( 1981, armorcar2, armorcar, scobra, armorcar2, galaxian_state, init_ GAME( 1982, tazmania, 0, scobra, tazmania, galaxian_state, init_scobra, ROT90, "Stern Electronics", "Tazz-Mania (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, mimonkey, 0, mimonkey, mimonkey, galaxian_state, init_mimonkey, ROT90, "Universal Video Games", "Mighty Monkey", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, mimonsco, mimonkey, mimonkey, mimonsco, galaxian_state, init_mimonkeyb, ROT90, "bootleg", "Mighty Monkey (bootleg on Super Cobra hardware)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, mimonscr, mimonkey, mimonscr, mimonkey, galaxian_state, init_mimonkeyb, ROT90, "bootleg", "Mighty Monkey (bootleg on Scramble hardware)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, mimonscra, mimonkey, mimonscr, mimonkey, galaxian_state, init_mimonkeyb, ROT90, "bootleg (Kaina Games)", "Mighty Monkey (Kaina Games, bootleg on Scramble hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, mimonkey, 0, mimonkey, mimonkey, galaxian_state, init_mimonkey, ROT90, "Universal Video Games", "Mighty Monkey", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, mimonsco, mimonkey, mimonkey, mimonsco, galaxian_state, init_mimonkeyb, ROT90, "bootleg", "Mighty Monkey (bootleg on Super Cobra hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, mimonscr, mimonkey, mimonscr, mimonkey, galaxian_state, init_mimonkeyb, ROT90, "bootleg", "Mighty Monkey (bootleg on Scramble hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, mimonscra, mimonkey, mimonscr, mimonkey, galaxian_state, init_mimonkeyb, ROT90, "bootleg (Kaina Games)", "Mighty Monkey (Kaina Games, bootleg on Scramble hardware)", MACHINE_SUPPORTS_SAVE ) /* Anteater (sold as conversion kit) @@ -15573,7 +15825,6 @@ GAME( 1982, anteatergg, anteater, anteatergg, anteatergg, galaxian_state, init_ GAME( 1982, calipso, 0, scobra, calipso, galaxian_state, init_calipso, ROT90, "Tago Electronics", "Calipso", MACHINE_SUPPORTS_SAVE ) - /* Lost Tomb CPU/Video Board: A969 (Has various wire mods) @@ -15586,5 +15837,9 @@ GAME( 1984, spdcoin, 0, scobra, spdcoin, galaxian_state, init_ GAME( 1985, superbon, 0, scobra, superbon, galaxian_state, init_superbon, ROT90, "Signatron USA", "Agent Super Bond (Super Cobra conversion)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) -// single player reference: https://www.nicovideo.jp/watch/sm16782405 +// Namennayo - single player reference: https://www.nicovideo.jp/watch/sm16782405 GAME( 1982, namenayo, 0, namenayo, namenayo, namenayo_state, init_namenayo, ROT0, "Cat's", "Namennayo (Japan)", MACHINE_SUPPORTS_SAVE ) + +// Hoei Space Battle +GAME( 1980, sbhoei, 0, sbhoei, sbhoei, sbhoei_state, init_sbhoei, ROT90, "Hoei", "Space Battle (Hoei, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, sbhoeia, sbhoei, sbhoei, sbhoei, sbhoei_state, init_sbhoei, ROT90, "Hoei", "Space Battle (Hoei, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/seibuspi.cpp b/src/mame/drivers/seibuspi.cpp index 00de7e7d079..d00f644ce2a 100644 --- a/src/mame/drivers/seibuspi.cpp +++ b/src/mame/drivers/seibuspi.cpp @@ -2003,7 +2003,7 @@ void seibuspi_state::sys386f(machine_config &config) MCFG_VIDEO_START_OVERRIDE(seibuspi_state, sys386f) /* sound hardware */ - // Single PCBs only output mono sound + // Single PCBs only output mono sound SPEAKER(config, "mono").front_center(); YMZ280B(config, "ymz", XTAL(16'384'000)).add_route(ALL_OUTPUTS, "mono", 1.0); diff --git a/src/mame/includes/galaxian.h b/src/mame/includes/galaxian.h index f36a5b62b6c..8fb6f476765 100644 --- a/src/mame/includes/galaxian.h +++ b/src/mame/includes/galaxian.h @@ -10,14 +10,15 @@ #pragma once +#include "cpu/mcs48/mcs48.h" #include "machine/gen_latch.h" #include "machine/i8255.h" #include "machine/netlist.h" #include "machine/timer.h" - #include "sound/ay8910.h" #include "sound/dac.h" #include "sound/digitalk.h" +#include "sound/sp0250.h" #include "emupal.h" #include "screen.h" @@ -863,4 +864,42 @@ private: uint8_t m_counter_74ls161[2]; }; + +class sbhoei_state : public galaxian_state +{ +public: + sbhoei_state(const machine_config &mconfig, device_type type, const char *tag) + : galaxian_state(mconfig, type, tag) + , m_8039(*this, "i8039") + , m_sp0250(*this, "sp0250") + , m_soundbank(*this, "soundbank") + { + } + + void sbhoei(machine_config &config); + void init_sbhoei(); + void sbhoei_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y); + void sbhoei_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color); + +protected: + virtual void machine_start() override; + +private: + void sbhoei_map(address_map &map); + void sbhoei_map_discrete(address_map &map); + void sbhoei_sound_map(address_map &map); + void sbhoei_sound_io_map(address_map &map); + + void sbhoei_soundlatch_w(uint8_t data); + void p2_w(uint8_t data); + uint8_t p1_r(); + + required_device m_8039; + required_device m_sp0250; + required_memory_bank m_soundbank; + + uint8_t m_p2; +}; + + #endif // MAME_INCLUDES_GALAXIAN_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 15c7b761392..af52d3d502f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -14701,6 +14701,8 @@ quaak // bootleg redufo // (c) Artic redufob // bootleg redufob2 // bootleg +sbhoei // Hoei +sbhoeia // Hoei scobra // GX316 (c) 1981 Konami scobrab // GX316 (c) 1981 Karateco (bootleg?) scobrae // GX316 (c) 1981 Stern diff --git a/src/mame/video/galaxian.cpp b/src/mame/video/galaxian.cpp index 03eed46f894..b8b03fe15b7 100644 --- a/src/mame/video/galaxian.cpp +++ b/src/mame/video/galaxian.cpp @@ -1400,6 +1400,8 @@ void galaxian_state::jumpbug_extend_sprite_info(const uint8_t *base, uint8_t *sx } } + +/*** Namennayo ***/ void namenayo_state::namenayo_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y) { if ((attrib & 0x01) == 0x00) // main game display @@ -1431,6 +1433,12 @@ void namenayo_state::namenayo_unk_d800_w(uint8_t data) // popmessage("namenayo_unk_d800_w %02x", data); } +void namenayo_state::namenayo_extattr_w(offs_t offset, uint8_t data) +{ + m_screen->update_partial(m_screen->vpos()); + m_exattrram[offset] = data; + m_bg_tilemap->mark_all_dirty(); +} void namenayo_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect) { @@ -1455,7 +1463,8 @@ void namenayo_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectan m_bg_tilemap->draw(*m_screen, bitmap, draw, TILEMAP_DRAW_OPAQUE, 0); } -// Guttang Gottong bootleg + +/*** Guttang Gottong bootleg ***/ void galaxian_state::guttangt_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color) { // is this configurable or a hardwired mod? @@ -1463,30 +1472,32 @@ void galaxian_state::guttangt_extend_sprite_info(const uint8_t *base, uint8_t *s } -/************************************* - * - * Four Play extensions - * - *************************************/ +/*** Hoei Space Battle ***/ +void sbhoei_state::sbhoei_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y) +{ + if (((m_gfxbank[2] & 1) && (*code & 0xc0) == 0x80) || ((m_gfxbank[3] & 1) && (*code & 0xc0) == 0xc0)) + *code = (*code & 0x3f) | ((m_gfxbank[0] & 1) << 6) | ((m_gfxbank[1] & 1) << 7) | (0x0100 << (m_gfxbank[4] & 1)); +} -// gfxbank[4] is used as a cpu bank number, and gfxbank[0] for graphics banking +void sbhoei_state::sbhoei_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color) +{ + if (((m_gfxbank[2] & 1) && (*code & 0x30) == 0x20) || ((m_gfxbank[3] & 1) && (*code & 0x30) == 0x30)) + *code = (*code & 0x0f) | ((m_gfxbank[0] & 1) << 4) | ((m_gfxbank[1] & 1) << 5) | (0x40 << (m_gfxbank[4] & 1)); +} + + +/*** Four Play ***/ void fourplay_state::fourplay_rombank_w(offs_t offset, uint8_t data) { + // gfxbank[4] is used as a cpu bank number, and gfxbank[0] for graphics banking m_gfxbank[4] = (m_gfxbank[4] & (2 - offset)) | (data << offset); - m_gfxbank[0] = (m_gfxbank[4] == 3); // 1 = true, 0 = false m_rombank->set_entry(m_gfxbank[4]); } - -/************************************* - * - * Video Eight extensions - * - *************************************/ - +/*** Video Eight ***/ void videight_state::videight_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y) { *code |= (m_gfxbank[0] << 8); @@ -1499,8 +1510,7 @@ void videight_state::videight_extend_sprite_info(const uint8_t *base, uint8_t *s *color |= (m_gfxbank[4] << 3); } - -/* This handles the main bankswitching for code and one-bank gfx games */ +// This handles the main bankswitching for code and one-bank gfx games void videight_state::videight_rombank_w(offs_t offset, uint8_t data) { static constexpr uint8_t gfxbanks[] = { 0, 10, 2, 8, 1, 9, 4, 11 }; @@ -1514,10 +1524,10 @@ void videight_state::videight_rombank_w(offs_t offset, uint8_t data) } } -/* This handles those games with multiple gfx banks */ +// This handles those games with multiple gfx banks void videight_state::videight_gfxbank_w(offs_t offset, uint8_t data) { - /* Moon Cresta (mooncrgx) */ + // Moon Cresta (mooncrgx) if ((data < 2) && (m_gfxbank[4] == 3)) { static constexpr uint8_t gfxbanks[] = { 8, 12, 8, 14, 8, 13, 8, 15 }; @@ -1527,18 +1537,11 @@ void videight_state::videight_gfxbank_w(offs_t offset, uint8_t data) galaxian_gfxbank_w(0, gfxbanks[m_gfxbank[3]]); } - /* Uniwar S */ + // Uniwar S if ((data < 2) && (m_gfxbank[4] == 2) && (offset == 2)) galaxian_gfxbank_w(0, data + 2); - /* Pisces (piscesb) */ + // Pisces (piscesb) if ((data < 2) && (m_gfxbank[4] == 6) && (offset == 2)) galaxian_gfxbank_w(0, data + 4); } - -void namenayo_state::namenayo_extattr_w(offs_t offset, uint8_t data) -{ - m_screen->update_partial(m_screen->vpos()); - m_exattrram[offset] = data; - m_bg_tilemap->mark_all_dirty(); -}