diff options
Diffstat (limited to 'src/mame/machine/advision.c')
-rw-r--r-- | src/mame/machine/advision.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/src/mame/machine/advision.c b/src/mame/machine/advision.c new file mode 100644 index 00000000000..4f1f19b105e --- /dev/null +++ b/src/mame/machine/advision.c @@ -0,0 +1,193 @@ +// license:BSD-3-Clause +// copyright-holders:Nathan Woods +/*************************************************************************** + + advision.c + + Machine file to handle emulation of the AdventureVision. + +***************************************************************************/ + +#include "emu.h" +#include "includes/advision.h" +#include "cpu/mcs48/mcs48.h" +#include "sound/dac.h" + +/* + 8048 Ports: + + P1 Bit 0..1 - RAM bank select + Bit 3..7 - Keypad input + + P2 Bit 0..3 - A8-A11 + Bit 4..7 - Sound control/Video write address + + T1 Mirror sync pulse +*/ + +/* Machine Initialization */ + +void advision_state::machine_start() +{ + std::string region_tag; + m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); + + /* configure EA banking */ + m_bank1->configure_entry(0, memregion(I8048_TAG)->base()); + m_bank1->configure_entry(1, m_cart_rom->base()); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x0000, 0x03ff, "bank1"); + m_bank1->set_entry(0); + + /* allocate external RAM */ + m_ext_ram.resize(0x400); + save_item(NAME(m_ext_ram)); + + save_item(NAME(m_ea_bank)); + save_item(NAME(m_rambank)); + save_item(NAME(m_frame_count)); + save_item(NAME(m_frame_start)); + save_item(NAME(m_video_enable)); + save_item(NAME(m_video_bank)); + save_item(NAME(m_led_latch)); + save_item(NAME(m_sound_cmd)); + save_item(NAME(m_sound_d)); + save_item(NAME(m_sound_g)); +} + +void advision_state::machine_reset() +{ + m_ea_bank = 0; + m_rambank = 0x300; + m_frame_start = 0; + m_video_enable = 0; + m_sound_cmd = 0; + + /* enable internal ROM */ + m_maincpu->set_input_line(MCS48_INPUT_EA, CLEAR_LINE); + m_bank1->set_entry(m_ea_bank); + + /* reset sound CPU */ + m_soundcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); +} + +/* Bank Switching */ + +WRITE8_MEMBER( advision_state::bankswitch_w ) +{ + m_ea_bank = BIT(data, 2); + m_rambank = (data & 0x03) << 8; + + m_maincpu->set_input_line(MCS48_INPUT_EA, m_ea_bank ? ASSERT_LINE : CLEAR_LINE); + if (m_cart_rom) + m_bank1->set_entry(m_ea_bank); +} + +/* External RAM */ + +READ8_MEMBER( advision_state::ext_ram_r ) +{ + UINT8 data = m_ext_ram[m_rambank + offset]; + + if (!m_video_enable) + { + /* the video hardware interprets reads as writes */ + vh_write(data); + } + + if (m_video_bank == 0x06) + { + m_soundcpu->set_input_line(INPUT_LINE_RESET, (data & 0x01) ? CLEAR_LINE : ASSERT_LINE); + } + + return data; +} + +WRITE8_MEMBER( advision_state::ext_ram_w ) +{ + m_ext_ram[m_rambank + offset] = data; +} + +/* Sound */ + +READ8_MEMBER( advision_state::sound_cmd_r ) +{ + return m_sound_cmd; +} + +void advision_state::update_dac() +{ + if (m_sound_g == 0 && m_sound_d == 0) + m_dac->write_unsigned8(0xff); + else if (m_sound_g == 1 && m_sound_d == 1) + m_dac->write_unsigned8(0x80); + else + m_dac->write_unsigned8(0x00); +} + +WRITE8_MEMBER( advision_state::sound_g_w ) +{ + m_sound_g = data & 0x01; + + update_dac(); +} + +WRITE8_MEMBER( advision_state::sound_d_w ) +{ + m_sound_d = data & 0x01; + + update_dac(); +} + +/* Video */ + +WRITE8_MEMBER( advision_state::av_control_w ) +{ + m_sound_cmd = data >> 4; + + if ((m_video_enable == 0x00) && (data & 0x10)) + { + vh_update(m_video_hpos); + + m_video_hpos++; + + if (m_video_hpos > 255) + { + m_video_hpos = 0; + logerror("HPOS OVERFLOW\n"); + } + } + + m_video_enable = data & 0x10; + m_video_bank = (data & 0xe0) >> 5; +} + +READ8_MEMBER( advision_state::vsync_r ) +{ + if (m_frame_start) + { + m_frame_start = 0; + + return 0; + } + else + { + return 1; + } +} + +/* Input */ + +READ8_MEMBER( advision_state::controller_r ) +{ + // Get joystick switches + UINT8 in = m_joy->read(); + UINT8 data = in | 0x0f; + + // Get buttons + if (in & 0x02) data = data & 0xf7; /* Button 3 */ + if (in & 0x08) data = data & 0xcf; /* Button 1 */ + if (in & 0x04) data = data & 0xaf; /* Button 2 */ + if (in & 0x01) data = data & 0x6f; /* Button 4 */ + + return data & 0xf8; +} |