summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2016-08-26 11:51:27 +0300
committer MetalliC <0vetal0@gmail.com>2016-08-26 11:51:27 +0300
commitefdb9bfe9f029c4a07b06f6a22947127f595d443 (patch)
treea3dba83a95976a756a17cf70f1fe7a3998771147
parent548106bc69cfd962f99f6a5b7f429c6a23ddc867 (diff)
vector06c ramdisk emulated, machine mostly working,
fix i8080 status callbacks during push/pop
-rw-r--r--src/devices/cpu/i8085/i8085cpu.h8
-rw-r--r--src/mame/drivers/vector06.cpp9
-rw-r--r--src/mame/includes/vector06.h8
-rw-r--r--src/mame/machine/vector06.cpp59
4 files changed, 64 insertions, 20 deletions
diff --git a/src/devices/cpu/i8085/i8085cpu.h b/src/devices/cpu/i8085/i8085cpu.h
index 5ccecf3cd95..2f47c34f989 100644
--- a/src/devices/cpu/i8085/i8085cpu.h
+++ b/src/devices/cpu/i8085/i8085cpu.h
@@ -124,24 +124,24 @@
/* i/o */
#define M_IN \
- m_STATUS = 0x42; \
+ set_status(0x42); \
m_WZ.d=ARG(); \
m_AF.b.h=m_io->read_byte(m_WZ.d);
#define M_OUT \
- m_STATUS = 0x10; \
+ set_status(0x10); \
m_WZ.d=ARG(); \
m_io->write_byte(m_WZ.d,m_AF.b.h)
/* stack */
#define M_PUSH(R) { \
- m_STATUS = 0x04; \
+ set_status(0x04); \
m_program->write_byte(--m_SP.w.l, m_##R.b.h); \
m_program->write_byte(--m_SP.w.l, m_##R.b.l); \
}
#define M_POP(R) { \
- m_STATUS = 0x86; \
+ set_status(0x86); \
m_##R.b.l = m_program->read_byte(m_SP.w.l++); \
m_##R.b.h = m_program->read_byte(m_SP.w.l++); \
}
diff --git a/src/mame/drivers/vector06.cpp b/src/mame/drivers/vector06.cpp
index a96b20bd22c..569b29eee50 100644
--- a/src/mame/drivers/vector06.cpp
+++ b/src/mame/drivers/vector06.cpp
@@ -14,8 +14,9 @@
/* Address maps */
static ADDRESS_MAP_START(vector06_mem, AS_PROGRAM, 8, vector06_state)
- AM_RANGE( 0x0000, 0x7fff ) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
- AM_RANGE( 0x8000, 0xffff ) AM_READ_BANK("bank3") AM_WRITE_BANK("bank4")
+ AM_RANGE( 0x0000, 0x7fff ) AM_READ_BANK("bank2")
+ AM_RANGE( 0xa000, 0xdfff ) AM_READWRITE_BANK("bank3")
+ AM_RANGE( 0x0000, 0xffff ) AM_READWRITE_BANK("bank1")
ADDRESS_MAP_END
static ADDRESS_MAP_START(vector06_io, AS_IO, 8, vector06_state)
@@ -24,6 +25,7 @@ static ADDRESS_MAP_START(vector06_io, AS_IO, 8, vector06_state)
AM_RANGE( 0x00, 0x03) AM_READWRITE(vector06_8255_1_r, vector06_8255_1_w )
AM_RANGE( 0x04, 0x07) AM_READWRITE(vector06_8255_2_r, vector06_8255_2_w )
AM_RANGE( 0x0C, 0x0C) AM_WRITE(vector06_color_set)
+ AM_RANGE( 0x10, 0x10) AM_WRITE(vector06_ramdisk_w)
AM_RANGE( 0x18, 0x18) AM_DEVREADWRITE("wd1793", fd1793_t, data_r, data_w)
AM_RANGE( 0x19, 0x19) AM_DEVREADWRITE("wd1793", fd1793_t, sector_r, sector_w)
AM_RANGE( 0x1a, 0x1a) AM_DEVREADWRITE("wd1793", fd1793_t, track_r, track_w)
@@ -137,6 +139,7 @@ static MACHINE_CONFIG_START( vector06, vector06_state )
// MCFG_CPU_ADD("maincpu", Z80, 3000000)
MCFG_CPU_PROGRAM_MAP(vector06_mem)
MCFG_CPU_IO_MAP(vector06_io)
+ MCFG_I8085A_STATUS(WRITE8(vector06_state, vector06_status_callback))
MCFG_CPU_VBLANK_INT_DRIVER("screen", vector06_state, vector06_interrupt)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(vector06_state,vector06_irq_callback)
@@ -184,7 +187,7 @@ static MACHINE_CONFIG_START( vector06, vector06_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
- MCFG_RAM_DEFAULT_SIZE("64K")
+ MCFG_RAM_DEFAULT_SIZE("320K")
MCFG_RAM_DEFAULT_VALUE(0)
MACHINE_CONFIG_END
diff --git a/src/mame/includes/vector06.h b/src/mame/includes/vector06.h
index 97336947f89..6e61aab594f 100644
--- a/src/mame/includes/vector06.h
+++ b/src/mame/includes/vector06.h
@@ -40,7 +40,6 @@ public:
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
- m_bank4(*this, "bank4"),
m_region_maincpu(*this, "maincpu"),
m_line(*this, "LINE.%u", 0),
m_reset(*this, "RESET")
@@ -61,6 +60,8 @@ public:
DECLARE_READ8_MEMBER(vector06_8255_2_r);
DECLARE_WRITE8_MEMBER(vector06_8255_2_w);
DECLARE_WRITE8_MEMBER(vector06_disc_w);
+ DECLARE_WRITE8_MEMBER(vector06_status_callback);
+ DECLARE_WRITE8_MEMBER(vector06_ramdisk_w);
void vector06_set_video_mode(int width);
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -85,7 +86,6 @@ private:
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
- required_memory_bank m_bank4;
required_memory_region m_region_maincpu;
required_ioport_array<9> m_line;
required_ioport m_reset;
@@ -96,7 +96,11 @@ private:
UINT8 m_romdisk_msb;
UINT8 m_romdisk_lsb;
UINT8 m_vblank_state;
+ UINT8 m_rambank;
+ bool m_stack_state;
+ bool m_romen;
+ void update_mem();
};
#endif /* VECTOR06_H_ */
diff --git a/src/mame/machine/vector06.cpp b/src/mame/machine/vector06.cpp
index 1d1ff0fa417..c22adef4229 100644
--- a/src/mame/machine/vector06.cpp
+++ b/src/mame/machine/vector06.cpp
@@ -125,13 +125,15 @@ TIMER_CALLBACK_MEMBER(vector06_state::reset_check_callback)
if (BIT(val, 0))
{
- m_bank1->set_base(m_region_maincpu->base() + 0x10000);
+ m_romen = true;
+ update_mem();
m_maincpu->reset();
}
if (BIT(val, 1))
{
- m_bank1->set_base(m_ram->pointer() + 0x0000);
+ m_romen = false;
+ update_mem();
m_maincpu->reset();
}
}
@@ -156,6 +158,43 @@ WRITE8_MEMBER( vector06_state::vector06_disc_w )
}
}
+void vector06_state::update_mem()
+{
+ if ((m_rambank & 0x10) && m_stack_state) {
+ int sentry = ((m_rambank >> 2) & 3) + 1;
+ m_bank1->set_entry(sentry);
+ m_bank3->set_entry(sentry);
+ m_bank2->set_base(m_ram->pointer() + sentry * 0x10000);
+ }
+ else {
+ m_bank1->set_entry(0);
+ int ventry = 0;
+ if (m_rambank & 0x20)
+ ventry = (m_rambank & 3) + 1;
+ m_bank3->set_entry(ventry);
+ if (m_romen)
+ m_bank2->set_base(m_region_maincpu->base() + 0x10000);
+ else
+ m_bank2->set_base(m_ram->pointer());
+ }
+}
+
+WRITE8_MEMBER(vector06_state::vector06_ramdisk_w)
+{
+ UINT8 oldbank = m_rambank;
+ m_rambank = data;
+ if (oldbank != m_rambank)
+ update_mem();
+}
+
+WRITE8_MEMBER(vector06_state::vector06_status_callback)
+{
+ bool oldstate = m_stack_state;
+ m_stack_state = (data & I8085_STATUS_STACK) ? true : false;
+ if (oldstate != m_stack_state && (m_rambank & 0x10))
+ update_mem();
+}
+
void vector06_state::machine_start()
{
machine().scheduler().timer_pulse(attotime::from_hz(50), timer_expired_delegate(FUNC(vector06_state::reset_check_callback),this));
@@ -163,17 +202,15 @@ void vector06_state::machine_start()
void vector06_state::machine_reset()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
+ m_stack_state = false;
+ m_rambank = 0;
+ m_romen = true;
- space.install_read_bank (0x0000, 0x7fff, m_bank1);
- space.install_write_bank(0x0000, 0x7fff, m_bank2);
- space.install_read_bank (0x8000, 0xffff, m_bank3);
- space.install_write_bank(0x8000, 0xffff, m_bank4);
+ m_bank1->configure_entries(0, 5, m_ram->pointer(), 0x10000);
+ for (int i = 0; i < 5; i++)
+ m_bank3->configure_entry(i, m_ram->pointer() + 0x10000 * i + 0xa000);
- m_bank1->set_base(m_region_maincpu->base() + 0x10000);
- m_bank2->set_base(m_ram->pointer() + 0x0000);
- m_bank3->set_base(m_ram->pointer() + 0x8000);
- m_bank4->set_base(m_ram->pointer() + 0x8000);
+ update_mem();
m_keyboard_mask = 0;
m_color_index = 0;