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);
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);
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()
{
/* Create interrupt timer */
// Create interrupt timer
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(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()
{
/* Create interrupt timer */
// Create interrupt timer
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()
{
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)*/
// 0 -stop; 1-start
m_msm->reset_w((data & 1)^1);
return;
}
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
if (data & 1)
m_msm->playmode_w(msm5205_device::S48_4B); /* 8 KHz */
m_msm->playmode_w(msm5205_device::S48_4B); // 8 KHz
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 (m_ls74 == 1)
if (state)
{
m_msm->data_w((m_ls377 >> 0) & 15);
m_soundcpu->set_input_line(0, ASSERT_LINE);
}
else
{
m_msm->data_w((m_ls377 >> 4) & 15);
}
m_msm5205_toggle = !m_msm5205_toggle;
m_adpcm_mux->select_w(m_msm5205_toggle);
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 */
/* 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.
I do it here because this port (0x80) is first one accessed
in the interrupt routine.
*/
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) */
/* need to buffer the data */
return;
}
@ -882,21 +869,21 @@ void tubep_state::tubepb(machine_config &config)
void rjammer_state::rjammer(machine_config &config)
{
/* 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_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_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_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_addrmap(AS_PROGRAM, &rjammer_state::nsc_map);
@ -907,9 +894,7 @@ void rjammer_state::rjammer(machine_config &config)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_size(256, 264);
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
m_screen->set_raw(19968000 / 4, 320, 0, 256, 264, 16, 240);
m_screen->set_screen_update(FUNC(rjammer_state::screen_update_rjammer));
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));
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.add_route(ALL_OUTPUTS, "mono", 0.10);
ay1.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay2(AY8910(config, "ay2", 19968000 / 8 / 2));
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.add_route(ALL_OUTPUTS, "mono", 0.10);
ay2.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay3(AY8910(config, "ay3", 19968000 / 8 / 2));
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.add_route(ALL_OUTPUTS, "mono", 0.10);
ay3.add_route(ALL_OUTPUTS, "mono", 0.075);
MSM5205(config, m_msm, 384000);
m_msm->vck_legacy_callback().set(FUNC(rjammer_state::rjammer_adpcm_vck)); /* VCK function */
m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz (changes at run time) */
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
MSM5205(config, m_msm, 384_kHz_XTAL);
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->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 "machine/gen_latch.h"
#include "machine/74157.h"
#include "sound/msm5205.h"
#include "emupal.h"
#include "screen.h"
@ -21,7 +22,6 @@ public:
m_slave(*this, "slave"),
m_mcu(*this, "mcu"),
m_soundlatch(*this, "soundlatch"),
m_msm(*this, "msm"),
m_screen(*this, "screen"),
m_textram(*this, "textram"),
m_backgroundram(*this, "backgroundram"),
@ -47,14 +47,11 @@ protected:
required_device<cpu_device> m_slave;
required_device<m6802_cpu_device> m_mcu;
required_device<generic_latch_8_device> m_soundlatch;
optional_device<msm5205_device> m_msm;
required_device<screen_device> m_screen;
required_shared_ptr<uint8_t> m_textram;
optional_shared_ptr<uint8_t> m_backgroundram;
required_shared_ptr<uint8_t> m_sprite_colorsharedram;
uint8_t m_ls74;
uint8_t m_ls377;
emu_timer *m_interrupt_timer;
emu_timer *m_sprite_timer;
int m_curr_scanline;
@ -128,6 +125,8 @@ class rjammer_state : public tubep_state
public:
rjammer_state(const machine_config &mconfig, device_type type, const char *tag) :
tubep_state(mconfig, type, tag),
m_msm(*this, "msm"),
m_adpcm_mux(*this, "adpcm_mux"),
m_rjammer_backgroundram(*this, "rjammer_bgram")
{ }
@ -138,6 +137,7 @@ protected:
virtual void machine_reset() override;
private:
void soundlatch_nmi_w(uint8_t data);
void rjammer_background_LS377_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_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);
@ -160,7 +160,11 @@ private:
void rjammer_sound_map(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