rjammer: Add screen raw parameters; modernize MSM5205 hookup

This commit is contained in:
AJR 2021-09-04 07:32:33 -04:00
parent 565e8b6e98
commit 827ea58eb5
2 changed files with 55 additions and 64 deletions

View File

@ -150,7 +150,6 @@ void tubep_state::main_cpu_irq_line_clear_w(uint8_t data)
{ {
m_maincpu->set_input_line(0, CLEAR_LINE); m_maincpu->set_input_line(0, CLEAR_LINE);
LOGIRQ("CPU#0 VBLANK int clear at scanline=%3i\n", m_curr_scanline); LOGIRQ("CPU#0 VBLANK int clear at scanline=%3i\n", m_curr_scanline);
return;
} }
@ -182,7 +181,6 @@ void tubep_state::second_cpu_irq_line_clear_w(uint8_t data)
{ {
m_slave->set_input_line(0, CLEAR_LINE); m_slave->set_input_line(0, CLEAR_LINE);
LOGIRQ("CPU#1 VBLANK int clear at scanline=%3i\n", m_curr_scanline); LOGIRQ("CPU#1 VBLANK int clear at scanline=%3i\n", m_curr_scanline);
return;
} }
@ -319,27 +317,10 @@ TIMER_CALLBACK_MEMBER(tubep_state::tubep_scanline_callback)
/*************************************
*
* Save state setup
*
*************************************/
void tubep_state::tubep_setup_save_state()
{
/* Set up save state */
save_item(NAME(m_ls74));
save_item(NAME(m_ls377));
}
void tubep_state::machine_start() void tubep_state::machine_start()
{ {
/* Create interrupt timer */ // Create interrupt timer
m_interrupt_timer = timer_alloc(TIMER_TUBEP_SCANLINE); m_interrupt_timer = timer_alloc(TIMER_TUBEP_SCANLINE);
tubep_setup_save_state();
} }
@ -395,7 +376,15 @@ void rjammer_state::rjammer_main_portmap(address_map &map)
map(0xd0, 0xd7).w("mainlatch", FUNC(ls259_device::write_d0)); map(0xd0, 0xd7).w("mainlatch", FUNC(ls259_device::write_d0));
map(0xe0, 0xe0).w(FUNC(rjammer_state::main_cpu_irq_line_clear_w)); /* clear IRQ interrupt */ map(0xe0, 0xe0).w(FUNC(rjammer_state::main_cpu_irq_line_clear_w)); /* clear IRQ interrupt */
map(0xf0, 0xf0).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0xf0, 0xf0).w(FUNC(rjammer_state::soundlatch_nmi_w));
}
void rjammer_state::soundlatch_nmi_w(uint8_t data)
{
m_soundlatch->write(data);
// LS138 decode output is connected directly to NMI
m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
} }
@ -480,15 +469,22 @@ TIMER_CALLBACK_MEMBER(tubep_state::rjammer_scanline_callback)
void rjammer_state::machine_start() void rjammer_state::machine_start()
{ {
/* Create interrupt timer */ // Create interrupt timer
m_interrupt_timer = timer_alloc(TIMER_RJAMMER_SCANLINE); m_interrupt_timer = timer_alloc(TIMER_RJAMMER_SCANLINE);
tubep_setup_save_state(); // Set up save state
save_item(NAME(m_msm5205_toggle));
} }
void rjammer_state::machine_reset() void rjammer_state::machine_reset()
{ {
m_interrupt_timer->adjust(m_screen->time_until_pos(0)); m_interrupt_timer->adjust(m_screen->time_until_pos(0));
m_msm5205_toggle = false;
m_adpcm_mux->select_w(0);
rjammer_voice_startstop_w(0);
rjammer_voice_frequency_select_w(0);
} }
@ -504,36 +500,30 @@ void rjammer_state::rjammer_voice_startstop_w(uint8_t data)
/* bit 0 of data selects voice start/stop (reset pin on MSM5205)*/ /* bit 0 of data selects voice start/stop (reset pin on MSM5205)*/
// 0 -stop; 1-start // 0 -stop; 1-start
m_msm->reset_w((data & 1)^1); m_msm->reset_w((data & 1)^1);
return;
} }
void rjammer_state::rjammer_voice_frequency_select_w(uint8_t data) void rjammer_state::rjammer_voice_frequency_select_w(uint8_t data)
{ {
/* bit 0 of data selects voice frequency on MSM5205 */ // bit 0 of data selects voice frequency on MSM5205 (pin 1)
// 0 -4 KHz; 1- 8KHz // 0 -4 KHz; 1- 8KHz
if (data & 1) if (data & 1)
m_msm->playmode_w(msm5205_device::S48_4B); /* 8 KHz */ m_msm->playmode_w(msm5205_device::S48_4B); // 8 KHz
else else
m_msm->playmode_w(msm5205_device::S96_4B); /* 4 KHz */ m_msm->playmode_w(msm5205_device::S96_4B); // 4 KHz
} }
WRITE_LINE_MEMBER(rjammer_state::rjammer_adpcm_vck) WRITE_LINE_MEMBER(rjammer_state::rjammer_adpcm_vck_w)
{ {
m_ls74 = (m_ls74 + 1) & 1; if (state)
if (m_ls74 == 1)
{ {
m_msm->data_w((m_ls377 >> 0) & 15); m_msm5205_toggle = !m_msm5205_toggle;
m_soundcpu->set_input_line(0, ASSERT_LINE); m_adpcm_mux->select_w(m_msm5205_toggle);
}
else
{
m_msm->data_w((m_ls377 >> 4) & 15);
}
if (m_msm5205_toggle)
m_soundcpu->set_input_line(0, ASSERT_LINE);
}
} }
@ -542,15 +532,13 @@ void rjammer_state::rjammer_voice_input_w(uint8_t data)
/* 8 bits of adpcm data for MSM5205 */ /* 8 bits of adpcm data for MSM5205 */
/* need to buffer the data, and switch two nibbles on two following interrupts*/ /* need to buffer the data, and switch two nibbles on two following interrupts*/
m_ls377 = data; m_adpcm_mux->ba_w(data);
/* NOTE: game resets interrupt line on ANY access to ANY I/O port. /* NOTE: game resets interrupt line on ANY access to ANY I/O port.
I do it here because this port (0x80) is first one accessed I do it here because this port (0x80) is first one accessed
in the interrupt routine. in the interrupt routine.
*/ */
m_soundcpu->set_input_line(0, CLEAR_LINE ); m_soundcpu->set_input_line(0, CLEAR_LINE );
return;
} }
@ -558,7 +546,6 @@ void rjammer_state::rjammer_voice_intensity_control_w(uint8_t data)
{ {
/* 4 LSB bits select the intensity (analog circuit that alters the output from MSM5205) */ /* 4 LSB bits select the intensity (analog circuit that alters the output from MSM5205) */
/* need to buffer the data */ /* need to buffer the data */
return;
} }
@ -882,21 +869,21 @@ void tubep_state::tubepb(machine_config &config)
void rjammer_state::rjammer(machine_config &config) void rjammer_state::rjammer(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
Z80(config, m_maincpu, 16000000 / 4); /* 4 MHz */ Z80(config, m_maincpu, 16_MHz_XTAL / 4); /* 4 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_main_map); m_maincpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_main_map);
m_maincpu->set_addrmap(AS_IO, &rjammer_state::rjammer_main_portmap); m_maincpu->set_addrmap(AS_IO, &rjammer_state::rjammer_main_portmap);
Z80(config, m_slave, 16000000 / 4); /* 4 MHz */ Z80(config, m_slave, 16_MHz_XTAL / 4); /* 4 MHz */
m_slave->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_second_map); m_slave->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_second_map);
m_slave->set_addrmap(AS_IO, &rjammer_state::rjammer_second_portmap); m_slave->set_addrmap(AS_IO, &rjammer_state::rjammer_second_portmap);
Z80(config, m_soundcpu, 19968000 / 8); /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */ Z80(config, m_soundcpu, 19968000 / 8); // X2 19968000 Hz (schematic says 20 MHz?) divided by LS669 (on Qc output) (signal RH0)
m_soundcpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_sound_map); m_soundcpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_sound_map);
m_soundcpu->set_addrmap(AS_IO, &rjammer_state::rjammer_sound_portmap); m_soundcpu->set_addrmap(AS_IO, &rjammer_state::rjammer_sound_portmap);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI); GENERIC_LATCH_8(config, m_soundlatch);
NSC8105(config, m_mcu, 6000000); /* 6 MHz Xtal - divided internally ??? */ NSC8105(config, m_mcu, 6_MHz_XTAL); /* 6 MHz Xtal - divided internally ??? */
m_mcu->set_ram_enable(false); m_mcu->set_ram_enable(false);
m_mcu->set_addrmap(AS_PROGRAM, &rjammer_state::nsc_map); m_mcu->set_addrmap(AS_PROGRAM, &rjammer_state::nsc_map);
@ -907,9 +894,7 @@ void rjammer_state::rjammer(machine_config &config)
/* video hardware */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60); m_screen->set_raw(19968000 / 4, 320, 0, 256, 264, 16, 240);
m_screen->set_size(256, 264);
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
m_screen->set_screen_update(FUNC(rjammer_state::screen_update_rjammer)); m_screen->set_screen_update(FUNC(rjammer_state::screen_update_rjammer));
m_screen->set_palette("palette"); m_screen->set_palette("palette");
@ -921,22 +906,24 @@ void rjammer_state::rjammer(machine_config &config)
ay8910_device &ay1(AY8910(config, "ay1", 19968000 / 8 / 2)); ay8910_device &ay1(AY8910(config, "ay1", 19968000 / 8 / 2));
ay1.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_0_w)); ay1.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_0_w));
ay1.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_0_w)); ay1.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_0_w));
ay1.add_route(ALL_OUTPUTS, "mono", 0.10); ay1.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay2(AY8910(config, "ay2", 19968000 / 8 / 2)); ay8910_device &ay2(AY8910(config, "ay2", 19968000 / 8 / 2));
ay2.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_1_w)); ay2.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_1_w));
ay2.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_1_w)); ay2.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_1_w));
ay2.add_route(ALL_OUTPUTS, "mono", 0.10); ay2.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay3(AY8910(config, "ay3", 19968000 / 8 / 2)); ay8910_device &ay3(AY8910(config, "ay3", 19968000 / 8 / 2));
ay3.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_2_w)); ay3.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_2_w));
ay3.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_2_w)); ay3.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_2_w));
ay3.add_route(ALL_OUTPUTS, "mono", 0.10); ay3.add_route(ALL_OUTPUTS, "mono", 0.075);
MSM5205(config, m_msm, 384000); MSM5205(config, m_msm, 384_kHz_XTAL);
m_msm->vck_legacy_callback().set(FUNC(rjammer_state::rjammer_adpcm_vck)); /* VCK function */ m_msm->vck_callback().set(FUNC(rjammer_state::rjammer_adpcm_vck_w));
m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz (changes at run time) */ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz (changes at run time)
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0); m_msm->add_route(ALL_OUTPUTS, "mono", 0.325);
LS157(config, m_adpcm_mux).out_callback().set(m_msm, FUNC(msm5205_device::data_w)); // 9G (fed by LS377 @ 10G)
} }

View File

@ -7,6 +7,7 @@
#include "cpu/m6800/m6800.h" #include "cpu/m6800/m6800.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "machine/74157.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "emupal.h" #include "emupal.h"
#include "screen.h" #include "screen.h"
@ -21,7 +22,6 @@ public:
m_slave(*this, "slave"), m_slave(*this, "slave"),
m_mcu(*this, "mcu"), m_mcu(*this, "mcu"),
m_soundlatch(*this, "soundlatch"), m_soundlatch(*this, "soundlatch"),
m_msm(*this, "msm"),
m_screen(*this, "screen"), m_screen(*this, "screen"),
m_textram(*this, "textram"), m_textram(*this, "textram"),
m_backgroundram(*this, "backgroundram"), m_backgroundram(*this, "backgroundram"),
@ -47,14 +47,11 @@ protected:
required_device<cpu_device> m_slave; required_device<cpu_device> m_slave;
required_device<m6802_cpu_device> m_mcu; required_device<m6802_cpu_device> m_mcu;
required_device<generic_latch_8_device> m_soundlatch; required_device<generic_latch_8_device> m_soundlatch;
optional_device<msm5205_device> m_msm;
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
required_shared_ptr<uint8_t> m_textram; required_shared_ptr<uint8_t> m_textram;
optional_shared_ptr<uint8_t> m_backgroundram; optional_shared_ptr<uint8_t> m_backgroundram;
required_shared_ptr<uint8_t> m_sprite_colorsharedram; required_shared_ptr<uint8_t> m_sprite_colorsharedram;
uint8_t m_ls74;
uint8_t m_ls377;
emu_timer *m_interrupt_timer; emu_timer *m_interrupt_timer;
emu_timer *m_sprite_timer; emu_timer *m_sprite_timer;
int m_curr_scanline; int m_curr_scanline;
@ -128,6 +125,8 @@ class rjammer_state : public tubep_state
public: public:
rjammer_state(const machine_config &mconfig, device_type type, const char *tag) : rjammer_state(const machine_config &mconfig, device_type type, const char *tag) :
tubep_state(mconfig, type, tag), tubep_state(mconfig, type, tag),
m_msm(*this, "msm"),
m_adpcm_mux(*this, "adpcm_mux"),
m_rjammer_backgroundram(*this, "rjammer_bgram") m_rjammer_backgroundram(*this, "rjammer_bgram")
{ } { }
@ -138,6 +137,7 @@ protected:
virtual void machine_reset() override; virtual void machine_reset() override;
private: private:
void soundlatch_nmi_w(uint8_t data);
void rjammer_background_LS377_w(uint8_t data); void rjammer_background_LS377_w(uint8_t data);
void rjammer_background_page_w(uint8_t data); void rjammer_background_page_w(uint8_t data);
@ -147,7 +147,7 @@ private:
void rjammer_voice_input_w(uint8_t data); void rjammer_voice_input_w(uint8_t data);
void rjammer_voice_intensity_control_w(uint8_t data); void rjammer_voice_intensity_control_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(rjammer_adpcm_vck); DECLARE_WRITE_LINE_MEMBER(rjammer_adpcm_vck_w);
uint32_t screen_update_rjammer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_rjammer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -160,7 +160,11 @@ private:
void rjammer_sound_map(address_map &map); void rjammer_sound_map(address_map &map);
void rjammer_sound_portmap(address_map &map); void rjammer_sound_portmap(address_map &map);
optional_shared_ptr<uint8_t> m_rjammer_backgroundram; required_device<msm5205_device> m_msm;
required_device<ls157_device> m_adpcm_mux;
required_shared_ptr<uint8_t> m_rjammer_backgroundram;
bool m_msm5205_toggle;
}; };
#endif // MAME_INCLUDES_TUBEP_H #endif // MAME_INCLUDES_TUBEP_H