diff options
author | MetalliC <0vetal0@gmail.com> | 2016-08-26 11:51:27 +0300 |
---|---|---|
committer | MetalliC <0vetal0@gmail.com> | 2016-08-26 11:51:27 +0300 |
commit | efdb9bfe9f029c4a07b06f6a22947127f595d443 (patch) | |
tree | a3dba83a95976a756a17cf70f1fe7a3998771147 | |
parent | 548106bc69cfd962f99f6a5b7f429c6a23ddc867 (diff) |
vector06c ramdisk emulated, machine mostly working,
fix i8080 status callbacks during push/pop
-rw-r--r-- | src/devices/cpu/i8085/i8085cpu.h | 8 | ||||
-rw-r--r-- | src/mame/drivers/vector06.cpp | 9 | ||||
-rw-r--r-- | src/mame/includes/vector06.h | 8 | ||||
-rw-r--r-- | src/mame/machine/vector06.cpp | 59 |
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; |