mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
New working machines
-------------------- Space Battle (Hoei, set 1) [Paul Arnold] New working clones ------------------ Space Battle (Hoei, set 2) [Paul Arnold]
This commit is contained in:
parent
be36d5af33
commit
3173577a13
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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);
|
||||
|
@ -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<i8039_device> m_8039;
|
||||
required_device<sp0250_device> m_sp0250;
|
||||
required_memory_bank m_soundbank;
|
||||
|
||||
uint8_t m_p2;
|
||||
};
|
||||
|
||||
|
||||
#endif // MAME_INCLUDES_GALAXIAN_H
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user