konami/tutankhm.cpp, konami/junofrst.cpp: Cleaned up code: (#13309)

* Increased main CPU ROM region size to fix out-of-bounds accesses in some banks.
* Reduced sound CPU ROM size to match area mapped in address map.
* Made some variables const and reduced preprocessor macros.
* konami/timeplt_a.cpp: Use a device finder array for audio filters.
This commit is contained in:
cam900 2025-02-07 01:49:51 +09:00 committed by GitHub
parent 4014fc95b6
commit b81568b9b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 137 additions and 157 deletions

View File

@ -106,9 +106,7 @@ public:
: tutankhm_state(mconfig, type, tag)
, m_audiocpu(*this, "audiocpu")
, m_i8039(*this, "mcu")
, m_filter_0_0(*this, "filter.0.0")
, m_filter_0_1(*this, "filter.0.1")
, m_filter_0_2(*this, "filter.0.2")
, m_filter(*this, "filter.0.%u", 0U)
, m_blitrom(*this, "blitrom")
{
}
@ -121,7 +119,6 @@ protected:
private:
void blitter_w(offs_t offset, uint8_t data);
void bankselect_w(uint8_t data);
void sh_irqtrigger_w(uint8_t data);
void i8039_irq_w(uint8_t data);
void i8039_irqen_and_status_w(uint8_t data);
@ -136,9 +133,7 @@ private:
required_device<cpu_device> m_audiocpu;
required_device<i8039_device> m_i8039;
required_device<filter_rc_device> m_filter_0_0;
required_device<filter_rc_device> m_filter_0_1;
required_device<filter_rc_device> m_filter_0_2;
required_device_array<filter_rc_device, 3> m_filter;
required_region_ptr<uint8_t> m_blitrom;
uint8_t m_blitterdata[4]{};
@ -175,7 +170,7 @@ void junofrst_state::blitter_w(offs_t offset, uint8_t data)
offs_t src = ((m_blitterdata[2] << 8) | m_blitterdata[3]) & 0xfffc;
offs_t dest = (m_blitterdata[0] << 8) | m_blitterdata[1];
int copy = m_blitterdata[3] & 0x01;
bool const copy = BIT(m_blitterdata[3], 0);
/* 16x16 graphics */
for (int i = 0; i < 16; i++)
@ -184,50 +179,40 @@ void junofrst_state::blitter_w(offs_t offset, uint8_t data)
{
uint8_t data;
if (src & 1)
if (BIT(src, 0))
data = m_blitrom[src >> 1] & 0x0f;
else
data = m_blitrom[src >> 1] >> 4;
src += 1;
src++;
/* if there is a source pixel either copy the pixel or clear the pixel depending on the copy flag */
if (data)
{
if (copy == 0)
if (!copy)
data = 0;
if (dest & 1)
if (BIT(dest, 0))
m_videoram[dest >> 1] = (m_videoram[dest >> 1] & 0x0f) | (data << 4);
else
m_videoram[dest >> 1] = (m_videoram[dest >> 1] & 0xf0) | data;
}
dest += 1;
dest++;
}
dest += 240;
}
}
}
void junofrst_state::bankselect_w(uint8_t data)
{
m_mainbank->set_entry(data & 0x0f);
}
uint8_t junofrst_state::portA_r()
{
int timer;
/* main xtal 14.318MHz, divided by 8 to get the CPU clock, further */
/* divided by 1024 to get this timer */
/* (divide by (1024/2), and not 1024, because the CPU cycle counter is */
/* incremented every other state change of the clock) */
timer = (m_audiocpu->total_cycles() / (1024 / 2)) & 0x0f;
int const timer = (m_audiocpu->total_cycles() / (1024 / 2)) & 0x0f;
/* low three bits come from the 8039 */
@ -237,20 +222,17 @@ uint8_t junofrst_state::portA_r()
void junofrst_state::portB_w(uint8_t data)
{
filter_rc_device *filter[3] = { m_filter_0_0, m_filter_0_1, m_filter_0_2 };
int i;
for (i = 0; i < 3; i++)
for (int i = 0; i < 3; i++)
{
int C = 0;
if (data & 1)
if (BIT(data, 0))
C += 47000; /* 47000pF = 0.047uF */
if (data & 2)
if (BIT(data, 1))
C += 220000; /* 220000pF = 0.22uF */
data >>= 2;
filter[i]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 200, CAP_P(C));
m_filter[i]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 200, CAP_P(C));
}
}
@ -262,7 +244,6 @@ void junofrst_state::sh_irqtrigger_w(uint8_t data)
/* setting bit 0 low then high triggers IRQ on the sound CPU */
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
}
m_last_irq = data;
}
@ -275,7 +256,7 @@ void junofrst_state::i8039_irq_w(uint8_t data)
void junofrst_state::i8039_irqen_and_status_w(uint8_t data)
{
if ((data & 0x80) == 0)
if (BIT(~data, 7))
m_i8039->set_input_line(0, CLEAR_LINE);
m_i8039_status = (data & 0x70) >> 4;
}
@ -283,7 +264,7 @@ void junofrst_state::i8039_irqen_and_status_w(uint8_t data)
void junofrst_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).ram().share("videoram");
map(0x0000, 0x7fff).ram().share(m_videoram);
map(0x8000, 0x800f).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0x8010, 0x8010).portr("DSW2");
map(0x801c, 0x801c).r("watchdog", FUNC(watchdog_timer_device::reset_r));
@ -434,10 +415,9 @@ void junofrst_state::junofrst(machine_config &config)
m_screen->set_raw(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
PALETTE(config, m_palette).set_format(1, tutankhm_state::raw_to_rgb_func, 16);
m_screen->set_screen_update(FUNC(junofrst_state::screen_update_tutankhm_scramble));
m_screen->set_screen_update(FUNC(junofrst_state::screen_update_scramble));
m_screen->screen_vblank().set(FUNC(junofrst_state::_30hz_irq));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@ -453,14 +433,14 @@ void junofrst_state::junofrst(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // 100K (R56-63)/200K (R64-71) ladder network
FILTER_RC(config, m_filter_0_0).add_route(ALL_OUTPUTS, "speaker", 1.0);
FILTER_RC(config, m_filter_0_1).add_route(ALL_OUTPUTS, "speaker", 1.0);
FILTER_RC(config, m_filter_0_2).add_route(ALL_OUTPUTS, "speaker", 1.0);
FILTER_RC(config, m_filter[0]).add_route(ALL_OUTPUTS, "speaker", 1.0);
FILTER_RC(config, m_filter[1]).add_route(ALL_OUTPUTS, "speaker", 1.0);
FILTER_RC(config, m_filter[2]).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
ROM_START( junofrst )
ROM_REGION( 0x1c000, "maincpu", 0 ) /* code + space for decrypted opcodes */
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) /* code + space for decrypted opcodes */
ROM_LOAD( "jfa_b9.bin", 0x0a000, 0x2000, CRC(f5a7ab9d) SHA1(9603e797839290f8e1f93ccff9cc820604cc49ab) ) /* program ROMs */
ROM_LOAD( "jfb_b10.bin", 0x0c000, 0x2000, CRC(f20626e0) SHA1(46f58bdc1a613124e2c148b61f774fcc6c232868) )
ROM_LOAD( "jfc_a10.bin", 0x0e000, 0x2000, CRC(1e7744a7) SHA1(bee69833af886436016560295cddf0c8b4c5e771) )
@ -472,7 +452,7 @@ ROM_START( junofrst )
ROM_LOAD( "jfc5_a8.bin", 0x18000, 0x2000, CRC(0539f328) SHA1(c532aaed7f9e6f564e3df0dc6d8fdbee6ed721a2) )
ROM_LOAD( "jfc6_a9.bin", 0x1a000, 0x2000, CRC(1da2ad6e) SHA1(de997d1b2ff6671088b57192bc9f1279359fad5d) )
ROM_REGION( 0x10000 , "audiocpu", 0 ) /* 64k for Z80 sound CPU code */
ROM_REGION( 0x1000, "audiocpu", 0 ) /* 4k for Z80 sound CPU code */
ROM_LOAD( "jfs1_j3.bin", 0x0000, 0x1000, CRC(235a2893) SHA1(b90251c4971f7ba12e407f86c32723d513d6b4a0) )
ROM_REGION( 0x1000, "mcu", 0 ) /* 8039 */
@ -485,7 +465,7 @@ ROM_START( junofrst )
ROM_END
ROM_START( junofrstg )
ROM_REGION( 0x1c000, "maincpu", 0 ) /* code + space for decrypted opcodes */
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) /* code + space for decrypted opcodes */
ROM_LOAD( "jfg_a.9b", 0x0a000, 0x2000, CRC(8f77d1c5) SHA1(d47fcdbc47673c228661a3528fff0c691c76df9e) ) /* program ROMs */
ROM_LOAD( "jfg_b.10b", 0x0c000, 0x2000, CRC(cd645673) SHA1(25994210a8a424bdf2eca3efa19e7eeffc097cec) )
ROM_LOAD( "jfg_c.10a", 0x0e000, 0x2000, CRC(47852761) SHA1(eeef814b6ad681d4c2274f0a69d1ed9c5c1b9118) )
@ -497,7 +477,7 @@ ROM_START( junofrstg )
ROM_LOAD( "jfc5_a8.bin", 0x18000, 0x2000, CRC(0539f328) SHA1(c532aaed7f9e6f564e3df0dc6d8fdbee6ed721a2) )
ROM_LOAD( "jfc6_a9.bin", 0x1a000, 0x2000, CRC(1da2ad6e) SHA1(de997d1b2ff6671088b57192bc9f1279359fad5d) )
ROM_REGION( 0x10000 , "audiocpu", 0 ) /* 64k for Z80 sound CPU code */
ROM_REGION( 0x1000, "audiocpu", 0 ) /* 4k for Z80 sound CPU code */
ROM_LOAD( "jfs1_j3.bin", 0x0000, 0x1000, CRC(235a2893) SHA1(b90251c4971f7ba12e407f86c32723d513d6b4a0) )
ROM_REGION( 0x1000, "mcu", 0 ) /* 8039 */

View File

@ -126,7 +126,7 @@ void tutankhm_state::irq_enable_w(int state)
*
*************************************/
void tutankhm_state::tutankhm_bankselect_w(uint8_t data)
void tutankhm_state::bankselect_w(uint8_t data)
{
m_mainbank->set_entry(data & 0x0f);
}
@ -165,10 +165,10 @@ void tutankhm_state::sound_on_w(uint8_t data)
void tutankhm_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).ram().share("videoram");
map(0x0000, 0x7fff).ram().share(m_videoram);
map(0x8000, 0x800f).mirror(0x00f0).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
//0x8100 -> Custom 089 D9 Pin 15
map(0x8100, 0x8100).mirror(0x000f).ram().share("scroll");
map(0x8100, 0x8100).mirror(0x000f).ram().share(m_scroll);
/* a read here produces a 1-0-1 write to line 420 (084).
* This most likely resets some sort of timer implemented by the 084 custom chip
@ -183,7 +183,7 @@ void tutankhm_state::main_map(address_map &map)
map(0x81c0, 0x81c0).mirror(0x000f).portr("IN2"); /* IN2: Player 2 I/O */
map(0x81e0, 0x81e0).mirror(0x000f).portr("DSW1"); /* DSW1 (inverted bits) */
map(0x8200, 0x8207).mirror(0x00f8).nopr().w("mainlatch", FUNC(ls259_device::write_d0));
map(0x8300, 0x8300).mirror(0x00ff).w(FUNC(tutankhm_state::tutankhm_bankselect_w));
map(0x8300, 0x8300).mirror(0x00ff).w(FUNC(tutankhm_state::bankselect_w));
map(0x8600, 0x8600).mirror(0x00ff).w(FUNC(tutankhm_state::sound_on_w));
map(0x8700, 0x8700).mirror(0x00ff).w(m_timeplt_audio, FUNC(timeplt_audio_device::sound_data_w));
@ -291,8 +291,8 @@ void tutankhm_state::tutankhm(machine_config &config)
mainlatch.q_out_cb<1>().set_nop(); // PAY OUT - not used
mainlatch.q_out_cb<2>().set(FUNC(tutankhm_state::coin_counter_2_w));
mainlatch.q_out_cb<3>().set(FUNC(tutankhm_state::coin_counter_1_w));
mainlatch.q_out_cb<4>().set(FUNC(tutankhm_state::galaxian_stars_enable_w));
mainlatch.q_out_cb<5>().set("timeplt_audio", FUNC(timeplt_audio_device::mute_w));
mainlatch.q_out_cb<4>().set(FUNC(tutankhm_state::stars_enable_w));
mainlatch.q_out_cb<5>().set(m_timeplt_audio, FUNC(timeplt_audio_device::mute_w));
mainlatch.q_out_cb<6>().set(FUNC(tutankhm_state::flip_screen_x_w));
mainlatch.q_out_cb<7>().set(FUNC(tutankhm_state::flip_screen_y_w));
@ -303,11 +303,11 @@ void tutankhm_state::tutankhm(machine_config &config)
m_screen->set_raw(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
PALETTE(config, m_palette).set_format(1, tutankhm_state::raw_to_rgb_func, 16);
m_screen->set_screen_update(FUNC(tutankhm_state::screen_update_tutankhm));
m_screen->set_screen_update(FUNC(tutankhm_state::screen_update));
m_screen->screen_vblank().set(FUNC(tutankhm_state::vblank_irq));
/* sound hardware */
TIMEPLT_AUDIO(config, "timeplt_audio");
TIMEPLT_AUDIO(config, m_timeplt_audio);
/* blinking frequency is determined by 555 counter with Ra=100k, Rb=10k, C=10uF */
TIMER(config, "stars").configure_periodic(FUNC(tutankhm_state::scramble_stars_blink_timer), PERIOD_OF_555_ASTABLE(100000, 10000, 0.00001));
@ -329,7 +329,7 @@ void tutankhm_state::tutankhm(machine_config &config)
ROM_START( tutankhm )
/* ROMS located on the KT-3203-1B board. */
ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for M6809 CPU code + 64k for ROM banks */
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) /* 64k for M6809 CPU code + 64k for ROM banks */
ROM_LOAD( "m1.1h", 0x0a000, 0x1000, CRC(da18679f) SHA1(8d2a3665db937d0e1d19300ae22277d9db61fcbc) ) /* program ROMs */
ROM_LOAD( "m2.2h", 0x0b000, 0x1000, CRC(a0f02c85) SHA1(29a78b3ffd6b597772953543b02dd59acf5af38c) )
ROM_LOAD( "3j.3h", 0x0c000, 0x1000, CRC(ea03a1ab) SHA1(27a3cca0595bac642caaf9ee2f276814442c8721) ) /* Name guessed */
@ -348,7 +348,7 @@ ROM_START( tutankhm )
/* the other banks (1900-1fff) are empty */
/* ROMS located on the KT-5112-2B board. */
ROM_REGION( 0x10000 , "timeplt_audio:tpsound", 0 ) /* 64k for Z80 sound CPU code */
ROM_REGION( 0x3000, "timeplt_audio:tpsound", ROMREGION_ERASE00 ) /* 12k for Z80 sound CPU code */
ROM_LOAD( "s1.7a", 0x0000, 0x1000, CRC(b52d01fa) SHA1(9b6cf9ea51d3a87c174f34d42a4b1b5f38b48723) )
ROM_LOAD( "s2.8a", 0x1000, 0x1000, CRC(9db5c0ce) SHA1(b5bc1d89a7f7d7a0baae64390c37ee11f69a0e76) )
ROM_END
@ -379,7 +379,7 @@ TUTANKHAM RA1 10E (25) 1982 STERN (in socket 8A)
*/
ROM_START( tutankhms )
/* ROMS located on the KT-3203-1B board. */
ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for M6809 CPU code + 64k for ROM banks */
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) /* 64k for M6809 CPU code + 64k for ROM banks */
ROM_LOAD( "m1.1h", 0x0a000, 0x1000, CRC(da18679f) SHA1(8d2a3665db937d0e1d19300ae22277d9db61fcbc) ) /* program ROMs */
ROM_LOAD( "m2.2h", 0x0b000, 0x1000, CRC(a0f02c85) SHA1(29a78b3ffd6b597772953543b02dd59acf5af38c) )
ROM_LOAD( "3a.3h", 0x0c000, 0x1000, CRC(2d62d7b1) SHA1(910718f36735f2614cda0c3a1abdfa995d82dbd2) )
@ -398,7 +398,7 @@ ROM_START( tutankhms )
/* the other banks (1900-1fff) are empty */
/* ROMS located on the KT-5112-2B board. */
ROM_REGION( 0x10000, "timeplt_audio:tpsound", 0 ) /* 64k for Z80 sound CPU code */
ROM_REGION( 0x3000, "timeplt_audio:tpsound", ROMREGION_ERASE00 ) /* 12k for Z80 sound CPU code */
ROM_LOAD( "s1.7a", 0x0000, 0x1000, CRC(b52d01fa) SHA1(9b6cf9ea51d3a87c174f34d42a4b1b5f38b48723) )
ROM_LOAD( "s2.8a", 0x1000, 0x1000, CRC(9db5c0ce) SHA1(b5bc1d89a7f7d7a0baae64390c37ee11f69a0e76) )
ROM_END

View File

@ -29,37 +29,30 @@ class tutankhm_state : public driver_device
public:
tutankhm_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_scroll(*this, "scroll"),
m_mainbank(*this, "mainbank"),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_screen(*this, "screen"),
m_timeplt_audio(*this, "timeplt_audio"),
m_stars_config(*this, "STARS")
m_stars_config(*this, "STARS"),
m_videoram(*this, "videoram"),
m_scroll(*this, "scroll"),
m_mainbank(*this, "mainbank")
{
}
void tutankhm(machine_config &config);
protected:
void irq_enable_w(int state);
void tutankhm_bankselect_w(uint8_t data);
void coin_counter_1_w(int state);
void coin_counter_2_w(int state);
void sound_on_w(uint8_t data);
void flip_screen_x_w(int state);
void flip_screen_y_w(int state);
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
uint32_t screen_update_tutankhm_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_tutankhm_scramble(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_tutankhm(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void vblank_irq(int state);
void main_map(address_map &map) ATTR_COLD;
virtual void video_start() override ATTR_COLD;
void galaxian_palette(palette_device &palette);
static rgb_t raw_to_rgb_func(u32 raw);
/* devices */
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
optional_device<timeplt_audio_device> m_timeplt_audio;
optional_ioport m_stars_config;
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
@ -75,15 +68,28 @@ protected:
uint8_t m_irq_toggle = 0;
uint8_t m_irq_enable = 0;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
optional_device<timeplt_audio_device> m_timeplt_audio;
optional_ioport m_stars_config;
uint8_t m_star_mode = 0;
rgb_t m_star_color[64];
std::unique_ptr<uint8_t[]> m_stars;
uint8_t m_stars_enabled = 0;
uint8_t m_stars_blink_state = 0;
void irq_enable_w(int state);
void bankselect_w(uint8_t data);
void coin_counter_1_w(int state);
void coin_counter_2_w(int state);
void sound_on_w(uint8_t data);
void flip_screen_x_w(int state);
void flip_screen_y_w(int state);
uint32_t screen_update_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_scramble(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void vblank_irq(int state);
void galaxian_palette(palette_device &palette);
static rgb_t raw_to_rgb_func(u32 raw);
TIMER_DEVICE_CALLBACK_MEMBER(scramble_stars_blink_timer);
void galaxian_stars_enable_w(uint8_t data);
void stars_enable_w(uint8_t data);
void stars_init();
void stars_init_scramble();
void stars_init_bootleg();
@ -91,11 +97,7 @@ protected:
void scramble_draw_stars(bitmap_rgb32 &bitmap, const rectangle &cliprect, int maxx);
void scramble_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint8_t m_star_mode = 0;
rgb_t m_star_color[64];
std::unique_ptr<uint8_t[]> m_stars;
uint8_t m_stars_enabled = 0;
uint8_t m_stars_blink_state = 0;
void main_map(address_map &map) ATTR_COLD;
};
#endif // MAME_KONAMI_TUTANKHM_H

View File

@ -12,8 +12,8 @@
#include "tutankhm.h"
#include "video/resnet.h"
#define STAR_RNG_PERIOD ((1 << 17) - 1)
#define RGB_MAXIMUM 224
static constexpr uint32_t STAR_RNG_PERIOD = (1 << 17) - 1;
static constexpr unsigned RGB_MAXIMUM = 224;
/*************************************
*
@ -39,12 +39,12 @@ void tutankhm_state::flip_screen_y_w(int state)
*
*************************************/
uint32_t tutankhm_state::screen_update_tutankhm_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
uint32_t tutankhm_state::screen_update_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bitmap.fill(rgb_t::black(), cliprect);
int xorx = m_flipscreen_x ? 255 : 0;
int xory = m_flipscreen_y ? 255 : 0;
int const xorx = m_flipscreen_x ? 255 : 0;
int const xory = m_flipscreen_y ? 255 : 0;
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
@ -52,27 +52,27 @@ uint32_t tutankhm_state::screen_update_tutankhm_bootleg(screen_device &screen, b
for (int x = cliprect.min_x / GALAXIAN_XSCALE; x <= cliprect.max_x / GALAXIAN_XSCALE; x++)
{
uint8_t effx = x ^ xorx;
uint8_t yscroll = (effx < 192 && m_scroll.found()) ? *m_scroll : 0;
uint8_t effy = (y ^ xory) + yscroll;
uint8_t vrambyte = m_videoram[effy * 128 + effx / 2];
uint8_t shifted = vrambyte >> (4 * (effx % 2));
uint8_t const effx = x ^ xorx;
uint8_t const yscroll = (effx < 192 && m_scroll.found()) ? *m_scroll : 0;
uint8_t const effy = (y ^ xory) + yscroll;
uint8_t const vrambyte = m_videoram[effy * 128 + effx / 2];
uint8_t const shifted = vrambyte >> (4 * (effx & 1));
uint8_t blink_state = m_stars_blink_state & 3;
uint8_t enab = 0;
uint8_t const blink_state = m_stars_blink_state & 3;
bool enab = false;
switch (blink_state)
{
case 0: enab = 1; break;
case 1: enab = (y & 1) == 1; break;
case 2: enab = (y & 2) == 2; break;
case 3: enab = (x & 8) == 0; break;
case 0: enab = true; break;
case 1: enab = BIT(y, 0); break;
case 2: enab = BIT(y, 1); break;
case 3: enab = BIT(~x, 3); break;
}
//enab &= (((y>>1) ^ (x >> 3)) & 1);
int offset = y * 384 + x + 84;
int const offset = y * 384 + x + 84;
uint8_t star = m_stars[offset % STAR_RNG_PERIOD ];
if (m_stars_enabled && enab && (shifted & 0x02) == 0 && (star & 0x80) != 0
uint8_t const star = m_stars[offset % STAR_RNG_PERIOD];
if (m_stars_enabled && enab && BIT(~shifted, 1) && BIT(star, 7)
&& x > 63)
{
bitmap.pix(y, GALAXIAN_XSCALE*x + 0) = m_star_color[star & 0x3f];
@ -83,7 +83,7 @@ uint32_t tutankhm_state::screen_update_tutankhm_bootleg(screen_device &screen, b
else
{
auto color = m_palette->pen_color(shifted & 0x0f);
u32 *dbase = dst + x * GALAXIAN_XSCALE;
u32 *const dbase = dst + x * GALAXIAN_XSCALE;
if(shifted || dbase[0] == 0xff000000) dbase[0] = color;
if(shifted || dbase[1] == 0xff000000) dbase[1] = color;
if(shifted || dbase[2] == 0xff000000) dbase[2] = color;
@ -94,12 +94,12 @@ uint32_t tutankhm_state::screen_update_tutankhm_bootleg(screen_device &screen, b
return 0;
}
uint32_t tutankhm_state::screen_update_tutankhm_scramble(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
uint32_t tutankhm_state::screen_update_scramble(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
scramble_draw_background(bitmap, cliprect);
int xorx = m_flipscreen_x ? 255 : 0;
int xory = m_flipscreen_y ? 255 : 0;
int const xorx = m_flipscreen_x ? 255 : 0;
int const xory = m_flipscreen_y ? 255 : 0;
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
@ -107,13 +107,13 @@ uint32_t tutankhm_state::screen_update_tutankhm_scramble(screen_device &screen,
for (int x = cliprect.min_x / GALAXIAN_XSCALE; x <= cliprect.max_x / GALAXIAN_XSCALE; x++)
{
uint8_t effx = x ^ xorx;
uint8_t yscroll = (effx < 192 && m_scroll.found()) ? *m_scroll : 0;
uint8_t effy = (y ^ xory) + yscroll;
uint8_t vrambyte = m_videoram[effy * 128 + effx / 2];
uint8_t shifted = vrambyte >> (4 * (effx % 2));
uint8_t const effx = x ^ xorx;
uint8_t const yscroll = (effx < 192 && m_scroll.found()) ? *m_scroll : 0;
uint8_t const effy = (y ^ xory) + yscroll;
uint8_t const vrambyte = m_videoram[effy * 128 + effx / 2];
uint8_t const shifted = vrambyte >> (4 * (effx & 1));
auto color = m_palette->pen_color(shifted & 0x0f);
u32 *dbase = dst + x * GALAXIAN_XSCALE;
u32 *const dbase = dst + x * GALAXIAN_XSCALE;
if(shifted || dbase[0] == 0xff000000) dbase[0] = color;
if(shifted || dbase[1] == 0xff000000) dbase[1] = color;
if(shifted || dbase[2] == 0xff000000) dbase[2] = color;
@ -123,9 +123,9 @@ uint32_t tutankhm_state::screen_update_tutankhm_scramble(screen_device &screen,
return 0;
}
uint32_t tutankhm_state::screen_update_tutankhm(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
uint32_t tutankhm_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
u8 mode = m_stars_config.read_safe(m_star_mode);
u8 const mode = m_stars_config.read_safe(m_star_mode);
if (mode != m_star_mode)
{
m_star_mode = mode;
@ -133,9 +133,9 @@ uint32_t tutankhm_state::screen_update_tutankhm(screen_device &screen, bitmap_rg
}
if (m_star_mode)
return screen_update_tutankhm_scramble(screen, bitmap, cliprect);
return screen_update_scramble(screen, bitmap, cliprect);
else
return screen_update_tutankhm_bootleg(screen, bitmap, cliprect);
return screen_update_bootleg(screen, bitmap, cliprect);
}
/*************************************
@ -291,14 +291,14 @@ void tutankhm_state::stars_init_bootleg()
uint32_t shiftreg = 0;
for (int i = 0; i < STAR_RNG_PERIOD; i++)
{
int newbit = ((shiftreg >> 12) ^ ~shiftreg) & 1;
int const newbit = ((shiftreg >> 12) ^ ~shiftreg) & 1;
/* stars are enabled if the upper 8 bits are 1 and the new bit is 0 */
int enabled = ((shiftreg & 0x1fe00) == 0x1fe00) && (newbit == 0);
int const enabled = ((shiftreg & 0x1fe00) == 0x1fe00) && (newbit == 0);
//int enabled = ((shiftreg & 0x1fe01) == 0x1fe00); // <- scramble
/* color comes from the 6 bits below the top 8 bits */
int color = (~shiftreg & 0x1f8) >> 3;
int const color = (~shiftreg & 0x1f8) >> 3;
/* store the color value in the low 6 bits and the enable in the upper bit */
m_stars[i] = color | (enabled << 7);
@ -315,12 +315,12 @@ void tutankhm_state::stars_init_scramble()
uint32_t shiftreg = 0;
for (int i = 0; i < STAR_RNG_PERIOD; i++)
{
const uint8_t shift = 12;
uint8_t const shift = 12;
/* stars are enabled if the upper 8 bits are 1 and the low bit is 0 */
int enabled = ((shiftreg & 0x1fe01) == 0x1fe00);
int const enabled = ((shiftreg & 0x1fe01) == 0x1fe00);
/* color comes from the 6 bits below the top 8 bits */
int color = (~shiftreg & 0x1f8) >> 3;
int const color = (~shiftreg & 0x1f8) >> 3;
/* store the color value in the low 6 bits and the enable in the upper bit */
m_stars[i] = color | (enabled << 7);
@ -346,7 +346,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(tutankhm_state::scramble_stars_blink_timer)
void tutankhm_state::stars_draw_row(bitmap_rgb32 &bitmap, int maxx, int y, uint32_t star_offs)
{
uint8_t flipxor = (m_flipscreen_x ? 0xC0 : 0x00);
uint8_t const flipxor = (m_flipscreen_x ? 0xc0 : 0x00);
/* ensure our star offset is valid */
star_offs %= STAR_RNG_PERIOD;
@ -354,22 +354,21 @@ void tutankhm_state::stars_draw_row(bitmap_rgb32 &bitmap, int maxx, int y, uint3
/* iterate over the specified number of 6MHz pixels */
for (int x = 0; x < maxx; x++)
{
uint8_t h8q = ((x>>3) & 1) ^ 1; // H8 signal is inverted.
uint8_t const h8q = BIT(~x, 3); // H8 signal is inverted.
/* stars are suppressed unless V1 ^ H8 == 1 */
int enable_star = (y ^ h8q) & 1;
uint8_t star;
bool enable_star = BIT(y ^ h8q, 0);
uint8_t blink_state = m_stars_blink_state & 3;
uint8_t enab = 0;
uint8_t const blink_state = m_stars_blink_state & 3;
bool enab = false;
switch (blink_state)
{
case 0: enab = 1; break;
case 1: enab = (y & 1) == 1; break;
case 2: enab = (y & 2) == 2; break;
case 3: enab = h8q; break; // H8 signal is inverted.
case 0: enab = true; break;
case 1: enab = BIT(y, 0); break;
case 2: enab = BIT(y, 1); break;
case 3: enab = h8q; break; // H8 signal is inverted.
}
enable_star &= (enab && ((x & 0xC0) ^ flipxor) != 0xC0);
enable_star &= (enab && ((x & 0xc0) ^ flipxor) != 0xc0);
/*
The RNG clock is the master clock (18MHz) ANDed with the pixel clock (6MHz).
@ -388,18 +387,19 @@ void tutankhm_state::stars_draw_row(bitmap_rgb32 &bitmap, int maxx, int y, uint3
clock with two pixels.
*/
uint8_t star;
/* first RNG clock: one pixel */
star = m_stars[star_offs++];
if (star_offs >= STAR_RNG_PERIOD)
star_offs = 0;
if (enable_star && (star & 0x80) != 0)
if (enable_star && BIT(star, 7))
bitmap.pix(y, GALAXIAN_XSCALE*x + 0) = m_star_color[star & 0x3f];
/* second RNG clock: two pixels */
star = m_stars[star_offs++];
if (star_offs >= STAR_RNG_PERIOD)
star_offs = 0;
if (enable_star && (star & 0x80) != 0)
if (enable_star && BIT(star, 7))
{
bitmap.pix(y, GALAXIAN_XSCALE*x + 1) = m_star_color[star & 0x3f];
bitmap.pix(y, GALAXIAN_XSCALE*x + 2) = m_star_color[star & 0x3f];
@ -432,13 +432,13 @@ void tutankhm_state::scramble_draw_background(bitmap_rgb32 &bitmap, const rectan
scramble_draw_stars(bitmap, cliprect, 256);
}
void tutankhm_state::galaxian_stars_enable_w(uint8_t data)
void tutankhm_state::stars_enable_w(uint8_t data)
{
if ((m_stars_enabled ^ data) & 0x01)
if (BIT(m_stars_enabled ^ data, 0))
{
// m_screen->update_now();
m_screen->update_partial(m_screen->vpos());
}
m_stars_enabled = data & 0x01;
m_stars_enabled = BIT(data, 0);
}

View File

@ -36,8 +36,7 @@ timeplt_audio_device::timeplt_audio_device(const machine_config &mconfig, device
: device_t(mconfig, type, tag, owner, clock)
, m_soundcpu(*this, "tpsound")
, m_soundlatch(*this, "soundlatch")
, m_filter_0(*this, "filter.0.%u", 0)
, m_filter_1(*this, "filter.1.%u", 0)
, m_filter{{*this, "filter.0.%u", 0U}, {*this, "filter.1.%u", 0U}}
, m_last_irq_state(0)
{
}
@ -94,27 +93,27 @@ uint8_t timeplt_audio_device::portB_r()
*
*************************************/
void timeplt_audio_device::set_filter(filter_rc_device &device, int data)
void timeplt_audio_device::set_filter(int no, int ch, int data)
{
int C = 0;
if (data & 1)
if (BIT(data, 0))
C += 220000; /* 220000pF = 0.220uF */
if (data & 2)
if (BIT(data, 1))
C += 47000; /* 47000pF = 0.047uF */
device.filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 5100, 0, CAP_P(C));
m_filter[no][ch]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 5100, 0, CAP_P(C));
}
void timeplt_audio_device::filter_w(offs_t offset, uint8_t data)
{
set_filter(*m_filter_1[0], (offset >> 0) & 3);
set_filter(*m_filter_1[1], (offset >> 2) & 3);
set_filter(*m_filter_1[2], (offset >> 4) & 3);
set_filter(*m_filter_0[0], (offset >> 6) & 3);
set_filter(*m_filter_0[1], (offset >> 8) & 3);
set_filter(*m_filter_0[2], (offset >> 10) & 3);
set_filter(1, 0, (offset >> 0) & 3);
set_filter(1, 1, (offset >> 2) & 3);
set_filter(1, 2, (offset >> 4) & 3);
set_filter(0, 0, (offset >> 6) & 3);
set_filter(0, 1, (offset >> 8) & 3);
set_filter(0, 2, (offset >> 10) & 3);
}
@ -210,10 +209,10 @@ void timeplt_audio_device::device_add_mconfig(machine_config &config)
ay2.add_route(1, "filter.1.1", 0.60);
ay2.add_route(2, "filter.1.2", 0.60);
for (required_device<filter_rc_device> &filter : m_filter_0)
for (required_device<filter_rc_device> &filter : m_filter[0])
FILTER_RC(config, filter).add_route(ALL_OUTPUTS, "mono", 1.0);
for (required_device<filter_rc_device> &filter : m_filter_1)
for (required_device<filter_rc_device> &filter : m_filter[1])
FILTER_RC(config, filter).add_route(ALL_OUTPUTS, "mono", 1.0);
}

View File

@ -36,12 +36,11 @@ protected:
private:
// internal state
required_device<generic_latch_8_device> m_soundlatch;
required_device_array<filter_rc_device, 3> m_filter_0;
required_device_array<filter_rc_device, 3> m_filter_1;
required_device_array<filter_rc_device, 3> m_filter[2];
uint8_t m_last_irq_state;
void set_filter(filter_rc_device &device, int data);
void set_filter(int no, int ch, int data);
};
class locomotn_audio_device : public timeplt_audio_device