circus: split classes part2

This commit is contained in:
hap 2023-08-07 19:19:36 +02:00
parent 013022771b
commit 15c60a2eaa
4 changed files with 228 additions and 191 deletions

View File

@ -92,6 +92,19 @@ uint8_t circus_state::paddle_r()
return m_paddle->read();
}
void circus_state::clown_z_w(uint8_t data)
{
// This register triggers the discrete sound circuitry
//logerror("Z: %02X\n", data);
sound_w(data);
// also used to enable the amplifier
machine().sound().system_mute(data & 0x80);
// and the clown image currently displayed
m_clown_z = data;
}
/*******************************************************************************
@ -595,38 +608,19 @@ ROM_START( ripcord )
ROM_END
void circus_state::init_circus()
{
m_game_id = 1;
}
void circus_state::init_robotbwl()
{
m_game_id = 2;
}
void circus_state::init_crash()
{
m_game_id = 3;
}
void circus_state::init_ripcord()
{
m_game_id = 4;
}
/*******************************************************************************
Game Drivers
*******************************************************************************/
GAMEL( 1977, circus, 0, circus, circus, circus_state, init_circus, ROT0, "Exidy / Taito", "Circus / Acrobat TV", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // named Acrobat TV when Taito published it in Japan
GAMEL( 1977, circuso, circus, circus, circus, circus_state, init_circus, ROT0, "Exidy / Taito", "Circus / Acrobat TV (older)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // "
GAMEL( 1977, springbd, circus, circus, circus, circus_state, init_circus, ROT0, "bootleg (Sub-Electro)", "Springboard (bootleg of Circus)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // looks like a text hack, but it also had a different bezel
GAMEL( 1977, circus, 0, circus, circus, circus_state, empty_init, ROT0, "Exidy / Taito", "Circus / Acrobat TV", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // named Acrobat TV when Taito published it in Japan
GAMEL( 1977, circuso, circus, circus, circus, circus_state, empty_init, ROT0, "Exidy / Taito", "Circus / Acrobat TV (older)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // "
GAMEL( 1977, springbd, circus, circus, circus, circus_state, empty_init, ROT0, "bootleg (Sub-Electro)", "Springboard (bootleg of Circus)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // looks like a text hack, but it also had a different bezel
GAME( 1977, robotbwl, 0, robotbwl, robotbwl, robotbwl_state, init_robotbwl, ROT0, "Exidy", "Robot Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1977, robotbwl, 0, robotbwl, robotbwl, robotbwl_state, empty_init, ROT0, "Exidy", "Robot Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAMEL( 1979, crash, 0, crash, crash, crash_state, init_crash, ROT0, "Exidy", "Crash (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash )
GAMEL( 1979, crasha, crash, crash, crash, crash_state, init_crash, ROT0, "Exidy", "Crash (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crasha )
GAMEL( 1979, smash, crash, crash, crash, crash_state, init_crash, ROT0, "bootleg", "Smash (Crash bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) // looks like a text hack, but it also had a different bezel
GAMEL( 1979, crash, 0, crash, crash, crash_state, empty_init, ROT0, "Exidy", "Crash (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash )
GAMEL( 1979, crasha, crash, crash, crash, crash_state, empty_init, ROT0, "Exidy", "Crash (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crasha )
GAMEL( 1979, smash, crash, crash, crash, crash_state, empty_init, ROT0, "bootleg", "Smash (Crash bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) // looks like a text hack, but it also had a different bezel
GAME( 1979, ripcord, 0, ripcord, ripcord, ripcord_state, init_ripcord, ROT0, "Exidy", "Rip Cord", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1979, ripcord, 0, ripcord, ripcord, ripcord_state, empty_init, ROT0, "Exidy", "Rip Cord", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )

View File

@ -32,11 +32,6 @@ public:
void base_mcfg(machine_config &config);
void circus(machine_config &config);
void init_ripcord();
void init_circus();
void init_robotbwl();
void init_crash();
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@ -56,12 +51,12 @@ protected:
int m_clown_y = 0;
int m_clown_z = 0;
int m_game_id = 0;
void videoram_w(offs_t offset, uint8_t data);
void clown_x_w(uint8_t data) { m_clown_x = 240 - data; }
void clown_y_w(uint8_t data) { m_clown_y = 240 - data; }
void clown_z_w(uint8_t data);
uint8_t paddle_r();
virtual void sound_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -86,10 +81,10 @@ public:
void robotbwl(machine_config &config);
protected:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
private:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void sound_w(uint8_t data) override;
void draw_box(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y);
void draw_scoreboard(bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_bowling_alley(bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -108,10 +103,10 @@ public:
void crash(machine_config &config);
protected:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
private:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void sound_w(uint8_t data) override;
void draw_car(bitmap_ind16 &bitmap, const rectangle &cliprect);
};
@ -127,8 +122,9 @@ public:
void ripcord(machine_config &config);
protected:
private:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void sound_w(uint8_t data) override;
};

View File

@ -11,6 +11,12 @@
#include "emu.h"
#include "circus.h"
/*******************************************************************************
Circus
*******************************************************************************/
const char *const circus_sample_names[] =
{
"*circus",
@ -20,38 +26,9 @@ const char *const circus_sample_names[] =
nullptr
};
const char *const crash_sample_names[] =
{
"*crash",
"crash",
nullptr
};
const char *const ripcord_sample_names[] =
{
"*ripcord",
"splash",
"scream",
"chute",
"whistle",
nullptr
};
const char *const robotbwl_sample_names[] =
{
"*robotbwl",
"hit",
"roll",
"balldrop",
"demerit",
"reward",
nullptr
};
/* Nodes - Inputs */
// Nodes - Inputs
#define CIRCUS_MUSIC_BIT NODE_01
/* Nodes - Sounds */
// Nodes - Sounds
#define CIRCUS_MUSIC_SND NODE_10
DISCRETE_SOUND_START(circus_discrete)
@ -68,6 +45,116 @@ DISCRETE_SOUND_START(circus_discrete)
DISCRETE_OUTPUT(CIRCUS_MUSIC_SND, 1)
DISCRETE_SOUND_END
void circus_state::sound_w(uint8_t data)
{
// Bits 4-6 enable/disable trigger different events
switch ((data & 0x70) >> 4)
{
case 0: // All Off
m_discrete->write(CIRCUS_MUSIC_BIT, 0);
break;
case 1: // Music
m_discrete->write(CIRCUS_MUSIC_BIT, 1);
break;
case 2: // Pop
m_samples->start(0, 0);
break;
case 3: // Normal Video
break;
case 4: // Miss
m_samples->start(1, 1);
break;
case 5: // Invert Video
break;
case 6: // Bounce
m_samples->start(2, 2);
break;
case 7: // Unused
break;
}
}
/*******************************************************************************
Robot Bowl
*******************************************************************************/
const char *const robotbwl_sample_names[] =
{
"*robotbwl",
"hit",
"roll",
"balldrop",
"demerit",
"reward",
nullptr
};
// Nodes - Inputs
#define ROBOTBWL_MUSIC_BIT NODE_01
// Nodes - Sounds
#define ROBOTBWL_MUSIC_SND NODE_10
DISCRETE_SOUND_START(robotbwl_discrete)
/************************************************/
/* Input register mapping for robotbwl */
/************************************************/
DISCRETE_INPUTX_LOGIC(ROBOTBWL_MUSIC_BIT, 30000, 0, 0)
/************************************************/
/* Music is just a 1 bit DAC */
/************************************************/
DISCRETE_RCFILTER(NODE_20, ROBOTBWL_MUSIC_BIT, RES_K(10), CAP_U(.47))
DISCRETE_CRFILTER(ROBOTBWL_MUSIC_SND, NODE_20, RES_K(10) + RES_K(22), CAP_U(.1))
DISCRETE_OUTPUT(ROBOTBWL_MUSIC_SND, 1)
DISCRETE_SOUND_END
void robotbwl_state::sound_w(uint8_t data)
{
if (data & 0x40) // Hit
m_samples->start(0, 0);
if (data & 0x20) // Roll
m_samples->start(1, 1);
if (data & 0x10) // Ball Drop
m_samples->start(2, 2);
m_discrete->write(ROBOTBWL_MUSIC_BIT, data & 0x08); // Footsteps
//if (data & 0x04) // Invert
if (data & 0x02) // Demerit
m_samples->start(3, 3);
if (data & 0x01) // Reward
m_samples->start(4, 4);
}
/*******************************************************************************
Crash
*******************************************************************************/
const char *const crash_sample_names[] =
{
"*crash",
"crash",
nullptr
};
static const discrete_mixer_desc crash_mixer =
{
DISC_MIXER_IS_RESISTOR,
@ -91,13 +178,13 @@ static const discrete_555_desc crash_beeper_555a =
DEFAULT_555_VALUES
};
/* Nodes - Inputs */
// Nodes - Inputs
#define CRASH_MUSIC_BIT NODE_01
#define CRASH_BEEPER_EN NODE_02
/* Nodes - Adjusters */
// Nodes - Adjusters
#define CRASH_R63 NODE_10
#define CRASH_R39 NODE_11
/* Nodes - Sounds */
// Nodes - Sounds
#define CRASH_MUSIC_SND NODE_20
#define CRASH_BEEPER_SND NODE_21
@ -131,133 +218,92 @@ DISCRETE_SOUND_START(crash_discrete)
DISCRETE_OUTPUT(NODE_90, 1)
DISCRETE_SOUND_END
/* Nodes - Inputs */
#define ROBOTBWL_MUSIC_BIT NODE_01
/* Nodes - Sounds */
#define ROBOTBWL_MUSIC_SND NODE_10
DISCRETE_SOUND_START(robotbwl_discrete)
/************************************************/
/* Input register mapping for robotbwl */
/************************************************/
DISCRETE_INPUTX_LOGIC(ROBOTBWL_MUSIC_BIT, 30000, 0, 0)
/************************************************/
/* Music is just a 1 bit DAC */
/************************************************/
DISCRETE_RCFILTER(NODE_20, ROBOTBWL_MUSIC_BIT, RES_K(10), CAP_U(.47))
DISCRETE_CRFILTER(ROBOTBWL_MUSIC_SND, NODE_20, RES_K(10) + RES_K(22), CAP_U(.1))
DISCRETE_OUTPUT(ROBOTBWL_MUSIC_SND, 1)
DISCRETE_SOUND_END
/* This register controls the clown image currently displayed */
/* and also is used to enable the amplifier and trigger the */
/* discrete circuitry that produces sound effects and music */
void circus_state::clown_z_w(uint8_t data)
void crash_state::sound_w(uint8_t data)
{
m_clown_z = (data & 0x0f);
*(memregion("maincpu")->base() + 0x8000) = data; logerror("Z:%02x\n",data); //DEBUG
/* Bits 4-6 enable/disable trigger different events */
switch (m_game_id)
{
case 1: /* circus */
case 4: /* ripcord */
// Bits 4-6 enable/disable trigger different events
switch ((data & 0x70) >> 4)
{
case 0 : /* All Off */
m_discrete->write(CIRCUS_MUSIC_BIT, 0);
break;
case 1 : /* Music */
m_discrete->write(CIRCUS_MUSIC_BIT, 1);
break;
case 2 : /* Circus = Pop; Rip Cord = Splash */
m_samples->start(0, 0);
break;
case 3 : /* Normal Video */
break;
case 4 : /* Circus = Miss; Rip Cord = Scream */
m_samples->start(1, 1);
break;
case 5 : /* Invert Video */
break;
case 6 : /* Circus = Bounce; Rip Cord = Chute Open */
m_samples->start(2, 2);
break;
case 7 : /* Circus = not used; Rip Cord = Whistle */
if (m_game_id == 4)
m_samples->start(3, 3);
break;
}
break;
case 2: /* robotbwl */
m_discrete->write(ROBOTBWL_MUSIC_BIT, data & 0x08); /* Footsteps */
if (data & 0x40) /* Hit */
m_samples->start(0, 0);
if (data & 0x20) /* Roll */
m_samples->start(1, 1);
if (data & 0x10) /* Ball Drop */
m_samples->start(2, 2);
if (data & 0x02) /* Demerit */
m_samples->start(3, 3);
if (data & 0x01) /* Reward */
m_samples->start(4, 4);
// if (data & 0x04) /* Invert */
break;
case 3: /* crash */
/* Only the crash can be done with a sample */
switch ((data & 0x70) >> 4)
{
case 0 : /* All Off */
case 0: // All Off
m_discrete->write(CRASH_MUSIC_BIT, 0);
break;
case 1 : /* Music */
case 1: // Music
m_discrete->write(CRASH_MUSIC_BIT, 1);
break;
case 2 : /* Crash */
case 2: // Crash
m_samples->start(0, 0);
break;
case 3 : /* Normal Video and Beep */
case 3: // Normal Video and Beep
m_discrete->write(CRASH_BEEPER_EN, 0);
break;
case 4 : /* Skid */
case 4: // Skid
break;
case 5 : /* Invert Video and Beep */
case 5: // Invert Video and Beep
m_discrete->write(CRASH_BEEPER_EN, 0);
break;
case 6 : /* Hi Motor */
case 6: // Hi Motor
break;
case 7 : /* Low Motor */
case 7: // Low Motor
break;
}
}
/*******************************************************************************
Rip Cord
*******************************************************************************/
const char *const ripcord_sample_names[] =
{
"*ripcord",
"splash",
"scream",
"chute",
"whistle",
nullptr
};
void ripcord_state::sound_w(uint8_t data)
{
// Bits 4-6 enable/disable trigger different events
switch ((data & 0x70) >> 4)
{
case 0: // All Off
m_discrete->write(CIRCUS_MUSIC_BIT, 0);
break;
case 1: // Music
m_discrete->write(CIRCUS_MUSIC_BIT, 1);
break;
case 2: // Splash
m_samples->start(0, 0);
break;
case 3: // Normal Video
break;
case 4: // Scream
m_samples->start(1, 1);
break;
case 5: // Invert Video
break;
case 6: // Chute Open
m_samples->start(2, 2);
break;
case 7: // Whistle
m_samples->start(3, 3);
break;
}
break;
}
/* Bit 7 enables amplifier (0 = on) */
machine().sound().system_mute(data & 0x80);
}

View File

@ -12,6 +12,7 @@
#include "circus.h"
/*******************************************************************************
Shared
*******************************************************************************/