summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/advision.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/advision.c')
-rw-r--r--src/mame/machine/advision.c193
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;
+}