mirror of
https://github.com/holub/mame
synced 2025-04-19 07:00:31 +03:00
rjammer: Add screen raw parameters; modernize MSM5205 hookup
This commit is contained in:
parent
565e8b6e98
commit
827ea58eb5
@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user